Revision 31501a71 target-i386/translate.c

b/target-i386/translate.c
6573 6573
            ot = dflag + OT_WORD;
6574 6574
            modrm = ldub_code(s->pc++);
6575 6575
            reg = ((modrm >> 3) & 7) | rex_r;
6576
            gen_ldst_modrm(s, modrm, ot, OR_TMP0, 0);
6576
            gen_ldst_modrm(s,modrm, ot, OR_TMP0, 0);
6577 6577
            gen_extu(ot, cpu_T[0]);
6578
            label1 = gen_new_label();
6579
            tcg_gen_movi_tl(cpu_cc_dst, 0);
6580 6578
            t0 = tcg_temp_local_new();
6581 6579
            tcg_gen_mov_tl(t0, cpu_T[0]);
6582
            tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, label1);
6583
            if (b & 1) {
6584
                gen_helper_bsr(cpu_T[0], t0);
6580
            if ((b & 1) && (prefixes & PREFIX_REPZ) &&
6581
                (s->cpuid_ext3_features & CPUID_EXT3_ABM)) {
6582
                switch(ot) {
6583
                case OT_WORD: gen_helper_lzcnt(cpu_T[0], t0,
6584
                    tcg_const_i32(16)); break;
6585
                case OT_LONG: gen_helper_lzcnt(cpu_T[0], t0,
6586
                    tcg_const_i32(32)); break;
6587
                case OT_QUAD: gen_helper_lzcnt(cpu_T[0], t0,
6588
                    tcg_const_i32(64)); break;
6589
                }
6590
                gen_op_mov_reg_T0(ot, reg);
6585 6591
            } else {
6586
                gen_helper_bsf(cpu_T[0], t0);
6592
                label1 = gen_new_label();
6593
                tcg_gen_movi_tl(cpu_cc_dst, 0);
6594
                tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, label1);
6595
                if (b & 1) {
6596
                    gen_helper_bsr(cpu_T[0], t0);
6597
                } else {
6598
                    gen_helper_bsf(cpu_T[0], t0);
6599
                }
6600
                gen_op_mov_reg_T0(ot, reg);
6601
                tcg_gen_movi_tl(cpu_cc_dst, 1);
6602
                gen_set_label(label1);
6603
                tcg_gen_discard_tl(cpu_cc_src);
6604
                s->cc_op = CC_OP_LOGICB + ot;
6587 6605
            }
6588
            gen_op_mov_reg_T0(ot, reg);
6589
            tcg_gen_movi_tl(cpu_cc_dst, 1);
6590
            gen_set_label(label1);
6591
            tcg_gen_discard_tl(cpu_cc_src);
6592
            s->cc_op = CC_OP_LOGICB + ot;
6593 6606
            tcg_temp_free(t0);
6594 6607
        }
6595 6608
        break;

Also available in: Unified diff