aboutsummaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2018-08-06 09:16:24 +0000
committerAlan Hayward <alahay01@gcc.gnu.org>2018-08-06 09:16:24 +0000
commit14196e023fa2a07f86e864a9492e7cf3950d5ce9 (patch)
treef0d8015e011ea09736010143008d034336aed6e5 /gcc/emit-rtl.c
parent601e86a57f6ec7e9acdfe5767779a3c62735b0e6 (diff)
downloadgcc-14196e023fa2a07f86e864a9492e7cf3950d5ce9.zip
gcc-14196e023fa2a07f86e864a9492e7cf3950d5ce9.tar.gz
gcc-14196e023fa2a07f86e864a9492e7cf3950d5ce9.tar.bz2
Generation support for CLOBBER_HIGH
Ensure clobber high is a register expression. Info is passed through for the error case. gcc/ * emit-rtl.c (verify_rtx_sharing): Check for CLOBBER_HIGH. (copy_insn_1): Likewise. (gen_hard_reg_clobber_high): New gen function. * genconfig.c (walk_insn_part): Check for CLOBBER_HIGH. * genemit.c (gen_exp): Likewise. (gen_emit_seq): Pass through info. (gen_insn): Check for CLOBBER_HIGH. (gen_expand): Pass through info. (gen_split): Likewise. (output_add_clobbers): Likewise. * genrecog.c (validate_pattern): Check for CLOBBER_HIGH. (remove_clobbers): Likewise. * rtl.h (gen_hard_reg_clobber_high): New declaration. From-SVN: r263327
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index e4b0704..dacf27e 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -2865,6 +2865,7 @@ verify_rtx_sharing (rtx orig, rtx insn)
/* SCRATCH must be shared because they represent distinct values. */
return;
case CLOBBER:
+ case CLOBBER_HIGH:
/* Share clobbers of hard registers (like cc0), but do not share pseudo reg
clobbers or clobbers of hard registers that originated as pseudos.
This is needed to allow safe register renaming. */
@@ -3118,6 +3119,7 @@ repeat:
/* SCRATCH must be shared because they represent distinct values. */
return;
case CLOBBER:
+ case CLOBBER_HIGH:
/* Share clobbers of hard registers (like cc0), but do not share pseudo reg
clobbers or clobbers of hard registers that originated as pseudos.
This is needed to allow safe register renaming. */
@@ -5690,6 +5692,7 @@ copy_insn_1 (rtx orig)
case SIMPLE_RETURN:
return orig;
case CLOBBER:
+ case CLOBBER_HIGH:
/* Share clobbers of hard registers (like cc0), but do not share pseudo reg
clobbers or clobbers of hard registers that originated as pseudos.
This is needed to allow safe register renaming. */
@@ -6508,6 +6511,21 @@ gen_hard_reg_clobber (machine_mode mode, unsigned int regno)
gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)));
}
+static GTY((deletable)) rtx
+hard_reg_clobbers_high[NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
+
+/* Return a CLOBBER_HIGH expression for register REGNO that clobbers MODE,
+ caching into HARD_REG_CLOBBERS_HIGH. */
+rtx
+gen_hard_reg_clobber_high (machine_mode mode, unsigned int regno)
+{
+ if (hard_reg_clobbers_high[mode][regno])
+ return hard_reg_clobbers_high[mode][regno];
+ else
+ return (hard_reg_clobbers_high[mode][regno]
+ = gen_rtx_CLOBBER_HIGH (VOIDmode, gen_rtx_REG (mode, regno)));
+}
+
location_t prologue_location;
location_t epilogue_location;