--- np2/i386c/ia32/instructions/data_trans.c 2004/03/07 23:04:51 1.9 +++ np2/i386c/ia32/instructions/data_trans.c 2004/03/22 14:22:26 1.14 @@ -1,4 +1,4 @@ -/* $Id: data_trans.c,v 1.9 2004/03/07 23:04:51 yui Exp $ */ +/* $Id: data_trans.c,v 1.14 2004/03/22 14:22:26 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -374,7 +374,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 +386,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 +398,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 +410,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 +422,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 +434,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 +446,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 +458,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 +470,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 +482,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 +494,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 +506,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 +518,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 +530,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 +542,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 +554,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 +566,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 +578,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 +590,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 +602,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 +614,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 +626,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 +638,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 +650,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 +662,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 +674,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 +686,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 +698,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 +710,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 +722,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 +734,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 +746,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; } } @@ -953,6 +953,7 @@ XADD_EdGd(void) /* * CMPXCHG */ +#if 1 void CMPXCHG_EbGb(void) { @@ -1019,7 +1020,7 @@ CMPXCHG_EdGd(void) if (op >= 0xc0) { out = reg32_b20[op]; dst = *out; - WORD_SUB(tmp, CPU_EAX, dst); + DWORD_SUB(tmp, CPU_EAX, dst); if (CPU_FLAGL & Z_FLAG) { *out = src; } else { @@ -1028,7 +1029,7 @@ CMPXCHG_EdGd(void) } else { madr = calc_ea_dst(op); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); - DWORD_SUB(tmp, CPU_AX, dst); + DWORD_SUB(tmp, CPU_EAX, dst); if (CPU_FLAGL & Z_FLAG) { cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); } else { @@ -1036,6 +1037,97 @@ CMPXCHG_EdGd(void) } } } +#else +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; + if (CPU_AL == dst) { + CPU_FLAGL |= Z_FLAG; + *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; + cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (UINT8)src); + } else { + CPU_FLAGL &= ~Z_FLAG; + 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; + if (CPU_AX == dst) { + CPU_FLAGL |= Z_FLAG; + *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; + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)src); + } else { + CPU_FLAGL &= ~Z_FLAG; + 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; + if (CPU_EAX == dst) { + CPU_FLAGL |= Z_FLAG; + *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; + cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, src); + } else { + CPU_FLAGL &= ~Z_FLAG; + CPU_EAX = dst; + } + } +} +#endif void CMPXCHG8B(UINT32 op) @@ -1373,7 +1465,7 @@ PUSHA(void) CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); } REGPUSH0(CPU_AX); REGPUSH0(CPU_CX); @@ -1385,7 +1477,7 @@ PUSHA(void) REGPUSH0(CPU_DI); } else { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); } REGPUSH0_16_32(CPU_AX); REGPUSH0_16_32(CPU_CX); @@ -1406,7 +1498,7 @@ PUSHAD(void) CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); } REGPUSH0_32_16(CPU_EAX); REGPUSH0_32_16(CPU_ECX); @@ -1418,7 +1510,7 @@ PUSHAD(void) REGPUSH0_32_16(CPU_EDI); } else { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); } REGPUSH0_32(CPU_EAX); REGPUSH0_32(CPU_ECX); @@ -1438,7 +1530,7 @@ POPA(void) CPU_WORKCLOCK(19); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); } REGPOP0(CPU_DI); REGPOP0(CPU_SI); @@ -1450,7 +1542,7 @@ POPA(void) REGPOP0(CPU_AX); } else { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); } REGPOP0_16_32(CPU_DI); REGPOP0_16_32(CPU_SI); @@ -1470,7 +1562,7 @@ POPAD(void) CPU_WORKCLOCK(19); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); } REGPOP0_32_16(CPU_EDI); REGPOP0_32_16(CPU_ESI); @@ -1482,7 +1574,7 @@ POPAD(void) REGPOP0_32_16(CPU_EAX); } else { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); } REGPOP0_32(CPU_EDI); REGPOP0_32(CPU_ESI);