Commit 0b9dc5e4c3b96a1e41ab7d660ba2ee2a83380e09

Authored by bellard
1 parent 194884dd

loop insn fix for non x86 hosts


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1305 c046a42c-6fe2-441c-8c8c-71466251a162
target-i386/op.c
... ... @@ -1366,6 +1366,11 @@ void OPPROTO op_set_cc_op(void)
1366 1366 CC_OP = PARAM1;
1367 1367 }
1368 1368  
  1369 +void OPPROTO op_mov_T0_cc(void)
  1370 +{
  1371 + T0 = cc_table[CC_OP].compute_all();
  1372 +}
  1373 +
1369 1374 /* XXX: clear VIF/VIP in all ops ? */
1370 1375  
1371 1376 void OPPROTO op_movl_eflags_T0(void)
... ...
target-i386/ops_template.h
... ... @@ -339,18 +339,14 @@ void OPPROTO glue(op_jle_sub, SUFFIX)(void)
339 339  
340 340 void OPPROTO glue(op_loopnz, SUFFIX)(void)
341 341 {
342   - int eflags;
343   - eflags = cc_table[CC_OP].compute_all();
344   - if ((DATA_TYPE)ECX != 0 && !(eflags & CC_Z))
  342 + if ((DATA_TYPE)ECX != 0 && !(T0 & CC_Z))
345 343 GOTO_LABEL_PARAM(1);
346 344 FORCE_RET();
347 345 }
348 346  
349 347 void OPPROTO glue(op_loopz, SUFFIX)(void)
350 348 {
351   - int eflags;
352   - eflags = cc_table[CC_OP].compute_all();
353   - if ((DATA_TYPE)ECX != 0 && (eflags & CC_Z))
  349 + if ((DATA_TYPE)ECX != 0 && (T0 & CC_Z))
354 350 GOTO_LABEL_PARAM(1);
355 351 FORCE_RET();
356 352 }
... ...
target-i386/translate.c
... ... @@ -5271,6 +5271,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5271 5271 gen_op_jz_ecx[s->aflag](l1);
5272 5272 } else {
5273 5273 gen_op_dec_ECX[s->aflag]();
  5274 + if (b <= 1)
  5275 + gen_op_mov_T0_cc();
5274 5276 gen_op_loop[s->aflag][b](l1);
5275 5277 }
5276 5278  
... ...