PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512f-helper.h
blob72982f95aed7c36348bb21bf67afe0fa385d3aee
1 /* This file is used to reduce a number of runtime tests for AVX512F
2 and AVX512VL instructions. Idea is to create one file per instruction -
3 avx512f-insn-2.c - using defines from this file instead of intrinsic
4 name, vector length etc. Then dg-options are set with appropriate
5 -Dwhatever options in that .c file producing tests for specific
6 length. */
8 #ifndef AVX512F_HELPER_INCLUDED
9 #define AVX512F_HELPER_INCLUDED
11 #include "avx512-check.h"
13 /* Macros expansion. */
14 #define CONCAT(a,b,c) a ## b ## c
15 #define EVAL(a,b,c) CONCAT(a,b,c)
17 /* Value to be written into destination.
18 We have one value for all types so it must be small enough
19 to fit into signed char. */
20 #ifndef DEFAULT_VALUE
21 #define DEFAULT_VALUE 117
22 #endif
24 #define MAKE_MASK_MERGE(NAME, TYPE) \
25 static void \
26 __attribute__((noinline, unused)) \
27 merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
28 { \
29 int i; \
30 for (i = 0; i < size; i++) \
31 { \
32 arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \
33 } \
36 MAKE_MASK_MERGE(i_b, char)
37 MAKE_MASK_MERGE(i_w, short)
38 MAKE_MASK_MERGE(i_d, int)
39 MAKE_MASK_MERGE(i_q, long long)
40 MAKE_MASK_MERGE(, float)
41 MAKE_MASK_MERGE(d, double)
42 MAKE_MASK_MERGE(i_ub, unsigned char)
43 MAKE_MASK_MERGE(i_uw, unsigned short)
44 MAKE_MASK_MERGE(i_ud, unsigned int)
45 MAKE_MASK_MERGE(i_uq, unsigned long long)
47 #define MASK_MERGE(TYPE) merge_masking_##TYPE
49 #define MAKE_MASK_ZERO(NAME, TYPE) \
50 static void \
51 __attribute__((noinline, unused)) \
52 zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
53 { \
54 int i; \
55 for (i = 0; i < size; i++) \
56 { \
57 arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \
58 } \
61 MAKE_MASK_ZERO(i_b, char)
62 MAKE_MASK_ZERO(i_w, short)
63 MAKE_MASK_ZERO(i_d, int)
64 MAKE_MASK_ZERO(i_q, long long)
65 MAKE_MASK_ZERO(, float)
66 MAKE_MASK_ZERO(d, double)
67 MAKE_MASK_ZERO(i_ub, unsigned char)
68 MAKE_MASK_ZERO(i_uw, unsigned short)
69 MAKE_MASK_ZERO(i_ud, unsigned int)
70 MAKE_MASK_ZERO(i_uq, unsigned long long)
73 #define MASK_ZERO(TYPE) zero_masking_##TYPE
76 /* Unions used for testing (for example union512d, union256d etc.). */
77 #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
78 /* Corresponding union check. */
79 #define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME)
80 /* Corresponding fp union check. */
81 #define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME)
82 /* Corresponding rough union check. */
83 #define UNION_ROUGH_CHECK(SIZE, NAME) \
84 EVAL(check_rough_union, SIZE, NAME)
85 /* Function which tests intrinsic for given length. */
86 #define TEST EVAL(test_, AVX512F_LEN,)
87 /* Function which calculates result. */
88 #define CALC EVAL(calc_, AVX512F_LEN,)
90 #ifndef AVX512VL
91 #define AVX512F_LEN 512
92 #define AVX512F_LEN_HALF 256
93 #endif
95 #endif /* AVX512F_HELPER_INCLUDED */
97 /* Intrinsic being tested. It has different deffinitions,
98 depending on AVX512F_LEN, so it's outside include guards
99 and in undefed away to silence warnings. */
100 #if defined INTRINSIC
101 #undef INTRINSIC
102 #endif
104 #if AVX512F_LEN != 128
105 #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
106 #else
107 #define INTRINSIC(NAME) _mm ## NAME
108 #endif