diff mbox

[v2,rs6000] Add built-in support for vector compare

Message ID 1479768173.4523.258.camel@us.ibm.com
State New
Headers show

Commit Message

Carl Love Nov. 21, 2016, 10:42 p.m. UTC
Segher:

I realized over the weekend that I forgot to update the built-in documentation
file, doc/extend.texi.  I have updated the patch with these additions and fixed
the issues you mentioned before.

The Power ABI document lists a number of built-ins that it is supposed
to support.  There are still some missing.  This patch adds the built-in
support for the following built-ins:

vector bool char      vec_cmpeq vector bool char       vector bool char
vector bool int       vec_cmpeq vector bool int        vector bool int
vector bool long long vec_cmpeq vector bool long long  vector bool long long
vector bool short     vec_cmpeq vector bool short      vector bool short
vector bool char      vec_cmpne vector bool char       vector bool char
vector bool int       vec_cmpne vector bool int        vector bool int
vector bool long long vec_cmpne vector bool long long  vector bool long long
vector bool short     vec_cmpne vector bool short      vector bool short

Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
regressions. 

Is this ok for trunk?

                Carl Love


gcc/ChangeLog:

2016-11-21  Carl Love  <cel@us.ibm.com>

        * config/rs6000/rs6000-c.c: Add built-in support for vector compare
        equal and vector compare not equal.  The vector compares take two
        arguments of type vector bool char, vector bool short, vector bool int,
        vector bool long long with the same return type.
        * doc/extend.texi: Update built-in documentation file for the new
        powerpc built-ins.

gcc/testsuite/ChangeLog:

2016-11-21  Carl Love  <cel@us.ibm.com>

        * gcc.target/powerpc/builtins-3.c: New file to test the new
        built-ins for vector compare equal and vector compare not equal.
---
 gcc/config/rs6000/rs6000-c.c                  | 17 ++++++-
 gcc/doc/extend.texi                           | 10 ++++
 gcc/testsuite/gcc.target/powerpc/builtins-3.c | 68 +++++++++++++++++++++++++++
 3 files changed, 94 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/builtins-3.c

Comments

Segher Boessenkool Nov. 21, 2016, 11:30 p.m. UTC | #1
On Mon, Nov 21, 2016 at 02:42:53PM -0800, Carl E. Love wrote:
> The Power ABI document lists a number of built-ins that it is supposed
> to support.  There are still some missing.  This patch adds the built-in
> support for the following built-ins:

[ snip ]

So, which are still missing after this?  Or were these the last ones?

> Is this ok for trunk?

Yes, thanks!


Segher
Andreas Schwab Dec. 4, 2016, 12:41 p.m. UTC | #2
On Nov 21 2016, "Carl E. Love" <cel@us.ibm.com> wrote:

>         * gcc.target/powerpc/builtins-3.c: New file to test the new
>         built-ins for vector compare equal and vector compare not equal.

spawn -ignore SIGHUP /daten/gcc/gcc-20161203/Build/gcc/xgcc -B/daten/gcc/gcc-20161203/Build/gcc/ /daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c -m64 -fno-diagnostics-show-caret -fdiagnostics-color=never -maltivec -mvsx -ffat-lto-objects -S -o builtins-3.s.
In file included from /daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c:5:0:.
/daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c: In function 'test_eq_long':.
/daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c:28:9: error: Builtin function __builtin_altivec_vcmpequd requires the -mpower8-vector option.
/daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c: In function 'test_ne_long':.
/daten/gcc/gcc-20161203/gcc/testsuite/gcc.target/powerpc/builtins-3.c:52:9: error: Builtin function __builtin_altivec_vcmpequd requires the -mpower8-vector option.
compiler exited with status 1
FAIL: gcc.target/powerpc/builtins-3.c (test for excess errors)

Andreas.
diff mbox

Patch

diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index 4bba293..4f332d7 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -1107,15 +1107,23 @@  const struct altivec_builtin_types altivec_overloaded_builtins[] = {
     RS6000_BTI_bool_V16QI, RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUB,
     RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUB,
+    RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUH,
+    RS6000_BTI_bool_V8HI, RS6000_BTI_bool_V8HI, RS6000_BTI_bool_V8HI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUH,
     RS6000_BTI_bool_V8HI, RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUH,
     RS6000_BTI_bool_V8HI, RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUW,
+    RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUW,
     RS6000_BTI_bool_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, ALTIVEC_BUILTIN_VCMPEQUW,
     RS6000_BTI_bool_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, P8V_BUILTIN_VCMPEQUD,
+    RS6000_BTI_bool_V2DI, RS6000_BTI_bool_V2DI, RS6000_BTI_bool_V2DI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPEQ, P8V_BUILTIN_VCMPEQUD,
     RS6000_BTI_bool_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPEQ, P8V_BUILTIN_VCMPEQUD,
     RS6000_BTI_bool_V2DI, RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0 },
