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