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 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