Revision 14ce26e7 target-i386/ops_template.h
b/target-i386/ops_template.h | ||
---|---|---|
20 | 20 |
*/ |
21 | 21 |
#define DATA_BITS (1 << (3 + SHIFT)) |
22 | 22 |
#define SHIFT_MASK (DATA_BITS - 1) |
23 |
#define SIGN_MASK (1 << (DATA_BITS - 1)) |
|
23 |
#define SIGN_MASK (((target_ulong)1) << (DATA_BITS - 1)) |
|
24 |
#if DATA_BITS <= 32 |
|
25 |
#define SHIFT1_MASK 0x1f |
|
26 |
#else |
|
27 |
#define SHIFT1_MASK 0x3f |
|
28 |
#endif |
|
24 | 29 |
|
25 | 30 |
#if DATA_BITS == 8 |
26 | 31 |
#define SUFFIX b |
... | ... | |
37 | 42 |
#define DATA_TYPE uint32_t |
38 | 43 |
#define DATA_STYPE int32_t |
39 | 44 |
#define DATA_MASK 0xffffffff |
45 |
#elif DATA_BITS == 64 |
|
46 |
#define SUFFIX q |
|
47 |
#define DATA_TYPE uint64_t |
|
48 |
#define DATA_STYPE int64_t |
|
49 |
#define DATA_MASK 0xffffffffffffffff |
|
40 | 50 |
#else |
41 | 51 |
#error unhandled operand size |
42 | 52 |
#endif |
... | ... | |
46 | 56 |
static int glue(compute_all_add, SUFFIX)(void) |
47 | 57 |
{ |
48 | 58 |
int cf, pf, af, zf, sf, of; |
49 |
int src1, src2;
|
|
59 |
target_long src1, src2;
|
|
50 | 60 |
src1 = CC_SRC; |
51 | 61 |
src2 = CC_DST - CC_SRC; |
52 | 62 |
cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1; |
... | ... | |
60 | 70 |
|
61 | 71 |
static int glue(compute_c_add, SUFFIX)(void) |
62 | 72 |
{ |
63 |
int src1, cf; |
|
73 |
int cf; |
|
74 |
target_long src1; |
|
64 | 75 |
src1 = CC_SRC; |
65 | 76 |
cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1; |
66 | 77 |
return cf; |
... | ... | |
69 | 80 |
static int glue(compute_all_adc, SUFFIX)(void) |
70 | 81 |
{ |
71 | 82 |
int cf, pf, af, zf, sf, of; |
72 |
int src1, src2;
|
|
83 |
target_long src1, src2;
|
|
73 | 84 |
src1 = CC_SRC; |
74 | 85 |
src2 = CC_DST - CC_SRC - 1; |
75 | 86 |
cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1; |
... | ... | |
83 | 94 |
|
84 | 95 |
static int glue(compute_c_adc, SUFFIX)(void) |
85 | 96 |
{ |
86 |
int src1, cf; |
|
97 |
int cf; |
|
98 |
target_long src1; |
|
87 | 99 |
src1 = CC_SRC; |
88 | 100 |
cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1; |
89 | 101 |
return cf; |
... | ... | |
92 | 104 |
static int glue(compute_all_sub, SUFFIX)(void) |
93 | 105 |
{ |
94 | 106 |
int cf, pf, af, zf, sf, of; |
95 |
int src1, src2;
|
|
107 |
target_long src1, src2;
|
|
96 | 108 |
src1 = CC_DST + CC_SRC; |
97 | 109 |
src2 = CC_SRC; |
98 | 110 |
cf = (DATA_TYPE)src1 < (DATA_TYPE)src2; |
... | ... | |
106 | 118 |
|
107 | 119 |
static int glue(compute_c_sub, SUFFIX)(void) |
108 | 120 |
{ |
109 |
int src1, src2, cf; |
|
121 |
int cf; |
|
122 |
target_long src1, src2; |
|
110 | 123 |
src1 = CC_DST + CC_SRC; |
111 | 124 |
src2 = CC_SRC; |
112 | 125 |
cf = (DATA_TYPE)src1 < (DATA_TYPE)src2; |
... | ... | |
116 | 129 |
static int glue(compute_all_sbb, SUFFIX)(void) |
117 | 130 |
{ |
118 | 131 |
int cf, pf, af, zf, sf, of; |
119 |
int src1, src2;
|
|
132 |
target_long src1, src2;
|
|
120 | 133 |
src1 = CC_DST + CC_SRC + 1; |
121 | 134 |
src2 = CC_SRC; |
122 | 135 |
cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2; |
... | ... | |
130 | 143 |
|
131 | 144 |
static int glue(compute_c_sbb, SUFFIX)(void) |
132 | 145 |
{ |
133 |
int src1, src2, cf; |
|
146 |
int cf; |
|
147 |
target_long src1, src2; |
|
134 | 148 |
src1 = CC_DST + CC_SRC + 1; |
135 | 149 |
src2 = CC_SRC; |
136 | 150 |
cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2; |
... | ... | |
157 | 171 |
static int glue(compute_all_inc, SUFFIX)(void) |
158 | 172 |
{ |
159 | 173 |
int cf, pf, af, zf, sf, of; |
160 |
int src1, src2;
|
|
174 |
target_long src1, src2;
|
|
161 | 175 |
src1 = CC_DST - 1; |
162 | 176 |
src2 = 1; |
163 | 177 |
cf = CC_SRC; |
... | ... | |
179 | 193 |
static int glue(compute_all_dec, SUFFIX)(void) |
180 | 194 |
{ |
181 | 195 |
int cf, pf, af, zf, sf, of; |
182 |
int src1, src2;
|
|
196 |
target_long src1, src2;
|
|
183 | 197 |
src1 = CC_DST + 1; |
184 | 198 |
src2 = 1; |
185 | 199 |
cf = CC_SRC; |
... | ... | |
187 | 201 |
af = (CC_DST ^ src1 ^ src2) & 0x10; |
188 | 202 |
zf = ((DATA_TYPE)CC_DST == 0) << 6; |
189 | 203 |
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; |
190 |
of = ((CC_DST & DATA_MASK) == ((uint32_t)SIGN_MASK - 1)) << 11;
|
|
204 |
of = ((CC_DST & DATA_MASK) == ((target_ulong)SIGN_MASK - 1)) << 11;
|
|
191 | 205 |
return cf | pf | af | zf | sf | of; |
192 | 206 |
} |
193 | 207 |
|
... | ... | |
256 | 270 |
|
257 | 271 |
void OPPROTO glue(op_jb_sub, SUFFIX)(void) |
258 | 272 |
{ |
259 |
int src1, src2;
|
|
273 |
target_long src1, src2;
|
|
260 | 274 |
src1 = CC_DST + CC_SRC; |
261 | 275 |
src2 = CC_SRC; |
262 | 276 |
|
263 | 277 |
if ((DATA_TYPE)src1 < (DATA_TYPE)src2) |
264 |
JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
265 |
else |
|
266 |
JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
278 |
GOTO_LABEL_PARAM(1); |
|
267 | 279 |
FORCE_RET(); |
268 | 280 |
} |
269 | 281 |
|
270 | 282 |
void OPPROTO glue(op_jz_sub, SUFFIX)(void) |
271 | 283 |
{ |
272 | 284 |
if ((DATA_TYPE)CC_DST == 0) |
273 |
JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
274 |
else |
|
275 |
JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
285 |
GOTO_LABEL_PARAM(1); |
|
286 |
FORCE_RET(); |
|
287 |
} |
|
288 |
|
|
289 |
void OPPROTO glue(op_jnz_sub, SUFFIX)(void) |
|
290 |
{ |
|
291 |
if ((DATA_TYPE)CC_DST != 0) |
|
292 |
GOTO_LABEL_PARAM(1); |
|
276 | 293 |
FORCE_RET(); |
277 | 294 |
} |
278 | 295 |
|
279 | 296 |
void OPPROTO glue(op_jbe_sub, SUFFIX)(void) |
280 | 297 |
{ |
281 |
int src1, src2;
|
|
298 |
target_long src1, src2;
|
|
282 | 299 |
src1 = CC_DST + CC_SRC; |
283 | 300 |
src2 = CC_SRC; |
284 | 301 |
|
285 | 302 |
if ((DATA_TYPE)src1 <= (DATA_TYPE)src2) |
286 |
JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
287 |
else |
|
288 |
JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
303 |
GOTO_LABEL_PARAM(1); |
|
289 | 304 |
FORCE_RET(); |
290 | 305 |
} |
291 | 306 |
|
292 | 307 |
void OPPROTO glue(op_js_sub, SUFFIX)(void) |
293 | 308 |
{ |
294 | 309 |
if (CC_DST & SIGN_MASK) |
295 |
JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
296 |
else |
|
297 |
JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
310 |
GOTO_LABEL_PARAM(1); |
|
298 | 311 |
FORCE_RET(); |
299 | 312 |
} |
300 | 313 |
|
301 | 314 |
void OPPROTO glue(op_jl_sub, SUFFIX)(void) |
302 | 315 |
{ |
303 |
int src1, src2;
|
|
316 |
target_long src1, src2;
|
|
304 | 317 |
src1 = CC_DST + CC_SRC; |
305 | 318 |
src2 = CC_SRC; |
306 | 319 |
|
307 | 320 |
if ((DATA_STYPE)src1 < (DATA_STYPE)src2) |
308 |
JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
309 |
else |
|
310 |
JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
321 |
GOTO_LABEL_PARAM(1); |
|
311 | 322 |
FORCE_RET(); |
312 | 323 |
} |
313 | 324 |
|
314 | 325 |
void OPPROTO glue(op_jle_sub, SUFFIX)(void) |
315 | 326 |
{ |
316 |
int src1, src2;
|
|
327 |
target_long src1, src2;
|
|
317 | 328 |
src1 = CC_DST + CC_SRC; |
318 | 329 |
src2 = CC_SRC; |
319 | 330 |
|
320 | 331 |
if ((DATA_STYPE)src1 <= (DATA_STYPE)src2) |
321 |
JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 0, PARAM2); |
|
322 |
else |
|
323 |
JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 1, PARAM3); |
|
332 |
GOTO_LABEL_PARAM(1); |
|
324 | 333 |
FORCE_RET(); |
325 | 334 |
} |
326 | 335 |
|
... | ... | |
330 | 339 |
|
331 | 340 |
void OPPROTO glue(op_loopnz, SUFFIX)(void) |
332 | 341 |
{ |
333 |
unsigned int tmp; |
|
334 | 342 |
int eflags; |
335 | 343 |
eflags = cc_table[CC_OP].compute_all(); |
336 |
tmp = (ECX - 1) & DATA_MASK; |
|
337 |
ECX = (ECX & ~DATA_MASK) | tmp; |
|
338 |
if (tmp != 0 && !(eflags & CC_Z)) |
|
339 |
EIP = PARAM1; |
|
340 |
else |
|
341 |
EIP = PARAM2; |
|
344 |
if ((DATA_TYPE)ECX != 0 && !(eflags & CC_Z)) |
|
345 |
GOTO_LABEL_PARAM(1); |
|
342 | 346 |
FORCE_RET(); |
343 | 347 |
} |
344 | 348 |
|
345 | 349 |
void OPPROTO glue(op_loopz, SUFFIX)(void) |
346 | 350 |
{ |
347 |
unsigned int tmp; |
|
348 | 351 |
int eflags; |
349 | 352 |
eflags = cc_table[CC_OP].compute_all(); |
350 |
tmp = (ECX - 1) & DATA_MASK; |
|
351 |
ECX = (ECX & ~DATA_MASK) | tmp; |
|
352 |
if (tmp != 0 && (eflags & CC_Z)) |
|
353 |
EIP = PARAM1; |
|
354 |
else |
|
355 |
EIP = PARAM2; |
|
353 |
if ((DATA_TYPE)ECX != 0 && (eflags & CC_Z)) |
|
354 |
GOTO_LABEL_PARAM(1); |
|
356 | 355 |
FORCE_RET(); |
357 | 356 |
} |
358 | 357 |
|
359 |
void OPPROTO glue(op_loop, SUFFIX)(void)
|
|
358 |
void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
|
|
360 | 359 |
{ |
361 |
unsigned int tmp; |
|
362 |
tmp = (ECX - 1) & DATA_MASK; |
|
363 |
ECX = (ECX & ~DATA_MASK) | tmp; |
|
364 |
if (tmp != 0) |
|
365 |
EIP = PARAM1; |
|
366 |
else |
|
367 |
EIP = PARAM2; |
|
360 |
if ((DATA_TYPE)ECX == 0) |
|
361 |
GOTO_LABEL_PARAM(1); |
|
368 | 362 |
FORCE_RET(); |
369 | 363 |
} |
370 | 364 |
|
371 |
void OPPROTO glue(op_jecxz, SUFFIX)(void)
|
|
365 |
void OPPROTO glue(op_jnz_ecx, SUFFIX)(void)
|
|
372 | 366 |
{ |
373 |
if ((DATA_TYPE)ECX == 0) |
|
374 |
EIP = PARAM1; |
|
375 |
else |
|
376 |
EIP = PARAM2; |
|
367 |
if ((DATA_TYPE)ECX != 0) |
|
368 |
GOTO_LABEL_PARAM(1); |
|
377 | 369 |
FORCE_RET(); |
378 | 370 |
} |
379 | 371 |
|
... | ... | |
383 | 375 |
|
384 | 376 |
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void) |
385 | 377 |
{ |
386 |
int src1, src2;
|
|
378 |
target_long src1, src2;
|
|
387 | 379 |
src1 = CC_DST + CC_SRC; |
388 | 380 |
src2 = CC_SRC; |
389 | 381 |
|
... | ... | |
397 | 389 |
|
398 | 390 |
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void) |
399 | 391 |
{ |
400 |
int src1, src2;
|
|
392 |
target_long src1, src2;
|
|
401 | 393 |
src1 = CC_DST + CC_SRC; |
402 | 394 |
src2 = CC_SRC; |
403 | 395 |
|
... | ... | |
411 | 403 |
|
412 | 404 |
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void) |
413 | 405 |
{ |
414 |
int src1, src2;
|
|
406 |
target_long src1, src2;
|
|
415 | 407 |
src1 = CC_DST + CC_SRC; |
416 | 408 |
src2 = CC_SRC; |
417 | 409 |
|
... | ... | |
420 | 412 |
|
421 | 413 |
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void) |
422 | 414 |
{ |
423 |
int src1, src2;
|
|
415 |
target_long src1, src2;
|
|
424 | 416 |
src1 = CC_DST + CC_SRC; |
425 | 417 |
src2 = CC_SRC; |
426 | 418 |
|
... | ... | |
432 | 424 |
void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void) |
433 | 425 |
{ |
434 | 426 |
int count; |
435 |
count = T1 & 0x1f;
|
|
427 |
count = T1 & SHIFT1_MASK;
|
|
436 | 428 |
T0 = T0 << count; |
437 | 429 |
FORCE_RET(); |
438 | 430 |
} |
... | ... | |
440 | 432 |
void OPPROTO glue(glue(op_shr, SUFFIX), _T0_T1)(void) |
441 | 433 |
{ |
442 | 434 |
int count; |
443 |
count = T1 & 0x1f;
|
|
435 |
count = T1 & SHIFT1_MASK;
|
|
444 | 436 |
T0 &= DATA_MASK; |
445 | 437 |
T0 = T0 >> count; |
446 | 438 |
FORCE_RET(); |
... | ... | |
448 | 440 |
|
449 | 441 |
void OPPROTO glue(glue(op_sar, SUFFIX), _T0_T1)(void) |
450 | 442 |
{ |
451 |
int count, src; |
|
452 |
count = T1 & 0x1f; |
|
443 |
int count; |
|
444 |
target_long src; |
|
445 |
|
|
446 |
count = T1 & SHIFT1_MASK; |
|
453 | 447 |
src = (DATA_STYPE)T0; |
454 | 448 |
T0 = src >> count; |
455 | 449 |
FORCE_RET(); |
... | ... | |
484 | 478 |
int count; |
485 | 479 |
count = T1 & SHIFT_MASK; |
486 | 480 |
T1 = T0 >> count; |
487 |
T0 |= (1 << count);
|
|
481 |
T0 |= (((target_long)1) << count);
|
|
488 | 482 |
} |
489 | 483 |
|
490 | 484 |
void OPPROTO glue(glue(op_btr, SUFFIX), _T0_T1_cc)(void) |
... | ... | |
492 | 486 |
int count; |
493 | 487 |
count = T1 & SHIFT_MASK; |
494 | 488 |
T1 = T0 >> count; |
495 |
T0 &= ~(1 << count);
|
|
489 |
T0 &= ~(((target_long)1) << count);
|
|
496 | 490 |
} |
497 | 491 |
|
498 | 492 |
void OPPROTO glue(glue(op_btc, SUFFIX), _T0_T1_cc)(void) |
... | ... | |
500 | 494 |
int count; |
501 | 495 |
count = T1 & SHIFT_MASK; |
502 | 496 |
T1 = T0 >> count; |
503 |
T0 ^= (1 << count); |
|
497 |
T0 ^= (((target_long)1) << count); |
|
498 |
} |
|
499 |
|
|
500 |
void OPPROTO glue(glue(op_add_bit, SUFFIX), _A0_T1)(void) |
|
501 |
{ |
|
502 |
A0 += ((DATA_STYPE)T1 >> (3 + SHIFT)) << SHIFT; |
|
504 | 503 |
} |
505 | 504 |
|
506 | 505 |
void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void) |
507 | 506 |
{ |
508 |
int res, count; |
|
507 |
int count; |
|
508 |
target_long res; |
|
509 |
|
|
509 | 510 |
res = T0 & DATA_MASK; |
510 | 511 |
if (res != 0) { |
511 | 512 |
count = 0; |
... | ... | |
523 | 524 |
|
524 | 525 |
void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void) |
525 | 526 |
{ |
526 |
int res, count; |
|
527 |
int count; |
|
528 |
target_long res; |
|
529 |
|
|
527 | 530 |
res = T0 & DATA_MASK; |
528 | 531 |
if (res != 0) { |
529 | 532 |
count = DATA_BITS - 1; |
... | ... | |
555 | 558 |
T0 = DF << SHIFT; |
556 | 559 |
} |
557 | 560 |
|
558 |
void OPPROTO glue(op_string_jz_sub, SUFFIX)(void) |
|
559 |
{ |
|
560 |
if ((DATA_TYPE)CC_DST == 0) |
|
561 |
JUMP_TB2(glue(op_string_jz_sub, SUFFIX), PARAM1, 3); |
|
562 |
FORCE_RET(); |
|
563 |
} |
|
564 |
|
|
565 |
void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void) |
|
566 |
{ |
|
567 |
if ((DATA_TYPE)CC_DST != 0) |
|
568 |
JUMP_TB2(glue(op_string_jnz_sub, SUFFIX), PARAM1, 3); |
|
569 |
FORCE_RET(); |
|
570 |
} |
|
571 |
|
|
572 |
void OPPROTO glue(glue(op_string_jz_sub, SUFFIX), _im)(void) |
|
573 |
{ |
|
574 |
if ((DATA_TYPE)CC_DST == 0) { |
|
575 |
EIP = PARAM1; |
|
576 |
if (env->eflags & TF_MASK) { |
|
577 |
raise_exception(EXCP01_SSTP); |
|
578 |
} |
|
579 |
T0 = 0; |
|
580 |
EXIT_TB(); |
|
581 |
} |
|
582 |
FORCE_RET(); |
|
583 |
} |
|
584 |
|
|
585 |
void OPPROTO glue(glue(op_string_jnz_sub, SUFFIX), _im)(void) |
|
586 |
{ |
|
587 |
if ((DATA_TYPE)CC_DST != 0) { |
|
588 |
EIP = PARAM1; |
|
589 |
if (env->eflags & TF_MASK) { |
|
590 |
raise_exception(EXCP01_SSTP); |
|
591 |
} |
|
592 |
T0 = 0; |
|
593 |
EXIT_TB(); |
|
594 |
} |
|
595 |
FORCE_RET(); |
|
596 |
} |
|
597 |
|
|
598 |
#if DATA_BITS >= 16 |
|
599 |
void OPPROTO glue(op_jz_ecx, SUFFIX)(void) |
|
600 |
{ |
|
601 |
if ((DATA_TYPE)ECX == 0) |
|
602 |
JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2); |
|
603 |
FORCE_RET(); |
|
604 |
} |
|
605 |
|
|
606 |
void OPPROTO glue(glue(op_jz_ecx, SUFFIX), _im)(void) |
|
607 |
{ |
|
608 |
if ((DATA_TYPE)ECX == 0) { |
|
609 |
EIP = PARAM1; |
|
610 |
if (env->eflags & TF_MASK) { |
|
611 |
raise_exception(EXCP01_SSTP); |
|
612 |
} |
|
613 |
T0 = 0; |
|
614 |
EXIT_TB(); |
|
615 |
} |
|
616 |
FORCE_RET(); |
|
617 |
} |
|
618 |
#endif |
|
619 |
|
|
620 | 561 |
/* port I/O */ |
621 |
|
|
562 |
#if DATA_BITS <= 32 |
|
622 | 563 |
void OPPROTO glue(glue(op_out, SUFFIX), _T0_T1)(void) |
623 | 564 |
{ |
624 | 565 |
glue(cpu_out, SUFFIX)(env, T0, T1 & DATA_MASK); |
... | ... | |
648 | 589 |
{ |
649 | 590 |
glue(glue(check_io, SUFFIX), _DX)(); |
650 | 591 |
} |
592 |
#endif |
|
651 | 593 |
|
652 | 594 |
#undef DATA_BITS |
653 | 595 |
#undef SHIFT_MASK |
596 |
#undef SHIFT1_MASK |
|
654 | 597 |
#undef SIGN_MASK |
655 | 598 |
#undef DATA_TYPE |
656 | 599 |
#undef DATA_STYPE |
Also available in: Unified diff