xref: /qemu/tests/tcg/i386/test-i386-fldcst.c (revision abff1abf)
1 /* Test instructions loading floating-point constants.  */
2 
3 #include <stdint.h>
4 #include <stdio.h>
5 
6 volatile long double ld_res;
7 
8 int main(void)
9 {
10     short cw;
11     int ret = 0;
12 
13     /* Round to nearest.  */
14     __asm__ volatile ("fnstcw %0" : "=m" (cw));
15     cw = (cw & ~0xc00) | 0x000;
16     __asm__ volatile ("fldcw %0" : : "m" (cw));
17     __asm__ volatile ("fldl2t" : "=t" (ld_res));
18     if (ld_res != 0x3.5269e12f346e2bf8p+0L) {
19         printf("FAIL: fldl2t N\n");
20         ret = 1;
21     }
22     /* Round downward.  */
23     __asm__ volatile ("fnstcw %0" : "=m" (cw));
24     cw = (cw & ~0xc00) | 0x400;
25     __asm__ volatile ("fldcw %0" : : "m" (cw));
26     __asm__ volatile ("fldl2t" : "=t" (ld_res));
27     if (ld_res != 0x3.5269e12f346e2bf8p+0L) {
28         printf("FAIL: fldl2t D\n");
29         ret = 1;
30     }
31     /* Round toward zero.  */
32     __asm__ volatile ("fnstcw %0" : "=m" (cw));
33     cw = (cw & ~0xc00) | 0xc00;
34     __asm__ volatile ("fldcw %0" : : "m" (cw));
35     __asm__ volatile ("fldl2t" : "=t" (ld_res));
36     if (ld_res != 0x3.5269e12f346e2bf8p+0L) {
37         printf("FAIL: fldl2t Z\n");
38         ret = 1;
39     }
40     /* Round upward.  */
41     __asm__ volatile ("fnstcw %0" : "=m" (cw));
42     cw = (cw & ~0xc00) | 0x800;
43     __asm__ volatile ("fldcw %0" : : "m" (cw));
44     __asm__ volatile ("fldl2t" : "=t" (ld_res));
45     if (ld_res != 0x3.5269e12f346e2bfcp+0L) {
46         printf("FAIL: fldl2t U\n");
47         ret = 1;
48     }
49 
50     /* Round to nearest.  */
51     __asm__ volatile ("fnstcw %0" : "=m" (cw));
52     cw = (cw & ~0xc00) | 0x000;
53     __asm__ volatile ("fldcw %0" : : "m" (cw));
54     __asm__ volatile ("fldl2e" : "=t" (ld_res));
55     if (ld_res != 0x1.71547652b82fe178p+0L) {
56         printf("FAIL: fldl2e N\n");
57         ret = 1;
58     }
59     /* Round downward.  */
60     __asm__ volatile ("fnstcw %0" : "=m" (cw));
61     cw = (cw & ~0xc00) | 0x400;
62     __asm__ volatile ("fldcw %0" : : "m" (cw));
63     __asm__ volatile ("fldl2e" : "=t" (ld_res));
64     if (ld_res != 0x1.71547652b82fe176p+0L) {
65         printf("FAIL: fldl2e D\n");
66         ret = 1;
67     }
68     /* Round toward zero.  */
69     __asm__ volatile ("fnstcw %0" : "=m" (cw));
70     cw = (cw & ~0xc00) | 0xc00;
71     __asm__ volatile ("fldcw %0" : : "m" (cw));
72     __asm__ volatile ("fldl2e" : "=t" (ld_res));
73     if (ld_res != 0x1.71547652b82fe176p+0L) {
74         printf("FAIL: fldl2e Z\n");
75         ret = 1;
76     }
77     /* Round upward.  */
78     __asm__ volatile ("fnstcw %0" : "=m" (cw));
79     cw = (cw & ~0xc00) | 0x800;
80     __asm__ volatile ("fldcw %0" : : "m" (cw));
81     __asm__ volatile ("fldl2e" : "=t" (ld_res));
82     if (ld_res != 0x1.71547652b82fe178p+0L) {
83         printf("FAIL: fldl2e U\n");
84         ret = 1;
85     }
86 
87     /* Round to nearest.  */
88     __asm__ volatile ("fnstcw %0" : "=m" (cw));
89     cw = (cw & ~0xc00) | 0x000;
90     __asm__ volatile ("fldcw %0" : : "m" (cw));
91     __asm__ volatile ("fldpi" : "=t" (ld_res));
92     if (ld_res != 0x3.243f6a8885a308d4p+0L) {
93         printf("FAIL: fldpi N\n");
94         ret = 1;
95     }
96     /* Round downward.  */
97     __asm__ volatile ("fnstcw %0" : "=m" (cw));
98     cw = (cw & ~0xc00) | 0x400;
99     __asm__ volatile ("fldcw %0" : : "m" (cw));
100     __asm__ volatile ("fldpi" : "=t" (ld_res));
101     if (ld_res != 0x3.243f6a8885a308dp+0L) {
102         printf("FAIL: fldpi D\n");
103         ret = 1;
104     }
105     /* Round toward zero.  */
106     __asm__ volatile ("fnstcw %0" : "=m" (cw));
107     cw = (cw & ~0xc00) | 0xc00;
108     __asm__ volatile ("fldcw %0" : : "m" (cw));
109     __asm__ volatile ("fldpi" : "=t" (ld_res));
110     if (ld_res != 0x3.243f6a8885a308dp+0L) {
111         printf("FAIL: fldpi Z\n");
112         ret = 1;
113     }
114     /* Round upward.  */
115     __asm__ volatile ("fnstcw %0" : "=m" (cw));
116     cw = (cw & ~0xc00) | 0x800;
117     __asm__ volatile ("fldcw %0" : : "m" (cw));
118     __asm__ volatile ("fldpi" : "=t" (ld_res));
119     if (ld_res != 0x3.243f6a8885a308d4p+0L) {
120         printf("FAIL: fldpi U\n");
121         ret = 1;
122     }
123 
124     /* Round to nearest.  */
125     __asm__ volatile ("fnstcw %0" : "=m" (cw));
126     cw = (cw & ~0xc00) | 0x000;
127     __asm__ volatile ("fldcw %0" : : "m" (cw));
128     __asm__ volatile ("fldlg2" : "=t" (ld_res));
129     if (ld_res != 0x4.d104d427de7fbcc8p-4L) {
130         printf("FAIL: fldlg2 N\n");
131         ret = 1;
132     }
133     /* Round downward.  */
134     __asm__ volatile ("fnstcw %0" : "=m" (cw));
135     cw = (cw & ~0xc00) | 0x400;
136     __asm__ volatile ("fldcw %0" : : "m" (cw));
137     __asm__ volatile ("fldlg2" : "=t" (ld_res));
138     if (ld_res != 0x4.d104d427de7fbccp-4L) {
139         printf("FAIL: fldlg2 D\n");
140         ret = 1;
141     }
142     /* Round toward zero.  */
143     __asm__ volatile ("fnstcw %0" : "=m" (cw));
144     cw = (cw & ~0xc00) | 0xc00;
145     __asm__ volatile ("fldcw %0" : : "m" (cw));
146     __asm__ volatile ("fldlg2" : "=t" (ld_res));
147     if (ld_res != 0x4.d104d427de7fbccp-4L) {
148         printf("FAIL: fldlg2 Z\n");
149         ret = 1;
150     }
151     /* Round upward.  */
152     __asm__ volatile ("fnstcw %0" : "=m" (cw));
153     cw = (cw & ~0xc00) | 0x800;
154     __asm__ volatile ("fldcw %0" : : "m" (cw));
155     __asm__ volatile ("fldlg2" : "=t" (ld_res));
156     if (ld_res != 0x4.d104d427de7fbcc8p-4L) {
157         printf("FAIL: fldlg2 U\n");
158         ret = 1;
159     }
160 
161     /* Round to nearest.  */
162     __asm__ volatile ("fnstcw %0" : "=m" (cw));
163     cw = (cw & ~0xc00) | 0x000;
164     __asm__ volatile ("fldcw %0" : : "m" (cw));
165     __asm__ volatile ("fldln2" : "=t" (ld_res));
166     if (ld_res != 0xb.17217f7d1cf79acp-4L) {
167         printf("FAIL: fldln2 N\n");
168         ret = 1;
169     }
170     /* Round downward.  */
171     __asm__ volatile ("fnstcw %0" : "=m" (cw));
172     cw = (cw & ~0xc00) | 0x400;
173     __asm__ volatile ("fldcw %0" : : "m" (cw));
174     __asm__ volatile ("fldln2" : "=t" (ld_res));
175     if (ld_res != 0xb.17217f7d1cf79abp-4L) {
176         printf("FAIL: fldln2 D\n");
177         ret = 1;
178     }
179     /* Round toward zero.  */
180     __asm__ volatile ("fnstcw %0" : "=m" (cw));
181     cw = (cw & ~0xc00) | 0xc00;
182     __asm__ volatile ("fldcw %0" : : "m" (cw));
183     __asm__ volatile ("fldln2" : "=t" (ld_res));
184     if (ld_res != 0xb.17217f7d1cf79abp-4L) {
185         printf("FAIL: fldln2 Z\n");
186         ret = 1;
187     }
188     /* Round upward.  */
189     __asm__ volatile ("fnstcw %0" : "=m" (cw));
190     cw = (cw & ~0xc00) | 0x800;
191     __asm__ volatile ("fldcw %0" : : "m" (cw));
192     __asm__ volatile ("fldln2" : "=t" (ld_res));
193     if (ld_res != 0xb.17217f7d1cf79acp-4L) {
194         printf("FAIL: fldln2 U\n");
195         ret = 1;
196     }
197 
198     return ret;
199 }
200