Revision 4f31916f target-i386/translate.c
b/target-i386/translate.c | ||
---|---|---|
380 | 380 |
NULL, |
381 | 381 |
}; |
382 | 382 |
|
383 |
static GenOpFunc *gen_op_arithc_T0_T1_cc[3][2] = {
|
|
384 |
[OT_BYTE] = {
|
|
385 |
gen_op_adcb_T0_T1_cc,
|
|
386 |
gen_op_sbbb_T0_T1_cc,
|
|
387 |
}, |
|
388 |
[OT_WORD] = {
|
|
389 |
gen_op_adcw_T0_T1_cc,
|
|
390 |
gen_op_sbbw_T0_T1_cc,
|
|
391 |
}, |
|
392 |
[OT_LONG] = {
|
|
393 |
gen_op_adcl_T0_T1_cc,
|
|
394 |
gen_op_sbbl_T0_T1_cc,
|
|
383 |
#define DEF_ARITHC(SUFFIX)\
|
|
384 |
{\
|
|
385 |
gen_op_adcb ## SUFFIX ## _T0_T1_cc,\
|
|
386 |
gen_op_sbbb ## SUFFIX ## _T0_T1_cc,\
|
|
387 |
},\
|
|
388 |
{\
|
|
389 |
gen_op_adcw ## SUFFIX ## _T0_T1_cc,\
|
|
390 |
gen_op_sbbw ## SUFFIX ## _T0_T1_cc,\
|
|
391 |
},\
|
|
392 |
{\
|
|
393 |
gen_op_adcl ## SUFFIX ## _T0_T1_cc,\
|
|
394 |
gen_op_sbbl ## SUFFIX ## _T0_T1_cc,\
|
|
395 | 395 |
}, |
396 |
|
|
397 |
static GenOpFunc *gen_op_arithc_T0_T1_cc[3][2] = { |
|
398 |
DEF_ARITHC() |
|
396 | 399 |
}; |
397 | 400 |
|
398 |
static GenOpFunc *gen_op_arithc_mem_T0_T1_cc[3][2] = { |
|
399 |
[OT_BYTE] = { |
|
400 |
gen_op_adcb_mem_T0_T1_cc, |
|
401 |
gen_op_sbbb_mem_T0_T1_cc, |
|
402 |
}, |
|
403 |
[OT_WORD] = { |
|
404 |
gen_op_adcw_mem_T0_T1_cc, |
|
405 |
gen_op_sbbw_mem_T0_T1_cc, |
|
406 |
}, |
|
407 |
[OT_LONG] = { |
|
408 |
gen_op_adcl_mem_T0_T1_cc, |
|
409 |
gen_op_sbbl_mem_T0_T1_cc, |
|
410 |
}, |
|
401 |
static GenOpFunc *gen_op_arithc_mem_T0_T1_cc[9][2] = { |
|
402 |
DEF_ARITHC(_raw) |
|
403 |
#ifndef CONFIG_USER_ONLY |
|
404 |
DEF_ARITHC(_kernel) |
|
405 |
DEF_ARITHC(_user) |
|
406 |
#endif |
|
411 | 407 |
}; |
412 | 408 |
|
413 | 409 |
static const int cc_op_arithb[8] = { |
... | ... | |
421 | 417 |
CC_OP_SUBB, |
422 | 418 |
}; |
423 | 419 |
|
420 |
#define DEF_CMPXCHG(SUFFIX)\ |
|
421 |
gen_op_cmpxchgb ## SUFFIX ## _T0_T1_EAX_cc,\ |
|
422 |
gen_op_cmpxchgw ## SUFFIX ## _T0_T1_EAX_cc,\ |
|
423 |
gen_op_cmpxchgl ## SUFFIX ## _T0_T1_EAX_cc, |
|
424 |
|
|
425 |
|
|
424 | 426 |
static GenOpFunc *gen_op_cmpxchg_T0_T1_EAX_cc[3] = { |
425 |
gen_op_cmpxchgb_T0_T1_EAX_cc, |
|
426 |
gen_op_cmpxchgw_T0_T1_EAX_cc, |
|
427 |
gen_op_cmpxchgl_T0_T1_EAX_cc, |
|
427 |
DEF_CMPXCHG() |
|
428 | 428 |
}; |
429 | 429 |
|
430 |
static GenOpFunc *gen_op_cmpxchg_mem_T0_T1_EAX_cc[3] = { |
|
431 |
gen_op_cmpxchgb_mem_T0_T1_EAX_cc, |
|
432 |
gen_op_cmpxchgw_mem_T0_T1_EAX_cc, |
|
433 |
gen_op_cmpxchgl_mem_T0_T1_EAX_cc, |
|
430 |
static GenOpFunc *gen_op_cmpxchg_mem_T0_T1_EAX_cc[9] = { |
|
431 |
DEF_CMPXCHG(_raw) |
|
432 |
#ifndef CONFIG_USER_ONLY |
|
433 |
DEF_CMPXCHG(_kernel) |
|
434 |
DEF_CMPXCHG(_user) |
|
435 |
#endif |
|
434 | 436 |
}; |
435 | 437 |
|
436 |
static GenOpFunc *gen_op_shift_T0_T1_cc[3][8] = {
|
|
437 |
[OT_BYTE] = {
|
|
438 |
gen_op_rolb_T0_T1_cc,
|
|
439 |
gen_op_rorb_T0_T1_cc,
|
|
440 |
gen_op_rclb_T0_T1_cc,
|
|
441 |
gen_op_rcrb_T0_T1_cc,
|
|
442 |
gen_op_shlb_T0_T1_cc,
|
|
443 |
gen_op_shrb_T0_T1_cc,
|
|
444 |
gen_op_shlb_T0_T1_cc,
|
|
445 |
gen_op_sarb_T0_T1_cc,
|
|
446 |
}, |
|
447 |
[OT_WORD] = {
|
|
448 |
gen_op_rolw_T0_T1_cc,
|
|
449 |
gen_op_rorw_T0_T1_cc,
|
|
450 |
gen_op_rclw_T0_T1_cc,
|
|
451 |
gen_op_rcrw_T0_T1_cc,
|
|
452 |
gen_op_shlw_T0_T1_cc,
|
|
453 |
gen_op_shrw_T0_T1_cc,
|
|
454 |
gen_op_shlw_T0_T1_cc,
|
|
455 |
gen_op_sarw_T0_T1_cc,
|
|
456 |
}, |
|
457 |
[OT_LONG] = {
|
|
458 |
gen_op_roll_T0_T1_cc,
|
|
459 |
gen_op_rorl_T0_T1_cc,
|
|
460 |
gen_op_rcll_T0_T1_cc,
|
|
461 |
gen_op_rcrl_T0_T1_cc,
|
|
462 |
gen_op_shll_T0_T1_cc,
|
|
463 |
gen_op_shrl_T0_T1_cc,
|
|
464 |
gen_op_shll_T0_T1_cc,
|
|
465 |
gen_op_sarl_T0_T1_cc,
|
|
438 |
#define DEF_SHIFT(SUFFIX)\
|
|
439 |
{\
|
|
440 |
gen_op_rolb ## SUFFIX ## _T0_T1_cc,\
|
|
441 |
gen_op_rorb ## SUFFIX ## _T0_T1_cc,\
|
|
442 |
gen_op_rclb ## SUFFIX ## _T0_T1_cc,\
|
|
443 |
gen_op_rcrb ## SUFFIX ## _T0_T1_cc,\
|
|
444 |
gen_op_shlb ## SUFFIX ## _T0_T1_cc,\
|
|
445 |
gen_op_shrb ## SUFFIX ## _T0_T1_cc,\
|
|
446 |
gen_op_shlb ## SUFFIX ## _T0_T1_cc,\
|
|
447 |
gen_op_sarb ## SUFFIX ## _T0_T1_cc,\
|
|
448 |
},\
|
|
449 |
{\
|
|
450 |
gen_op_rolw ## SUFFIX ## _T0_T1_cc,\
|
|
451 |
gen_op_rorw ## SUFFIX ## _T0_T1_cc,\
|
|
452 |
gen_op_rclw ## SUFFIX ## _T0_T1_cc,\
|
|
453 |
gen_op_rcrw ## SUFFIX ## _T0_T1_cc,\
|
|
454 |
gen_op_shlw ## SUFFIX ## _T0_T1_cc,\
|
|
455 |
gen_op_shrw ## SUFFIX ## _T0_T1_cc,\
|
|
456 |
gen_op_shlw ## SUFFIX ## _T0_T1_cc,\
|
|
457 |
gen_op_sarw ## SUFFIX ## _T0_T1_cc,\
|
|
458 |
},\
|
|
459 |
{\
|
|
460 |
gen_op_roll ## SUFFIX ## _T0_T1_cc,\
|
|
461 |
gen_op_rorl ## SUFFIX ## _T0_T1_cc,\
|
|
462 |
gen_op_rcll ## SUFFIX ## _T0_T1_cc,\
|
|
463 |
gen_op_rcrl ## SUFFIX ## _T0_T1_cc,\
|
|
464 |
gen_op_shll ## SUFFIX ## _T0_T1_cc,\
|
|
465 |
gen_op_shrl ## SUFFIX ## _T0_T1_cc,\
|
|
466 |
gen_op_shll ## SUFFIX ## _T0_T1_cc,\
|
|
467 |
gen_op_sarl ## SUFFIX ## _T0_T1_cc,\
|
|
466 | 468 |
}, |
469 |
|
|
470 |
static GenOpFunc *gen_op_shift_T0_T1_cc[3][8] = { |
|
471 |
DEF_SHIFT() |
|
467 | 472 |
}; |
468 | 473 |
|
469 |
static GenOpFunc *gen_op_shift_mem_T0_T1_cc[3][8] = { |
|
470 |
[OT_BYTE] = { |
|
471 |
gen_op_rolb_mem_T0_T1_cc, |
|
472 |
gen_op_rorb_mem_T0_T1_cc, |
|
473 |
gen_op_rclb_mem_T0_T1_cc, |
|
474 |
gen_op_rcrb_mem_T0_T1_cc, |
|
475 |
gen_op_shlb_mem_T0_T1_cc, |
|
476 |
gen_op_shrb_mem_T0_T1_cc, |
|
477 |
gen_op_shlb_mem_T0_T1_cc, |
|
478 |
gen_op_sarb_mem_T0_T1_cc, |
|
479 |
}, |
|
480 |
[OT_WORD] = { |
|
481 |
gen_op_rolw_mem_T0_T1_cc, |
|
482 |
gen_op_rorw_mem_T0_T1_cc, |
|
483 |
gen_op_rclw_mem_T0_T1_cc, |
|
484 |
gen_op_rcrw_mem_T0_T1_cc, |
|
485 |
gen_op_shlw_mem_T0_T1_cc, |
|
486 |
gen_op_shrw_mem_T0_T1_cc, |
|
487 |
gen_op_shlw_mem_T0_T1_cc, |
|
488 |
gen_op_sarw_mem_T0_T1_cc, |
|
489 |
}, |
|
490 |
[OT_LONG] = { |
|
491 |
gen_op_roll_mem_T0_T1_cc, |
|
492 |
gen_op_rorl_mem_T0_T1_cc, |
|
493 |
gen_op_rcll_mem_T0_T1_cc, |
|
494 |
gen_op_rcrl_mem_T0_T1_cc, |
|
495 |
gen_op_shll_mem_T0_T1_cc, |
|
496 |
gen_op_shrl_mem_T0_T1_cc, |
|
497 |
gen_op_shll_mem_T0_T1_cc, |
|
498 |
gen_op_sarl_mem_T0_T1_cc, |
|
499 |
}, |
|
474 |
static GenOpFunc *gen_op_shift_mem_T0_T1_cc[9][8] = { |
|
475 |
DEF_SHIFT(_raw) |
|
476 |
#ifndef CONFIG_USER_ONLY |
|
477 |
DEF_SHIFT(_kernel) |
|
478 |
DEF_SHIFT(_user) |
|
479 |
#endif |
|
500 | 480 |
}; |
501 | 481 |
|
502 |
static GenOpFunc1 *gen_op_shiftd_T0_T1_im_cc[2][2] = { |
|
503 |
[0] = { |
|
504 |
gen_op_shldw_T0_T1_im_cc, |
|
505 |
gen_op_shrdw_T0_T1_im_cc, |
|
506 |
}, |
|
507 |
[1] = { |
|
508 |
gen_op_shldl_T0_T1_im_cc, |
|
509 |
gen_op_shrdl_T0_T1_im_cc, |
|
482 |
#define DEF_SHIFTD(SUFFIX, op)\ |
|
483 |
{\ |
|
484 |
NULL,\ |
|
485 |
NULL,\ |
|
486 |
},\ |
|
487 |
{\ |
|
488 |
gen_op_shldw ## SUFFIX ## _T0_T1_ ## op ## _cc,\ |
|
489 |
gen_op_shrdw ## SUFFIX ## _T0_T1_ ## op ## _cc,\ |
|
490 |
},\ |
|
491 |
{\ |
|
492 |
gen_op_shldl ## SUFFIX ## _T0_T1_ ## op ## _cc,\ |
|
493 |
gen_op_shrdl ## SUFFIX ## _T0_T1_ ## op ## _cc,\ |
|
510 | 494 |
}, |
495 |
|
|
496 |
|
|
497 |
static GenOpFunc1 *gen_op_shiftd_T0_T1_im_cc[3][2] = { |
|
498 |
DEF_SHIFTD(, im) |
|
511 | 499 |
}; |
512 | 500 |
|
513 |
static GenOpFunc *gen_op_shiftd_T0_T1_ECX_cc[2][2] = { |
|
514 |
[0] = { |
|
515 |
gen_op_shldw_T0_T1_ECX_cc, |
|
516 |
gen_op_shrdw_T0_T1_ECX_cc, |
|
517 |
}, |
|
518 |
[1] = { |
|
519 |
gen_op_shldl_T0_T1_ECX_cc, |
|
520 |
gen_op_shrdl_T0_T1_ECX_cc, |
|
521 |
}, |
|
501 |
static GenOpFunc *gen_op_shiftd_T0_T1_ECX_cc[3][2] = { |
|
502 |
DEF_SHIFTD(, ECX) |
|
522 | 503 |
}; |
523 | 504 |
|
524 |
static GenOpFunc1 *gen_op_shiftd_mem_T0_T1_im_cc[2][2] = { |
|
525 |
[0] = { |
|
526 |
gen_op_shldw_mem_T0_T1_im_cc, |
|
527 |
gen_op_shrdw_mem_T0_T1_im_cc, |
|
528 |
}, |
|
529 |
[1] = { |
|
530 |
gen_op_shldl_mem_T0_T1_im_cc, |
|
531 |
gen_op_shrdl_mem_T0_T1_im_cc, |
|
532 |
}, |
|
505 |
static GenOpFunc1 *gen_op_shiftd_mem_T0_T1_im_cc[9][2] = { |
|
506 |
DEF_SHIFTD(_raw, im) |
|
507 |
#ifndef CONFIG_USER_ONLY |
|
508 |
DEF_SHIFTD(_kernel, im) |
|
509 |
DEF_SHIFTD(_user, im) |
|
510 |
#endif |
|
533 | 511 |
}; |
534 | 512 |
|
535 |
static GenOpFunc *gen_op_shiftd_mem_T0_T1_ECX_cc[2][2] = { |
|
536 |
[0] = { |
|
537 |
gen_op_shldw_mem_T0_T1_ECX_cc, |
|
538 |
gen_op_shrdw_mem_T0_T1_ECX_cc, |
|
539 |
}, |
|
540 |
[1] = { |
|
541 |
gen_op_shldl_mem_T0_T1_ECX_cc, |
|
542 |
gen_op_shrdl_mem_T0_T1_ECX_cc, |
|
543 |
}, |
|
513 |
static GenOpFunc *gen_op_shiftd_mem_T0_T1_ECX_cc[9][2] = { |
|
514 |
DEF_SHIFTD(_raw, ECX) |
|
515 |
#ifndef CONFIG_USER_ONLY |
|
516 |
DEF_SHIFTD(_kernel, ECX) |
|
517 |
DEF_SHIFTD(_user, ECX) |
|
518 |
#endif |
|
544 | 519 |
}; |
545 | 520 |
|
546 | 521 |
static GenOpFunc *gen_op_btx_T0_T1_cc[2][4] = { |
... | ... | |
649 | 624 |
#endif |
650 | 625 |
}; |
651 | 626 |
|
627 |
static GenOpFunc *gen_op_st_T1_A0[3 * 3] = { |
|
628 |
NULL, |
|
629 |
gen_op_stw_raw_T1_A0, |
|
630 |
gen_op_stl_raw_T1_A0, |
|
631 |
|
|
632 |
#ifndef CONFIG_USER_ONLY |
|
633 |
NULL, |
|
634 |
gen_op_stw_kernel_T1_A0, |
|
635 |
gen_op_stl_kernel_T1_A0, |
|
636 |
|
|
637 |
NULL, |
|
638 |
gen_op_stw_user_T1_A0, |
|
639 |
gen_op_stl_user_T1_A0, |
|
640 |
#endif |
|
641 |
}; |
|
642 |
|
|
652 | 643 |
static inline void gen_string_movl_A0_ESI(DisasContext *s) |
653 | 644 |
{ |
654 | 645 |
int override; |
... | ... | |
1093 | 1084 |
gen_op_arithc_T0_T1_cc[ot][op - OP_ADCL](); |
1094 | 1085 |
gen_op_mov_reg_T0[ot][d](); |
1095 | 1086 |
} else { |
1096 |
gen_op_arithc_mem_T0_T1_cc[ot][op - OP_ADCL](); |
|
1087 |
gen_op_arithc_mem_T0_T1_cc[ot + s1->mem_index][op - OP_ADCL]();
|
|
1097 | 1088 |
} |
1098 | 1089 |
s1->cc_op = CC_OP_DYNAMIC; |
1099 | 1090 |
goto the_end; |
... | ... | |
1172 | 1163 |
if (d != OR_TMP0) |
1173 | 1164 |
gen_op_shift_T0_T1_cc[ot][op](); |
1174 | 1165 |
else |
1175 |
gen_op_shift_mem_T0_T1_cc[ot][op](); |
|
1166 |
gen_op_shift_mem_T0_T1_cc[ot + s1->mem_index][op]();
|
|
1176 | 1167 |
if (d != OR_TMP0) |
1177 | 1168 |
gen_op_mov_reg_T0[ot][d](); |
1178 | 1169 |
s1->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ |
... | ... | |
1555 | 1546 |
s->is_jmp = 3; |
1556 | 1547 |
} |
1557 | 1548 |
|
1549 |
static inline void gen_stack_update(DisasContext *s, int addend) |
|
1550 |
{ |
|
1551 |
if (s->ss32) { |
|
1552 |
if (addend == 2) |
|
1553 |
gen_op_addl_ESP_2(); |
|
1554 |
else if (addend == 4) |
|
1555 |
gen_op_addl_ESP_4(); |
|
1556 |
else |
|
1557 |
gen_op_addl_ESP_im(addend); |
|
1558 |
} else { |
|
1559 |
if (addend == 2) |
|
1560 |
gen_op_addw_ESP_2(); |
|
1561 |
else if (addend == 4) |
|
1562 |
gen_op_addw_ESP_4(); |
|
1563 |
else |
|
1564 |
gen_op_addw_ESP_im(addend); |
|
1565 |
} |
|
1566 |
} |
|
1567 |
|
|
1558 | 1568 |
/* generate a push. It depends on ss32, addseg and dflag */ |
1559 | 1569 |
static void gen_push_T0(DisasContext *s) |
1560 | 1570 |
{ |
1571 |
gen_op_movl_A0_reg[R_ESP](); |
|
1572 |
if (!s->dflag) |
|
1573 |
gen_op_subl_A0_2(); |
|
1574 |
else |
|
1575 |
gen_op_subl_A0_4(); |
|
1561 | 1576 |
if (s->ss32) { |
1562 |
if (!s->addseg) { |
|
1563 |
if (s->dflag) |
|
1564 |
gen_op_pushl_T0(); |
|
1565 |
else |
|
1566 |
gen_op_pushw_T0(); |
|
1567 |
} else { |
|
1568 |
if (s->dflag) |
|
1569 |
gen_op_pushl_ss32_T0(); |
|
1570 |
else |
|
1571 |
gen_op_pushw_ss32_T0(); |
|
1577 |
if (s->addseg) { |
|
1578 |
gen_op_movl_T1_A0(); |
|
1579 |
gen_op_addl_A0_SS(); |
|
1572 | 1580 |
} |
1573 | 1581 |
} else { |
1574 |
if (s->dflag) |
|
1575 |
gen_op_pushl_ss16_T0(); |
|
1576 |
else |
|
1577 |
gen_op_pushw_ss16_T0(); |
|
1582 |
gen_op_andl_A0_ffff(); |
|
1583 |
gen_op_movl_T1_A0(); |
|
1584 |
gen_op_addl_A0_SS(); |
|
1578 | 1585 |
} |
1586 |
gen_op_st_T0_A0[s->dflag + 1 + s->mem_index](); |
|
1587 |
if (s->ss32 && !s->addseg) |
|
1588 |
gen_op_movl_ESP_A0(); |
|
1589 |
else |
|
1590 |
gen_op_mov_reg_T1[s->ss32 + 1][R_ESP](); |
|
1579 | 1591 |
} |
1580 | 1592 |
|
1581 |
/* two step pop is necessary for precise exceptions */ |
|
1582 |
static void gen_pop_T0(DisasContext *s) |
|
1593 |
/* generate a push. It depends on ss32, addseg and dflag */ |
|
1594 |
/* slower version for T1, only used for call Ev */ |
|
1595 |
static void gen_push_T1(DisasContext *s) |
|
1583 | 1596 |
{ |
1597 |
gen_op_movl_A0_reg[R_ESP](); |
|
1598 |
if (!s->dflag) |
|
1599 |
gen_op_subl_A0_2(); |
|
1600 |
else |
|
1601 |
gen_op_subl_A0_4(); |
|
1584 | 1602 |
if (s->ss32) { |
1585 |
if (!s->addseg) { |
|
1586 |
if (s->dflag) |
|
1587 |
gen_op_popl_T0(); |
|
1588 |
else |
|
1589 |
gen_op_popw_T0(); |
|
1590 |
} else { |
|
1591 |
if (s->dflag) |
|
1592 |
gen_op_popl_ss32_T0(); |
|
1593 |
else |
|
1594 |
gen_op_popw_ss32_T0(); |
|
1603 |
if (s->addseg) { |
|
1604 |
gen_op_addl_A0_SS(); |
|
1595 | 1605 |
} |
1596 | 1606 |
} else { |
1597 |
if (s->dflag) |
|
1598 |
gen_op_popl_ss16_T0(); |
|
1599 |
else |
|
1600 |
gen_op_popw_ss16_T0(); |
|
1607 |
gen_op_andl_A0_ffff(); |
|
1608 |
gen_op_addl_A0_SS(); |
|
1601 | 1609 |
} |
1610 |
gen_op_st_T1_A0[s->dflag + 1 + s->mem_index](); |
|
1611 |
|
|
1612 |
if (s->ss32 && !s->addseg) |
|
1613 |
gen_op_movl_ESP_A0(); |
|
1614 |
else |
|
1615 |
gen_stack_update(s, (-2) << s->dflag); |
|
1602 | 1616 |
} |
1603 | 1617 |
|
1604 |
static inline void gen_stack_update(DisasContext *s, int addend) |
|
1618 |
/* two step pop is necessary for precise exceptions */ |
|
1619 |
static void gen_pop_T0(DisasContext *s) |
|
1605 | 1620 |
{ |
1621 |
gen_op_movl_A0_reg[R_ESP](); |
|
1606 | 1622 |
if (s->ss32) { |
1607 |
if (addend == 2) |
|
1608 |
gen_op_addl_ESP_2(); |
|
1609 |
else if (addend == 4) |
|
1610 |
gen_op_addl_ESP_4(); |
|
1611 |
else |
|
1612 |
gen_op_addl_ESP_im(addend); |
|
1623 |
if (s->addseg) |
|
1624 |
gen_op_addl_A0_SS(); |
|
1613 | 1625 |
} else { |
1614 |
if (addend == 2) |
|
1615 |
gen_op_addw_ESP_2(); |
|
1616 |
else if (addend == 4) |
|
1617 |
gen_op_addw_ESP_4(); |
|
1618 |
else |
|
1619 |
gen_op_addw_ESP_im(addend); |
|
1626 |
gen_op_andl_A0_ffff(); |
|
1627 |
gen_op_addl_A0_SS(); |
|
1620 | 1628 |
} |
1629 |
gen_op_ld_T0_A0[s->dflag + 1 + s->mem_index](); |
|
1621 | 1630 |
} |
1622 | 1631 |
|
1623 | 1632 |
static void gen_pop_update(DisasContext *s) |
... | ... | |
1704 | 1713 |
gen_op_st_T0_A0[ot + s->mem_index](); |
1705 | 1714 |
} |
1706 | 1715 |
gen_op_addl_A0_im(-opsize); |
1707 |
/* XXX: add st_T1_A0 ? */ |
|
1708 |
gen_op_movl_T0_T1(); |
|
1709 |
gen_op_st_T0_A0[ot + s->mem_index](); |
|
1716 |
gen_op_st_T1_A0[ot + s->mem_index](); |
|
1710 | 1717 |
} |
1711 | 1718 |
gen_op_mov_reg_T1[ot][R_EBP](); |
1712 | 1719 |
addend = -esp_addend; |
... | ... | |
2122 | 2129 |
gen_inc(s, ot, opreg, -1); |
2123 | 2130 |
break; |
2124 | 2131 |
case 2: /* call Ev */ |
2125 |
/* XXX: optimize if memory (no and is necessary) */
|
|
2132 |
/* XXX: optimize if memory (no 'and' is necessary) */
|
|
2126 | 2133 |
if (s->dflag == 0) |
2127 | 2134 |
gen_op_andl_T0_ffff(); |
2128 |
gen_op_jmp_T0(); |
|
2129 | 2135 |
next_eip = s->pc - s->cs_base; |
2130 |
gen_op_movl_T0_im(next_eip); |
|
2131 |
gen_push_T0(s); |
|
2136 |
gen_op_movl_T1_im(next_eip); |
|
2137 |
gen_push_T1(s); |
|
2138 |
gen_op_jmp_T0(); |
|
2132 | 2139 |
gen_eob(s); |
2133 | 2140 |
break; |
2134 | 2141 |
case 3: /* lcall Ev */ |
... | ... | |
2291 | 2298 |
} else { |
2292 | 2299 |
gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
2293 | 2300 |
gen_op_ld_T0_A0[ot + s->mem_index](); |
2294 |
gen_op_cmpxchg_mem_T0_T1_EAX_cc[ot](); |
|
2301 |
gen_op_cmpxchg_mem_T0_T1_EAX_cc[ot + s->mem_index]();
|
|
2295 | 2302 |
} |
2296 | 2303 |
s->cc_op = CC_OP_SUBB + ot; |
2297 | 2304 |
break; |
... | ... | |
2776 | 2783 |
val &= 0x1f; |
2777 | 2784 |
if (val) { |
2778 | 2785 |
if (mod == 3) |
2779 |
gen_op_shiftd_T0_T1_im_cc[ot - OT_WORD][op](val);
|
|
2786 |
gen_op_shiftd_T0_T1_im_cc[ot][op](val); |
|
2780 | 2787 |
else |
2781 |
gen_op_shiftd_mem_T0_T1_im_cc[ot - OT_WORD][op](val);
|
|
2788 |
gen_op_shiftd_mem_T0_T1_im_cc[ot + s->mem_index][op](val);
|
|
2782 | 2789 |
if (op == 0 && ot != OT_WORD) |
2783 | 2790 |
s->cc_op = CC_OP_SHLB + ot; |
2784 | 2791 |
else |
... | ... | |
2788 | 2795 |
if (s->cc_op != CC_OP_DYNAMIC) |
2789 | 2796 |
gen_op_set_cc_op(s->cc_op); |
2790 | 2797 |
if (mod == 3) |
2791 |
gen_op_shiftd_T0_T1_ECX_cc[ot - OT_WORD][op]();
|
|
2798 |
gen_op_shiftd_T0_T1_ECX_cc[ot][op](); |
|
2792 | 2799 |
else |
2793 |
gen_op_shiftd_mem_T0_T1_ECX_cc[ot - OT_WORD][op]();
|
|
2800 |
gen_op_shiftd_mem_T0_T1_ECX_cc[ot + s->mem_index][op]();
|
|
2794 | 2801 |
s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ |
2795 | 2802 |
} |
2796 | 2803 |
if (mod == 3) { |
... | ... | |
3347 | 3354 |
else |
3348 | 3355 |
ot = dflag ? OT_LONG : OT_WORD; |
3349 | 3356 |
gen_op_mov_TN_reg[OT_WORD][0][R_EDX](); |
3357 |
gen_op_andl_T0_ffff(); |
|
3350 | 3358 |
gen_check_io(s, ot, 0, pc_start - s->cs_base); |
3351 | 3359 |
gen_op_in[ot](); |
3352 | 3360 |
gen_op_mov_reg_T1[ot][R_EAX](); |
... | ... | |
3358 | 3366 |
else |
3359 | 3367 |
ot = dflag ? OT_LONG : OT_WORD; |
3360 | 3368 |
gen_op_mov_TN_reg[OT_WORD][0][R_EDX](); |
3369 |
gen_op_andl_T0_ffff(); |
|
3361 | 3370 |
gen_check_io(s, ot, 0, pc_start - s->cs_base); |
3362 | 3371 |
gen_op_mov_TN_reg[ot][1][R_EAX](); |
3363 | 3372 |
gen_op_out[ot](); |
... | ... | |
4148 | 4157 |
[INDEX_op_das] = CC_A | CC_C, |
4149 | 4158 |
[INDEX_op_daa] = CC_A | CC_C, |
4150 | 4159 |
|
4151 |
[INDEX_op_adcb_T0_T1_cc] = CC_C, |
|
4152 |
[INDEX_op_adcw_T0_T1_cc] = CC_C, |
|
4153 |
[INDEX_op_adcl_T0_T1_cc] = CC_C, |
|
4154 |
[INDEX_op_sbbb_T0_T1_cc] = CC_C, |
|
4155 |
[INDEX_op_sbbw_T0_T1_cc] = CC_C, |
|
4156 |
[INDEX_op_sbbl_T0_T1_cc] = CC_C, |
|
4157 |
|
|
4158 |
[INDEX_op_adcb_mem_T0_T1_cc] = CC_C, |
|
4159 |
[INDEX_op_adcw_mem_T0_T1_cc] = CC_C, |
|
4160 |
[INDEX_op_adcl_mem_T0_T1_cc] = CC_C, |
|
4161 |
[INDEX_op_sbbb_mem_T0_T1_cc] = CC_C, |
|
4162 |
[INDEX_op_sbbw_mem_T0_T1_cc] = CC_C, |
|
4163 |
[INDEX_op_sbbl_mem_T0_T1_cc] = CC_C, |
|
4164 |
|
|
4165 | 4160 |
/* subtle: due to the incl/decl implementation, C is used */ |
4166 | 4161 |
[INDEX_op_update_inc_cc] = CC_C, |
4167 | 4162 |
|
... | ... | |
4233 | 4228 |
[INDEX_op_cmc] = CC_C, |
4234 | 4229 |
[INDEX_op_salc] = CC_C, |
4235 | 4230 |
|
4236 |
[INDEX_op_rclb_T0_T1_cc] = CC_C, |
|
4237 |
[INDEX_op_rclw_T0_T1_cc] = CC_C, |
|
4238 |
[INDEX_op_rcll_T0_T1_cc] = CC_C, |
|
4239 |
[INDEX_op_rcrb_T0_T1_cc] = CC_C, |
|
4240 |
[INDEX_op_rcrw_T0_T1_cc] = CC_C, |
|
4241 |
[INDEX_op_rcrl_T0_T1_cc] = CC_C, |
|
4242 |
|
|
4243 |
[INDEX_op_rclb_mem_T0_T1_cc] = CC_C, |
|
4244 |
[INDEX_op_rclw_mem_T0_T1_cc] = CC_C, |
|
4245 |
[INDEX_op_rcll_mem_T0_T1_cc] = CC_C, |
|
4246 |
[INDEX_op_rcrb_mem_T0_T1_cc] = CC_C, |
|
4247 |
[INDEX_op_rcrw_mem_T0_T1_cc] = CC_C, |
|
4248 |
[INDEX_op_rcrl_mem_T0_T1_cc] = CC_C, |
|
4231 |
#define DEF_READF(SUFFIX)\ |
|
4232 |
[INDEX_op_adcb ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4233 |
[INDEX_op_adcw ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4234 |
[INDEX_op_adcl ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4235 |
[INDEX_op_sbbb ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4236 |
[INDEX_op_sbbw ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4237 |
[INDEX_op_sbbl ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4238 |
\ |
|
4239 |
[INDEX_op_rclb ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4240 |
[INDEX_op_rclw ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4241 |
[INDEX_op_rcll ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4242 |
[INDEX_op_rcrb ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4243 |
[INDEX_op_rcrw ## SUFFIX ## _T0_T1_cc] = CC_C,\ |
|
4244 |
[INDEX_op_rcrl ## SUFFIX ## _T0_T1_cc] = CC_C, |
|
4245 |
|
|
4246 |
|
|
4247 |
DEF_READF() |
|
4248 |
DEF_READF(_raw) |
|
4249 |
#ifndef CONFIG_USER_ONLY |
|
4250 |
DEF_READF(_kernel) |
|
4251 |
DEF_READF(_user) |
|
4252 |
#endif |
|
4249 | 4253 |
}; |
4250 | 4254 |
|
4251 | 4255 |
/* flags written by an operation */ |
... | ... | |
4258 | 4262 |
[INDEX_op_update_inc_cc] = CC_OSZAPC, |
4259 | 4263 |
[INDEX_op_testl_T0_T1_cc] = CC_OSZAPC, |
4260 | 4264 |
|
4261 |
[INDEX_op_adcb_T0_T1_cc] = CC_OSZAPC, |
|
4262 |
[INDEX_op_adcw_T0_T1_cc] = CC_OSZAPC, |
|
4263 |
[INDEX_op_adcl_T0_T1_cc] = CC_OSZAPC, |
|
4264 |
[INDEX_op_sbbb_T0_T1_cc] = CC_OSZAPC, |
|
4265 |
[INDEX_op_sbbw_T0_T1_cc] = CC_OSZAPC, |
|
4266 |
[INDEX_op_sbbl_T0_T1_cc] = CC_OSZAPC, |
|
4267 |
|
|
4268 |
[INDEX_op_adcb_mem_T0_T1_cc] = CC_OSZAPC, |
|
4269 |
[INDEX_op_adcw_mem_T0_T1_cc] = CC_OSZAPC, |
|
4270 |
[INDEX_op_adcl_mem_T0_T1_cc] = CC_OSZAPC, |
|
4271 |
[INDEX_op_sbbb_mem_T0_T1_cc] = CC_OSZAPC, |
|
4272 |
[INDEX_op_sbbw_mem_T0_T1_cc] = CC_OSZAPC, |
|
4273 |
[INDEX_op_sbbl_mem_T0_T1_cc] = CC_OSZAPC, |
|
4274 |
|
|
4275 | 4265 |
[INDEX_op_mulb_AL_T0] = CC_OSZAPC, |
4276 | 4266 |
[INDEX_op_imulb_AL_T0] = CC_OSZAPC, |
4277 | 4267 |
[INDEX_op_mulw_AX_T0] = CC_OSZAPC, |
... | ... | |
4300 | 4290 |
[INDEX_op_stc] = CC_C, |
4301 | 4291 |
[INDEX_op_cmc] = CC_C, |
4302 | 4292 |
|
4303 |
[INDEX_op_rolb_T0_T1_cc] = CC_O | CC_C, |
|
4304 |
[INDEX_op_rolw_T0_T1_cc] = CC_O | CC_C, |
|
4305 |
[INDEX_op_roll_T0_T1_cc] = CC_O | CC_C, |
|
4306 |
[INDEX_op_rorb_T0_T1_cc] = CC_O | CC_C, |
|
4307 |
[INDEX_op_rorw_T0_T1_cc] = CC_O | CC_C, |
|
4308 |
[INDEX_op_rorl_T0_T1_cc] = CC_O | CC_C, |
|
4309 |
|
|
4310 |
[INDEX_op_rclb_T0_T1_cc] = CC_O | CC_C, |
|
4311 |
[INDEX_op_rclw_T0_T1_cc] = CC_O | CC_C, |
|
4312 |
[INDEX_op_rcll_T0_T1_cc] = CC_O | CC_C, |
|
4313 |
[INDEX_op_rcrb_T0_T1_cc] = CC_O | CC_C, |
|
4314 |
[INDEX_op_rcrw_T0_T1_cc] = CC_O | CC_C, |
|
4315 |
[INDEX_op_rcrl_T0_T1_cc] = CC_O | CC_C, |
|
4316 |
|
|
4317 |
[INDEX_op_shlb_T0_T1_cc] = CC_OSZAPC, |
|
4318 |
[INDEX_op_shlw_T0_T1_cc] = CC_OSZAPC, |
|
4319 |
[INDEX_op_shll_T0_T1_cc] = CC_OSZAPC, |
|
4320 |
|
|
4321 |
[INDEX_op_shrb_T0_T1_cc] = CC_OSZAPC, |
|
4322 |
[INDEX_op_shrw_T0_T1_cc] = CC_OSZAPC, |
|
4323 |
[INDEX_op_shrl_T0_T1_cc] = CC_OSZAPC, |
|
4324 |
|
|
4325 |
[INDEX_op_sarb_T0_T1_cc] = CC_OSZAPC, |
|
4326 |
[INDEX_op_sarw_T0_T1_cc] = CC_OSZAPC, |
|
4327 |
[INDEX_op_sarl_T0_T1_cc] = CC_OSZAPC, |
|
4328 |
|
|
4329 |
[INDEX_op_shldw_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4330 |
[INDEX_op_shldl_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4331 |
[INDEX_op_shldw_T0_T1_im_cc] = CC_OSZAPC, |
|
4332 |
[INDEX_op_shldl_T0_T1_im_cc] = CC_OSZAPC, |
|
4333 |
|
|
4334 |
[INDEX_op_shrdw_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4335 |
[INDEX_op_shrdl_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4336 |
[INDEX_op_shrdw_T0_T1_im_cc] = CC_OSZAPC, |
|
4337 |
[INDEX_op_shrdl_T0_T1_im_cc] = CC_OSZAPC, |
|
4338 |
|
|
4339 |
[INDEX_op_rolb_mem_T0_T1_cc] = CC_O | CC_C, |
|
4340 |
[INDEX_op_rolw_mem_T0_T1_cc] = CC_O | CC_C, |
|
4341 |
[INDEX_op_roll_mem_T0_T1_cc] = CC_O | CC_C, |
|
4342 |
[INDEX_op_rorb_mem_T0_T1_cc] = CC_O | CC_C, |
|
4343 |
[INDEX_op_rorw_mem_T0_T1_cc] = CC_O | CC_C, |
|
4344 |
[INDEX_op_rorl_mem_T0_T1_cc] = CC_O | CC_C, |
|
4345 |
|
|
4346 |
[INDEX_op_rclb_mem_T0_T1_cc] = CC_O | CC_C, |
|
4347 |
[INDEX_op_rclw_mem_T0_T1_cc] = CC_O | CC_C, |
|
4348 |
[INDEX_op_rcll_mem_T0_T1_cc] = CC_O | CC_C, |
|
4349 |
[INDEX_op_rcrb_mem_T0_T1_cc] = CC_O | CC_C, |
|
4350 |
[INDEX_op_rcrw_mem_T0_T1_cc] = CC_O | CC_C, |
|
4351 |
[INDEX_op_rcrl_mem_T0_T1_cc] = CC_O | CC_C, |
|
4352 |
|
|
4353 |
[INDEX_op_shlb_mem_T0_T1_cc] = CC_OSZAPC, |
|
4354 |
[INDEX_op_shlw_mem_T0_T1_cc] = CC_OSZAPC, |
|
4355 |
[INDEX_op_shll_mem_T0_T1_cc] = CC_OSZAPC, |
|
4356 |
|
|
4357 |
[INDEX_op_shrb_mem_T0_T1_cc] = CC_OSZAPC, |
|
4358 |
[INDEX_op_shrw_mem_T0_T1_cc] = CC_OSZAPC, |
|
4359 |
[INDEX_op_shrl_mem_T0_T1_cc] = CC_OSZAPC, |
|
4360 |
|
|
4361 |
[INDEX_op_sarb_mem_T0_T1_cc] = CC_OSZAPC, |
|
4362 |
[INDEX_op_sarw_mem_T0_T1_cc] = CC_OSZAPC, |
|
4363 |
[INDEX_op_sarl_mem_T0_T1_cc] = CC_OSZAPC, |
|
4364 |
|
|
4365 |
[INDEX_op_shldw_mem_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4366 |
[INDEX_op_shldl_mem_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4367 |
[INDEX_op_shldw_mem_T0_T1_im_cc] = CC_OSZAPC, |
|
4368 |
[INDEX_op_shldl_mem_T0_T1_im_cc] = CC_OSZAPC, |
|
4369 |
|
|
4370 |
[INDEX_op_shrdw_mem_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4371 |
[INDEX_op_shrdl_mem_T0_T1_ECX_cc] = CC_OSZAPC, |
|
4372 |
[INDEX_op_shrdw_mem_T0_T1_im_cc] = CC_OSZAPC, |
|
4373 |
[INDEX_op_shrdl_mem_T0_T1_im_cc] = CC_OSZAPC, |
|
4374 |
|
|
4375 | 4293 |
[INDEX_op_btw_T0_T1_cc] = CC_OSZAPC, |
4376 | 4294 |
[INDEX_op_btl_T0_T1_cc] = CC_OSZAPC, |
4377 | 4295 |
[INDEX_op_btsw_T0_T1_cc] = CC_OSZAPC, |
... | ... | |
4390 | 4308 |
[INDEX_op_cmpxchgw_T0_T1_EAX_cc] = CC_OSZAPC, |
4391 | 4309 |
[INDEX_op_cmpxchgl_T0_T1_EAX_cc] = CC_OSZAPC, |
4392 | 4310 |
|
4393 |
[INDEX_op_cmpxchgb_mem_T0_T1_EAX_cc] = CC_OSZAPC, |
|
4394 |
[INDEX_op_cmpxchgw_mem_T0_T1_EAX_cc] = CC_OSZAPC, |
|
4395 |
[INDEX_op_cmpxchgl_mem_T0_T1_EAX_cc] = CC_OSZAPC, |
|
4396 |
|
|
4397 | 4311 |
[INDEX_op_cmpxchg8b] = CC_Z, |
4398 | 4312 |
[INDEX_op_lar] = CC_Z, |
4399 | 4313 |
[INDEX_op_lsl] = CC_Z, |
4400 | 4314 |
[INDEX_op_fcomi_ST0_FT0] = CC_Z | CC_P | CC_C, |
4401 | 4315 |
[INDEX_op_fucomi_ST0_FT0] = CC_Z | CC_P | CC_C, |
4316 |
|
|
4317 |
#define DEF_WRITEF(SUFFIX)\ |
|
4318 |
[INDEX_op_adcb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4319 |
[INDEX_op_adcw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4320 |
[INDEX_op_adcl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4321 |
[INDEX_op_sbbb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4322 |
[INDEX_op_sbbw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4323 |
[INDEX_op_sbbl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4324 |
\ |
|
4325 |
[INDEX_op_rolb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4326 |
[INDEX_op_rolw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4327 |
[INDEX_op_roll ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4328 |
[INDEX_op_rorb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4329 |
[INDEX_op_rorw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4330 |
[INDEX_op_rorl ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4331 |
\ |
|
4332 |
[INDEX_op_rclb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4333 |
[INDEX_op_rclw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4334 |
[INDEX_op_rcll ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4335 |
[INDEX_op_rcrb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4336 |
[INDEX_op_rcrw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4337 |
[INDEX_op_rcrl ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ |
|
4338 |
\ |
|
4339 |
[INDEX_op_shlb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4340 |
[INDEX_op_shlw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4341 |
[INDEX_op_shll ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4342 |
\ |
|
4343 |
[INDEX_op_shrb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4344 |
[INDEX_op_shrw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4345 |
[INDEX_op_shrl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4346 |
\ |
|
4347 |
[INDEX_op_sarb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4348 |
[INDEX_op_sarw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4349 |
[INDEX_op_sarl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ |
|
4350 |
\ |
|
4351 |
[INDEX_op_shldw ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ |
|
4352 |
[INDEX_op_shldl ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ |
|
4353 |
[INDEX_op_shldw ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ |
|
4354 |
[INDEX_op_shldl ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ |
|
4355 |
\ |
|
4356 |
[INDEX_op_shrdw ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ |
|
4357 |
[INDEX_op_shrdl ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ |
|
4358 |
[INDEX_op_shrdw ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ |
|
4359 |
[INDEX_op_shrdl ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ |
|
4360 |
\ |
|
4361 |
[INDEX_op_cmpxchgb ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,\ |
|
4362 |
[INDEX_op_cmpxchgw ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,\ |
|
4363 |
[INDEX_op_cmpxchgl ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC, |
|
4364 |
|
|
4365 |
|
|
4366 |
DEF_WRITEF() |
|
4367 |
DEF_WRITEF(_raw) |
|
4368 |
#ifndef CONFIG_USER_ONLY |
|
4369 |
DEF_WRITEF(_kernel) |
|
4370 |
DEF_WRITEF(_user) |
|
4371 |
#endif |
|
4402 | 4372 |
}; |
4403 | 4373 |
|
4404 | 4374 |
/* simpler form of an operation if no flags need to be generated */ |
... | ... | |
4410 | 4380 |
/* broken: CC_OP logic must be rewritten */ |
4411 | 4381 |
[INDEX_op_update_inc_cc] = INDEX_op_nop, |
4412 | 4382 |
#endif |
4413 |
[INDEX_op_rolb_T0_T1_cc] = INDEX_op_rolb_T0_T1, |
|
4414 |
[INDEX_op_rolw_T0_T1_cc] = INDEX_op_rolw_T0_T1, |
|
4415 |
[INDEX_op_roll_T0_T1_cc] = INDEX_op_roll_T0_T1, |
|
4416 |
|
|
4417 |
[INDEX_op_rorb_T0_T1_cc] = INDEX_op_rorb_T0_T1, |
|
4418 |
[INDEX_op_rorw_T0_T1_cc] = INDEX_op_rorw_T0_T1, |
|
4419 |
[INDEX_op_rorl_T0_T1_cc] = INDEX_op_rorl_T0_T1, |
|
4420 |
|
|
4421 |
[INDEX_op_rolb_mem_T0_T1_cc] = INDEX_op_rolb_mem_T0_T1, |
|
4422 |
[INDEX_op_rolw_mem_T0_T1_cc] = INDEX_op_rolw_mem_T0_T1, |
|
4423 |
[INDEX_op_roll_mem_T0_T1_cc] = INDEX_op_roll_mem_T0_T1, |
|
4424 |
|
|
4425 |
[INDEX_op_rorb_mem_T0_T1_cc] = INDEX_op_rorb_mem_T0_T1, |
|
4426 |
[INDEX_op_rorw_mem_T0_T1_cc] = INDEX_op_rorw_mem_T0_T1, |
|
4427 |
[INDEX_op_rorl_mem_T0_T1_cc] = INDEX_op_rorl_mem_T0_T1, |
|
4428 | 4383 |
|
4429 | 4384 |
[INDEX_op_shlb_T0_T1_cc] = INDEX_op_shlb_T0_T1, |
4430 | 4385 |
[INDEX_op_shlw_T0_T1_cc] = INDEX_op_shlw_T0_T1, |
... | ... | |
4437 | 4392 |
[INDEX_op_sarb_T0_T1_cc] = INDEX_op_sarb_T0_T1, |
4438 | 4393 |
[INDEX_op_sarw_T0_T1_cc] = INDEX_op_sarw_T0_T1, |
4439 | 4394 |
[INDEX_op_sarl_T0_T1_cc] = INDEX_op_sarl_T0_T1, |
4395 |
|
|
4396 |
#define DEF_SIMPLER(SUFFIX)\ |
|
4397 |
[INDEX_op_rolb ## SUFFIX ## _T0_T1_cc] = INDEX_op_rolb ## SUFFIX ## _T0_T1,\ |
|
4398 |
[INDEX_op_rolw ## SUFFIX ## _T0_T1_cc] = INDEX_op_rolw ## SUFFIX ## _T0_T1,\ |
|
4399 |
[INDEX_op_roll ## SUFFIX ## _T0_T1_cc] = INDEX_op_roll ## SUFFIX ## _T0_T1,\ |
|
4400 |
\ |
|
4401 |
[INDEX_op_rorb ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorb ## SUFFIX ## _T0_T1,\ |
|
4402 |
[INDEX_op_rorw ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorw ## SUFFIX ## _T0_T1,\ |
|
4403 |
[INDEX_op_rorl ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorl ## SUFFIX ## _T0_T1, |
|
4404 |
|
|
4405 |
DEF_SIMPLER() |
|
4406 |
DEF_SIMPLER(_raw) |
|
4407 |
#ifndef CONFIG_USER_ONLY |
|
4408 |
DEF_SIMPLER(_kernel) |
|
4409 |
DEF_SIMPLER(_user) |
|
4410 |
#endif |
|
4440 | 4411 |
}; |
4441 | 4412 |
|
4442 | 4413 |
void optimize_flags_init(void) |
... | ... | |
4495 | 4466 |
cs_base = (uint8_t *)tb->cs_base; |
4496 | 4467 |
flags = tb->flags; |
4497 | 4468 |
|
4498 |
dc->pe = env->cr[0] & CR0_PE_MASK;
|
|
4469 |
dc->pe = (flags >> HF_PE_SHIFT) & 1;
|
|
4499 | 4470 |
dc->code32 = (flags >> HF_CS32_SHIFT) & 1; |
4500 | 4471 |
dc->ss32 = (flags >> HF_SS32_SHIFT) & 1; |
4501 | 4472 |
dc->addseg = (flags >> HF_ADDSEG_SHIFT) & 1; |
... | ... | |
4523 | 4494 |
|| (flags & HF_SOFTMMU_MASK) |
4524 | 4495 |
#endif |
4525 | 4496 |
); |
4497 |
#if 0 |
|
4498 |
/* check addseg logic */ |
|
4499 |
if (!dc->addseg && (dc->vm86 || !dc->pe)) |
|
4500 |
printf("ERROR addseg\n"); |
|
4501 |
#endif |
|
4502 |
|
|
4526 | 4503 |
gen_opc_ptr = gen_opc_buf; |
4527 | 4504 |
gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; |
4528 | 4505 |
gen_opparam_ptr = gen_opparam_buf; |
... | ... | |
4589 | 4566 |
fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start)); |
4590 | 4567 |
disas(logfile, pc_start, pc_ptr - pc_start, 0, !dc->code32); |
4591 | 4568 |
fprintf(logfile, "\n"); |
4592 |
|
|
4593 | 4569 |
fprintf(logfile, "OP:\n"); |
4594 | 4570 |
dump_ops(gen_opc_buf, gen_opparam_buf); |
4595 | 4571 |
fprintf(logfile, "\n"); |
Also available in: Unified diff