--- np2/i386c/ia32/instructions/data_trans.c 2004/03/12 13:34:08 1.13 +++ np2/i386c/ia32/instructions/data_trans.c 2008/03/22 04:03:08 1.19 @@ -1,4 +1,4 @@ -/* $Id: data_trans.c,v 1.13 2004/03/12 13:34:08 monaka Exp $ */ +/* $Id: data_trans.c,v 1.19 2008/03/22 04:03:08 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -12,8 +12,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -153,7 +151,6 @@ MOV_EdSw(void) } else { CPU_WORKCLOCK(3); madr = calc_ea_dst(op); - // LSB only... cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)src); } return; @@ -178,7 +175,7 @@ MOV_SwEw(void) madr = calc_ea_dst(op); src = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } - CPU_SET_SEGREG(idx, (UINT16)src); + LOAD_SEGREG(idx, (UINT16)src); if (idx == CPU_SS_INDEX) { exec_1step(); } @@ -196,11 +193,10 @@ MOV_ALOb(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - CPU_AL = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); } else { GET_PCDWORD(madr); - CPU_AL = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); } + CPU_AL = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); } void @@ -212,11 +208,10 @@ MOV_AXOw(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - CPU_AX = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } else { GET_PCDWORD(madr); - CPU_AX = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } + CPU_AX = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } void @@ -228,11 +223,10 @@ MOV_EAXOd(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - CPU_EAX = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } else { GET_PCDWORD(madr); - CPU_EAX = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } + CPU_EAX = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } void @@ -244,11 +238,10 @@ MOV_ObAL(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, CPU_AL); } else { GET_PCDWORD(madr); - cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, CPU_AL); } + cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, CPU_AL); } void @@ -260,11 +253,10 @@ MOV_OwAX(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, CPU_AX); } else { GET_PCDWORD(madr); - cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, CPU_AX); } + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, CPU_AX); } void @@ -276,11 +268,10 @@ MOV_OdEAX(void) CPU_INST_SEGREG_INDEX = DS_FIX; if (!CPU_INST_AS32) { GET_PCWORD(madr); - cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, CPU_EAX); } else { GET_PCDWORD(madr); - cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, CPU_EAX); } + cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, CPU_EAX); } void @@ -374,7 +365,7 @@ CMOVO_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_OV) { + if (CC_O) { *out = (UINT16)src; } } @@ -386,7 +377,7 @@ CMOVO_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_OV) { + if (CC_O) { *out = src; } } @@ -398,7 +389,7 @@ CMOVNO_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!CPU_OV) { + if (CC_NO) { *out = (UINT16)src; } } @@ -410,7 +401,7 @@ CMOVNO_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!CPU_OV) { + if (CC_NO) { *out = src; } } @@ -422,7 +413,7 @@ CMOVC_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { *out = (UINT16)src; } } @@ -434,7 +425,7 @@ CMOVC_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { *out = src; } } @@ -446,7 +437,7 @@ CMOVNC_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { *out = (UINT16)src; } } @@ -458,7 +449,7 @@ CMOVNC_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { *out = src; } } @@ -470,7 +461,7 @@ CMOVZ_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { *out = (UINT16)src; } } @@ -482,7 +473,7 @@ CMOVZ_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { *out = src; } } @@ -494,7 +485,7 @@ CMOVNZ_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { *out = (UINT16)src; } } @@ -506,7 +497,7 @@ CMOVNZ_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { *out = src; } } @@ -518,7 +509,7 @@ CMOVA_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { *out = (UINT16)src; } } @@ -530,7 +521,7 @@ CMOVA_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { *out = src; } } @@ -542,7 +533,7 @@ CMOVNA_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { *out = (UINT16)src; } } @@ -554,7 +545,7 @@ CMOVNA_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { *out = src; } } @@ -566,7 +557,7 @@ CMOVS_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { *out = (UINT16)src; } } @@ -578,7 +569,7 @@ CMOVS_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { *out = src; } } @@ -590,7 +581,7 @@ CMOVNS_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { *out = (UINT16)src; } } @@ -602,7 +593,7 @@ CMOVNS_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { *out = src; } } @@ -614,7 +605,7 @@ CMOVP_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { *out = (UINT16)src; } } @@ -626,7 +617,7 @@ CMOVP_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { *out = src; } } @@ -638,7 +629,7 @@ CMOVNP_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { *out = (UINT16)src; } } @@ -650,7 +641,7 @@ CMOVNP_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { *out = src; } } @@ -662,7 +653,7 @@ CMOVL_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if ((!CPU_OV) != (!(CPU_FLAGL & S_FLAG))) { + if (CC_L) { *out = (UINT16)src; } } @@ -674,7 +665,7 @@ CMOVL_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if ((!CPU_OV) != (!(CPU_FLAGL & S_FLAG))) { + if (CC_L) { *out = src; } } @@ -686,7 +677,7 @@ CMOVNL_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if ((!CPU_OV) == (!(CPU_FLAGL & S_FLAG))) { + if (CC_NL) { *out = (UINT16)src; } } @@ -698,7 +689,7 @@ CMOVNL_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if ((!CPU_OV) == (!(CPU_FLAGL & S_FLAG))) { + if (CC_NL) { *out = src; } } @@ -710,7 +701,7 @@ CMOVLE_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { *out = (UINT16)src; } } @@ -722,7 +713,7 @@ CMOVLE_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { *out = src; } } @@ -734,7 +725,7 @@ CMOVNLE_GwEw(void) UINT32 op, src; PREPART_REG16_EA(op, src, out, 2, 5); - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { *out = (UINT16)src; } } @@ -746,7 +737,7 @@ CMOVNLE_GdEd(void) UINT32 op, src; PREPART_REG32_EA(op, src, out, 2, 5); - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { *out = src; } } @@ -754,12 +745,19 @@ CMOVNLE_GdEd(void) /* * XCHG */ +static UINT32 +XCHG(UINT32 dst, void *arg) +{ + UINT32 src = PTR_TO_UINT32(arg); + (void)dst; + return src; +} + void XCHG_EbGb(void) { UINT8 *out, *src; UINT32 op, madr; - UINT8 tmp; PREPART_EA_REG8P(op, src); if (op >= 0xc0) { @@ -769,9 +767,7 @@ XCHG_EbGb(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - tmp = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); - cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, *src); - *src = tmp; + *src = (UINT8)cpu_memory_access_va_RMW(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -780,7 +776,6 @@ XCHG_EwGw(void) { UINT16 *out, *src; UINT32 op, madr; - UINT16 tmp; PREPART_EA_REG16P(op, src); if (op >= 0xc0) { @@ -790,9 +785,7 @@ XCHG_EwGw(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - tmp = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); - cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, *src); - *src = tmp; + *src = (UINT16)cpu_memory_access_va_RMW_w(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -801,7 +794,6 @@ XCHG_EdGd(void) { UINT32 *out, *src; UINT32 op, madr; - UINT32 tmp; PREPART_EA_REG32P(op, src); if (op >= 0xc0) { @@ -811,9 +803,7 @@ XCHG_EdGd(void) } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); - tmp = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, *src); - *src = tmp; + *src = cpu_memory_access_va_RMW_d(CPU_INST_SEGREG_INDEX, madr, XCHG, UINT32_TO_PTR(*src)); } } @@ -838,33 +828,16 @@ void XCHG_EDIEAX(void) { CPU_WORKCLOCK(3 /* * BSWAP */ -#if defined(bswap32) && !defined(IA32_USE_ASM_BSWAP) -#define BSWAP_DWORD(v) bswap32(v) -#else /* !bswap32 || IA32_USE_ASM_BSWAP */ -INLINE static UINT32 +static INLINE UINT32 BSWAP_DWORD(UINT32 val) { -#if defined(__GNUC__) && (defined(i386) || defined(__i386__)) - __asm__ __volatile__ ( -#if defined(IA32_USE_ASM_BSWAP) - "bswap %0" -#else /* !IA32_USE_ASM_BSWAP */ - "rorw $8, %w1\n\t" - "rorl $16, %1\n\t" - "rorw $8, %w1\n\t" -#endif /* IA32_USE_ASM_BSWAP */ - : "=r" (val) : "0" (val)); - return val; -#else /* !(__GNUC__ && (i386 || __i386__)) */ UINT32 v; v = (val & 0x000000ff) << 24; v |= (val & 0x0000ff00) << 8; v |= (val & 0x00ff0000) >> 8; v |= (val & 0xff000000) >> 24; return v; -#endif /* __GNUC__ && (i386 || __i386__) */ } -#endif /* bswap32 && !IA32_USE_ASM_BSWAP */ void BSWAP_EAX(void) { CPU_WORKCLOCK(2); CPU_EAX = BSWAP_DWORD(CPU_EAX); } void BSWAP_ECX(void) { CPU_WORKCLOCK(2); CPU_ECX = BSWAP_DWORD(CPU_ECX); } @@ -878,6 +851,33 @@ void BSWAP_EDI(void) { CPU_WORKCLOCK(2); /* * XADD */ +static UINT32 +XADD1(UINT32 dst, void *arg) +{ + UINT32 src = PTR_TO_UINT32(arg); + UINT32 res; + BYTE_ADD(res, dst, src); + return res; +} + +static UINT32 +XADD2(UINT32 dst, void *arg) +{ + UINT32 src = PTR_TO_UINT32(arg); + UINT32 res; + WORD_ADD(res, dst, src); + return res; +} + +static UINT32 +XADD4(UINT32 dst, void *arg) +{ + UINT32 src = PTR_TO_UINT32(arg); + UINT32 res; + DWORD_ADD(res, dst, src); + return res; +} + void XADD_EbGb(void) { @@ -889,16 +889,13 @@ XADD_EbGb(void) CPU_WORKCLOCK(2); out = reg8_b20[op]; dst = *out; - ADD_BYTE(res, dst, *src); + BYTE_ADD(res, dst, *src); *src = (UINT8)dst; *out = (UINT8)res; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); - ADD_BYTE(res, dst, *src); - *src = (UINT8)dst; - cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (UINT8)res); + *src = (UINT8)cpu_memory_access_va_RMW(CPU_INST_SEGREG_INDEX, madr, XADD1, UINT32_TO_PTR(*src)); } } @@ -913,16 +910,13 @@ XADD_EwGw(void) CPU_WORKCLOCK(2); out = reg16_b20[op]; dst = *out; - ADD_WORD(res, dst, *src); + WORD_ADD(res, dst, *src); *src = (UINT16)dst; *out = (UINT16)res; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); - ADD_WORD(res, dst, *src); - *src = (UINT16)dst; - cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)res); + *src = (UINT16)cpu_memory_access_va_RMW_w(CPU_INST_SEGREG_INDEX, madr, XADD2, UINT32_TO_PTR(*src)); } } @@ -937,135 +931,46 @@ XADD_EdGd(void) CPU_WORKCLOCK(2); out = reg32_b20[op]; dst = *out; - ADD_DWORD(res, dst, *src); + DWORD_ADD(res, dst, *src); *src = dst; *out = res; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); - dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - ADD_DWORD(res, dst, *src); - *src = dst; - cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, res); + *src = cpu_memory_access_va_RMW_d(CPU_INST_SEGREG_INDEX, madr, XADD4, UINT32_TO_PTR(*src)); } } /* * CMPXCHG */ -#if 1 -void -CMPXCHG_EbGb(void) -{ - UINT8 *out; - UINT32 op, src, dst, madr, tmp; - - PREPART_EA_REG8(op, src); - if (op >= 0xc0) { - out = reg8_b20[op]; - dst = *out; - BYTE_SUB(tmp, CPU_AL, dst); - if (CPU_FLAGL & Z_FLAG) { - *out = (UINT8)src; - } else { - CPU_AL = (UINT8)dst; - } - } else { - madr = calc_ea_dst(op); - dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); - BYTE_SUB(tmp, CPU_AL, dst); - if (CPU_FLAGL & Z_FLAG) { - cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (UINT8)src); - } else { - CPU_AL = (UINT8)dst; - } - } -} - -void -CMPXCHG_EwGw(void) -{ - UINT16 *out; - UINT32 op, src, dst, madr, tmp; - - PREPART_EA_REG16(op, src); - if (op >= 0xc0) { - out = reg16_b20[op]; - dst = *out; - WORD_SUB(tmp, CPU_AX, dst); - if (CPU_FLAGL & Z_FLAG) { - *out = (UINT16)src; - } else { - CPU_AX = (UINT16)dst; - } - } else { - madr = calc_ea_dst(op); - dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); - WORD_SUB(tmp, CPU_AX, dst); - if (CPU_FLAGL & Z_FLAG) { - cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)src); - } else { - CPU_AX = (UINT16)dst; - } - } -} - -void -CMPXCHG_EdGd(void) -{ - UINT32 *out; - UINT32 op, src, dst, madr, tmp; - - PREPART_EA_REG32(op, src); - if (op >= 0xc0) { - out = reg32_b20[op]; - dst = *out; - DWORD_SUB(tmp, CPU_EAX, dst); - if (CPU_FLAGL & Z_FLAG) { - *out = src; - } else { - CPU_EAX = dst; - } - } else { - madr = calc_ea_dst(op); - dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - DWORD_SUB(tmp, CPU_EAX, dst); - if (CPU_FLAGL & Z_FLAG) { - cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); - } else { - CPU_EAX = dst; - } - } -} -#else void CMPXCHG_EbGb(void) { UINT8 *out; UINT32 op, src, dst, madr, tmp; + UINT8 al; PREPART_EA_REG8(op, src); + al = CPU_AL; if (op >= 0xc0) { out = reg8_b20[op]; dst = *out; - if (CPU_AL == dst) { - CPU_FLAGL |= Z_FLAG; + if (al == dst) { *out = (UINT8)src; } else { - CPU_FLAGL &= ~Z_FLAG; CPU_AL = (UINT8)dst; } } else { madr = calc_ea_dst(op); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); - if (CPU_AL == dst) { - CPU_FLAGL |= Z_FLAG; + if (al == dst) { cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (UINT8)src); } else { - CPU_FLAGL &= ~Z_FLAG; CPU_AL = (UINT8)dst; } } + BYTE_SUB(tmp, al, dst); } void @@ -1073,29 +978,28 @@ CMPXCHG_EwGw(void) { UINT16 *out; UINT32 op, src, dst, madr, tmp; + UINT16 ax; PREPART_EA_REG16(op, src); + ax = CPU_AX; if (op >= 0xc0) { out = reg16_b20[op]; dst = *out; - if (CPU_AX == dst) { - CPU_FLAGL |= Z_FLAG; + if (ax == dst) { *out = (UINT16)src; } else { - CPU_FLAGL &= ~Z_FLAG; CPU_AX = (UINT16)dst; } } else { madr = calc_ea_dst(op); dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); - if (CPU_AX == dst) { - CPU_FLAGL |= Z_FLAG; + if (ax == dst) { cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)src); } else { - CPU_FLAGL &= ~Z_FLAG; CPU_AX = (UINT16)dst; } } + WORD_SUB(tmp, ax, dst); } void @@ -1103,31 +1007,29 @@ CMPXCHG_EdGd(void) { UINT32 *out; UINT32 op, src, dst, madr, tmp; + UINT32 eax; PREPART_EA_REG32(op, src); + eax = CPU_EAX; if (op >= 0xc0) { out = reg32_b20[op]; dst = *out; - if (CPU_EAX == dst) { - CPU_FLAGL |= Z_FLAG; + if (eax == dst) { *out = src; } else { - CPU_FLAGL &= ~Z_FLAG; CPU_EAX = dst; } } else { madr = calc_ea_dst(op); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - if (CPU_EAX == dst) { - CPU_FLAGL |= Z_FLAG; + if (eax == dst) { cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); } else { - CPU_FLAGL &= ~Z_FLAG; CPU_EAX = dst; } } + DWORD_SUB(tmp, eax, dst); } -#endif void CMPXCHG8B(UINT32 op) @@ -1182,13 +1084,12 @@ PUSH_Ew(UINT32 op) if (op >= 0xc0) { CPU_WORKCLOCK(2); dst = *(reg16_b20[op]); - PUSH0_16(dst); } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); - PUSH0_16(dst); } + PUSH0_16(dst); } void @@ -1199,13 +1100,12 @@ PUSH_Ed(UINT32 op) if (op >= 0xc0) { CPU_WORKCLOCK(2); dst = *(reg32_b20[op]); - PUSH0_32(dst); } else { CPU_WORKCLOCK(5); madr = calc_ea_dst(op); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - PUSH0_32(dst); } + PUSH0_32(dst); } void @@ -1350,7 +1250,7 @@ POP16_ES(void) CPU_WORKCLOCK(5); POP0_16(src); - CPU_SET_SEGREG(CPU_ES_INDEX, src); + LOAD_SEGREG(CPU_ES_INDEX, src); } void @@ -1361,7 +1261,7 @@ POP32_ES(void) CPU_WORKCLOCK(5); POP0_32(src); - CPU_SET_SEGREG(CPU_ES_INDEX, (UINT16)src); + LOAD_SEGREG(CPU_ES_INDEX, (UINT16)src); } void @@ -1372,7 +1272,7 @@ POP16_SS(void) CPU_WORKCLOCK(5); POP0_16(src); - CPU_SET_SEGREG(CPU_SS_INDEX, src); + LOAD_SEGREG(CPU_SS_INDEX, src); exec_1step(); } @@ -1384,7 +1284,7 @@ POP32_SS(void) CPU_WORKCLOCK(5); POP0_32(src); - CPU_SET_SEGREG(CPU_SS_INDEX, (UINT16)src); + LOAD_SEGREG(CPU_SS_INDEX, (UINT16)src); exec_1step(); } @@ -1396,7 +1296,7 @@ POP16_DS(void) CPU_WORKCLOCK(5); POP0_16(src); - CPU_SET_SEGREG(CPU_DS_INDEX, src); + LOAD_SEGREG(CPU_DS_INDEX, src); } void @@ -1407,7 +1307,7 @@ POP32_DS(void) CPU_WORKCLOCK(5); POP0_32(src); - CPU_SET_SEGREG(CPU_DS_INDEX, (UINT16)src); + LOAD_SEGREG(CPU_DS_INDEX, (UINT16)src); } void @@ -1418,7 +1318,7 @@ POP16_FS(void) CPU_WORKCLOCK(5); POP0_16(src); - CPU_SET_SEGREG(CPU_FS_INDEX, src); + LOAD_SEGREG(CPU_FS_INDEX, src); } void @@ -1429,7 +1329,7 @@ POP32_FS(void) CPU_WORKCLOCK(5); POP0_32(src); - CPU_SET_SEGREG(CPU_FS_INDEX, (UINT16)src); + LOAD_SEGREG(CPU_FS_INDEX, (UINT16)src); } void @@ -1440,7 +1340,7 @@ POP16_GS(void) CPU_WORKCLOCK(5); POP0_16(src); - CPU_SET_SEGREG(CPU_GS_INDEX, src); + LOAD_SEGREG(CPU_GS_INDEX, src); } void @@ -1451,7 +1351,7 @@ POP32_GS(void) CPU_WORKCLOCK(5); POP0_32(src); - CPU_SET_SEGREG(CPU_GS_INDEX, (UINT16)src); + LOAD_SEGREG(CPU_GS_INDEX, (UINT16)src); } /* @@ -1464,9 +1364,7 @@ PUSHA(void) CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { - if (CPU_STAT_PM) { - STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); - } + SS_PUSH_CHECK(CPU_SP, 16); REGPUSH0(CPU_AX); REGPUSH0(CPU_CX); REGPUSH0(CPU_DX); @@ -1476,9 +1374,7 @@ PUSHA(void) REGPUSH0(CPU_SI); REGPUSH0(CPU_DI); } else { - if (CPU_STAT_PM) { - STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); - } + SS_PUSH_CHECK(CPU_ESP, 16); REGPUSH0_16_32(CPU_AX); REGPUSH0_16_32(CPU_CX); REGPUSH0_16_32(CPU_DX); @@ -1497,9 +1393,7 @@ PUSHAD(void) CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { - if (CPU_STAT_PM) { - STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); - } + SS_PUSH_CHECK(CPU_SP, 32); REGPUSH0_32_16(CPU_EAX); REGPUSH0_32_16(CPU_ECX); REGPUSH0_32_16(CPU_EDX); @@ -1509,9 +1403,7 @@ PUSHAD(void) REGPUSH0_32_16(CPU_ESI); REGPUSH0_32_16(CPU_EDI); } else { - if (CPU_STAT_PM) { - STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); - } + SS_PUSH_CHECK(CPU_ESP, 32); REGPUSH0_32(CPU_EAX); REGPUSH0_32(CPU_ECX); REGPUSH0_32(CPU_EDX); @@ -1529,9 +1421,7 @@ POPA(void) CPU_WORKCLOCK(19); if (!CPU_STAT_SS32) { - if (CPU_STAT_PM) { - STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); - } + SS_POP_CHECK(CPU_SP, 16); REGPOP0(CPU_DI); REGPOP0(CPU_SI); REGPOP0(CPU_BP); @@ -1541,9 +1431,7 @@ POPA(void) REGPOP0(CPU_CX); REGPOP0(CPU_AX); } else { - if (CPU_STAT_PM) { - STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); - } + SS_POP_CHECK(CPU_ESP, 16); REGPOP0_16_32(CPU_DI); REGPOP0_16_32(CPU_SI); REGPOP0_16_32(CPU_BP); @@ -1561,9 +1449,7 @@ POPAD(void) CPU_WORKCLOCK(19); if (!CPU_STAT_SS32) { - if (CPU_STAT_PM) { - STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); - } + SS_POP_CHECK(CPU_SP, 32); REGPOP0_32_16(CPU_EDI); REGPOP0_32_16(CPU_ESI); REGPOP0_32_16(CPU_EBP); @@ -1573,9 +1459,7 @@ POPAD(void) REGPOP0_32_16(CPU_ECX); REGPOP0_32_16(CPU_EAX); } else { - if (CPU_STAT_PM) { - STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); - } + SS_POP_CHECK(CPU_ESP, 32); REGPOP0_32(CPU_EDI); REGPOP0_32(CPU_ESI); REGPOP0_32(CPU_EBP);