[PATCH] rs6000: Remove integer abs/nabs/min/max patterns

Segher Boessenkool segher@kernel.crashing.org
Tue Sep 18 17:03:00 GMT 2012


Without these patterns, the exact same code is generated.  This
is a leftover from when we still had a "doz" instruction.

Tested on powerpc64-linux --enable-languages=c,c++,fortran;
no regressions.  Also tested all these patterns manually,
-m32 and -m64, -misel and -mno-isel.

Okay to apply?


2012-09-18  Segher Boessenkool  <segher@kernel.crashing.org>

	* gcc/config/rs6000/rs6000.md (sminsi3, smaxsi3, uminsi3,
	umaxsi3): Delete.
	(abssi2, abs<mode>2_isel, nabs<mode>2_isel, abssi2_nopower,
	nabs_nopower): Delete.
	(absdi2, absdi2_internal, nabsdi2): Delete.
	(smindi3, smaxdi3, umindi3, umaxdi3): Delete.

---
 gcc/config/rs6000/rs6000.md |  230 -------------------------------------------
 1 files changed, 0 insertions(+), 230 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index f2bc15f..2f3795b 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -1796,154 +1796,6 @@ (define_expand "sub<mode>3"
     }
 }")
 
-(define_expand "sminsi3"
-  [(set (match_dup 3)
-	(if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
-				(match_operand:SI 2 "reg_or_short_operand" ""))
-			 (const_int 0)
-			 (minus:SI (match_dup 2) (match_dup 1))))
-   (set (match_operand:SI 0 "gpc_reg_operand" "")
-	(minus:SI (match_dup 2) (match_dup 3)))]
-  "TARGET_ISEL"
-  "
-{
-  operands[2] = force_reg (SImode, operands[2]);
-  rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "smaxsi3"
-  [(set (match_dup 3)
-	(if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
-				(match_operand:SI 2 "reg_or_short_operand" ""))
-			 (const_int 0)
-			 (minus:SI (match_dup 2) (match_dup 1))))
-   (set (match_operand:SI 0 "gpc_reg_operand" "")
-	(plus:SI (match_dup 3) (match_dup 1)))]
-  "TARGET_ISEL"
-  "
-{
-  operands[2] = force_reg (SImode, operands[2]);
-  rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "uminsi3"
-  [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
-			      (match_dup 5)))
-   (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
-			      (match_dup 5)))
-   (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
-				       (const_int 0)
-				       (minus:SI (match_dup 4) (match_dup 3))))
-   (set (match_operand:SI 0 "gpc_reg_operand" "")
-	(minus:SI (match_dup 2) (match_dup 3)))]
-  "TARGET_ISEL"
-  "
-{
-  rs6000_emit_minmax (operands[0], UMIN, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "umaxsi3"
-  [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
-			      (match_dup 5)))
-   (set (match_dup 4) (xor:SI (match_operand:SI 2 "gpc_reg_operand" "")
-			      (match_dup 5)))
-   (set (match_dup 3) (if_then_else:SI (gt (match_dup 3) (match_dup 4))
-				       (const_int 0)
-				       (minus:SI (match_dup 4) (match_dup 3))))
-   (set (match_operand:SI 0 "gpc_reg_operand" "")
-	(plus:SI (match_dup 3) (match_dup 1)))]
-  "TARGET_ISEL"
-  "
-{
-  rs6000_emit_minmax (operands[0], UMAX, operands[1], operands[2]);
-  DONE;
-}")
-
-;; We don't need abs with condition code because such comparisons should
-;; never be done.
-(define_expand "abssi2"
-  [(set (match_operand:SI 0 "gpc_reg_operand" "")
-	(abs:SI (match_operand:SI 1 "gpc_reg_operand" "")))]
-  ""
-  "
-{
-  if (TARGET_ISEL)
-    {
-      emit_insn (gen_abssi2_isel (operands[0], operands[1]));
-      DONE;
-    }
-  else
-    {
-      emit_insn (gen_abssi2_nopower (operands[0], operands[1]));
-      DONE;
-    }
-}")
-
-(define_insn_and_split "abs<mode>2_isel"
-  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
-        (abs:GPR (match_operand:GPR 1 "gpc_reg_operand" "b")))
-   (clobber (match_scratch:GPR 2 "=&b"))
-   (clobber (match_scratch:CC 3 "=y"))]
-  "TARGET_ISEL"
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (neg:GPR (match_dup 1)))
-   (set (match_dup 3)
-	(compare:CC (match_dup 1)
-		    (const_int 0)))
-   (set (match_dup 0)
-	(if_then_else:GPR (lt (match_dup 3)
-			      (const_int 0))
-			  (match_dup 2)
-			  (match_dup 1)))]
-  "")
-
-(define_insn_and_split "nabs<mode>2_isel"
-  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
-        (neg:GPR (abs:GPR (match_operand:GPR 1 "gpc_reg_operand" "b"))))
-   (clobber (match_scratch:GPR 2 "=&b"))
-   (clobber (match_scratch:CC 3 "=y"))]
-  "TARGET_ISEL"
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (neg:GPR (match_dup 1)))
-   (set (match_dup 3)
-	(compare:CC (match_dup 1)
-		    (const_int 0)))
-   (set (match_dup 0)
-	(if_then_else:GPR (lt (match_dup 3)
-			      (const_int 0))
-			  (match_dup 1)
-			  (match_dup 2)))]
-  "")
-
-(define_insn_and_split "abssi2_nopower"
-  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
-        (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0")))
-   (clobber (match_scratch:SI 2 "=&r,&r"))]
-  "! TARGET_ISEL"
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
-   (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
-   (set (match_dup 0) (minus:SI (match_dup 0) (match_dup 2)))]
-  "")
-
-(define_insn_and_split "*nabs_nopower"
-  [(set (match_operand:SI 0 "gpc_reg_operand" "=&r,r")
-        (neg:SI (abs:SI (match_operand:SI 1 "gpc_reg_operand" "r,0"))))
-   (clobber (match_scratch:SI 2 "=&r,&r"))]
-  ""
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (ashiftrt:SI (match_dup 1) (const_int 31)))
-   (set (match_dup 0) (xor:SI (match_dup 2) (match_dup 1)))
-   (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 0)))]
-  "")
-
 (define_expand "neg<mode>2"
   [(set (match_operand:SDI 0 "gpc_reg_operand" "")
 	(neg:SDI (match_operand:SDI 1 "gpc_reg_operand" "")))]
@@ -6374,43 +6226,6 @@ (define_insn "*ashrdisi3_noppc64"
 
 ;; PowerPC64 DImode operations.
 
-(define_expand "absdi2"
-  [(set (match_operand:DI 0 "gpc_reg_operand" "")
-	(abs:DI (match_operand:DI 1 "gpc_reg_operand" "")))]
-  "TARGET_POWERPC64"
-  "
-{
-  if (TARGET_ISEL)
-    emit_insn (gen_absdi2_isel (operands[0], operands[1]));
-  else
-    emit_insn (gen_absdi2_internal (operands[0], operands[1]));
-  DONE;
-}")
-
-(define_insn_and_split "absdi2_internal"
-  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
-        (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0")))
-   (clobber (match_scratch:DI 2 "=&r,&r"))]
-  "TARGET_POWERPC64 && !TARGET_ISEL"
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 63)))
-   (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
-   (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 2)))]
-  "")
-
-(define_insn_and_split "*nabsdi2"
-  [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,r")
-        (neg:DI (abs:DI (match_operand:DI 1 "gpc_reg_operand" "r,0"))))
-   (clobber (match_scratch:DI 2 "=&r,&r"))]
-  "TARGET_POWERPC64 && !TARGET_ISEL"
-  "#"
-  "&& reload_completed"
-  [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 63)))
-   (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
-   (set (match_dup 0) (minus:DI (match_dup 2) (match_dup 0)))]
-  "")
-
 (define_insn "muldi3"
   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
         (mult:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r")
@@ -7785,51 +7600,6 @@ (define_split
 	(compare:CC (match_dup 0)
 		    (const_int 0)))]
   "")
