📄 d30v.h
字号:
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 + -