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