diff mbox series

[rs6000] Add missing vec_max tests

Message ID 1525102564.13190.1.camel@us.ibm.com
State New
Headers show
Series [rs6000] Add missing vec_max tests | expand

Commit Message

Carl Love April 30, 2018, 3:36 p.m. UTC
GCC Maintainers:

The following patch adds tests for the vec_max builtin.

The patch for the test case was tested on

    powerpc64le-unknown-linux-gnu (Power 8 LE)
    powerpc64-unknown-linux-gnu (Power 8 BE)
    powerpc64le-unknown-linux-gnu (Power 9 LE).

 Please let me know if the patch looks OK for GCC mainline.

                         Carl Love

-----------------------------------------------------------------

gcc/testsuite/ChangeLog:

2018-04-27  Carl Love  <cel@us.ibm.com>
	* gcc.target/powerpc/vsx-vector-6.h (foo): Add test for vec_max,
	vec_trunc.
	* gcc.target/powerpc/vsx-vector-6-le.c (dg-final): Update xxlor,
	xxlnor,	xvcmpgedp counts.
---
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c | 12 ++++--------
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h    | 16 ++++++++++++----
 2 files changed, 16 insertions(+), 12 deletions(-)

Comments

Peter Bergner April 30, 2018, 4:04 p.m. UTC | #1
On 4/30/18 10:36 AM, Carl Love wrote:
> -/* We generate xxlor instructions for many reasons other than or'ing vector
> -   operands or calling __builtin_vec_or(), which  means we cannot rely on
> -   their usage counts being stable.  Therefore, we just ensure at least one
> -   xxlor instruction was generated.  */
> -/* { dg-final { scan-assembler "xxlor" } } */
[snip]
> +/* { dg-final { scan-assembler-times "xxlor" 25 } } */

Please do not change back to counting xxlor insns.  We used to do that before
my change in March where I added the comment you are removing that explains
the folly of trying to count them.


Peter
Carl Love April 30, 2018, 4:52 p.m. UTC | #2
GCC Maintainers:

I have re-worked the patch per Peter's comments.  I retested the patch
on P8 BE, P8 LE and P9 LE.

 Please let me know if the patch looks OK for GCC mainline.

                         Carl Love

----------------------------------------------------

gcc/testsuite/ChangeLog:

2018-04-30  Carl Love  <cel@us.ibm.com>
	* gcc.target/powerpc/vsx-vector-6.h (foo): Add test for vec_max,
	vec_trunc.
	* gcc.target/powerpc/vsx-vector-6-le.c (dg-final): Update xvcmpeqdp,
	xvcmpgtdp, xvcmpgedp counts.
---
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c |  6 +++---
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h    | 16 ++++++++++++----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
index fe7eeb1..001dc41 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
@@ -14,9 +14,9 @@
    their usage counts being stable.  Therefore, we just ensure at least one
    xxlor instruction was generated.  */
 /* { dg-final { scan-assembler "xxlor" } } */
