loop insn fix for non x86 hosts
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1305 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
194884dd6f
commit
0b9dc5e4c3
@ -1366,6 +1366,11 @@ void OPPROTO op_set_cc_op(void)
|
|||||||
CC_OP = PARAM1;
|
CC_OP = PARAM1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OPPROTO op_mov_T0_cc(void)
|
||||||
|
{
|
||||||
|
T0 = cc_table[CC_OP].compute_all();
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX: clear VIF/VIP in all ops ? */
|
/* XXX: clear VIF/VIP in all ops ? */
|
||||||
|
|
||||||
void OPPROTO op_movl_eflags_T0(void)
|
void OPPROTO op_movl_eflags_T0(void)
|
||||||
|
@ -339,18 +339,14 @@ void OPPROTO glue(op_jle_sub, SUFFIX)(void)
|
|||||||
|
|
||||||
void OPPROTO glue(op_loopnz, SUFFIX)(void)
|
void OPPROTO glue(op_loopnz, SUFFIX)(void)
|
||||||
{
|
{
|
||||||
int eflags;
|
if ((DATA_TYPE)ECX != 0 && !(T0 & CC_Z))
|
||||||
eflags = cc_table[CC_OP].compute_all();
|
|
||||||
if ((DATA_TYPE)ECX != 0 && !(eflags & CC_Z))
|
|
||||||
GOTO_LABEL_PARAM(1);
|
GOTO_LABEL_PARAM(1);
|
||||||
FORCE_RET();
|
FORCE_RET();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OPPROTO glue(op_loopz, SUFFIX)(void)
|
void OPPROTO glue(op_loopz, SUFFIX)(void)
|
||||||
{
|
{
|
||||||
int eflags;
|
if ((DATA_TYPE)ECX != 0 && (T0 & CC_Z))
|
||||||
eflags = cc_table[CC_OP].compute_all();
|
|
||||||
if ((DATA_TYPE)ECX != 0 && (eflags & CC_Z))
|
|
||||||
GOTO_LABEL_PARAM(1);
|
GOTO_LABEL_PARAM(1);
|
||||||
FORCE_RET();
|
FORCE_RET();
|
||||||
}
|
}
|
||||||
|
@ -5271,6 +5271,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
|
|||||||
gen_op_jz_ecx[s->aflag](l1);
|
gen_op_jz_ecx[s->aflag](l1);
|
||||||
} else {
|
} else {
|
||||||
gen_op_dec_ECX[s->aflag]();
|
gen_op_dec_ECX[s->aflag]();
|
||||||
|
if (b <= 1)
|
||||||
|
gen_op_mov_T0_cc();
|
||||||
gen_op_loop[s->aflag][b](l1);
|
gen_op_loop[s->aflag][b](l1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user