Revision 436ff2d2 target-i386/translate.c

b/target-i386/translate.c
213 213
    [CC_OP_ADCX] = USES_CC_DST | USES_CC_SRC,
214 214
    [CC_OP_ADOX] = USES_CC_SRC | USES_CC_SRC2,
215 215
    [CC_OP_ADCOX] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2,
216
    [CC_OP_CLR] = 0,
216 217
};
217 218

  
218 219
static void set_cc_op(DisasContext *s, CCOp op)
......
906 907
    if (s->cc_op == CC_OP_EFLAGS) {
907 908
        return;
908 909
    }
910
    if (s->cc_op == CC_OP_CLR) {
911
        tcg_gen_movi_tl(cpu_cc_src, CC_Z);
912
        set_cc_op(s, CC_OP_EFLAGS);
913
        return;
914
    }
909 915

  
910 916
    TCGV_UNUSED(zero);
911 917
    dst = cpu_cc_dst;
......
974 980
                             .reg2 = t1, .mask = -1, .use_reg2 = true };
975 981

  
976 982
    case CC_OP_LOGICB ... CC_OP_LOGICQ:
983
    case CC_OP_CLR:
977 984
        return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 };
978 985

  
979 986
    case CC_OP_INCB ... CC_OP_INCQ:
......
1040 1047
    case CC_OP_ADCOX:
1041 1048
        return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src,
1042 1049
                             .mask = CC_S };
1050
    case CC_OP_CLR:
1051
        return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 };
1043 1052
    default:
1044 1053
        {
1045 1054
            int size = (s->cc_op - CC_OP_ADDB) & 3;
......
1057 1066
    case CC_OP_ADCOX:
1058 1067
        return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src2,
1059 1068
                             .mask = -1, .no_setcond = true };
1060

  
1069
    case CC_OP_CLR:
1070
        return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 };
1061 1071
    default:
1062 1072
        gen_compute_eflags(s);
1063 1073
        return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src,
......
1078 1088
    case CC_OP_ADCOX:
1079 1089
        return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src,
1080 1090
                             .mask = CC_Z };
1091
    case CC_OP_CLR:
1092
        return (CCPrepare) { .cond = TCG_COND_ALWAYS, .mask = -1 };
1081 1093
    default:
1082 1094
        {
1083 1095
            int size = (s->cc_op - CC_OP_ADDB) & 3;
......
4890 4902
                } else if (op == OP_XORL && rm == reg) {
4891 4903
                xor_zero:
4892 4904
                    /* xor reg, reg optimisation */
4905
                    set_cc_op(s, CC_OP_CLR);
4893 4906
                    gen_op_movl_T0_0();
4894
                    set_cc_op(s, CC_OP_LOGICB + ot);
4895 4907
                    gen_op_mov_reg_T0(ot, reg);
4896
                    gen_op_update1_cc();
4897 4908
                    break;
4898 4909
                } else {
4899 4910
                    opreg = rm;

Also available in: Unified diff