📄 rs6000.h
字号:
/* Place that structure value return address is placed. On the RS/6000, it is passed as an extra parameter. */#define STRUCT_VALUE 0/* Define the classes of registers for register constraints in the machine description. Also define ranges of constants. One of the classes must always be named ALL_REGS and include all hard regs. If there is more than one class, another class must be named NO_REGS and contain no registers. The name GENERAL_REGS must be the name of a class (or an alias for another name such as ALL_REGS). This is the class of registers that is allowed by "g" or "r" in a register constraint. Also, registers outside this class are allocated only when instructions express preferences for them. The classes must be numbered in nondecreasing order; that is, a larger-numbered class must never be contained completely in a smaller-numbered class. For any two classes, it is very desirable that there be another class that represents their union. */ /* The RS/6000 has three types of registers, fixed-point, floating-point, and condition registers, plus three special registers, MQ, CTR, and the link register. However, r0 is special in that it cannot be used as a base register. So make a class for registers valid as base registers. Also, cr0 is the only condition code register that can be used in arithmetic insns, so make a separate class for it. */enum reg_class { NO_REGS, BASE_REGS, GENERAL_REGS, FLOAT_REGS, NON_SPECIAL_REGS, MQ_REGS, LINK_REGS, CTR_REGS, LINK_OR_CTR_REGS, SPECIAL_REGS, SPEC_OR_GEN_REGS, CR0_REGS, CR_REGS, NON_FLOAT_REGS, ALL_REGS, LIM_REG_CLASSES };#define N_REG_CLASSES (int) LIM_REG_CLASSES/* Give names of register classes as strings for dump file. */#define REG_CLASS_NAMES \ { "NO_REGS", "BASE_REGS", "GENERAL_REGS", "FLOAT_REGS", \ "NON_SPECIAL_REGS", "MQ_REGS", "LINK_REGS", "CTR_REGS", \ "LINK_OR_CTR_REGS", "SPECIAL_REGS", "SPEC_OR_GEN_REGS", \ "CR0_REGS", "CR_REGS", "NON_FLOAT_REGS", "ALL_REGS" }/* Define which registers fit in which classes. This is an initializer for a vector of HARD_REG_SET of length N_REG_CLASSES. */#define REG_CLASS_CONTENTS \ { {0, 0, 0}, {0xfffffffe, 0, 8}, {~0, 0, 8}, \ {0, ~0, 0}, {~0, ~0, 8}, {0, 0, 1}, {0, 0, 2}, \ {0, 0, 4}, {0, 0, 6}, {0, 0, 7}, {~0, 0, 15}, \ {0, 0, 16}, {0, 0, 0xff0}, {~0, 0, 0xffff}, \ {~0, ~0, 0xffff} }/* 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 \ : 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 \ : 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 signed 16-bit constants `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 constant that can be placed into a mask operand `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) ((VALUE) + 0x8000) < 0x10000 \ : (C) == 'J' ? ((VALUE) & 0xffff) == 0 \ : (C) == 'K' ? ((VALUE) & 0xffff0000) == 0 \ : (C) == 'L' ? mask_constant (VALUE) \ : (C) == 'M' ? (VALUE) > 31 \ : (C) == 'N' ? exact_log2 (VALUE) >= 0 \ : (C) == 'O' ? (VALUE) == 0 \ : (C) == 'P' ? (unsigned) ((- (VALUE)) + 0x8000) < 0x1000 \ : 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 and one insn for SF. */#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ ((C) == 'G' ? easy_fp_constant (VALUE, GET_MODE (VALUE)) : 0)/* Optional extra constraints for this machine. For the RS/6000, `Q' means that this is a memory operand that is just an offset from a register. */#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) \ : 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 \ ? ((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_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_V4 /* System V.4/eabi */};/* 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 push_p; /* true if we need to allocate stack space */ int calls_p; /* true if the function makes any calls */ 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 varargs_save_offset; /* offset to save the varargs registers */ 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 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 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_64BIT ? 64 : 32)/* Size of the fixed area on the stack */#define RS6000_SAVE_AREA (TARGET_64BIT ? 48 : 24)/* 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 ALIGN(n,a) (((n) + (a) - 1) & ~((a) - 1))/* Size of V.4 varargs area in bytes */#define RS6000_VARARGS_SIZE \ ((GP_ARG_NUM_REG * (TARGET_64BIT ? 8 : 4)) + (FP_ARG_NUM_REG * 8) + 8)/* Offset of V.4 varargs area */#define RS6000_VARARGS_OFFSET \ (ALIGN (current_function_outgoing_args_size, 8) + RS6000_SAVE_AREA)/* 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 (ALIGN (current_function_outgoing_args_size, 8) \ + RS6000_VARARGS_AREA \ + RS6000_SAVE_AREA)/* 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, 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. For the RS/6000, any structure or union type is returned in memory. */#define RETURN_IN_MEMORY(TYPE) \ (TYPE_MODE (TYPE) == BLKmode)/* Minimum and maximum general purpose registers used to hold arguments. */#define GP_ARG_MIN_REG 3#define GP_ARG_MAX_REG 10#define GP_ARG_NUM_REG (GP_ARG_MAX_REG - GP_ARG_MIN_REG + 1)/* Minimum and maximum floating point registers used to hold arguments. */#define FP_ARG_MIN_REG 33
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -