#define PASS_ARRAY(...) {__VA_ARGS__} #define SETUP_TEST_CASE_VEC(I, INTRINSIC, BASE_TYPE, TYPE1, TYPE2, \ VALS1, VALS2, EXPS, LEN, FM, Q_LD, Q_ST, \ V1, V2) \ do \ { \ int i##I; \ BASE_TYPE vec##I##_1_data[] = VALS1; \ BASE_TYPE vec##I##_2_data[] = VALS2; \ V1 TYPE1 vec##I##_1 = vld1##Q_LD##_##FM (vec##I##_1_data); \ V2 TYPE2 vec##I##_2 = vld1##Q_LD##_##FM (vec##I##_2_data); \ TYPE1 actual##I##_v = INTRINSIC (vec##I##_1, vec##I##_2); \ volatile BASE_TYPE expected##I[] = EXPS; \ BASE_TYPE actual##I[LEN]; \ vst1##Q_ST##_##FM (actual##I, actual##I##_v); \ for (i##I = 0; i##I < LEN; ++i##I) \ if (actual##I[i##I] != expected##I[i##I]) \ abort (); \ } \ while (0) \ #define SETUP_TEST_CASE_SCALAR(I, INTRINSIC, TYPE, VAL1, VAL2, EXP) \ do \ { \ TYPE vec_##I##_1 = VAL1; \ TYPE vec_##I##_2 = VAL2; \ TYPE expected_##I = EXP; \ volatile TYPE actual_##I = INTRINSIC (vec_##I##_1, vec_##I##_2); \ if (actual_##I != expected_##I) \ abort (); \ } \ while (0) \ /* Functions used to return values that won't be optimised away. */ float32_t __attribute__ ((noinline)) foo32 () { return 1.0; } float64_t __attribute__ ((noinline)) foo64 () { return 1.0; }