--- np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/06 16:49:51 1.8 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/19 03:04:02 1.11 @@ -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.11 2004/02/19 03:04:02 yui Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -1011,14 +1011,14 @@ void RETnear16_Iw(void) { DWORD new_ip; - WORD ad; + DWORD ad; CPU_WORKCLOCK(11); GET_PCWORD(ad); POP0_16(new_ip); SET_EIP(new_ip); if (!CPU_STAT_SS32) { - CPU_SP += ad; + CPU_SP += (WORD)ad; } else { CPU_ESP += ad; } @@ -1037,7 +1037,7 @@ RETnear32_Iw(void) if (CPU_STAT_SS32) { CPU_ESP += ad; } else { - CPU_SP += ad; + CPU_SP += (WORD)ad; } } @@ -1065,7 +1065,7 @@ void RETfar32(void) { DWORD new_ip; - WORD new_cs; + DWORD new_cs; CPU_WORKCLOCK(15); if (!CPU_STAT_PM || CPU_STAT_VM86) { @@ -1073,7 +1073,7 @@ RETfar32(void) POP0_32(new_ip); POP0_32(new_cs); - CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); + CPU_SET_SEGREG(CPU_CS_INDEX, (WORD)new_cs); SET_EIP(new_ip); } else { /* Protected mode */ @@ -1099,7 +1099,7 @@ RETfar16_Iw(void) SET_EIP(new_ip); if (!CPU_STAT_SS32) { - CPU_SP += ad; + CPU_SP += (WORD)ad; } else { CPU_ESP += ad; } @@ -1114,7 +1114,7 @@ RETfar32_Iw(void) { DWORD ad; DWORD new_ip; - WORD new_cs; + DWORD new_cs; CPU_WORKCLOCK(15); GET_PCWORD(ad); @@ -1123,13 +1123,13 @@ RETfar32_Iw(void) POP0_32(new_ip); POP0_32(new_cs); - CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); + CPU_SET_SEGREG(CPU_CS_INDEX, (WORD)new_cs); SET_EIP(new_ip); if (CPU_STAT_SS32) { CPU_ESP += ad; } else { - CPU_SP += ad; + CPU_SP += (WORD)ad; } } else { /* Protected mode */ @@ -1143,7 +1143,7 @@ IRET(void) DWORD new_ip; DWORD new_flags; DWORD mask; - WORD new_cs; + DWORD new_cs; CPU_WORKCLOCK(31); if (!CPU_STAT_PM) { @@ -1153,16 +1153,15 @@ 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); + CPU_SET_SEGREG(CPU_CS_INDEX, (WORD)new_cs); SET_EIP(new_ip); } else { /* Protected mode */ @@ -1304,7 +1303,7 @@ ENTER16_IwIb(void) CPU_WORKCLOCK(15); sp = CPU_SP; PUSH0_16(sp); - CPU_BP = sp; + CPU_BP = (WORD)sp; if (!CPU_STAT_SS32) { CPU_SP -= dimsize; } else { @@ -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, (WORD)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, (WORD)val); + } + REGPUSH0_16_32(CPU_BP); + CPU_ESP -= dimsize; } } } @@ -1395,7 +1392,7 @@ ENTER32_IwIb(void) bp -= 4; CPU_ESP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); - cpu_vmemorywrite(CPU_SS_INDEX, CPU_ESP, val); + cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_ESP, val); } REGPUSH0_32(CPU_EBP); 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; + bp = CPU_EBP; } - if (bp < sp) { - ia32_panic("LEAVE16: bp < sp"); - } - 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); }