diff mbox series

rs6000: Use parameterized names for tablejump

Message ID 941ee8810aea281a10858ed830c24812e7216c16.1601423618.git.segher@kernel.crashing.org
State New
Headers show
Series rs6000: Use parameterized names for tablejump | expand

Commit Message

Segher Boessenkool Sept. 30, 2020, 12:04 a.m. UTC
We have too many tablejump patterns.  Using parameterized names
simplifies the code a bit.

Tested on powerpc64-linux {-m32,-m64}.  Committing.


Segher


2020-09-29  Segher Boessenkool  <segher@kernel.crashing.org>

	* config/rs6000/rs6000.md (tablejump): Simplify.
	(tablejumpsi): Merge this ...
	(tablejumpdi): ... and this ...
	(@tablejump<mode>_normal): ... into this.
	(tablejumpsi_nospec): Merge this ...
	(tablejumpdi_nospec): ... and this ...
	(@tablejump<mode>_nospec): ... into this.
	(*tablejump<mode>_internal1): Delete, rename to ...
	(@tablejump<mode>_insn_normal): ... this.
	(*tablejump<mode>_internal1_nospec): Delete, rename to ...
	(@tablejump<mode>_insn_nospec): ... this.

---
 gcc/config/rs6000/rs6000.md | 105 ++++++++++++++++++--------------------------
 1 file changed, 43 insertions(+), 62 deletions(-)

Comments

Alan Modra Sept. 30, 2020, 4:01 a.m. UTC | #1
On Wed, Sep 30, 2020 at 12:04:25AM +0000, Segher Boessenkool wrote:
> 	* config/rs6000/rs6000.md (tablejump): Simplify.
> 	(tablejumpsi): Merge this ...
> 	(tablejumpdi): ... and this ...
> 	(@tablejump<mode>_normal): ... into this.
> 	(tablejumpsi_nospec): Merge this ...
> 	(tablejumpdi_nospec): ... and this ...
> 	(@tablejump<mode>_nospec): ... into this.
> 	(*tablejump<mode>_internal1): Delete, rename to ...
> 	(@tablejump<mode>_insn_normal): ... this.
> 	(*tablejump<mode>_internal1_nospec): Delete, rename to ...
> 	(@tablejump<mode>_insn_nospec): ... this.

decQuad.o] Error 1
*** stack smashing detected ***: terminated
during RTL pass: expand

I'll commit this as obvious after my regstraps finish.

	* config/rs6000/rs6000.md (@tablejump<mode>_normal): Don't use
	non-existent operands[].
	(@tablejump<mode>_nospec): Likewise.

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 24ad80993ad..779bfd11237 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -12716,21 +12716,22 @@
    (use (match_operand:P 1))]
   "rs6000_speculate_indirect_jumps"
 {
+  rtx off;
   operands[0] = force_reg (SImode, operands[0]);
   if (<MODE>mode == SImode)
-    operands[4] = operands[0];
+    off = operands[0];
   else
     {
-      operands[4] = gen_reg_rtx (Pmode);
+      off = gen_reg_rtx (Pmode);
       rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
-      emit_move_insn (operands[4], src);
+      emit_move_insn (off, src);
     }
 
-  operands[2] = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
-  operands[3] = gen_reg_rtx (Pmode);
+  rtx lab = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
+  rtx addr = gen_reg_rtx (Pmode);
 
-  emit_insn (gen_add<mode>3 (operands[3], operands[4], operands[2]));
-  emit_jump_insn (gen_tablejump_insn_normal (Pmode, operands[3], operands[1]));
+  emit_insn (gen_add<mode>3 (addr, off, lab));
+  emit_jump_insn (gen_tablejump_insn_normal (Pmode, addr, operands[1]));
   DONE;
 })
 
