root / tests / test-i386-shift.h @ 379ca80d
History | View | Annotate | Download (1.9 kB)
1 | 379ca80d | bellard | |
---|---|---|---|
2 | 379ca80d | bellard | #define exec_op glue(exec_, OP)
|
3 | 379ca80d | bellard | #define exec_opl glue(glue(exec_, OP), l)
|
4 | 379ca80d | bellard | #define exec_opw glue(glue(exec_, OP), w)
|
5 | 379ca80d | bellard | #define exec_opb glue(glue(exec_, OP), b)
|
6 | 379ca80d | bellard | |
7 | 379ca80d | bellard | #define EXECSHIFT(size, res, s1, flags) \
|
8 | 379ca80d | bellard | asm ("push %4\n\t"\ |
9 | 379ca80d | bellard | "popf\n\t"\
|
10 | 379ca80d | bellard | stringify(OP) size " %%cl, %" size "0\n\t" \ |
11 | 379ca80d | bellard | "pushf\n\t"\
|
12 | 379ca80d | bellard | "popl %1\n\t"\
|
13 | 379ca80d | bellard | : "=q" (res), "=g" (flags)\ |
14 | 379ca80d | bellard | : "c" (s1), "0" (res), "1" (flags)); |
15 | 379ca80d | bellard | |
16 | 379ca80d | bellard | void exec_opl(int s0, int s1, int iflags) |
17 | 379ca80d | bellard | { |
18 | 379ca80d | bellard | int res, flags;
|
19 | 379ca80d | bellard | res = s0; |
20 | 379ca80d | bellard | flags = iflags; |
21 | 379ca80d | bellard | EXECSHIFT("", res, s1, flags);
|
22 | 379ca80d | bellard | /* overflow is undefined if count != 1 */
|
23 | 379ca80d | bellard | if (s1 != 1) |
24 | 379ca80d | bellard | flags &= ~CC_O; |
25 | 379ca80d | bellard | printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
|
26 | 379ca80d | bellard | stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
|
27 | 379ca80d | bellard | } |
28 | 379ca80d | bellard | |
29 | 379ca80d | bellard | void exec_opw(int s0, int s1, int iflags) |
30 | 379ca80d | bellard | { |
31 | 379ca80d | bellard | int res, flags;
|
32 | 379ca80d | bellard | res = s0; |
33 | 379ca80d | bellard | flags = iflags; |
34 | 379ca80d | bellard | EXECSHIFT("w", res, s1, flags);
|
35 | 379ca80d | bellard | /* overflow is undefined if count != 1 */
|
36 | 379ca80d | bellard | if (s1 != 1) |
37 | 379ca80d | bellard | flags &= ~CC_O; |
38 | 379ca80d | bellard | printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
|
39 | 379ca80d | bellard | stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
|
40 | 379ca80d | bellard | } |
41 | 379ca80d | bellard | |
42 | 379ca80d | bellard | void exec_opb(int s0, int s1, int iflags) |
43 | 379ca80d | bellard | { |
44 | 379ca80d | bellard | int res, flags;
|
45 | 379ca80d | bellard | res = s0; |
46 | 379ca80d | bellard | flags = iflags; |
47 | 379ca80d | bellard | EXECSHIFT("b", res, s1, flags);
|
48 | 379ca80d | bellard | /* overflow is undefined if count != 1 */
|
49 | 379ca80d | bellard | if (s1 != 1) |
50 | 379ca80d | bellard | flags &= ~CC_O; |
51 | 379ca80d | bellard | printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
|
52 | 379ca80d | bellard | stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
|
53 | 379ca80d | bellard | } |
54 | 379ca80d | bellard | |
55 | 379ca80d | bellard | void exec_op(int s0, int s1) |
56 | 379ca80d | bellard | { |
57 | 379ca80d | bellard | exec_opl(s0, s1, 0);
|
58 | 379ca80d | bellard | exec_opw(s0, s1, 0);
|
59 | 379ca80d | bellard | exec_opb(s0, s1, 0);
|
60 | 379ca80d | bellard | #ifdef OP_CC
|
61 | 379ca80d | bellard | exec_opl(s0, s1, CC_C); |
62 | 379ca80d | bellard | exec_opw(s0, s1, CC_C); |
63 | 379ca80d | bellard | exec_opb(s0, s1, CC_C); |
64 | 379ca80d | bellard | #endif
|
65 | 379ca80d | bellard | } |
66 | 379ca80d | bellard | |
67 | 379ca80d | bellard | void glue(test_, OP)(void) |
68 | 379ca80d | bellard | { |
69 | 379ca80d | bellard | int i;
|
70 | 379ca80d | bellard | for(i = 0; i < 32; i++) |
71 | 379ca80d | bellard | exec_op(0x12345678, i);
|
72 | 379ca80d | bellard | for(i = 0; i < 32; i++) |
73 | 379ca80d | bellard | exec_op(0x82345678, i);
|
74 | 379ca80d | bellard | } |
75 | 379ca80d | bellard | |
76 | 379ca80d | bellard | void *glue(_test_, OP) __init_call = glue(test_, OP);
|
77 | 379ca80d | bellard | |
78 | 379ca80d | bellard | #undef OP
|
79 | 379ca80d | bellard | #undef OP_CC |