Move c6x REGNO_REG_CLASS out of line
I have a series of patches that hides call_used_regs from target- independent code, a knock-on effect of which is that (public) target macros can't use call_used_regs either. This patch fixes the only case in which that was a problem. 2019-09-10 Richard Sandiford <richard.sandiford@arm.com> gcc/ * config/c6x/c6x-protos.h (c6x_set_return_address): Declare. * config/c6x/c6x.h (REGNO_REG_CLASS): Move implementation to * config/c6x/c6x.c (c6x_regno_reg_class): ...this new function. From-SVN: r275597
This commit is contained in:
parent
0f8b14ee8a
commit
031e885788
4 changed files with 31 additions and 6 deletions
|
@ -1,3 +1,9 @@
|
|||
2019-09-10 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* config/c6x/c6x-protos.h (c6x_set_return_address): Declare.
|
||||
* config/c6x/c6x.h (REGNO_REG_CLASS): Move implementation to
|
||||
* config/c6x/c6x.c (c6x_regno_reg_class): ...this new function.
|
||||
|
||||
2019-09-10 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
* rtl.h (get_call_rtx_from): Take a const rtx_insn * instead of an rtx.
|
||||
|
|
|
@ -53,6 +53,8 @@ extern void c6x_expand_epilogue (bool);
|
|||
extern rtx c6x_return_addr_rtx (int);
|
||||
|
||||
extern void c6x_set_return_address (rtx, rtx);
|
||||
|
||||
enum reg_class c6x_regno_reg_class (int);
|
||||
#endif
|
||||
|
||||
extern void c6x_override_options (void);
|
||||
|
|
|
@ -6677,6 +6677,28 @@ c6x_modes_tieable_p (machine_mode mode1, machine_mode mode2)
|
|||
&& GET_MODE_SIZE (mode2) <= UNITS_PER_WORD));
|
||||
}
|
||||
|
||||
/* Implement REGNO_REG_CLASS. */
|
||||
|
||||
enum reg_class
|
||||
c6x_regno_reg_class (int reg)
|
||||
{
|
||||
if (reg >= REG_A1 && reg <= REG_A2)
|
||||
return PREDICATE_A_REGS;
|
||||
|
||||
if (reg == REG_A0 && TARGET_INSNS_64)
|
||||
return PREDICATE_A_REGS;
|
||||
|
||||
if (reg >= REG_B0 && reg <= REG_B2)
|
||||
return PREDICATE_B_REGS;
|
||||
|
||||
if (A_REGNO_P (reg))
|
||||
return NONPREDICATE_A_REGS;
|
||||
|
||||
if (call_used_regs[reg])
|
||||
return CALL_USED_B_REGS;
|
||||
|
||||
return B_REGS;
|
||||
}
|
||||
|
||||
/* Target Structure. */
|
||||
|
||||
|
|
|
@ -259,12 +259,7 @@ enum reg_class
|
|||
#define CROSS_OPERANDS(X0,X1) \
|
||||
(A_REG_P (X0) == A_REG_P (X1) ? CROSS_N : CROSS_Y)
|
||||
|
||||
#define REGNO_REG_CLASS(reg) \
|
||||
((reg) >= REG_A1 && (reg) <= REG_A2 ? PREDICATE_A_REGS \
|
||||
: (reg) == REG_A0 && TARGET_INSNS_64 ? PREDICATE_A_REGS \
|
||||
: (reg) >= REG_B0 && (reg) <= REG_B2 ? PREDICATE_B_REGS \
|
||||
: A_REGNO_P (reg) ? NONPREDICATE_A_REGS \
|
||||
: call_used_regs[reg] ? CALL_USED_B_REGS : B_REGS)
|
||||
#define REGNO_REG_CLASS(reg) c6x_regno_reg_class (reg)
|
||||
|
||||
#define BASE_REG_CLASS ALL_REGS
|
||||
#define INDEX_REG_CLASS ALL_REGS
|
||||
|
|
Loading…
Add table
Reference in a new issue