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

📄 rs6000.h

📁 gcc编译工具没有什么特别
💻 H
📖 第 1 页 / 共 5 页
字号:
  { 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 + -