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

📄 d30v.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
   stack slot for a memory location needed for register copies.  If this macro   is defined, the compiler instead uses the memory location defined by this   macro.   Do not define this macro if you do not define   `SECONDARY_MEMORY_NEEDED'.  *//* #define SECONDARY_MEMORY_NEEDED_RTX(MODE) *//* When the compiler needs a secondary memory location to copy between two   registers of mode MODE, it normally allocates sufficient memory to hold a   quantity of `BITS_PER_WORD' bits and performs the store and load operations   in a mode that many bits wide and whose class is the same as that of MODE.   This is right thing to do on most machines because it ensures that all bits   of the register are copied and prevents accesses to the registers in a   narrower mode, which some machines prohibit for floating-point registers.   However, this default behavior is not correct on some machines, such as the   DEC Alpha, that store short integers in floating-point registers differently   than in integer registers.  On those machines, the default widening will not   work correctly and you must define this macro to suppress that widening in   some cases.  See the file `alpha.h' for details.   Do not define this macro if you do not define `SECONDARY_MEMORY_NEEDED' or   if widening MODE to a mode that is `BITS_PER_WORD' bits wide is correct for   your machine.  *//* #define SECONDARY_MEMORY_NEEDED_MODE(MODE) *//* Normally the compiler avoids choosing registers that have been explicitly   mentioned in the rtl as spill registers (these registers are normally those   used to pass parameters and return values).  However, some machines have so   few registers of certain classes that there would not be enough registers to   use as spill registers if this were done.   Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero value on   these machines.  When this macro has a nonzero value, the compiler allows   registers explicitly used in the rtl to be used as spill registers but   avoids extending the lifetime of these registers.   It is always safe to define this macro with a nonzero value, but if you   unnecessarily define it, you will reduce the amount of optimizations that   can be performed in some cases.  If you do not define this macro with a   nonzero value when it is required, the compiler will run out of spill   registers and print a fatal error message.  For most machines, you should   not define this macro at all.  *//* #define SMALL_REGISTER_CLASSES *//* A C expression whose value is nonzero if pseudos that have been assigned to   registers of class CLASS would likely be spilled because registers of CLASS   are needed for spill registers.   The default value of this macro returns 1 if CLASS has exactly one register   and zero otherwise.  On most machines, this default should be used.  Only   define this macro to some other expression if pseudo allocated by   `local-alloc.c' end up in memory because their hard registers were needed   for spill registers.  If this macro returns nonzero for those classes, those   pseudos will only be allocated by `global.c', which knows how to reallocate   the pseudo to another register.  If there would not be another register   available for reallocation, you should not change the definition of this   macro since the only effect of such a definition would be to slow down   register allocation.  */#define CLASS_LIKELY_SPILLED_P(CLASS) \  ((CLASS) != GPR_REGS && (CLASS) != EVEN_REGS)/* A C expression for the maximum number of consecutive registers of   class CLASS needed to hold a value of mode MODE.   This is closely related to the macro `HARD_REGNO_NREGS'.  In fact, the value   of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be the maximum value of   `HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO values in the class CLASS.   This macro helps control the handling of multiple-word values in   the reload pass.  */#define CLASS_MAX_NREGS(CLASS, MODE)					\(((CLASS) == ACCUM_REGS)						\ ? ((GET_MODE_SIZE (MODE) + 8 - 1) / 8)					\ : ((GET_MODE_SIZE (MODE) + 4 - 1) / 4))/* A C expression that defines the machine-dependent operand constraint letters   (`I', `J', `K', .. 'P') that specify particular ranges of integer values.   If C is one of those letters, the expression should check that VALUE, an   integer, is in the appropriate range and return 1 if so, 0 otherwise.  If C   is not one of those letters, the value should be 0 regardless of VALUE.  */#define CONST_OK_FOR_LETTER_P(VALUE, C)					\((C) == 'I'	? IN_RANGE_P (VALUE, -32, 31)				\ : (C) == 'J'	? IN_RANGE_P (VALUE, 0, 31)				\ : (C) == 'K'	? IN_RANGE_P (exact_log2 (VALUE), 0, 31)		\ : (C) == 'L'	? IN_RANGE_P (exact_log2 (~ (VALUE)), 0, 31)		\ : (C) == 'M'	? ((VALUE) == 32)					\ : (C) == 'N'	? ((VALUE) == 1)					\ : (C) == 'O'	? ((VALUE) == 0)					\ : (C) == 'P'	? IN_RANGE_P (VALUE, 32, 63)				\ :		  FALSE)/* A C expression that defines the machine-dependent operand constraint letters   (`G', `H') that specify particular ranges of `const_double' values.   If C is one of those letters, the expression should check that VALUE, an RTX   of code `const_double', is in the appropriate range and return 1 if so, 0   otherwise.  If C is not one of those letters, the value should be 0   regardless of VALUE.   `const_double' is used for all floating-point constants and for `DImode'   fixed-point constants.  A given letter can accept either or both kinds of   values.  It can use `GET_MODE' to distinguish between these kinds.  */#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)				\((C) == 'G'	? (CONST_DOUBLE_LOW (VALUE) == 0			\		   && CONST_DOUBLE_HIGH (VALUE) == 0)			\ : (C) == 'H'	? FALSE							\ :		  FALSE)/* A C expression that defines the optional machine-dependent constraint   letters (`Q', `R', `S', `T', `U') that can be used to segregate specific   types of operands, usually memory references, for the target machine.   Normally this macro will not be defined.  If it is required for a particular   target machine, it should return 1 if VALUE corresponds to the operand type   represented by the constraint letter C.  If C is not defined as an extra   constraint, the value returned should be 0 regardless of VALUE.   For example, on the ROMP, load instructions cannot have their output in r0   if the memory reference contains a symbolic address.  Constraint letter `Q'   is defined as representing a memory address that does *not* contain a   symbolic address.  An alternative is specified with a `Q' constraint on the   input and `r' on the output.  The next alternative specifies `m' on the   input and a register class that does not include r0 on the output.  */#define EXTRA_CONSTRAINT(VALUE, C)					\(((C) == 'Q')	? short_memory_operand ((VALUE), GET_MODE (VALUE))	\ : ((C) == 'R')	? single_reg_memory_operand ((VALUE), GET_MODE (VALUE))	\ : ((C) == 'S')	? const_addr_memory_operand ((VALUE), GET_MODE (VALUE))	\ : ((C) == 'T')	? long_memory_operand ((VALUE), GET_MODE (VALUE))	\ : ((C) == 'U')	? FALSE							\ :		  FALSE)/* Basic Stack Layout *//* Stack layout *//* Structure used to define the d30v stack */typedef struct d30v_stack {  int varargs_p;		/* whether this is a varargs function */  int varargs_size;		/* size to hold varargs args passed in regs */  int vars_size;		/* variable save area size */  int parm_size;		/* outgoing parameter size */  int gpr_size;			/* size of saved GPR registers */  int accum_size;		/* size of saved ACCUM registers */  int total_size;		/* total bytes allocated for stack */				/* which registers are to be saved */  int save_offset;		/* offset from new sp to start saving vars at */  int link_offset;		/* offset r62 is saved at */  int memrefs_varargs;		/* # of 2 word memory references for varargs */  int memrefs_2words;		/* # of 2 word memory references */  int memrefs_1word;		/* # of 1 word memory references */				/* 1 for ldw/stw ops; 2 for ld2w/st2w ops */  unsigned char save_p[FIRST_PSEUDO_REGISTER];} d30v_stack_t;/* Define this macro if pushing a word onto the stack moves the stack pointer   to a smaller address.   When we say, "define this macro if ...," it means that the compiler checks   this macro only with `#ifdef' so the precise definition used does not   matter.  */#define STACK_GROWS_DOWNWARD 1/* Define this macro if the addresses of local variable slots are at negative   offsets from the frame pointer.  *//* #define FRAME_GROWS_DOWNWARD *//* Define this macro if successive arguments to a function occupy decreasing   addresses on the stack.  *//* #define ARGS_GROW_DOWNWARD *//* Offset from the frame pointer to the first local variable slot to be   allocated.   If `FRAME_GROWS_DOWNWARD', find the next slot's offset by subtracting the   first slot's length from `STARTING_FRAME_OFFSET'.  Otherwise, it is found by   adding the length of the first slot to the value `STARTING_FRAME_OFFSET'.  */#define STARTING_FRAME_OFFSET						\  (D30V_ALIGN (current_function_outgoing_args_size,			\	       (STACK_BOUNDARY / BITS_PER_UNIT)))/* Offset from the stack pointer register to the first location at which   outgoing arguments are placed.  If not specified, the default value of zero   is used.  This is the proper value for most machines.   If `ARGS_GROW_DOWNWARD', this is the offset to the location above the first   location at which outgoing arguments are placed.  *//* #define STACK_POINTER_OFFSET *//* Offset from the argument pointer register to the first argument's address.   On some machines it may depend on the data type of the function.   If `ARGS_GROW_DOWNWARD', this is the offset to the location above the first   argument's address.  */#define FIRST_PARM_OFFSET(FUNDECL) 0/* 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) *//* A C expression whose value is RTL representing the address in a stack frame   where the pointer to the caller's frame is stored.  Assume that FRAMEADDR is   an RTL expression for the address of the stack frame itself.   If you don't define this macro, the default is to return the value of   FRAMEADDR--that is, the stack frame address is also the address of the stack   word that points to the previous frame.  *//* #define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) *//* If defined, a C expression that produces the machine-specific code to setup   the stack so that arbitrary frames can be accessed.  For example, on the   SPARC, we must flush all of the register windows to the stack before we can   access arbitrary stack frames.  This macro will seldom need to be defined.  *//* #define SETUP_FRAME_ADDRESSES() *//* A C expression whose value is RTL representing the value of the return   address for the frame COUNT steps up from the current frame, after the   prologue.  FRAMEADDR is the frame pointer of the COUNT frame, or the frame   pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is   defined.   The value of the expression must always be the correct address when COUNT is   zero, but may be `NULL_RTX' if there is not way to determine the return   address of other frames.  *//* ??? This definition fails for leaf functions.  There is currently no   general solution for this problem.  *//* ??? There appears to be no way to get the return address of any previous   frame except by disassembling instructions in the prologue/epilogue.   So currently we support only the current frame.  */#define RETURN_ADDR_RTX(COUNT, FRAME)					\  ((COUNT) == 0 ? d30v_return_addr() : const0_rtx)/* Define this if the return address of a particular stack frame is   accessed from the frame pointer of the previous stack frame.  *//* #define RETURN_ADDR_IN_PREVIOUS_FRAME *//* A C expression whose value is RTL representing the location of the incoming   return address at the beginning of any function, before the prologue.  This   RTL is either a `REG', indicating that the return value is saved in `REG',   or a `MEM' representing a location in the stack.   You only need to define this macro if you want to support call frame   debugging information like that provided by DWARF 2.  *//* Before the prologue, RA lives in r62.  */#define INCOMING_RETURN_ADDR_RTX  gen_rtx (REG, Pmode, GPR_LINK)/* A C expression whose value is an integer giving the offset, in bytes, from   the value of the stack pointer register to the top of the stack frame at the   beginning of any function, before the prologue.  The top of the frame is   defined to be the value of the stack pointer in the previous frame, just   before the call instruction.   You only need to define this macro if you want to support call frame   debugging information like that provided by DWARF 2.  */#define INCOMING_FRAME_SP_OFFSET 0/* Initialize data used by insn expanders.  This is called from insn_emit,   once for every function before code is generated.  */#define INIT_EXPANDERS  d30v_init_expanders ()/* Stack Checking.  *//* A nonzero value if stack checking is done by the configuration files in a   machine-dependent manner.  You should define this macro if stack checking is   require by the ABI of your machine or if you would like to have to stack   checking in some more efficient way than GNU CC's portable approach.  The   default value of this macro is zero.  *//* #define STACK_CHECK_BUILTIN *//* An integer representing the interval at which GNU CC must generate stack   probe instructions.  You will normally define this macro to be no larger   than the size of the "guard pages" at the end of a stack area.  The default   value of 4096 is suitable for most systems.  *//* #define STACK_CHECK_PROBE_INTERVAL *//* An integer which is nonzero if GNU CC should perform the stack probe as a   load instruction and zero if GNU CC should use a store instruction.  The   default is zero, which is the most efficient choice on most systems.  *//* #define STACK_CHECK_PROBE_LOAD *//* The number of bytes of stack needed to recover from a stack overflow, for

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -