📄 rs6000.h
字号:
{ 0x00000000, 0xffffffff, 0x00000000 }, /* FLOAT_REGS */ \ { 0xffffffff, 0xffffffff, 0x00000008 }, /* NON_SPECIAL_REGS */ \ { 0x00000000, 0x00000000, 0x00000001 }, /* MQ_REGS */ \ { 0x00000000, 0x00000000, 0x00000002 }, /* LINK_REGS */ \ { 0x00000000, 0x00000000, 0x00000004 }, /* CTR_REGS */ \ { 0x00000000, 0x00000000, 0x00000006 }, /* LINK_OR_CTR_REGS */ \ { 0x00000000, 0x00000000, 0x00000007 }, /* SPECIAL_REGS */ \ { 0xffffffff, 0x00000000, 0x0000000f }, /* SPEC_OR_GEN_REGS */ \ { 0x00000000, 0x00000000, 0x00000010 }, /* CR0_REGS */ \ { 0x00000000, 0x00000000, 0x00000ff0 }, /* CR_REGS */ \ { 0xffffffff, 0x00000000, 0x0000ffff }, /* NON_FLOAT_REGS */ \ { 0x00000000, 0x00000000, 0x00010000 }, /* FPMEM_REGS */ \ { 0x00000000, 0xffffffff, 0x00010000 }, /* FLOAT_OR_FPMEM_REGS */ \ { 0xffffffff, 0xffffffff, 0x0001ffff } /* ALL_REGS */ \}/* The same information, inverted: Return the class number of the smallest class containing reg number REGNO. This could be a conditional expression or could index an array. */#define REGNO_REG_CLASS(REGNO) \ ((REGNO) == 0 ? GENERAL_REGS \ : (REGNO) < 32 ? BASE_REGS \ : FP_REGNO_P (REGNO) ? FLOAT_REGS \ : (REGNO) == 68 ? CR0_REGS \ : CR_REGNO_P (REGNO) ? CR_REGS \ : (REGNO) == 64 ? MQ_REGS \ : (REGNO) == 65 ? LINK_REGS \ : (REGNO) == 66 ? CTR_REGS \ : (REGNO) == 67 ? BASE_REGS \ : (REGNO) == 76 ? FPMEM_REGS \ : NO_REGS)/* The class value for index registers, and the one for base regs. */#define INDEX_REG_CLASS GENERAL_REGS#define BASE_REG_CLASS BASE_REGS/* Get reg_class from a letter such as appears in the machine description. */#define REG_CLASS_FROM_LETTER(C) \ ((C) == 'f' ? FLOAT_REGS \ : (C) == 'b' ? BASE_REGS \ : (C) == 'h' ? SPECIAL_REGS \ : (C) == 'q' ? MQ_REGS \ : (C) == 'c' ? CTR_REGS \ : (C) == 'l' ? LINK_REGS \ : (C) == 'x' ? CR0_REGS \ : (C) == 'y' ? CR_REGS \ : (C) == 'z' ? FPMEM_REGS \ : NO_REGS)/* The letters I, J, K, L, M, N, and P in a register constraint string can be used to stand for particular ranges of immediate operands. This macro defines what the ranges are. C is the letter, and VALUE is a constant value. Return 1 if VALUE is in the range specified by C. `I' is a signed 16-bit constant `J' is a constant with only the high-order 16 bits non-zero `K' is a constant with only the low-order 16 bits non-zero `L' is a signed 16-bit constant shifted left 16 bits `M' is a constant that is greater than 31 `N' is a constant that is an exact power of two `O' is the constant zero `P' is a constant whose negation is a signed 16-bit constant */#define CONST_OK_FOR_LETTER_P(VALUE, C) \ ( (C) == 'I' ? (unsigned HOST_WIDE_INT) ((VALUE) + 0x8000) < 0x10000 \ : (C) == 'J' ? ((VALUE) & (~ (HOST_WIDE_INT) 0xffff0000)) == 0 \ : (C) == 'K' ? ((VALUE) & (~ (HOST_WIDE_INT) 0xffff)) == 0 \ : (C) == 'L' ? (((VALUE) & 0xffff) == 0 \ && ((VALUE) >> 31 == -1 || (VALUE) >> 31 == 0)) \ : (C) == 'M' ? (VALUE) > 31 \ : (C) == 'N' ? exact_log2 (VALUE) >= 0 \ : (C) == 'O' ? (VALUE) == 0 \ : (C) == 'P' ? (unsigned HOST_WIDE_INT) ((- (VALUE)) + 0x8000) < 0x10000 \ : 0)/* Similar, but for floating constants, and defining letters G and H. Here VALUE is the CONST_DOUBLE rtx itself. We flag for special constants when we can copy the constant into a general register in two insns for DF/DI and one insn for SF. 'H' is used for DI/DF constants that take 3 insns. */#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ ( (C) == 'G' ? (num_insns_constant (VALUE, GET_MODE (VALUE)) \ == ((GET_MODE (VALUE) == SFmode) ? 1 : 2)) \ : (C) == 'H' ? (num_insns_constant (VALUE, GET_MODE (VALUE)) == 3) \ : 0)/* Optional extra constraints for this machine. 'Q' means that is a memory operand that is just an offset from a reg. 'R' is for AIX TOC entries. 'S' is a constant that can be placed into a 64-bit mask operand 'T' is a consatnt that can be placed into a 32-bit mask operand 'U' is for V.4 small data references. */#define EXTRA_CONSTRAINT(OP, C) \ ((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \ : (C) == 'R' ? LEGITIMATE_CONSTANT_POOL_ADDRESS_P (OP) \ : (C) == 'S' ? mask64_operand (OP, VOIDmode) \ : (C) == 'T' ? mask_operand (OP, VOIDmode) \ : (C) == 'U' ? ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS) \ && small_data_operand (OP, GET_MODE (OP))) \ : 0)/* Given an rtx X being reloaded into a reg required to be in class CLASS, return the class of reg to actually use. In general this is just CLASS; but on some machines in some cases it is preferable to use a more restrictive class. On the RS/6000, we have to return NO_REGS when we want to reload a floating-point CONST_DOUBLE to force it to be copied to memory. */#define PREFERRED_RELOAD_CLASS(X,CLASS) \ ((GET_CODE (X) == CONST_DOUBLE \ && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \ ? NO_REGS : (CLASS))/* Return the register class of a scratch register needed to copy IN into or out of a register in CLASS in MODE. If it can be done directly, NO_REGS is returned. */#define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \ secondary_reload_class (CLASS, MODE, IN)/* If we are copying between FP registers and anything else, we need a memory location. */#define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \ ((CLASS1) != (CLASS2) && ((CLASS1) == FLOAT_REGS || (CLASS2) == FLOAT_REGS))/* Return the maximum number of consecutive registers needed to represent mode MODE in a register of class CLASS. On RS/6000, this is the size of MODE in words, except in the FP regs, where a single reg is enough for two words. */#define CLASS_MAX_NREGS(CLASS, MODE) \ (((CLASS) == FLOAT_REGS || (CLASS) == FPMEM_REGS \ || (CLASS) == FLOAT_OR_FPMEM_REGS) \ ? ((GET_MODE_SIZE (MODE) + UNITS_PER_FP_WORD - 1) / UNITS_PER_FP_WORD) \ : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))/* If defined, gives a class of registers that cannot be used as the operand of a SUBREG that changes the size of the object. */#define CLASS_CANNOT_CHANGE_SIZE FLOAT_OR_FPMEM_REGS/* Stack layout; function entry, exit and calling. *//* Enumeration to give which calling sequence to use. */enum rs6000_abi { ABI_NONE, ABI_AIX, /* IBM's AIX */ ABI_AIX_NODESC, /* AIX calling sequence minus function descriptors */ ABI_V4, /* System V.4/eabi */ ABI_NT, /* Windows/NT */ ABI_SOLARIS /* Solaris */};extern enum rs6000_abi rs6000_current_abi; /* available for use by subtarget *//* Default ABI to compile code for */#ifndef DEFAULT_ABI#define DEFAULT_ABI ABI_AIX/* The prefix to add to user-visible assembler symbols. */#define USER_LABEL_PREFIX "."#endif/* Structure used to define the rs6000 stack */typedef struct rs6000_stack { int first_gp_reg_save; /* first callee saved GP register used */ int first_fp_reg_save; /* first callee saved FP register used */ int lr_save_p; /* true if the link reg needs to be saved */ int cr_save_p; /* true if the CR reg needs to be saved */ int toc_save_p; /* true if the TOC needs to be saved */ int push_p; /* true if we need to allocate stack space */ int calls_p; /* true if the function makes any calls */ int main_p; /* true if this is main */ int main_save_p; /* true if this is main and we need to save args */ int fpmem_p; /* true if float/int conversion temp needed */ enum rs6000_abi abi; /* which ABI to use */ int gp_save_offset; /* offset to save GP regs from initial SP */ int fp_save_offset; /* offset to save FP regs from initial SP */ int lr_save_offset; /* offset to save LR from initial SP */ int cr_save_offset; /* offset to save CR from initial SP */ int toc_save_offset; /* offset to save the TOC pointer */ int varargs_save_offset; /* offset to save the varargs registers */ int main_save_offset; /* offset to save main's args */ int fpmem_offset; /* offset for float/int conversion temp */ int reg_size; /* register size (4 or 8) */ int varargs_size; /* size to hold V.4 args passed in regs */ int vars_size; /* variable save area size */ int parm_size; /* outgoing parameter size */ int main_size; /* size to hold saving main's args */ int save_size; /* save area size */ int fixed_size; /* fixed size of stack frame */ int gp_size; /* size of saved GP registers */ int fp_size; /* size of saved FP registers */ int cr_size; /* size to hold CR if not in save_size */ int lr_size; /* size to hold LR if not in save_size */ int fpmem_size; /* size to hold float/int conversion */ int toc_size; /* size to hold TOC if not in save_size */ int total_size; /* total bytes allocated for stack */} rs6000_stack_t;/* Define this if pushing a word on the stack makes the stack pointer a smaller address. */#define STACK_GROWS_DOWNWARD/* Define this if the nominal address of the stack frame is at the high-address end of the local variables; that is, each additional local variable allocated goes at a more negative offset in the frame. On the RS/6000, we grow upwards, from the area after the outgoing arguments. *//* #define FRAME_GROWS_DOWNWARD *//* Size of the outgoing register save area */#define RS6000_REG_SAVE (TARGET_32BIT ? 32 : 64)/* Size of the fixed area on the stack */#define RS6000_SAVE_AREA (TARGET_32BIT ? 24 : 48)/* MEM representing address to save the TOC register */#define RS6000_SAVE_TOC gen_rtx_MEM (Pmode, \ plus_constant (stack_pointer_rtx, \ (TARGET_32BIT ? 20 : 40)))/* Offset & size for fpmem stack locations used for converting between float and integral types. */extern int rs6000_fpmem_offset;extern int rs6000_fpmem_size;/* Size of the V.4 varargs area if needed */#define RS6000_VARARGS_AREA 0/* Whether a V.4 varargs area is needed */extern int rs6000_sysv_varargs_p;/* Align an address */#define RS6000_ALIGN(n,a) (((n) + (a) - 1) & ~((a) - 1))/* Initialize data used by insn expanders. This is called from init_emit, once for each function, before code is generated. */#define INIT_EXPANDERS rs6000_init_expanders ()/* Size of V.4 varargs area in bytes */#define RS6000_VARARGS_SIZE \ ((GP_ARG_NUM_REG * (TARGET_32BIT ? 4 : 8)) + (FP_ARG_NUM_REG * 8) + 8)/* Offset within stack frame to start allocating local variables at. If FRAME_GROWS_DOWNWARD, this is the offset to the END of the first local allocated. Otherwise, it is the offset to the BEGINNING of the first local allocated. On the RS/6000, the frame pointer is the same as the stack pointer, except for dynamic allocations. So we start after the fixed area and outgoing parameter area. */#define STARTING_FRAME_OFFSET \ (RS6000_ALIGN (current_function_outgoing_args_size, 8) \ + RS6000_VARARGS_AREA \ + RS6000_SAVE_AREA)/* Offset from the stack pointer register to an item dynamically allocated on the stack, e.g., by `alloca'. The default value for this macro is `STACK_POINTER_OFFSET' plus the length of the outgoing arguments. The default is correct for most machines. See `function.c' for details. */#define STACK_DYNAMIC_OFFSET(FUNDECL) \ (RS6000_ALIGN (current_function_outgoing_args_size, 8) \ + (STACK_POINTER_OFFSET))/* If we generate an insn to push BYTES bytes, this says how many the stack pointer really advances by. On RS/6000, don't define this because there are no push insns. *//* #define PUSH_ROUNDING(BYTES) *//* Offset of first parameter from the argument pointer register value. On the RS/6000, we define the argument pointer to the start of the fixed area. */#define FIRST_PARM_OFFSET(FNDECL) RS6000_SAVE_AREA/* Define this if stack space is still allocated for a parameter passed in a register. The value is the number of bytes allocated to this area. */#define REG_PARM_STACK_SPACE(FNDECL) RS6000_REG_SAVE/* Define this if the above stack space is to be considered part of the space allocated by the caller. */#define OUTGOING_REG_PARM_STACK_SPACE/* This is the difference between the logical top of stack and the actual sp. For the RS/6000, sp points past the fixed area. */#define STACK_POINTER_OFFSET RS6000_SAVE_AREA/* Define this if the maximum size of all the outgoing args is to be accumulated and pushed during the prologue. The amount can be found in the variable current_function_outgoing_args_size. */#define ACCUMULATE_OUTGOING_ARGS/* Value is the number of bytes of arguments automatically popped when returning from a subroutine call. FUNDECL is the declaration node of the function (as a tree), FUNTYPE is the data type of the function (as a tree), or for a library call it is an identifier node for the subroutine name. SIZE is the number of bytes of arguments passed on the stack. */#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0/* Define how to find the value returned by a function. VALTYPE is the data type of the value (as a tree). If the precise function being called is known, FUNC is its FUNCTION_DECL; otherwise, FUNC is 0. On RS/6000 an integer value is in r3 and a floating-point value is in fp1, unless -msoft-float. */#define FUNCTION_VALUE(VALTYPE, FUNC) \ gen_rtx_REG ((INTEGRAL_TYPE_P (VALTYPE) \ && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \ || POINTER_TYPE_P (VALTYPE) \ ? word_mode : TYPE_MODE (VALTYPE), \ TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_HARD_FLOAT ? 33 : 3)/* Define how to find the value returned by a library function assuming the value has mode MODE. */#define LIBCALL_VALUE(MODE) \ gen_rtx_REG (MODE, \ GET_MODE_CLASS (MODE) == MODE_FLOAT && TARGET_HARD_FLOAT ? 33 : 3)/* The definition of this macro implies that there are cases where a scalar value cannot be returned in registers.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -