root / tests / test-i386.c @ 379ca80d
History | View | Annotate | Download (5.6 kB)
1 | 4d1135e4 | bellard | #include <stdlib.h> |
---|---|---|---|
2 | 4d1135e4 | bellard | #include <stdio.h> |
3 | 4d1135e4 | bellard | #include <math.h> |
4 | 4d1135e4 | bellard | |
5 | 4d1135e4 | bellard | #define xglue(x, y) x ## y |
6 | 4d1135e4 | bellard | #define glue(x, y) xglue(x, y)
|
7 | 4d1135e4 | bellard | #define stringify(s) tostring(s)
|
8 | 4d1135e4 | bellard | #define tostring(s) #s |
9 | 4d1135e4 | bellard | |
10 | 4d1135e4 | bellard | #define CC_C 0x0001 |
11 | 4d1135e4 | bellard | #define CC_P 0x0004 |
12 | 4d1135e4 | bellard | #define CC_A 0x0010 |
13 | 4d1135e4 | bellard | #define CC_Z 0x0040 |
14 | 4d1135e4 | bellard | #define CC_S 0x0080 |
15 | 4d1135e4 | bellard | #define CC_O 0x0800 |
16 | 4d1135e4 | bellard | |
17 | 4d1135e4 | bellard | /* XXX: currently no A flag */
|
18 | 4d1135e4 | bellard | #define CC_MASK (CC_C | CC_P | CC_Z | CC_S | CC_O)
|
19 | 4d1135e4 | bellard | |
20 | 4d1135e4 | bellard | #define __init_call __attribute__ ((unused,__section__ (".initcall.init"))) |
21 | 4d1135e4 | bellard | |
22 | 4d1135e4 | bellard | static void *call_start __init_call = NULL; |
23 | 4d1135e4 | bellard | |
24 | 4d1135e4 | bellard | #define OP add
|
25 | 4d1135e4 | bellard | #include "test-i386.h" |
26 | 4d1135e4 | bellard | |
27 | 4d1135e4 | bellard | #define OP sub
|
28 | 4d1135e4 | bellard | #include "test-i386.h" |
29 | 4d1135e4 | bellard | |
30 | 4d1135e4 | bellard | #define OP xor
|
31 | 4d1135e4 | bellard | #include "test-i386.h" |
32 | 4d1135e4 | bellard | |
33 | 4d1135e4 | bellard | #define OP and
|
34 | 4d1135e4 | bellard | #include "test-i386.h" |
35 | 4d1135e4 | bellard | |
36 | 4d1135e4 | bellard | #define OP or
|
37 | 4d1135e4 | bellard | #include "test-i386.h" |
38 | 4d1135e4 | bellard | |
39 | 4d1135e4 | bellard | #define OP cmp
|
40 | 4d1135e4 | bellard | #include "test-i386.h" |
41 | 4d1135e4 | bellard | |
42 | 4d1135e4 | bellard | #define OP adc
|
43 | 4d1135e4 | bellard | #define OP_CC
|
44 | 4d1135e4 | bellard | #include "test-i386.h" |
45 | 4d1135e4 | bellard | |
46 | 4d1135e4 | bellard | #define OP sbb
|
47 | 4d1135e4 | bellard | #define OP_CC
|
48 | 4d1135e4 | bellard | #include "test-i386.h" |
49 | 4d1135e4 | bellard | |
50 | 4d1135e4 | bellard | #define OP inc
|
51 | 4d1135e4 | bellard | #define OP_CC
|
52 | 4d1135e4 | bellard | #define OP1
|
53 | 4d1135e4 | bellard | #include "test-i386.h" |
54 | 4d1135e4 | bellard | |
55 | 4d1135e4 | bellard | #define OP dec
|
56 | 4d1135e4 | bellard | #define OP_CC
|
57 | 4d1135e4 | bellard | #define OP1
|
58 | 4d1135e4 | bellard | #include "test-i386.h" |
59 | 4d1135e4 | bellard | |
60 | 4d1135e4 | bellard | #define OP neg
|
61 | 4d1135e4 | bellard | #define OP_CC
|
62 | 4d1135e4 | bellard | #define OP1
|
63 | 4d1135e4 | bellard | #include "test-i386.h" |
64 | 4d1135e4 | bellard | |
65 | 4d1135e4 | bellard | #define OP not
|
66 | 4d1135e4 | bellard | #define OP_CC
|
67 | 4d1135e4 | bellard | #define OP1
|
68 | 4d1135e4 | bellard | #include "test-i386.h" |
69 | 4d1135e4 | bellard | |
70 | 379ca80d | bellard | #define OP shl
|
71 | 379ca80d | bellard | #include "test-i386-shift.h" |
72 | 379ca80d | bellard | |
73 | 379ca80d | bellard | #define OP shr
|
74 | 379ca80d | bellard | #include "test-i386-shift.h" |
75 | 379ca80d | bellard | |
76 | 379ca80d | bellard | #define OP sar
|
77 | 379ca80d | bellard | #include "test-i386-shift.h" |
78 | 379ca80d | bellard | |
79 | 379ca80d | bellard | #define OP rol
|
80 | 379ca80d | bellard | #include "test-i386-shift.h" |
81 | 379ca80d | bellard | |
82 | 379ca80d | bellard | #define OP ror
|
83 | 379ca80d | bellard | #include "test-i386-shift.h" |
84 | 379ca80d | bellard | |
85 | 379ca80d | bellard | #define OP rcr
|
86 | 379ca80d | bellard | #define OP_CC
|
87 | 379ca80d | bellard | #include "test-i386-shift.h" |
88 | 379ca80d | bellard | |
89 | 379ca80d | bellard | #define OP rcl
|
90 | 379ca80d | bellard | #define OP_CC
|
91 | 379ca80d | bellard | #include "test-i386-shift.h" |
92 | 379ca80d | bellard | |
93 | 379ca80d | bellard | |
94 | 4d1135e4 | bellard | /* lea test (modrm support) */
|
95 | 4d1135e4 | bellard | #define TEST_LEA(STR)\
|
96 | 4d1135e4 | bellard | {\ |
97 | 4d1135e4 | bellard | asm("leal " STR ", %0"\ |
98 | 4d1135e4 | bellard | : "=r" (res)\
|
99 | 4d1135e4 | bellard | : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\ |
100 | 4d1135e4 | bellard | printf("lea %s = %08x\n", STR, res);\
|
101 | 4d1135e4 | bellard | } |
102 | 4d1135e4 | bellard | |
103 | 4d1135e4 | bellard | #define TEST_LEA16(STR)\
|
104 | 4d1135e4 | bellard | {\ |
105 | 4d1135e4 | bellard | asm(".code16 ; .byte 0x67 ; leal " STR ", %0 ; .code32"\ |
106 | 4d1135e4 | bellard | : "=wq" (res)\
|
107 | 4d1135e4 | bellard | : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\ |
108 | 4d1135e4 | bellard | printf("lea %s = %08x\n", STR, res);\
|
109 | 4d1135e4 | bellard | } |
110 | 4d1135e4 | bellard | |
111 | 4d1135e4 | bellard | |
112 | 4d1135e4 | bellard | void test_lea(void) |
113 | 4d1135e4 | bellard | { |
114 | 4d1135e4 | bellard | int eax, ebx, ecx, edx, esi, edi, res;
|
115 | 4d1135e4 | bellard | eax = 0x0001;
|
116 | 4d1135e4 | bellard | ebx = 0x0002;
|
117 | 4d1135e4 | bellard | ecx = 0x0004;
|
118 | 4d1135e4 | bellard | edx = 0x0008;
|
119 | 4d1135e4 | bellard | esi = 0x0010;
|
120 | 4d1135e4 | bellard | edi = 0x0020;
|
121 | 4d1135e4 | bellard | |
122 | 4d1135e4 | bellard | TEST_LEA("0x4000");
|
123 | 4d1135e4 | bellard | |
124 | 4d1135e4 | bellard | TEST_LEA("(%%eax)");
|
125 | 4d1135e4 | bellard | TEST_LEA("(%%ebx)");
|
126 | 4d1135e4 | bellard | TEST_LEA("(%%ecx)");
|
127 | 4d1135e4 | bellard | TEST_LEA("(%%edx)");
|
128 | 4d1135e4 | bellard | TEST_LEA("(%%esi)");
|
129 | 4d1135e4 | bellard | TEST_LEA("(%%edi)");
|
130 | 4d1135e4 | bellard | |
131 | 4d1135e4 | bellard | TEST_LEA("0x40(%%eax)");
|
132 | 4d1135e4 | bellard | TEST_LEA("0x40(%%ebx)");
|
133 | 4d1135e4 | bellard | TEST_LEA("0x40(%%ecx)");
|
134 | 4d1135e4 | bellard | TEST_LEA("0x40(%%edx)");
|
135 | 4d1135e4 | bellard | TEST_LEA("0x40(%%esi)");
|
136 | 4d1135e4 | bellard | TEST_LEA("0x40(%%edi)");
|
137 | 4d1135e4 | bellard | |
138 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%eax)");
|
139 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%ebx)");
|
140 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%ecx)");
|
141 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%edx)");
|
142 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%esi)");
|
143 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%edi)");
|
144 | 4d1135e4 | bellard | |
145 | 4d1135e4 | bellard | TEST_LEA("(%%eax, %%ecx)");
|
146 | 4d1135e4 | bellard | TEST_LEA("(%%ebx, %%edx)");
|
147 | 4d1135e4 | bellard | TEST_LEA("(%%ecx, %%ecx)");
|
148 | 4d1135e4 | bellard | TEST_LEA("(%%edx, %%ecx)");
|
149 | 4d1135e4 | bellard | TEST_LEA("(%%esi, %%ecx)");
|
150 | 4d1135e4 | bellard | TEST_LEA("(%%edi, %%ecx)");
|
151 | 4d1135e4 | bellard | |
152 | 4d1135e4 | bellard | TEST_LEA("0x40(%%eax, %%ecx)");
|
153 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%ebx, %%edx)");
|
154 | 4d1135e4 | bellard | |
155 | 4d1135e4 | bellard | TEST_LEA("(%%ecx, %%ecx, 2)");
|
156 | 4d1135e4 | bellard | TEST_LEA("(%%edx, %%ecx, 4)");
|
157 | 4d1135e4 | bellard | TEST_LEA("(%%esi, %%ecx, 8)");
|
158 | 4d1135e4 | bellard | |
159 | 4d1135e4 | bellard | TEST_LEA("(,%%eax, 2)");
|
160 | 4d1135e4 | bellard | TEST_LEA("(,%%ebx, 4)");
|
161 | 4d1135e4 | bellard | TEST_LEA("(,%%ecx, 8)");
|
162 | 4d1135e4 | bellard | |
163 | 4d1135e4 | bellard | TEST_LEA("0x40(,%%eax, 2)");
|
164 | 4d1135e4 | bellard | TEST_LEA("0x40(,%%ebx, 4)");
|
165 | 4d1135e4 | bellard | TEST_LEA("0x40(,%%ecx, 8)");
|
166 | 4d1135e4 | bellard | |
167 | 4d1135e4 | bellard | |
168 | 4d1135e4 | bellard | TEST_LEA("-10(%%ecx, %%ecx, 2)");
|
169 | 4d1135e4 | bellard | TEST_LEA("-10(%%edx, %%ecx, 4)");
|
170 | 4d1135e4 | bellard | TEST_LEA("-10(%%esi, %%ecx, 8)");
|
171 | 4d1135e4 | bellard | |
172 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%ecx, %%ecx, 2)");
|
173 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%edx, %%ecx, 4)");
|
174 | 4d1135e4 | bellard | TEST_LEA("0x4000(%%esi, %%ecx, 8)");
|
175 | 4d1135e4 | bellard | |
176 | 4d1135e4 | bellard | /* limited 16 bit addressing test */
|
177 | 4d1135e4 | bellard | TEST_LEA16("0x4000");
|
178 | 4d1135e4 | bellard | TEST_LEA16("(%%bx)");
|
179 | 4d1135e4 | bellard | TEST_LEA16("(%%si)");
|
180 | 4d1135e4 | bellard | TEST_LEA16("(%%di)");
|
181 | 4d1135e4 | bellard | TEST_LEA16("0x40(%%bx)");
|
182 | 4d1135e4 | bellard | TEST_LEA16("0x40(%%si)");
|
183 | 4d1135e4 | bellard | TEST_LEA16("0x40(%%di)");
|
184 | 4d1135e4 | bellard | TEST_LEA16("0x4000(%%bx)");
|
185 | 4d1135e4 | bellard | TEST_LEA16("0x4000(%%si)");
|
186 | 4d1135e4 | bellard | TEST_LEA16("(%%bx,%%si)");
|
187 | 4d1135e4 | bellard | TEST_LEA16("(%%bx,%%di)");
|
188 | 4d1135e4 | bellard | TEST_LEA16("0x40(%%bx,%%si)");
|
189 | 4d1135e4 | bellard | TEST_LEA16("0x40(%%bx,%%di)");
|
190 | 4d1135e4 | bellard | TEST_LEA16("0x4000(%%bx,%%si)");
|
191 | 4d1135e4 | bellard | TEST_LEA16("0x4000(%%bx,%%di)");
|
192 | 4d1135e4 | bellard | } |
193 | 4d1135e4 | bellard | |
194 | 4d1135e4 | bellard | #define TEST_JCC(JCC, v1, v2)\
|
195 | 4d1135e4 | bellard | {\ |
196 | 4d1135e4 | bellard | asm("movl $1, %0\n\t"\ |
197 | 4d1135e4 | bellard | "cmpl %2, %1\n\t"\
|
198 | 4d1135e4 | bellard | JCC " 1f\n\t"\
|
199 | 4d1135e4 | bellard | "movl $0, %0\n\t"\
|
200 | 4d1135e4 | bellard | "1:\n\t"\
|
201 | 4d1135e4 | bellard | : "=r" (res)\
|
202 | 4d1135e4 | bellard | : "r" (v1), "r" (v2));\ |
203 | 4d1135e4 | bellard | printf("%-10s %d\n", JCC, res);\
|
204 | 4d1135e4 | bellard | } |
205 | 4d1135e4 | bellard | |
206 | 4d1135e4 | bellard | /* various jump tests */
|
207 | 4d1135e4 | bellard | void test_jcc(void) |
208 | 4d1135e4 | bellard | { |
209 | 4d1135e4 | bellard | int res;
|
210 | 4d1135e4 | bellard | |
211 | 4d1135e4 | bellard | TEST_JCC("jne", 1, 1); |
212 | 4d1135e4 | bellard | TEST_JCC("jne", 1, 0); |
213 | 4d1135e4 | bellard | |
214 | 4d1135e4 | bellard | TEST_JCC("je", 1, 1); |
215 | 4d1135e4 | bellard | TEST_JCC("je", 1, 0); |
216 | 4d1135e4 | bellard | |
217 | 4d1135e4 | bellard | TEST_JCC("jl", 1, 1); |
218 | 4d1135e4 | bellard | TEST_JCC("jl", 1, 0); |
219 | 4d1135e4 | bellard | TEST_JCC("jl", 1, -1); |
220 | 4d1135e4 | bellard | |
221 | 4d1135e4 | bellard | TEST_JCC("jle", 1, 1); |
222 | 4d1135e4 | bellard | TEST_JCC("jle", 1, 0); |
223 | 4d1135e4 | bellard | TEST_JCC("jle", 1, -1); |
224 | 4d1135e4 | bellard | |
225 | 4d1135e4 | bellard | TEST_JCC("jge", 1, 1); |
226 | 4d1135e4 | bellard | TEST_JCC("jge", 1, 0); |
227 | 4d1135e4 | bellard | TEST_JCC("jge", -1, 1); |
228 | 4d1135e4 | bellard | |
229 | 4d1135e4 | bellard | TEST_JCC("jg", 1, 1); |
230 | 4d1135e4 | bellard | TEST_JCC("jg", 1, 0); |
231 | 4d1135e4 | bellard | TEST_JCC("jg", 1, -1); |
232 | 4d1135e4 | bellard | |
233 | 4d1135e4 | bellard | TEST_JCC("jb", 1, 1); |
234 | 4d1135e4 | bellard | TEST_JCC("jb", 1, 0); |
235 | 4d1135e4 | bellard | TEST_JCC("jb", 1, -1); |
236 | 4d1135e4 | bellard | |
237 | 4d1135e4 | bellard | TEST_JCC("jbe", 1, 1); |
238 | 4d1135e4 | bellard | TEST_JCC("jbe", 1, 0); |
239 | 4d1135e4 | bellard | TEST_JCC("jbe", 1, -1); |
240 | 4d1135e4 | bellard | |
241 | 4d1135e4 | bellard | TEST_JCC("jae", 1, 1); |
242 | 4d1135e4 | bellard | TEST_JCC("jae", 1, 0); |
243 | 4d1135e4 | bellard | TEST_JCC("jae", 1, -1); |
244 | 4d1135e4 | bellard | |
245 | 4d1135e4 | bellard | TEST_JCC("ja", 1, 1); |
246 | 4d1135e4 | bellard | TEST_JCC("ja", 1, 0); |
247 | 4d1135e4 | bellard | TEST_JCC("ja", 1, -1); |
248 | 4d1135e4 | bellard | |
249 | 4d1135e4 | bellard | |
250 | 4d1135e4 | bellard | TEST_JCC("jp", 1, 1); |
251 | 4d1135e4 | bellard | TEST_JCC("jp", 1, 0); |
252 | 4d1135e4 | bellard | |
253 | 4d1135e4 | bellard | TEST_JCC("jnp", 1, 1); |
254 | 4d1135e4 | bellard | TEST_JCC("jnp", 1, 0); |
255 | 4d1135e4 | bellard | |
256 | 4d1135e4 | bellard | TEST_JCC("jo", 0x7fffffff, 0); |
257 | 4d1135e4 | bellard | TEST_JCC("jo", 0x7fffffff, -1); |
258 | 4d1135e4 | bellard | |
259 | 4d1135e4 | bellard | TEST_JCC("jno", 0x7fffffff, 0); |
260 | 4d1135e4 | bellard | TEST_JCC("jno", 0x7fffffff, -1); |
261 | 4d1135e4 | bellard | |
262 | 4d1135e4 | bellard | TEST_JCC("js", 0, 1); |
263 | 4d1135e4 | bellard | TEST_JCC("js", 0, -1); |
264 | 4d1135e4 | bellard | TEST_JCC("js", 0, 0); |
265 | 4d1135e4 | bellard | |
266 | 4d1135e4 | bellard | TEST_JCC("jns", 0, 1); |
267 | 4d1135e4 | bellard | TEST_JCC("jns", 0, -1); |
268 | 4d1135e4 | bellard | TEST_JCC("jns", 0, 0); |
269 | 4d1135e4 | bellard | } |
270 | 4d1135e4 | bellard | |
271 | 4d1135e4 | bellard | static void *call_end __init_call = NULL; |
272 | 4d1135e4 | bellard | |
273 | 4d1135e4 | bellard | int main(int argc, char **argv) |
274 | 4d1135e4 | bellard | { |
275 | 4d1135e4 | bellard | void **ptr;
|
276 | 4d1135e4 | bellard | void (*func)(void); |
277 | 4d1135e4 | bellard | ptr = &call_start + 1;
|
278 | 4d1135e4 | bellard | while (*ptr != NULL) { |
279 | 4d1135e4 | bellard | func = *ptr++; |
280 | 4d1135e4 | bellard | func(); |
281 | 4d1135e4 | bellard | } |
282 | 4d1135e4 | bellard | test_lea(); |
283 | 4d1135e4 | bellard | test_jcc(); |
284 | 4d1135e4 | bellard | return 0; |
285 | 4d1135e4 | bellard | } |