Viewing file: reduc_2_run.c (2.11 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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; }
|