qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [4521] cmpxchg 64 bit fix


From: Fabrice Bellard
Subject: [Qemu-devel] [4521] cmpxchg 64 bit fix
Date: Thu, 22 May 2008 09:36:08 +0000

Revision: 4521
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4521
Author:   bellard
Date:     2008-05-22 09:36:08 +0000 (Thu, 22 May 2008)

Log Message:
-----------
cmpxchg 64 bit fix

Modified Paths:
--------------
    trunk/target-i386/translate.c

Modified: trunk/target-i386/translate.c
===================================================================
--- trunk/target-i386/translate.c       2008-05-22 09:20:43 UTC (rev 4520)
+++ trunk/target-i386/translate.c       2008-05-22 09:36:08 UTC (rev 4521)
@@ -4286,7 +4286,7 @@
     case 0x1b0:
     case 0x1b1: /* cmpxchg Ev, Gv */
         {
-            int label1;
+            int label1, label2;
 
             if ((b & 1) == 0)
                 ot = OT_BYTE;
@@ -4309,12 +4309,18 @@
             tcg_gen_sub_tl(cpu_T3, cpu_T3, cpu_T[0]);
             gen_extu(ot, cpu_T3);
             tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T3, tcg_const_tl(0), label1);
-            tcg_gen_mov_tl(cpu_T[1], cpu_T[0]);
-            gen_op_mov_reg_T0(ot, R_EAX);
-            gen_set_label(label1);
             if (mod == 3) {
+                label2 = gen_new_label();
+                gen_op_mov_reg_T0(ot, R_EAX);
+                tcg_gen_br(label2);
+                gen_set_label(label1);
                 gen_op_mov_reg_T1(ot, rm);
+                gen_set_label(label2);
             } else {
+                tcg_gen_mov_tl(cpu_T[1], cpu_T[0]);
+                gen_op_mov_reg_T0(ot, R_EAX);
+                gen_set_label(label1);
+                /* always store */
                 gen_op_st_T1_A0(ot + s->mem_index);
             }
             tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);






reply via email to

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