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

📄 ip2k.h

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 H
📖 第 1 页 / 共 5 页
字号:
   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 + -