1 /* Test SSE exceptions.  */
2 
3 #include <float.h>
4 #include <stdint.h>
5 #include <stdio.h>
6 
7 volatile float f_res;
8 volatile double d_res;
9 
10 volatile float f_snan = __builtin_nansf("");
11 volatile float f_half = 0.5f;
12 volatile float f_third = 1.0f / 3.0f;
13 volatile float f_nan = __builtin_nanl("");
14 volatile float f_inf = __builtin_inff();
15 volatile float f_ninf = -__builtin_inff();
16 volatile float f_one = 1.0f;
17 volatile float f_two = 2.0f;
18 volatile float f_zero = 0.0f;
19 volatile float f_nzero = -0.0f;
20 volatile float f_min = FLT_MIN;
21 volatile float f_true_min = 0x1p-149f;
22 volatile float f_max = FLT_MAX;
23 volatile float f_nmax = -FLT_MAX;
24 
25 volatile double d_snan = __builtin_nans("");
26 volatile double d_half = 0.5;
27 volatile double d_third = 1.0 / 3.0;
28 volatile double d_nan = __builtin_nan("");
29 volatile double d_inf = __builtin_inf();
30 volatile double d_ninf = -__builtin_inf();
31 volatile double d_one = 1.0;
32 volatile double d_two = 2.0;
33 volatile double d_zero = 0.0;
34 volatile double d_nzero = -0.0;
35 volatile double d_min = DBL_MIN;
36 volatile double d_true_min = 0x1p-1074;
37 volatile double d_max = DBL_MAX;
38 volatile double d_nmax = -DBL_MAX;
39 
40 volatile int32_t i32_max = INT32_MAX;
41 
42 #define IE (1 << 0)
43 #define ZE (1 << 2)
44 #define OE (1 << 3)
45 #define UE (1 << 4)
46 #define PE (1 << 5)
47 #define EXC (IE | ZE | OE | UE | PE)
48 
49 uint32_t mxcsr_default = 0x1f80;
50 uint32_t mxcsr_ftz = 0x9f80;
51 
52 int main(void)
53 {
54     uint32_t mxcsr;
55     int32_t i32_res;
56     int ret = 0;
57 
58     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
59     d_res = f_snan;
60     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
61     if ((mxcsr & EXC) != IE) {
62         printf("FAIL: widen float snan\n");
63         ret = 1;
64     }
65 
66     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
67     f_res = d_min;
68     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
69     if ((mxcsr & EXC) != (UE | PE)) {
70         printf("FAIL: narrow float underflow\n");
71         ret = 1;
72     }
73 
74     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
75     f_res = d_max;
76     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
77     if ((mxcsr & EXC) != (OE | PE)) {
78         printf("FAIL: narrow float overflow\n");
79         ret = 1;
80     }
81 
82     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
83     f_res = d_third;
84     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
85     if ((mxcsr & EXC) != PE) {
86         printf("FAIL: narrow float inexact\n");
87         ret = 1;
88     }
89 
90     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
91     f_res = d_snan;
92     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
93     if ((mxcsr & EXC) != IE) {
94         printf("FAIL: narrow float snan\n");
95         ret = 1;
96     }
97 
98     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
99     __asm__ volatile ("roundss $4, %0, %0" : "=x" (f_res) : "0" (f_min));
100     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
101     if ((mxcsr & EXC) != PE) {
102         printf("FAIL: roundss min\n");
103         ret = 1;
104     }
105     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
106     __asm__ volatile ("roundss $12, %0, %0" : "=x" (f_res) : "0" (f_min));
107     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
108     if ((mxcsr & EXC) != 0) {
109         printf("FAIL: roundss no-inexact min\n");
110         ret = 1;
111     }
112     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
113     __asm__ volatile ("roundss $4, %0, %0" : "=x" (f_res) : "0" (f_snan));
114     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
115     if ((mxcsr & EXC) != IE) {
116         printf("FAIL: roundss snan\n");
117         ret = 1;
118     }
119     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
120     __asm__ volatile ("roundss $12, %0, %0" : "=x" (f_res) : "0" (f_snan));
121     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
122     if ((mxcsr & EXC) != IE) {
123         printf("FAIL: roundss no-inexact snan\n");
124         ret = 1;
125     }
126 
127     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
128     __asm__ volatile ("roundsd $4, %0, %0" : "=x" (d_res) : "0" (d_min));
129     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
130     if ((mxcsr & EXC) != PE) {
131         printf("FAIL: roundsd min\n");
132         ret = 1;
133     }
134     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
135     __asm__ volatile ("roundsd $12, %0, %0" : "=x" (d_res) : "0" (d_min));
136     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
137     if ((mxcsr & EXC) != 0) {
138         printf("FAIL: roundsd no-inexact min\n");
139         ret = 1;
140     }
141     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
142     __asm__ volatile ("roundsd $4, %0, %0" : "=x" (d_res) : "0" (d_snan));
143     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
144     if ((mxcsr & EXC) != IE) {
145         printf("FAIL: roundsd snan\n");
146         ret = 1;
147     }
148     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
149     __asm__ volatile ("roundsd $12, %0, %0" : "=x" (d_res) : "0" (d_snan));
150     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
151     if ((mxcsr & EXC) != IE) {
152         printf("FAIL: roundsd no-inexact snan\n");
153         ret = 1;
154     }
155 
156     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
157     __asm__ volatile ("comiss %1, %0" : : "x" (f_nan), "x" (f_zero));
158     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
159     if ((mxcsr & EXC) != IE) {
160         printf("FAIL: comiss nan\n");
161         ret = 1;
162     }
163     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
164     __asm__ volatile ("ucomiss %1, %0" : : "x" (f_nan), "x" (f_zero));
165     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
166     if ((mxcsr & EXC) != 0) {
167         printf("FAIL: ucomiss nan\n");
168         ret = 1;
169     }
170     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
171     __asm__ volatile ("ucomiss %1, %0" : : "x" (f_snan), "x" (f_zero));
172     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
173     if ((mxcsr & EXC) != IE) {
174         printf("FAIL: ucomiss snan\n");
175         ret = 1;
176     }
177 
178     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
179     __asm__ volatile ("comisd %1, %0" : : "x" (d_nan), "x" (d_zero));
180     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
181     if ((mxcsr & EXC) != IE) {
182         printf("FAIL: comisd nan\n");
183         ret = 1;
184     }
185     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
186     __asm__ volatile ("ucomisd %1, %0" : : "x" (d_nan), "x" (d_zero));
187     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
188     if ((mxcsr & EXC) != 0) {
189         printf("FAIL: ucomisd nan\n");
190         ret = 1;
191     }
192     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
193     __asm__ volatile ("ucomisd %1, %0" : : "x" (d_snan), "x" (d_zero));
194     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
195     if ((mxcsr & EXC) != IE) {
196         printf("FAIL: ucomisd snan\n");
197         ret = 1;
198     }
199 
200     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
201     f_res = f_max + f_max;
202     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
203     if ((mxcsr & EXC) != (OE | PE)) {
204         printf("FAIL: float add overflow\n");
205         ret = 1;
206     }
207     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
208     f_res = f_max + f_min;
209     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
210     if ((mxcsr & EXC) != PE) {
211         printf("FAIL: float add inexact\n");
212         ret = 1;
213     }
214     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
215     f_res = f_inf + f_ninf;
216     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
217     if ((mxcsr & EXC) != IE) {
218         printf("FAIL: float add inf -inf\n");
219         ret = 1;
220     }
221     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
222     f_res = f_snan + f_third;
223     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
224     if ((mxcsr & EXC) != IE) {
225         printf("FAIL: float add snan\n");
226         ret = 1;
227     }
228     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
229     f_res = f_true_min + f_true_min;
230     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
231     if ((mxcsr & EXC) != (UE | PE)) {
232         printf("FAIL: float add FTZ underflow\n");
233         ret = 1;
234     }
235 
236     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
237     d_res = d_max + d_max;
238     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
239     if ((mxcsr & EXC) != (OE | PE)) {
240         printf("FAIL: double add overflow\n");
241         ret = 1;
242     }
243     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
244     d_res = d_max + d_min;
245     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
246     if ((mxcsr & EXC) != PE) {
247         printf("FAIL: double add inexact\n");
248         ret = 1;
249     }
250     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
251     d_res = d_inf + d_ninf;
252     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
253     if ((mxcsr & EXC) != IE) {
254         printf("FAIL: double add inf -inf\n");
255         ret = 1;
256     }
257     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
258     d_res = d_snan + d_third;
259     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
260     if ((mxcsr & EXC) != IE) {
261         printf("FAIL: double add snan\n");
262         ret = 1;
263     }
264     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
265     d_res = d_true_min + d_true_min;
266     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
267     if ((mxcsr & EXC) != (UE | PE)) {
268         printf("FAIL: double add FTZ underflow\n");
269         ret = 1;
270     }
271 
272     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
273     f_res = f_max - f_nmax;
274     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
275     if ((mxcsr & EXC) != (OE | PE)) {
276         printf("FAIL: float sub overflow\n");
277         ret = 1;
278     }
279     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
280     f_res = f_max - f_min;
281     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
282     if ((mxcsr & EXC) != PE) {
283         printf("FAIL: float sub inexact\n");
284         ret = 1;
285     }
286     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
287     f_res = f_inf - f_inf;
288     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
289     if ((mxcsr & EXC) != IE) {
290         printf("FAIL: float sub inf inf\n");
291         ret = 1;
292     }
293     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
294     f_res = f_snan - f_third;
295     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
296     if ((mxcsr & EXC) != IE) {
297         printf("FAIL: float sub snan\n");
298         ret = 1;
299     }
300     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
301     f_res = f_min - f_true_min;
302     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
303     if ((mxcsr & EXC) != (UE | PE)) {
304         printf("FAIL: float sub FTZ underflow\n");
305         ret = 1;
306     }
307 
308     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
309     d_res = d_max - d_nmax;
310     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
311     if ((mxcsr & EXC) != (OE | PE)) {
312         printf("FAIL: double sub overflow\n");
313         ret = 1;
314     }
315     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
316     d_res = d_max - d_min;
317     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
318     if ((mxcsr & EXC) != PE) {
319         printf("FAIL: double sub inexact\n");
320         ret = 1;
321     }
322     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
323     d_res = d_inf - d_inf;
324     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
325     if ((mxcsr & EXC) != IE) {
326         printf("FAIL: double sub inf inf\n");
327         ret = 1;
328     }
329     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
330     d_res = d_snan - d_third;
331     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
332     if ((mxcsr & EXC) != IE) {
333         printf("FAIL: double sub snan\n");
334         ret = 1;
335     }
336     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
337     d_res = d_min - d_true_min;
338     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
339     if ((mxcsr & EXC) != (UE | PE)) {
340         printf("FAIL: double sub FTZ underflow\n");
341         ret = 1;
342     }
343 
344     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
345     f_res = f_max * f_max;
346     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
347     if ((mxcsr & EXC) != (OE | PE)) {
348         printf("FAIL: float mul overflow\n");
349         ret = 1;
350     }
351     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
352     f_res = f_third * f_third;
353     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
354     if ((mxcsr & EXC) != PE) {
355         printf("FAIL: float mul inexact\n");
356         ret = 1;
357     }
358     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
359     f_res = f_min * f_min;
360     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
361     if ((mxcsr & EXC) != (UE | PE)) {
362         printf("FAIL: float mul underflow\n");
363         ret = 1;
364     }
365     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
366     f_res = f_inf * f_zero;
367     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
368     if ((mxcsr & EXC) != IE) {
369         printf("FAIL: float mul inf 0\n");
370         ret = 1;
371     }
372     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
373     f_res = f_snan * f_third;
374     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
375     if ((mxcsr & EXC) != IE) {
376         printf("FAIL: float mul snan\n");
377         ret = 1;
378     }
379     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
380     f_res = f_min * f_half;
381     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
382     if ((mxcsr & EXC) != (UE | PE)) {
383         printf("FAIL: float mul FTZ underflow\n");
384         ret = 1;
385     }
386 
387     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
388     d_res = d_max * d_max;
389     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
390     if ((mxcsr & EXC) != (OE | PE)) {
391         printf("FAIL: double mul overflow\n");
392         ret = 1;
393     }
394     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
395     d_res = d_third * d_third;
396     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
397     if ((mxcsr & EXC) != PE) {
398         printf("FAIL: double mul inexact\n");
399         ret = 1;
400     }
401     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
402     d_res = d_min * d_min;
403     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
404     if ((mxcsr & EXC) != (UE | PE)) {
405         printf("FAIL: double mul underflow\n");
406         ret = 1;
407     }
408     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
409     d_res = d_inf * d_zero;
410     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
411     if ((mxcsr & EXC) != IE) {
412         printf("FAIL: double mul inf 0\n");
413         ret = 1;
414     }
415     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
416     d_res = d_snan * d_third;
417     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
418     if ((mxcsr & EXC) != IE) {
419         printf("FAIL: double mul snan\n");
420         ret = 1;
421     }
422     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
423     d_res = d_min * d_half;
424     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
425     if ((mxcsr & EXC) != (UE | PE)) {
426         printf("FAIL: double mul FTZ underflow\n");
427         ret = 1;
428     }
429 
430     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
431     f_res = f_max / f_min;
432     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
433     if ((mxcsr & EXC) != (OE | PE)) {
434         printf("FAIL: float div overflow\n");
435         ret = 1;
436     }
437     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
438     f_res = f_one / f_third;
439     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
440     if ((mxcsr & EXC) != PE) {
441         printf("FAIL: float div inexact\n");
442         ret = 1;
443     }
444     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
445     f_res = f_min / f_max;
446     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
447     if ((mxcsr & EXC) != (UE | PE)) {
448         printf("FAIL: float div underflow\n");
449         ret = 1;
450     }
451     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
452     f_res = f_one / f_zero;
453     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
454     if ((mxcsr & EXC) != ZE) {
455         printf("FAIL: float div 1 0\n");
456         ret = 1;
457     }
458     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
459     f_res = f_inf / f_zero;
460     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
461     if ((mxcsr & EXC) != 0) {
462         printf("FAIL: float div inf 0\n");
463         ret = 1;
464     }
465     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
466     f_res = f_nan / f_zero;
467     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
468     if ((mxcsr & EXC) != 0) {
469         printf("FAIL: float div nan 0\n");
470         ret = 1;
471     }
472     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
473     f_res = f_zero / f_zero;
474     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
475     if ((mxcsr & EXC) != IE) {
476         printf("FAIL: float div 0 0\n");
477         ret = 1;
478     }
479     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
480     f_res = f_inf / f_inf;
481     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
482     if ((mxcsr & EXC) != IE) {
483         printf("FAIL: float div inf inf\n");
484         ret = 1;
485     }
486     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
487     f_res = f_snan / f_third;
488     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
489     if ((mxcsr & EXC) != IE) {
490         printf("FAIL: float div snan\n");
491         ret = 1;
492     }
493     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
494     f_res = f_min / f_two;
495     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
496     if ((mxcsr & EXC) != (UE | PE)) {
497         printf("FAIL: float div FTZ underflow\n");
498         ret = 1;
499     }
500 
501     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
502     d_res = d_max / d_min;
503     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
504     if ((mxcsr & EXC) != (OE | PE)) {
505         printf("FAIL: double div overflow\n");
506         ret = 1;
507     }
508     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
509     d_res = d_one / d_third;
510     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
511     if ((mxcsr & EXC) != PE) {
512         printf("FAIL: double div inexact\n");
513         ret = 1;
514     }
515     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
516     d_res = d_min / d_max;
517     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
518     if ((mxcsr & EXC) != (UE | PE)) {
519         printf("FAIL: double div underflow\n");
520         ret = 1;
521     }
522     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
523     d_res = d_one / d_zero;
524     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
525     if ((mxcsr & EXC) != ZE) {
526         printf("FAIL: double div 1 0\n");
527         ret = 1;
528     }
529     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
530     d_res = d_inf / d_zero;
531     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
532     if ((mxcsr & EXC) != 0) {
533         printf("FAIL: double div inf 0\n");
534         ret = 1;
535     }
536     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
537     d_res = d_nan / d_zero;
538     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
539     if ((mxcsr & EXC) != 0) {
540         printf("FAIL: double div nan 0\n");
541         ret = 1;
542     }
543     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
544     d_res = d_zero / d_zero;
545     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
546     if ((mxcsr & EXC) != IE) {
547         printf("FAIL: double div 0 0\n");
548         ret = 1;
549     }
550     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
551     d_res = d_inf / d_inf;
552     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
553     if ((mxcsr & EXC) != IE) {
554         printf("FAIL: double div inf inf\n");
555         ret = 1;
556     }
557     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
558     d_res = d_snan / d_third;
559     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
560     if ((mxcsr & EXC) != IE) {
561         printf("FAIL: double div snan\n");
562         ret = 1;
563     }
564     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_ftz));
565     d_res = d_min / d_two;
566     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
567     if ((mxcsr & EXC) != (UE | PE)) {
568         printf("FAIL: double div FTZ underflow\n");
569         ret = 1;
570     }
571 
572     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
573     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_max));
574     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
575     if ((mxcsr & EXC) != PE) {
576         printf("FAIL: sqrtss inexact\n");
577         ret = 1;
578     }
579     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
580     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_nmax));
581     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
582     if ((mxcsr & EXC) != IE) {
583         printf("FAIL: sqrtss -max\n");
584         ret = 1;
585     }
586     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
587     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_ninf));
588     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
589     if ((mxcsr & EXC) != IE) {
590         printf("FAIL: sqrtss -inf\n");
591         ret = 1;
592     }
593     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
594     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_snan));
595     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
596     if ((mxcsr & EXC) != IE) {
597         printf("FAIL: sqrtss snan\n");
598         ret = 1;
599     }
600     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
601     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) : "0" (f_nzero));
602     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
603     if ((mxcsr & EXC) != 0) {
604         printf("FAIL: sqrtss -0\n");
605         ret = 1;
606     }
607     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
608     __asm__ volatile ("sqrtss %0, %0" : "=x" (f_res) :
609                       "0" (-__builtin_nanf("")));
610     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
611     if ((mxcsr & EXC) != 0) {
612         printf("FAIL: sqrtss -nan\n");
613         ret = 1;
614     }
615 
616     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
617     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_max));
618     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
619     if ((mxcsr & EXC) != PE) {
620         printf("FAIL: sqrtsd inexact\n");
621         ret = 1;
622     }
623     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
624     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_nmax));
625     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
626     if ((mxcsr & EXC) != IE) {
627         printf("FAIL: sqrtsd -max\n");
628         ret = 1;
629     }
630     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
631     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_ninf));
632     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
633     if ((mxcsr & EXC) != IE) {
634         printf("FAIL: sqrtsd -inf\n");
635         ret = 1;
636     }
637     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
638     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_snan));
639     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
640     if ((mxcsr & EXC) != IE) {
641         printf("FAIL: sqrtsd snan\n");
642         ret = 1;
643     }
644     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
645     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) : "0" (d_nzero));
646     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
647     if ((mxcsr & EXC) != 0) {
648         printf("FAIL: sqrtsd -0\n");
649         ret = 1;
650     }
651     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
652     __asm__ volatile ("sqrtsd %0, %0" : "=x" (d_res) :
653                       "0" (-__builtin_nan("")));
654     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
655     if ((mxcsr & EXC) != 0) {
656         printf("FAIL: sqrtsd -nan\n");
657         ret = 1;
658     }
659 
660     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
661     __asm__ volatile ("maxss %1, %0" : : "x" (f_nan), "x" (f_zero));
662     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
663     if ((mxcsr & EXC) != IE) {
664         printf("FAIL: maxss nan\n");
665         ret = 1;
666     }
667     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
668     __asm__ volatile ("minss %1, %0" : : "x" (f_nan), "x" (f_zero));
669     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
670     if ((mxcsr & EXC) != IE) {
671         printf("FAIL: minss nan\n");
672         ret = 1;
673     }
674 
675     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
676     __asm__ volatile ("maxsd %1, %0" : : "x" (d_nan), "x" (d_zero));
677     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
678     if ((mxcsr & EXC) != IE) {
679         printf("FAIL: maxsd nan\n");
680         ret = 1;
681     }
682     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
683     __asm__ volatile ("minsd %1, %0" : : "x" (d_nan), "x" (d_zero));
684     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
685     if ((mxcsr & EXC) != IE) {
686         printf("FAIL: minsd nan\n");
687         ret = 1;
688     }
689 
690     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
691     __asm__ volatile ("cvtsi2ss %1, %0" : "=x" (f_res) : "m" (i32_max));
692     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
693     if ((mxcsr & EXC) != PE) {
694         printf("FAIL: cvtsi2ss inexact\n");
695         ret = 1;
696     }
697 
698     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
699     __asm__ volatile ("cvtsi2sd %1, %0" : "=x" (d_res) : "m" (i32_max));
700     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
701     if ((mxcsr & EXC) != 0) {
702         printf("FAIL: cvtsi2sd exact\n");
703         ret = 1;
704     }
705 
706     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
707     __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (1.5f));
708     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
709     if ((mxcsr & EXC) != PE) {
710         printf("FAIL: cvtss2si inexact\n");
711         ret = 1;
712     }
713     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
714     __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (0x1p31f));
715     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
716     if ((mxcsr & EXC) != IE) {
717         printf("FAIL: cvtss2si 0x1p31\n");
718         ret = 1;
719     }
720     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
721     __asm__ volatile ("cvtss2si %1, %0" : "=r" (i32_res) : "x" (f_inf));
722     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
723     if ((mxcsr & EXC) != IE) {
724         printf("FAIL: cvtss2si inf\n");
725         ret = 1;
726     }
727 
728     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
729     __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (1.5));
730     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
731     if ((mxcsr & EXC) != PE) {
732         printf("FAIL: cvtsd2si inexact\n");
733         ret = 1;
734     }
735     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
736     __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (0x1p31));
737     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
738     if ((mxcsr & EXC) != IE) {
739         printf("FAIL: cvtsd2si 0x1p31\n");
740         ret = 1;
741     }
742     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
743     __asm__ volatile ("cvtsd2si %1, %0" : "=r" (i32_res) : "x" (d_inf));
744     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
745     if ((mxcsr & EXC) != IE) {
746         printf("FAIL: cvtsd2si inf\n");
747         ret = 1;
748     }
749 
750     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
751     __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (1.5f));
752     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
753     if ((mxcsr & EXC) != PE) {
754         printf("FAIL: cvttss2si inexact\n");
755         ret = 1;
756     }
757     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
758     __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (0x1p31f));
759     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
760     if ((mxcsr & EXC) != IE) {
761         printf("FAIL: cvttss2si 0x1p31\n");
762         ret = 1;
763     }
764     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
765     __asm__ volatile ("cvttss2si %1, %0" : "=r" (i32_res) : "x" (f_inf));
766     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
767     if ((mxcsr & EXC) != IE) {
768         printf("FAIL: cvttss2si inf\n");
769         ret = 1;
770     }
771 
772     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
773     __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (1.5));
774     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
775     if ((mxcsr & EXC) != PE) {
776         printf("FAIL: cvttsd2si inexact\n");
777         ret = 1;
778     }
779     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
780     __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (0x1p31));
781     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
782     if ((mxcsr & EXC) != IE) {
783         printf("FAIL: cvttsd2si 0x1p31\n");
784         ret = 1;
785     }
786     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
787     __asm__ volatile ("cvttsd2si %1, %0" : "=r" (i32_res) : "x" (d_inf));
788     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
789     if ((mxcsr & EXC) != IE) {
790         printf("FAIL: cvttsd2si inf\n");
791         ret = 1;
792     }
793 
794     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
795     __asm__ volatile ("rcpss %0, %0" : "=x" (f_res) : "0" (f_snan));
796     f_res += f_one;
797     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
798     if ((mxcsr & EXC) != 0) {
799         printf("FAIL: rcpss snan\n");
800         ret = 1;
801     }
802 
803     __asm__ volatile ("ldmxcsr %0" : : "m" (mxcsr_default));
804     __asm__ volatile ("rsqrtss %0, %0" : "=x" (f_res) : "0" (f_snan));
805     f_res += f_one;
806     __asm__ volatile ("stmxcsr %0" : "=m" (mxcsr));
807     if ((mxcsr & EXC) != 0) {
808         printf("FAIL: rsqrtss snan\n");
809         ret = 1;
810     }
811 
812     return ret;
813 }
814