root / op_string.h @ 2c1794c4
History | View | Annotate | Download (5.1 kB)
1 |
|
---|---|
2 |
void OPPROTO glue(glue(op_movs, SUFFIX), STRING_SUFFIX)(void) |
3 |
{ |
4 |
int v, inc;
|
5 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
6 |
glue(st, SUFFIX)(DI_ADDR, v); |
7 |
inc = (DF << SHIFT); |
8 |
INC_SI(); |
9 |
INC_DI(); |
10 |
} |
11 |
|
12 |
void OPPROTO glue(glue(op_rep_movs, SUFFIX), STRING_SUFFIX)(void) |
13 |
{ |
14 |
int v, inc;
|
15 |
inc = (DF << SHIFT); |
16 |
while (CX != 0) { |
17 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
18 |
glue(st, SUFFIX)(DI_ADDR, v); |
19 |
INC_SI(); |
20 |
INC_DI(); |
21 |
DEC_CX(); |
22 |
} |
23 |
FORCE_RET(); |
24 |
} |
25 |
|
26 |
void OPPROTO glue(glue(op_stos, SUFFIX), STRING_SUFFIX)(void) |
27 |
{ |
28 |
int inc;
|
29 |
glue(st, SUFFIX)(DI_ADDR, EAX); |
30 |
inc = (DF << SHIFT); |
31 |
INC_DI(); |
32 |
} |
33 |
|
34 |
void OPPROTO glue(glue(op_rep_stos, SUFFIX), STRING_SUFFIX)(void) |
35 |
{ |
36 |
int inc;
|
37 |
inc = (DF << SHIFT); |
38 |
while (CX != 0) { |
39 |
glue(st, SUFFIX)(DI_ADDR, EAX); |
40 |
INC_DI(); |
41 |
DEC_CX(); |
42 |
} |
43 |
FORCE_RET(); |
44 |
} |
45 |
|
46 |
void OPPROTO glue(glue(op_lods, SUFFIX), STRING_SUFFIX)(void) |
47 |
{ |
48 |
int v, inc;
|
49 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
50 |
#if SHIFT == 0 |
51 |
EAX = (EAX & ~0xff) | v;
|
52 |
#elif SHIFT == 1 |
53 |
EAX = (EAX & ~0xffff) | v;
|
54 |
#else
|
55 |
EAX = v; |
56 |
#endif
|
57 |
inc = (DF << SHIFT); |
58 |
INC_SI(); |
59 |
} |
60 |
|
61 |
/* don't know if it is used */
|
62 |
void OPPROTO glue(glue(op_rep_lods, SUFFIX), STRING_SUFFIX)(void) |
63 |
{ |
64 |
int v, inc;
|
65 |
inc = (DF << SHIFT); |
66 |
while (CX != 0) { |
67 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
68 |
#if SHIFT == 0 |
69 |
EAX = (EAX & ~0xff) | v;
|
70 |
#elif SHIFT == 1 |
71 |
EAX = (EAX & ~0xffff) | v;
|
72 |
#else
|
73 |
EAX = v; |
74 |
#endif
|
75 |
INC_SI(); |
76 |
DEC_CX(); |
77 |
} |
78 |
FORCE_RET(); |
79 |
} |
80 |
|
81 |
void OPPROTO glue(glue(op_scas, SUFFIX), STRING_SUFFIX)(void) |
82 |
{ |
83 |
int v, inc;
|
84 |
|
85 |
v = glue(ldu, SUFFIX)(DI_ADDR); |
86 |
inc = (DF << SHIFT); |
87 |
INC_DI(); |
88 |
CC_SRC = v; |
89 |
CC_DST = EAX - v; |
90 |
} |
91 |
|
92 |
void OPPROTO glue(glue(op_repz_scas, SUFFIX), STRING_SUFFIX)(void) |
93 |
{ |
94 |
int v1, v2, inc;
|
95 |
|
96 |
if (CX != 0) { |
97 |
/* NOTE: the flags are not modified if CX == 0 */
|
98 |
v1 = EAX & DATA_MASK; |
99 |
inc = (DF << SHIFT); |
100 |
do {
|
101 |
v2 = glue(ldu, SUFFIX)(DI_ADDR); |
102 |
INC_DI(); |
103 |
DEC_CX(); |
104 |
if (v1 != v2)
|
105 |
break;
|
106 |
} while (CX != 0); |
107 |
CC_SRC = v2; |
108 |
CC_DST = v1 - v2; |
109 |
CC_OP = CC_OP_SUBB + SHIFT; |
110 |
} |
111 |
FORCE_RET(); |
112 |
} |
113 |
|
114 |
void OPPROTO glue(glue(op_repnz_scas, SUFFIX), STRING_SUFFIX)(void) |
115 |
{ |
116 |
int v1, v2, inc;
|
117 |
|
118 |
if (CX != 0) { |
119 |
/* NOTE: the flags are not modified if CX == 0 */
|
120 |
v1 = EAX & DATA_MASK; |
121 |
inc = (DF << SHIFT); |
122 |
do {
|
123 |
v2 = glue(ldu, SUFFIX)(DI_ADDR); |
124 |
INC_DI(); |
125 |
DEC_CX(); |
126 |
if (v1 == v2)
|
127 |
break;
|
128 |
} while (CX != 0); |
129 |
CC_SRC = v2; |
130 |
CC_DST = v1 - v2; |
131 |
CC_OP = CC_OP_SUBB + SHIFT; |
132 |
} |
133 |
FORCE_RET(); |
134 |
} |
135 |
|
136 |
void OPPROTO glue(glue(op_cmps, SUFFIX), STRING_SUFFIX)(void) |
137 |
{ |
138 |
int v1, v2, inc;
|
139 |
v1 = glue(ldu, SUFFIX)(SI_ADDR); |
140 |
v2 = glue(ldu, SUFFIX)(DI_ADDR); |
141 |
inc = (DF << SHIFT); |
142 |
INC_SI(); |
143 |
INC_DI(); |
144 |
CC_SRC = v2; |
145 |
CC_DST = v1 - v2; |
146 |
} |
147 |
|
148 |
void OPPROTO glue(glue(op_repz_cmps, SUFFIX), STRING_SUFFIX)(void) |
149 |
{ |
150 |
int v1, v2, inc;
|
151 |
if (CX != 0) { |
152 |
inc = (DF << SHIFT); |
153 |
do {
|
154 |
v1 = glue(ldu, SUFFIX)(SI_ADDR); |
155 |
v2 = glue(ldu, SUFFIX)(DI_ADDR); |
156 |
INC_SI(); |
157 |
INC_DI(); |
158 |
DEC_CX(); |
159 |
if (v1 != v2)
|
160 |
break;
|
161 |
} while (CX != 0); |
162 |
CC_SRC = v2; |
163 |
CC_DST = v1 - v2; |
164 |
CC_OP = CC_OP_SUBB + SHIFT; |
165 |
} |
166 |
FORCE_RET(); |
167 |
} |
168 |
|
169 |
void OPPROTO glue(glue(op_repnz_cmps, SUFFIX), STRING_SUFFIX)(void) |
170 |
{ |
171 |
int v1, v2, inc;
|
172 |
if (CX != 0) { |
173 |
inc = (DF << SHIFT); |
174 |
do {
|
175 |
v1 = glue(ldu, SUFFIX)(SI_ADDR); |
176 |
v2 = glue(ldu, SUFFIX)(DI_ADDR); |
177 |
INC_SI(); |
178 |
INC_DI(); |
179 |
DEC_CX(); |
180 |
if (v1 == v2)
|
181 |
break;
|
182 |
} while (CX != 0); |
183 |
CC_SRC = v2; |
184 |
CC_DST = v1 - v2; |
185 |
CC_OP = CC_OP_SUBB + SHIFT; |
186 |
} |
187 |
FORCE_RET(); |
188 |
} |
189 |
|
190 |
void OPPROTO glue(glue(op_outs, SUFFIX), STRING_SUFFIX)(void) |
191 |
{ |
192 |
int v, dx, inc;
|
193 |
dx = EDX & 0xffff;
|
194 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
195 |
glue(cpu_x86_out, SUFFIX)(env, dx, v); |
196 |
inc = (DF << SHIFT); |
197 |
INC_SI(); |
198 |
} |
199 |
|
200 |
void OPPROTO glue(glue(op_rep_outs, SUFFIX), STRING_SUFFIX)(void) |
201 |
{ |
202 |
int v, dx, inc;
|
203 |
inc = (DF << SHIFT); |
204 |
dx = EDX & 0xffff;
|
205 |
while (CX != 0) { |
206 |
v = glue(ldu, SUFFIX)(SI_ADDR); |
207 |
glue(cpu_x86_out, SUFFIX)(env, dx, v); |
208 |
INC_SI(); |
209 |
DEC_CX(); |
210 |
} |
211 |
FORCE_RET(); |
212 |
} |
213 |
|
214 |
void OPPROTO glue(glue(op_ins, SUFFIX), STRING_SUFFIX)(void) |
215 |
{ |
216 |
int v, dx, inc;
|
217 |
dx = EDX & 0xffff;
|
218 |
v = glue(cpu_x86_in, SUFFIX)(env, dx); |
219 |
glue(st, SUFFIX)(DI_ADDR, v); |
220 |
inc = (DF << SHIFT); |
221 |
INC_DI(); |
222 |
} |
223 |
|
224 |
void OPPROTO glue(glue(op_rep_ins, SUFFIX), STRING_SUFFIX)(void) |
225 |
{ |
226 |
int v, dx, inc;
|
227 |
inc = (DF << SHIFT); |
228 |
dx = EDX & 0xffff;
|
229 |
while (CX != 0) { |
230 |
v = glue(cpu_x86_in, SUFFIX)(env, dx); |
231 |
glue(st, SUFFIX)(DI_ADDR, v); |
232 |
INC_DI(); |
233 |
DEC_CX(); |
234 |
} |
235 |
FORCE_RET(); |
236 |
} |
237 |
|
238 |
#undef STRING_SUFFIX
|
239 |
#undef SI_ADDR
|
240 |
#undef DI_ADDR
|
241 |
#undef INC_SI
|
242 |
#undef INC_DI
|
243 |
#undef CX
|
244 |
#undef DEC_CX
|