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