📄 ia64.h
字号:
#if defined(__BIG_ENDIAN__)#define LIBGCC2_WORDS_BIG_ENDIAN 1#else#define LIBGCC2_WORDS_BIG_ENDIAN 0#endif#define UNITS_PER_WORD 8#define UNITS_PER_SIMD_WORD UNITS_PER_WORD#define POINTER_SIZE (TARGET_ILP32 ? 32 : 64)/* A C expression whose value is zero if pointers that need to be extended from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and one if they are zero-extended and negative one if there is a ptr_extend operation. You need not define this macro if the `POINTER_SIZE' is equal to the width of `Pmode'. *//* Need this for 32 bit pointers, see hpux.h for setting it. *//* #define POINTERS_EXTEND_UNSIGNED *//* A macro to update MODE and UNSIGNEDP when an object whose type is TYPE and which has the specified mode and signedness is to be stored in a register. This macro is only called when TYPE is a scalar type. */#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \do \ { \ if (GET_MODE_CLASS (MODE) == MODE_INT \ && GET_MODE_SIZE (MODE) < 4) \ (MODE) = SImode; \ } \while (0)#define PARM_BOUNDARY 64/* Define this macro if you wish to preserve a certain alignment for the stack pointer. The definition is a C expression for the desired alignment (measured in bits). */#define STACK_BOUNDARY 128/* Align frames on double word boundaries */#ifndef IA64_STACK_ALIGN#define IA64_STACK_ALIGN(LOC) (((LOC) + 15) & ~15)#endif#define FUNCTION_BOUNDARY 128/* Optional x86 80-bit float, quad-precision 128-bit float, and quad-word 128 bit integers all require 128 bit alignment. */#define BIGGEST_ALIGNMENT 128/* If defined, a C expression to compute the alignment for a static variable. TYPE is the data type, and ALIGN is the alignment that the object would ordinarily have. The value of this macro is used instead of that alignment to align the object. */#define DATA_ALIGNMENT(TYPE, ALIGN) \ (TREE_CODE (TYPE) == ARRAY_TYPE \ && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))/* If defined, a C expression to compute the alignment given to a constant that is being placed in memory. CONSTANT is the constant and ALIGN is the alignment that the object would ordinarily have. The value of this macro is used instead of that alignment to align the object. */#define CONSTANT_ALIGNMENT(EXP, ALIGN) \ (TREE_CODE (EXP) == STRING_CST \ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))#define STRICT_ALIGNMENT 1/* Define this if you wish to imitate the way many other C compilers handle alignment of bitfields and the structures that contain them. The behavior is that the type written for a bit-field (`int', `short', or other integer type) imposes an alignment for the entire structure, as if the structure really did contain an ordinary field of that type. In addition, the bit-field is placed within the structure so that it would fit within such a field, not crossing a boundary for it. */#define PCC_BITFIELD_TYPE_MATTERS 1/* An integer expression for the size in bits of the largest integer machine mode that should actually be used. *//* Allow pairs of registers to be used, which is the intent of the default. */#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (TImode)/* By default, the C++ compiler will use function addresses in the vtable entries. Setting this nonzero tells the compiler to use function descriptors instead. The value of this macro says how many words wide the descriptor is (normally 2). It is assumed that the address of a function descriptor may be treated as a pointer to a function. For reasons known only to HP, the vtable entries (as opposed to normal function descriptors) are 16 bytes wide in 32-bit mode as well, even though the 3rd and 4th words are unused. */#define TARGET_VTABLE_USES_DESCRIPTORS (TARGET_ILP32 ? 4 : 2)/* Due to silliness in the HPUX linker, vtable entries must be 8-byte aligned even in 32-bit mode. Rather than create multiple ABIs, force this restriction on everyone else too. */#define TARGET_VTABLE_ENTRY_ALIGN 64/* Due to the above, we need extra padding for the data entries below 0 to retain the alignment of the descriptors. */#define TARGET_VTABLE_DATA_ENTRY_DISTANCE (TARGET_ILP32 ? 2 : 1)/* Layout of Source Language Data Types */#define INT_TYPE_SIZE 32#define SHORT_TYPE_SIZE 16#define LONG_TYPE_SIZE (TARGET_ILP32 ? 32 : 64)#define LONG_LONG_TYPE_SIZE 64#define FLOAT_TYPE_SIZE 32#define DOUBLE_TYPE_SIZE 64/* long double is XFmode normally, TFmode for HPUX. */#define LONG_DOUBLE_TYPE_SIZE (TARGET_HPUX ? 128 : 80)/* We always want the XFmode operations from libgcc2.c. */#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80#define DEFAULT_SIGNED_CHAR 1/* A C expression for a string describing the name of the data type to use for size values. The typedef name `size_t' is defined using the contents of the string. *//* ??? Needs to be defined for P64 code. *//* #define SIZE_TYPE *//* A C expression for a string describing the name of the data type to use for the result of subtracting two pointers. The typedef name `ptrdiff_t' is defined using the contents of the string. See `SIZE_TYPE' above for more information. *//* ??? Needs to be defined for P64 code. *//* #define PTRDIFF_TYPE *//* A C expression for a string describing the name of the data type to use for wide characters. The typedef name `wchar_t' is defined using the contents of the string. See `SIZE_TYPE' above for more information. *//* #define WCHAR_TYPE *//* A C expression for the size in bits of the data type for wide characters. This is used in `cpp', which cannot make use of `WCHAR_TYPE'. *//* #define WCHAR_TYPE_SIZE *//* Register Basics *//* Number of hardware registers known to the compiler. We have 128 general registers, 128 floating point registers, 64 predicate registers, 8 branch registers, one frame pointer, and several "application" registers. */#define FIRST_PSEUDO_REGISTER 334/* Ranges for the various kinds of registers. */#define ADDL_REGNO_P(REGNO) ((unsigned HOST_WIDE_INT) (REGNO) <= 3)#define GR_REGNO_P(REGNO) ((unsigned HOST_WIDE_INT) (REGNO) <= 127)#define FR_REGNO_P(REGNO) ((REGNO) >= 128 && (REGNO) <= 255)#define PR_REGNO_P(REGNO) ((REGNO) >= 256 && (REGNO) <= 319)#define BR_REGNO_P(REGNO) ((REGNO) >= 320 && (REGNO) <= 327)#define GENERAL_REGNO_P(REGNO) \ (GR_REGNO_P (REGNO) || (REGNO) == FRAME_POINTER_REGNUM)#define GR_REG(REGNO) ((REGNO) + 0)#define FR_REG(REGNO) ((REGNO) + 128)#define PR_REG(REGNO) ((REGNO) + 256)#define BR_REG(REGNO) ((REGNO) + 320)#define OUT_REG(REGNO) ((REGNO) + 120)#define IN_REG(REGNO) ((REGNO) + 112)#define LOC_REG(REGNO) ((REGNO) + 32)#define AR_CCV_REGNUM 329#define AR_UNAT_REGNUM 330#define AR_PFS_REGNUM 331#define AR_LC_REGNUM 332#define AR_EC_REGNUM 333#define IN_REGNO_P(REGNO) ((REGNO) >= IN_REG (0) && (REGNO) <= IN_REG (7))#define LOC_REGNO_P(REGNO) ((REGNO) >= LOC_REG (0) && (REGNO) <= LOC_REG (79))#define OUT_REGNO_P(REGNO) ((REGNO) >= OUT_REG (0) && (REGNO) <= OUT_REG (7))#define AR_M_REGNO_P(REGNO) ((REGNO) == AR_CCV_REGNUM \ || (REGNO) == AR_UNAT_REGNUM)#define AR_I_REGNO_P(REGNO) ((REGNO) >= AR_PFS_REGNUM \ && (REGNO) < FIRST_PSEUDO_REGISTER)#define AR_REGNO_P(REGNO) ((REGNO) >= AR_CCV_REGNUM \ && (REGNO) < FIRST_PSEUDO_REGISTER)/* ??? Don't really need two sets of macros. I like this one better because it is less typing. */#define R_GR(REGNO) GR_REG (REGNO)#define R_FR(REGNO) FR_REG (REGNO)#define R_PR(REGNO) PR_REG (REGNO)#define R_BR(REGNO) BR_REG (REGNO)/* An initializer that says which registers are used for fixed purposes all throughout the compiled code and are therefore not available for general allocation. r0: constant 0 r1: global pointer (gp) r12: stack pointer (sp) r13: thread pointer (tp) f0: constant 0.0 f1: constant 1.0 p0: constant true fp: eliminable frame pointer *//* The last 16 stacked regs are reserved for the 8 input and 8 output registers. */#define FIXED_REGISTERS \{ /* General registers. */ \ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ /* Floating-point registers. */ \ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ /* Predicate registers. */ \ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ /* Branch registers. */ \ 0, 0, 0, 0, 0, 0, 0, 0, \ /*FP CCV UNAT PFS LC EC */ \ 1, 1, 1, 1, 0, 1 \ }/* Like `FIXED_REGISTERS' but has 1 for each register that is clobbered (in general) by function calls as well as for fixed registers. This macro therefore identifies the registers that are not available for general allocation of values that must live across function calls. */#define CALL_USED_REGISTERS \{ /* General registers. */ \ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, \ /* Floating-point registers. */ \ 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ /* Predicate registers. */ \ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ /* Branch registers. */ \ 1, 0, 0, 0, 0, 0, 1, 1, \ /*FP CCV UNAT PFS LC EC */ \ 1, 1, 1, 1, 0, 1 \}/* Like `CALL_USED_REGISTERS' but used to overcome a historical problem which makes CALL_USED_REGISTERS *always* include all the FIXED_REGISTERS. Until this problem has been resolved this macro can be used to overcome this situation. In particular, block_propagate() requires this list be accurate, or we can remove registers which should be live. This macro is used in regs_invalidated_by_call. */#define CALL_REALLY_USED_REGISTERS \{ /* General registers. */ \ 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, \ /* Floating-point registers. */ \ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ /* Predicate registers. */ \ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ /* Branch registers. */ \ 1, 0, 0, 0, 0, 0, 1, 1, \ /*FP CCV UNAT PFS LC EC */ \ 0, 1, 0, 1, 0, 0 \}/* Define this macro if the target machine has register windows. This C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -