Use a different temporary for every instruction that uses it in the translation block.
Signed-off-by: Paolo Bonzini <[email protected]> --- target/i386/tcg/translate.c | 6 ++++-- target/i386/tcg/emit.c.inc | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 2115c5cd24b..d1791550772 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -342,7 +342,7 @@ static void set_cc_op_1(DisasContext *s, CCOp op, bool dirty) tcg_gen_discard_tl(cpu_cc_src2); } if (dead & USES_CC_SRCT) { - tcg_gen_discard_tl(s->cc_srcT); + s->cc_srcT = NULL; } if (dirty && s->cc_op == CC_OP_DYNAMIC) { @@ -1236,6 +1236,7 @@ static void gen_lods(DisasContext *s, MemOp ot, TCGv dshift) static void gen_scas(DisasContext *s, MemOp ot, TCGv dshift) { + s->cc_srcT = tcg_temp_new(); gen_string_movl_A0_EDI(s); gen_op_ld_v(s, ot, s->T1, s->A0); tcg_gen_mov_tl(cpu_cc_src, s->T1); @@ -1248,6 +1249,7 @@ static void gen_scas(DisasContext *s, MemOp ot, TCGv dshift) static void gen_cmps(DisasContext *s, MemOp ot, TCGv dshift) { + s->cc_srcT = tcg_temp_new(); gen_string_movl_A0_EDI(s); gen_op_ld_v(s, ot, s->T1, s->A0); gen_string_movl_A0_ESI(s); @@ -3484,7 +3486,7 @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu) dc->T1 = tcg_temp_new(); dc->A0 = tcg_temp_new(); - dc->cc_srcT = tcg_temp_new(); + dc->cc_srcT = NULL; } static void i386_tr_tb_start(DisasContextBase *db, CPUState *cpu) diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc index 473f415766f..968abd47a73 100644 --- a/target/i386/tcg/emit.c.inc +++ b/target/i386/tcg/emit.c.inc @@ -1699,6 +1699,7 @@ static void gen_CMPccXADD(DisasContext *s, X86DecodedInsn *decode) * - s->cc_srcT: memory operand (lhs for comparison) * - cmpv: rhs for comparison */ + s->cc_srcT = tcg_temp_new(); gen_set_label(label_top); gen_op_ld_v(s, ot_full, s->cc_srcT, s->A0); tcg_gen_sub_tl(s->T0, s->cc_srcT, cmpv); @@ -1800,11 +1801,12 @@ static void gen_CMPXCHG(DisasContext *s, X86DecodedInsn *decode) dest = gen_op_deposit_reg_v(s, ot, R_EAX, s->T0, oldv); tcg_gen_movcond_tl(TCG_COND_NE, dest, oldv, cmpv, s->T0, dest); - tcg_gen_mov_tl(s->cc_srcT, cmpv); - tcg_gen_sub_tl(cmpv, cmpv, oldv); - decode->cc_dst = cmpv; + s->cc_srcT = cmpv; + decode->cc_dst = tcg_temp_new(); decode->cc_src = oldv; decode->cc_op = CC_OP_SUBB + ot; + + tcg_gen_sub_tl(decode->cc_dst, cmpv, oldv); } static void gen_CMPXCHG16B(DisasContext *s, X86DecodedInsn *decode) @@ -2722,7 +2724,7 @@ static void gen_NEG(DisasContext *s, X86DecodedInsn *decode) decode->cc_dst = s->T0; decode->cc_src = oldv; - tcg_gen_movi_tl(s->cc_srcT, 0); + s->cc_srcT = tcg_constant_tl(0); decode->cc_op = CC_OP_SUBB + ot; } @@ -4114,6 +4116,7 @@ static void gen_SUB(DisasContext *s, X86DecodedInsn *decode) { MemOp ot = decode->op[1].ot; + s->cc_srcT = tcg_temp_new(); if (s->prefix & PREFIX_LOCK) { tcg_gen_neg_tl(s->T0, s->T1); tcg_gen_atomic_fetch_add_tl(s->cc_srcT, s->A0, s->T0, -- 2.55.0
