This patch extends the compare/and splitting patterns for FP comparisons
from SVE_FULL_F to SVE_F.

gcc/ChangeLog:

        * config/aarch64/aarch64-sve.md (*fcm<cmp_op><mode>_and_combine):
        Extend to SVE_F.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/sve/unpacked_fcm_1.c: Allow other tests
        to define TEST_FCM (new ifdef guard).
        * gcc.target/aarch64/sve/unpacked_fcm_and_1.c: New test.
---
 gcc/config/aarch64/aarch64-sve.md              |  8 ++++----
 .../gcc.target/aarch64/sve/unpacked_fcm_1.c    |  2 ++
 .../aarch64/sve/unpacked_fcm_and_1.c           | 18 ++++++++++++++++++
 3 files changed, 24 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_and_1.c

diff --git a/gcc/config/aarch64/aarch64-sve.md 
b/gcc/config/aarch64/aarch64-sve.md
index 6c5129bc0c6..399d147c9a5 100644
--- a/gcc/config/aarch64/aarch64-sve.md
+++ b/gcc/config/aarch64/aarch64-sve.md
@@ -8653,8 +8653,8 @@
          (unspec:<VPRED>
            [(match_operand:<VPRED> 1)
             (const_int SVE_KNOWN_PTRUE)
-            (match_operand:SVE_FULL_F 2 "register_operand" "w, w")
-            (match_operand:SVE_FULL_F 3 "aarch64_simd_reg_or_zero" "Dz, w")]
+            (match_operand:SVE_F 2 "register_operand" "w, w")
+            (match_operand:SVE_F 3 "aarch64_simd_reg_or_zero" "Dz, w")]
            SVE_COND_FP_CMP_I0)
          (match_operand:<VPRED> 4 "register_operand" "Upl, Upl")))]
   "TARGET_SVE"
@@ -8676,8 +8676,8 @@
          (unspec:<VPRED>
            [(match_operand:<VPRED> 1)
             (const_int SVE_KNOWN_PTRUE)
-            (match_operand:SVE_FULL_F 2 "register_operand" "w")
-            (match_operand:SVE_FULL_F 3 "register_operand" "w")]
+            (match_operand:SVE_F 2 "register_operand" "w")
+            (match_operand:SVE_F 3 "register_operand" "w")]
            UNSPEC_COND_FCMUO)
          (match_operand:<VPRED> 4 "register_operand" "Upl")))]
   "TARGET_SVE"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_1.c 
b/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_1.c
index 7e39b79991b..bc02763df0b 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_1.c
@@ -20,6 +20,7 @@
 
 #define b_i b[i]
 
+#ifndef TEST_FCM
 #define TEST_FCM(TYPE0, TYPE1, CMP, RHS, COUNT)                      \
   void                                                       \
   f_##TYPE0##_##TYPE1##_##CMP##_##RHS (TYPE0 *__restrict out, \
@@ -29,6 +30,7 @@
     for (unsigned int i = 0; i < COUNT; i++)                 \
       out[i] = CMP (a[i], RHS) ? 3 : out[i];                 \
   }
+#endif
 
 #define TEST_CC_REG(CMP)                     \
   TEST_FCM (uint64_t, float, CMP, b_i, 32)    \
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_and_1.c 
b/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_and_1.c
new file mode 100644
index 00000000000..2b88cc14a98
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpacked_fcm_and_1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -msve-vector-bits=2048 
-fno-trapping-math" } */
+
+#define TEST_FCM(TYPE0, TYPE1, CMP, RHS, COUNT)                      \
+  void                                                       \
+  f_##TYPE0##_##TYPE1##_##CMP##_##RHS (TYPE0 *__restrict out, \
+                                       TYPE0 *__restrict p,   \
+                                      TYPE1 *__restrict a,   \
+                                      TYPE1 *__restrict b)   \
+  {                                                          \
+    for (unsigned int i = 0; i < COUNT; i++)                 \
+      if (p[i] && CMP (a[i], RHS))                           \
+       out[i] = 3;                                           \
+  }
+
+#include "unpacked_fcm_1.c"
+
+/* { dg-final { scan-assembler-not {\tand\t} } } */
-- 
2.34.1

Reply via email to