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