]> git.proxmox.com Git - qemu.git/blame - tests/test-i386-shift.h
configure: Copy test data to build directory
[qemu.git] / tests / test-i386-shift.h
CommitLineData
379ca80d
FB
1
2#define exec_op glue(exec_, OP)
776f2227 3#define exec_opq glue(glue(exec_, OP), q)
379ca80d
FB
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)
7
d57c4e01
FB
8#ifndef OP_SHIFTD
9
10#ifdef OP_NOBYTE
776f2227 11#define EXECSHIFT(size, rsize, res, s1, s2, flags) \
d57c4e01
FB
12 asm ("push %4\n\t"\
13 "popf\n\t"\
776f2227 14 stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \
d57c4e01 15 "pushf\n\t"\
776f2227 16 "pop %1\n\t"\
d57c4e01
FB
17 : "=g" (res), "=g" (flags)\
18 : "r" (s1), "0" (res), "1" (flags));
19#else
776f2227 20#define EXECSHIFT(size, rsize, res, s1, s2, flags) \
379ca80d
FB
21 asm ("push %4\n\t"\
22 "popf\n\t"\
776f2227 23 stringify(OP) size " %%cl, %" rsize "0\n\t" \
379ca80d 24 "pushf\n\t"\
776f2227 25 "pop %1\n\t"\
379ca80d
FB
26 : "=q" (res), "=g" (flags)\
27 : "c" (s1), "0" (res), "1" (flags));
d57c4e01 28#endif
379ca80d 29
776f2227
FB
30#if defined(__x86_64__)
31void exec_opq(long s2, long s0, long s1, long iflags)
379ca80d 32{
776f2227 33 long res, flags;
379ca80d
FB
34 res = s0;
35 flags = iflags;
776f2227 36 EXECSHIFT("q", "", res, s1, s2, flags);
379ca80d
FB
37 /* overflow is undefined if count != 1 */
38 if (s1 != 1)
39 flags &= ~CC_O;
776f2227
FB
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);
42}
43#endif
44
45void exec_opl(long s2, long s0, long s1, long iflags)
46{
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",
379ca80d
FB
55 stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
56}
57
776f2227 58void exec_opw(long s2, long s0, long s1, long iflags)
379ca80d 59{
776f2227 60 long res, flags;
379ca80d
FB
61 res = s0;
62 flags = iflags;
776f2227 63 EXECSHIFT("w", "w", res, s1, s2, flags);
379ca80d
FB
64 /* overflow is undefined if count != 1 */
65 if (s1 != 1)
66 flags &= ~CC_O;
776f2227 67 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
379ca80d
FB
68 stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK);
69}
70
d57c4e01 71#else
776f2227 72#define EXECSHIFT(size, rsize, res, s1, s2, flags) \
d57c4e01
FB
73 asm ("push %4\n\t"\
74 "popf\n\t"\
776f2227 75 stringify(OP) size " %%cl, %" rsize "5, %" rsize "0\n\t" \
d57c4e01 76 "pushf\n\t"\
776f2227 77 "pop %1\n\t"\
d57c4e01
FB
78 : "=g" (res), "=g" (flags)\
79 : "c" (s1), "0" (res), "1" (flags), "r" (s2));
80
776f2227
FB
81#if defined(__x86_64__)
82void exec_opq(long s2, long s0, long s1, long iflags)
83{
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);
93}
94#endif
95
96void exec_opl(long s2, long s0, long s1, long iflags)
d57c4e01 97{
776f2227 98 long res, flags;
d57c4e01
FB
99 res = s0;
100 flags = iflags;
776f2227 101 EXECSHIFT("l", "k", res, s1, s2, flags);
d57c4e01
FB
102 /* overflow is undefined if count != 1 */
103 if (s1 != 1)
104 flags &= ~CC_O;
776f2227 105 printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
d57c4e01
FB
106 stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK);
107}
108
776f2227 109void exec_opw(long s2, long s0, long s1, long iflags)
d57c4e01 110{
776f2227 111 long res, flags;
d57c4e01
FB
112 res = s0;
113 flags = iflags;
776f2227 114 EXECSHIFT("w", "w", res, s1, s2, flags);
d57c4e01
FB
115 /* overflow is undefined if count != 1 */
116 if (s1 != 1)
117 flags &= ~CC_O;
776f2227 118 printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
d57c4e01
FB
119 stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK);
120}
121
122#endif
123
124#ifndef OP_NOBYTE
776f2227 125void exec_opb(long s0, long s1, long iflags)
379ca80d 126{
776f2227 127 long res, flags;
379ca80d
FB
128 res = s0;
129 flags = iflags;
776f2227 130 EXECSHIFT("b", "b", res, s1, 0, flags);
379ca80d
FB
131 /* overflow is undefined if count != 1 */
132 if (s1 != 1)
133 flags &= ~CC_O;
776f2227 134 printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n",
379ca80d
FB
135 stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK);
136}
d57c4e01 137#endif
379ca80d 138
776f2227 139void exec_op(long s2, long s0, long s1)
379ca80d 140{
776f2227
FB
141 s2 = i2l(s2);
142 s0 = i2l(s0);
143#if defined(__x86_64__)
144 exec_opq(s2, s0, s1, 0);
145#endif
d57c4e01 146 exec_opl(s2, s0, s1, 0);
afeb6ee3 147#ifdef OP_SHIFTD
a5973fbf 148 exec_opw(s2, s0, s1, 0);
afeb6ee3 149#else
d57c4e01 150 exec_opw(s2, s0, s1, 0);
afeb6ee3 151#endif
d57c4e01 152#ifndef OP_NOBYTE
379ca80d 153 exec_opb(s0, s1, 0);
d57c4e01 154#endif
379ca80d 155#ifdef OP_CC
776f2227
FB
156#if defined(__x86_64__)
157 exec_opq(s2, s0, s1, CC_C);
158#endif
d57c4e01
FB
159 exec_opl(s2, s0, s1, CC_C);
160 exec_opw(s2, s0, s1, CC_C);
379ca80d
FB
161 exec_opb(s0, s1, CC_C);
162#endif
163}
164
165void glue(test_, OP)(void)
166{
776f2227
FB
167 int i, n;
168#if defined(__x86_64__)
169 n = 64;
170#else
171 n = 32;
172#endif
173 for(i = 0; i < n; i++)
d57c4e01 174 exec_op(0x21ad3d34, 0x12345678, i);
776f2227 175 for(i = 0; i < n; i++)
6c3ee14f 176 exec_op(0x813f3421, 0x82345679, i);
379ca80d
FB
177}
178
179void *glue(_test_, OP) __init_call = glue(test_, OP);
180
181#undef OP
182#undef OP_CC
d57c4e01
FB
183#undef OP_SHIFTD
184#undef OP_NOBYTE
185#undef EXECSHIFT