Revision bd7a7b33 target-i386/translate.c
b/target-i386/translate.c | ||
---|---|---|
5733 | 5733 |
} else { |
5734 | 5734 |
if (s->cc_op != CC_OP_DYNAMIC) |
5735 | 5735 |
gen_op_set_cc_op(s->cc_op); |
5736 |
gen_op_movl_T0_eflags();
|
|
5736 |
tcg_gen_helper_1_0(helper_read_eflags, cpu_T[0]);
|
|
5737 | 5737 |
gen_push_T0(s); |
5738 | 5738 |
} |
5739 | 5739 |
break; |
... | ... | |
5746 | 5746 |
gen_pop_T0(s); |
5747 | 5747 |
if (s->cpl == 0) { |
5748 | 5748 |
if (s->dflag) { |
5749 |
gen_op_movl_eflags_T0_cpl0(); |
|
5749 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5750 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK))); |
|
5750 | 5751 |
} else { |
5751 |
gen_op_movw_eflags_T0_cpl0(); |
|
5752 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5753 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK) & 0xffff)); |
|
5752 | 5754 |
} |
5753 | 5755 |
} else { |
5754 | 5756 |
if (s->cpl <= s->iopl) { |
5755 | 5757 |
if (s->dflag) { |
5756 |
gen_op_movl_eflags_T0_io(); |
|
5758 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5759 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK))); |
|
5757 | 5760 |
} else { |
5758 |
gen_op_movw_eflags_T0_io(); |
|
5761 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5762 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK) & 0xffff)); |
|
5759 | 5763 |
} |
5760 | 5764 |
} else { |
5761 | 5765 |
if (s->dflag) { |
5762 |
gen_op_movl_eflags_T0(); |
|
5766 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5767 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK))); |
|
5763 | 5768 |
} else { |
5764 |
gen_op_movw_eflags_T0(); |
|
5769 |
tcg_gen_helper_0_2(helper_write_eflags, cpu_T[0], |
|
5770 |
tcg_const_i32((TF_MASK | AC_MASK | ID_MASK | NT_MASK) & 0xffff)); |
|
5765 | 5771 |
} |
5766 | 5772 |
} |
5767 | 5773 |
} |
... | ... | |
5778 | 5784 |
gen_op_mov_TN_reg(OT_BYTE, 0, R_AH); |
5779 | 5785 |
if (s->cc_op != CC_OP_DYNAMIC) |
5780 | 5786 |
gen_op_set_cc_op(s->cc_op); |
5781 |
gen_op_movb_eflags_T0(); |
|
5787 |
gen_compute_eflags(cpu_cc_src); |
|
5788 |
tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, CC_O); |
|
5789 |
tcg_gen_andi_tl(cpu_T[0], cpu_T[0], CC_S | CC_Z | CC_A | CC_P | CC_C); |
|
5790 |
tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_T[0]); |
|
5782 | 5791 |
s->cc_op = CC_OP_EFLAGS; |
5783 | 5792 |
break; |
5784 | 5793 |
case 0x9f: /* lahf */ |
... | ... | |
5786 | 5795 |
goto illegal_op; |
5787 | 5796 |
if (s->cc_op != CC_OP_DYNAMIC) |
5788 | 5797 |
gen_op_set_cc_op(s->cc_op); |
5789 |
gen_op_movl_T0_eflags(); |
|
5798 |
gen_compute_eflags(cpu_T[0]); |
|
5799 |
/* Note: gen_compute_eflags() only gives the condition codes */ |
|
5800 |
tcg_gen_ori_tl(cpu_T[0], cpu_T[0], 0x02); |
|
5790 | 5801 |
gen_op_mov_reg_T0(OT_BYTE, R_AH); |
5791 | 5802 |
break; |
5792 | 5803 |
case 0xf5: /* cmc */ |
5793 | 5804 |
if (s->cc_op != CC_OP_DYNAMIC) |
5794 | 5805 |
gen_op_set_cc_op(s->cc_op); |
5795 |
gen_op_cmc(); |
|
5806 |
gen_compute_eflags(cpu_cc_src); |
|
5807 |
tcg_gen_xori_tl(cpu_cc_src, cpu_cc_src, CC_C); |
|
5796 | 5808 |
s->cc_op = CC_OP_EFLAGS; |
5797 | 5809 |
break; |
5798 | 5810 |
case 0xf8: /* clc */ |
5799 | 5811 |
if (s->cc_op != CC_OP_DYNAMIC) |
5800 | 5812 |
gen_op_set_cc_op(s->cc_op); |
5801 |
gen_op_clc(); |
|
5813 |
gen_compute_eflags(cpu_cc_src); |
|
5814 |
tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~CC_C); |
|
5802 | 5815 |
s->cc_op = CC_OP_EFLAGS; |
5803 | 5816 |
break; |
5804 | 5817 |
case 0xf9: /* stc */ |
5805 | 5818 |
if (s->cc_op != CC_OP_DYNAMIC) |
5806 | 5819 |
gen_op_set_cc_op(s->cc_op); |
5807 |
gen_op_stc(); |
|
5820 |
gen_compute_eflags(cpu_cc_src); |
|
5821 |
tcg_gen_ori_tl(cpu_cc_src, cpu_cc_src, CC_C); |
|
5808 | 5822 |
s->cc_op = CC_OP_EFLAGS; |
5809 | 5823 |
break; |
5810 | 5824 |
case 0xfc: /* cld */ |
... | ... | |
6127 | 6141 |
goto illegal_op; |
6128 | 6142 |
if (s->cc_op != CC_OP_DYNAMIC) |
6129 | 6143 |
gen_op_set_cc_op(s->cc_op); |
6130 |
gen_op_salc(); |
|
6144 |
gen_compute_eflags_c(cpu_T[0]); |
|
6145 |
tcg_gen_neg_tl(cpu_T[0], cpu_T[0]); |
|
6146 |
gen_op_mov_reg_T0(OT_BYTE, R_EAX); |
|
6131 | 6147 |
break; |
6132 | 6148 |
case 0xe0: /* loopnz */ |
6133 | 6149 |
case 0xe1: /* loopz */ |
Also available in: Unified diff