qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]