Merge tag 'qemu-macppc-20230206' of https://github.com/mcayland/qemu into staging
[qemu.git] / tests / tcg / i386 / test-i386-fldcst.c
blobe635432ccfdb5bba5422b46aa7d07d3533022f36
1 /* Test instructions loading floating-point constants. */
3 #include <stdint.h>
4 #include <stdio.h>
6 volatile long double ld_res;
8 int main(void)
10 short cw;
11 int ret = 0;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
198 return ret;