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