📄 ip2k.h
字号:
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_MAX_NREGS(CLASS, MODE) GET_MODE_SIZE (MODE)/* 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 CONST_OK_FOR_LETTER_P(VALUE, C) \ ((C) == 'I' ? (VALUE) >= -255 && (VALUE) <= -1 : \ (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 7 : \ (C) == 'K' ? (VALUE) >= 0 && (VALUE) <= 127 : \ (C) == 'L' ? (VALUE) > 0 && (VALUE) < 128: \ (C) == 'M' ? (VALUE) == -1: \ (C) == 'N' ? (VALUE) == 1: \ (C) == 'O' ? (VALUE) == 0: \ (C) == 'P' ? (VALUE) >= 0 && (VALUE) <= 255: \ 0)/* 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_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0/* `CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)' A C expression that defines the machine-dependent operand constraint letters that specify particular ranges of `const_double' values (`G' or `H'). 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 EXTRA_CONSTRAINT(X, C) ip2k_extra_constraint (X, C)/* 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. *//* This is an undocumented variable which describes how GCC will pop a data. */#define STACK_POP_CODE PRE_INC#define STACK_PUSH_CODE POST_DEC/* This macro defines the operation used when something is pushed on the stack. In RTL, a push operation will be `(set (mem (STACK_PUSH_CODE (reg sp))) ...)' The choices are `PRE_DEC', `POST_DEC', `PRE_INC', and `POST_INC'. Which of these is correct depends on the stack direction and on whether the stack pointer points to the last item on the stack or whether it points to the space for the next item on the stack. The default is `PRE_DEC' when `STACK_GROWS_DOWNWARD' is defined, which is almost always right, and `PRE_INC' otherwise, which is often wrong. */#define STACK_CHECK_BUILTIN 1/* Prologue code will do stack checking as necessary. */ #define STARTING_FRAME_OFFSET (0) /* 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 FRAME_GROWS_DOWNWARD 1#define STACK_GROWS_DOWNWARD 1/* On IP2K arg pointer is virtual and resolves to either SP or FP after we've resolved what registers are saved (fp chain, return pc, etc. */#define FIRST_PARM_OFFSET(FUNDECL) 0/* 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. *//* `STACK_DYNAMIC_OFFSET (FUNDECL)' 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_POINTER_OFFSET 1/* IP2K stack is post-decremented, so 0(sp) is address of open space and 1(sp) is offset to the location avobe the forst location at which outgoing arguments are placed. */#define STACK_BOUNDARY 8/* Define this macro if there is a guaranteed alignment for the stack pointer on this machine. The definition is a C expression for the desired alignment (measured in bits). This value is used as a default if PREFERRED_STACK_BOUNDARY is not defined. */#define STACK_POINTER_REGNUM REG_SP/* The register number of the stack pointer register, which must also be a fixed register according to `FIXED_REGISTERS'. On most machines, the hardware determines which register this is. */#define FRAME_POINTER_REGNUM REG_VFP/* The register number of the frame pointer register, which is used to access automatic variables in the stack frame. On some machines, the hardware determines which register this is. On other machines, you can choose any register you wish for this purpose. */#define HARD_FRAME_POINTER_REGNUM REG_FP#define ARG_POINTER_REGNUM REG_AP/* The register number of the arg pointer register, which is used to access the function's argument list. On some machines, this is the same as the frame pointer register. On some machines, the hardware determines which register this is. On other machines, you can choose any register you wish for this purpose. If this is not the same register as the frame pointer register, then you must mark it as a fixed register according to `FIXED_REGISTERS', or arrange to be able to eliminate it (*note Elimination::.). *//* We don't really want to support nested functions. But we'll crash in various testsuite tests if we don't at least define the register to contain the static chain. The return value register is about as bad a place as any for this. */#define STATIC_CHAIN_REGNUM REG_RESULT/* Register numbers used for passing a function's static chain pointer. If register windows are used, the register number as seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM', while the register number as seen by the calling function is `STATIC_CHAIN_REGNUM'. If these registers are the same, `STATIC_CHAIN_INCOMING_REGNUM' need not be defined. The static chain register need not be a fixed register. If the static chain is passed in memory, these macros should not be defined; instead, the next two macros should be defined. */#define FRAME_POINTER_REQUIRED (!flag_omit_frame_pointer)/* A C expression which is nonzero if a function must have and use a frame pointer. This expression is evaluated in the reload pass. If its value is nonzero the function will have a frame pointer. The expression can in principle examine the current function and decide according to the facts, but on most machines the constant 0 or the constant 1 suffices. Use 0 when the machine allows code to be generated with no frame pointer, and doing so saves some time or space. Use 1 when there is no possible advantage to avoiding a frame pointer. In certain cases, the compiler does not know how to produce valid code without a frame pointer. The compiler recognizes those cases and automatically gives the function a frame pointer regardless of what `FRAME_POINTER_REQUIRED' says. You don't need to worry about them. In a function that does not require a frame pointer, the frame pointer register can be allocated for ordinary usage, unless you mark it as a fixed register. See `FIXED_REGISTERS' for more information. */#define ELIMINABLE_REGS { \ {ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ {HARD_FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \}/* If defined, this macro specifies a table of register pairs used to eliminate unneeded registers that point into the stack frame. If it is not defined, the only elimination attempted by the compiler is to replace references to the frame pointer with references to the stack pointer. The definition of this macro is a list of structure initializations, each of which specifies an original and replacement register. On some machines, the position of the argument pointer is not known until the compilation is completed. In such a case, a separate hard register must be used for the argument pointer. This register can be eliminated by replacing it with either the frame pointer or the argument pointer, depending on whether or not the frame pointer has been eliminated. In this case, you might specify: #define ELIMINABLE_REGS \ {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} Note that the elimination of the argument pointer with the stack pointer is specified first since that is the preferred elimination. */#define CAN_ELIMINATE(FROM, TO) \ ((FROM) == HARD_FRAME_POINTER_REGNUM \ ? (flag_omit_frame_pointer && !frame_pointer_needed) : 1)/* Don't eliminate FP unless we EXPLICITLY_ASKED *//* A C expression that returns nonzero if the compiler is allowed to try to replace register number FROM-REG with register number TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is defined, and will usually be the constant 1, since most of the cases preventing register elimination are things that the compiler already knows about. */#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ ((OFFSET) = ip2k_init_elim_offset ((FROM), (TO)))/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It specifies the initial difference between the specified pair of registers. This macro must be defined if `ELIMINABLE_REGS' is defined. */#define RETURN_ADDR_RTX(COUNT, X) \ (((COUNT) == 0) ? gen_rtx_REG (HImode, REG_CALLH) : NULL_RTX)/* 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. */#define PUSH_ROUNDING(NPUSHED) (NPUSHED)/* A C expression that is the number of bytes actually pushed onto the stack when an instruction attempts to push NPUSHED bytes. If the target machine does not have a push instruction, do not define this macro. That directs GNU CC to use an alternate strategy: to allocate the entire argument block and then store the arguments into it. On some machines, the definition #define PUSH_ROUNDING(BYTES) (BYTES) will suffice. But on other machines, instructions that appear to push one byte actually push two bytes in an attempt to maintain alignment. Then the definition should be #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) */#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ ip2k_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE))/* A C expression that should indicate the number of bytes of its own arguments that a function pops on returning, or 0 if the function pops no arguments and the caller must therefore pop them all after the function returns. FUNDECL is a C variable whose value is a tree node that describes the function in question. Normally it is a node of type `FUNCTION_DECL' that describes the declaration of the function. From this you can obtain the DECL_MACHINE_ATTRIBUTES of the function.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -