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
15 #define RUN_LOOP(TYPE1, TYPE2, CMP, EXPECT_INVALID) \
17 TYPE1 dest1[N], dest2[N], dest3[N], src[N]; \
19 for (int i = 0; i < N; ++i) \
29 b[i] = __builtin_nan (""); \
34 asm volatile ("" ::: "memory"); \
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); \
41 && !fetestexcept (FE_INVALID) != !(EXPECT_INVALID)) \
43 for (int i = 0; i < N; ++i) \
45 if (dest1[i] != (CMP (a[i], b[i]) ? src[i] : 11)) \
47 if (dest2[i] != (CMP (a[i], 0) ? src[i] : 22)) \
49 if (dest3[i] != (CMP (a[i], 9) ? 33 : 44)) \
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)))
76 RUN_CMP (unordered
, 0)