Add support for conditional reductions using SVE CLASTB
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / sve / vcond_2_run.c
blob5432f596d8f985d30b9538a31e7276fe62abbe70
1 /* { dg-do run { target aarch64_sve_hw } } */
2 /* { dg-options "-O2 -ftree-vectorize" } */
4 #include "vcond_2.c"
6 #define N 97
8 #define TEST_VCOND_VAR(DATA_TYPE, CMP_TYPE, COND, SUFFIX) \
9 { \
10 DATA_TYPE x[N], y[N], r[N]; \
11 CMP_TYPE a[N], b[N]; \
12 for (int i = 0; i < N; ++i) \
13 { \
14 x[i] = i; \
15 y[i] = (i & 1) + 5; \
16 a[i] = i - N / 3; \
17 b[i] = N - N / 3 - i; \
18 asm volatile ("" ::: "memory"); \
19 } \
20 vcond_var_##CMP_TYPE##_##SUFFIX (r, x, y, a, b, N); \
21 for (int i = 0; i < N; ++i) \
22 if (r[i] != (a[i] COND b[i] ? x[i] : y[i])) \
23 __builtin_abort (); \
26 #define TEST_VCOND_IMM(DATA_TYPE, CMP_TYPE, COND, IMM, SUFFIX) \
27 { \
28 DATA_TYPE x[N], y[N], r[N]; \
29 CMP_TYPE a[N]; \
30 for (int i = 0; i < N; ++i) \
31 { \
32 x[i] = i; \
33 y[i] = (i & 1) + 5; \
34 a[i] = IMM - N / 3 + i; \
35 asm volatile ("" ::: "memory"); \
36 } \
37 vcond_imm_##CMP_TYPE##_##SUFFIX (r, x, y, a, N); \
38 for (int i = 0; i < N; ++i) \
39 if (r[i] != (a[i] COND (CMP_TYPE) IMM ? x[i] : y[i])) \
40 __builtin_abort (); \
43 int __attribute__ ((optimize (1)))
44 main (int argc, char **argv)
46 TEST_VAR_ALL (TEST_VCOND_VAR)
47 TEST_IMM_ALL (TEST_VCOND_IMM)
48 return 0;