📄 c4x.h
字号:
#define STRICT_ALIGNMENT 0#define TARGET_FLOAT_FORMAT C4X_FLOAT_FORMAT#define MAX_FIXED_MODE_SIZE 64 /* HImode. *//* If a structure has a floating point field then force structure to have BLKMODE, unless it is the only field. */#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \ (TREE_CODE (TREE_TYPE (FIELD)) == REAL_TYPE && (MODE) == VOIDmode)/* Number of bits in the high and low parts of a two stage load of an immediate constant. */#define BITS_PER_HIGH 16#define BITS_PER_LO_SUM 16/* Define register numbers. *//* Extended-precision registers. */#define R0_REGNO 0#define R1_REGNO 1#define R2_REGNO 2#define R3_REGNO 3#define R4_REGNO 4#define R5_REGNO 5#define R6_REGNO 6#define R7_REGNO 7/* Auxiliary (address) registers. */#define AR0_REGNO 8#define AR1_REGNO 9#define AR2_REGNO 10#define AR3_REGNO 11#define AR4_REGNO 12#define AR5_REGNO 13#define AR6_REGNO 14#define AR7_REGNO 15/* Data page register. */#define DP_REGNO 16/* Index registers. */#define IR0_REGNO 17#define IR1_REGNO 18/* Block size register. */#define BK_REGNO 19/* Stack pointer. */#define SP_REGNO 20/* Status register. */#define ST_REGNO 21/* Misc. interrupt registers. */#define DIE_REGNO 22 /* C4x only. */#define IE_REGNO 22 /* C3x only. */#define IIE_REGNO 23 /* C4x only. */#define IF_REGNO 23 /* C3x only. */#define IIF_REGNO 24 /* C4x only. */#define IOF_REGNO 24 /* C3x only. *//* Repeat block registers. */#define RS_REGNO 25#define RE_REGNO 26#define RC_REGNO 27/* Additional extended-precision registers. */#define R8_REGNO 28 /* C4x only. */#define R9_REGNO 29 /* C4x only. */#define R10_REGNO 30 /* C4x only. */#define R11_REGNO 31 /* C4x only. */#define FIRST_PSEUDO_REGISTER 32/* Extended precision registers (low set). */#define IS_R0R1_REGNO(r) \ ((unsigned int)((r) - R0_REGNO) <= (R1_REGNO - R0_REGNO))#define IS_R2R3_REGNO(r) \ ((unsigned int)((r) - R2_REGNO) <= (R3_REGNO - R2_REGNO)) #define IS_EXT_LOW_REGNO(r) \ ((unsigned int)((r) - R0_REGNO) <= (R7_REGNO - R0_REGNO)) /* Extended precision registers (high set). */#define IS_EXT_HIGH_REGNO(r) \(! TARGET_C3X \ && ((unsigned int) ((r) - R8_REGNO) <= (R11_REGNO - R8_REGNO)))/* Address registers. */#define IS_AUX_REGNO(r) \ ((unsigned int)((r) - AR0_REGNO) <= (AR7_REGNO - AR0_REGNO)) #define IS_ADDR_REGNO(r) IS_AUX_REGNO(r)#define IS_DP_REGNO(r) ((r) == DP_REGNO)#define IS_INDEX_REGNO(r) (((r) == IR0_REGNO) || ((r) == IR1_REGNO))#define IS_SP_REGNO(r) ((r) == SP_REGNO)#define IS_BK_REGNO(r) (TARGET_BK && (r) == BK_REGNO)/* Misc registers. */#define IS_ST_REGNO(r) ((r) == ST_REGNO)#define IS_RC_REGNO(r) ((r) == RC_REGNO)#define IS_REPEAT_REGNO(r) (((r) >= RS_REGNO) && ((r) <= RC_REGNO))/* Composite register sets. */#define IS_ADDR_OR_INDEX_REGNO(r) (IS_ADDR_REGNO(r) || IS_INDEX_REGNO(r))#define IS_EXT_REGNO(r) (IS_EXT_LOW_REGNO(r) || IS_EXT_HIGH_REGNO(r))#define IS_STD_REGNO(r) (IS_ADDR_OR_INDEX_REGNO(r) \ || IS_REPEAT_REGNO(r) \ || IS_SP_REGNO(r) \ || IS_BK_REGNO(r))#define IS_INT_REGNO(r) (IS_EXT_REGNO(r) || IS_STD_REGNO(r))#define IS_GROUP1_REGNO(r) (IS_ADDR_OR_INDEX_REGNO(r) || IS_BK_REGNO(r))#define IS_INT_CALL_SAVED_REGNO(r) (((r) == R4_REGNO) || ((r) == R5_REGNO) \ || ((r) == R8_REGNO))#define IS_FLOAT_CALL_SAVED_REGNO(r) (((r) == R6_REGNO) || ((r) == R7_REGNO))#define IS_PSEUDO_REGNO(r) ((r) >= FIRST_PSEUDO_REGISTER)#define IS_R0R1_OR_PSEUDO_REGNO(r) (IS_R0R1_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_R2R3_OR_PSEUDO_REGNO(r) (IS_R2R3_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_EXT_OR_PSEUDO_REGNO(r) (IS_EXT_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_STD_OR_PSEUDO_REGNO(r) (IS_STD_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_INT_OR_PSEUDO_REGNO(r) (IS_INT_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_ADDR_OR_PSEUDO_REGNO(r) (IS_ADDR_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_INDEX_OR_PSEUDO_REGNO(r) (IS_INDEX_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_EXT_LOW_OR_PSEUDO_REGNO(r) (IS_EXT_LOW_REGNO(r) \ || IS_PSEUDO_REGNO(r))#define IS_DP_OR_PSEUDO_REGNO(r) (IS_DP_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_SP_OR_PSEUDO_REGNO(r) (IS_SP_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_ST_OR_PSEUDO_REGNO(r) (IS_ST_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_RC_OR_PSEUDO_REGNO(r) (IS_RC_REGNO(r) || IS_PSEUDO_REGNO(r))#define IS_PSEUDO_REG(op) (IS_PSEUDO_REGNO(REGNO(op)))#define IS_ADDR_REG(op) (IS_ADDR_REGNO(REGNO(op)))#define IS_INDEX_REG(op) (IS_INDEX_REGNO(REGNO(op)))#define IS_GROUP1_REG(r) (IS_GROUP1_REGNO(REGNO(op)))#define IS_SP_REG(op) (IS_SP_REGNO(REGNO(op)))#define IS_STD_REG(op) (IS_STD_REGNO(REGNO(op)))#define IS_EXT_REG(op) (IS_EXT_REGNO(REGNO(op)))#define IS_R0R1_OR_PSEUDO_REG(op) (IS_R0R1_OR_PSEUDO_REGNO(REGNO(op)))#define IS_R2R3_OR_PSEUDO_REG(op) (IS_R2R3_OR_PSEUDO_REGNO(REGNO(op)))#define IS_EXT_OR_PSEUDO_REG(op) (IS_EXT_OR_PSEUDO_REGNO(REGNO(op)))#define IS_STD_OR_PSEUDO_REG(op) (IS_STD_OR_PSEUDO_REGNO(REGNO(op)))#define IS_EXT_LOW_OR_PSEUDO_REG(op) (IS_EXT_LOW_OR_PSEUDO_REGNO(REGNO(op)))#define IS_INT_OR_PSEUDO_REG(op) (IS_INT_OR_PSEUDO_REGNO(REGNO(op)))#define IS_ADDR_OR_PSEUDO_REG(op) (IS_ADDR_OR_PSEUDO_REGNO(REGNO(op)))#define IS_INDEX_OR_PSEUDO_REG(op) (IS_INDEX_OR_PSEUDO_REGNO(REGNO(op)))#define IS_DP_OR_PSEUDO_REG(op) (IS_DP_OR_PSEUDO_REGNO(REGNO(op)))#define IS_SP_OR_PSEUDO_REG(op) (IS_SP_OR_PSEUDO_REGNO(REGNO(op)))#define IS_ST_OR_PSEUDO_REG(op) (IS_ST_OR_PSEUDO_REGNO(REGNO(op)))#define IS_RC_OR_PSEUDO_REG(op) (IS_RC_OR_PSEUDO_REGNO(REGNO(op)))/* 1 for registers that have pervasive standard uses and are not available for the register allocator. */#define FIXED_REGISTERS \{ \/* R0 R1 R2 R3 R4 R5 R6 R7 AR0 AR1 AR2 AR3 AR4 AR5 AR6 AR7. */ \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \/* DP IR0 IR1 BK SP ST DIE IIE IIF RS RE RC R8 R9 R10 R11. */ \ 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 \}/* 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. Note that the extended precision registers are only saved in some modes. The macro HARD_REGNO_CALL_CLOBBERED specifies which modes get clobbered for a given regno. */#define CALL_USED_REGISTERS \{ \/* R0 R1 R2 R3 R4 R5 R6 R7 AR0 AR1 AR2 AR3 AR4 AR5 AR6 AR7. */ \ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, \/* DP IR0 IR1 BK SP ST DIE IIE IIF RS RE RC R8 R9 R10 R11. */ \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 \}/* Macro to conditionally modify fixed_regs/call_used_regs. */#define CONDITIONAL_REGISTER_USAGE \ { \ if (! TARGET_BK) \ { \ fixed_regs[BK_REGNO] = 1; \ call_used_regs[BK_REGNO] = 1; \ c4x_regclass_map[BK_REGNO] = NO_REGS; \ } \ if (TARGET_C3X) \ { \ int i; \ \ reg_names[DIE_REGNO] = "ie"; /* Clobber die. */ \ reg_names[IF_REGNO] = "if"; /* Clobber iie. */ \ reg_names[IOF_REGNO] = "iof"; /* Clobber iif. */ \ \ for (i = R8_REGNO; i <= R11_REGNO; i++) \ { \ fixed_regs[i] = call_used_regs[i] = 1; \ c4x_regclass_map[i] = NO_REGS; \ } \ } \ if (TARGET_PRESERVE_FLOAT) \ { \ c4x_caller_save_map[R6_REGNO] = HFmode; \ c4x_caller_save_map[R7_REGNO] = HFmode; \ } \ }/* Order of Allocation of Registers. *//* List the order in which to allocate registers. Each register must be listed once, even those in FIXED_REGISTERS. First allocate registers that don't need preservation across calls, except index and address registers. Then allocate data registers that require preservation across calls (even though this invokes an extra overhead of having to save/restore these registers). Next allocate the address and index registers, since using these registers for arithmetic can cause pipeline stalls. Finally allocated the fixed registers which won't be allocated anyhow. */#define REG_ALLOC_ORDER \{R0_REGNO, R1_REGNO, R2_REGNO, R3_REGNO, \ R9_REGNO, R10_REGNO, R11_REGNO, \ RS_REGNO, RE_REGNO, RC_REGNO, BK_REGNO, \ R4_REGNO, R5_REGNO, R6_REGNO, R7_REGNO, R8_REGNO, \ AR0_REGNO, AR1_REGNO, AR2_REGNO, AR3_REGNO, \ AR4_REGNO, AR5_REGNO, AR6_REGNO, AR7_REGNO, \ IR0_REGNO, IR1_REGNO, \ SP_REGNO, DP_REGNO, ST_REGNO, IE_REGNO, IF_REGNO, IOF_REGNO}/* A C expression that is nonzero if hard register number REGNO2 can be considered for use as a rename register for REGNO1 */#define HARD_REGNO_RENAME_OK(REGNO1,REGNO2) \ c4x_hard_regno_rename_ok((REGNO1), (REGNO2))/* Determine which register classes are very likely used by spill registers. local-alloc.c won't allocate pseudos that have these classes as their preferred class unless they are "preferred or nothing". */#define CLASS_LIKELY_SPILLED_P(CLASS) ((CLASS) == INDEX_REGS)/* CCmode is wrongly defined in machmode.def. It should have a size of UNITS_PER_WORD. HFmode is 40-bits and thus fits within a single extended precision register. Similarly, HCmode fits within two extended precision registers. */#define HARD_REGNO_NREGS(REGNO, MODE) \(((MODE) == CCmode || (MODE) == CC_NOOVmode) ? 1 : \ ((MODE) == HFmode) ? 1 : \ ((MODE) == HCmode) ? 2 : \ ((GET_MODE_SIZE(MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))/* A C expression that is nonzero if the hard register REGNO is preserved across a call in mode MODE. This does not have to include the call used registers. */#define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \ ((IS_FLOAT_CALL_SAVED_REGNO (REGNO) && ! ((MODE) == QFmode)) \ || (IS_INT_CALL_SAVED_REGNO (REGNO) \ && ! ((MODE) == QImode || (MODE) == HImode || (MODE) == Pmode)))/* Specify the modes required to caller save a given hard regno. */#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) (c4x_caller_save_map[REGNO])#define HARD_REGNO_MODE_OK(REGNO, MODE) c4x_hard_regno_mode_ok(REGNO, MODE)/* A C expression that is nonzero if it is desirable to choose register allocation so as to avoid move instructions between a value of mode MODE1 and a value of mode MODE2. Value is 1 if it is a good idea to tie two pseudo registers when one has mode MODE1 and one has mode MODE2. If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2, for any hard reg, then this must be 0 for correct output. */#define MODES_TIEABLE_P(MODE1, MODE2) 0/* Define the classes of registers for register constraints in the machine description. Also define ranges of constants. One of the classes must always be named ALL_REGS and include all hard regs. If there is more than one class, another class must be named NO_REGS and contain no registers. The name GENERAL_REGS must be the name of a class (or an alias for another name such as ALL_REGS). This is the class of registers that is allowed by "g" or "r" in a register constraint. Also, registers outside this class are allocated only when instructions express preferences for them. The classes must be numbered in nondecreasing order; that is, a larger-numbered class must never be contained completely in a smaller-numbered class. For any two classes, it is very desirable that there be another class that represents their union. */ enum reg_class { NO_REGS, R0R1_REGS, /* 't'. */ R2R3_REGS, /* 'u'. */ EXT_LOW_REGS, /* 'q'. */ EXT_REGS, /* 'f'. */ ADDR_REGS, /* 'a'. */ INDEX_REGS, /* 'x'. */ BK_REG, /* 'k'. */ SP_REG, /* 'b'. */ RC_REG, /* 'v'. */ COUNTER_REGS, /* */ INT_REGS, /* 'c'. */ GENERAL_REGS, /* 'r'. */ DP_REG, /* 'z'. */ ST_REG, /* 'y'. */ ALL_REGS, LIM_REG_CLASSES };#define N_REG_CLASSES (int) LIM_REG_CLASSES#define REG_CLASS_NAMES \{ \ "NO_REGS", \ "R0R1_REGS", \ "R2R3_REGS", \ "EXT_LOW_REGS", \ "EXT_REGS", \ "ADDR_REGS", \ "INDEX_REGS", \ "BK_REG", \ "SP_REG", \ "RC_REG", \ "COUNTER_REGS", \ "INT_REGS", \ "GENERAL_REGS", \ "DP_REG", \ "ST_REG", \ "ALL_REGS" \}/* Define which registers fit in which classes. This is an initializer for a vector of HARD_REG_SET of length N_REG_CLASSES. RC is not included in GENERAL_REGS since the register allocator will often choose a general register in preference to RC for the decrement_and_branch_on_count pattern. */#define REG_CLASS_CONTENTS \{ \ {0x00000000}, /* No registers. */ \ {0x00000003}, /* 't' R0-R1 . */ \ {0x0000000c}, /* 'u' R2-R3 . */ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -