1*c8af85b1SJoseph Myers /* Test fisttpl and fisttpll instructions. */ 2*c8af85b1SJoseph Myers 3*c8af85b1SJoseph Myers #include <stdint.h> 4*c8af85b1SJoseph Myers #include <stdio.h> 5*c8af85b1SJoseph Myers #include <string.h> 6*c8af85b1SJoseph Myers 7*c8af85b1SJoseph Myers union u { 8*c8af85b1SJoseph Myers struct { uint64_t sig; uint16_t sign_exp; } s; 9*c8af85b1SJoseph Myers long double ld; 10*c8af85b1SJoseph Myers }; 11*c8af85b1SJoseph Myers 12*c8af85b1SJoseph Myers volatile union u ld_invalid_1 = { .s = { 1, 1234 } }; 13*c8af85b1SJoseph Myers main(void)14*c8af85b1SJoseph Myersint main(void) 15*c8af85b1SJoseph Myers { 16*c8af85b1SJoseph Myers int ret = 0; 17*c8af85b1SJoseph Myers int32_t res_32; 18*c8af85b1SJoseph Myers int64_t res_64; 19*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (0x1p100L) : "st"); 20*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 21*c8af85b1SJoseph Myers printf("FAIL: fisttpl 0x1p100\n"); 22*c8af85b1SJoseph Myers ret = 1; 23*c8af85b1SJoseph Myers } 24*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (-0x1p100L) : "st"); 25*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 26*c8af85b1SJoseph Myers printf("FAIL: fisttpl -0x1p100\n"); 27*c8af85b1SJoseph Myers ret = 1; 28*c8af85b1SJoseph Myers } 29*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (__builtin_infl()) : 30*c8af85b1SJoseph Myers "st"); 31*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 32*c8af85b1SJoseph Myers printf("FAIL: fisttpl inf\n"); 33*c8af85b1SJoseph Myers ret = 1; 34*c8af85b1SJoseph Myers } 35*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (-__builtin_infl()) : 36*c8af85b1SJoseph Myers "st"); 37*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 38*c8af85b1SJoseph Myers printf("FAIL: fisttpl -inf\n"); 39*c8af85b1SJoseph Myers ret = 1; 40*c8af85b1SJoseph Myers } 41*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (__builtin_nanl("")) : 42*c8af85b1SJoseph Myers "st"); 43*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 44*c8af85b1SJoseph Myers printf("FAIL: fisttpl nan\n"); 45*c8af85b1SJoseph Myers ret = 1; 46*c8af85b1SJoseph Myers } 47*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : 48*c8af85b1SJoseph Myers "t" (-__builtin_nanl("")) : "st"); 49*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 50*c8af85b1SJoseph Myers printf("FAIL: fisttpl -nan\n"); 51*c8af85b1SJoseph Myers ret = 1; 52*c8af85b1SJoseph Myers } 53*c8af85b1SJoseph Myers __asm__ volatile ("fisttpl %0" : "=m" (res_32) : "t" (ld_invalid_1.ld) : 54*c8af85b1SJoseph Myers "st"); 55*c8af85b1SJoseph Myers if (res_32 != INT32_MIN) { 56*c8af85b1SJoseph Myers printf("FAIL: fisttpl invalid\n"); 57*c8af85b1SJoseph Myers ret = 1; 58*c8af85b1SJoseph Myers } 59*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (0x1p100L) : "st"); 60*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 61*c8af85b1SJoseph Myers printf("FAIL: fisttpll 0x1p100\n"); 62*c8af85b1SJoseph Myers ret = 1; 63*c8af85b1SJoseph Myers } 64*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (-0x1p100L) : "st"); 65*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 66*c8af85b1SJoseph Myers printf("FAIL: fisttpll -0x1p100\n"); 67*c8af85b1SJoseph Myers ret = 1; 68*c8af85b1SJoseph Myers } 69*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (__builtin_infl()) : 70*c8af85b1SJoseph Myers "st"); 71*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 72*c8af85b1SJoseph Myers printf("FAIL: fisttpll inf\n"); 73*c8af85b1SJoseph Myers ret = 1; 74*c8af85b1SJoseph Myers } 75*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (-__builtin_infl()) : 76*c8af85b1SJoseph Myers "st"); 77*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 78*c8af85b1SJoseph Myers printf("FAIL: fisttpll -inf\n"); 79*c8af85b1SJoseph Myers ret = 1; 80*c8af85b1SJoseph Myers } 81*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : 82*c8af85b1SJoseph Myers "t" (__builtin_nanl("")) : "st"); 83*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 84*c8af85b1SJoseph Myers printf("FAIL: fisttpll nan\n"); 85*c8af85b1SJoseph Myers ret = 1; 86*c8af85b1SJoseph Myers } 87*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : 88*c8af85b1SJoseph Myers "t" (-__builtin_nanl("")) : "st"); 89*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 90*c8af85b1SJoseph Myers printf("FAIL: fisttpll -nan\n"); 91*c8af85b1SJoseph Myers ret = 1; 92*c8af85b1SJoseph Myers } 93*c8af85b1SJoseph Myers __asm__ volatile ("fisttpll %0" : "=m" (res_64) : "t" (ld_invalid_1.ld) : 94*c8af85b1SJoseph Myers "st"); 95*c8af85b1SJoseph Myers if (res_64 != INT64_MIN) { 96*c8af85b1SJoseph Myers printf("FAIL: fisttpll invalid\n"); 97*c8af85b1SJoseph Myers ret = 1; 98*c8af85b1SJoseph Myers } 99*c8af85b1SJoseph Myers return ret; 100*c8af85b1SJoseph Myers } 101