Statistics
| Branch: | Revision:

root / tests / test-i386.c @ 4d1135e4

History | View | Annotate | Download (5.2 kB)

1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <math.h>
4

    
5
#define xglue(x, y) x ## y
6
#define glue(x, y) xglue(x, y)
7
#define stringify(s)        tostring(s)
8
#define tostring(s)        #s
9

    
10
#define CC_C           0x0001
11
#define CC_P         0x0004
12
#define CC_A        0x0010
13
#define CC_Z        0x0040
14
#define CC_S    0x0080
15
#define CC_O    0x0800
16

    
17
/* XXX: currently no A flag */
18
#define CC_MASK (CC_C | CC_P | CC_Z | CC_S | CC_O)
19

    
20
#define __init_call        __attribute__ ((unused,__section__ (".initcall.init")))
21

    
22
static void *call_start __init_call = NULL;
23

    
24
#define OP add
25
#include "test-i386.h"
26

    
27
#define OP sub
28
#include "test-i386.h"
29

    
30
#define OP xor
31
#include "test-i386.h"
32

    
33
#define OP and
34
#include "test-i386.h"
35

    
36
#define OP or
37
#include "test-i386.h"
38

    
39
#define OP cmp
40
#include "test-i386.h"
41

    
42
#define OP adc
43
#define OP_CC
44
#include "test-i386.h"
45

    
46
#define OP sbb
47
#define OP_CC
48
#include "test-i386.h"
49

    
50
#define OP inc
51
#define OP_CC
52
#define OP1
53
#include "test-i386.h"
54

    
55
#define OP dec
56
#define OP_CC
57
#define OP1
58
#include "test-i386.h"
59

    
60
#define OP neg
61
#define OP_CC
62
#define OP1
63
#include "test-i386.h"
64

    
65
#define OP not
66
#define OP_CC
67
#define OP1
68
#include "test-i386.h"
69

    
70
/* lea test (modrm support) */
71
#define TEST_LEA(STR)\
72
{\
73
    asm("leal " STR ", %0"\
74
        : "=r" (res)\
75
        : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\
76
    printf("lea %s = %08x\n", STR, res);\
77
}
78

    
79
#define TEST_LEA16(STR)\
80
{\
81
    asm(".code16 ; .byte 0x67 ; leal " STR ", %0 ; .code32"\
82
        : "=wq" (res)\
83
        : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\
84
    printf("lea %s = %08x\n", STR, res);\
85
}
86

    
87

    
88
void test_lea(void)
89
{
90
    int eax, ebx, ecx, edx, esi, edi, res;
91
    eax = 0x0001;
92
    ebx = 0x0002;
93
    ecx = 0x0004;
94
    edx = 0x0008;
95
    esi = 0x0010;
96
    edi = 0x0020;
97

    
98
    TEST_LEA("0x4000");
99

    
100
    TEST_LEA("(%%eax)");
101
    TEST_LEA("(%%ebx)");
102
    TEST_LEA("(%%ecx)");
103
    TEST_LEA("(%%edx)");
104
    TEST_LEA("(%%esi)");
105
    TEST_LEA("(%%edi)");
106

    
107
    TEST_LEA("0x40(%%eax)");
108
    TEST_LEA("0x40(%%ebx)");
109
    TEST_LEA("0x40(%%ecx)");
110
    TEST_LEA("0x40(%%edx)");
111
    TEST_LEA("0x40(%%esi)");
112
    TEST_LEA("0x40(%%edi)");
113

    
114
    TEST_LEA("0x4000(%%eax)");
115
    TEST_LEA("0x4000(%%ebx)");
116
    TEST_LEA("0x4000(%%ecx)");
117
    TEST_LEA("0x4000(%%edx)");
118
    TEST_LEA("0x4000(%%esi)");
119
    TEST_LEA("0x4000(%%edi)");
120

    
121
    TEST_LEA("(%%eax, %%ecx)");
122
    TEST_LEA("(%%ebx, %%edx)");
123
    TEST_LEA("(%%ecx, %%ecx)");
124
    TEST_LEA("(%%edx, %%ecx)");
125
    TEST_LEA("(%%esi, %%ecx)");
126
    TEST_LEA("(%%edi, %%ecx)");
127

    
128
    TEST_LEA("0x40(%%eax, %%ecx)");
129
    TEST_LEA("0x4000(%%ebx, %%edx)");
130

    
131
    TEST_LEA("(%%ecx, %%ecx, 2)");
132
    TEST_LEA("(%%edx, %%ecx, 4)");
133
    TEST_LEA("(%%esi, %%ecx, 8)");
134

    
135
    TEST_LEA("(,%%eax, 2)");
136
    TEST_LEA("(,%%ebx, 4)");
137
    TEST_LEA("(,%%ecx, 8)");
138

    
139
    TEST_LEA("0x40(,%%eax, 2)");
140
    TEST_LEA("0x40(,%%ebx, 4)");
141
    TEST_LEA("0x40(,%%ecx, 8)");
142

    
143

    
144
    TEST_LEA("-10(%%ecx, %%ecx, 2)");
145
    TEST_LEA("-10(%%edx, %%ecx, 4)");
146
    TEST_LEA("-10(%%esi, %%ecx, 8)");
147

    
148
    TEST_LEA("0x4000(%%ecx, %%ecx, 2)");
149
    TEST_LEA("0x4000(%%edx, %%ecx, 4)");
150
    TEST_LEA("0x4000(%%esi, %%ecx, 8)");
151

    
152
    /* limited 16 bit addressing test */
153
    TEST_LEA16("0x4000");
154
    TEST_LEA16("(%%bx)");
155
    TEST_LEA16("(%%si)");
156
    TEST_LEA16("(%%di)");
157
    TEST_LEA16("0x40(%%bx)");
158
    TEST_LEA16("0x40(%%si)");
159
    TEST_LEA16("0x40(%%di)");
160
    TEST_LEA16("0x4000(%%bx)");
161
    TEST_LEA16("0x4000(%%si)");
162
    TEST_LEA16("(%%bx,%%si)");
163
    TEST_LEA16("(%%bx,%%di)");
164
    TEST_LEA16("0x40(%%bx,%%si)");
165
    TEST_LEA16("0x40(%%bx,%%di)");
166
    TEST_LEA16("0x4000(%%bx,%%si)");
167
    TEST_LEA16("0x4000(%%bx,%%di)");
168
}
169

    
170
#define TEST_JCC(JCC, v1, v2)\
171
{\
172
    asm("movl $1, %0\n\t"\
173
        "cmpl %2, %1\n\t"\
174
        JCC " 1f\n\t"\
175
        "movl $0, %0\n\t"\
176
        "1:\n\t"\
177
        : "=r" (res)\
178
        : "r" (v1), "r" (v2));\
179
    printf("%-10s %d\n", JCC, res);\
180
}
181

    
182
/* various jump tests */
183
void test_jcc(void)
184
{
185
    int res;
186

    
187
    TEST_JCC("jne", 1, 1);
188
    TEST_JCC("jne", 1, 0);
189

    
190
    TEST_JCC("je", 1, 1);
191
    TEST_JCC("je", 1, 0);
192

    
193
    TEST_JCC("jl", 1, 1);
194
    TEST_JCC("jl", 1, 0);
195
    TEST_JCC("jl", 1, -1);
196

    
197
    TEST_JCC("jle", 1, 1);
198
    TEST_JCC("jle", 1, 0);
199
    TEST_JCC("jle", 1, -1);
200

    
201
    TEST_JCC("jge", 1, 1);
202
    TEST_JCC("jge", 1, 0);
203
    TEST_JCC("jge", -1, 1);
204

    
205
    TEST_JCC("jg", 1, 1);
206
    TEST_JCC("jg", 1, 0);
207
    TEST_JCC("jg", 1, -1);
208

    
209
    TEST_JCC("jb", 1, 1);
210
    TEST_JCC("jb", 1, 0);
211
    TEST_JCC("jb", 1, -1);
212

    
213
    TEST_JCC("jbe", 1, 1);
214
    TEST_JCC("jbe", 1, 0);
215
    TEST_JCC("jbe", 1, -1);
216

    
217
    TEST_JCC("jae", 1, 1);
218
    TEST_JCC("jae", 1, 0);
219
    TEST_JCC("jae", 1, -1);
220

    
221
    TEST_JCC("ja", 1, 1);
222
    TEST_JCC("ja", 1, 0);
223
    TEST_JCC("ja", 1, -1);
224

    
225

    
226
    TEST_JCC("jp", 1, 1);
227
    TEST_JCC("jp", 1, 0);
228

    
229
    TEST_JCC("jnp", 1, 1);
230
    TEST_JCC("jnp", 1, 0);
231

    
232
    TEST_JCC("jo", 0x7fffffff, 0);
233
    TEST_JCC("jo", 0x7fffffff, -1);
234

    
235
    TEST_JCC("jno", 0x7fffffff, 0);
236
    TEST_JCC("jno", 0x7fffffff, -1);
237

    
238
    TEST_JCC("js", 0, 1);
239
    TEST_JCC("js", 0, -1);
240
    TEST_JCC("js", 0, 0);
241

    
242
    TEST_JCC("jns", 0, 1);
243
    TEST_JCC("jns", 0, -1);
244
    TEST_JCC("jns", 0, 0);
245
}
246

    
247
static void *call_end __init_call = NULL;
248

    
249
int main(int argc, char **argv)
250
{
251
    void **ptr;
252
    void (*func)(void);
253
    ptr = &call_start + 1;
254
    while (*ptr != NULL) {
255
        func = *ptr++;
256
        func();
257
    }
258
    test_lea();
259
    test_jcc();
260
    return 0;
261
}