Add support for conditional reductions using SVE CLASTB
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / sve / vec_bool_cmp_1.c
blob3aa9086c17850da51e70535cc63c47f5248390fd
1 /* { dg-do compile } */
2 /* { dg-options "-O2 -ftree-vectorize" } */
4 #include <stdint.h>
5 #include <stdbool.h>
7 #define VEC_BOOL(NAME, OP, VARTYPE, INDUCTYPE) \
8 void __attribute__ ((noinline, noclone)) \
9 vec_bool_##NAME##_##VARTYPE##_##INDUCTYPE (VARTYPE *dst, VARTYPE *src, \
10 INDUCTYPE start, \
11 INDUCTYPE n, \
12 INDUCTYPE mask) \
13 { \
14 for (INDUCTYPE i = 0; i < n; i++) \
15 { \
16 bool lhs = i >= start; \
17 bool rhs = (i & mask) != 0x3D; \
18 if (lhs OP rhs) \
19 dst[i] = src[i]; \
20 } \
23 #define TEST_OP(T, NAME, OP) \
24 T (NAME, OP, uint8_t, uint8_t) \
25 T (NAME, OP, uint16_t, uint16_t) \
26 T (NAME, OP, uint32_t, uint32_t) \
27 T (NAME, OP, uint64_t, uint64_t) \
28 T (NAME, OP, float, uint32_t) \
29 T (NAME, OP, double, uint64_t)
31 #define TEST_ALL(T) \
32 TEST_OP (T, cmpeq, ==) \
33 TEST_OP (T, cmpne, !=)
35 TEST_ALL (VEC_BOOL)
37 /* Both cmpne and cmpeq loops will contain an exclusive predicate or. */
38 /* { dg-final { scan-assembler-times {\teors?\tp[0-9]*\.b, p[0-7]/z, p[0-9]*\.b, p[0-9]*\.b\n} 12 } } */
39 /* cmpeq will also contain a masked predicate not operation, which gets
40 folded to BIC. */
41 /* { dg-final { scan-assembler-times {\tbic\tp[0-9]+\.b, p[0-7]/z, p[0-9]+\.b, p[0-9]+\.b\n} 6 } } */