rtl.h (reg_info): Add an nregs field.
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 19 May 2015 07:10:42 +0000 (07:10 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 19 May 2015 07:10:42 +0000 (07:10 +0000)
gcc/
* rtl.h (reg_info): Add an nregs field.
(REG_NREGS): Use it.
(SET_REGNO_RAW): Delete.
(set_regno_raw): New function.
* regs.h (END_HARD_REGNO): Make equivalent to END_REGNO.
(END_REGNO): Redefine in terms of REG_NREGS.
* read-rtl.c (read_rtx_code): Call set_regno_raw instead of
SET_REGNO_RAW.
* emit-rtl.c (set_mode_and_regno): Likewise.
* df-scan.c (df_ref_change_reg_with_loc): Use set_mode_and_regno
instead of SET_REGNO_RAW.

From-SVN: r223342

gcc/ChangeLog
gcc/df-scan.c
gcc/emit-rtl.c
gcc/read-rtl.c
gcc/regs.h
gcc/rtl.h

index c18b7368da0adfad2f6fd8aaefba381f012c1e7b..92e2bd402f52ab0d2f3e145066a99222d0e56ae9 100644 (file)
@@ -1,3 +1,17 @@
+2015-05-19  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * rtl.h (reg_info): Add an nregs field.
+       (REG_NREGS): Use it.
+       (SET_REGNO_RAW): Delete.
+       (set_regno_raw): New function.
+       * regs.h (END_HARD_REGNO): Make equivalent to END_REGNO.
+       (END_REGNO): Redefine in terms of REG_NREGS.
+       * read-rtl.c (read_rtx_code): Call set_regno_raw instead of
+       SET_REGNO_RAW.
+       * emit-rtl.c (set_mode_and_regno): Likewise.
+       * df-scan.c (df_ref_change_reg_with_loc): Use set_mode_and_regno
+       instead of SET_REGNO_RAW.
+
 2015-05-19  Richard Sandiford  <richard.sandiford@arm.com>
 
        * rtl.h (PUT_MODE_RAW): New macro.
index 6175fd9f56b8e99a85b1744c703d92f4e750d247..3aec13cdb6ad8714d6e5b244581df06d9def2afb 100644 (file)
@@ -1930,7 +1930,7 @@ df_ref_change_reg_with_loc (rtx loc, unsigned int new_regno)
                                    DF_REG_EQ_USE_GET (new_regno),
                                    new_regno, loc);
     }
-  SET_REGNO_RAW (loc, new_regno);
+  set_mode_and_regno (loc, GET_MODE (loc), new_regno);
 }
 
 
index 03bd76a206b107f7769c8210d6d75a940c962e98..9766336fdc83feb9179b5a3a2abdd38c2fa82913 100644 (file)
@@ -435,8 +435,11 @@ gen_blockage (void)
 void
 set_mode_and_regno (rtx x, machine_mode mode, unsigned int regno)
 {
+  unsigned int nregs = (HARD_REGISTER_NUM_P (regno)
+                       ? hard_regno_nregs[regno][mode]
+                       : 1);
   PUT_MODE_RAW (x, mode);
-  SET_REGNO_RAW (x, regno);
+  set_regno_raw (x, regno, nregs);
 }
 
 /* Generate a new REG rtx.  Make sure ORIGINAL_REGNO is set properly, and
index a1ff48d06678179aa3ffd567e7efe9e0234ae24d..749efaff8af4691a0ec3a9b4be4cf16ffd3b0b10 100644 (file)
@@ -1349,7 +1349,7 @@ read_rtx_code (const char *code_name)
       case 'r':
        read_name (&name);
        validate_const_int (name.string);
-       SET_REGNO_RAW (return_rtx, atoi (name.string));
+       set_regno_raw (return_rtx, atoi (name.string), 1);
        REG_ATTRS (return_rtx) = NULL;
        break;
 
index 1f8f5a788de9f17fc8702bab3b8f9047638e8eed..a1374d10941ad3e86bd23747862527bfd2a633f6 100644 (file)
@@ -288,11 +288,11 @@ end_hard_regno (machine_mode mode, unsigned int regno)
 
 /* Likewise for hard register X.  */
 
-#define END_HARD_REGNO(X) end_hard_regno (GET_MODE (X), REGNO (X))
+#define END_HARD_REGNO(X) END_REGNO (X)
 
 /* Likewise for hard or pseudo register X.  */
 
-#define END_REGNO(X) (HARD_REGISTER_P (X) ? END_HARD_REGNO (X) : REGNO (X) + 1)
+#define END_REGNO(X) (REGNO (X) + REG_NREGS (X))
 
 /* Add to REGS all the registers required to store a value of mode MODE
    in register REGNO.  */
index 955ce7d027dbd96531d9d731c96bfa588b0647ef..e7d06c2ecdd7e771250695ba99a6fbee29c4dfec 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -210,7 +210,9 @@ struct GTY(()) reg_info {
   /* The value of REGNO.  */
   unsigned int regno;
 
-  unsigned int unused : 32;
+  /* The value of REG_NREGS.  */
+  unsigned int nregs : 8;
+  unsigned int unused : 24;
 
   /* The value of REG_ATTRS.  */
   reg_attrs *attrs;
@@ -1712,15 +1714,11 @@ inline rtx_insn *JUMP_LABEL_AS_INSN (const rtx_insn *insn)
    be used on RHS.  Use SET_REGNO to change the value.  */
 #define REGNO(RTX) (rhs_regno(RTX))
 #define SET_REGNO(RTX, N) (df_ref_change_reg_with_loc (RTX, N))
-#define SET_REGNO_RAW(RTX, N) (REG_CHECK (RTX)->regno = N)
 
 /* Return the number of consecutive registers in a REG.  This is always
    1 for pseudo registers and is determined by HARD_REGNO_NREGS for
    hard registers.  */
-#define REG_NREGS(RTX) \
-  (REGNO (RTX) < FIRST_PSEUDO_REGISTER \
-   ? (unsigned int) hard_regno_nregs[REGNO (RTX)][GET_MODE (RTX)] \
-   : 1)
+#define REG_NREGS(RTX) (REG_CHECK (RTX)->nregs)
 
 /* ORIGINAL_REGNO holds the number the register originally had; for a
    pseudo register turned into a hard reg this will hold the old pseudo
@@ -1735,6 +1733,15 @@ rhs_regno (const_rtx x)
   return REG_CHECK (x)->regno;
 }
 
+/* Change the REGNO and REG_NREGS of REG X to the specified values,
+   bypassing the df machinery.  */
+static inline void
+set_regno_raw (rtx x, unsigned int regno, unsigned int nregs)
+{
+  reg_info *reg = REG_CHECK (x);
+  reg->regno = regno;
+  reg->nregs = nregs;
+}
 
 /* 1 if RTX is a reg or parallel that is the current function's return
    value.  */