⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs6000.h

📁 GUN开源阻止下的编译器GCC
💻 H
📖 第 1 页 / 共 5 页
字号:
/* 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 + -