xref: /qemu/tests/tcg/i386/test-i386-fisttp.c (revision 7d3660e79830a069f1848bb4fa1cdf8f666424fb)
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 Myers int 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