xref: /qemu/tests/tcg/i386/test-i386-shift.h (revision 4132431f249ac89f413ff326ec4f960992806255)
1379ca80dSbellard 
2379ca80dSbellard #define exec_op glue(exec_, OP)
3776f2227Sbellard #define exec_opq glue(glue(exec_, OP), q)
4379ca80dSbellard #define exec_opl glue(glue(exec_, OP), l)
5379ca80dSbellard #define exec_opw glue(glue(exec_, OP), w)
6379ca80dSbellard #define exec_opb glue(glue(exec_, OP), b)
7379ca80dSbellard 
8d57c4e01Sbellard #ifndef OP_SHIFTD
9d57c4e01Sbellard 
10d57c4e01Sbellard #ifdef OP_NOBYTE
11776f2227Sbellard #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
12d57c4e01Sbellard     asm ("push %4\n\t"\
13d57c4e01Sbellard          "popf\n\t"\
14776f2227Sbellard          stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
15d57c4e01Sbellard          "pushf\n\t"\
16776f2227Sbellard          "pop %1\n\t"\
17d57c4e01Sbellard          : "=g" (res), "=g" (flags)\
18d57c4e01Sbellard          : "r" (s1), "0" (res), "1" (flags));
19d57c4e01Sbellard #else
20776f2227Sbellard #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
21379ca80dSbellard     asm ("push %4\n\t"\
22379ca80dSbellard          "popf\n\t"\
23776f2227Sbellard          stringify(OP) size " %%cl, %" rsize "0\n\t" \
24379ca80dSbellard          "pushf\n\t"\
25776f2227Sbellard          "pop %1\n\t"\
26379ca80dSbellard          : "=q" (res), "=g" (flags)\
27379ca80dSbellard          : "c" (s1), "0" (res), "1" (flags));
28d57c4e01Sbellard #endif
29379ca80dSbellard 
30776f2227Sbellard #if defined(__x86_64__)
exec_opq(long s2,long s0,long s1,long iflags)31776f2227Sbellard void exec_opq(long s2, long s0, long s1, long iflags)
32379ca80dSbellard {
33776f2227Sbellard     long res, flags;
34379ca80dSbellard     res = s0;
35379ca80dSbellard     flags = iflags;
36776f2227Sbellard     EXECSHIFT("q", "", res, s1, s2, flags);
37379ca80dSbellard     /* overflow is undefined if count != 1 */
38379ca80dSbellard     if (s1 != 1)
39379ca80dSbellard       flags &= ~CC_O;
40776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
41776f2227Sbellard            stringify(OP) "q", s0, s1, res, iflags, flags & CC_MASK);
42776f2227Sbellard }
43776f2227Sbellard #endif
44776f2227Sbellard 
exec_opl(long s2,long s0,long s1,long iflags)45776f2227Sbellard void exec_opl(long s2, long s0, long s1, long iflags)
46776f2227Sbellard {
47776f2227Sbellard     long res, flags;
48776f2227Sbellard     res = s0;
49776f2227Sbellard     flags = iflags;
50776f2227Sbellard     EXECSHIFT("l", "k", res, s1, s2, flags);
51776f2227Sbellard     /* overflow is undefined if count != 1 */
52776f2227Sbellard     if (s1 != 1)
53776f2227Sbellard       flags &= ~CC_O;
54776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
55379ca80dSbellard            stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
56379ca80dSbellard }
57379ca80dSbellard 
exec_opw(long s2,long s0,long s1,long iflags)58776f2227Sbellard void exec_opw(long s2, long s0, long s1, long iflags)
59379ca80dSbellard {
60776f2227Sbellard     long res, flags;
61379ca80dSbellard     res = s0;
62379ca80dSbellard     flags = iflags;
63776f2227Sbellard     EXECSHIFT("w", "w", res, s1, s2, flags);
64379ca80dSbellard     /* overflow is undefined if count != 1 */
65379ca80dSbellard     if (s1 != 1)
66379ca80dSbellard       flags &= ~CC_O;
67776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
68379ca80dSbellard            stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
69379ca80dSbellard }
70379ca80dSbellard 
71d57c4e01Sbellard #else
72776f2227Sbellard #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
73d57c4e01Sbellard     asm ("push %4\n\t"\
74d57c4e01Sbellard          "popf\n\t"\
75776f2227Sbellard          stringify(OP) size " %%cl, %" rsize "5, %" rsize "0\n\t" \
76d57c4e01Sbellard          "pushf\n\t"\
77776f2227Sbellard          "pop %1\n\t"\
78d57c4e01Sbellard          : "=g" (res), "=g" (flags)\
79d57c4e01Sbellard          : "c" (s1), "0" (res), "1" (flags), "r" (s2));
80d57c4e01Sbellard 
81776f2227Sbellard #if defined(__x86_64__)
exec_opq(long s2,long s0,long s1,long iflags)82776f2227Sbellard void exec_opq(long s2, long s0, long s1, long iflags)
83d57c4e01Sbellard {
84776f2227Sbellard     long res, flags;
85d57c4e01Sbellard     res = s0;
86d57c4e01Sbellard     flags = iflags;
87776f2227Sbellard     EXECSHIFT("q", "", res, s1, s2, flags);
88d57c4e01Sbellard     /* overflow is undefined if count != 1 */
89d57c4e01Sbellard     if (s1 != 1)
90d57c4e01Sbellard       flags &= ~CC_O;
91776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
92776f2227Sbellard            stringify(OP) "q", s0, s2, s1, res, iflags, flags & CC_MASK);
93776f2227Sbellard }
94776f2227Sbellard #endif
95776f2227Sbellard 
exec_opl(long s2,long s0,long s1,long iflags)96776f2227Sbellard void exec_opl(long s2, long s0, long s1, long iflags)
97776f2227Sbellard {
98776f2227Sbellard     long res, flags;
99776f2227Sbellard     res = s0;
100776f2227Sbellard     flags = iflags;
101776f2227Sbellard     EXECSHIFT("l", "k", res, s1, s2, flags);
102776f2227Sbellard     /* overflow is undefined if count != 1 */
103776f2227Sbellard     if (s1 != 1)
104776f2227Sbellard       flags &= ~CC_O;
105776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
106d57c4e01Sbellard            stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK);
107d57c4e01Sbellard }
108d57c4e01Sbellard 
exec_opw(long s2,long s0,long s1,long iflags)109776f2227Sbellard void exec_opw(long s2, long s0, long s1, long iflags)
110d57c4e01Sbellard {
111776f2227Sbellard     long res, flags;
112d57c4e01Sbellard     res = s0;
113d57c4e01Sbellard     flags = iflags;
114776f2227Sbellard     EXECSHIFT("w", "w", res, s1, s2, flags);
115d57c4e01Sbellard     /* overflow is undefined if count != 1 */
116d57c4e01Sbellard     if (s1 != 1)
117d57c4e01Sbellard       flags &= ~CC_O;
118776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
119d57c4e01Sbellard            stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK);
120d57c4e01Sbellard }
121d57c4e01Sbellard 
122d57c4e01Sbellard #endif
123d57c4e01Sbellard 
124d57c4e01Sbellard #ifndef OP_NOBYTE
exec_opb(long s0,long s1,long iflags)125776f2227Sbellard void exec_opb(long s0, long s1, long iflags)
126379ca80dSbellard {
127776f2227Sbellard     long res, flags;
128379ca80dSbellard     res = s0;
129379ca80dSbellard     flags = iflags;
130776f2227Sbellard     EXECSHIFT("b", "b", res, s1, 0, flags);
131379ca80dSbellard     /* overflow is undefined if count != 1 */
132379ca80dSbellard     if (s1 != 1)
133379ca80dSbellard       flags &= ~CC_O;
134776f2227Sbellard     printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
135379ca80dSbellard            stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
136379ca80dSbellard }
137d57c4e01Sbellard #endif
138379ca80dSbellard 
exec_op(long s2,long s0,long s1)139776f2227Sbellard void exec_op(long s2, long s0, long s1)
140379ca80dSbellard {
141776f2227Sbellard     s2 = i2l(s2);
142776f2227Sbellard     s0 = i2l(s0);
143776f2227Sbellard #if defined(__x86_64__)
144776f2227Sbellard     exec_opq(s2, s0, s1, 0);
145776f2227Sbellard #endif
146d57c4e01Sbellard     exec_opl(s2, s0, s1, 0);
147afeb6ee3Sbellard #ifdef OP_SHIFTD
148d57c4e01Sbellard     exec_opw(s2, s0, s1, 0);
149afeb6ee3Sbellard #else
150afeb6ee3Sbellard     exec_opw(s2, s0, s1, 0);
151afeb6ee3Sbellard #endif
152d57c4e01Sbellard #ifndef OP_NOBYTE
153379ca80dSbellard     exec_opb(s0, s1, 0);
154d57c4e01Sbellard #endif
155379ca80dSbellard #ifdef OP_CC
156776f2227Sbellard #if defined(__x86_64__)
157776f2227Sbellard     exec_opq(s2, s0, s1, CC_C);
158776f2227Sbellard #endif
159d57c4e01Sbellard     exec_opl(s2, s0, s1, CC_C);
160d57c4e01Sbellard     exec_opw(s2, s0, s1, CC_C);
161379ca80dSbellard     exec_opb(s0, s1, CC_C);
162379ca80dSbellard #endif
163379ca80dSbellard }
164379ca80dSbellard 
glue(test_,OP)165379ca80dSbellard void glue(test_, OP)(void)
166379ca80dSbellard {
167776f2227Sbellard     int i, n;
168776f2227Sbellard #if defined(__x86_64__)
169776f2227Sbellard     n = 64;
170776f2227Sbellard #else
171776f2227Sbellard     n = 32;
172776f2227Sbellard #endif
173776f2227Sbellard     for(i = 0; i < n; i++)
174d57c4e01Sbellard         exec_op(0x21ad3d34, 0x12345678, i);
175776f2227Sbellard     for(i = 0; i < n; i++)
176*6c3ee14fSbellard         exec_op(0x813f3421, 0x82345679, i);
177379ca80dSbellard }
178379ca80dSbellard 
179379ca80dSbellard void *glue(_test_, OP) __init_call = glue(test_, OP);
180379ca80dSbellard 
181379ca80dSbellard #undef OP
182379ca80dSbellard #undef OP_CC
183d57c4e01Sbellard #undef OP_SHIFTD
184d57c4e01Sbellard #undef OP_NOBYTE
185d57c4e01Sbellard #undef EXECSHIFT
186