1 /* This file is used to reduce a number of runtime tests for AVX512F
2 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. */
7
8 #if defined (AVX512F)
9 #include "avx512f-check.h"
10 #elif defined (AVX512ER)
11 #include "avx512er-check.h"
12 #elif defined (AVX512CD)
13 #include "avx512cd-check.h"
14 #endif
15
16 /* Macros expansion. */
17 #define CONCAT(a,b,c) a ## b ## c
18 #define EVAL(a,b,c) CONCAT(a,b,c)
19
20 /* Value to be written into destination.
21 We have one value for all types so it must be small enough
22 to fit into signed char. */
23 #define DEFAULT_VALUE 117
24
25 #define MAKE_MASK_MERGE(NAME, TYPE) \
26 static void \
27 __attribute__((noinline, unused)) \
28 merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
29 { \
30 int i; \
31 for (i = 0; i < size; i++) \
32 { \
33 arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \
34 } \
35 }
36
37 MAKE_MASK_MERGE(i_b, char)
38 MAKE_MASK_MERGE(i_w, short)
39 MAKE_MASK_MERGE(i_d, int)
40 MAKE_MASK_MERGE(i_q, long long)
41 MAKE_MASK_MERGE(, float)
42 MAKE_MASK_MERGE(d, double)
43
44 #define MASK_MERGE(TYPE) merge_masking_##TYPE
45
46 #define MAKE_MASK_ZERO(NAME, TYPE) \
47 static void \
48 __attribute__((noinline, unused)) \
49 zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
50 { \
51 int i; \
52 for (i = 0; i < size; i++) \
53 { \
54 arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \
55 } \
56 }
57
58 MAKE_MASK_ZERO(i_b, char)
59 MAKE_MASK_ZERO(i_w, short)
60 MAKE_MASK_ZERO(i_d, int)
61 MAKE_MASK_ZERO(i_q, long long)
62 MAKE_MASK_ZERO(, float)
63 MAKE_MASK_ZERO(d, double)
64
65 #define MASK_ZERO(TYPE) zero_masking_##TYPE
66
67 /* Intrinsic being tested. */
68 #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
69 /* Unions used for testing (for example union512d, union256d etc.). */
70 #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
71 /* Corresponding union check. */
72 #define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME)
73 /* Corresponding fp union check. */
74 #define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME)
75 /* Corresponding rough union check. */
76 #define UNION_ROUGH_CHECK(SIZE, NAME) \
77 EVAL(check_rough_union, SIZE, NAME)
78 /* Function which tests intrinsic for given length. */
79 #define TEST EVAL(test_, AVX512F_LEN,)
80 /* Function which calculates result. */
81 #define CALC EVAL(calc_, AVX512F_LEN,)
82
83 #define AVX512F_LEN 512
84 #define AVX512F_LEN_HALF 256
85 static void test_512 ();
86
87 #if defined (AVX512F)
88 void
avx512f_test(void)89 avx512f_test (void) { test_512 (); }
90 #elif defined (AVX512CD)
91 void
avx512cd_test(void)92 avx512cd_test (void) { test_512 (); }
93 #elif defined (AVX512ER)
94 void
avx512er_test(void)95 avx512er_test (void) { test_512 (); }
96 #endif
97