[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] target/i386: cmpxchg only overwrites ZF
From: |
Paolo Bonzini |
Subject: |
[PATCH 2/2] target/i386: cmpxchg only overwrites ZF |
Date: |
Mon, 12 Sep 2022 00:26:30 +0200 |
Do not set all the flags, they are untouched other than ZF.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/tcg/translate.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
index 0e9237d627..488a617d14 100644
--- a/target/i386/tcg/translate.c
+++ b/target/i386/tcg/translate.c
@@ -5548,10 +5548,12 @@ static target_ulong disas_insn(DisasContext *s,
CPUState *cpu)
gen_op_mov_reg_v(s, ot, R_EAX, oldv);
}
}
- tcg_gen_mov_tl(cpu_cc_src, oldv);
- tcg_gen_mov_tl(s->cc_srcT, cmpv);
- tcg_gen_sub_tl(cpu_cc_dst, cmpv, oldv);
- set_cc_op(s, CC_OP_SUBB + ot);
+
+ gen_compute_eflags(s);
+ tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~CC_Z);
+ tcg_gen_addi_tl(s->T0, cpu_cc_src, CC_Z);
+ tcg_gen_movcond_tl(TCG_COND_EQ, cpu_cc_src, oldv, cmpv, s->T0,
cpu_cc_src);
+
tcg_temp_free(oldv);
tcg_temp_free(newv);
tcg_temp_free(cmpv);
--
2.37.2