118c53e1eSJoseph Myers /* Test fbstp instruction. */ 218c53e1eSJoseph Myers 3*374ff4d0SJoseph Myers #include <stdint.h> 418c53e1eSJoseph Myers #include <stdio.h> 518c53e1eSJoseph Myers #include <string.h> 618c53e1eSJoseph Myers 7*374ff4d0SJoseph Myers union u { 8*374ff4d0SJoseph Myers struct { uint64_t sig; uint16_t sign_exp; } s; 9*374ff4d0SJoseph Myers long double ld; 10*374ff4d0SJoseph Myers }; 11*374ff4d0SJoseph Myers 12*374ff4d0SJoseph Myers volatile union u ld_invalid_1 = { .s = { 1, 1234 } }; 13*374ff4d0SJoseph Myers volatile union u ld_invalid_2 = { .s = { 0, 1234 } }; 14*374ff4d0SJoseph Myers volatile union u ld_invalid_3 = { .s = { 0, 0x7fff } }; 15*374ff4d0SJoseph Myers volatile union u ld_invalid_4 = { .s = { (UINT64_C(1) << 63) - 1, 0x7fff } }; 16*374ff4d0SJoseph Myers 1718c53e1eSJoseph Myers int main(void) 1818c53e1eSJoseph Myers { 1918c53e1eSJoseph Myers int ret = 0; 2018c53e1eSJoseph Myers unsigned char out[10]; 2118c53e1eSJoseph Myers memset(out, 0xfe, sizeof out); 2218c53e1eSJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-0.0L) : "st"); 2318c53e1eSJoseph Myers out[9] &= 0x80; 2418c53e1eSJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\0\0\x80", sizeof out) != 0) { 2518c53e1eSJoseph Myers printf("FAIL: fbstp -0\n"); 2618c53e1eSJoseph Myers ret = 1; 2718c53e1eSJoseph Myers } 2818c53e1eSJoseph Myers memset(out, 0x12, sizeof out); 2918c53e1eSJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-0.1L) : "st"); 3018c53e1eSJoseph Myers out[9] &= 0x80; 3118c53e1eSJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\0\0\x80", sizeof out) != 0) { 3218c53e1eSJoseph Myers printf("FAIL: fbstp -0.1\n"); 3318c53e1eSJoseph Myers ret = 1; 3418c53e1eSJoseph Myers } 35*374ff4d0SJoseph Myers memset(out, 0x1f, sizeof out); 36*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-987654321987654321.0L) : 37*374ff4d0SJoseph Myers "st"); 38*374ff4d0SJoseph Myers out[9] &= 0x80; 39*374ff4d0SJoseph Myers if (memcmp(out, "\x21\x43\x65\x87\x19\x32\x54\x76\x98\x80", 40*374ff4d0SJoseph Myers sizeof out) != 0) { 41*374ff4d0SJoseph Myers printf("FAIL: fbstp -987654321987654321\n"); 42*374ff4d0SJoseph Myers ret = 1; 43*374ff4d0SJoseph Myers } 44*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 45*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (999999999999999999.5L) : 46*374ff4d0SJoseph Myers "st"); 47*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 48*374ff4d0SJoseph Myers printf("FAIL: fbstp 999999999999999999.5\n"); 49*374ff4d0SJoseph Myers ret = 1; 50*374ff4d0SJoseph Myers } 51*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 52*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (1000000000000000000.0L) : 53*374ff4d0SJoseph Myers "st"); 54*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 55*374ff4d0SJoseph Myers printf("FAIL: fbstp 1000000000000000000\n"); 56*374ff4d0SJoseph Myers ret = 1; 57*374ff4d0SJoseph Myers } 58*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 59*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (1e30L) : "st"); 60*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 61*374ff4d0SJoseph Myers printf("FAIL: fbstp 1e30\n"); 62*374ff4d0SJoseph Myers ret = 1; 63*374ff4d0SJoseph Myers } 64*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 65*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-999999999999999999.5L) : 66*374ff4d0SJoseph Myers "st"); 67*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 68*374ff4d0SJoseph Myers printf("FAIL: fbstp -999999999999999999.5\n"); 69*374ff4d0SJoseph Myers ret = 1; 70*374ff4d0SJoseph Myers } 71*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 72*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-1000000000000000000.0L) : 73*374ff4d0SJoseph Myers "st"); 74*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 75*374ff4d0SJoseph Myers printf("FAIL: fbstp -1000000000000000000\n"); 76*374ff4d0SJoseph Myers ret = 1; 77*374ff4d0SJoseph Myers } 78*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 79*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-1e30L) : "st"); 80*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 81*374ff4d0SJoseph Myers printf("FAIL: fbstp -1e30\n"); 82*374ff4d0SJoseph Myers ret = 1; 83*374ff4d0SJoseph Myers } 84*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 85*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (__builtin_infl()) : "st"); 86*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 87*374ff4d0SJoseph Myers printf("FAIL: fbstp inf\n"); 88*374ff4d0SJoseph Myers ret = 1; 89*374ff4d0SJoseph Myers } 90*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 91*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-__builtin_infl()) : 92*374ff4d0SJoseph Myers "st"); 93*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 94*374ff4d0SJoseph Myers printf("FAIL: fbstp -inf\n"); 95*374ff4d0SJoseph Myers ret = 1; 96*374ff4d0SJoseph Myers } 97*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 98*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (__builtin_nanl("")) : 99*374ff4d0SJoseph Myers "st"); 100*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 101*374ff4d0SJoseph Myers printf("FAIL: fbstp nan\n"); 102*374ff4d0SJoseph Myers ret = 1; 103*374ff4d0SJoseph Myers } 104*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 105*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (-__builtin_nanl("")) : 106*374ff4d0SJoseph Myers "st"); 107*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 108*374ff4d0SJoseph Myers printf("FAIL: fbstp -nan\n"); 109*374ff4d0SJoseph Myers ret = 1; 110*374ff4d0SJoseph Myers } 111*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 112*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_1.ld) : 113*374ff4d0SJoseph Myers "st"); 114*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 115*374ff4d0SJoseph Myers printf("FAIL: fbstp invalid 1\n"); 116*374ff4d0SJoseph Myers ret = 1; 117*374ff4d0SJoseph Myers } 118*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 119*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_2.ld) : 120*374ff4d0SJoseph Myers "st"); 121*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 122*374ff4d0SJoseph Myers printf("FAIL: fbstp invalid 2\n"); 123*374ff4d0SJoseph Myers ret = 1; 124*374ff4d0SJoseph Myers } 125*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 126*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_3.ld) : 127*374ff4d0SJoseph Myers "st"); 128*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 129*374ff4d0SJoseph Myers printf("FAIL: fbstp invalid 3\n"); 130*374ff4d0SJoseph Myers ret = 1; 131*374ff4d0SJoseph Myers } 132*374ff4d0SJoseph Myers memset(out, 0x12, sizeof out); 133*374ff4d0SJoseph Myers __asm__ volatile ("fbstp %0" : "=m" (out) : "t" (ld_invalid_4.ld) : 134*374ff4d0SJoseph Myers "st"); 135*374ff4d0SJoseph Myers if (memcmp(out, "\0\0\0\0\0\0\0\xc0\xff\xff", sizeof out) != 0) { 136*374ff4d0SJoseph Myers printf("FAIL: fbstp invalid 4\n"); 137*374ff4d0SJoseph Myers ret = 1; 138*374ff4d0SJoseph Myers } 13918c53e1eSJoseph Myers return ret; 14018c53e1eSJoseph Myers } 141