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
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"
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) \
36 __attribute__((noinline, unused)) \
37 merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
40 for (i = 0; i < size; i++) \
42 arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \
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) \
61 __attribute__((noinline, unused)) \
62 zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
65 for (i = 0; i < size; i++) \
67 arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \
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,)
101 #define AVX512F_LEN 512
102 #define AVX512F_LEN_HALF 256
110 #if defined (AVX512F) && !defined (AVX512VL)
112 avx512f_test (void) { test_512 (); }
113 #elif defined (AVX512CD)
115 avx512cd_test (void) { test_512 (); }
116 #elif defined (AVX512ER)
118 avx512er_test (void) { test_512 (); }
119 #elif defined (AVX512DQ)
121 avx512dq_test (void) { test_512 (); }
122 #elif defined (AVX512BW)
124 avx512bw_test (void) { test_512 (); }
125 #elif defined (AVX512VL)
127 avx512vl_test (void) { test_256 (); test_128 (); }
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
139 #if AVX512F_LEN != 128
140 #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
142 #define INTRINSIC(NAME) _mm ## NAME