--- np2/i386c/ia32/instructions/data_trans.c 2008/03/22 04:03:08 1.19 +++ np2/i386c/ia32/instructions/data_trans.c 2012/01/31 22:06:24 1.24 @@ -1,5 +1,3 @@ -/* $Id: data_trans.c,v 1.19 2008/03/22 04:03:08 monaka Exp $ */ - /* * Copyright (c) 2003 NONAKA Kimihiro * All rights reserved. @@ -745,7 +743,7 @@ CMOVNLE_GdEd(void) /* * XCHG */ -static UINT32 +static UINT32 CPUCALL XCHG(UINT32 dst, void *arg) { UINT32 src = PTR_TO_UINT32(arg); @@ -767,7 +765,7 @@ XCHG_EbGb(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - *src = (UINT8)cpu_memory_access_va_RMW(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); + *src = (UINT8)cpu_vmemory_RMW_b(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -785,7 +783,7 @@ XCHG_EwGw(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - *src = (UINT16)cpu_memory_access_va_RMW_w(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); + *src = (UINT16)cpu_vmemory_RMW_w(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -803,7 +801,7 @@ XCHG_EdGd(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - *src = cpu_memory_access_va_RMW_d(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); + *src = cpu_vmemory_RMW_d(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -828,7 +826,7 @@ void XCHG_EDIEAX(void) { CPU_WORKCLOCK(3 /* * BSWAP */ -static INLINE UINT32 +static INLINE UINT32 CPUCALL BSWAP_DWORD(UINT32 val) { UINT32 v; @@ -851,7 +849,7 @@ void BSWAP_EDI(void) { CPU_WORKCLOCK(2); /* * XADD */ -static UINT32 +static UINT32 CPUCALL XADD1(UINT32 dst, void *arg) { UINT32 src = PTR_TO_UINT32(arg); @@ -860,7 +858,7 @@ XADD1(UINT32 dst, void *arg) return res; } -static UINT32 +static UINT32 CPUCALL XADD2(UINT32 dst, void *arg) { UINT32 src = PTR_TO_UINT32(arg); @@ -869,7 +867,7 @@ XADD2(UINT32 dst, void *arg) return res; } -static UINT32 +static UINT32 CPUCALL XADD4(UINT32 dst, void *arg) { UINT32 src = PTR_TO_UINT32(arg); @@ -895,7 +893,7 @@ XADD_EbGb(void) } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - *src = (UINT8)cpu_memory_access_va_RMW(CPU_INST_SEGREG_INDEX, madr, XADD1, UINT32_TO_PTR(*src)); + *src = (UINT8)cpu_vmemory_RMW_b(CPU_INST_SEGREG_INDEX, madr, XADD1, UINT32_TO_PTR(*src)); } } @@ -916,7 +914,7 @@ XADD_EwGw(void) } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - *src = (UINT16)cpu_memory_access_va_RMW_w(CPU_INST_SEGREG_INDEX, madr, XADD2, UINT32_TO_PTR(*src)); + *src = (UINT16)cpu_vmemory_RMW_w(CPU_INST_SEGREG_INDEX, madr, XADD2, UINT32_TO_PTR(*src)); } } @@ -937,7 +935,7 @@ XADD_EdGd(void) } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - *src = cpu_memory_access_va_RMW_d(CPU_INST_SEGREG_INDEX, madr, XADD4, UINT32_TO_PTR(*src)); + *src = cpu_vmemory_RMW_d(CPU_INST_SEGREG_INDEX, madr, XADD4, UINT32_TO_PTR(*src)); } } @@ -1031,7 +1029,7 @@ CMPXCHG_EdGd(void) DWORD_SUB(tmp, eax, dst); } -void +void CPUCALL CMPXCHG8B(UINT32 op) { UINT32 madr, dst_l, dst_h; @@ -1076,7 +1074,7 @@ void PUSH_EBP(void) { CPU_WORKCLOCK(3); void PUSH_ESI(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_ESI); } void PUSH_EDI(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_EDI); } -void +void CPUCALL PUSH_Ew(UINT32 op) { UINT32 dst, madr; @@ -1092,7 +1090,7 @@ PUSH_Ew(UINT32 op) PUSH0_16(dst); } -void +void CPUCALL PUSH_Ed(UINT32 op) { UINT32 dst, madr; @@ -1181,6 +1179,7 @@ POP_Ew(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); GET_PCBYTE(op); if (op >= 0xc0) { @@ -1189,9 +1188,10 @@ POP_Ew(void) madr = calc_ea_dst(op); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, src); } + CPU_CLEAR_PREV_ESP(); } -void +void CPUCALL POP_Ew_G5(UINT32 op) { UINT32 madr; @@ -1199,6 +1199,7 @@ POP_Ew_G5(UINT32 op) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); if (op >= 0xc0) { *(reg16_b20[op]) = src; @@ -1206,6 +1207,7 @@ POP_Ew_G5(UINT32 op) madr = calc_ea_dst(op); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, src); } + CPU_CLEAR_PREV_ESP(); } void @@ -1216,6 +1218,7 @@ POP_Ed(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); GET_PCBYTE(op); if (op >= 0xc0) { @@ -1224,15 +1227,17 @@ POP_Ed(void) madr = calc_ea_dst(op); cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); } + CPU_CLEAR_PREV_ESP(); } -void +void CPUCALL POP_Ed_G5(UINT32 op) { UINT32 src, madr; CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); if (op >= 0xc0) { *(reg32_b20[op]) = src; @@ -1240,6 +1245,7 @@ POP_Ed_G5(UINT32 op) madr = calc_ea_dst(op); cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); } + CPU_CLEAR_PREV_ESP(); } void @@ -1249,8 +1255,10 @@ POP16_ES(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); LOAD_SEGREG(CPU_ES_INDEX, src); + CPU_CLEAR_PREV_ESP(); } void @@ -1260,8 +1268,10 @@ POP32_ES(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); LOAD_SEGREG(CPU_ES_INDEX, (UINT16)src); + CPU_CLEAR_PREV_ESP(); } void @@ -1271,8 +1281,10 @@ POP16_SS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); LOAD_SEGREG(CPU_SS_INDEX, src); + CPU_CLEAR_PREV_ESP(); exec_1step(); } @@ -1283,8 +1295,10 @@ POP32_SS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); LOAD_SEGREG(CPU_SS_INDEX, (UINT16)src); + CPU_CLEAR_PREV_ESP(); exec_1step(); } @@ -1295,8 +1309,10 @@ POP16_DS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); LOAD_SEGREG(CPU_DS_INDEX, src); + CPU_CLEAR_PREV_ESP(); } void @@ -1306,8 +1322,10 @@ POP32_DS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); LOAD_SEGREG(CPU_DS_INDEX, (UINT16)src); + CPU_CLEAR_PREV_ESP(); } void @@ -1317,8 +1335,10 @@ POP16_FS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); LOAD_SEGREG(CPU_FS_INDEX, src); + CPU_CLEAR_PREV_ESP(); } void @@ -1328,8 +1348,10 @@ POP32_FS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); LOAD_SEGREG(CPU_FS_INDEX, (UINT16)src); + CPU_CLEAR_PREV_ESP(); } void @@ -1339,8 +1361,10 @@ POP16_GS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_16(src); LOAD_SEGREG(CPU_GS_INDEX, src); + CPU_CLEAR_PREV_ESP(); } void @@ -1350,8 +1374,10 @@ POP32_GS(void) CPU_WORKCLOCK(5); + CPU_SET_PREV_ESP(); POP0_32(src); LOAD_SEGREG(CPU_GS_INDEX, (UINT16)src); + CPU_CLEAR_PREV_ESP(); } /* @@ -1363,8 +1389,8 @@ PUSHA(void) UINT16 sp = CPU_SP; CPU_WORKCLOCK(17); + CPU_SET_PREV_ESP(); if (!CPU_STAT_SS32) { - SS_PUSH_CHECK(CPU_SP, 16); REGPUSH0(CPU_AX); REGPUSH0(CPU_CX); REGPUSH0(CPU_DX); @@ -1374,7 +1400,6 @@ PUSHA(void) REGPUSH0(CPU_SI); REGPUSH0(CPU_DI); } else { - SS_PUSH_CHECK(CPU_ESP, 16); REGPUSH0_16_32(CPU_AX); REGPUSH0_16_32(CPU_CX); REGPUSH0_16_32(CPU_DX); @@ -1384,6 +1409,7 @@ PUSHA(void) REGPUSH0_16_32(CPU_SI); REGPUSH0_16_32(CPU_DI); } + CPU_CLEAR_PREV_ESP(); } void @@ -1392,8 +1418,8 @@ PUSHAD(void) UINT32 esp = CPU_ESP; CPU_WORKCLOCK(17); + CPU_SET_PREV_ESP(); if (!CPU_STAT_SS32) { - SS_PUSH_CHECK(CPU_SP, 32); REGPUSH0_32_16(CPU_EAX); REGPUSH0_32_16(CPU_ECX); REGPUSH0_32_16(CPU_EDX); @@ -1403,7 +1429,6 @@ PUSHAD(void) REGPUSH0_32_16(CPU_ESI); REGPUSH0_32_16(CPU_EDI); } else { - SS_PUSH_CHECK(CPU_ESP, 32); REGPUSH0_32(CPU_EAX); REGPUSH0_32(CPU_ECX); REGPUSH0_32(CPU_EDX); @@ -1413,62 +1438,81 @@ PUSHAD(void) REGPUSH0_32(CPU_ESI); REGPUSH0_32(CPU_EDI); } + CPU_CLEAR_PREV_ESP(); } void POPA(void) { + UINT16 ax, cx, dx, bx, bp, si, di; CPU_WORKCLOCK(19); + CPU_SET_PREV_ESP(); if (!CPU_STAT_SS32) { - SS_POP_CHECK(CPU_SP, 16); - REGPOP0(CPU_DI); - REGPOP0(CPU_SI); - REGPOP0(CPU_BP); + REGPOP0(di); + REGPOP0(si); + REGPOP0(bp); CPU_SP += 2; - REGPOP0(CPU_BX); - REGPOP0(CPU_DX); - REGPOP0(CPU_CX); - REGPOP0(CPU_AX); - } else { - SS_POP_CHECK(CPU_ESP, 16); - REGPOP0_16_32(CPU_DI); - REGPOP0_16_32(CPU_SI); - REGPOP0_16_32(CPU_BP); + REGPOP0(bx); + REGPOP0(dx); + REGPOP0(cx); + REGPOP0(ax); + } else { + REGPOP0_16_32(di); + REGPOP0_16_32(si); + REGPOP0_16_32(bp); CPU_ESP += 2; - REGPOP0_16_32(CPU_BX); - REGPOP0_16_32(CPU_DX); - REGPOP0_16_32(CPU_CX); - REGPOP0_16_32(CPU_AX); - } + REGPOP0_16_32(bx); + REGPOP0_16_32(dx); + REGPOP0_16_32(cx); + REGPOP0_16_32(ax); + } + CPU_CLEAR_PREV_ESP(); + + CPU_AX = ax; + CPU_CX = cx; + CPU_DX = dx; + CPU_BX = bx; + CPU_BP = bp; + CPU_SI = si; + CPU_DI = di; } void POPAD(void) { + UINT32 eax, ecx, edx, ebx, ebp, esi, edi; CPU_WORKCLOCK(19); + CPU_SET_PREV_ESP(); if (!CPU_STAT_SS32) { - SS_POP_CHECK(CPU_SP, 32); - REGPOP0_32_16(CPU_EDI); - REGPOP0_32_16(CPU_ESI); - REGPOP0_32_16(CPU_EBP); + REGPOP0_32_16(edi); + REGPOP0_32_16(esi); + REGPOP0_32_16(ebp); CPU_SP += 4; - REGPOP0_32_16(CPU_EBX); - REGPOP0_32_16(CPU_EDX); - REGPOP0_32_16(CPU_ECX); - REGPOP0_32_16(CPU_EAX); - } else { - SS_POP_CHECK(CPU_ESP, 32); - REGPOP0_32(CPU_EDI); - REGPOP0_32(CPU_ESI); - REGPOP0_32(CPU_EBP); + REGPOP0_32_16(ebx); + REGPOP0_32_16(edx); + REGPOP0_32_16(ecx); + REGPOP0_32_16(eax); + } else { + REGPOP0_32(edi); + REGPOP0_32(esi); + REGPOP0_32(ebp); CPU_ESP += 4; - REGPOP0_32(CPU_EBX); - REGPOP0_32(CPU_EDX); - REGPOP0_32(CPU_ECX); - REGPOP0_32(CPU_EAX); - } + REGPOP0_32(ebx); + REGPOP0_32(edx); + REGPOP0_32(ecx); + REGPOP0_32(eax); + } + CPU_CLEAR_PREV_ESP(); + + CPU_EAX = eax; + CPU_ECX = ecx; + CPU_EDX = edx; + CPU_EBX = ebx; + CPU_EBP = ebp; + CPU_ESI = esi; + CPU_EDI = edi; } /*