-/* { dg-final { scan-assembler-times "xvcmpeqdp" 5 } } */
-/* { dg-final { scan-assembler-times "xvcmpgtdp" 8 } } */
-/* { dg-final { scan-assembler-times "xvcmpgedp" 6 } } */
+/* { dg-final { scan-assembler-times "xvcmpeqdp" 4 } } */
+/* { dg-final { scan-assembler-times "xvcmpgtdp" 7 } } */
+/* { dg-final { scan-assembler-times "xvcmpgedp" 7 } } */
 /* { dg-final { scan-assembler-times "xvrdpim" 1 } } */
 /* { dg-final { scan-assembler-times "xvmaddadp" 1 } } */
 /* { dg-final { scan-assembler-times "xvmsubadp" 1 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
index 422f8a1..4819433 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
@@ -7,7 +7,9 @@
 void foo (vector double *out, vector double *in, vector long *p_l, vector bool long *p_b,
 	  vector unsigned char *p_uc, int *i, vector float *p_f,
 	  vector bool char *outbc, vector bool int *outbi,
-	  vector bool short *outbsi, vector int *outsi, vector unsigned int *outui)
+	  vector bool short *outbsi, vector int *outsi,
+	  vector unsigned int *outui, vector signed char *outsc,
+	  vector unsigned char *outuc)
 {
   vector double in0 = in[0];
   vector double in1 = in[1];
@@ -20,6 +22,8 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector float inf0;
   vector float inf1;
   vector float inf2;
+  vector char inc0;
+  vector char inc1;
   vector bool char inbc0;
   vector bool char inbc1;
   vector bool short inbs0;
@@ -30,6 +34,7 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector unsigned short int inusi0, inusi1;
   vector signed int insi0, insi1;
   vector unsigned int inui0, inui1;
+  vector unsigned char inuc0, inuc1;
   
   *out++ = vec_abs (in0);
   *out++ = vec_add (in0, in1);
@@ -65,8 +70,6 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *out++ = vec_or (inb, in0);
   *out++ = vec_perm (in0, in1, uc);
   *out++ = vec_rint (in0);
-  *out++ = vec_sel (in0, in1, inl);
-  *out++ = vec_sel (in0, in1, inb);
   *out++ = vec_sub (in0, in1);
   *out++ = vec_sqrt (in0);
   *out++ = vec_trunc (in0);
@@ -103,6 +106,7 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *p_f++ = vec_nmsub (inf0, inf1, inf2);
   *p_f++ = vec_nmadd (inf0, inf1, inf2);
   *p_f++ = vec_or (inf0, inf1);
+  *p_f++ = vec_trunc (inf0);
   
   *out++ = vec_or (inbl0, in0);
   *out++ = vec_or (in0, inbl0);
@@ -113,6 +117,8 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *outbc++ = vec_andc (inbc0, inbc1);
   *outbc++ = vec_or (inbc0, inbc1);
 
+  *outuc++ = vec_max (inuc0, inuc1);
+
   *outbi++ = vec_andc (inbi0, inbi1);
   *outbsi++ = vec_andc (inbs0, inbs1);
 
@@ -151,7 +157,9 @@ int main()
   vector bool short *outbsi;
   vector int *outsi;
   vector unsigned int *outui;
+  vector signed char *outsc;
+  vector unsigned char *outuc;
 
   foo (out, in, p_l, p_b, p_uc, i, p_f, outbc,
-       outbi, outbsi, outsi, outui);
+       outbi, outbsi, outsi, outui, outsc, outuc);
 }
Segher Boessenkool May 3, 2018, 4:43 p.m. UTC | #3
Hi Carl,

On Mon, Apr 30, 2018 at 09:52:27AM -0700, Carl Love wrote:
> gcc/testsuite/ChangeLog:
> 
> 2018-04-30  Carl Love  <cel@us.ibm.com>
> 	* gcc.target/powerpc/vsx-vector-6.h (foo): Add test for vec_max,
> 	vec_trunc.
> 	* gcc.target/powerpc/vsx-vector-6-le.c (dg-final): Update xvcmpeqdp,
> 	xvcmpgtdp, xvcmpgedp counts.

> @@ -65,8 +70,6 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
>    *out++ = vec_or (inb, in0);
>    *out++ = vec_perm (in0, in1, uc);
>    *out++ = vec_rint (in0);
> -  *out++ = vec_sel (in0, in1, inl);
> -  *out++ = vec_sel (in0, in1, inb);
>    *out++ = vec_sub (in0, in1);
>    *out++ = vec_sqrt (in0);
>    *out++ = vec_trunc (in0);

Why does the patch remove these two vec_sel?  If that is wanted, the
changelog should mention this.

Looks fine otherwise.


Segher
Carl Love May 4, 2018, 2:59 p.m. UTC | #4
Segher:

> > -  *out++ = vec_sel (in0, in1, inl);
> > -  *out++ = vec_sel (in0, in1, inb);
> >    *out++ = vec_sub (in0, in1);
> >    *out++ = vec_sqrt (in0);
> >    *out++ = vec_trunc (in0);
> 
> Why does the patch remove these two vec_sel?  If that is wanted, the
> changelog should mention this.
> 

Segher:

No clue why I removed the vec_sel test.  Been sitting on the testsuite
patch set too long, I don't recall.  I put it back in and tested it. 
Then noticed there wasn't any tests for the xxsel instruction which the
vec_sel test generates.  I added an instruction count test to both the
BE and LE tests.  I found the BE test needed some updating as well. 
The revised patch is given below.  I retested on:

    powerpc64le-unknown-linux-gnu (Power 8 LE)
    powerpc64-unknown-linux-gnu (Power 8 BE)
    powerpc64le-unknown-linux-gnu (Power 9 LE).

Please let me know if everything looks OK now.  Thanks.

                     Carl Love

----------------------------------------------------------------


gcc/testsuite/ChangeLog:

2018-05-03 Carl Love  <cel@us.ibm.com>
	* gcc.target/powerpc/vsx-vector-6.h (foo): Add test for vec_max,
	vec_trunc.
	* gcc.target/powerpc/vsx-vector-6-le.c (dg-final): Update xvcmpeqdp,
	xvcmpgtdp, xvcmpgedp counts. Add xxsel counts.
	* gcc.target/powerpc/vsx-vector-6-be.c (dg-final): Update xvcmpgtdp,
	xvcmpgedp counts. Add xxsel counts.
---
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-be.c |  5 +++--
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c |  7 ++++---
 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h    | 14 ++++++++++++--
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-be.c b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-be.c
index a33f6d1..3305781 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-be.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-be.c
@@ -9,8 +9,8 @@
 /* { dg-final { scan-assembler-times "xvadddp" 1 } } */
 /* { dg-final { scan-assembler-times "xxlnor" 7 } } */
 /* { dg-final { scan-assembler-times "xvcmpeqdp" 6 } } */
