From 031e8857886b91da290ffb03d9027424566e5da3 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 10 Sep 2019 18:56:21 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/c6x/c6x-protos.h | 2 ++ gcc/config/c6x/c6x.c | 22 ++++++++++++++++++++++ gcc/config/c6x/c6x.h | 7 +------ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0ec847ca9d8..56f99f01e29 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-09-10 Richard Sandiford + + * 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 * rtl.h (get_call_rtx_from): Take a const rtx_insn * instead of an rtx. diff --git a/gcc/config/c6x/c6x-protos.h b/gcc/config/c6x/c6x-protos.h index 8c04c315a63..b2043cbe0de 100644 --- a/gcc/config/c6x/c6x-protos.h +++ b/gcc/config/c6x/c6x-protos.h @@ -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); diff --git a/gcc/config/c6x/c6x.c b/gcc/config/c6x/c6x.c index f6a45184bb5..852373bb1de 100644 --- a/gcc/config/c6x/c6x.c +++ b/gcc/config/c6x/c6x.c @@ -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. */ diff --git a/gcc/config/c6x/c6x.h b/gcc/config/c6x/c6x.h index c605b73fe5a..e93a544a9a8 100644 --- a/gcc/config/c6x/c6x.h +++ b/gcc/config/c6x/c6x.h @@ -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 -- 2.30.2