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.
[(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)
--- /dev/null
+/* { 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;
+}