P4 style multiplication eflags
[qemu/qemu_0_9_1_stable.git] / tests / test-i386.h
blob7d1812c8837042a46f2dd0b203cb49f70922165b
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)
7 #define EXECOP2(size, res, s1, flags) \
8 asm ("push %4\n\t"\
9 "popf\n\t"\
10 stringify(OP) size " %" size "2, %" size "0\n\t" \
11 "pushf\n\t"\
12 "popl %1\n\t"\
13 : "=q" (res), "=g" (flags)\
14 : "q" (s1), "0" (res), "1" (flags));
16 #define EXECOP1(size, res, flags) \
17 asm ("push %3\n\t"\
18 "popf\n\t"\
19 stringify(OP) size " %" size "0\n\t" \
20 "pushf\n\t"\
21 "popl %1\n\t"\
22 : "=q" (res), "=g" (flags)\
23 : "0" (res), "1" (flags));
25 #ifdef OP1
26 void exec_opl(int s0, int s1, int iflags)
28 int res, flags;
29 res = s0;
30 flags = iflags;
31 EXECOP1("", res, flags);
32 printf("%-10s A=%08x R=%08x CCIN=%04x CC=%04x\n",
33 stringify(OP) "l", s0, res, iflags, flags & CC_MASK);
36 void exec_opw(int s0, int s1, int iflags)
38 int res, flags;
39 res = s0;
40 flags = iflags;
41 EXECOP1("w", res, flags);
42 printf("%-10s A=%08x R=%08x CCIN=%04x CC=%04x\n",
43 stringify(OP) "w", s0, res, iflags, flags & CC_MASK);
46 void exec_opb(int s0, int s1, int iflags)
48 int res, flags;
49 res = s0;
50 flags = iflags;
51 EXECOP1("b", res, flags);
52 printf("%-10s A=%08x R=%08x CCIN=%04x CC=%04x\n",
53 stringify(OP) "b", s0, res, iflags, flags & CC_MASK);
55 #else
56 void exec_opl(int s0, int s1, int iflags)
58 int res, flags;
59 res = s0;
60 flags = iflags;
61 EXECOP2("", res, s1, flags);
62 printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
63 stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
66 void exec_opw(int s0, int s1, int iflags)
68 int res, flags;
69 res = s0;
70 flags = iflags;
71 EXECOP2("w", res, s1, flags);
72 printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
73 stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
76 void exec_opb(int s0, int s1, int iflags)
78 int res, flags;
79 res = s0;
80 flags = iflags;
81 EXECOP2("b", res, s1, flags);
82 printf("%-10s A=%08x B=%08x R=%08x CCIN=%04x CC=%04x\n",
83 stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
85 #endif
87 void exec_op(int s0, int s1)
89 exec_opl(s0, s1, 0);
90 exec_opw(s0, s1, 0);
91 exec_opb(s0, s1, 0);
92 #ifdef OP_CC
93 exec_opl(s0, s1, CC_C);
94 exec_opw(s0, s1, CC_C);
95 exec_opb(s0, s1, CC_C);
96 #endif
99 void glue(test_, OP)(void)
101 exec_op(0x12345678, 0x812FADA);
102 exec_op(0x12341, 0x12341);
103 exec_op(0x12341, -0x12341);
104 exec_op(0xffffffff, 0);
105 exec_op(0xffffffff, -1);
106 exec_op(0xffffffff, 1);
107 exec_op(0xffffffff, 2);
108 exec_op(0x7fffffff, 0);
109 exec_op(0x7fffffff, 1);
110 exec_op(0x7fffffff, -1);
111 exec_op(0x80000000, -1);
112 exec_op(0x80000000, 1);
113 exec_op(0x80000000, -2);
114 exec_op(0x12347fff, 0);
115 exec_op(0x12347fff, 1);
116 exec_op(0x12347fff, -1);
117 exec_op(0x12348000, -1);
118 exec_op(0x12348000, 1);
119 exec_op(0x12348000, -2);
120 exec_op(0x12347f7f, 0);
121 exec_op(0x12347f7f, 1);
122 exec_op(0x12347f7f, -1);
123 exec_op(0x12348080, -1);
124 exec_op(0x12348080, 1);
125 exec_op(0x12348080, -2);
128 void *glue(_test_, OP) __init_call = glue(test_, OP);
130 #undef OP
131 #undef OP_CC