Statistics
| Branch: | Revision:

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
}