| /* This file is used to reduce a number of runtime tests for AVX512F |
| instructions. Idea is to create one file per instruction - |
| avx512f-insn-2.c - using defines from this file instead of intrinsic |
| name, vector length etc. Then dg-options are set with appropriate |
| -Dwhatever options in that .c file producing tests for specific |
| length. */ |
| |
| #if defined (AVX512F) |
| #include "avx512f-check.h" |
| #elif defined (AVX512ER) |
| #include "avx512er-check.h" |
| #elif defined (AVX512CD) |
| #include "avx512cd-check.h" |
| #endif |
| |
| /* Macros expansion. */ |
| #define CONCAT(a,b,c) a ## b ## c |
| #define EVAL(a,b,c) CONCAT(a,b,c) |
| |
| /* Value to be written into destination. |
| We have one value for all types so it must be small enough |
| to fit into signed char. */ |
| #define DEFAULT_VALUE 117 |
| |
| #define MAKE_MASK_MERGE(NAME, TYPE) \ |
| static void \ |
| __attribute__((noinline, unused)) \ |
| merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \ |
| { \ |
| int i; \ |
| for (i = 0; i < size; i++) \ |
| { \ |
| arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \ |
| } \ |
| } |
| |
| MAKE_MASK_MERGE(i_b, char) |
| MAKE_MASK_MERGE(i_w, short) |
| MAKE_MASK_MERGE(i_d, int) |
| MAKE_MASK_MERGE(i_q, long long) |
| MAKE_MASK_MERGE(, float) |
| MAKE_MASK_MERGE(d, double) |
| |
| #define MASK_MERGE(TYPE) merge_masking_##TYPE |
| |
| #define MAKE_MASK_ZERO(NAME, TYPE) \ |
| static void \ |
| __attribute__((noinline, unused)) \ |
| zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \ |
| { \ |
| int i; \ |
| for (i = 0; i < size; i++) \ |
| { \ |
| arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \ |
| } \ |
| } |
| |
| MAKE_MASK_ZERO(i_b, char) |
| MAKE_MASK_ZERO(i_w, short) |
| MAKE_MASK_ZERO(i_d, int) |
| MAKE_MASK_ZERO(i_q, long long) |
| MAKE_MASK_ZERO(, float) |
| MAKE_MASK_ZERO(d, double) |
| |
| #define MASK_ZERO(TYPE) zero_masking_##TYPE |
| |
| /* Intrinsic being tested. */ |
| #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME) |
| /* Unions used for testing (for example union512d, union256d etc.). */ |
| #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME) |
| /* Corresponding union check. */ |
| #define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME) |
| /* Corresponding fp union check. */ |
| #define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME) |
| /* Corresponding rough union check. */ |
| #define UNION_ROUGH_CHECK(SIZE, NAME) \ |
| EVAL(check_rough_union, SIZE, NAME) |
| /* Function which tests intrinsic for given length. */ |
| #define TEST EVAL(test_, AVX512F_LEN,) |
| /* Function which calculates result. */ |
| #define CALC EVAL(calc_, AVX512F_LEN,) |
| |
| #define AVX512F_LEN 512 |
| #define AVX512F_LEN_HALF 256 |
| static void test_512 (); |
| |
| #if defined (AVX512F) |
| void |
| avx512f_test (void) { test_512 (); } |
| #elif defined (AVX512CD) |
| void |
| avx512cd_test (void) { test_512 (); } |
| #elif defined (AVX512ER) |
| void |
| avx512er_test (void) { test_512 (); } |
| #endif |