--- np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/20 16:09:05 1.12 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2004/03/12 13:34:08 1.15 @@ -1,4 +1,4 @@ -/* $Id: ctrl_trans.c,v 1.12 2004/02/20 16:09:05 monaka Exp $ */ +/* $Id: ctrl_trans.c,v 1.15 2004/03/12 13:34:08 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -46,6 +46,7 @@ JMP_Jb(void) CPU_WORKCLOCK(7); GET_PCBYTESD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -56,6 +57,7 @@ JMP_Jw(void) CPU_WORKCLOCK(7); GET_PCWORDS(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -66,6 +68,7 @@ JMP_Jd(void) CPU_WORKCLOCK(7); GET_PCDWORD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -835,6 +838,7 @@ CALL_Aw(void) GET_PCWORDS(ip); PUSH0_16(CPU_IP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -846,6 +850,7 @@ CALL_Ad(void) GET_PCDWORD(ip); PUSH0_32(CPU_EIP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void @@ -1142,12 +1147,29 @@ IRET(void) { UINT32 new_ip; UINT32 new_flags; - UINT32 mask; UINT32 new_cs; +#if !defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) + UINT32 mask; +#endif if (!CPU_STAT_PM) { /* Real mode */ CPU_WORKCLOCK(22); +#if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) + if (!CPU_INST_OP32) { + POP0_16(new_ip); + POP0_16(new_cs); + POP0_16(new_flags); + CPU_FLAG = new_flags & ALL_FLAG; + } else { + POP0_32(new_ip); + POP0_32(new_cs); + POP0_32(new_flags); + CPU_EFLAG = (new_flags & (ALL_FLAG|RF_FLAG|AC_FLAG|ID_FLAG)) | (CPU_EFLAG & (VM_FLAG|VIF_FLAG|VIP_FLAG)); + } + CPU_OV = CPU_FLAG & O_FLAG; + CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); +#else mask = I_FLAG|IOPL_FLAG; if (!CPU_INST_OP32) { POP0_16(new_ip); @@ -1159,7 +1181,9 @@ IRET(void) POP0_32(new_flags); mask |= RF_FLAG; } + set_eflags(new_flags, mask); +#endif CPU_SET_SEGREG(CPU_CS_INDEX, (UINT16)new_cs); SET_EIP(new_ip); @@ -1167,6 +1191,11 @@ IRET(void) /* Protected mode */ IRET_pm(); } +#if defined(IA32_SUPPORT_DEBUG_REGISTER) + if (CPU_EFLAG & RF_FLAG) { + CPU_STAT_BP_EVENT |= CPU_STAT_BP_EVENT_RF; + } +#endif IRQCHECKTERM(); } @@ -1285,7 +1314,7 @@ ENTER16_IwIb(void) } else { sp = CPU_ESP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_16(CPU_BP); @@ -1359,7 +1388,7 @@ ENTER32_IwIb(void) } else { sp = CPU_SP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_32(CPU_EBP); @@ -1416,10 +1445,16 @@ void LEAVE(void) { UINT32 sp, bp; + UINT s; CPU_WORKCLOCK(4); if (CPU_STAT_PM) { + if (!CPU_INST_OP32) { + s = 2; + } else { + s = 4; + } if (!CPU_STAT_SS32) { sp = CPU_SP; bp = CPU_BP; @@ -1427,7 +1462,7 @@ LEAVE(void) sp = CPU_ESP; bp = CPU_EBP; } - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp-sp) + 2); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + s); } if (!CPU_STAT_SS32) {