-
-(define_expand "smindi3"
-  [(match_operand:DI 0 "gpc_reg_operand" "")
-   (match_operand:DI 1 "gpc_reg_operand" "")
-   (match_operand:DI 2 "gpc_reg_operand" "")]
-  "TARGET_ISEL64"
-  "
-{
-  rs6000_emit_minmax (operands[0], SMIN, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "smaxdi3"
-  [(match_operand:DI 0 "gpc_reg_operand" "")
-   (match_operand:DI 1 "gpc_reg_operand" "")
-   (match_operand:DI 2 "gpc_reg_operand" "")]
-  "TARGET_ISEL64"
-  "
-{
-  rs6000_emit_minmax (operands[0], SMAX, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "umindi3"
-  [(match_operand:DI 0 "gpc_reg_operand" "")
-   (match_operand:DI 1 "gpc_reg_operand" "")
-   (match_operand:DI 2 "gpc_reg_operand" "")]
-  "TARGET_ISEL64"
-  "
-{
-  rs6000_emit_minmax (operands[0], UMIN, operands[1], operands[2]);
-  DONE;
-}")
-
-(define_expand "umaxdi3"
-  [(match_operand:DI 0 "gpc_reg_operand" "")
-   (match_operand:DI 1 "gpc_reg_operand" "")
-   (match_operand:DI 2 "gpc_reg_operand" "")]
-  "TARGET_ISEL64"
-  "
-{
-  rs6000_emit_minmax (operands[0], UMAX, operands[1], operands[2]);
-  DONE;
-}")
-
 
 ;; Now define ways of moving data around.
 
-- 
1.7.7.6



More information about the Gcc-patches mailing list