public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH-5, rs6000] Replace explicit CC bit reverse with common format
@ 2024-05-06  6:05 HAO CHEN GUI
  0 siblings, 0 replies; only message in thread
From: HAO CHEN GUI @ 2024-05-06  6:05 UTC (permalink / raw)
  To: gcc-patches; +Cc: Segher Boessenkool, David, Kewen.Lin, Peter Bergner

Hi,
  It's the fifth patch of a series of patches optimizing CC modes on
rs6000.

  There are some explicit CR6 bit reverse (mfcr/xor) expand in vector.md.
As the forth patch optimized CC bit reverse implement, the patch changes
the explicit format to the common format (testing if the bit is not set).
With the common format, it can matches different implement on different
sub-targets. On Power10, it should be setbcr. On Power9, it's isel. On
Power8 and below, it's mfcr/xor.

  Bootstrapped and tested on powerpc64-linux BE and LE with no
regressions. Is it OK for the trunk?

Thanks
Gui Haochen

ChangeLog
rs6000: Replace explicit CC bit reverse with common format

This patch replaces explicit CC bit reverse (mfcr/xor) with the common format
so that it can match setbcr on Power 10, isel on Power 9 and mfcr/xor on
other sub-targets.

gcc/
	* config/rs6000/vector.md (vector_ae_<mode>_p): Replace explicit CC
	bit reverse with common format.
	(vector_ae_v2di_p): Likewise.
	(vector_ae_v1ti_p): Likewise.
	(vector_ae_<mode>_p): Likewise.
	(cr6_test_for_zero): Likewise.
	(cr6_test_for_lt): Likewise.

gcc/testsuite/
	* gcc.target/powerpc/vsu/vec-any-eq-10.c: Replace rlwinm with isel.
	* gcc.target/powerpc/vsu/vec-any-eq-14.c: Replace rlwinm with isel.
	* gcc.target/powerpc/vsu/vec-any-eq-7.c: Replace rlwinm with isel.
	* gcc.target/powerpc/vsu/vec-any-eq-8.c: Replace rlwinm with isel.
	* gcc.target/powerpc/vsu/vec-any-eq-9.c: Replace rlwinm with isel.

patch.diff
diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md
index f86c1f2990e..b1bbf9bac2d 100644
--- a/gcc/config/rs6000/vector.md
+++ b/gcc/config/rs6000/vector.md
@@ -942,11 +942,8 @@ (define_expand "vector_ae_<mode>_p"
 	  (ne:VI (match_dup 1)
 		 (match_dup 2)))])
    (set (match_operand:SI 0 "register_operand" "=r")
-	(lt:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ge:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_P9_VECTOR"
 {
   operands[3] = gen_reg_rtx (<MODE>mode);
@@ -1027,11 +1024,8 @@ (define_expand "vector_ae_v2di_p"
 	  (eq:V2DI (match_dup 1)
 		   (match_dup 2)))])
    (set (match_operand:SI 0 "register_operand" "=r")
-	(eq:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ne:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_P9_VECTOR"
 {
   operands[3] = gen_reg_rtx (V2DImode);
@@ -1048,11 +1042,8 @@ (define_expand "vector_ae_v1ti_p"
 	  (eq:V1TI (match_dup 1)
 		   (match_dup 2)))])
    (set (match_operand:SI 0 "register_operand" "=r")
-	(eq:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ne:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_POWER10"
 {
   operands[3] = gen_reg_rtx (V1TImode);
@@ -1095,11 +1086,8 @@ (define_expand "vector_ae_<mode>_p"
 	  (eq:VEC_F (match_dup 1)
 		    (match_dup 2)))])
    (set (match_operand:SI 0 "register_operand" "=r")
-	(eq:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ne:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_P9_VECTOR"
 {
   operands[3] = gen_reg_rtx (<MODE>mode);
@@ -1172,11 +1160,8 @@ (define_expand "cr6_test_for_zero"
 ;; integer constant first argument equals one (aka __CR6_EQ_REV in altivec.h).
 (define_expand "cr6_test_for_zero_reverse"
   [(set (match_operand:SI 0 "register_operand" "=r")
-	(eq:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ne:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_ALTIVEC || TARGET_VSX"
   "")

@@ -1198,11 +1183,8 @@ (define_expand "cr6_test_for_lt"
 ;; (aka __CR6_LT_REV in altivec.h).
 (define_expand "cr6_test_for_lt_reverse"
   [(set (match_operand:SI 0 "register_operand" "=r")
-	(lt:SI (reg:CCLTEQ CR6_REGNO)
-	       (const_int 0)))
-   (set (match_dup 0)
-	(xor:SI (match_dup 0)
-		(const_int 1)))]
+	(ge:SI (reg:CCLTEQ CR6_REGNO)
+	       (const_int 0)))]
   "TARGET_ALTIVEC || TARGET_VSX"
   "")

diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-10.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-10.c
index 30dfc83a97b..9743a496fb5 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-10.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-10.c
@@ -15,4 +15,4 @@ test_any_equal (vector unsigned long long *arg1_p,
 }

 /* { dg-final { scan-assembler "vcmpequd." } } */
-/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,27,1" } } */
+/* { dg-final { scan-assembler "isel r?\[0-9\]+,0,r?\[0-9\]+,26" } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-14.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-14.c
index 4375bfe21cc..06779924a65 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-14.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-14.c
@@ -14,4 +14,4 @@ test_any_equal (vector bool long long *arg1_p, vector bool long long *arg2_p)
 }

 /* { dg-final { scan-assembler "vcmpequd." } } */
-/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,27,1" } } */
+/* { dg-final { scan-assembler "isel r?\[0-9\]+,0,r?\[0-9\]+,26" } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-7.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-7.c
index 254a1161580..1c69216c8ea 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-7.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-7.c
@@ -14,4 +14,4 @@ test_any_equal (vector float *arg1_p, vector float *arg2_p)
 }

 /* { dg-final { scan-assembler "xvcmpeqsp." } } */
-/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,27,1" } } */
+/* { dg-final { scan-assembler "isel r?\[0-9\]+,0,r?\[0-9\]+,26" } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-8.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-8.c
index d94ef89f3d0..ef959b4b01c 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-8.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-8.c
@@ -14,4 +14,4 @@ test_any_equal (vector double *arg1_p, vector double *arg2_p)
 }

 /* { dg-final { scan-assembler "xvcmpeqdp." } } */
-/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,27,1" } } */
+/* { dg-final { scan-assembler "isel r?\[0-9\]+,0,r?\[0-9\]+,26" } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-9.c b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-9.c
index efe83cf2ee7..a1a81f68b08 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-9.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsu/vec-any-eq-9.c
@@ -14,4 +14,4 @@ test_any_equal (vector long long *arg1_p, vector long long *arg2_p)
 }

 /* { dg-final { scan-assembler "vcmpequd." } } */
-/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,27,1" } } */
+/* { dg-final { scan-assembler "isel r?\[0-9\]+,0,r?\[0-9\]+,26" } } */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-05-06  6:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-06  6:05 [PATCH-5, rs6000] Replace explicit CC bit reverse with common format HAO CHEN GUI

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).