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

📄 rs6000.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 5 页
字号:
/* 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 + -