OSDN Git Service

loop insn fix for non x86 hosts
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 21 Feb 2005 20:23:59 +0000 (20:23 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 21 Feb 2005 20:23:59 +0000 (20:23 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1305 c046a42c-6fe2-441c-8c8c-71466251a162

target-i386/op.c
target-i386/ops_template.h
target-i386/translate.c

index 933595d..fed0fca 100644 (file)
@@ -1366,6 +1366,11 @@ void OPPROTO op_set_cc_op(void)
     CC_OP = PARAM1;
 }
 
+void OPPROTO op_mov_T0_cc(void)
+{
+    T0 = cc_table[CC_OP].compute_all();
+}
+
 /* XXX: clear VIF/VIP in all ops ? */
 
 void OPPROTO op_movl_eflags_T0(void)
index 35d5b54..373b77a 100644 (file)
@@ -339,18 +339,14 @@ void OPPROTO glue(op_jle_sub, SUFFIX)(void)
 
 void OPPROTO glue(op_loopnz, SUFFIX)(void)
 {
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    if ((DATA_TYPE)ECX != 0 && !(eflags & CC_Z))
+    if ((DATA_TYPE)ECX != 0 && !(T0 & CC_Z))
         GOTO_LABEL_PARAM(1);
     FORCE_RET();
 }
 
 void OPPROTO glue(op_loopz, SUFFIX)(void)
 {
-    int eflags;
-    eflags = cc_table[CC_OP].compute_all();
-    if ((DATA_TYPE)ECX != 0 && (eflags & CC_Z))
+    if ((DATA_TYPE)ECX != 0 && (T0 & CC_Z))
         GOTO_LABEL_PARAM(1);
     FORCE_RET();
 }
index a3005d8..0937239 100644 (file)
@@ -5271,6 +5271,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
                 gen_op_jz_ecx[s->aflag](l1);
             } else {
                 gen_op_dec_ECX[s->aflag]();
+                if (b <= 1)
+                    gen_op_mov_T0_cc();
                 gen_op_loop[s->aflag][b](l1);
             }