@samitouri / QOSamiQemu / commits / 389a4189a0

target/i386/tcg: do not reuse cc_srcT

Use a different temporary for every instruction that uses it in the translation block. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo Bonzini committed Jun 19, 2026 at 08:05 UTC 389a4189a07ddd8a740ede94da7b59b67a374cbb
2 files changed +11 -6
target/i386/tcg/emit.c.inc
+7 -4
@@ -1699,6 +1699,7 @@ static void gen_CMPccXADD(DisasContext *s, X86DecodedInsn *decode)
1699 * - s->cc_srcT: memory operand (lhs for comparison)
1700 * - cmpv: rhs for comparison
1701 */
1702 + s->cc_srcT = tcg_temp_new();
1703 gen_set_label(label_top);
1704 gen_op_ld_v(s, ot_full, s->cc_srcT, s->A0);
1705 tcg_gen_sub_tl(s->T0, s->cc_srcT, cmpv);
@@ -1800,11 +1801,12 @@ static void gen_CMPXCHG(DisasContext *s, X86DecodedInsn *decode)
1801 dest = gen_op_deposit_reg_v(s, ot, R_EAX, s->T0, oldv);
1802 tcg_gen_movcond_tl(TCG_COND_NE, dest, oldv, cmpv, s->T0, dest);
1803
1803 - tcg_gen_mov_tl(s->cc_srcT, cmpv);
1804 - tcg_gen_sub_tl(cmpv, cmpv, oldv);
1805 - decode->cc_dst = cmpv;
1804 + s->cc_srcT = cmpv;
1805 + decode->cc_dst = tcg_temp_new();
1806 decode->cc_src = oldv;
1807 decode->cc_op = CC_OP_SUBB + ot;
1808 +
1809 + tcg_gen_sub_tl(decode->cc_dst, cmpv, oldv);
1810 }
1811
1812 static void gen_CMPXCHG16B(DisasContext *s, X86DecodedInsn *decode)
@@ -2722,7 +2724,7 @@ static void gen_NEG(DisasContext *s, X86DecodedInsn *decode)
2724
2725 decode->cc_dst = s->T0;
2726 decode->cc_src = oldv;
2725 - tcg_gen_movi_tl(s->cc_srcT, 0);
2727 + s->cc_srcT = tcg_constant_tl(0);
2728 decode->cc_op = CC_OP_SUBB + ot;
2729 }
2730
@@ -4114,6 +4116,7 @@ static void gen_SUB(DisasContext *s, X86DecodedInsn *decode)
4116 {
4117 MemOp ot = decode->op[1].ot;
4118
4119 + s->cc_srcT = tcg_temp_new();
4120 if (s->prefix & PREFIX_LOCK) {
4121 tcg_gen_neg_tl(s->T0, s->T1);
4122 tcg_gen_atomic_fetch_add_tl(s->cc_srcT, s->A0, s->T0,
target/i386/tcg/translate.c
+4 -2
@@ -342,7 +342,7 @@ static void set_cc_op_1(DisasContext *s, CCOp op, bool dirty)
342 tcg_gen_discard_tl(cpu_cc_src2);
343 }
344 if (dead & USES_CC_SRCT) {
345 - tcg_gen_discard_tl(s->cc_srcT);
345 + s->cc_srcT = NULL;
346 }
347
348 if (dirty && s->cc_op == CC_OP_DYNAMIC) {
@@ -1236,6 +1236,7 @@ static void gen_lods(DisasContext *s, MemOp ot, TCGv dshift)
1236
1237 static void gen_scas(DisasContext *s, MemOp ot, TCGv dshift)
1238 {
1239 + s->cc_srcT = tcg_temp_new();
1240 gen_string_movl_A0_EDI(s);
1241 gen_op_ld_v(s, ot, s->T1, s->A0);
1242 tcg_gen_mov_tl(cpu_cc_src, s->T1);
@@ -1248,6 +1249,7 @@ static void gen_scas(DisasContext *s, MemOp ot, TCGv dshift)
1249
1250 static void gen_cmps(DisasContext *s, MemOp ot, TCGv dshift)
1251 {
1252 + s->cc_srcT = tcg_temp_new();
1253 gen_string_movl_A0_EDI(s);
1254 gen_op_ld_v(s, ot, s->T1, s->A0);
1255 gen_string_movl_A0_ESI(s);
@@ -3484,7 +3486,7 @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
3486 dc->T1 = tcg_temp_new();
3487 dc->A0 = tcg_temp_new();
3488
3487 - dc->cc_srcT = tcg_temp_new();
3489 + dc->cc_srcT = NULL;
3490 }
3491
3492 static void i386_tr_tb_start(DisasContextBase *db, CPUState *cpu)