1*34b9cc07SJoseph Myers /* Test fxam instruction. */
2*34b9cc07SJoseph Myers
3*34b9cc07SJoseph Myers #include <stdint.h>
4*34b9cc07SJoseph Myers #include <stdio.h>
5*34b9cc07SJoseph Myers
6*34b9cc07SJoseph Myers union u {
7*34b9cc07SJoseph Myers struct { uint64_t sig; uint16_t sign_exp; } s;
8*34b9cc07SJoseph Myers long double ld;
9*34b9cc07SJoseph Myers };
10*34b9cc07SJoseph Myers
11*34b9cc07SJoseph Myers volatile union u ld_pseudo_m16382 = { .s = { UINT64_C(1) << 63, 0 } };
12*34b9cc07SJoseph Myers volatile union u ld_pseudo_nm16382 = { .s = { UINT64_C(1) << 63, 0x8000 } };
13*34b9cc07SJoseph Myers volatile union u ld_invalid_1 = { .s = { 1, 1234 } };
14*34b9cc07SJoseph Myers volatile union u ld_invalid_2 = { .s = { 0, 1234 } };
15*34b9cc07SJoseph Myers volatile union u ld_invalid_3 = { .s = { 0, 0x7fff } };
16*34b9cc07SJoseph Myers volatile union u ld_invalid_4 = { .s = { (UINT64_C(1) << 63) - 1, 0x7fff } };
17*34b9cc07SJoseph Myers volatile union u ld_invalid_n1 = { .s = { 1, 0x8123 } };
18*34b9cc07SJoseph Myers volatile union u ld_invalid_n2 = { .s = { 0, 0x8123 } };
19*34b9cc07SJoseph Myers volatile union u ld_invalid_n3 = { .s = { 0, 0xffff } };
20*34b9cc07SJoseph Myers volatile union u ld_invalid_n4 = { .s = { (UINT64_C(1) << 63) - 1, 0xffff } };
21*34b9cc07SJoseph Myers
22*34b9cc07SJoseph Myers #define C0 (1 << 8)
23*34b9cc07SJoseph Myers #define C1 (1 << 9)
24*34b9cc07SJoseph Myers #define C2 (1 << 10)
25*34b9cc07SJoseph Myers #define C3 (1 << 14)
26*34b9cc07SJoseph Myers #define FLAGS (C0 | C1 | C2 | C3)
27*34b9cc07SJoseph Myers
main(void)28*34b9cc07SJoseph Myers int main(void)
29*34b9cc07SJoseph Myers {
30*34b9cc07SJoseph Myers short sw;
31*34b9cc07SJoseph Myers int ret = 0;
32*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (0.0L));
33*34b9cc07SJoseph Myers if ((sw & FLAGS) != C3) {
34*34b9cc07SJoseph Myers printf("FAIL: +0\n");
35*34b9cc07SJoseph Myers ret = 1;
36*34b9cc07SJoseph Myers }
37*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-0.0L));
38*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C3 | C1)) {
39*34b9cc07SJoseph Myers printf("FAIL: -0\n");
40*34b9cc07SJoseph Myers ret = 1;
41*34b9cc07SJoseph Myers }
42*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (1.0L));
43*34b9cc07SJoseph Myers if ((sw & FLAGS) != C2) {
44*34b9cc07SJoseph Myers printf("FAIL: +normal\n");
45*34b9cc07SJoseph Myers ret = 1;
46*34b9cc07SJoseph Myers }
47*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-1.0L));
48*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C2 | C1)) {
49*34b9cc07SJoseph Myers printf("FAIL: -normal\n");
50*34b9cc07SJoseph Myers ret = 1;
51*34b9cc07SJoseph Myers }
52*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (__builtin_infl()));
53*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C2 | C0)) {
54*34b9cc07SJoseph Myers printf("FAIL: +inf\n");
55*34b9cc07SJoseph Myers ret = 1;
56*34b9cc07SJoseph Myers }
57*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-__builtin_infl()));
58*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C2 | C1 | C0)) {
59*34b9cc07SJoseph Myers printf("FAIL: -inf\n");
60*34b9cc07SJoseph Myers ret = 1;
61*34b9cc07SJoseph Myers }
62*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (__builtin_nanl("")));
63*34b9cc07SJoseph Myers if ((sw & FLAGS) != C0) {
64*34b9cc07SJoseph Myers printf("FAIL: +nan\n");
65*34b9cc07SJoseph Myers ret = 1;
66*34b9cc07SJoseph Myers }
67*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-__builtin_nanl("")));
68*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C1 | C0)) {
69*34b9cc07SJoseph Myers printf("FAIL: -nan\n");
70*34b9cc07SJoseph Myers ret = 1;
71*34b9cc07SJoseph Myers }
72*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (__builtin_nansl("")));
73*34b9cc07SJoseph Myers if ((sw & FLAGS) != C0) {
74*34b9cc07SJoseph Myers printf("FAIL: +snan\n");
75*34b9cc07SJoseph Myers ret = 1;
76*34b9cc07SJoseph Myers }
77*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-__builtin_nansl("")));
78*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C1 | C0)) {
79*34b9cc07SJoseph Myers printf("FAIL: -snan\n");
80*34b9cc07SJoseph Myers ret = 1;
81*34b9cc07SJoseph Myers }
82*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (0x1p-16445L));
83*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C3 | C2)) {
84*34b9cc07SJoseph Myers printf("FAIL: +denormal\n");
85*34b9cc07SJoseph Myers ret = 1;
86*34b9cc07SJoseph Myers }
87*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (-0x1p-16445L));
88*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C3 | C2 | C1)) {
89*34b9cc07SJoseph Myers printf("FAIL: -denormal\n");
90*34b9cc07SJoseph Myers ret = 1;
91*34b9cc07SJoseph Myers }
92*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_pseudo_m16382.ld));
93*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C3 | C2)) {
94*34b9cc07SJoseph Myers printf("FAIL: +pseudo-denormal\n");
95*34b9cc07SJoseph Myers ret = 1;
96*34b9cc07SJoseph Myers }
97*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_pseudo_nm16382.ld));
98*34b9cc07SJoseph Myers if ((sw & FLAGS) != (C3 | C2 | C1)) {
99*34b9cc07SJoseph Myers printf("FAIL: -pseudo-denormal\n");
100*34b9cc07SJoseph Myers ret = 1;
101*34b9cc07SJoseph Myers }
102*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_1.ld));
103*34b9cc07SJoseph Myers if ((sw & FLAGS) != 0) {
104*34b9cc07SJoseph Myers printf("FAIL: +invalid 1\n");
105*34b9cc07SJoseph Myers ret = 1;
106*34b9cc07SJoseph Myers }
107*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_n1.ld));
108*34b9cc07SJoseph Myers if ((sw & FLAGS) != C1) {
109*34b9cc07SJoseph Myers printf("FAIL: -invalid 1\n");
110*34b9cc07SJoseph Myers ret = 1;
111*34b9cc07SJoseph Myers }
112*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_2.ld));
113*34b9cc07SJoseph Myers if ((sw & FLAGS) != 0) {
114*34b9cc07SJoseph Myers printf("FAIL: +invalid 2\n");
115*34b9cc07SJoseph Myers ret = 1;
116*34b9cc07SJoseph Myers }
117*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_n2.ld));
118*34b9cc07SJoseph Myers if ((sw & FLAGS) != C1) {
119*34b9cc07SJoseph Myers printf("FAIL: -invalid 2\n");
120*34b9cc07SJoseph Myers ret = 1;
121*34b9cc07SJoseph Myers }
122*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_3.ld));
123*34b9cc07SJoseph Myers if ((sw & FLAGS) != 0) {
124*34b9cc07SJoseph Myers printf("FAIL: +invalid 3\n");
125*34b9cc07SJoseph Myers ret = 1;
126*34b9cc07SJoseph Myers }
127*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_n3.ld));
128*34b9cc07SJoseph Myers if ((sw & FLAGS) != C1) {
129*34b9cc07SJoseph Myers printf("FAIL: -invalid 3\n");
130*34b9cc07SJoseph Myers ret = 1;
131*34b9cc07SJoseph Myers }
132*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_4.ld));
133*34b9cc07SJoseph Myers if ((sw & FLAGS) != 0) {
134*34b9cc07SJoseph Myers printf("FAIL: +invalid 4\n");
135*34b9cc07SJoseph Myers ret = 1;
136*34b9cc07SJoseph Myers }
137*34b9cc07SJoseph Myers __asm__ volatile ("fxam\nfnstsw" : "=a" (sw) : "t" (ld_invalid_n4.ld));
138*34b9cc07SJoseph Myers if ((sw & FLAGS) != C1) {
139*34b9cc07SJoseph Myers printf("FAIL: -invalid 4\n");
140*34b9cc07SJoseph Myers ret = 1;
141*34b9cc07SJoseph Myers }
142*34b9cc07SJoseph Myers return ret;
143*34b9cc07SJoseph Myers }
144