Commit 0b9dc5e4c3b96a1e41ab7d660ba2ee2a83380e09
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
Showing
3 changed files
with
9 additions
and
6 deletions
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 | ... | ... |