1 #include <immintrin.h>
2 #include "m128-check.h"
3 
4 #ifndef max
5 #define max(a, b) (((a) > (b)) ? (a):(b))
6 #endif
7 #ifndef min
8 #define min(a, b) (((a) < (b)) ? (a):(b))
9 #endif
10 
11 typedef union
12 {
13   __m256i x;
14   char a[32];
15 } union256i_b;
16 
17 typedef union
18 {
19   __m256i x;
20   short a[16];
21 } union256i_w;
22 
23 typedef union
24 {
25   __m256i x;
26   int a[8];
27 } union256i_d;
28 
29 typedef union
30 {
31   __m256i x;
32   long long a[4];
33 } union256i_q;
34 
35 typedef union
36 {
37   __m256 x;
38   float a[8];
39 } union256;
40 
41 typedef union
42 {
43   __m256d x;
44   double a[4];
45 } union256d;
46 
47 CHECK_EXP (union256i_b, char, "%d")
48 CHECK_EXP (union256i_w, short, "%d")
49 CHECK_EXP (union256i_d, int, "0x%x")
50 CHECK_EXP (union256i_q, long long, "0x%llx")
51 CHECK_EXP (union256, float, "%f")
52 CHECK_EXP (union256d, double, "%f")
53 
54 #define CHECK_FP_EXP(UINON_TYPE, VALUE_TYPE, ESP, FMT)		\
55 static int							\
56 __attribute__((noinline, unused))				\
57 check_fp_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v)	\
58 {								\
59   int i;							\
60   int err = 0;							\
61 								\
62   for (i = 0; i < ARRAY_SIZE (u.a); i++)			\
63     if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP)))	\
64       {								\
65 	err++;							\
66 	PRINTF ("%i: " FMT " != " FMT "\n",			\
67 		i, v[i], u.a[i]);				\
68       }								\
69   return err;							\
70 }
71 
72 CHECK_FP_EXP (union256, float, ESP_FLOAT, "%f")
73 CHECK_FP_EXP (union256d, double, ESP_DOUBLE, "%f")
74