@@ -12740,21 +12741,22 @@
    (use (match_operand:CC 2))]
   "!rs6000_speculate_indirect_jumps"
 {
+  rtx off;
   operands[0] = force_reg (SImode, operands[0]);
   if (<MODE>mode == SImode)
-    operands[4] = operands[0];
+    off = operands[0];
   else
     {
-      operands[4] = gen_reg_rtx (Pmode);
+      off = gen_reg_rtx (Pmode);
       rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
-      emit_move_insn (operands[4], src);
+      emit_move_insn (off, src);
     }
 
-  operands[5] = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
-  operands[3] = gen_reg_rtx (Pmode);
+  rtx lab = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
+  rtx addr = gen_reg_rtx (Pmode);
 
-  emit_insn (gen_add<mode>3 (operands[3], operands[4], operands[5]));
-  emit_jump_insn (gen_tablejump_insn_nospec (Pmode, operands[3], operands[1],
+  emit_insn (gen_add<mode>3 (addr, off, lab));
+  emit_jump_insn (gen_tablejump_insn_nospec (Pmode, addr, operands[1],
 					     operands[2]));
   DONE;
 })
diff mbox series

Patch

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 694ff70..24ad809 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -12697,12 +12697,7 @@  (define_expand "tablejump"
   ""
 {
   if (rs6000_speculate_indirect_jumps)
-    {
-      if (TARGET_32BIT)
-      	emit_jump_insn (gen_tablejumpsi (operands[0], operands[1]));
-      else
-	emit_jump_insn (gen_tablejumpdi (operands[0], operands[1]));
-    }
+    emit_jump_insn (gen_tablejump_normal (Pmode, operands[0], operands[1]));
   else
     {
       rtx ccreg = gen_reg_rtx (CCmode);
@@ -12716,69 +12711,55 @@  (define_expand "tablejump"
   DONE;
 })
 
-(define_expand "tablejumpsi"
-  [(set (match_dup 3)
-	(plus:SI (match_operand:SI 0)
-		 (match_dup 2)))
-   (parallel [(set (pc)
-		   (match_dup 3))
-	      (use (label_ref (match_operand 1)))])]
-  "TARGET_32BIT && rs6000_speculate_indirect_jumps"
+(define_expand "@tablejump<mode>_normal"
+  [(use (match_operand:SI 0))
+   (use (match_operand:P 1))]
+  "rs6000_speculate_indirect_jumps"
 {
   operands[0] = force_reg (SImode, operands[0]);
-  operands[2] = force_reg (SImode, gen_rtx_LABEL_REF (SImode, operands[1]));
-  operands[3] = gen_reg_rtx (SImode);
+  if (<MODE>mode == SImode)
+    operands[4] = operands[0];
+  else
+    {
+      operands[4] = gen_reg_rtx (Pmode);
+      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
+      emit_move_insn (operands[4], src);
+    }
+
+  operands[2] = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
+  operands[3] = gen_reg_rtx (Pmode);
+
+  emit_insn (gen_add<mode>3 (operands[3], operands[4], operands[2]));
+  emit_jump_insn (gen_tablejump_insn_normal (Pmode, operands[3], operands[1]));
+  DONE;
 })
 
-(define_expand "tablejumpsi_nospec"
-  [(set (match_dup 4)
-	(plus:SI (match_operand:SI 0)
-		 (match_dup 3)))
-   (parallel [(set (pc)
-		   (match_dup 4))
-	      (use (label_ref (match_operand 1)))
-	      (clobber (match_operand 2))])]
-  "TARGET_32BIT && !rs6000_speculate_indirect_jumps"
+(define_expand "@tablejump<mode>_nospec"
+  [(use (match_operand:SI 0))
+   (use (match_operand:P 1))
+   (use (match_operand:CC 2))]
+  "!rs6000_speculate_indirect_jumps"
 {
   operands[0] = force_reg (SImode, operands[0]);
-  operands[3] = force_reg (SImode, gen_rtx_LABEL_REF (SImode, operands[1]));
-  operands[4] = gen_reg_rtx (SImode);
+  if (<MODE>mode == SImode)
+    operands[4] = operands[0];
+  else
+    {
+      operands[4] = gen_reg_rtx (Pmode);
+      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
+      emit_move_insn (operands[4], src);
+    }
+
+  operands[5] = force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, operands[1]));
+  operands[3] = gen_reg_rtx (Pmode);
+
+  emit_insn (gen_add<mode>3 (operands[3], operands[4], operands[5]));
+  emit_jump_insn (gen_tablejump_insn_nospec (Pmode, operands[3], operands[1],
+					     operands[2]));
+  DONE;
 })
 
-(define_expand "tablejumpdi"
-  [(set (match_dup 4)
-        (sign_extend:DI (match_operand:SI 0 "lwa_operand")))
-   (set (match_dup 3)
-	(plus:DI (match_dup 4)
-		 (match_dup 2)))
-   (parallel [(set (pc)
-		   (match_dup 3))
-	      (use (label_ref (match_operand 1)))])]
-  "TARGET_64BIT && rs6000_speculate_indirect_jumps"
-{
-  operands[2] = force_reg (DImode, gen_rtx_LABEL_REF (DImode, operands[1]));
-  operands[3] = gen_reg_rtx (DImode);
-  operands[4] = gen_reg_rtx (DImode);
-})
-
-(define_expand "tablejumpdi_nospec"
-  [(set (match_dup 5)
-        (sign_extend:DI (match_operand:SI 0 "lwa_operand")))
-   (set (match_dup 4)
-	(plus:DI (match_dup 5)
-		 (match_dup 3)))
-   (parallel [(set (pc)
-		   (match_dup 4))
-	      (use (label_ref (match_operand 1)))
-	      (clobber (match_operand 2))])]
-  "TARGET_64BIT && !rs6000_speculate_indirect_jumps"
-{
-  operands[3] = force_reg (DImode, gen_rtx_LABEL_REF (DImode, operands[1]));
-  operands[4] = gen_reg_rtx (DImode);
-  operands[5] = gen_reg_rtx (DImode);
-})
-
-(define_insn "*tablejump<mode>_internal1"
+(define_insn "@tablejump<mode>_insn_normal"
   [(set (pc)
 	(match_operand:P 0 "register_operand" "c,*l"))
    (use (label_ref (match_operand 1)))]
@@ -12786,7 +12767,7 @@  (define_insn "*tablejump<mode>_internal1"
   "b%T0"
   [(set_attr "type" "jmpreg")])
 
-(define_insn "*tablejump<mode>_internal1_nospec"
+(define_insn "@tablejump<mode>_insn_nospec"
   [(set (pc)
 	(match_operand:P 0 "register_operand" "c,*l"))
    (use (label_ref (match_operand 1)))