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 | ... | ... |