blob: c4a0426e219408ea9050ffe908aaf31dcb343262 [file] [log] [blame]
/* { dg-do run { target { aarch64_sve_hw } } } */
/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
#include "reduc_2.c"
#define NROWS 53
/* -ffast-math fuzz for PLUS. */
#define CMP__Float16(X, Y) ((X) >= (Y) * 0.875 && (X) <= (Y) * 1.125)
#define CMP_float(X, Y) ((X) == (Y))
#define CMP_double(X, Y) ((X) == (Y))
#define CMP_int8_t(X, Y) ((X) == (Y))
#define CMP_int16_t(X, Y) ((X) == (Y))
#define CMP_int32_t(X, Y) ((X) == (Y))
#define CMP_int64_t(X, Y) ((X) == (Y))
#define CMP_uint8_t(X, Y) ((X) == (Y))
#define CMP_uint16_t(X, Y) ((X) == (Y))
#define CMP_uint32_t(X, Y) ((X) == (Y))
#define CMP_uint64_t(X, Y) ((X) == (Y))
#define INIT_MATRIX(TYPE) \
TYPE mat[NROWS][NUM_ELEMS (TYPE)]; \
TYPE r[NROWS]; \
for (int i = 0; i < NROWS; i++) \
for (int j = 0; j < NUM_ELEMS (TYPE); j++) \
{ \
mat[i][j] = i + (j * 2) * (j & 1 ? 1 : -1); \
asm volatile ("" ::: "memory"); \
}
#define TEST_REDUC_PLUS(TYPE) \
{ \
INIT_MATRIX (TYPE); \
reduc_plus_##TYPE (mat, r, NROWS); \
for (int i = 0; i < NROWS; i++) \
{ \
volatile TYPE r2 = 0; \
for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
r2 += mat[i][j]; \
if (!CMP_##TYPE (r[i], r2)) \
__builtin_abort (); \
} \
}
#define TEST_REDUC_MAXMIN(TYPE, NAME, CMP_OP) \
{ \
INIT_MATRIX (TYPE); \
reduc_##NAME##_##TYPE (mat, r, NROWS); \
for (int i = 0; i < NROWS; i++) \
{ \
volatile TYPE r2 = mat[i][0]; \
for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
r2 = mat[i][j] CMP_OP r2 ? mat[i][j] : r2; \
if (r[i] != r2) \
__builtin_abort (); \
} \
}
#define TEST_REDUC_BITWISE(TYPE, NAME, BIT_OP) \
{ \
INIT_MATRIX (TYPE); \
reduc_##NAME##_##TYPE (mat, r, NROWS); \
for (int i = 0; i < NROWS; i++) \
{ \
volatile TYPE r2 = mat[i][0]; \
for (int j = 0; j < NUM_ELEMS (TYPE); ++j) \
r2 BIT_OP mat[i][j]; \
if (r[i] != r2) \
__builtin_abort (); \
} \
}
int main ()
{
TEST_PLUS (TEST_REDUC_PLUS)
TEST_MAXMIN (TEST_REDUC_MAXMIN)
return 0;
}