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 | {\ | ... | ... |