From 9188b2863c0a2b6c91dbd6e6e373fada6b34f225 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 19 May 2015 07:10:42 +0000 Subject: [PATCH] rtl.h (reg_info): Add an nregs field. 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 | 14 ++++++++++++++ gcc/df-scan.c | 2 +- gcc/emit-rtl.c | 5 ++++- gcc/read-rtl.c | 2 +- gcc/regs.h | 4 ++-- gcc/rtl.h | 19 +++++++++++++------ 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c18b7368da0..92e2bd402f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2015-05-19 Richard Sandiford + + * 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 * rtl.h (PUT_MODE_RAW): New macro. diff --git a/gcc/df-scan.c b/gcc/df-scan.c index 6175fd9f56b..3aec13cdb6a 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -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); } diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 03bd76a206b..9766336fdc8 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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 diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index a1ff48d0667..749efaff8af 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -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; diff --git a/gcc/regs.h b/gcc/regs.h index 1f8f5a788de..a1374d10941 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -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. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index 955ce7d027d..e7d06c2ecdd 100644 --- 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. */ -- 2.30.2