From: Stefan Schulze Frielinghaus <[email protected]>

Starting with VXE3, 128-bit integer compares are natively supported.
For older machines those compares are emulated via
*vec_cmpeq<mode><mode>_nocc_emu and *vec_cmpgt<mode><mode>_nocc_emu and
*vec_cmpgtu<mode><mode>_nocc_emu.  The latter was missing !TARGET_VXE3
in the condition which resulted in emulating unsigned greater-than
compares instead of making use of the new instructions enabled by
r15-7051.

        PR target/122781

gcc/ChangeLog:

        * config/s390/vector.md: Don't emulate vec_cmpgtu for 128-bit
        integers for VXE3.

gcc/testsuite/ChangeLog:

        * gcc.target/s390/vxe3/vcmp-1.c: New test.
---
 gcc/config/s390/vector.md                   |  2 +-
 gcc/testsuite/gcc.target/s390/vxe3/vcmp-1.c | 42 +++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/vcmp-1.c

diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 4b4957ec1ad..f0be6f10c1a 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -2365,7 +2365,7 @@
   [(set (match_operand:VI_HW_T              0 "register_operand" "=v")
        (gtu:VI_HW_T (match_operand:VI_HW_T 1 "register_operand"  "v")
                     (match_operand:VI_HW_T 2 "register_operand"  "v")))]
-  "TARGET_VX"
+  "TARGET_VX && !TARGET_VXE3"
   "#"
   "&& can_create_pseudo_p ()"
   [(set (match_dup 3)
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/vcmp-1.c 
b/gcc/testsuite/gcc.target/s390/vxe3/vcmp-1.c
new file mode 100644
index 00000000000..8fbc0ec0535
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/vcmp-1.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+typedef __int128 __attribute__ ((vector_size (16))) V1TI;
+typedef unsigned __int128 __attribute__ ((vector_size (16))) UV1TI;
+
+/*
+** cmpeq:
+**     vceqq   %v24,%v24,%v26
+**     br      %r14
+*/
+
+V1TI
+cmpeq (V1TI x, V1TI y)
+{
+  return x == y;
+}
+
+/*
+** cmpgt:
+**     vchq    %v24,%v24,%v26
+**     br      %r14
+*/
+
+V1TI
+cmpgt (V1TI x, V1TI y)
+{
+  return x > y;
+}
+
+/*
+** cmpgtu:
+**     vchlq   %v24,%v24,%v26
+**     br      %r14
+*/
+
+V1TI
+cmpgtu (UV1TI x, UV1TI y)
+{
+  return x > y;
+}
-- 
2.52.0

Reply via email to