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