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