Statistics
| Branch: | Revision:

root / target-i386 / ops_template_mem.h @ 2c0262af

History | View | Annotate | Download (10 kB)

1 2c0262af bellard
/*
2 2c0262af bellard
 *  i386 micro operations (included several times to generate
3 2c0262af bellard
 *  different operand sizes)
4 2c0262af bellard
 * 
5 2c0262af bellard
 *  Copyright (c) 2003 Fabrice Bellard
6 2c0262af bellard
 *
7 2c0262af bellard
 * This library is free software; you can redistribute it and/or
8 2c0262af bellard
 * modify it under the terms of the GNU Lesser General Public
9 2c0262af bellard
 * License as published by the Free Software Foundation; either
10 2c0262af bellard
 * version 2 of the License, or (at your option) any later version.
11 2c0262af bellard
 *
12 2c0262af bellard
 * This library is distributed in the hope that it will be useful,
13 2c0262af bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 2c0262af bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 2c0262af bellard
 * Lesser General Public License for more details.
16 2c0262af bellard
 *
17 2c0262af bellard
 * You should have received a copy of the GNU Lesser General Public
18 2c0262af bellard
 * License along with this library; if not, write to the Free Software
19 2c0262af bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 2c0262af bellard
 */
21 2c0262af bellard
#ifdef MEM_WRITE
22 2c0262af bellard
23 2c0262af bellard
#if DATA_BITS == 8
24 2c0262af bellard
#define MEM_SUFFIX b_mem
25 2c0262af bellard
#elif DATA_BITS == 16
26 2c0262af bellard
#define MEM_SUFFIX w_mem
27 2c0262af bellard
#elif DATA_BITS == 32
28 2c0262af bellard
#define MEM_SUFFIX l_mem
29 2c0262af bellard
#endif
30 2c0262af bellard
31 2c0262af bellard
#else
32 2c0262af bellard
33 2c0262af bellard
#define MEM_SUFFIX SUFFIX
34 2c0262af bellard
35 2c0262af bellard
#endif
36 2c0262af bellard
37 2c0262af bellard
void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void)
38 2c0262af bellard
{
39 2c0262af bellard
    int count, src;
40 2c0262af bellard
    count = T1 & SHIFT_MASK;
41 2c0262af bellard
    if (count) {
42 2c0262af bellard
        src = T0;
43 2c0262af bellard
        T0 &= DATA_MASK;
44 2c0262af bellard
        T0 = (T0 << count) | (T0 >> (DATA_BITS - count));
45 2c0262af bellard
#ifdef MEM_WRITE
46 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
47 2c0262af bellard
#else
48 2c0262af bellard
        /* gcc 3.2 workaround. This is really a bug in gcc. */
49 2c0262af bellard
        asm volatile("" : : "r" (T0));
50 2c0262af bellard
#endif
51 2c0262af bellard
        CC_SRC = (cc_table[CC_OP].compute_all() & ~(CC_O | CC_C)) | 
52 2c0262af bellard
            (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | 
53 2c0262af bellard
            (T0 & CC_C);
54 2c0262af bellard
        CC_OP = CC_OP_EFLAGS;
55 2c0262af bellard
    }
56 2c0262af bellard
    FORCE_RET();
57 2c0262af bellard
}
58 2c0262af bellard
59 2c0262af bellard
void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void)
60 2c0262af bellard
{
61 2c0262af bellard
    int count, src;
62 2c0262af bellard
    count = T1 & SHIFT_MASK;
63 2c0262af bellard
    if (count) {
64 2c0262af bellard
        src = T0;
65 2c0262af bellard
        T0 &= DATA_MASK;
66 2c0262af bellard
        T0 = (T0 >> count) | (T0 << (DATA_BITS - count));
67 2c0262af bellard
#ifdef MEM_WRITE
68 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
69 2c0262af bellard
#else
70 2c0262af bellard
        /* gcc 3.2 workaround. This is really a bug in gcc. */
71 2c0262af bellard
        asm volatile("" : : "r" (T0));
72 2c0262af bellard
#endif
73 2c0262af bellard
        CC_SRC = (cc_table[CC_OP].compute_all() & ~(CC_O | CC_C)) |
74 2c0262af bellard
            (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | 
75 2c0262af bellard
            ((T0 >> (DATA_BITS - 1)) & CC_C);
76 2c0262af bellard
        CC_OP = CC_OP_EFLAGS;
77 2c0262af bellard
    }
78 2c0262af bellard
    FORCE_RET();
79 2c0262af bellard
}
80 2c0262af bellard
81 2c0262af bellard
void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1)(void)
82 2c0262af bellard
{
83 2c0262af bellard
    int count;
84 2c0262af bellard
    count = T1 & SHIFT_MASK;
85 2c0262af bellard
    if (count) {
86 2c0262af bellard
        T0 &= DATA_MASK;
87 2c0262af bellard
        T0 = (T0 << count) | (T0 >> (DATA_BITS - count));
88 2c0262af bellard
#ifdef MEM_WRITE
89 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
90 2c0262af bellard
#endif
91 2c0262af bellard
    }
92 2c0262af bellard
    FORCE_RET();
93 2c0262af bellard
}
94 2c0262af bellard
95 2c0262af bellard
void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1)(void)
96 2c0262af bellard
{
97 2c0262af bellard
    int count;
98 2c0262af bellard
    count = T1 & SHIFT_MASK;
99 2c0262af bellard
    if (count) {
100 2c0262af bellard
        T0 &= DATA_MASK;
101 2c0262af bellard
        T0 = (T0 >> count) | (T0 << (DATA_BITS - count));
102 2c0262af bellard
#ifdef MEM_WRITE
103 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
104 2c0262af bellard
#endif
105 2c0262af bellard
    }
106 2c0262af bellard
    FORCE_RET();
107 2c0262af bellard
}
108 2c0262af bellard
109 2c0262af bellard
void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void)
110 2c0262af bellard
{
111 2c0262af bellard
    int count, res, eflags;
112 2c0262af bellard
    unsigned int src;
113 2c0262af bellard
114 2c0262af bellard
    count = T1 & 0x1f;
115 2c0262af bellard
#if DATA_BITS == 16
116 2c0262af bellard
    count = rclw_table[count];
117 2c0262af bellard
#elif DATA_BITS == 8
118 2c0262af bellard
    count = rclb_table[count];
119 2c0262af bellard
#endif
120 2c0262af bellard
    if (count) {
121 2c0262af bellard
        eflags = cc_table[CC_OP].compute_all();
122 2c0262af bellard
        T0 &= DATA_MASK;
123 2c0262af bellard
        src = T0;
124 2c0262af bellard
        res = (T0 << count) | ((eflags & CC_C) << (count - 1));
125 2c0262af bellard
        if (count > 1)
126 2c0262af bellard
            res |= T0 >> (DATA_BITS + 1 - count);
127 2c0262af bellard
        T0 = res;
128 2c0262af bellard
#ifdef MEM_WRITE
129 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
130 2c0262af bellard
#endif
131 2c0262af bellard
        CC_SRC = (eflags & ~(CC_C | CC_O)) |
132 2c0262af bellard
            (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | 
133 2c0262af bellard
            ((src >> (DATA_BITS - count)) & CC_C);
134 2c0262af bellard
        CC_OP = CC_OP_EFLAGS;
135 2c0262af bellard
    }
136 2c0262af bellard
    FORCE_RET();
137 2c0262af bellard
}
138 2c0262af bellard
139 2c0262af bellard
void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void)
140 2c0262af bellard
{
141 2c0262af bellard
    int count, res, eflags;
142 2c0262af bellard
    unsigned int src;
143 2c0262af bellard
144 2c0262af bellard
    count = T1 & 0x1f;
145 2c0262af bellard
#if DATA_BITS == 16
146 2c0262af bellard
    count = rclw_table[count];
147 2c0262af bellard
#elif DATA_BITS == 8
148 2c0262af bellard
    count = rclb_table[count];
149 2c0262af bellard
#endif
150 2c0262af bellard
    if (count) {
151 2c0262af bellard
        eflags = cc_table[CC_OP].compute_all();
152 2c0262af bellard
        T0 &= DATA_MASK;
153 2c0262af bellard
        src = T0;
154 2c0262af bellard
        res = (T0 >> count) | ((eflags & CC_C) << (DATA_BITS - count));
155 2c0262af bellard
        if (count > 1)
156 2c0262af bellard
            res |= T0 << (DATA_BITS + 1 - count);
157 2c0262af bellard
        T0 = res;
158 2c0262af bellard
#ifdef MEM_WRITE
159 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
160 2c0262af bellard
#endif
161 2c0262af bellard
        CC_SRC = (eflags & ~(CC_C | CC_O)) |
162 2c0262af bellard
            (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | 
163 2c0262af bellard
            ((src >> (count - 1)) & CC_C);
164 2c0262af bellard
        CC_OP = CC_OP_EFLAGS;
165 2c0262af bellard
    }
166 2c0262af bellard
    FORCE_RET();
167 2c0262af bellard
}
168 2c0262af bellard
169 2c0262af bellard
void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void)
170 2c0262af bellard
{
171 2c0262af bellard
    int count, src;
172 2c0262af bellard
    count = T1 & 0x1f;
173 2c0262af bellard
    if (count) {
174 2c0262af bellard
        src = (DATA_TYPE)T0 << (count - 1);
175 2c0262af bellard
        T0 = T0 << count;
176 2c0262af bellard
#ifdef MEM_WRITE
177 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
178 2c0262af bellard
#endif
179 2c0262af bellard
        CC_SRC = src;
180 2c0262af bellard
        CC_DST = T0;
181 2c0262af bellard
        CC_OP = CC_OP_SHLB + SHIFT;
182 2c0262af bellard
    }
183 2c0262af bellard
    FORCE_RET();
184 2c0262af bellard
}
185 2c0262af bellard
186 2c0262af bellard
void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void)
187 2c0262af bellard
{
188 2c0262af bellard
    int count, src;
189 2c0262af bellard
    count = T1 & 0x1f;
190 2c0262af bellard
    if (count) {
191 2c0262af bellard
        T0 &= DATA_MASK;
192 2c0262af bellard
        src = T0 >> (count - 1);
193 2c0262af bellard
        T0 = T0 >> count;
194 2c0262af bellard
#ifdef MEM_WRITE
195 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
196 2c0262af bellard
#endif
197 2c0262af bellard
        CC_SRC = src;
198 2c0262af bellard
        CC_DST = T0;
199 2c0262af bellard
        CC_OP = CC_OP_SARB + SHIFT;
200 2c0262af bellard
    }
201 2c0262af bellard
    FORCE_RET();
202 2c0262af bellard
}
203 2c0262af bellard
204 2c0262af bellard
void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void)
205 2c0262af bellard
{
206 2c0262af bellard
    int count, src;
207 2c0262af bellard
    count = T1 & 0x1f;
208 2c0262af bellard
    if (count) {
209 2c0262af bellard
        src = (DATA_STYPE)T0;
210 2c0262af bellard
        T0 = src >> count;
211 2c0262af bellard
        src = src >> (count - 1);
212 2c0262af bellard
#ifdef MEM_WRITE
213 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
214 2c0262af bellard
#endif
215 2c0262af bellard
        CC_SRC = src;
216 2c0262af bellard
        CC_DST = T0;
217 2c0262af bellard
        CC_OP = CC_OP_SARB + SHIFT;
218 2c0262af bellard
    }
219 2c0262af bellard
    FORCE_RET();
220 2c0262af bellard
}
221 2c0262af bellard
222 2c0262af bellard
#if DATA_BITS == 16
223 2c0262af bellard
/* XXX: overflow flag might be incorrect in some cases in shldw */
224 2c0262af bellard
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void)
225 2c0262af bellard
{
226 2c0262af bellard
    int count;
227 2c0262af bellard
    unsigned int res, tmp;
228 2c0262af bellard
    count = PARAM1;
229 2c0262af bellard
    T1 &= 0xffff;
230 2c0262af bellard
    res = T1 | (T0 << 16);
231 2c0262af bellard
    tmp = res >> (32 - count);
232 2c0262af bellard
    res <<= count;
233 2c0262af bellard
    if (count > 16)
234 2c0262af bellard
        res |= T1 << (count - 16);
235 2c0262af bellard
    T0 = res >> 16;
236 2c0262af bellard
#ifdef MEM_WRITE
237 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
238 2c0262af bellard
#endif
239 2c0262af bellard
    CC_SRC = tmp;
240 2c0262af bellard
    CC_DST = T0;
241 2c0262af bellard
}
242 2c0262af bellard
243 2c0262af bellard
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
244 2c0262af bellard
{
245 2c0262af bellard
    int count;
246 2c0262af bellard
    unsigned int res, tmp;
247 2c0262af bellard
    count = ECX & 0x1f;
248 2c0262af bellard
    if (count) {
249 2c0262af bellard
        T1 &= 0xffff;
250 2c0262af bellard
        res = T1 | (T0 << 16);
251 2c0262af bellard
        tmp = res >> (32 - count);
252 2c0262af bellard
        res <<= count;
253 2c0262af bellard
        if (count > 16)
254 2c0262af bellard
          res |= T1 << (count - 16);
255 2c0262af bellard
        T0 = res >> 16;
256 2c0262af bellard
#ifdef MEM_WRITE
257 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
258 2c0262af bellard
#endif
259 2c0262af bellard
        CC_SRC = tmp;
260 2c0262af bellard
        CC_DST = T0;
261 2c0262af bellard
        CC_OP = CC_OP_SARB + SHIFT;
262 2c0262af bellard
    }
263 2c0262af bellard
    FORCE_RET();
264 2c0262af bellard
}
265 2c0262af bellard
266 2c0262af bellard
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void)
267 2c0262af bellard
{
268 2c0262af bellard
    int count;
269 2c0262af bellard
    unsigned int res, tmp;
270 2c0262af bellard
271 2c0262af bellard
    count = PARAM1;
272 2c0262af bellard
    res = (T0 & 0xffff) | (T1 << 16);
273 2c0262af bellard
    tmp = res >> (count - 1);
274 2c0262af bellard
    res >>= count;
275 2c0262af bellard
    if (count > 16)
276 2c0262af bellard
        res |= T1 << (32 - count);
277 2c0262af bellard
    T0 = res;
278 2c0262af bellard
#ifdef MEM_WRITE
279 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
280 2c0262af bellard
#endif
281 2c0262af bellard
    CC_SRC = tmp;
282 2c0262af bellard
    CC_DST = T0;
283 2c0262af bellard
}
284 2c0262af bellard
285 2c0262af bellard
286 2c0262af bellard
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
287 2c0262af bellard
{
288 2c0262af bellard
    int count;
289 2c0262af bellard
    unsigned int res, tmp;
290 2c0262af bellard
291 2c0262af bellard
    count = ECX & 0x1f;
292 2c0262af bellard
    if (count) {
293 2c0262af bellard
        res = (T0 & 0xffff) | (T1 << 16);
294 2c0262af bellard
        tmp = res >> (count - 1);
295 2c0262af bellard
        res >>= count;
296 2c0262af bellard
        if (count > 16)
297 2c0262af bellard
            res |= T1 << (32 - count);
298 2c0262af bellard
        T0 = res;
299 2c0262af bellard
#ifdef MEM_WRITE
300 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
301 2c0262af bellard
#endif
302 2c0262af bellard
        CC_SRC = tmp;
303 2c0262af bellard
        CC_DST = T0;
304 2c0262af bellard
        CC_OP = CC_OP_SARB + SHIFT;
305 2c0262af bellard
    }
306 2c0262af bellard
    FORCE_RET();
307 2c0262af bellard
}
308 2c0262af bellard
#endif
309 2c0262af bellard
310 2c0262af bellard
#if DATA_BITS == 32
311 2c0262af bellard
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void)
312 2c0262af bellard
{
313 2c0262af bellard
    int count, tmp;
314 2c0262af bellard
    count = PARAM1;
315 2c0262af bellard
    T0 &= DATA_MASK;
316 2c0262af bellard
    T1 &= DATA_MASK;
317 2c0262af bellard
    tmp = T0 << (count - 1);
318 2c0262af bellard
    T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
319 2c0262af bellard
#ifdef MEM_WRITE
320 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
321 2c0262af bellard
#endif
322 2c0262af bellard
    CC_SRC = tmp;
323 2c0262af bellard
    CC_DST = T0;
324 2c0262af bellard
}
325 2c0262af bellard
326 2c0262af bellard
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
327 2c0262af bellard
{
328 2c0262af bellard
    int count, tmp;
329 2c0262af bellard
    count = ECX & 0x1f;
330 2c0262af bellard
    if (count) {
331 2c0262af bellard
        T0 &= DATA_MASK;
332 2c0262af bellard
        T1 &= DATA_MASK;
333 2c0262af bellard
        tmp = T0 << (count - 1);
334 2c0262af bellard
        T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
335 2c0262af bellard
#ifdef MEM_WRITE
336 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
337 2c0262af bellard
#endif
338 2c0262af bellard
        CC_SRC = tmp;
339 2c0262af bellard
        CC_DST = T0;
340 2c0262af bellard
        CC_OP = CC_OP_SHLB + SHIFT;
341 2c0262af bellard
    }
342 2c0262af bellard
    FORCE_RET();
343 2c0262af bellard
}
344 2c0262af bellard
345 2c0262af bellard
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void)
346 2c0262af bellard
{
347 2c0262af bellard
    int count, tmp;
348 2c0262af bellard
    count = PARAM1;
349 2c0262af bellard
    T0 &= DATA_MASK;
350 2c0262af bellard
    T1 &= DATA_MASK;
351 2c0262af bellard
    tmp = T0 >> (count - 1);
352 2c0262af bellard
    T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
353 2c0262af bellard
#ifdef MEM_WRITE
354 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
355 2c0262af bellard
#endif
356 2c0262af bellard
    CC_SRC = tmp;
357 2c0262af bellard
    CC_DST = T0;
358 2c0262af bellard
}
359 2c0262af bellard
360 2c0262af bellard
361 2c0262af bellard
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
362 2c0262af bellard
{
363 2c0262af bellard
    int count, tmp;
364 2c0262af bellard
    count = ECX & 0x1f;
365 2c0262af bellard
    if (count) {
366 2c0262af bellard
        T0 &= DATA_MASK;
367 2c0262af bellard
        T1 &= DATA_MASK;
368 2c0262af bellard
        tmp = T0 >> (count - 1);
369 2c0262af bellard
        T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
370 2c0262af bellard
#ifdef MEM_WRITE
371 2c0262af bellard
        glue(st, SUFFIX)((uint8_t *)A0, T0);
372 2c0262af bellard
#endif
373 2c0262af bellard
        CC_SRC = tmp;
374 2c0262af bellard
        CC_DST = T0;
375 2c0262af bellard
        CC_OP = CC_OP_SARB + SHIFT;
376 2c0262af bellard
    }
377 2c0262af bellard
    FORCE_RET();
378 2c0262af bellard
}
379 2c0262af bellard
#endif
380 2c0262af bellard
381 2c0262af bellard
/* carry add/sub (we only need to set CC_OP differently) */
382 2c0262af bellard
383 2c0262af bellard
void OPPROTO glue(glue(op_adc, MEM_SUFFIX), _T0_T1_cc)(void)
384 2c0262af bellard
{
385 2c0262af bellard
    int cf;
386 2c0262af bellard
    cf = cc_table[CC_OP].compute_c();
387 2c0262af bellard
    T0 = T0 + T1 + cf;
388 2c0262af bellard
#ifdef MEM_WRITE
389 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
390 2c0262af bellard
#endif
391 2c0262af bellard
    CC_SRC = T1;
392 2c0262af bellard
    CC_DST = T0;
393 2c0262af bellard
    CC_OP = CC_OP_ADDB + SHIFT + cf * 3;
394 2c0262af bellard
}
395 2c0262af bellard
396 2c0262af bellard
void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void)
397 2c0262af bellard
{
398 2c0262af bellard
    int cf;
399 2c0262af bellard
    cf = cc_table[CC_OP].compute_c();
400 2c0262af bellard
    T0 = T0 - T1 - cf;
401 2c0262af bellard
#ifdef MEM_WRITE
402 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
403 2c0262af bellard
#endif
404 2c0262af bellard
    CC_SRC = T1;
405 2c0262af bellard
    CC_DST = T0;
406 2c0262af bellard
    CC_OP = CC_OP_SUBB + SHIFT + cf * 3;
407 2c0262af bellard
}
408 2c0262af bellard
409 2c0262af bellard
void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void)
410 2c0262af bellard
{
411 2c0262af bellard
    unsigned int src, dst;
412 2c0262af bellard
413 2c0262af bellard
    src = T0;
414 2c0262af bellard
    dst = EAX - T0;
415 2c0262af bellard
    if ((DATA_TYPE)dst == 0) {
416 2c0262af bellard
        T0 = T1;
417 2c0262af bellard
    } else {
418 2c0262af bellard
        EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK);
419 2c0262af bellard
    }
420 2c0262af bellard
#ifdef MEM_WRITE
421 2c0262af bellard
    glue(st, SUFFIX)((uint8_t *)A0, T0);
422 2c0262af bellard
#endif
423 2c0262af bellard
    CC_SRC = src;
424 2c0262af bellard
    CC_DST = dst;
425 2c0262af bellard
    FORCE_RET();
426 2c0262af bellard
}
427 2c0262af bellard
428 2c0262af bellard
#undef MEM_SUFFIX
429 2c0262af bellard
#undef MEM_WRITE