summaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorKelvin Nilsen <kelvin@gcc.gnu.org>2020-05-11 16:25:03 -0500
committerBill Schmidt <wschmidt@linux.ibm.com>2020-05-11 16:25:03 -0500
commit840ac85ced0695fefecee433327e4298b4adb20a (patch)
tree2ead3d269a344ed5865c2b409fdf5830c530eab1 /gcc/testsuite
parent2202299c2aa69385ca5e7574914dabc84fb6a40a (diff)
rs6000: Add xxeval and vec_ternarylogic
Add the xxeval insn and access it via the vec_ternarylogic built-in function. As part of this, add support to the built-in function infrastructure for functions that take four arguments. [gcc] 2020-05-11 Kelvin Nilsen <wschmidt@linux.ibm.com> * config/rs6000/altivec.h (vec_ternarylogic): New #define. * config/rs6000/altivec.md (UNSPEC_XXEVAL): New constant. (xxeval): New insn. * config/rs6000/predicates.md (u8bit_cint_operand): New predicate. * config/rs6000/rs6000-builtin.def: Add handling of new macro RS6000_BUILTIN_4. (BU_FUTURE_V_4): New macro. Use it. (BU_FUTURE_OVERLOAD_4): Likewise. * config/rs6000/rs6000-c.c (altivec_build_resolved_builtin): Add handling for quaternary built-in functions. (altivec_resolve_overloaded_builtin): Add special-case handling for __builtin_vec_xxeval. * config/rs6000/rs6000-call.c: Add handling of new macro RS6000_BUILTIN_4 in initialization of rs6000_builtin_info, bdesc0_arg, bdesc1_arg, bdesc2_arg, bdesc_3arg, bdesc_altivec_preds, bdesc_abs, and bdesc_htm arrays. (altivec_overloaded_builtins): Add definitions for FUTURE_BUILTIN_VEC_XXEVAL. (bdesc_4arg): New array. (htm_expand_builtin): Add handling for quaternary built-in functions. (rs6000_expand_quaternop_builtin): New function. (rs6000_expand_builtin): Add handling for quaternary built-in functions. (rs6000_init_builtins): Initialize builtin_mode_to_type entries for unsigned QImode and unsigned HImode. (builtin_quaternary_function_type): New function. (rs6000_common_init_builtins): Add handling of quaternary operations. * config/rs6000/rs6000.h (RS6000_BTC_QUATERNARY): New defined constant. (RS6000_BTC_PREDICATE): Change value of constant. (RS6000_BTC_ABS): Likewise. (rs6000_builtins): Add support for new macro RS6000_BUILTIN_4. * doc/extend.texi (PowerPC AltiVec Built-In Functions Available for a Future Architecture): Add description of vec_ternarylogic built-in function. [gcc/testsuite] 2020-05-11 Kelvin Nilsen <wschmidt@linux.ibm.com> * gcc.target/powerpc/vec-ternarylogic-0.c: New. * gcc.target/powerpc/vec-ternarylogic-1.c: New. * gcc.target/powerpc/vec-ternarylogic-10.c: New. * gcc.target/powerpc/vec-ternarylogic-2.c: New. * gcc.target/powerpc/vec-ternarylogic-3.c: New. * gcc.target/powerpc/vec-ternarylogic-4.c: New. * gcc.target/powerpc/vec-ternarylogic-5.c: New. * gcc.target/powerpc/vec-ternarylogic-6.c: New. * gcc.target/powerpc/vec-ternarylogic-7.c: New. * gcc.target/powerpc/vec-ternarylogic-8.c: New. * gcc.target/powerpc/vec-ternarylogic-9.c: New.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog14
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-0.c120
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-1.c119
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-10.c129
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-2.c105
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-3.c106
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-4.c104
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-5.c103
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-6.c104
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-7.c103
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-8.c128
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-9.c129
12 files changed, 1264 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 74e83323e6e..0c54c522b7a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2020-05-11 Kelvin Nilsen <wschmidt@linux.ibm.com>
+
+ * gcc.target/powerpc/vec-ternarylogic-0.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-1.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-10.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-2.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-3.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-4.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-5.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-6.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-7.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-8.c: New.
+ * gcc.target/powerpc/vec-ternarylogic-9.c: New.
+
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/pdep-0.c: New.
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-0.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-0.c
new file mode 100644
index 00000000000..bc1d05c008d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-0.c
@@ -0,0 +1,120 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned char intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11100101 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned char intended =
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 16; l++)
+ {
+ for (int m = 0; m < 8; m++)
+ {
+ unsigned char bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11110011 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned char intended = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ for (int i = 0; i < 16; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, char *argv [])
+{
+ vector unsigned char a_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+ vector unsigned char b_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+ vector unsigned char c_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-1.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-1.c
new file mode 100644
index 00000000000..8beb80fe60a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-1.c
@@ -0,0 +1,119 @@
+/* { dg-do run} */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned char intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11100101 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned char intended =
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 16; l++)
+ {
+ for (int m = 0; m < 8; m++)
+ {
+ unsigned char bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11110011 (vector unsigned char a_sources [],
+ vector unsigned char b_sources [],
+ vector unsigned char c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned char a = a_sources [i];
+ vector unsigned char b = b_sources [j];
+ vector unsigned char c = c_sources [k];
+ vector unsigned char result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned char intended = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ for (int i = 0; i < 16; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, char *argv [])
+{
+ vector unsigned char a_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+ vector unsigned char b_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+ vector unsigned char c_sources [NumSamples] = {
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 },
+ { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ { 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7,
+ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-10.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-10.c
new file mode 100644
index 00000000000..868fb23c01b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-10.c
@@ -0,0 +1,129 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+/* vec_all_eq not yet supported for arguments of type
+ vector unsigned __int128. */
+int
+vector_equal (vector unsigned __int128 a, vector unsigned __int128 b)
+{
+ return a[0] == b[0];
+}
+
+void
+doTests00000001 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result;
+ result = vec_ternarylogic (a, b, c, 0xfff); /* { dg-error "8-bit unsigned literal" } */
+ vector unsigned __int128 intended = (a & b & c);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11100101 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result;
+ result = vec_ternarylogic (a, b, c, -1); /* { dg-error "8-bit unsigned literal" } */
+ vector unsigned __int128 intended = { 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 1; l++)
+ {
+ for (int m = 0; m < 128; m++)
+ {
+ unsigned __int128 bit_selector = 0x01;
+ bit_selector = bit_selector << m;
+
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11110011 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result;
+ result = vec_ternarylogic (a, b, c, i); /* { dg-error "8-bit unsigned literal" } */
+ vector unsigned __int128 intended = { 0 };
+ for (int i = 0; i < 1; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, int *argv [])
+{
+ vector unsigned __int128 a_sources [NumSamples];
+ vector unsigned __int128 b_sources [NumSamples];
+ vector unsigned __int128 c_sources [NumSamples];
+
+ a_sources [0][0] = 0x0123456789abcdefull;
+ a_sources [0][0] = a_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ a_sources [1][0] = 0x5555555555555555ull;
+ a_sources [1][0] = a_sources [1][0] << 64 | 0xffffffffffffffffull;
+ a_sources [2][0] = 0xcccccccc55555555ull;
+ a_sources [2][0] = a_sources [2][0] << 64 | 0x0000000000000000ull;
+ a_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ a_sources [3][0] = a_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ b_sources [0][0] = 0x0123456789abcdefull;
+ b_sources [0][0] = b_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ b_sources [1][0] = 0x5555555555555555ull;
+ b_sources [1][0] = b_sources [1][0] << 64 | 0xffffffffffffffffull;
+ b_sources [2][0] = 0xcccccccc55555555ull;
+ b_sources [2][0] = b_sources [2][0] << 64 | 0x0000000000000000ull;
+ b_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ b_sources [3][0] = b_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ c_sources [0][0] = 0x0123456789abcdefull;
+ c_sources [0][0] = c_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ c_sources [1][0] = 0x5555555555555555ull;
+ c_sources [1][0] = c_sources [1][0] << 64 | 0xffffffffffffffffull;
+ c_sources [2][0] = 0xcccccccc55555555ull;
+ c_sources [2][0] = c_sources [2][0] << 64 | 0x0000000000000000ull;
+ c_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ c_sources [3][0] = c_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-2.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-2.c
new file mode 100644
index 00000000000..0d482b8e672
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-2.c
@@ -0,0 +1,105 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned short intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned short intended =
+ { 0, 0, 0, 0, 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 8; l++)
+ {
+ for (int m = 0; m < 16; m++)
+ {
+ unsigned short int bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned short intended = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ for (int i = 0; i < 8; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, short *argv [])
+{
+ vector unsigned short int a_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+ vector unsigned short int b_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+ vector unsigned short int c_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-3.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-3.c
new file mode 100644
index 00000000000..a7245e51da2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-3.c
@@ -0,0 +1,106 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned short intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned short intended =
+ { 0, 0, 0, 0, 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 8; l++)
+ {
+ for (int m = 0; m < 16; m++)
+ {
+ unsigned short int bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned short int a_sources [],
+ vector unsigned short int b_sources [],
+ vector unsigned short int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned short a = a_sources [i];
+ vector unsigned short b = b_sources [j];
+ vector unsigned short c = c_sources [k];
+ vector unsigned short result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned short intended = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ for (int i = 0; i < 8; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, short *argv [])
+{
+ vector unsigned short int a_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+ vector unsigned short int b_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+ vector unsigned short int c_sources [NumSamples] = {
+ { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
+ { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
+ { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
+ { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-4.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-4.c
new file mode 100644
index 00000000000..dbd9ffb856e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-4.c
@@ -0,0 +1,104 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned int intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned int intended = { 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 4; l++)
+ {
+ for (int m = 0; m < 32; m++)
+ {
+ unsigned int bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned int intended = { 0, 0, 0, 0 };
+ for (int i = 0; i < 4; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, int *argv [])
+{
+ vector unsigned int a_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+ vector unsigned int b_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+ vector unsigned int c_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-5.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-5.c
new file mode 100644
index 00000000000..4d5d8e5e0d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-5.c
@@ -0,0 +1,103 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned int intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned int intended = { 0, 0, 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 4; l++)
+ {
+ for (int m = 0; m < 32; m++)
+ {
+ unsigned int bit_selector = (0x01 << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned int a_sources [],
+ vector unsigned int b_sources [],
+ vector unsigned int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned int a = a_sources [i];
+ vector unsigned int b = b_sources [j];
+ vector unsigned int c = c_sources [k];
+ vector unsigned int result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned int intended = { 0, 0, 0, 0 };
+ for (int i = 0; i < 4; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, int *argv [])
+{
+ vector unsigned int a_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+ vector unsigned int b_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+ vector unsigned int c_sources [NumSamples] = {
+ { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
+ { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
+ { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
+ { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-6.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-6.c
new file mode 100644
index 00000000000..0114bacd5fc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-6.c
@@ -0,0 +1,104 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned long long intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned long long intended = { 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 2; l++)
+ {
+ for (int m = 0; m < 64; m++)
+ {
+ unsigned long long int bit_selector = (0x01ll << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= (0x01ll << m);
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned long long intended = { 0, 0 };
+ intended [0] = b [0] | ~(a [0] & c [0]);
+ intended [1] = b [1] | ~(a [1] & c [1]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, char *argv [])
+{
+ vector unsigned long long int a_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+ vector unsigned long long int b_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+ vector unsigned long long int c_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-7.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-7.c
new file mode 100644
index 00000000000..27ac4a22866
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-7.c
@@ -0,0 +1,103 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+void
+doTests00000001 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned long long intended = (a & b & c);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11100101 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned long long intended = { 0, 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 2; l++)
+ {
+ for (int m = 0; m < 64; m++)
+ {
+ unsigned long long int bit_selector = (0x01ll << m);
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= (0x01ll << m);
+ }
+ }
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+void doTests11110011 (vector unsigned long long int a_sources [],
+ vector unsigned long long int b_sources [],
+ vector unsigned long long int c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned long long a = a_sources [i];
+ vector unsigned long long b = b_sources [j];
+ vector unsigned long long c = c_sources [k];
+ vector unsigned long long result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned long long intended = { 0, 0 };
+ intended [0] = b [0] | ~(a [0] & c [0]);
+ intended [1] = b [1] | ~(a [1] & c [1]);
+ if (!vec_all_eq (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, char *argv [])
+{
+ vector unsigned long long int a_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+ vector unsigned long long int b_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+ vector unsigned long long int c_sources [NumSamples] = {
+ { 0x0123456789abcdef, 0x123456789abcdef0 },
+ { 0x5555555555555555, 0xffffffffffffffff },
+ { 0xcccccccc55555555, 0x0000000000000000 },
+ { 0xe7e7e7e7e7e7e7e7, 0x6969696969696969 },
+ };
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-8.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-8.c
new file mode 100644
index 00000000000..0d6b9e74239
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-8.c
@@ -0,0 +1,128 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+/* vec_all_eq not yet supported for arguments of type
+ vector unsigned __int128. */
+int
+vector_equal (vector unsigned __int128 a, vector unsigned __int128 b)
+{
+ return a[0] == b[0];
+}
+
+void
+doTests00000001 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned __int128 intended = (a & b & c);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11100101 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned __int128 intended = { 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 1; l++)
+ {
+ for (int m = 0; m < 128; m++)
+ {
+ unsigned __int128 bit_selector = 0x01;
+ bit_selector = bit_selector << m;
+
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11110011 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned __int128 intended = { 0 };
+ for (int i = 0; i < 1; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, int *argv [])
+{
+ vector unsigned __int128 a_sources [NumSamples];
+ vector unsigned __int128 b_sources [NumSamples];
+ vector unsigned __int128 c_sources [NumSamples];
+
+ a_sources [0][0] = 0x0123456789abcdefull;
+ a_sources [0][0] = a_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ a_sources [1][0] = 0x5555555555555555ull;
+ a_sources [1][0] = a_sources [1][0] << 64 | 0xffffffffffffffffull;
+ a_sources [2][0] = 0xcccccccc55555555ull;
+ a_sources [2][0] = a_sources [2][0] << 64 | 0x0000000000000000ull;
+ a_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ a_sources [3][0] = a_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ b_sources [0][0] = 0x0123456789abcdefull;
+ b_sources [0][0] = b_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ b_sources [1][0] = 0x5555555555555555ull;
+ b_sources [1][0] = b_sources [1][0] << 64 | 0xffffffffffffffffull;
+ b_sources [2][0] = 0xcccccccc55555555ull;
+ b_sources [2][0] = b_sources [2][0] << 64 | 0x0000000000000000ull;
+ b_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ b_sources [3][0] = b_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ c_sources [0][0] = 0x0123456789abcdefull;
+ c_sources [0][0] = c_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ c_sources [1][0] = 0x5555555555555555ull;
+ c_sources [1][0] = c_sources [1][0] << 64 | 0xffffffffffffffffull;
+ c_sources [2][0] = 0xcccccccc55555555ull;
+ c_sources [2][0] = c_sources [2][0] << 64 | 0x0000000000000000ull;
+ c_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ c_sources [3][0] = c_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-9.c b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-9.c
new file mode 100644
index 00000000000..b6113596867
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/vec-ternarylogic-9.c
@@ -0,0 +1,129 @@
+/* { dg-do run } */
+/* { dg-require-effective-target powerpc_future_hw } */
+/* { dg-options "-mdejagnu-cpu=future" } */
+
+#include <altivec.h>
+
+extern void abort (void);
+
+#define NumSamples 4
+
+/* vec_all_eq not yet supported for arguments of type
+ vector unsigned __int128. */
+int
+vector_equal (vector unsigned __int128 a, vector unsigned __int128 b)
+{
+ return a[0] == b[0];
+}
+
+void
+doTests00000001 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0x01);
+ vector unsigned __int128 intended = (a & b & c);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11100101 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0xe5);
+ vector unsigned __int128 intended = { 0 };
+ // Supposed to be a ? c: nand (b,c)
+ for (int l = 0; l < 1; l++)
+ {
+ for (int m = 0; m < 128; m++)
+ {
+ unsigned __int128 bit_selector = 0x01;
+ bit_selector = bit_selector << m;
+
+ if (a[l] & bit_selector)
+ intended [l] |= c [l] & bit_selector;
+ else if ((b [l] & c [l] & bit_selector) == 0)
+ intended [l] |= bit_selector;
+ }
+ }
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+void
+doTests11110011 (vector unsigned __int128 a_sources [],
+ vector unsigned __int128 b_sources [],
+ vector unsigned __int128 c_sources []) {
+ for (int i = 0; i < NumSamples; i++)
+ for (int j = 0; j < NumSamples; j++)
+ for (int k = 0; k < NumSamples; k++)
+ {
+ vector unsigned __int128 a = a_sources [i];
+ vector unsigned __int128 b = b_sources [j];
+ vector unsigned __int128 c = c_sources [k];
+ vector unsigned __int128 result = vec_ternarylogic (a, b, c, 0xfb);
+ vector unsigned __int128 intended = { 0 };
+ for (int i = 0; i < 1; i++)
+ intended [i] = b [i] | ~(a [i] & c [i]);
+ if (!vector_equal (result, intended))
+ abort ();
+ }
+}
+
+int main (int argc, int *argv [])
+{
+ vector unsigned __int128 a_sources [NumSamples];
+ vector unsigned __int128 b_sources [NumSamples];
+ vector unsigned __int128 c_sources [NumSamples];
+
+ a_sources [0][0] = 0x0123456789abcdefull;
+ a_sources [0][0] = a_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ a_sources [1][0] = 0x5555555555555555ull;
+ a_sources [1][0] = a_sources [1][0] << 64 | 0xffffffffffffffffull;
+ a_sources [2][0] = 0xcccccccc55555555ull;
+ a_sources [2][0] = a_sources [2][0] << 64 | 0x0000000000000000ull;
+ a_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ a_sources [3][0] = a_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ b_sources [0][0] = 0x0123456789abcdefull;
+ b_sources [0][0] = b_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ b_sources [1][0] = 0x5555555555555555ull;
+ b_sources [1][0] = b_sources [1][0] << 64 | 0xffffffffffffffffull;
+ b_sources [2][0] = 0xcccccccc55555555ull;
+ b_sources [2][0] = b_sources [2][0] << 64 | 0x0000000000000000ull;
+ b_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ b_sources [3][0] = b_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ c_sources [0][0] = 0x0123456789abcdefull;
+ c_sources [0][0] = c_sources [0][0] << 64 | 0x123456789abcdef0ull;
+ c_sources [1][0] = 0x5555555555555555ull;
+ c_sources [1][0] = c_sources [1][0] << 64 | 0xffffffffffffffffull;
+ c_sources [2][0] = 0xcccccccc55555555ull;
+ c_sources [2][0] = c_sources [2][0] << 64 | 0x0000000000000000ull;
+ c_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
+ c_sources [3][0] = c_sources [3][0] << 64 | 0x6969696969696969ull;
+
+ doTests00000001 (a_sources, b_sources, c_sources);
+ doTests11100101 (a_sources, b_sources, c_sources);
+ doTests11110011 (a_sources, b_sources, c_sources);
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler {\mxxeval\M} } } */