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