GCC maintainers:
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-15 Carl Love <[email protected]>
* 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.
gcc/testsuite/ChangeLog:
2016-11-15 Carl Love <[email protected]>
* gcc.target/powerpc/builtins-3.c : New file to test the new
built-ins for vecotr compare equal and vector compare not equal.
---
gcc/config/rs6000/rs6000-c.c | 19 +++++++-
gcc/testsuite/gcc.target/powerpc/builtins-3.c | 68 +++++++++++++++++++++++++++
2 files changed, 85 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/powerpc/builtins-3.c
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index 4bba293..6566279 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -1107,15 +1107,24 @@ 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,9 +4495,11 @@ 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 },
-
{ ALTIVEC_BUILTIN_VEC_CMPNE, P9V_BUILTIN_CMPNEH,
RS6000_BTI_bool_V8HI, RS6000_BTI_bool_V8HI,
RS6000_BTI_bool_V8HI, 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/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 } } */
--
1.9.1