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