-/* { dg-final { scan-assembler-times "xvcmpgtdp" 7 } } */
-/* { dg-final { scan-assembler-times "xvcmpgedp" 6 } } */
+/* { dg-final { scan-assembler-times "xvcmpgtdp" 8 } } */
+/* { dg-final { scan-assembler-times "xvcmpgedp" 7 } } */
 /* { dg-final { scan-assembler-times "xvrdpim" 1 } } */
 /* { dg-final { scan-assembler-times "xvmaddadp" 1 } } */
 /* { dg-final { scan-assembler-times "xvmsubadp" 1 } } */
@@ -26,6 +26,7 @@
 /* { dg-final { scan-assembler-times "xvnmaddasp" 1 } } */
 /* { dg-final { scan-assembler-times "vmsumshs" 1 } } */
 /* { dg-final { scan-assembler-times "xxland" 13 } } */
+/* { dg-final { scan-assembler-times "xxsel" 2 } } */
 
 /* Source code for the test in vsx-vector-6.h */
 #include "vsx-vector-6.h"
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
index fe7eeb1..dbf87b3 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
@@ -14,9 +14,9 @@
    their usage counts being stable.  Therefore, we just ensure at least one
    xxlor instruction was generated.  */
 /* { dg-final { scan-assembler "xxlor" } } */
-/* { dg-final { scan-assembler-times "xvcmpeqdp" 5 } } */
-/* { dg-final { scan-assembler-times "xvcmpgtdp" 8 } } */
-/* { dg-final { scan-assembler-times "xvcmpgedp" 6 } } */
+/* { dg-final { scan-assembler-times "xvcmpeqdp" 4 } } */
+/* { dg-final { scan-assembler-times "xvcmpgtdp" 7 } } */
+/* { dg-final { scan-assembler-times "xvcmpgedp" 7 } } */
 /* { dg-final { scan-assembler-times "xvrdpim" 1 } } */
 /* { dg-final { scan-assembler-times "xvmaddadp" 1 } } */
 /* { dg-final { scan-assembler-times "xvmsubadp" 1 } } */
@@ -32,6 +32,7 @@
 /* { dg-final { scan-assembler-times "xvnmaddasp" 1 } } */
 /* { dg-final { scan-assembler-times "vmsumshs" 1 } } */
 /* { dg-final { scan-assembler-times "xxland" 13 } } */
