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