Move c6x REGNO_REG_CLASS out of line
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 10 Sep 2019 18:56:21 +0000 (18:56 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 10 Sep 2019 18:56:21 +0000 (18:56 +0000)
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

gcc/ChangeLog
gcc/config/c6x/c6x-protos.h
gcc/config/c6x/c6x.c
gcc/config/c6x/c6x.h

index 0ec847ca9d8db2071df2173472bf84bf85d8e2db..56f99f01e2930a456f42f2abd13903efdd7c342a 100644 (file)
@@ -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.
index 8c04c315a635d674bb1e89f057146093157f11be..b2043cbe0deb29a819fc295febb6d33c4180f482 100644 (file)
@@ -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);
index f6a45184bb51ad024c54dea0d7d43a09f4bf96ce..852373bb1dedd457ea6d984c1a13edc5e114fcc3 100644 (file)
@@ -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;
+}
 \f
 /* Target Structure.  */
 
index c605b73fe5a264db533c53940bcbd1c5ba2a5114..e93a544a9a854d98d9d751c97096fca54548d248 100644 (file)
@@ -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