PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / m128-check.h
blob48b233285396c0b8a7182bdfa9143d0368e3a9d5
1 #include <stdio.h>
2 #include <xmmintrin.h>
4 #ifdef __SSE2__
5 #include <emmintrin.h>
7 typedef union
9 __m128i x;
10 char a[16];
11 } union128i_b;
13 typedef union
15 __m128i x;
16 unsigned char a[16];
17 } union128i_ub;
19 typedef union
21 __m128i x;
22 short a[8];
23 } union128i_w;
25 typedef union
27 __m128i x;
28 unsigned short a[8];
29 } union128i_uw;
31 typedef union
33 __m128i x;
34 int a[4];
35 } union128i_d;
37 typedef union
39 __m128i x;
40 unsigned int a[4];
41 } union128i_ud;
43 typedef union
45 __m128i x;
46 long long a[2];
47 } union128i_q;
49 typedef union
51 __m128i x;
52 unsigned long long a[2];
53 } union128i_uq;
56 typedef union
58 __m128d x;
59 double a[2];
60 } union128d;
61 #endif
63 typedef union
65 __m128 x;
66 float a[4];
67 } union128;
69 #ifndef ARRAY_SIZE
70 #define ARRAY_SIZE(A) (sizeof (A) / sizeof ((A)[0]))
71 #endif
73 #ifdef DEBUG
74 #define PRINTF printf
75 #else
76 #define PRINTF(...)
77 #endif
79 #define CHECK_EXP(UINON_TYPE, VALUE_TYPE, FMT) \
80 static int \
81 __attribute__((noinline, unused)) \
82 check_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \
83 { \
84 int i; \
85 int err = 0; \
87 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
88 if (u.a[i] != v[i]) \
89 { \
90 err++; \
91 PRINTF ("%i: " FMT " != " FMT "\n", \
92 i, v[i], u.a[i]); \
93 } \
94 return err; \
97 #ifdef __SSE2__
98 CHECK_EXP (union128i_b, char, "%d")
99 CHECK_EXP (union128i_ub, unsigned char, "%d")
100 CHECK_EXP (union128i_w, short, "%d")
101 CHECK_EXP (union128i_uw, unsigned short, "%d")
102 CHECK_EXP (union128i_d, int, "0x%x")
103 CHECK_EXP (union128i_ud, unsigned int, "0x%x")
104 CHECK_EXP (union128i_q, long long, "0x%llx")
105 CHECK_EXP (union128i_uq, unsigned long long, "0x%llx")
106 CHECK_EXP (union128d, double, "%f")
107 #endif
109 CHECK_EXP (union128, float, "%f")
111 #ifndef ESP_FLOAT
112 #define ESP_FLOAT 0.000001
113 #endif
114 #ifndef ESP_DOUBLE
115 #define ESP_DOUBLE 0.000001
116 #endif
117 #define CHECK_ARRAY(ARRAY, TYPE, FMT) \
118 static int \
119 __attribute__((noinline, unused)) \
120 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
122 int i; \
123 int err = 0; \
125 for (i = 0; i < n; i++) \
126 if (v[i] != e[i]) \
128 err++; \
129 PRINTF ("%i: " FMT " != " FMT "\n", \
130 i, v[i], e[i]); \
132 return err; \
135 CHECK_ARRAY(c, char, "0x%hhx")
136 CHECK_ARRAY(s, short, "0x%hx")
137 CHECK_ARRAY(i, int, "0x%x")
138 CHECK_ARRAY(l, long long, "0x%llx")
139 CHECK_ARRAY(uc, unsigned char, "0x%hhx")
140 CHECK_ARRAY(us, unsigned short, "0x%hx")
141 CHECK_ARRAY(ui, unsigned int, "0x%x")
142 CHECK_ARRAY(ul, unsigned long long, "0x%llx")
146 #define CHECK_FP_ARRAY(ARRAY, TYPE, ESP, FMT) \
147 static int \
148 __attribute__((noinline, unused)) \
149 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
151 int i; \
152 int err = 0; \
154 for (i = 0; i < n; i++) \
155 if (v[i] > (e[i] + (ESP)) || v[i] < (e[i] - (ESP))) \
156 if (e[i] != v[i]) \
158 err++; \
159 PRINTF ("%i: " FMT " != " FMT "\n", \
160 i, v[i], e[i]); \
162 return err; \
165 CHECK_FP_ARRAY (d, double, ESP_DOUBLE, "%f")
166 CHECK_FP_ARRAY (f, float, ESP_FLOAT, "%f")
168 #ifdef NEED_IEEE754_FLOAT
169 union ieee754_float
171 float d;
172 struct
174 unsigned long frac : 23;
175 unsigned exp : 8;
176 unsigned sign : 1;
177 } bits __attribute__((packed));
179 #endif
181 #ifdef NEED_IEEE754_DOUBLE
182 union ieee754_double
184 double d;
185 struct
187 unsigned long frac1 : 32;
188 unsigned long frac0 : 20;
189 unsigned exp : 11;
190 unsigned sign : 1;
191 } bits __attribute__((packed));
193 #endif
195 #define CHECK_FP_EXP(UINON_TYPE, VALUE_TYPE, ESP, FMT) \
196 static int \
197 __attribute__((noinline, unused)) \
198 check_fp_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \
200 int i; \
201 int err = 0; \
203 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
204 if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP))) \
206 err++; \
207 PRINTF ("%i: " FMT " != " FMT "\n", \
208 i, v[i], u.a[i]); \
210 return err; \
213 CHECK_FP_EXP (union128, float, ESP_FLOAT, "%f")
214 #ifdef __SSE2__
215 CHECK_FP_EXP (union128d, double, ESP_DOUBLE, "%f")
216 #endif