VirtualBox

source: vbox/trunk/src/recompiler/tests/test-i386-shift.h@ 30111

Last change on this file since 30111 was 2426, checked in by vboxsync, 18 years ago

Removed the old recompiler code. (wonder why subversion didn't pick up these changes right way)

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1
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)
7
8#ifndef OP_SHIFTD
9
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
29
30#if defined(__x86_64__)
31void exec_opq(long s2, long s0, long s1, long iflags)
32{
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);
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",
55 stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK);
56}
57
58void exec_opw(long s2, long s0, long s1, long iflags)
59{
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);
69}
70
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));
80
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)
97{
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);
107}
108
109void exec_opw(long s2, long s0, long s1, long iflags)
110{
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);
120}
121
122#endif
123
124#ifndef OP_NOBYTE
125void exec_opb(long s0, long s1, long iflags)
126{
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);
136}
137#endif
138
139void exec_op(long s2, long s0, long s1)
140{
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
164}
165
166void glue(test_, OP)(void)
167{
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);
178}
179
180void *glue(_test_, OP) __init_call = glue(test_, OP);
181
182#undef OP
183#undef OP_CC
184#undef OP_SHIFTD
185#undef OP_NOBYTE
186#undef EXECSHIFT
187
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette