Commit 379ca80d34d685c038800be58d2314933619d78b
1 parent
4d1135e4
added shift tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@12 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
104 additions
and
1 deletions
tests/Makefile
... | ... | @@ -17,7 +17,7 @@ test2: test2.c |
17 | 17 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< |
18 | 18 | |
19 | 19 | # i386 emulation test (dump various opcodes) */ |
20 | -test-i386: test-i386.c test-i386.h | |
20 | +test-i386: test-i386.c test-i386.h test-i386-shift.h | |
21 | 21 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< |
22 | 22 | |
23 | 23 | test: test-i386 | ... | ... |
tests/test-i386-shift.h
0 → 100644
1 | + | |
2 | +#define exec_op glue(exec_, OP) | |
3 | +#define exec_opl glue(glue(exec_, OP), l) | |
4 | +#define exec_opw glue(glue(exec_, OP), w) | |
5 | +#define exec_opb glue(glue(exec_, OP), b) | |
6 | + | |
7 | +#define EXECSHIFT(size, res, s1, flags) \ | |
8 | + asm ("push %4\n\t"\ | |
9 | + "popf\n\t"\ | |
10 | + stringify(OP) size " %%cl, %" size "0\n\t" \ | |
11 | + "pushf\n\t"\ | |
12 | + "popl %1\n\t"\ | |
13 | + : "=q" (res), "=g" (flags)\ | |
14 | + : "c" (s1), "0" (res), "1" (flags)); | |
15 | + | |
16 | +void exec_opl(int s0, int s1, int iflags) | |
17 | +{ | |
18 | + int res, flags; | |
19 | + res = s0; | |
20 | + flags = iflags; | |
21 | + EXECSHIFT("", res, s1, flags); | |
22 | + /* overflow is undefined if count != 1 */ | |
23 | + if (s1 != 1) | |
24 | + flags &= ~CC_O; | |
25 | + printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", | |
26 | + stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK); | |
27 | +} | |
28 | + | |
29 | +void exec_opw(int s0, int s1, int iflags) | |
30 | +{ | |
31 | + int res, flags; | |
32 | + res = s0; | |
33 | + flags = iflags; | |
34 | + EXECSHIFT("w", res, s1, flags); | |
35 | + /* overflow is undefined if count != 1 */ | |
36 | + if (s1 != 1) | |
37 | + flags &= ~CC_O; | |
38 | + printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", | |
39 | + stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK); | |
40 | +} | |
41 | + | |
42 | +void exec_opb(int s0, int s1, int iflags) | |
43 | +{ | |
44 | + int res, flags; | |
45 | + res = s0; | |
46 | + flags = iflags; | |
47 | + EXECSHIFT("b", res, s1, flags); | |
48 | + /* overflow is undefined if count != 1 */ | |
49 | + if (s1 != 1) | |
50 | + flags &= ~CC_O; | |
51 | + printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n", | |
52 | + stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK); | |
53 | +} | |
54 | + | |
55 | +void exec_op(int s0, int s1) | |
56 | +{ | |
57 | + exec_opl(s0, s1, 0); | |
58 | + exec_opw(s0, s1, 0); | |
59 | + exec_opb(s0, s1, 0); | |
60 | +#ifdef OP_CC | |
61 | + exec_opl(s0, s1, CC_C); | |
62 | + exec_opw(s0, s1, CC_C); | |
63 | + exec_opb(s0, s1, CC_C); | |
64 | +#endif | |
65 | +} | |
66 | + | |
67 | +void glue(test_, OP)(void) | |
68 | +{ | |
69 | + int i; | |
70 | + for(i = 0; i < 32; i++) | |
71 | + exec_op(0x12345678, i); | |
72 | + for(i = 0; i < 32; i++) | |
73 | + exec_op(0x82345678, i); | |
74 | +} | |
75 | + | |
76 | +void *glue(_test_, OP) __init_call = glue(test_, OP); | |
77 | + | |
78 | +#undef OP | |
79 | +#undef OP_CC | ... | ... |
tests/test-i386.c
... | ... | @@ -67,6 +67,30 @@ static void *call_start __init_call = NULL; |
67 | 67 | #define OP1 |
68 | 68 | #include "test-i386.h" |
69 | 69 | |
70 | +#define OP shl | |
71 | +#include "test-i386-shift.h" | |
72 | + | |
73 | +#define OP shr | |
74 | +#include "test-i386-shift.h" | |
75 | + | |
76 | +#define OP sar | |
77 | +#include "test-i386-shift.h" | |
78 | + | |
79 | +#define OP rol | |
80 | +#include "test-i386-shift.h" | |
81 | + | |
82 | +#define OP ror | |
83 | +#include "test-i386-shift.h" | |
84 | + | |
85 | +#define OP rcr | |
86 | +#define OP_CC | |
87 | +#include "test-i386-shift.h" | |
88 | + | |
89 | +#define OP rcl | |
90 | +#define OP_CC | |
91 | +#include "test-i386-shift.h" | |
92 | + | |
93 | + | |
70 | 94 | /* lea test (modrm support) */ |
71 | 95 | #define TEST_LEA(STR)\ |
72 | 96 | {\ | ... | ... |