qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC 13/30] target-i386: emulate LOCK'ed INC using atomic h


From: Emilio G. Cota
Subject: [Qemu-devel] [RFC 13/30] target-i386: emulate LOCK'ed INC using atomic helper
Date: Mon, 27 Jun 2016 15:01:59 -0400

Signed-off-by: Emilio G. Cota <address@hidden>
---
 target-i386/translate.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/target-i386/translate.c b/target-i386/translate.c
index 1dc7014..a9fa25a 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -1433,9 +1433,30 @@ static void gen_op(DisasContext *s1, int op, TCGMemOp 
ot, int d)
     }
 }
 
+static void gen_inc_locked(DisasContext *s1, TCGMemOp ot, int c)
+{
+    TCGv t0;
+
+    t0 = tcg_temp_new();
+    tcg_gen_movi_tl(t0, 1);
+    gen_compute_eflags_c(s1, cpu_cc_src);
+    if (c > 0) {
+        gen_atomic_add_fetch(cpu_T0, cpu_A0, t0, ot);
+        set_cc_op(s1, CC_OP_INCB + ot);
+    } else {
+        gen_atomic_sub_fetch(cpu_T0, cpu_A0, t0, ot);
+        set_cc_op(s1, CC_OP_DECB + ot);
+    }
+    tcg_gen_mov_tl(cpu_cc_dst, cpu_T0);
+    tcg_temp_free(t0);
+}
+
 /* if d == OR_TMP0, it means memory operand (address in A0) */
 static void gen_inc(DisasContext *s1, TCGMemOp ot, int d, int c)
 {
+    if (s1->prefix & PREFIX_LOCK) {
+        return gen_inc_locked(s1, ot, c);
+    }
     if (d != OR_TMP0) {
         gen_op_mov_v_reg(ot, cpu_T0, d);
     } else {
-- 
2.5.0




reply via email to

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