Fix (once again) PowerPC sync weight field.
[qemu/qemu_0_9_1_stable.git] / tests / test-i386-shift.h
blobc1ed489f1158bca7f83cdec5fe10c0e7e3d26ab0
2 #define exec_op glue(exec_, OP)
3 #define exec_opq glue(glue(exec_, OP), q)
4 #define exec_opl glue(glue(exec_, OP), l)
5 #define exec_opw glue(glue(exec_, OP), w)
6 #define exec_opb glue(glue(exec_, OP), b)
8 #ifndef OP_SHIFTD
10 #ifdef OP_NOBYTE
11 #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
12 asm ("push %4\n\t"\
13 "popf\n\t"\
14 stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
15 "pushf\n\t"\
16 "pop %1\n\t"\
17 : "=g" (res), "=g" (flags)\
18 : "r" (s1), "0" (res), "1" (flags));
19 #else
20 #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
21 asm ("push %4\n\t"\
22 "popf\n\t"\
23 stringify(OP) size " %%cl, %" rsize "0\n\t" \
24 "pushf\n\t"\
25 "pop %1\n\t"\
26 : "=q" (res), "=g" (flags)\
27 : "c" (s1), "0" (res), "1" (flags));
28 #endif
30 #if defined(__x86_64__)
31 void exec_opq(long s2, long s0, long s1, long iflags)
33 long res, flags;
34 res = s0;
35 flags = iflags;
36 EXECSHIFT("q", "", res, s1, s2, flags);
37 /* overflow is undefined if count != 1 */
38 if (s1 != 1)
39 flags &= ~CC_O;
40 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
41 stringify(OP) "q", s0, s1, res, iflags, flags & CC_MASK);
43 #endif
45 void exec_opl(long s2, long s0, long s1, long iflags)
47 long res, flags;
48 res = s0;
49 flags = iflags;
50 EXECSHIFT("l", "k", res, s1, s2, flags);
51 /* overflow is undefined if count != 1 */
52 if (s1 != 1)
53 flags &= ~CC_O;
54 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
55 stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
58 void exec_opw(long s2, long s0, long s1, long iflags)
60 long res, flags;
61 res = s0;
62 flags = iflags;
63 EXECSHIFT("w", "w", res, s1, s2, flags);
64 /* overflow is undefined if count != 1 */
65 if (s1 != 1)
66 flags &= ~CC_O;
67 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
68 stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
71 #else
72 #define EXECSHIFT(size, rsize, res, s1, s2, flags) \
73 asm ("push %4\n\t"\
74 "popf\n\t"\
75 stringify(OP) size " %%cl, %" rsize "5, %" rsize "0\n\t" \
76 "pushf\n\t"\
77 "pop %1\n\t"\
78 : "=g" (res), "=g" (flags)\
79 : "c" (s1), "0" (res), "1" (flags), "r" (s2));
81 #if defined(__x86_64__)
82 void exec_opq(long s2, long s0, long s1, long iflags)
84 long res, flags;
85 res = s0;
86 flags = iflags;
87 EXECSHIFT("q", "", res, s1, s2, flags);
88 /* overflow is undefined if count != 1 */
89 if (s1 != 1)
90 flags &= ~CC_O;
91 printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
92 stringify(OP) "q", s0, s2, s1, res, iflags, flags & CC_MASK);
94 #endif
96 void exec_opl(long s2, long s0, long s1, long iflags)
98 long res, flags;
99 res = s0;
100 flags = iflags;
101 EXECSHIFT("l", "k", res, s1, s2, flags);
102 /* overflow is undefined if count != 1 */
103 if (s1 != 1)
104 flags &= ~CC_O;
105 printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
106 stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK);
109 void exec_opw(long s2, long s0, long s1, long iflags)
111 long res, flags;
112 res = s0;
113 flags = iflags;
114 EXECSHIFT("w", "w", res, s1, s2, flags);
115 /* overflow is undefined if count != 1 */
116 if (s1 != 1)
117 flags &= ~CC_O;
118 printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
119 stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK);
122 #endif
124 #ifndef OP_NOBYTE
125 void exec_opb(long s0, long s1, long iflags)
127 long res, flags;
128 res = s0;
129 flags = iflags;
130 EXECSHIFT("b", "b", res, s1, 0, flags);
131 /* overflow is undefined if count != 1 */
132 if (s1 != 1)
133 flags &= ~CC_O;
134 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
135 stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
137 #endif
139 void exec_op(long s2, long s0, long s1)
141 s2 = i2l(s2);
142 s0 = i2l(s0);
143 #if defined(__x86_64__)
144 exec_opq(s2, s0, s1, 0);
145 #endif
146 exec_opl(s2, s0, s1, 0);
147 #ifdef OP_SHIFTD
148 if (s1 <= 15)
149 exec_opw(s2, s0, s1, 0);
150 #else
151 exec_opw(s2, s0, s1, 0);
152 #endif
153 #ifndef OP_NOBYTE
154 exec_opb(s0, s1, 0);
155 #endif
156 #ifdef OP_CC
157 #if defined(__x86_64__)
158 exec_opq(s2, s0, s1, CC_C);
159 #endif
160 exec_opl(s2, s0, s1, CC_C);
161 exec_opw(s2, s0, s1, CC_C);
162 exec_opb(s0, s1, CC_C);
163 #endif
166 void glue(test_, OP)(void)
168 int i, n;
169 #if defined(__x86_64__)
170 n = 64;
171 #else
172 n = 32;
173 #endif
174 for(i = 0; i < n; i++)
175 exec_op(0x21ad3d34, 0x12345678, i);
176 for(i = 0; i < n; i++)
177 exec_op(0x813f3421, 0x82345679, i);
180 void *glue(_test_, OP) __init_call = glue(test_, OP);
182 #undef OP
183 #undef OP_CC
184 #undef OP_SHIFTD
185 #undef OP_NOBYTE
186 #undef EXECSHIFT