📄 arm.h
字号:
problems in GLD which doesn't understand that armv5t code is interworking clean. */extern int arm_cpp_interwork;#ifndef TARGET_DEFAULT#define TARGET_DEFAULT (MASK_APCS_FRAME)#endif/* The frame pointer register used in gcc has nothing to do with debugging; that is controlled by the APCS-FRAME option. */#define CAN_DEBUG_WITHOUT_FP#define OVERRIDE_OPTIONS arm_override_options ()/* Nonzero if PIC code requires explicit qualifiers to generate PLT and GOT relocs rather than the assembler doing so implicitly. Subtargets can override these if required. */#ifndef NEED_GOT_RELOC#define NEED_GOT_RELOC 0#endif#ifndef NEED_PLT_RELOC#define NEED_PLT_RELOC 0#endif/* Nonzero if we need to refer to the GOT with a PC-relative offset. In other words, generate .word _GLOBAL_OFFSET_TABLE_ - [. - (.Lxx + 8)] rather than .word _GLOBAL_OFFSET_TABLE_ - (.Lxx + 8) The default is true, which matches NetBSD. Subtargets can override this if required. */#ifndef GOT_PCREL#define GOT_PCREL 1#endif/* 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. *//* It is far faster to zero extend chars than to sign extend them */#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \ if (GET_MODE_CLASS (MODE) == MODE_INT \ && GET_MODE_SIZE (MODE) < 4) \ { \ if (MODE == QImode) \ UNSIGNEDP = 1; \ else if (MODE == HImode) \ UNSIGNEDP = 1; \ (MODE) = SImode; \ }#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE) \ if ((GET_MODE_CLASS (MODE) == MODE_INT \ || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT) \ && GET_MODE_SIZE (MODE) < 4) \ (MODE) = SImode; \/* Define this if most significant bit is lowest numbered in instructions that operate on numbered bit-fields. */#define BITS_BIG_ENDIAN 0/* Define this if most significant byte of a word is the lowest numbered. Most ARM processors are run in little endian mode, so that is the default. If you want to have it run-time selectable, change the definition in a cover file to be TARGET_BIG_ENDIAN. */#define BYTES_BIG_ENDIAN (TARGET_BIG_END != 0)/* Define this if most significant word of a multiword number is the lowest numbered. This is always false, even when in big-endian mode. */#define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS)/* LIBGCC2_WORDS_BIG_ENDIAN has to be a constant, so we define this based on processor pre-defineds when compiling libgcc2.c. */#if defined(__ARMEB__) && !defined(__ARMWEL__)#define LIBGCC2_WORDS_BIG_ENDIAN 1#else#define LIBGCC2_WORDS_BIG_ENDIAN 0#endif/* Define this if most significant word of doubles is the lowest numbered. The rules are different based on whether or not we use FPA-format, VFP-format or some other floating point co-processor's format doubles. */#define FLOAT_WORDS_BIG_ENDIAN (arm_float_words_big_endian ())#define UNITS_PER_WORD 4/* True if natural alignment is used for doubleword types. */#define ARM_DOUBLEWORD_ALIGN TARGET_AAPCS_BASED#define DOUBLEWORD_ALIGNMENT 64#define PARM_BOUNDARY 32#define STACK_BOUNDARY (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)#define PREFERRED_STACK_BOUNDARY \ (arm_abi == ARM_ABI_ATPCS ? 64 : STACK_BOUNDARY)#define FUNCTION_BOUNDARY 32/* The lowest bit is used to indicate Thumb-mode functions, so the vbit must go into the delta field of pointers to member functions. */#define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta#define EMPTY_FIELD_BOUNDARY 32#define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)/* XXX Blah -- this macro is used directly by libobjc. Since it supports no vector modes, cut out the complexity and fall back on BIGGEST_FIELD_ALIGNMENT. */#ifdef IN_TARGET_LIBS#define BIGGEST_FIELD_ALIGNMENT 64#endif/* Make strings word-aligned so strcpy from constants will be faster. */#define CONSTANT_ALIGNMENT_FACTOR (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2)#define CONSTANT_ALIGNMENT(EXP, ALIGN) \ ((TREE_CODE (EXP) == STRING_CST \ && (ALIGN) < BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR) \ ? BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR : (ALIGN))/* Setting STRUCTURE_SIZE_BOUNDARY to 32 produces more efficient code, but the value set in previous versions of this toolchain was 8, which produces more compact structures. The command line option -mstructure_size_boundary=<n> can be used to change this value. For compatibility with the ARM SDK however the value should be left at 32. ARM SDT Reference Manual (ARM DUI 0020D) page 2-20 says "Structures are aligned on word boundaries". The AAPCS specifies a value of 8. */#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundaryextern int arm_structure_size_boundary;/* This is the value used to initialize arm_structure_size_boundary. If a particular arm target wants to change the default value it should change the definition of this macro, not STRUCTURE_SIZE_BOUNDARY. See netbsd.h for an example of this. */#ifndef DEFAULT_STRUCTURE_SIZE_BOUNDARY#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 32#endif/* Nonzero if move instructions will actually fail to work when given unaligned data. */#define STRICT_ALIGNMENT 1/* wchar_t is unsigned under the AAPCS. */#ifndef WCHAR_TYPE#define WCHAR_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "int")#define WCHAR_TYPE_SIZE BITS_PER_WORD#endif#ifndef SIZE_TYPE#define SIZE_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "long unsigned int")#endif#ifndef PTRDIFF_TYPE#define PTRDIFF_TYPE (TARGET_AAPCS_BASED ? "int" : "long int")#endif/* AAPCS requires that structure alignment is affected by bitfields. */#ifndef PCC_BITFIELD_TYPE_MATTERS#define PCC_BITFIELD_TYPE_MATTERS TARGET_AAPCS_BASED#endif/* Standard register usage. *//* Register allocation in ARM Procedure Call Standard (as used on RISCiX): (S - saved over call). r0 * argument word/integer result r1-r3 argument word r4-r8 S register variable r9 S (rfp) register variable (real frame pointer) r10 F S (sl) stack limit (used by -mapcs-stack-check) r11 F S (fp) argument pointer r12 (ip) temp workspace r13 F S (sp) lower end of current stack frame r14 (lr) link address/workspace r15 F (pc) program counter f0 floating point result f1-f3 floating point scratch f4-f7 S floating point variable cc This is NOT a real register, but is used internally to represent things that use or set the condition codes. sfp This isn't either. It is used during rtl generation since the offset between the frame pointer and the auto's isn't known until after register allocation. afp Nor this, we only need this because of non-local goto. Without it fp appears to be used and the elimination code won't get rid of sfp. It tracks fp exactly at all times. *: See CONDITIONAL_REGISTER_USAGE *//* mvf0 Cirrus floating point result mvf1-mvf3 Cirrus floating point scratch mvf4-mvf15 S Cirrus floating point variable. *//* s0-s15 VFP scratch (aka d0-d7). s16-s31 S VFP variable (aka d8-d15). vfpcc Not a real register. Represents the VFP condition code flags. *//* The stack backtrace structure is as follows: fp points to here: | save code pointer | [fp] | return link value | [fp, #-4] | return sp value | [fp, #-8] | return fp value | [fp, #-12] [| saved r10 value |] [| saved r9 value |] [| saved r8 value |] [| saved r7 value |] [| saved r6 value |] [| saved r5 value |] [| saved r4 value |] [| saved r3 value |] [| saved r2 value |] [| saved r1 value |] [| saved r0 value |] [| saved f7 value |] three words [| saved f6 value |] three words [| saved f5 value |] three words [| saved f4 value |] three words r0-r3 are not normally saved in a C function. *//* 1 for registers that have pervasive standard uses and are not available for the register allocator. */#define FIXED_REGISTERS \{ \ 0,0,0,0,0,0,0,0, \ 0,0,0,0,0,1,0,1, \ 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 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. The CC is not preserved over function calls on the ARM 6, so it is easier to assume this for all. SFP is preserved, since FP is. */#define CALL_USED_REGISTERS \{ \ 1,1,1,1,0,0,0,0, \ 0,0,0,0,1,1,1,1, \ 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,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 \}#ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE#define SUBTARGET_CONDITIONAL_REGISTER_USAGE#endif#define CONDITIONAL_REGISTER_USAGE \{ \ int regno; \ \ if (TARGET_SOFT_FLOAT || TARGET_THUMB || !TARGET_FPA) \ { \ for (regno = FIRST_FPA_REGNUM; \ regno <= LAST_FPA_REGNUM; ++regno) \ fixed_regs[regno] = call_used_regs[regno] = 1; \ } \ \ if (TARGET_THUMB && optimize_size) \ { \ /* When optimizing for size, it's better not to use \ the HI regs, because of the overhead of stacking \ them. */ \ for (regno = FIRST_HI_REGNUM; \ regno <= LAST_HI_REGNUM; ++regno) \ fixed_regs[regno] = call_used_regs[regno] = 1; \ } \ \ /* The link register can be clobbered by any branch insn, \ but we have no way to track that at present, so mark \ it as unavailable. */ \ if (TARGET_THUMB) \ fixed_regs[LR_REGNUM] = call_used_regs[LR_REGNUM] = 1; \ \ if (TARGET_ARM && TARGET_HARD_FLOAT) \ { \ if (TARGET_MAVERICK) \ { \ for (regno = FIRST_FPA_REGNUM; \ regno <= LAST_FPA_REGNUM; ++ regno) \ fixed_regs[regno] = call_used_regs[regno] = 1; \ for (regno = FIRST_CIRRUS_FP_REGNUM; \ regno <= LAST_CIRRUS_FP_REGNUM; ++ regno) \ { \ fixed_regs[regno] = 0; \ call_used_regs[regno] = regno < FIRST_CIRRUS_FP_REGNUM + 4; \ } \ } \ if (TARGET_VFP) \ { \ for (regno = FIRST_VFP_REGNUM; \ regno <= LAST_VFP_REGNUM; ++ regno) \ { \ fixed_regs[regno] = 0; \ call_used_regs[regno] = regno < FIRST_VFP_REGNUM + 16; \ } \ } \ } \ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -