xref: /qemu/tests/tcg/i386/test-i386.h (revision 4132431f249ac89f413ff326ec4f960992806255)
1d57c4e01Sbellard 
2d57c4e01Sbellard #define exec_op glue(exec_, OP)
3*776f2227Sbellard #define exec_opq glue(glue(exec_, OP), q)
4d57c4e01Sbellard #define exec_opl glue(glue(exec_, OP), l)
5d57c4e01Sbellard #define exec_opw glue(glue(exec_, OP), w)
6d57c4e01Sbellard #define exec_opb glue(glue(exec_, OP), b)
7d57c4e01Sbellard 
8*776f2227Sbellard #define EXECOP2(size, rsize, res, s1, flags) \
9d57c4e01Sbellard     asm ("push %4\n\t"\
10d57c4e01Sbellard          "popf\n\t"\
11*776f2227Sbellard          stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
12d57c4e01Sbellard          "pushf\n\t"\
13*776f2227Sbellard          "pop %1\n\t"\
14d57c4e01Sbellard          : "=q" (res), "=g" (flags)\
15*776f2227Sbellard          : "q" (s1), "0" (res), "1" (flags)); \
16*776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
17*776f2227Sbellard            stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK);
18d57c4e01Sbellard 
19*776f2227Sbellard #define EXECOP1(size, rsize, res, flags) \
20d57c4e01Sbellard     asm ("push %3\n\t"\
21d57c4e01Sbellard          "popf\n\t"\
22*776f2227Sbellard          stringify(OP) size " %" rsize "0\n\t" \
23d57c4e01Sbellard          "pushf\n\t"\
24*776f2227Sbellard          "pop %1\n\t"\
25d57c4e01Sbellard          : "=q" (res), "=g" (flags)\
26*776f2227Sbellard          : "0" (res), "1" (flags)); \
27*776f2227Sbellard     printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \
28*776f2227Sbellard            stringify(OP) size, s0, res, iflags, flags & CC_MASK);
29d57c4e01Sbellard 
30d57c4e01Sbellard #ifdef OP1
31*776f2227Sbellard #if defined(__x86_64__)
exec_opq(long s0,long s1,long iflags)32*776f2227Sbellard void exec_opq(long s0, long s1, long iflags)
33d57c4e01Sbellard {
34*776f2227Sbellard     long res, flags;
35d57c4e01Sbellard     res = s0;
36d57c4e01Sbellard     flags = iflags;
37*776f2227Sbellard     EXECOP1("q", "", res, flags);
38d57c4e01Sbellard }
39d57c4e01Sbellard #endif
40d57c4e01Sbellard 
exec_opl(long s0,long s1,long iflags)41*776f2227Sbellard void exec_opl(long s0, long s1, long iflags)
42d57c4e01Sbellard {
43*776f2227Sbellard     long res, flags;
44*776f2227Sbellard     res = s0;
45*776f2227Sbellard     flags = iflags;
46*776f2227Sbellard     EXECOP1("l", "k", res, flags);
47*776f2227Sbellard }
48*776f2227Sbellard 
exec_opw(long s0,long s1,long iflags)49*776f2227Sbellard void exec_opw(long s0, long s1, long iflags)
50*776f2227Sbellard {
51*776f2227Sbellard     long res, flags;
52*776f2227Sbellard     res = s0;
53*776f2227Sbellard     flags = iflags;
54*776f2227Sbellard     EXECOP1("w", "w", res, flags);
55*776f2227Sbellard }
56*776f2227Sbellard 
exec_opb(long s0,long s1,long iflags)57*776f2227Sbellard void exec_opb(long s0, long s1, long iflags)
58*776f2227Sbellard {
59*776f2227Sbellard     long res, flags;
60*776f2227Sbellard     res = s0;
61*776f2227Sbellard     flags = iflags;
62*776f2227Sbellard     EXECOP1("b", "b", res, flags);
63*776f2227Sbellard }
64*776f2227Sbellard #else
65*776f2227Sbellard #if defined(__x86_64__)
exec_opq(long s0,long s1,long iflags)66*776f2227Sbellard void exec_opq(long s0, long s1, long iflags)
67*776f2227Sbellard {
68*776f2227Sbellard     long res, flags;
69*776f2227Sbellard     res = s0;
70*776f2227Sbellard     flags = iflags;
71*776f2227Sbellard     EXECOP2("q", "", res, s1, flags);
72*776f2227Sbellard }
73*776f2227Sbellard #endif
74*776f2227Sbellard 
exec_opl(long s0,long s1,long iflags)75*776f2227Sbellard void exec_opl(long s0, long s1, long iflags)
76*776f2227Sbellard {
77*776f2227Sbellard     long res, flags;
78*776f2227Sbellard     res = s0;
79*776f2227Sbellard     flags = iflags;
80*776f2227Sbellard     EXECOP2("l", "k", res, s1, flags);
81*776f2227Sbellard }
82*776f2227Sbellard 
exec_opw(long s0,long s1,long iflags)83*776f2227Sbellard void exec_opw(long s0, long s1, long iflags)
84*776f2227Sbellard {
85*776f2227Sbellard     long res, flags;
86*776f2227Sbellard     res = s0;
87*776f2227Sbellard     flags = iflags;
88*776f2227Sbellard     EXECOP2("w", "w", res, s1, flags);
89*776f2227Sbellard }
90*776f2227Sbellard 
exec_opb(long s0,long s1,long iflags)91*776f2227Sbellard void exec_opb(long s0, long s1, long iflags)
92*776f2227Sbellard {
93*776f2227Sbellard     long res, flags;
94*776f2227Sbellard     res = s0;
95*776f2227Sbellard     flags = iflags;
96*776f2227Sbellard     EXECOP2("b", "b", res, s1, flags);
97*776f2227Sbellard }
98*776f2227Sbellard #endif
99*776f2227Sbellard 
exec_op(long s0,long s1)100*776f2227Sbellard void exec_op(long s0, long s1)
101*776f2227Sbellard {
102*776f2227Sbellard     s0 = i2l(s0);
103*776f2227Sbellard     s1 = i2l(s1);
104*776f2227Sbellard #if defined(__x86_64__)
105*776f2227Sbellard     exec_opq(s0, s1, 0);
106*776f2227Sbellard #endif
107d57c4e01Sbellard     exec_opl(s0, s1, 0);
108d57c4e01Sbellard     exec_opw(s0, s1, 0);
109d57c4e01Sbellard     exec_opb(s0, s1, 0);
110d57c4e01Sbellard #ifdef OP_CC
111*776f2227Sbellard #if defined(__x86_64__)
112*776f2227Sbellard     exec_opq(s0, s1, CC_C);
113*776f2227Sbellard #endif
114d57c4e01Sbellard     exec_opl(s0, s1, CC_C);
115d57c4e01Sbellard     exec_opw(s0, s1, CC_C);
116d57c4e01Sbellard     exec_opb(s0, s1, CC_C);
117d57c4e01Sbellard #endif
118d57c4e01Sbellard }
119d57c4e01Sbellard 
glue(test_,OP)120d57c4e01Sbellard void glue(test_, OP)(void)
121d57c4e01Sbellard {
122d57c4e01Sbellard     exec_op(0x12345678, 0x812FADA);
123d57c4e01Sbellard     exec_op(0x12341, 0x12341);
124d57c4e01Sbellard     exec_op(0x12341, -0x12341);
125d57c4e01Sbellard     exec_op(0xffffffff, 0);
126d57c4e01Sbellard     exec_op(0xffffffff, -1);
127d57c4e01Sbellard     exec_op(0xffffffff, 1);
128d57c4e01Sbellard     exec_op(0xffffffff, 2);
129d57c4e01Sbellard     exec_op(0x7fffffff, 0);
130d57c4e01Sbellard     exec_op(0x7fffffff, 1);
131d57c4e01Sbellard     exec_op(0x7fffffff, -1);
132d57c4e01Sbellard     exec_op(0x80000000, -1);
133d57c4e01Sbellard     exec_op(0x80000000, 1);
134d57c4e01Sbellard     exec_op(0x80000000, -2);
135d57c4e01Sbellard     exec_op(0x12347fff, 0);
136d57c4e01Sbellard     exec_op(0x12347fff, 1);
137d57c4e01Sbellard     exec_op(0x12347fff, -1);
138d57c4e01Sbellard     exec_op(0x12348000, -1);
139d57c4e01Sbellard     exec_op(0x12348000, 1);
140d57c4e01Sbellard     exec_op(0x12348000, -2);
141d57c4e01Sbellard     exec_op(0x12347f7f, 0);
142d57c4e01Sbellard     exec_op(0x12347f7f, 1);
143d57c4e01Sbellard     exec_op(0x12347f7f, -1);
144d57c4e01Sbellard     exec_op(0x12348080, -1);
145d57c4e01Sbellard     exec_op(0x12348080, 1);
146d57c4e01Sbellard     exec_op(0x12348080, -2);
147d57c4e01Sbellard }
148d57c4e01Sbellard 
149d57c4e01Sbellard void *glue(_test_, OP) __init_call = glue(test_, OP);
150d57c4e01Sbellard 
151d57c4e01Sbellard #undef OP
152d57c4e01Sbellard #undef OP_CC
153