+/* { dg-final { scan-assembler-times "xxsel" 2 } } */
 
 /* Source code for the test in vsx-vector-6.h */
 #include "vsx-vector-6.h"
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
index 422f8a1..a891b64 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
@@ -7,7 +7,9 @@
 void foo (vector double *out, vector double *in, vector long *p_l, vector bool long *p_b,
 	  vector unsigned char *p_uc, int *i, vector float *p_f,
 	  vector bool char *outbc, vector bool int *outbi,
-	  vector bool short *outbsi, vector int *outsi, vector unsigned int *outui)
+	  vector bool short *outbsi, vector int *outsi,
+	  vector unsigned int *outui, vector signed char *outsc,
+	  vector unsigned char *outuc)
 {
   vector double in0 = in[0];
   vector double in1 = in[1];
@@ -20,6 +22,8 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector float inf0;
   vector float inf1;
   vector float inf2;
+  vector char inc0;
+  vector char inc1;
   vector bool char inbc0;
   vector bool char inbc1;
   vector bool short inbs0;
@@ -30,6 +34,7 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector unsigned short int inusi0, inusi1;
   vector signed int insi0, insi1;
   vector unsigned int inui0, inui1;
+  vector unsigned char inuc0, inuc1;
   
   *out++ = vec_abs (in0);
   *out++ = vec_add (in0, in1);
@@ -103,6 +108,7 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *p_f++ = vec_nmsub (inf0, inf1, inf2);
   *p_f++ = vec_nmadd (inf0, inf1, inf2);
   *p_f++ = vec_or (inf0, inf1);
+  *p_f++ = vec_trunc (inf0);
   
   *out++ = vec_or (inbl0, in0);
   *out++ = vec_or (in0, inbl0);
@@ -113,6 +119,8 @@ void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *outbc++ = vec_andc (inbc0, inbc1);
   *outbc++ = vec_or (inbc0, inbc1);
 
+  *outuc++ = vec_max (inuc0, inuc1);
+
   *outbi++ = vec_andc (inbi0, inbi1);
   *outbsi++ = vec_andc (inbs0, inbs1);
 
@@ -151,7 +159,9 @@ int main()
   vector bool short *outbsi;
   vector int *outsi;
   vector unsigned int *outui;
+  vector signed char *outsc;
+  vector unsigned char *outuc;
 
   foo (out, in, p_l, p_b, p_uc, i, p_f, outbc,
-       outbi, outbsi, outsi, outui);
+       outbi, outbsi, outsi, outui, outsc, outuc);
 }
-- 
2.7.4
Segher Boessenkool May 4, 2018, 3:28 p.m. UTC | #5
Hi!

On Fri, May 04, 2018 at 07:59:37AM -0700, Carl Love wrote:
> > Why does the patch remove these two vec_sel?  If that is wanted, the
> > changelog should mention this.

> No clue why I removed the vec_sel test.  Been sitting on the testsuite
> patch set too long, I don't recall.  I put it back in and tested it. 
> Then noticed there wasn't any tests for the xxsel instruction which the
> vec_sel test generates.  I added an instruction count test to both the
> BE and LE tests.  I found the BE test needed some updating as well. 
> The revised patch is given below.  I retested on:
> 
>     powerpc64le-unknown-linux-gnu (Power 8 LE)
>     powerpc64-unknown-linux-gnu (Power 8 BE)
>     powerpc64le-unknown-linux-gnu (Power 9 LE).
> 
> Please let me know if everything looks OK now.  Thanks.

Looks good to me, okay for trunk.  Thanks!

