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,6 +1366,11 @@ void OPPROTO op_set_cc_op(void) | ||
| 1366 | CC_OP = PARAM1; | 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 | /* XXX: clear VIF/VIP in all ops ? */ | 1374 | /* XXX: clear VIF/VIP in all ops ? */ |
| 1370 | 1375 | ||
| 1371 | void OPPROTO op_movl_eflags_T0(void) | 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,18 +339,14 @@ void OPPROTO glue(op_jle_sub, SUFFIX)(void) | ||
| 339 | 339 | ||
| 340 | void OPPROTO glue(op_loopnz, SUFFIX)(void) | 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 | GOTO_LABEL_PARAM(1); | 343 | GOTO_LABEL_PARAM(1); |
| 346 | FORCE_RET(); | 344 | FORCE_RET(); |
| 347 | } | 345 | } |
| 348 | 346 | ||
| 349 | void OPPROTO glue(op_loopz, SUFFIX)(void) | 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 | GOTO_LABEL_PARAM(1); | 350 | GOTO_LABEL_PARAM(1); |
| 355 | FORCE_RET(); | 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,6 +5271,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) | ||
| 5271 | gen_op_jz_ecx[s->aflag](l1); | 5271 | gen_op_jz_ecx[s->aflag](l1); |
| 5272 | } else { | 5272 | } else { |
| 5273 | gen_op_dec_ECX[s->aflag](); | 5273 | gen_op_dec_ECX[s->aflag](); |
| 5274 | + if (b <= 1) | ||
| 5275 | + gen_op_mov_T0_cc(); | ||
| 5274 | gen_op_loop[s->aflag][b](l1); | 5276 | gen_op_loop[s->aflag][b](l1); |
| 5275 | } | 5277 | } |
| 5276 | 5278 |