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