1 #include <stdio.h>
2 #include "avx512fp16-ymm-check.h"
3 #include "args.h"
4
5 struct IntegerRegisters iregs;
6 struct FloatRegisters fregs;
7 unsigned int num_iregs, num_fregs;
8
9 /* This struct holds values for argument checking. */
10 struct
11 {
12 YMM_T i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15,
13 i16, i17, i18, i19, i20, i21, i22, i23;
14 } values;
15
16 char *pass;
17 int failed = 0;
18
19 #undef assert
20 #define assert(c) do { \
21 if (!(c)) {failed++; printf ("failed %s\n", pass); } \
22 } while (0)
23
24 #define compare(X1,X2,T) do { \
25 assert (memcmp (&X1, &X2, sizeof (T)) == 0); \
26 } while (0)
27
fun_check_passing_m256_8_values(__m256 i0 ATTRIBUTE_UNUSED,__m256 i1 ATTRIBUTE_UNUSED,__m256 i2 ATTRIBUTE_UNUSED,__m256 i3 ATTRIBUTE_UNUSED,__m256 i4 ATTRIBUTE_UNUSED,__m256 i5 ATTRIBUTE_UNUSED,__m256 i6 ATTRIBUTE_UNUSED,__m256 i7 ATTRIBUTE_UNUSED)28 fun_check_passing_m256_8_values (__m256 i0 ATTRIBUTE_UNUSED,
29 __m256 i1 ATTRIBUTE_UNUSED,
30 __m256 i2 ATTRIBUTE_UNUSED,
31 __m256 i3 ATTRIBUTE_UNUSED,
32 __m256 i4 ATTRIBUTE_UNUSED,
33 __m256 i5 ATTRIBUTE_UNUSED,
34 __m256 i6 ATTRIBUTE_UNUSED,
35 __m256 i7 ATTRIBUTE_UNUSED)
36 {
37 /* Check argument values. */
38 compare (values.i0, i0, __m256);
39 compare (values.i1, i1, __m256);
40 compare (values.i2, i2, __m256);
41 compare (values.i3, i3, __m256);
42 compare (values.i4, i4, __m256);
43 compare (values.i5, i5, __m256);
44 compare (values.i6, i6, __m256);
45 compare (values.i7, i7, __m256);
46 }
47
fun_check_passing_m256h_8_values(__m256h i0 ATTRIBUTE_UNUSED,__m256h i1 ATTRIBUTE_UNUSED,__m256h i2 ATTRIBUTE_UNUSED,__m256h i3 ATTRIBUTE_UNUSED,__m256h i4 ATTRIBUTE_UNUSED,__m256h i5 ATTRIBUTE_UNUSED,__m256h i6 ATTRIBUTE_UNUSED,__m256h i7 ATTRIBUTE_UNUSED)48 fun_check_passing_m256h_8_values (__m256h i0 ATTRIBUTE_UNUSED,
49 __m256h i1 ATTRIBUTE_UNUSED,
50 __m256h i2 ATTRIBUTE_UNUSED,
51 __m256h i3 ATTRIBUTE_UNUSED,
52 __m256h i4 ATTRIBUTE_UNUSED,
53 __m256h i5 ATTRIBUTE_UNUSED,
54 __m256h i6 ATTRIBUTE_UNUSED,
55 __m256h i7 ATTRIBUTE_UNUSED)
56 {
57 /* Check argument values. */
58 compare (values.i0, i0, __m256h);
59 compare (values.i1, i1, __m256h);
60 compare (values.i2, i2, __m256h);
61 compare (values.i3, i3, __m256h);
62 compare (values.i4, i4, __m256h);
63 compare (values.i5, i5, __m256h);
64 compare (values.i6, i6, __m256h);
65 compare (values.i7, i7, __m256h);
66 }
67
68 void
fun_check_passing_m256_8_regs(__m256 i0 ATTRIBUTE_UNUSED,__m256 i1 ATTRIBUTE_UNUSED,__m256 i2 ATTRIBUTE_UNUSED,__m256 i3 ATTRIBUTE_UNUSED,__m256 i4 ATTRIBUTE_UNUSED,__m256 i5 ATTRIBUTE_UNUSED,__m256 i6 ATTRIBUTE_UNUSED,__m256 i7 ATTRIBUTE_UNUSED)69 fun_check_passing_m256_8_regs (__m256 i0 ATTRIBUTE_UNUSED,
70 __m256 i1 ATTRIBUTE_UNUSED,
71 __m256 i2 ATTRIBUTE_UNUSED,
72 __m256 i3 ATTRIBUTE_UNUSED,
73 __m256 i4 ATTRIBUTE_UNUSED,
74 __m256 i5 ATTRIBUTE_UNUSED,
75 __m256 i6 ATTRIBUTE_UNUSED,
76 __m256 i7 ATTRIBUTE_UNUSED)
77 {
78 /* Check register contents. */
79 check_m256_arguments;
80 }
81
82 void
fun_check_passing_m256h_8_regs(__m256h i0 ATTRIBUTE_UNUSED,__m256h i1 ATTRIBUTE_UNUSED,__m256h i2 ATTRIBUTE_UNUSED,__m256h i3 ATTRIBUTE_UNUSED,__m256h i4 ATTRIBUTE_UNUSED,__m256h i5 ATTRIBUTE_UNUSED,__m256h i6 ATTRIBUTE_UNUSED,__m256h i7 ATTRIBUTE_UNUSED)83 fun_check_passing_m256h_8_regs (__m256h i0 ATTRIBUTE_UNUSED,
84 __m256h i1 ATTRIBUTE_UNUSED,
85 __m256h i2 ATTRIBUTE_UNUSED,
86 __m256h i3 ATTRIBUTE_UNUSED,
87 __m256h i4 ATTRIBUTE_UNUSED,
88 __m256h i5 ATTRIBUTE_UNUSED,
89 __m256h i6 ATTRIBUTE_UNUSED,
90 __m256h i7 ATTRIBUTE_UNUSED)
91 {
92 /* Check register contents. */
93 check_m256_arguments;
94 }
95
96 void
fun_check_passing_m256_20_values(__m256 i0 ATTRIBUTE_UNUSED,__m256 i1 ATTRIBUTE_UNUSED,__m256 i2 ATTRIBUTE_UNUSED,__m256 i3 ATTRIBUTE_UNUSED,__m256 i4 ATTRIBUTE_UNUSED,__m256 i5 ATTRIBUTE_UNUSED,__m256 i6 ATTRIBUTE_UNUSED,__m256 i7 ATTRIBUTE_UNUSED,__m256 i8 ATTRIBUTE_UNUSED,__m256 i9 ATTRIBUTE_UNUSED,__m256 i10 ATTRIBUTE_UNUSED,__m256 i11 ATTRIBUTE_UNUSED,__m256 i12 ATTRIBUTE_UNUSED,__m256 i13 ATTRIBUTE_UNUSED,__m256 i14 ATTRIBUTE_UNUSED,__m256 i15 ATTRIBUTE_UNUSED,__m256 i16 ATTRIBUTE_UNUSED,__m256 i17 ATTRIBUTE_UNUSED,__m256 i18 ATTRIBUTE_UNUSED,__m256 i19 ATTRIBUTE_UNUSED)97 fun_check_passing_m256_20_values (__m256 i0 ATTRIBUTE_UNUSED,
98 __m256 i1 ATTRIBUTE_UNUSED,
99 __m256 i2 ATTRIBUTE_UNUSED,
100 __m256 i3 ATTRIBUTE_UNUSED,
101 __m256 i4 ATTRIBUTE_UNUSED,
102 __m256 i5 ATTRIBUTE_UNUSED,
103 __m256 i6 ATTRIBUTE_UNUSED,
104 __m256 i7 ATTRIBUTE_UNUSED,
105 __m256 i8 ATTRIBUTE_UNUSED,
106 __m256 i9 ATTRIBUTE_UNUSED,
107 __m256 i10 ATTRIBUTE_UNUSED,
108 __m256 i11 ATTRIBUTE_UNUSED,
109 __m256 i12 ATTRIBUTE_UNUSED,
110 __m256 i13 ATTRIBUTE_UNUSED,
111 __m256 i14 ATTRIBUTE_UNUSED,
112 __m256 i15 ATTRIBUTE_UNUSED,
113 __m256 i16 ATTRIBUTE_UNUSED,
114 __m256 i17 ATTRIBUTE_UNUSED,
115 __m256 i18 ATTRIBUTE_UNUSED,
116 __m256 i19 ATTRIBUTE_UNUSED)
117 {
118 /* Check argument values. */
119 compare (values.i0, i0, __m256);
120 compare (values.i1, i1, __m256);
121 compare (values.i2, i2, __m256);
122 compare (values.i3, i3, __m256);
123 compare (values.i4, i4, __m256);
124 compare (values.i5, i5, __m256);
125 compare (values.i6, i6, __m256);
126 compare (values.i7, i7, __m256);
127 compare (values.i8, i8, __m256);
128 compare (values.i9, i9, __m256);
129 compare (values.i10, i10, __m256);
130 compare (values.i11, i11, __m256);
131 compare (values.i12, i12, __m256);
132 compare (values.i13, i13, __m256);
133 compare (values.i14, i14, __m256);
134 compare (values.i15, i15, __m256);
135 compare (values.i16, i16, __m256);
136 compare (values.i17, i17, __m256);
137 compare (values.i18, i18, __m256);
138 compare (values.i19, i19, __m256);
139 }
140
141 void
fun_check_passing_m256h_20_values(__m256h i0 ATTRIBUTE_UNUSED,__m256h i1 ATTRIBUTE_UNUSED,__m256h i2 ATTRIBUTE_UNUSED,__m256h i3 ATTRIBUTE_UNUSED,__m256h i4 ATTRIBUTE_UNUSED,__m256h i5 ATTRIBUTE_UNUSED,__m256h i6 ATTRIBUTE_UNUSED,__m256h i7 ATTRIBUTE_UNUSED,__m256h i8 ATTRIBUTE_UNUSED,__m256h i9 ATTRIBUTE_UNUSED,__m256h i10 ATTRIBUTE_UNUSED,__m256h i11 ATTRIBUTE_UNUSED,__m256h i12 ATTRIBUTE_UNUSED,__m256h i13 ATTRIBUTE_UNUSED,__m256h i14 ATTRIBUTE_UNUSED,__m256h i15 ATTRIBUTE_UNUSED,__m256h i16 ATTRIBUTE_UNUSED,__m256h i17 ATTRIBUTE_UNUSED,__m256h i18 ATTRIBUTE_UNUSED,__m256h i19 ATTRIBUTE_UNUSED)142 fun_check_passing_m256h_20_values (__m256h i0 ATTRIBUTE_UNUSED,
143 __m256h i1 ATTRIBUTE_UNUSED,
144 __m256h i2 ATTRIBUTE_UNUSED,
145 __m256h i3 ATTRIBUTE_UNUSED,
146 __m256h i4 ATTRIBUTE_UNUSED,
147 __m256h i5 ATTRIBUTE_UNUSED,
148 __m256h i6 ATTRIBUTE_UNUSED,
149 __m256h i7 ATTRIBUTE_UNUSED,
150 __m256h i8 ATTRIBUTE_UNUSED,
151 __m256h i9 ATTRIBUTE_UNUSED,
152 __m256h i10 ATTRIBUTE_UNUSED,
153 __m256h i11 ATTRIBUTE_UNUSED,
154 __m256h i12 ATTRIBUTE_UNUSED,
155 __m256h i13 ATTRIBUTE_UNUSED,
156 __m256h i14 ATTRIBUTE_UNUSED,
157 __m256h i15 ATTRIBUTE_UNUSED,
158 __m256h i16 ATTRIBUTE_UNUSED,
159 __m256h i17 ATTRIBUTE_UNUSED,
160 __m256h i18 ATTRIBUTE_UNUSED,
161 __m256h i19 ATTRIBUTE_UNUSED)
162 {
163 /* Check argument values. */
164 compare (values.i0, i0, __m256h);
165 compare (values.i1, i1, __m256h);
166 compare (values.i2, i2, __m256h);
167 compare (values.i3, i3, __m256h);
168 compare (values.i4, i4, __m256h);
169 compare (values.i5, i5, __m256h);
170 compare (values.i6, i6, __m256h);
171 compare (values.i7, i7, __m256h);
172 compare (values.i8, i8, __m256h);
173 compare (values.i9, i9, __m256h);
174 compare (values.i10, i10, __m256h);
175 compare (values.i11, i11, __m256h);
176 compare (values.i12, i12, __m256h);
177 compare (values.i13, i13, __m256h);
178 compare (values.i14, i14, __m256h);
179 compare (values.i15, i15, __m256h);
180 compare (values.i16, i16, __m256h);
181 compare (values.i17, i17, __m256h);
182 compare (values.i18, i18, __m256h);
183 compare (values.i19, i19, __m256h);
184 }
185
186 void
fun_check_passing_m256_20_regs(__m256 i0 ATTRIBUTE_UNUSED,__m256 i1 ATTRIBUTE_UNUSED,__m256 i2 ATTRIBUTE_UNUSED,__m256 i3 ATTRIBUTE_UNUSED,__m256 i4 ATTRIBUTE_UNUSED,__m256 i5 ATTRIBUTE_UNUSED,__m256 i6 ATTRIBUTE_UNUSED,__m256 i7 ATTRIBUTE_UNUSED,__m256 i8 ATTRIBUTE_UNUSED,__m256 i9 ATTRIBUTE_UNUSED,__m256 i10 ATTRIBUTE_UNUSED,__m256 i11 ATTRIBUTE_UNUSED,__m256 i12 ATTRIBUTE_UNUSED,__m256 i13 ATTRIBUTE_UNUSED,__m256 i14 ATTRIBUTE_UNUSED,__m256 i15 ATTRIBUTE_UNUSED,__m256 i16 ATTRIBUTE_UNUSED,__m256 i17 ATTRIBUTE_UNUSED,__m256 i18 ATTRIBUTE_UNUSED,__m256 i19 ATTRIBUTE_UNUSED)187 fun_check_passing_m256_20_regs (__m256 i0 ATTRIBUTE_UNUSED,
188 __m256 i1 ATTRIBUTE_UNUSED,
189 __m256 i2 ATTRIBUTE_UNUSED,
190 __m256 i3 ATTRIBUTE_UNUSED,
191 __m256 i4 ATTRIBUTE_UNUSED,
192 __m256 i5 ATTRIBUTE_UNUSED,
193 __m256 i6 ATTRIBUTE_UNUSED,
194 __m256 i7 ATTRIBUTE_UNUSED,
195 __m256 i8 ATTRIBUTE_UNUSED,
196 __m256 i9 ATTRIBUTE_UNUSED,
197 __m256 i10 ATTRIBUTE_UNUSED,
198 __m256 i11 ATTRIBUTE_UNUSED,
199 __m256 i12 ATTRIBUTE_UNUSED,
200 __m256 i13 ATTRIBUTE_UNUSED,
201 __m256 i14 ATTRIBUTE_UNUSED,
202 __m256 i15 ATTRIBUTE_UNUSED,
203 __m256 i16 ATTRIBUTE_UNUSED,
204 __m256 i17 ATTRIBUTE_UNUSED,
205 __m256 i18 ATTRIBUTE_UNUSED,
206 __m256 i19 ATTRIBUTE_UNUSED)
207 {
208 /* Check register contents. */
209 check_m256_arguments;
210 }
211
212 void
fun_check_passing_m256h_20_regs(__m256h i0 ATTRIBUTE_UNUSED,__m256h i1 ATTRIBUTE_UNUSED,__m256h i2 ATTRIBUTE_UNUSED,__m256h i3 ATTRIBUTE_UNUSED,__m256h i4 ATTRIBUTE_UNUSED,__m256h i5 ATTRIBUTE_UNUSED,__m256h i6 ATTRIBUTE_UNUSED,__m256h i7 ATTRIBUTE_UNUSED,__m256h i8 ATTRIBUTE_UNUSED,__m256h i9 ATTRIBUTE_UNUSED,__m256h i10 ATTRIBUTE_UNUSED,__m256h i11 ATTRIBUTE_UNUSED,__m256h i12 ATTRIBUTE_UNUSED,__m256h i13 ATTRIBUTE_UNUSED,__m256h i14 ATTRIBUTE_UNUSED,__m256h i15 ATTRIBUTE_UNUSED,__m256h i16 ATTRIBUTE_UNUSED,__m256h i17 ATTRIBUTE_UNUSED,__m256h i18 ATTRIBUTE_UNUSED,__m256h i19 ATTRIBUTE_UNUSED)213 fun_check_passing_m256h_20_regs (__m256h i0 ATTRIBUTE_UNUSED,
214 __m256h i1 ATTRIBUTE_UNUSED,
215 __m256h i2 ATTRIBUTE_UNUSED,
216 __m256h i3 ATTRIBUTE_UNUSED,
217 __m256h i4 ATTRIBUTE_UNUSED,
218 __m256h i5 ATTRIBUTE_UNUSED,
219 __m256h i6 ATTRIBUTE_UNUSED,
220 __m256h i7 ATTRIBUTE_UNUSED,
221 __m256h i8 ATTRIBUTE_UNUSED,
222 __m256h i9 ATTRIBUTE_UNUSED,
223 __m256h i10 ATTRIBUTE_UNUSED,
224 __m256h i11 ATTRIBUTE_UNUSED,
225 __m256h i12 ATTRIBUTE_UNUSED,
226 __m256h i13 ATTRIBUTE_UNUSED,
227 __m256h i14 ATTRIBUTE_UNUSED,
228 __m256h i15 ATTRIBUTE_UNUSED,
229 __m256h i16 ATTRIBUTE_UNUSED,
230 __m256h i17 ATTRIBUTE_UNUSED,
231 __m256h i18 ATTRIBUTE_UNUSED,
232 __m256h i19 ATTRIBUTE_UNUSED)
233 {
234 /* Check register contents. */
235 check_m256_arguments;
236 }
237
238 #define def_check_passing8(_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _func1, _func2, TYPE) \
239 values.i0.TYPE[0] = _i0; \
240 values.i1.TYPE[0] = _i1; \
241 values.i2.TYPE[0] = _i2; \
242 values.i3.TYPE[0] = _i3; \
243 values.i4.TYPE[0] = _i4; \
244 values.i5.TYPE[0] = _i5; \
245 values.i6.TYPE[0] = _i6; \
246 values.i7.TYPE[0] = _i7; \
247 WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7); \
248 clear_struct_registers; \
249 fregs.F0.TYPE[0] = _i0; \
250 fregs.F1.TYPE[0] = _i1; \
251 fregs.F2.TYPE[0] = _i2; \
252 fregs.F3.TYPE[0] = _i3; \
253 fregs.F4.TYPE[0] = _i4; \
254 fregs.F5.TYPE[0] = _i5; \
255 fregs.F6.TYPE[0] = _i6; \
256 fregs.F7.TYPE[0] = _i7; \
257 num_fregs = 8; \
258 WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7);
259
260 #define def_check_passing20(_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, \
261 _i8, _i9, _i10, _i11, _i12, _i13, _i14, \
262 _i15, _i16, _i17, _i18, _i19, _func1, \
263 _func2, TYPE) \
264 values.i0.TYPE[0] = _i0; \
265 values.i1.TYPE[0] = _i1; \
266 values.i2.TYPE[0] = _i2; \
267 values.i3.TYPE[0] = _i3; \
268 values.i4.TYPE[0] = _i4; \
269 values.i5.TYPE[0] = _i5; \
270 values.i6.TYPE[0] = _i6; \
271 values.i7.TYPE[0] = _i7; \
272 values.i8.TYPE[0] = _i8; \
273 values.i9.TYPE[0] = _i9; \
274 values.i10.TYPE[0] = _i10; \
275 values.i11.TYPE[0] = _i11; \
276 values.i12.TYPE[0] = _i12; \
277 values.i13.TYPE[0] = _i13; \
278 values.i14.TYPE[0] = _i14; \
279 values.i15.TYPE[0] = _i15; \
280 values.i16.TYPE[0] = _i16; \
281 values.i17.TYPE[0] = _i17; \
282 values.i18.TYPE[0] = _i18; \
283 values.i19.TYPE[0] = _i19; \
284 WRAP_CALL(_func1) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
285 _i9, _i10, _i11, _i12, _i13, _i14, _i15, \
286 _i16, _i17, _i18, _i19); \
287 clear_struct_registers; \
288 fregs.F0.TYPE[0] = _i0; \
289 fregs.F1.TYPE[0] = _i1; \
290 fregs.F2.TYPE[0] = _i2; \
291 fregs.F3.TYPE[0] = _i3; \
292 fregs.F4.TYPE[0] = _i4; \
293 fregs.F5.TYPE[0] = _i5; \
294 fregs.F6.TYPE[0] = _i6; \
295 fregs.F7.TYPE[0] = _i7; \
296 num_fregs = 8; \
297 WRAP_CALL(_func2) (_i0, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, \
298 _i9, _i10, _i11, _i12, _i13, _i14, _i15, \
299 _i16, _i17, _i18, _i19);
300
301 void
test_m256_on_stack()302 test_m256_on_stack ()
303 {
304 __m256 x[8];
305 int i;
306 for (i = 0; i < 8; i++)
307 x[i] = (__m256){32 + i, 0, 0, 0, 0, 0, 0, 0};
308 pass = "m256-8";
309 def_check_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
310 fun_check_passing_m256_8_values,
311 fun_check_passing_m256_8_regs, _m256);
312 }
313
314 void
test_m256h_on_stack()315 test_m256h_on_stack ()
316 {
317 __m256h x[8];
318 int i;
319 for (i = 0; i < 8; i++)
320 x[i] = (__m256h){1.1f16 + i, 2.1f16 + i, 3.1f16 + i, 4.1f16 + i,
321 5.1f16 + i, 6.1f16 + i, 7.1f16 + i, 8.1f16 + i,
322 9.1f16 + i, 10.1f16 + i, 11.1f16 + i, 12.1f16 + i,
323 13.1f16 + i, 14.1f16 + i, 15.1f16 + i, 16.1f16 + i};
324 pass = "m256h-8";
325 def_check_passing8 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
326 fun_check_passing_m256h_8_values,
327 fun_check_passing_m256h_8_regs, _m256h);
328 }
329
330 void
test_too_many_m256()331 test_too_many_m256 ()
332 {
333 __m256 x[20];
334 int i;
335 for (i = 0; i < 20; i++)
336 x[i] = (__m256){32 + i, 0, 0, 0, 0, 0, 0, 0};
337 pass = "m256-20";
338 def_check_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8],
339 x[9], x[10], x[11], x[12], x[13], x[14], x[15], x[16],
340 x[17], x[18], x[19], fun_check_passing_m256_20_values,
341 fun_check_passing_m256_20_regs, _m256);
342 }
343
344 void
test_too_many_m256h()345 test_too_many_m256h ()
346 {
347 __m256h x[20];
348 int i;
349 for (i = 0; i < 20; i++)
350 x[i] = (__m256h){1.1f16 + i, 2.1f16 + i, 3.1f16 + i, 4.1f16 + i,
351 5.1f16 + i, 6.1f16 + i, 7.1f16 + i, 8.1f16 + i,
352 9.1f16 + i, 10.1f16 + i, 11.1f16 + i, 12.1f16 + i,
353 13.1f16 + i, 14.1f16 + i, 15.1f16 + i, 16.1f16 + i};
354 pass = "m256h-20";
355 def_check_passing20 (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8],
356 x[9], x[10], x[11], x[12], x[13], x[14], x[15], x[16],
357 x[17], x[18], x[19], fun_check_passing_m256h_20_values,
358 fun_check_passing_m256h_20_regs, _m256h);
359 }
360
361 static void
do_test(void)362 do_test (void)
363 {
364 test_m256_on_stack ();
365 test_too_many_m256 ();
366 test_m256h_on_stack ();
367 test_too_many_m256h ();
368 if (failed)
369 abort ();
370 }
371