Add support for conditional reductions using SVE CLASTB
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / sve / vcond_4_run.c
blobc345087726c9b2dce098264399bbf2aa252f1e04
1 /* { dg-do run { target aarch64_sve_hw } } */
2 /* { dg-options "-O2 -ftree-vectorize" } */
3 /* { dg-require-effective-target fenv_exceptions } */
5 #ifndef TEST_EXCEPTIONS
6 #define TEST_EXCEPTIONS 1
7 #endif
9 #include <fenv.h>
11 #include "vcond_4.c"
13 #define N 401
15 #define RUN_LOOP(TYPE1, TYPE2, CMP, EXPECT_INVALID) \
16 { \
17 TYPE1 dest1[N], dest2[N], dest3[N], src[N]; \
18 TYPE2 a[N], b[N]; \
19 for (int i = 0; i < N; ++i) \
20 { \
21 src[i] = i * i; \
22 if (i % 5 == 0) \
23 a[i] = 0; \
24 else if (i % 3) \
25 a[i] = i * 0.1; \
26 else \
27 a[i] = i; \
28 if (i % 7 == 0) \
29 b[i] = __builtin_nan (""); \
30 else if (i % 6) \
31 b[i] = i * 0.1; \
32 else \
33 b[i] = i; \
34 asm volatile ("" ::: "memory"); \
35 } \
36 feclearexcept (FE_ALL_EXCEPT); \
37 test_##TYPE1##_##TYPE2##_##CMP##_var (dest1, src, 11, a, b, N); \
38 test_##TYPE1##_##TYPE2##_##CMP##_zero (dest2, src, 22, a, N); \
39 test_##TYPE1##_##TYPE2##_##CMP##_sel (dest3, 33, 44, a, 9, N); \
40 if (TEST_EXCEPTIONS \
41 && !fetestexcept (FE_INVALID) != !(EXPECT_INVALID)) \
42 __builtin_abort (); \
43 for (int i = 0; i < N; ++i) \
44 { \
45 if (dest1[i] != (CMP (a[i], b[i]) ? src[i] : 11)) \
46 __builtin_abort (); \
47 if (dest2[i] != (CMP (a[i], 0) ? src[i] : 22)) \
48 __builtin_abort (); \
49 if (dest3[i] != (CMP (a[i], 9) ? 33 : 44)) \
50 __builtin_abort (); \
51 } \
54 #define RUN_CMP(CMP, EXPECT_INVALID) \
55 RUN_LOOP (int32_t, float, CMP, EXPECT_INVALID) \
56 RUN_LOOP (uint32_t, float, CMP, EXPECT_INVALID) \
57 RUN_LOOP (int64_t, float, CMP, EXPECT_INVALID) \
58 RUN_LOOP (uint64_t, float, CMP, EXPECT_INVALID) \
59 RUN_LOOP (float, float, CMP, EXPECT_INVALID) \
60 RUN_LOOP (int32_t, double, CMP, EXPECT_INVALID) \
61 RUN_LOOP (uint32_t, double, CMP, EXPECT_INVALID) \
62 RUN_LOOP (int64_t, double, CMP, EXPECT_INVALID) \
63 RUN_LOOP (uint64_t, double, CMP, EXPECT_INVALID) \
64 RUN_LOOP (double, double, CMP, EXPECT_INVALID)
66 int __attribute__ ((optimize (1)))
67 main (void)
69 RUN_CMP (eq, 0)
70 RUN_CMP (ne, 0)
71 RUN_CMP (olt, 1)
72 RUN_CMP (ole, 1)
73 RUN_CMP (oge, 1)
74 RUN_CMP (ogt, 1)
75 RUN_CMP (ordered, 0)
76 RUN_CMP (unordered, 0)
77 RUN_CMP (ueq, 0)
78 RUN_CMP (ult, 0)
79 RUN_CMP (ule, 0)
80 RUN_CMP (uge, 0)
81 RUN_CMP (ugt, 0)
82 RUN_CMP (nueq, 0)
83 RUN_CMP (nult, 0)
84 RUN_CMP (nule, 0)
85 RUN_CMP (nuge, 0)
86 RUN_CMP (nugt, 0)
87 return 0;