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)