--- np2/i386c/ia32/instructions/bin_arith.c 2003/12/08 00:55:32 1.1 +++ np2/i386c/ia32/instructions/bin_arith.c 2004/01/15 15:50:33 1.5 @@ -1,4 +1,4 @@ -/* $Id: bin_arith.c,v 1.1 2003/12/08 00:55:32 yui Exp $ */ +/* $Id: bin_arith.c,v 1.5 2004/01/15 15:50:33 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -136,7 +136,7 @@ ADD_GdEd(void) PREPART_REG32_EA(op, src, out, 2, 7); dst = *out; ADDDWORD(res, dst, src); - *out = (DWORD)res; + *out = res; } void @@ -176,22 +176,20 @@ ADD_EAXId(void) } void -ADD_EbIb(BYTE *regp) +ADD_EbIb(BYTE *regp, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = *regp; ADDBYTE(res, dst, src); *regp = (BYTE)res; } void -ADD_EbIb_ext(DWORD madr) +ADD_EbIb_ext(DWORD madr, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); ADDBYTE(res, dst, src); cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (BYTE)res); @@ -291,7 +289,7 @@ ADC_EdGd(void) DWORD *out; DWORD op, src, dst, res, madr; - PREPART_EA_REG16(op, src); + PREPART_EA_REG32(op, src); if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg32_b20[op]; @@ -380,22 +378,20 @@ ADC_EAXId(void) } void -ADC_EbIb(BYTE *regp) +ADC_EbIb(BYTE *regp, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = *regp; ADCBYTE(res, dst, src); *regp = (BYTE)res; } void -ADC_EbIb_ext(DWORD madr) +ADC_EbIb_ext(DWORD madr, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); ADCBYTE(res, dst, src); cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (BYTE)res); @@ -584,22 +580,20 @@ SUB_EAXId(void) } void -SUB_EbIb(BYTE *regp) +SUB_EbIb(BYTE *regp, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = *regp; BYTE_SUB(res, dst, src); *regp = (BYTE)res; } void -SUB_EbIb_ext(DWORD madr) +SUB_EbIb_ext(DWORD madr, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); BYTE_SUB(res, dst, src); cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (BYTE)res); @@ -788,22 +782,20 @@ SBB_EAXId(void) } void -SBB_EbIb(BYTE *regp) +SBB_EbIb(BYTE *regp, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = *regp; BYTE_SBB(res, dst, src); *regp = (BYTE)res; } void -SBB_EbIb_ext(DWORD madr) +SBB_EbIb_ext(DWORD madr, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); BYTE_SBB(res, dst, src); cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, (BYTE)res); @@ -1108,7 +1100,7 @@ IDIV_AXEw(DWORD op) madr = calc_ea_dst(op); src = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } - tmp = (SDWORD)(((DWORD)CPU_DX << 16) + CPU_AX); + tmp = (SDWORD)(((DWORD)CPU_DX << 16) + (DWORD)CPU_AX); if (src != 0) { r = tmp / src; if (((r + 0x8000) & 0xffff0000) == 0) { @@ -1135,10 +1127,10 @@ IDIV_EAXEd(DWORD op) madr = calc_ea_dst(op); src = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } - tmp = (SQWORD)(((QWORD)CPU_EDX << 32) + CPU_EAX); + tmp = (SQWORD)(((QWORD)CPU_EDX << 32) + (SQWORD)CPU_EAX); if (src != 0) { r = tmp / src; - if (((r + 0x80000000) & 0xffffffff00000000ULL) == 0) { + if (((r + 0x80000000LL) & 0xffffffff00000000ULL) == 0) { CPU_EAX = (SDWORD)r; CPU_EDX = tmp % src; return; @@ -1243,7 +1235,9 @@ INC_Eb(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg8_b20[op]; - BYTE_INC(*out); + value = *out; + BYTE_INC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1263,7 +1257,9 @@ INC_Ew(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg16_b20[op]; - WORD_INC(*out); + value = *out; + WORD_INC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1283,7 +1279,9 @@ INC_Ed(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg32_b20[op]; - DWORD_INC(*out); + value = *out; + DWORD_INC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1326,7 +1324,9 @@ DEC_Eb(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg8_b20[op]; - BYTE_DEC(*out); + value = *out; + BYTE_DEC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1346,7 +1346,9 @@ DEC_Ew(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg16_b20[op]; - WORD_DEC(*out); + value = *out; + WORD_DEC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1366,7 +1368,9 @@ DEC_Ed(DWORD op) if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg32_b20[op]; - DWORD_DEC(*out); + value = *out; + DWORD_DEC(value); + *out = value; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); @@ -1558,49 +1562,50 @@ CMP_GdEd(void) void CMP_ALIb(void) { - DWORD src, res; + DWORD src, dst, res; CPU_WORKCLOCK(3); GET_PCBYTE(src); - BYTE_SUB(res, CPU_AL, src); + dst = CPU_AL; + BYTE_SUB(res, dst, src); } void CMP_AXIw(void) { - DWORD src, res; + DWORD src, dst, res; CPU_WORKCLOCK(3); GET_PCWORD(src); - WORD_SUB(res, CPU_AX, src); + dst = CPU_AX; + WORD_SUB(res, dst, src); } void CMP_EAXId(void) { - DWORD src, res; + DWORD src, dst, res; CPU_WORKCLOCK(3); GET_PCDWORD(src); - DWORD_SUB(res, CPU_EAX, src); + dst = CPU_EAX; + DWORD_SUB(res, dst, src); } void -CMP_EbIb(BYTE *regp) +CMP_EbIb(BYTE *regp, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = *regp; BYTE_SUB(res, dst, src); } void -CMP_EbIb_ext(DWORD madr) +CMP_EbIb_ext(DWORD madr, DWORD src) { - DWORD src, dst, res; + DWORD dst, res; - GET_PCBYTE(src); dst = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); BYTE_SUB(res, dst, src); }