@@ -4486,6 +4494,9 @@  const struct altivec_builtin_types altivec_overloaded_builtins[] = {
     RS6000_BTI_bool_V16QI, RS6000_BTI_V16QI,
     RS6000_BTI_V16QI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEB,
+    RS6000_BTI_bool_V16QI, RS6000_BTI_bool_V16QI,
+    RS6000_BTI_bool_V16QI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEB,
     RS6000_BTI_bool_V16QI, RS6000_BTI_unsigned_V16QI,
     RS6000_BTI_unsigned_V16QI, 0 },
 
@@ -4508,7 +4519,11 @@  const struct altivec_builtin_types altivec_overloaded_builtins[] = {
   { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEW,
     RS6000_BTI_bool_V4SI, RS6000_BTI_unsigned_V4SI,
     RS6000_BTI_unsigned_V4SI, 0 },
-
+  { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEB,
+    RS6000_BTI_bool_V4SI, RS6000_BTI_bool_V4SI,
+    RS6000_BTI_bool_V4SI, 0 },
+  { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNED,
+    RS6000_BTI_bool_V2DI, RS6000_BTI_bool_V2DI, RS6000_BTI_bool_V2DI, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEF,
     RS6000_BTI_bool_V4SI, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 },
   { ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNED,
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 4dcc7f6..ca46918 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -15652,6 +15652,9 @@  vector float vec_ceil (vector float);
 
 vector signed int vec_cmpb (vector float, vector float);
 
+vector bool char vec_cmpeq (vector bool char, vector bool char);
+vector bool short vec_cmpeq (vector bool short, vector bool short);
+vector bool int vec_cmpeq (vector bool int, vector bool int);
 vector bool char vec_cmpeq (vector signed char, vector signed char);
 vector bool char vec_cmpeq (vector unsigned char, vector unsigned char);
 vector bool short vec_cmpeq (vector signed short, vector signed short);
@@ -17568,6 +17571,8 @@  int vec_any_lt (vector unsigned long long, vector unsigned long long);
 int vec_any_ne (vector long long, vector long long);
 int vec_any_ne (vector unsigned long long, vector unsigned long long);
 
+vector bool long long vec_cmpeq (vector bool long long, vector bool long long);
+
 vector long long vec_eqv (vector long long, vector long long);
 vector long long vec_eqv (vector bool long long, vector long long);
 vector long long vec_eqv (vector long long, vector bool long long);
@@ -17901,6 +17906,11 @@  If the ISA 3.0 instruction set additions (@option{-mcpu=power9})
 are available:
 
 @smallexample
+vector bool char vec_cmpne (vector bool char, vector bool char);
+vector bool short vec_cmpne (vector bool short, vector bool short);
+vector bool int vec_cmpne (vector bool int, vector bool int);
+vector bool long long vec_cmpne (vector bool long long, vector bool long long);
+
 vector long long vec_vctz (vector long long);
 vector unsigned long long vec_vctz (vector unsigned long long);
 vector int vec_vctz (vector int);
diff --git a/gcc/testsuite/gcc.target/powerpc/builtins-3.c b/gcc/testsuite/gcc.target/powerpc/builtins-3.c
new file mode 100644
index 0000000..8d4b63d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/builtins-3.c
@@ -0,0 +1,68 @@ 
+#include <altivec.h>
+
+/* { dg-do compile } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+
+vector bool char
+test_eq_char (vector bool char x, vector bool char y)
+{
+	return vec_cmpeq (x, y);
+}
+
+vector bool short
+test_eq_short (vector bool short x, vector bool short y)
+{
+	return vec_cmpeq (x, y);
+}
+
+vector bool int
+test_eq_int (vector bool int x, vector bool int y)
+{
+	return vec_cmpeq (x, y);
+}
+
+vector bool long
+test_eq_long (vector bool long x, vector bool long y)
+{
+	return vec_cmpeq (x, y);
+}
+
+vector bool char
+test_ne_char (vector bool char x, vector bool char y)
+{
+	return vec_cmpne (x, y);
+}
+
+vector bool short
+test_ne_short (vector bool short x, vector bool short y)
+{
+	return vec_cmpne (x, y);
+}
+
+vector bool int
+test_ne_int (vector bool int x, vector bool int y)
+{
+	return vec_cmpne (x, y);
+}
+
+vector bool long
+test_ne_long (vector bool long x, vector bool long y)
+{
+	return vec_cmpne (x, y);
+}
+
+/* Note: vec_cmpne is implemented as vcmpeq and then NOT'ed
+   using the xxlnor instruction.
+
+   Expected test results:
+   test_eq_char              1 vcmpeq inst
+   test_eq_short             1 vcmpeq inst
+   test_eq_int               1 vcmpeq inst
+   test_eq_long              1 vcmpeq inst
+   test_ne_char              1 vcmpeq, 1 xxlnor inst
+   test_ne_short             1 vcmpeq, 1 xxlnor inst
+   test_ne_int               1 vcmpeq, 1 xxlnor inst
+   test_ne_long              1 vcmpeq, 1 xxlnor inst */
+
+/* { dg-final { scan-assembler-times "vcmpeq" 8 } } */
+/* { dg-final { scan-assembler-times "xxlnor" 4 } } */