| /* This file is used to reduce a number of runtime tests for AVX512F |
| and AVX512VL 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. */ |
| |
| #ifndef AVX512F_HELPER_INCLUDED |
| #define AVX512F_HELPER_INCLUDED |
| |
| #include "avx512-check.h" |
| |
| /* 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. */ |
| #ifndef DEFAULT_VALUE |
| #define DEFAULT_VALUE 117 |
| #endif |
| |
| #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) |
| MAKE_MASK_MERGE(i_ub, unsigned char) |
| MAKE_MASK_MERGE(i_uw, unsigned short) |
| MAKE_MASK_MERGE(i_ud, unsigned int) |
| MAKE_MASK_MERGE(i_uq, unsigned long long) |
| |
| #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) |
| MAKE_MASK_ZERO(i_ub, unsigned char) |
| MAKE_MASK_ZERO(i_uw, unsigned short) |
| MAKE_MASK_ZERO(i_ud, unsigned int) |
| MAKE_MASK_ZERO(i_uq, unsigned long long) |
| |
| |
| #define MASK_ZERO(TYPE) zero_masking_##TYPE |
| |
| |
| /* 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,) |
| |
| #ifndef AVX512VL |
| #define AVX512F_LEN 512 |
| #define AVX512F_LEN_HALF 256 |
| #endif |
| |
| #endif /* AVX512F_HELPER_INCLUDED */ |
| |
| /* Intrinsic being tested. It has different deffinitions, |
| depending on AVX512F_LEN, so it's outside include guards |
| and in undefed away to silence warnings. */ |
| #if defined INTRINSIC |
| #undef INTRINSIC |
| #endif |
| |
| #if AVX512F_LEN != 128 |
| #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME) |
| #else |
| #define INTRINSIC(NAME) _mm ## NAME |
| #endif |