1 /* { dg-do run { target { aarch64_sve_hw } } } */
2 /* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
8 /* -ffast-math fuzz for PLUS. */
9 #define CMP__Float16(X, Y) ((X) >= (Y) * 0.875 && (X) <= (Y) * 1.125)
10 #define CMP_float(X, Y) ((X) == (Y))
11 #define CMP_double(X, Y) ((X) == (Y))
12 #define CMP_int8_t(X, Y) ((X) == (Y))
13 #define CMP_int16_t(X, Y) ((X) == (Y))
14 #define CMP_int32_t(X, Y) ((X) == (Y))
15 #define CMP_int64_t(X, Y) ((X) == (Y))
16 #define CMP_uint8_t(X, Y) ((X) == (Y))
17 #define CMP_uint16_t(X, Y) ((X) == (Y))
18 #define CMP_uint32_t(X, Y) ((X) == (Y))
19 #define CMP_uint64_t(X, Y) ((X) == (Y))
21 #define INIT_MATRIX(TYPE) \
22 TYPE mat[NROWS][NUM_ELEMS (TYPE)]; \
24 for (int i = 0; i < NROWS; i++) \
25 for (int j = 0; j < NUM_ELEMS (TYPE); j++) \
27 mat[i][j] = i + (j * 2) * (j & 1 ? 1 : -1); \
28 asm volatile ("" ::: "memory"); \
31 #define TEST_REDUC_PLUS(TYPE) \
34 reduc_plus_##TYPE (mat, r, NROWS); \
35 for (int i = 0; i < NROWS; i++) \
37 volatile TYPE r2 = 0; \
38 for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
40 if (!CMP_##TYPE (r[i], r2)) \
45 #define TEST_REDUC_MAXMIN(TYPE, NAME, CMP_OP) \
48 reduc_##NAME##_##TYPE (mat, r, NROWS); \
49 for (int i = 0; i < NROWS; i++) \
51 volatile TYPE r2 = mat[i][0]; \
52 for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
53 r2 = mat[i][j] CMP_OP r2 ? mat[i][j] : r2; \
59 #define TEST_REDUC_BITWISE(TYPE, NAME, BIT_OP) \
62 reduc_##NAME##_##TYPE (mat, r, NROWS); \
63 for (int i = 0; i < NROWS; i++) \
65 volatile TYPE r2 = mat[i][0]; \
66 for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
67 r2 BIT_OP mat[i][j]; \
75 TEST_PLUS (TEST_REDUC_PLUS
)
76 TEST_MAXMIN (TEST_REDUC_MAXMIN
)