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