📄 rs6000.h
字号:
/* Target pragma. */#define REGISTER_TARGET_PRAGMAS() do { \ c_register_pragma (0, "longcall", rs6000_pragma_longcall); \ targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \} while (0)/* Target #defines. */#define TARGET_CPU_CPP_BUILTINS() \ rs6000_cpu_cpp_builtins (pfile)/* This is used by rs6000_cpu_cpp_builtins to indicate the byte order we're compiling for. Some configurations may need to override it. */#define RS6000_CPU_CPP_ENDIAN_BUILTINS() \ do \ { \ if (BYTES_BIG_ENDIAN) \ { \ builtin_define ("__BIG_ENDIAN__"); \ builtin_define ("_BIG_ENDIAN"); \ builtin_assert ("machine=bigendian"); \ } \ else \ { \ builtin_define ("__LITTLE_ENDIAN__"); \ builtin_define ("_LITTLE_ENDIAN"); \ builtin_assert ("machine=littleendian"); \ } \ } \ while (0)/* Target machine storage layout. *//* Define this macro if it is advisable to hold scalars in registers in a wider mode than that declared by the program. In such cases, the value is constrained to be within the bounds of the declared type, but kept valid in the wider mode. The signedness of the extension may differ from that of the type. */#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ if (GET_MODE_CLASS (MODE) == MODE_INT \ && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \ (MODE) = TARGET_32BIT ? SImode : DImode;/* Define this if most significant bit is lowest numbered in instructions that operate on numbered bit-fields. *//* That is true on RS/6000. */#define BITS_BIG_ENDIAN 1/* Define this if most significant byte of a word is the lowest numbered. *//* That is true on RS/6000. */#define BYTES_BIG_ENDIAN 1/* Define this if most significant word of a multiword number is lowest numbered. For RS/6000 we can decide arbitrarily since there are no machine instructions for them. Might as well be consistent with bits and bytes. */#define WORDS_BIG_ENDIAN 1#define MAX_BITS_PER_WORD 64/* Width of a word, in units (bytes). */#define UNITS_PER_WORD (! TARGET_POWERPC64 ? 4 : 8)#ifdef IN_LIBGCC2#define MIN_UNITS_PER_WORD UNITS_PER_WORD#else#define MIN_UNITS_PER_WORD 4#endif#define UNITS_PER_FP_WORD 8#define UNITS_PER_ALTIVEC_WORD 16#define UNITS_PER_SPE_WORD 8/* Type used for ptrdiff_t, as a string used in a declaration. */#define PTRDIFF_TYPE "int"/* Type used for size_t, as a string used in a declaration. */#define SIZE_TYPE "long unsigned int"/* Type used for wchar_t, as a string used in a declaration. */#define WCHAR_TYPE "short unsigned int"/* Width of wchar_t in bits. */#define WCHAR_TYPE_SIZE 16/* A C expression for the size in bits of the type `short' on the target machine. If you don't define this, the default is half a word. (If this would be less than one storage unit, it is rounded up to one unit.) */#define SHORT_TYPE_SIZE 16/* A C expression for the size in bits of the type `int' on the target machine. If you don't define this, the default is one word. */#define INT_TYPE_SIZE 32/* A C expression for the size in bits of the type `long' on the target machine. If you don't define this, the default is one word. */#define LONG_TYPE_SIZE (TARGET_32BIT ? 32 : 64)/* A C expression for the size in bits of the type `long long' on the target machine. If you don't define this, the default is two words. */#define LONG_LONG_TYPE_SIZE 64/* A C expression for the size in bits of the type `float' on the target machine. If you don't define this, the default is one word. */#define FLOAT_TYPE_SIZE 32/* A C expression for the size in bits of the type `double' on the target machine. If you don't define this, the default is two words. */#define DOUBLE_TYPE_SIZE 64/* A C expression for the size in bits of the type `long double' on the target machine. If you don't define this, the default is two words. */#define LONG_DOUBLE_TYPE_SIZE rs6000_long_double_type_size/* Define this to set long double type size to use in libgcc2.c, which can not depend on target_flags. */#ifdef __LONG_DOUBLE_128__#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128#else#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64#endif/* Work around rs6000_long_double_type_size dependency in ada/targtyps.c. */#define WIDEST_HARDWARE_FP_SIZE 64/* Width in bits of a pointer. See also the macro `Pmode' defined below. */#define POINTER_SIZE (TARGET_32BIT ? 32 : 64)/* Allocation boundary (in *bits*) for storing arguments in argument list. */#define PARM_BOUNDARY (TARGET_32BIT ? 32 : 64)/* Boundary (in *bits*) on which stack pointer should be aligned. */#define STACK_BOUNDARY \ ((TARGET_32BIT && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)/* Allocation boundary (in *bits*) for the code of a function. */#define FUNCTION_BOUNDARY 32/* No data type wants to be aligned rounder than this. */#define BIGGEST_ALIGNMENT 128/* A C expression to compute the alignment for a variables in the local store. TYPE is the data type, and ALIGN is the alignment that the object would ordinarily have. */#define LOCAL_ALIGNMENT(TYPE, ALIGN) \ ((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) ? 128 : \ (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 : \ (TARGET_SPE && TREE_CODE (TYPE) == VECTOR_TYPE) ? 64 : ALIGN)/* Alignment of field after `int : 0' in a structure. */#define EMPTY_FIELD_BOUNDARY 32/* Every structure's size must be a multiple of this. */#define STRUCTURE_SIZE_BOUNDARY 8/* Return 1 if a structure or array containing FIELD should be accessed using `BLKMODE'. For the SPE, simd types are V2SI, and gcc can be tempted to put the entire thing in a DI and use subregs to access the internals. store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the back-end. Because a single GPR can hold a V2SI, but not a DI, the best thing to do is set structs to BLKmode and avoid Severe Tire Damage. On e500 v2, DF and DI modes suffer from the same anomaly. DF can fit into 1, whereas DI still needs two. */#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \ ((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \ || (TARGET_E500_DOUBLE && (MODE) == DFmode))/* A bit-field declared as `int' forces `int' alignment for the struct. */#define PCC_BITFIELD_TYPE_MATTERS 1/* Make strings word-aligned so strcpy from constants will be faster. Make vector constants quadword aligned. */#define CONSTANT_ALIGNMENT(EXP, ALIGN) \ (TREE_CODE (EXP) == STRING_CST \ && (ALIGN) < BITS_PER_WORD \ ? BITS_PER_WORD \ : (ALIGN))/* Make arrays of chars word-aligned for the same reasons. Align vectors to 128 bits. Align SPE vectors and E500 v2 doubles to 64 bits. */#define DATA_ALIGNMENT(TYPE, ALIGN) \ (TREE_CODE (TYPE) == VECTOR_TYPE ? (TARGET_SPE_ABI ? 64 : 128) \ : (TARGET_E500_DOUBLE && TYPE_MODE (TYPE) == DFmode) ? 64 \ : TREE_CODE (TYPE) == ARRAY_TYPE \ && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))/* Nonzero if move instructions will actually fail to work when given unaligned data. */#define STRICT_ALIGNMENT 0/* Define this macro to be the value 1 if unaligned accesses have a cost many times greater than aligned accesses, for example if they are emulated in a trap handler. */#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) \ (STRICT_ALIGNMENT \ || (((MODE) == SFmode || (MODE) == DFmode || (MODE) == TFmode \ || (MODE) == DImode) \ && (ALIGN) < 32))/* Standard register usage. *//* Number of actual hardware registers. The hardware registers are assigned numbers for the compiler from 0 to just below FIRST_PSEUDO_REGISTER. All registers that the compiler knows about must be given numbers, even those that are not normally considered general registers. RS/6000 has 32 fixed-point registers, 32 floating-point registers, an MQ register, a count register, a link register, and 8 condition register fields, which we view here as separate registers. AltiVec adds 32 vector registers and a VRsave register. In addition, the difference between the frame and argument pointers is a function of the number of registers saved, so we need to have a register for AP that will later be eliminated in favor of SP or FP. This is a normal register, but it is fixed. We also create a pseudo register for float/int conversions, that will really represent the memory location used. It is represented here as a register, in order to work around problems in allocating stack storage in inline functions. Another pseudo (not included in DWARF_FRAME_REGISTERS) is soft frame pointer, which is eventually eliminated in favor of SP or FP. */#define FIRST_PSEUDO_REGISTER 114/* This must be included for pre gcc 3.0 glibc compatibility. */#define PRE_GCC3_DWARF_FRAME_REGISTERS 77/* Add 32 dwarf columns for synthetic SPE registers. */#define DWARF_FRAME_REGISTERS ((FIRST_PSEUDO_REGISTER - 1) + 32)/* The SPE has an additional 32 synthetic registers, with DWARF debug info numbering for these registers starting at 1200. While eh_frame register numbering need not be the same as the debug info numbering, we choose to number these regs for eh_frame at 1200 too. This allows future versions of the rs6000 backend to add hard registers and continue to use the gcc hard register numbering for eh_frame. If the extra SPE registers in eh_frame were numbered starting from the current value of FIRST_PSEUDO_REGISTER, then if FIRST_PSEUDO_REGISTER changed we'd need to introduce a mapping in DWARF_FRAME_REGNUM to avoid invalidating older SPE eh_frame info. We must map them here to avoid huge unwinder tables mostly consisting of unused space. */#define DWARF_REG_TO_UNWIND_COLUMN(r) \ ((r) > 1200 ? ((r) - 1200 + FIRST_PSEUDO_REGISTER - 1) : (r))/* Use gcc hard register numbering for eh_frame. */#define DWARF_FRAME_REGNUM(REGNO) (REGNO)/* 1 for registers that have pervasive standard uses and are not available for the register allocator. On RS/6000, r1 is used for the stack. On Darwin, r2 is available as a local register; for all other OS's r2 is the TOC pointer. cr5 is not supposed to be used. On System V implementations, r13 is fixed and not available for use. */#define FIXED_REGISTERS \ {0, 1, FIXED_R2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FIXED_R13, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 1, 0, 0, 1, \ /* AltiVec registers. */ \ 0, 0, 0, 0, 0, 0, 0, 0, 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 for registers not available across function calls. These must include the FIXED_REGISTERS and also any registers that can be used without being saved. The latter must include the registers where values are returned and the register where structure-value addresses are passed. Aside from that, you can include as many other registers as you like. */#define CALL_USED_REGISTERS \ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, FIXED_R13, 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, 1, 1, 1, 1, 1, 1, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \ /* AltiVec registers. */ \ 0, 0, 0, 0, 0, 0, 0, 0, 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 \}/* Like `CALL_USED_REGISTERS' except this macro doesn't require that the entire set of `FIXED_REGISTERS' be included. (`CALL_USED_REGISTERS' must be a superset of `FIXED_REGISTERS'). This macro is optional. If not specified, it defaults to the value of `CALL_USED_REGISTERS'. */#define CALL_REALLY_USED_REGISTERS \ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, FIXED_R13, 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, 1, 1, 1, 1, 1, 1, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \ /* AltiVec registers. */ \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0 \ , 0, 0, 0 \}#define MQ_REGNO 64#define CR0_REGNO 68#define CR1_REGNO 69#define CR2_REGNO 70#define CR3_REGNO 71#define CR4_REGNO 72#define MAX_CR_REGNO 75#define XER_REGNO 76#define FIRST_ALTIVEC_REGNO 77#define LAST_ALTIVEC_REGNO 108#define TOTAL_ALTIVEC_REGS (LAST_ALTIVEC_REGNO - FIRST_ALTIVEC_REGNO + 1)#define VRSAVE_REGNO 109#define VSCR_REGNO 110#define SPE_ACC_REGNO 111#define SPEFSCR_REGNO 112#define FIRST_SAVED_ALTIVEC_REGNO (FIRST_ALTIVEC_REGNO+20)#define FIRST_SAVED_FP_REGNO (14+32)#define FIRST_SAVED_GP_REGNO 13/* List the order in which to allocate registers. Each register must be listed once, even those in FIXED_REGISTERS.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -