Initial support for AVX-512{VL,BW,DQ}
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512f-helper.h
blob04a1a89da511c2fb438b0faff37697c254e7de99
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 #if defined (AVX512F) && !defined (AVX512VL)
12 #include "avx512f-check.h"
13 #elif defined (AVX512ER)
14 #include "avx512er-check.h"
15 #elif defined (AVX512CD)
16 #include "avx512cd-check.h"
17 #elif defined (AVX512DQ)
18 #include "avx512dq-check.h"
19 #elif defined (AVX512BW)
20 #include "avx512bw-check.h"
21 #elif defined (AVX512VL)
22 #include "avx512vl-check.h"
23 #endif
25 /* Macros expansion. */
26 #define CONCAT(a,b,c) a ## b ## c
27 #define EVAL(a,b,c) CONCAT(a,b,c)
29 /* Value to be written into destination.
30 We have one value for all types so it must be small enough
31 to fit into signed char. */
32 #define DEFAULT_VALUE 117
34 #define MAKE_MASK_MERGE(NAME, TYPE) \
35 static void \
36 __attribute__((noinline, unused)) \
37 merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
38 { \
39 int i; \
40 for (i = 0; i < size; i++) \
41 { \
42 arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \
43 } \
46 MAKE_MASK_MERGE(i_b, char)
47 MAKE_MASK_MERGE(i_w, short)
48 MAKE_MASK_MERGE(i_d, int)
49 MAKE_MASK_MERGE(i_q, long long)
50 MAKE_MASK_MERGE(, float)
51 MAKE_MASK_MERGE(d, double)
52 MAKE_MASK_MERGE(i_ub, unsigned char)
53 MAKE_MASK_MERGE(i_uw, unsigned short)
54 MAKE_MASK_MERGE(i_ud, unsigned int)
55 MAKE_MASK_MERGE(i_uq, unsigned long long)
57 #define MASK_MERGE(TYPE) merge_masking_##TYPE
59 #define MAKE_MASK_ZERO(NAME, TYPE) \
60 static void \
61 __attribute__((noinline, unused)) \
62 zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
63 { \
64 int i; \
65 for (i = 0; i < size; i++) \
66 { \
67 arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \
68 } \
71 MAKE_MASK_ZERO(i_b, char)
72 MAKE_MASK_ZERO(i_w, short)
73 MAKE_MASK_ZERO(i_d, int)
74 MAKE_MASK_ZERO(i_q, long long)
75 MAKE_MASK_ZERO(, float)
76 MAKE_MASK_ZERO(d, double)
77 MAKE_MASK_ZERO(i_ub, unsigned char)
78 MAKE_MASK_ZERO(i_uw, unsigned short)
79 MAKE_MASK_ZERO(i_ud, unsigned int)
80 MAKE_MASK_ZERO(i_uq, unsigned long long)
83 #define MASK_ZERO(TYPE) zero_masking_##TYPE
86 /* Unions used for testing (for example union512d, union256d etc.). */
87 #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
88 /* Corresponding union check. */
89 #define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME)
90 /* Corresponding fp union check. */
91 #define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME)
92 /* Corresponding rough union check. */
93 #define UNION_ROUGH_CHECK(SIZE, NAME) \
94 EVAL(check_rough_union, SIZE, NAME)
95 /* Function which tests intrinsic for given length. */
96 #define TEST EVAL(test_, AVX512F_LEN,)
97 /* Function which calculates result. */
98 #define CALC EVAL(calc_, AVX512F_LEN,)
100 #ifndef AVX512VL
101 #define AVX512F_LEN 512
102 #define AVX512F_LEN_HALF 256
103 void test_512 ();
104 #endif
106 void test_512 ();
107 void test_256 ();
108 void test_128 ();
110 #if defined (AVX512F) && !defined (AVX512VL)
111 void
112 avx512f_test (void) { test_512 (); }
113 #elif defined (AVX512CD)
114 void
115 avx512cd_test (void) { test_512 (); }
116 #elif defined (AVX512ER)
117 void
118 avx512er_test (void) { test_512 (); }
119 #elif defined (AVX512DQ)
120 void
121 avx512dq_test (void) { test_512 (); }
122 #elif defined (AVX512BW)
123 void
124 avx512bw_test (void) { test_512 (); }
125 #elif defined (AVX512VL)
126 void
127 avx512vl_test (void) { test_256 (); test_128 (); }
128 #endif
130 #endif /* AVX512F_HELPER_INCLUDED */
132 /* Intrinsic being tested. It has different deffinitions,
133 depending on AVX512F_LEN, so it's outside include guards
134 and in undefed away to silence warnings. */
135 #if defined INTRINSIC
136 #undef INTRINSIC
137 #endif
139 #if AVX512F_LEN != 128
140 #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
141 #else
142 #define INTRINSIC(NAME) _mm ## NAME
143 #endif