--- np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/06 16:49:51 1.8 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/12 15:46:14 1.10 @@ -1,4 +1,4 @@ -/* $Id: ctrl_trans.c,v 1.8 2004/02/06 16:49:51 monaka Exp $ */ +/* $Id: ctrl_trans.c,v 1.10 2004/02/12 15:46:14 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -1011,7 +1011,7 @@ void RETnear16_Iw(void) { DWORD new_ip; - WORD ad; + DWORD ad; CPU_WORKCLOCK(11); GET_PCWORD(ad); @@ -1153,14 +1153,13 @@ IRET(void) POP0_16(new_ip); POP0_16(new_cs); POP0_16(new_flags); - set_flags(new_flags, mask); } else { POP0_32(new_ip); POP0_32(new_cs); POP0_32(new_flags); mask |= RF_FLAG; - set_eflags(new_flags, mask); } + set_eflags(new_flags, mask); CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); SET_EIP(new_ip); @@ -1312,30 +1311,28 @@ ENTER16_IwIb(void) } } else { /* enter level=2-31 */ CPU_WORKCLOCK(12 + level * 4); - if (!CPU_INST_OP32) { - if (!CPU_STAT_SS32) { - bp = CPU_BP; - CPU_BP = CPU_SP; - while (level--) { - bp -= 2; - CPU_SP -= 2; - val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); - cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_SP, val); - } - REGPUSH0(CPU_BP); - CPU_SP -= dimsize; - } else { - bp = CPU_EBP; - CPU_BP = CPU_SP; - while (level--) { - bp -= 2; - CPU_ESP -= 2; - val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); - cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_ESP, val); - } - REGPUSH0_16_32(CPU_EBP); - CPU_ESP -= dimsize; + if (!CPU_STAT_SS32) { + bp = CPU_BP; + CPU_BP = CPU_SP; + while (level--) { + bp -= 2; + CPU_SP -= 2; + val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); + cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_SP, val); + } + REGPUSH0(CPU_BP); + CPU_SP -= dimsize; + } else { + bp = CPU_EBP; + CPU_BP = CPU_SP; + while (level--) { + bp -= 2; + CPU_ESP -= 2; + val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); + cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_ESP, val); } + REGPUSH0_16_32(CPU_BP); + CPU_ESP -= dimsize; } } } @@ -1416,54 +1413,31 @@ ENTER32_IwIb(void) } void -LEAVE16(void) +LEAVE(void) { - WORD bp; - DWORD sp, size; + DWORD sp, bp; CPU_WORKCLOCK(5); if (CPU_STAT_PM) { - bp = CPU_BP; if (!CPU_STAT_SS32) { sp = CPU_SP; - size = 2; + bp = CPU_BP; } else { sp = CPU_ESP; - size = 4; - } - if (bp < sp) { - ia32_panic("LEAVE16: bp < sp"); + bp = CPU_EBP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + size); + CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp-sp) + 2); } - CPU_SP = CPU_BP; - REGPOP0(CPU_BP); -} - -void -LEAVE32(void) -{ - DWORD bp, sp, size; - - CPU_WORKCLOCK(5); - - if (CPU_STAT_PM) { - bp = CPU_EBP; - if (CPU_STAT_SS32) { - sp = CPU_ESP; - size = 4; - } else { - sp = CPU_SP; - size = 2; - } - if (bp < sp) { - ia32_panic("LEAVE32: bp < sp"); - } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + size); + if (!CPU_STAT_SS32) { + CPU_SP = CPU_BP; + } else { + CPU_ESP = CPU_EBP; + } + if (!CPU_INST_OP32) { + REGPOP0(CPU_BP); + } else { + POP0_32(CPU_EBP); } - - CPU_ESP = CPU_EBP; - POP0_32(CPU_EBP); }