(I'll find out soon enough if it works on power7 as well :-) )


Segher


> 2018-05-03 Carl Love  <cel@us.ibm.com>
> 	* gcc.target/powerpc/vsx-vector-6.h (foo): Add test for vec_max,
> 	vec_trunc.
> 	* gcc.target/powerpc/vsx-vector-6-le.c (dg-final): Update xvcmpeqdp,
> 	xvcmpgtdp, xvcmpgedp counts. Add xxsel counts.
> 	* gcc.target/powerpc/vsx-vector-6-be.c (dg-final): Update xvcmpgtdp,
> 	xvcmpgedp counts. Add xxsel counts.
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
index fe7eeb1..e02eadf 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-le.c
@@ -9,14 +9,10 @@ 
 /* { dg-final { scan-assembler-times "xvabsdp" 1 } } */
 /* { dg-final { scan-assembler-times "xvadddp" 1 } } */
 /* { dg-final { scan-assembler-times "xxlnor" 8 } } */
-/* We generate xxlor instructions for many reasons other than or'ing vector
-   operands or calling __builtin_vec_or(), which  means we cannot rely on
-   their usage counts being stable.  Therefore, we just ensure at least one
-   xxlor instruction was generated.  */
-/* { dg-final { scan-assembler "xxlor" } } */
-/* { dg-final { scan-assembler-times "xvcmpeqdp" 5 } } */
-/* { dg-final { scan-assembler-times "xvcmpgtdp" 8 } } */
-/* { dg-final { scan-assembler-times "xvcmpgedp" 6 } } */
+/* { dg-final { scan-assembler-times "xxlor" 25 } } */
+/* { dg-final { scan-assembler-times "xvcmpeqdp" 4 } } */
+/* { dg-final { scan-assembler-times "xvcmpgtdp" 7 } } */
+/* { dg-final { scan-assembler-times "xvcmpgedp" 7 } } */
 /* { dg-final { scan-assembler-times "xvrdpim" 1 } } */
 /* { dg-final { scan-assembler-times "xvmaddadp" 1 } } */
 /* { dg-final { scan-assembler-times "xvmsubadp" 1 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
index 422f8a1..4819433 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
@@ -7,7 +7,9 @@ 
 void foo (vector double *out, vector double *in, vector long *p_l, vector bool long *p_b,
 	  vector unsigned char *p_uc, int *i, vector float *p_f,
 	  vector bool char *outbc, vector bool int *outbi,
-	  vector bool short *outbsi, vector int *outsi, vector unsigned int *outui)
+	  vector bool short *outbsi, vector int *outsi,
+	  vector unsigned int *outui, vector signed char *outsc,
+	  vector unsigned char *outuc)
 {
   vector double in0 = in[0];
   vector double in1 = in[1];
@@ -20,6 +22,8 @@  void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector float inf0;
   vector float inf1;
   vector float inf2;
+  vector char inc0;
+  vector char inc1;
   vector bool char inbc0;
   vector bool char inbc1;
   vector bool short inbs0;
@@ -30,6 +34,7 @@  void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   vector unsigned short int inusi0, inusi1;
   vector signed int insi0, insi1;
   vector unsigned int inui0, inui1;
+  vector unsigned char inuc0, inuc1;
   
   *out++ = vec_abs (in0);
   *out++ = vec_add (in0, in1);
@@ -65,8 +70,6 @@  void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *out++ = vec_or (inb, in0);
   *out++ = vec_perm (in0, in1, uc);
   *out++ = vec_rint (in0);
-  *out++ = vec_sel (in0, in1, inl);
-  *out++ = vec_sel (in0, in1, inb);
   *out++ = vec_sub (in0, in1);
   *out++ = vec_sqrt (in0);
   *out++ = vec_trunc (in0);
@@ -103,6 +106,7 @@  void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *p_f++ = vec_nmsub (inf0, inf1, inf2);
   *p_f++ = vec_nmadd (inf0, inf1, inf2);
   *p_f++ = vec_or (inf0, inf1);
+  *p_f++ = vec_trunc (inf0);
   
   *out++ = vec_or (inbl0, in0);
   *out++ = vec_or (in0, inbl0);
@@ -113,6 +117,8 @@  void foo (vector double *out, vector double *in, vector long *p_l, vector bool l
   *outbc++ = vec_andc (inbc0, inbc1);
   *outbc++ = vec_or (inbc0, inbc1);
 
+  *outuc++ = vec_max (inuc0, inuc1);
+
   *outbi++ = vec_andc (inbi0, inbi1);
   *outbsi++ = vec_andc (inbs0, inbs1);
 
@@ -151,7 +157,9 @@  int main()
   vector bool short *outbsi;
   vector int *outsi;
   vector unsigned int *outui;
+  vector signed char *outsc;
+  vector unsigned char *outuc;
 
   foo (out, in, p_l, p_b, p_uc, i, p_f, outbc,
-       outbi, outbsi, outsi, outui);
+       outbi, outbsi, outsi, outui, outsc, outuc);
 }