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

📄 stormy16.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
/* Many machines have some registers that cannot be copied directly to or from   memory or even from other types of registers.  An example is the `MQ'   register, which on most machines, can only be copied to or from general   registers, but not memory.  Some machines allow copying all registers to and   from memory, but require a scratch register for stores to some memory   locations (e.g., those with symbolic address on the RT, and those with   certain symbolic address on the SPARC when compiling PIC).  In some cases,   both an intermediate and a scratch register are required.   You should define these macros to indicate to the reload phase that it may   need to allocate at least one register for a reload in addition to the   register to contain the data.  Specifically, if copying X to a register   CLASS in MODE requires an intermediate register, you should define   `SECONDARY_INPUT_RELOAD_CLASS' to return the largest register class all of   whose registers can be used as intermediate registers or scratch registers.   If copying a register CLASS in MODE to X requires an intermediate or scratch   register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be defined to return the   largest register class required.  If the requirements for input and output   reloads are the same, the macro `SECONDARY_RELOAD_CLASS' should be used   instead of defining both macros identically.   The values returned by these macros are often `GENERAL_REGS'.  Return   `NO_REGS' if no spare register is needed; i.e., if X can be directly copied   to or from a register of CLASS in MODE without requiring a scratch register.   Do not define this macro if it would always return `NO_REGS'.   If a scratch register is required (either with or without an intermediate   register), you should define patterns for `reload_inM' or `reload_outM', as   required..  These patterns, which will normally be implemented with a   `define_expand', should be similar to the `movM' patterns, except that   operand 2 is the scratch register.   Define constraints for the reload register and scratch register that contain   a single register class.  If the original reload register (whose class is   CLASS) can meet the constraint given in the pattern, the value returned by   these macros is used for the class of the scratch register.  Otherwise, two   additional reload registers are required.  Their classes are obtained from   the constraints in the insn pattern.   X might be a pseudo-register or a `subreg' of a pseudo-register, which could   either be in a hard register or in memory.  Use `true_regnum' to find out;   it will return -1 if the pseudo is in memory and the hard register number if   it is in a register.   These macros should not be used in the case where a particular class of   registers can only be copied to memory and not to another class of   registers.  In that case, secondary reload registers are not needed and   would not be helpful.  Instead, a stack location must be used to perform the   copy and the `movM' pattern should use memory as an intermediate storage.   This case often occurs between floating-point and general registers.  *//* This chip has the interesting property that only the first eight   registers can be moved to/from memory.  */#define SECONDARY_RELOAD_CLASS(CLASS, MODE, X)			\  xstormy16_secondary_reload_class (CLASS, MODE, X)/* #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) *//* #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) *//* Certain machines have the property that some registers cannot be copied to   some other registers without using memory.  Define this macro on those   machines to be a C expression that is nonzero if objects of mode M in   registers of CLASS1 can only be copied to registers of class CLASS2 by   storing a register of CLASS1 into memory and loading that memory location   into a register of CLASS2.   Do not define this macro if its value would always be zero.  *//* #define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, M) *//* Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler allocates a   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) *//* 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.   This declaration is required.  */#define CLASS_MAX_NREGS(CLASS, MODE) \  ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)/* If defined, a C expression for a class that contains registers which the   compiler must always access in a mode that is the same size as the mode in   which it loaded the register.   For the example, loading 32-bit integer or floating-point objects into   floating-point registers on the Alpha extends them to 64-bits.  Therefore   loading a 64-bit object and then storing it as a 32-bit object does not   store the low-order 32-bits, as would be the case for a normal register.   Therefore, `alpha.h' defines this macro as `FLOAT_REGS'.  *//* #define CLASS_CANNOT_CHANGE_SIZE *//* 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' ? (VALUE) >= 0 && (VALUE) <= 3		\   : (C) == 'J' ? exact_log2 (VALUE) != -1		\   : (C) == 'K' ? exact_log2 (~(VALUE)) != -1		\   : (C) == 'L' ? (VALUE) >= 0 && (VALUE) <= 255	\   : (C) == 'M' ? (VALUE) >= -255 && (VALUE) <= 0	\   : (C) == 'N' ? (VALUE) >= -3 && (VALUE) <= 0		\   : (C) == 'O' ? (VALUE) >= 1 && (VALUE) <= 4		\   : (C) == 'P' ? (VALUE) >= -4 && (VALUE) <= -1	\   : 0 )/* 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) 0/* 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) \  xstormy16_extra_constraint_p (VALUE, C)/* Basic Stack Layout *//* 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 *//* We want to use post-increment instructions to push things on the stack,   because we don't have any pre-increment ones.  */#define STACK_PUSH_CODE POST_INC/* 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 1/* 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 0/* 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

⌨️ 快捷键说明

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