28 |
#define MEM_SUFFIX w_raw |
#define MEM_SUFFIX w_raw |
29 |
#elif DATA_BITS == 32 |
#elif DATA_BITS == 32 |
30 |
#define MEM_SUFFIX l_raw |
#define MEM_SUFFIX l_raw |
31 |
|
#elif DATA_BITS == 64 |
32 |
|
#define MEM_SUFFIX q_raw |
33 |
#endif |
#endif |
34 |
|
|
35 |
#elif MEM_WRITE == 1 |
#elif MEM_WRITE == 1 |
40 |
#define MEM_SUFFIX w_kernel |
#define MEM_SUFFIX w_kernel |
41 |
#elif DATA_BITS == 32 |
#elif DATA_BITS == 32 |
42 |
#define MEM_SUFFIX l_kernel |
#define MEM_SUFFIX l_kernel |
43 |
|
#elif DATA_BITS == 64 |
44 |
|
#define MEM_SUFFIX q_kernel |
45 |
#endif |
#endif |
46 |
|
|
47 |
#elif MEM_WRITE == 2 |
#elif MEM_WRITE == 2 |
52 |
#define MEM_SUFFIX w_user |
#define MEM_SUFFIX w_user |
53 |
#elif DATA_BITS == 32 |
#elif DATA_BITS == 32 |
54 |
#define MEM_SUFFIX l_user |
#define MEM_SUFFIX l_user |
55 |
|
#elif DATA_BITS == 64 |
56 |
|
#define MEM_SUFFIX q_user |
57 |
#endif |
#endif |
58 |
|
|
59 |
#else |
#else |
70 |
|
|
71 |
void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void) |
72 |
{ |
{ |
73 |
int count, src; |
int count; |
74 |
|
target_long src; |
75 |
|
|
76 |
count = T1 & SHIFT_MASK; |
count = T1 & SHIFT_MASK; |
77 |
if (count) { |
if (count) { |
78 |
src = T0; |
src = T0; |
79 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
80 |
T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); |
T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); |
81 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
82 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
83 |
#else |
#else |
84 |
/* gcc 3.2 workaround. This is really a bug in gcc. */ |
/* gcc 3.2 workaround. This is really a bug in gcc. */ |
85 |
asm volatile("" : : "r" (T0)); |
asm volatile("" : : "r" (T0)); |
94 |
|
|
95 |
void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void) |
96 |
{ |
{ |
97 |
int count, src; |
int count; |
98 |
|
target_long src; |
99 |
|
|
100 |
count = T1 & SHIFT_MASK; |
count = T1 & SHIFT_MASK; |
101 |
if (count) { |
if (count) { |
102 |
src = T0; |
src = T0; |
103 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
104 |
T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); |
T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); |
105 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
106 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
107 |
#else |
#else |
108 |
/* gcc 3.2 workaround. This is really a bug in gcc. */ |
/* gcc 3.2 workaround. This is really a bug in gcc. */ |
109 |
asm volatile("" : : "r" (T0)); |
asm volatile("" : : "r" (T0)); |
124 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
125 |
T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); |
T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); |
126 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
127 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
128 |
#endif |
#endif |
129 |
} |
} |
130 |
FORCE_RET(); |
FORCE_RET(); |
138 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
139 |
T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); |
T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); |
140 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
141 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
142 |
#endif |
#endif |
143 |
} |
} |
144 |
FORCE_RET(); |
FORCE_RET(); |
146 |
|
|
147 |
void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void) |
148 |
{ |
{ |
149 |
int count, res, eflags; |
int count, eflags; |
150 |
unsigned int src; |
target_ulong src; |
151 |
|
target_long res; |
152 |
|
|
153 |
count = T1 & 0x1f; |
count = T1 & SHIFT1_MASK; |
154 |
#if DATA_BITS == 16 |
#if DATA_BITS == 16 |
155 |
count = rclw_table[count]; |
count = rclw_table[count]; |
156 |
#elif DATA_BITS == 8 |
#elif DATA_BITS == 8 |
165 |
res |= T0 >> (DATA_BITS + 1 - count); |
res |= T0 >> (DATA_BITS + 1 - count); |
166 |
T0 = res; |
T0 = res; |
167 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
168 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
169 |
#endif |
#endif |
170 |
CC_SRC = (eflags & ~(CC_C | CC_O)) | |
CC_SRC = (eflags & ~(CC_C | CC_O)) | |
171 |
(lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | |
(lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | |
177 |
|
|
178 |
void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void) |
179 |
{ |
{ |
180 |
int count, res, eflags; |
int count, eflags; |
181 |
unsigned int src; |
target_ulong src; |
182 |
|
target_long res; |
183 |
|
|
184 |
count = T1 & 0x1f; |
count = T1 & SHIFT1_MASK; |
185 |
#if DATA_BITS == 16 |
#if DATA_BITS == 16 |
186 |
count = rclw_table[count]; |
count = rclw_table[count]; |
187 |
#elif DATA_BITS == 8 |
#elif DATA_BITS == 8 |
196 |
res |= T0 << (DATA_BITS + 1 - count); |
res |= T0 << (DATA_BITS + 1 - count); |
197 |
T0 = res; |
T0 = res; |
198 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
199 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
200 |
#endif |
#endif |
201 |
CC_SRC = (eflags & ~(CC_C | CC_O)) | |
CC_SRC = (eflags & ~(CC_C | CC_O)) | |
202 |
(lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | |
(lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | |
208 |
|
|
209 |
void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void) |
210 |
{ |
{ |
211 |
int count, src; |
int count; |
212 |
count = T1 & 0x1f; |
target_long src; |
213 |
|
|
214 |
|
count = T1 & SHIFT1_MASK; |
215 |
if (count) { |
if (count) { |
216 |
src = (DATA_TYPE)T0 << (count - 1); |
src = (DATA_TYPE)T0 << (count - 1); |
217 |
T0 = T0 << count; |
T0 = T0 << count; |
218 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
219 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
220 |
#endif |
#endif |
221 |
CC_SRC = src; |
CC_SRC = src; |
222 |
CC_DST = T0; |
CC_DST = T0; |
227 |
|
|
228 |
void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void) |
229 |
{ |
{ |
230 |
int count, src; |
int count; |
231 |
count = T1 & 0x1f; |
target_long src; |
232 |
|
|
233 |
|
count = T1 & SHIFT1_MASK; |
234 |
if (count) { |
if (count) { |
235 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
236 |
src = T0 >> (count - 1); |
src = T0 >> (count - 1); |
237 |
T0 = T0 >> count; |
T0 = T0 >> count; |
238 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
239 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
240 |
#endif |
#endif |
241 |
CC_SRC = src; |
CC_SRC = src; |
242 |
CC_DST = T0; |
CC_DST = T0; |
247 |
|
|
248 |
void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void) |
249 |
{ |
{ |
250 |
int count, src; |
int count; |
251 |
count = T1 & 0x1f; |
target_long src; |
252 |
|
|
253 |
|
count = T1 & SHIFT1_MASK; |
254 |
if (count) { |
if (count) { |
255 |
src = (DATA_STYPE)T0; |
src = (DATA_STYPE)T0; |
256 |
T0 = src >> count; |
T0 = src >> count; |
257 |
src = src >> (count - 1); |
src = src >> (count - 1); |
258 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
259 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
260 |
#endif |
#endif |
261 |
CC_SRC = src; |
CC_SRC = src; |
262 |
CC_DST = T0; |
CC_DST = T0; |
280 |
res |= T1 << (count - 16); |
res |= T1 << (count - 16); |
281 |
T0 = res >> 16; |
T0 = res >> 16; |
282 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
283 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
284 |
#endif |
#endif |
285 |
CC_SRC = tmp; |
CC_SRC = tmp; |
286 |
CC_DST = T0; |
CC_DST = T0; |
300 |
res |= T1 << (count - 16); |
res |= T1 << (count - 16); |
301 |
T0 = res >> 16; |
T0 = res >> 16; |
302 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
303 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
304 |
#endif |
#endif |
305 |
CC_SRC = tmp; |
CC_SRC = tmp; |
306 |
CC_DST = T0; |
CC_DST = T0; |
322 |
res |= T1 << (32 - count); |
res |= T1 << (32 - count); |
323 |
T0 = res; |
T0 = res; |
324 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
325 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
326 |
#endif |
#endif |
327 |
CC_SRC = tmp; |
CC_SRC = tmp; |
328 |
CC_DST = T0; |
CC_DST = T0; |
343 |
res |= T1 << (32 - count); |
res |= T1 << (32 - count); |
344 |
T0 = res; |
T0 = res; |
345 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
346 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
347 |
#endif |
#endif |
348 |
CC_SRC = tmp; |
CC_SRC = tmp; |
349 |
CC_DST = T0; |
CC_DST = T0; |
353 |
} |
} |
354 |
#endif |
#endif |
355 |
|
|
356 |
#if DATA_BITS == 32 |
#if DATA_BITS >= 32 |
357 |
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void) |
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void) |
358 |
{ |
{ |
359 |
int count, tmp; |
int count; |
360 |
|
target_long tmp; |
361 |
|
|
362 |
count = PARAM1; |
count = PARAM1; |
363 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
364 |
T1 &= DATA_MASK; |
T1 &= DATA_MASK; |
365 |
tmp = T0 << (count - 1); |
tmp = T0 << (count - 1); |
366 |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
367 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
368 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
369 |
#endif |
#endif |
370 |
CC_SRC = tmp; |
CC_SRC = tmp; |
371 |
CC_DST = T0; |
CC_DST = T0; |
373 |
|
|
374 |
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void) |
void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void) |
375 |
{ |
{ |
376 |
int count, tmp; |
int count; |
377 |
count = ECX & 0x1f; |
target_long tmp; |
378 |
|
|
379 |
|
count = ECX & SHIFT1_MASK; |
380 |
if (count) { |
if (count) { |
381 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
382 |
T1 &= DATA_MASK; |
T1 &= DATA_MASK; |
383 |
tmp = T0 << (count - 1); |
tmp = T0 << (count - 1); |
384 |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
385 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
386 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
387 |
#endif |
#endif |
388 |
CC_SRC = tmp; |
CC_SRC = tmp; |
389 |
CC_DST = T0; |
CC_DST = T0; |
394 |
|
|
395 |
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void) |
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void) |
396 |
{ |
{ |
397 |
int count, tmp; |
int count; |
398 |
|
target_long tmp; |
399 |
|
|
400 |
count = PARAM1; |
count = PARAM1; |
401 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
402 |
T1 &= DATA_MASK; |
T1 &= DATA_MASK; |
403 |
tmp = T0 >> (count - 1); |
tmp = T0 >> (count - 1); |
404 |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
405 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
406 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
407 |
#endif |
#endif |
408 |
CC_SRC = tmp; |
CC_SRC = tmp; |
409 |
CC_DST = T0; |
CC_DST = T0; |
412 |
|
|
413 |
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void) |
void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void) |
414 |
{ |
{ |
415 |
int count, tmp; |
int count; |
416 |
count = ECX & 0x1f; |
target_long tmp; |
417 |
|
|
418 |
|
count = ECX & SHIFT1_MASK; |
419 |
if (count) { |
if (count) { |
420 |
T0 &= DATA_MASK; |
T0 &= DATA_MASK; |
421 |
T1 &= DATA_MASK; |
T1 &= DATA_MASK; |
422 |
tmp = T0 >> (count - 1); |
tmp = T0 >> (count - 1); |
423 |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
424 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
425 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
426 |
#endif |
#endif |
427 |
CC_SRC = tmp; |
CC_SRC = tmp; |
428 |
CC_DST = T0; |
CC_DST = T0; |
440 |
cf = cc_table[CC_OP].compute_c(); |
cf = cc_table[CC_OP].compute_c(); |
441 |
T0 = T0 + T1 + cf; |
T0 = T0 + T1 + cf; |
442 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
443 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
444 |
#endif |
#endif |
445 |
CC_SRC = T1; |
CC_SRC = T1; |
446 |
CC_DST = T0; |
CC_DST = T0; |
447 |
CC_OP = CC_OP_ADDB + SHIFT + cf * 3; |
CC_OP = CC_OP_ADDB + SHIFT + cf * 4; |
448 |
} |
} |
449 |
|
|
450 |
void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void) |
void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void) |
453 |
cf = cc_table[CC_OP].compute_c(); |
cf = cc_table[CC_OP].compute_c(); |
454 |
T0 = T0 - T1 - cf; |
T0 = T0 - T1 - cf; |
455 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
456 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
457 |
#endif |
#endif |
458 |
CC_SRC = T1; |
CC_SRC = T1; |
459 |
CC_DST = T0; |
CC_DST = T0; |
460 |
CC_OP = CC_OP_SUBB + SHIFT + cf * 3; |
CC_OP = CC_OP_SUBB + SHIFT + cf * 4; |
461 |
} |
} |
462 |
|
|
463 |
void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void) |
void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void) |
464 |
{ |
{ |
465 |
unsigned int src, dst; |
target_ulong src, dst; |
466 |
|
|
467 |
src = T0; |
src = T0; |
468 |
dst = EAX - T0; |
dst = EAX - T0; |
469 |
if ((DATA_TYPE)dst == 0) { |
if ((DATA_TYPE)dst == 0) { |
470 |
T0 = T1; |
T0 = T1; |
471 |
#ifdef MEM_WRITE |
#ifdef MEM_WRITE |
472 |
glue(st, MEM_SUFFIX)((uint8_t *)A0, T0); |
glue(st, MEM_SUFFIX)(A0, T0); |
473 |
#endif |
#endif |
474 |
} else { |
} else { |
475 |
EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK); |
EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK); |