📄 ia64.h
字号:
expression returns the register number as seen by the called function corresponding to the register number OUT as seen by the calling function. Return OUT if register number OUT is not an outbound register. */#define INCOMING_REGNO(OUT) \ ((unsigned) ((OUT) - OUT_REG (0)) < 8 ? IN_REG ((OUT) - OUT_REG (0)) : (OUT))/* Define this macro if the target machine has register windows. This C expression returns the register number as seen by the calling function corresponding to the register number IN as seen by the called function. Return IN if register number IN is not an inbound register. */#define OUTGOING_REGNO(IN) \ ((unsigned) ((IN) - IN_REG (0)) < 8 ? OUT_REG ((IN) - IN_REG (0)) : (IN))/* Define this macro if the target machine has register windows. This C expression returns true if the register is call-saved but is in the register window. */#define LOCAL_REGNO(REGNO) \ (IN_REGNO_P (REGNO) || LOC_REGNO_P (REGNO))/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE, return the mode to be used for the comparison. Must be defined if EXTRA_CC_MODES is defined. */#define SELECT_CC_MODE(OP,X,Y) CCmode/* Order of allocation of registers *//* If defined, an initializer for a vector of integers, containing the numbers of hard registers in the order in which GCC should prefer to use them (from most preferred to least). If this macro is not defined, registers are used lowest numbered first (all else being equal). One use of this macro is on machines where the highest numbered registers must always be saved and the save-multiple-registers instruction supports only sequences of consecutive registers. On such machines, define `REG_ALLOC_ORDER' to be an initializer that lists the highest numbered allocatable register first. *//* ??? Should the GR return value registers come before or after the rest of the caller-save GRs? */#define REG_ALLOC_ORDER \{ \ /* Caller-saved general registers. */ \ R_GR (14), R_GR (15), R_GR (16), R_GR (17), \ R_GR (18), R_GR (19), R_GR (20), R_GR (21), R_GR (22), R_GR (23), \ R_GR (24), R_GR (25), R_GR (26), R_GR (27), R_GR (28), R_GR (29), \ R_GR (30), R_GR (31), \ /* Output registers. */ \ R_GR (120), R_GR (121), R_GR (122), R_GR (123), R_GR (124), R_GR (125), \ R_GR (126), R_GR (127), \ /* Caller-saved general registers, also used for return values. */ \ R_GR (8), R_GR (9), R_GR (10), R_GR (11), \ /* addl caller-saved general registers. */ \ R_GR (2), R_GR (3), \ /* Caller-saved FP registers. */ \ R_FR (6), R_FR (7), \ /* Caller-saved FP registers, used for parameters and return values. */ \ R_FR (8), R_FR (9), R_FR (10), R_FR (11), \ R_FR (12), R_FR (13), R_FR (14), R_FR (15), \ /* Rotating caller-saved FP registers. */ \ R_FR (32), R_FR (33), R_FR (34), R_FR (35), \ R_FR (36), R_FR (37), R_FR (38), R_FR (39), R_FR (40), R_FR (41), \ R_FR (42), R_FR (43), R_FR (44), R_FR (45), R_FR (46), R_FR (47), \ R_FR (48), R_FR (49), R_FR (50), R_FR (51), R_FR (52), R_FR (53), \ R_FR (54), R_FR (55), R_FR (56), R_FR (57), R_FR (58), R_FR (59), \ R_FR (60), R_FR (61), R_FR (62), R_FR (63), R_FR (64), R_FR (65), \ R_FR (66), R_FR (67), R_FR (68), R_FR (69), R_FR (70), R_FR (71), \ R_FR (72), R_FR (73), R_FR (74), R_FR (75), R_FR (76), R_FR (77), \ R_FR (78), R_FR (79), R_FR (80), R_FR (81), R_FR (82), R_FR (83), \ R_FR (84), R_FR (85), R_FR (86), R_FR (87), R_FR (88), R_FR (89), \ R_FR (90), R_FR (91), R_FR (92), R_FR (93), R_FR (94), R_FR (95), \ R_FR (96), R_FR (97), R_FR (98), R_FR (99), R_FR (100), R_FR (101), \ R_FR (102), R_FR (103), R_FR (104), R_FR (105), R_FR (106), R_FR (107), \ R_FR (108), R_FR (109), R_FR (110), R_FR (111), R_FR (112), R_FR (113), \ R_FR (114), R_FR (115), R_FR (116), R_FR (117), R_FR (118), R_FR (119), \ R_FR (120), R_FR (121), R_FR (122), R_FR (123), R_FR (124), R_FR (125), \ R_FR (126), R_FR (127), \ /* Caller-saved predicate registers. */ \ R_PR (6), R_PR (7), R_PR (8), R_PR (9), R_PR (10), R_PR (11), \ R_PR (12), R_PR (13), R_PR (14), R_PR (15), \ /* Rotating caller-saved predicate registers. */ \ R_PR (16), R_PR (17), \ R_PR (18), R_PR (19), R_PR (20), R_PR (21), R_PR (22), R_PR (23), \ R_PR (24), R_PR (25), R_PR (26), R_PR (27), R_PR (28), R_PR (29), \ R_PR (30), R_PR (31), R_PR (32), R_PR (33), R_PR (34), R_PR (35), \ R_PR (36), R_PR (37), R_PR (38), R_PR (39), R_PR (40), R_PR (41), \ R_PR (42), R_PR (43), R_PR (44), R_PR (45), R_PR (46), R_PR (47), \ R_PR (48), R_PR (49), R_PR (50), R_PR (51), R_PR (52), R_PR (53), \ R_PR (54), R_PR (55), R_PR (56), R_PR (57), R_PR (58), R_PR (59), \ R_PR (60), R_PR (61), R_PR (62), R_PR (63), \ /* Caller-saved branch registers. */ \ R_BR (6), R_BR (7), \ \ /* Stacked callee-saved general registers. */ \ R_GR (32), R_GR (33), R_GR (34), R_GR (35), \ R_GR (36), R_GR (37), R_GR (38), R_GR (39), R_GR (40), R_GR (41), \ R_GR (42), R_GR (43), R_GR (44), R_GR (45), R_GR (46), R_GR (47), \ R_GR (48), R_GR (49), R_GR (50), R_GR (51), R_GR (52), R_GR (53), \ R_GR (54), R_GR (55), R_GR (56), R_GR (57), R_GR (58), R_GR (59), \ R_GR (60), R_GR (61), R_GR (62), R_GR (63), R_GR (64), R_GR (65), \ R_GR (66), R_GR (67), R_GR (68), R_GR (69), R_GR (70), R_GR (71), \ R_GR (72), R_GR (73), R_GR (74), R_GR (75), R_GR (76), R_GR (77), \ R_GR (78), R_GR (79), R_GR (80), R_GR (81), R_GR (82), R_GR (83), \ R_GR (84), R_GR (85), R_GR (86), R_GR (87), R_GR (88), R_GR (89), \ R_GR (90), R_GR (91), R_GR (92), R_GR (93), R_GR (94), R_GR (95), \ R_GR (96), R_GR (97), R_GR (98), R_GR (99), R_GR (100), R_GR (101), \ R_GR (102), R_GR (103), R_GR (104), R_GR (105), R_GR (106), R_GR (107), \ R_GR (108), \ /* Input registers. */ \ R_GR (112), R_GR (113), R_GR (114), R_GR (115), R_GR (116), R_GR (117), \ R_GR (118), R_GR (119), \ /* Callee-saved general registers. */ \ R_GR (4), R_GR (5), R_GR (6), R_GR (7), \ /* Callee-saved FP registers. */ \ R_FR (2), R_FR (3), R_FR (4), R_FR (5), R_FR (16), R_FR (17), \ R_FR (18), R_FR (19), R_FR (20), R_FR (21), R_FR (22), R_FR (23), \ R_FR (24), R_FR (25), R_FR (26), R_FR (27), R_FR (28), R_FR (29), \ R_FR (30), R_FR (31), \ /* Callee-saved predicate registers. */ \ R_PR (1), R_PR (2), R_PR (3), R_PR (4), R_PR (5), \ /* Callee-saved branch registers. */ \ R_BR (1), R_BR (2), R_BR (3), R_BR (4), R_BR (5), \ \ /* ??? Stacked registers reserved for fp, rp, and ar.pfs. */ \ R_GR (109), R_GR (110), R_GR (111), \ \ /* Special general registers. */ \ R_GR (0), R_GR (1), R_GR (12), R_GR (13), \ /* Special FP registers. */ \ R_FR (0), R_FR (1), \ /* Special predicate registers. */ \ R_PR (0), \ /* Special branch registers. */ \ R_BR (0), \ /* Other fixed registers. */ \ FRAME_POINTER_REGNUM, \ AR_CCV_REGNUM, AR_UNAT_REGNUM, AR_PFS_REGNUM, AR_LC_REGNUM, \ AR_EC_REGNUM \}/* How Values Fit in Registers *//* A C expression for the number of consecutive hard registers, starting at register number REGNO, required to hold a value of mode MODE. *//* ??? We say that BImode PR values require two registers. This allows us to easily store the normal and inverted values. We use CCImode to indicate a single predicate register. */#define HARD_REGNO_NREGS(REGNO, MODE) \ ((REGNO) == PR_REG (0) && (MODE) == DImode ? 64 \ : PR_REGNO_P (REGNO) && (MODE) == BImode ? 2 \ : PR_REGNO_P (REGNO) && (MODE) == CCImode ? 1 \ : FR_REGNO_P (REGNO) && (MODE) == XFmode ? 1 \ : FR_REGNO_P (REGNO) && (MODE) == XCmode ? 2 \ : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)/* A C expression that is nonzero if it is permissible to store a value of mode MODE in hard register number REGNO (or in several registers starting with that one). */#define HARD_REGNO_MODE_OK(REGNO, MODE) \ (FR_REGNO_P (REGNO) ? \ GET_MODE_CLASS (MODE) != MODE_CC && \ (MODE) != TImode && \ (MODE) != BImode && \ (MODE) != TFmode \ : PR_REGNO_P (REGNO) ? \ (MODE) == BImode || GET_MODE_CLASS (MODE) == MODE_CC \ : GR_REGNO_P (REGNO) ? \ (MODE) != CCImode && (MODE) != XFmode && (MODE) != XCmode \ : AR_REGNO_P (REGNO) ? (MODE) == DImode \ : BR_REGNO_P (REGNO) ? (MODE) == DImode \ : 0)/* 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. If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, MODE2)' are ever different for any R, then `MODES_TIEABLE_P (MODE1, MODE2)' must be zero. *//* Don't tie integer and FP modes, as that causes us to get integer registers allocated for FP instructions. XFmode only supported in FP registers so we can't tie it with any other modes. */#define MODES_TIEABLE_P(MODE1, MODE2) \ (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2) \ && ((((MODE1) == XFmode) || ((MODE1) == XCmode)) \ == (((MODE2) == XFmode) || ((MODE2) == XCmode))) \ && (((MODE1) == BImode) == ((MODE2) == BImode)))/* Specify the modes required to caller save a given hard regno. We need to ensure floating pt regs are not saved as DImode. */#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ ((FR_REGNO_P (REGNO) && (NREGS) == 1) ? XFmode \ : choose_hard_reg_mode ((REGNO), (NREGS), false))/* Handling Leaf Functions *//* A C initializer for a vector, indexed by hard register number, which contains 1 for a register that is allowable in a candidate for leaf function treatment. *//* ??? This might be useful. *//* #define LEAF_REGISTERS *//* A C expression whose value is the register number to which REGNO should be renumbered, when a function is treated as a leaf function. *//* ??? This might be useful. *//* #define LEAF_REG_REMAP(REGNO) *//* Register Classes *//* An enumeral type that must be defined with all the register class names as enumeral values. `NO_REGS' must be first. `ALL_REGS' must be the last register class, followed by one more enumeral value, `LIM_REG_CLASSES', which is not a register class but rather tells how many classes there are. *//* ??? When compiling without optimization, it is possible for the only use of a pseudo to be a parameter load from the stack with a REG_EQUIV note. Regclass handles this case specially and does not assign any costs to the pseudo. The pseudo then ends up using the last class before ALL_REGS. Thus we must not let either PR_REGS or BR_REGS be the last class. The testcase for this is gcc.c-torture/execute/va-arg-7.c. */enum reg_class{ NO_REGS, PR_REGS, BR_REGS, AR_M_REGS, AR_I_REGS, ADDL_REGS, GR_REGS, FR_REGS, GR_AND_BR_REGS, GR_AND_FR_REGS, ALL_REGS, LIM_REG_CLASSES};#define GENERAL_REGS GR_REGS/* The number of distinct register classes. */#define N_REG_CLASSES ((int) LIM_REG_CLASSES)/* An initializer containing the names of the register classes as C string constants. These names are used in writing some of the debugging dumps. */#define REG_CLASS_NAMES \{ "NO_REGS", "PR_REGS", "BR_REGS", "AR_M_REGS", "AR_I_REGS", \ "ADDL_REGS", "GR_REGS", "FR_REGS", \ "GR_AND_BR_REGS", "GR_AND_FR_REGS", "ALL_REGS" }/* An initializer containing the contents of the register classes, as integers which are bit masks. The Nth integer specifies the contents of class N. The way the integer MASK is interpreted is that register R is in the class if `MASK & (1 << R)' is 1. */#define REG_CLASS_CONTENTS \{ \ /* NO_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x0000 }, \ /* PR_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000 }, \ /* BR_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00FF }, \ /* AR_M_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x0600 }, \ /* AR_I_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x3800 }, \ /* ADDL_REGS. */ \ { 0x0000000F, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x0000 }, \ /* GR_REGS. */ \ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x0100 }, \ /* FR_REGS. */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0x00000000, 0x00000000, 0x0000 }, \ /* GR_AND_BR_REGS. */ \ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ 0x00000000, 0x00000000, 0x01FF }, \ /* GR_AND_FR_REGS. */ \ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0x00000000, 0x00000000, 0x0100 }, \ /* ALL_REGS. */ \ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFF }, \}/* A C expression whose value is a register class containing hard register REGNO. In general there is more than one such class; choose a class which is "minimal", meaning that no smaller class also contains the register. *//* The NO_REGS case is primarily for the benefit of rws_access_reg, which may call here with private (invalid) register numbers, such as REG_VOLATILE. */#define REGNO_REG_CLASS(REGNO) \(ADDL_REGNO_P (REGNO) ? ADDL_REGS \ : GENERAL_REGNO_P (REGNO) ? GR_REGS \ : FR_REGNO_P (REGNO) ? FR_REGS \ : PR_REGNO_P (REGNO) ? PR_REGS \ : BR_REGNO_P (REGNO) ? BR_REGS \ : AR_M_REGNO_P (REGNO) ? AR_M_REGS \ : AR_I_REGNO_P (REGNO) ? AR_I_REGS \ : NO_REGS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -