--- np2/i386c/ia32/instructions/bin_arith.c 2004/03/23 15:29:34 1.10 +++ np2/i386c/ia32/instructions/bin_arith.c 2011/12/29 13:32:13 1.15 @@ -1,5 +1,3 @@ -/* $Id: bin_arith.c,v 1.10 2004/03/23 15:29:34 monaka Exp $ */ - /* * Copyright (c) 2002-2004 NONAKA Kimihiro * All rights reserved. @@ -12,8 +10,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 @@ -47,7 +43,7 @@ ARITH_INSTRUCTION_3(SBB) /* * IMUL */ -void +void CPUCALL IMUL_ALEb(UINT32 op) { UINT32 madr; @@ -67,7 +63,7 @@ IMUL_ALEb(UINT32 op) CPU_AX = (UINT16)res; } -void +void CPUCALL IMUL_AXEw(UINT32 op) { UINT32 madr; @@ -88,7 +84,7 @@ IMUL_AXEw(UINT32 op) CPU_DX = (UINT16)(res >> 16); } -void +void CPUCALL IMUL_EAXEd(UINT32 op) { UINT32 madr; @@ -197,7 +193,7 @@ IMUL_GdEdId(void) /* * MUL */ -void +void CPUCALL MUL_ALEb(UINT32 op) { UINT32 res, madr; @@ -216,7 +212,7 @@ MUL_ALEb(UINT32 op) CPU_AX = (UINT16)res; } -void +void CPUCALL MUL_AXEw(UINT32 op) { UINT32 res, madr; @@ -236,7 +232,7 @@ MUL_AXEw(UINT32 op) CPU_DX = (UINT16)(res >> 16); } -void +void CPUCALL MUL_EAXEd(UINT32 op) { UINT32 res, madr; @@ -260,7 +256,7 @@ MUL_EAXEd(UINT32 op) /* * IDIV */ -void +void CPUCALL IDIV_ALEb(UINT32 op) { UINT32 madr; @@ -281,13 +277,16 @@ IDIV_ALEb(UINT32 op) if (((r + 0x80) & 0xff00) == 0) { CPU_AL = (SINT8)r; CPU_AH = tmp % src; +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } EXCEPTION(DE_EXCEPTION, 0); } -void +void CPUCALL IDIV_AXEw(UINT32 op) { SINT32 tmp, r; @@ -308,13 +307,16 @@ IDIV_AXEw(UINT32 op) if (((r + 0x8000) & 0xffff0000) == 0) { CPU_AX = (SINT16)r; CPU_DX = tmp % src; +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } EXCEPTION(DE_EXCEPTION, 0); } -void +void CPUCALL IDIV_EAXEd(UINT32 op) { SINT64 tmp, r; @@ -335,6 +337,9 @@ IDIV_EAXEd(UINT32 op) if (((r + SQWORD_CONST(0x80000000)) & QWORD_CONST(0xffffffff00000000)) == 0) { CPU_EAX = (SINT32)r; CPU_EDX = (SINT32)(tmp % src); +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } @@ -345,7 +350,7 @@ IDIV_EAXEd(UINT32 op) /* * DIV */ -void +void CPUCALL DIV_ALEb(UINT32 op) { UINT32 madr; @@ -365,13 +370,16 @@ DIV_ALEb(UINT32 op) if (tmp < ((UINT16)src << 8)) { CPU_AL = tmp / src; CPU_AH = tmp % src; +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } EXCEPTION(DE_EXCEPTION, 0); } -void +void CPUCALL DIV_AXEw(UINT32 op) { UINT32 madr; @@ -391,13 +399,16 @@ DIV_AXEw(UINT32 op) if (tmp < ((UINT32)src << 16)) { CPU_AX = (UINT16)(tmp / src); CPU_DX = (UINT16)(tmp % src); +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } EXCEPTION(DE_EXCEPTION, 0); } -void +void CPUCALL DIV_EAXEd(UINT32 op) { UINT32 madr; @@ -417,6 +428,9 @@ DIV_EAXEd(UINT32 op) if (tmp < ((UINT64)src << 32)) { CPU_EAX = (UINT32)(tmp / src); CPU_EDX = (UINT32)(tmp % src); +#if (CPU_FAMILY == 4) + CPU_FLAGL ^= A_FLAG; +#endif return; } } @@ -476,34 +490,31 @@ void DEC_EDI(void) { DWORD_DEC(CPU_EDI); /* * NEG */ -static UINT32 +static UINT32 CPUCALL NEG1(UINT32 src, void *arg) { UINT32 dst; - (void)arg; BYTE_NEG(dst, src); return dst; } -static UINT32 +static UINT32 CPUCALL NEG2(UINT32 src, void *arg) { UINT32 dst; - (void)arg; WORD_NEG(dst, src); return dst; } -static UINT32 +static UINT32 CPUCALL NEG4(UINT32 src, void *arg) { UINT32 dst; - (void)arg; DWORD_NEG(dst, src); return dst; } -void +void CPUCALL NEG_Eb(UINT32 op) { UINT8 *out; @@ -522,7 +533,7 @@ NEG_Eb(UINT32 op) } } -void +void CPUCALL NEG_Ew(UINT32 op) { UINT16 *out; @@ -541,7 +552,7 @@ NEG_Ew(UINT32 op) } } -void +void CPUCALL NEG_Ed(UINT32 op) { UINT32 *out; @@ -687,7 +698,7 @@ CMP_EAXId(void) DWORD_SUB(res, dst, src); } -void +void CPUCALL CMP_EbIb(UINT8 *regp, UINT32 src) { UINT32 dst, res; @@ -696,7 +707,7 @@ CMP_EbIb(UINT8 *regp, UINT32 src) BYTE_SUB(res, dst, src); } -void +void CPUCALL CMP_EbIb_ext(UINT32 madr, UINT32 src) { UINT32 dst, res; @@ -705,7 +716,7 @@ CMP_EbIb_ext(UINT32 madr, UINT32 src) BYTE_SUB(res, dst, src); } -void +void CPUCALL CMP_EwIx(UINT16 *regp, UINT32 src) { UINT32 dst, res; @@ -714,7 +725,7 @@ CMP_EwIx(UINT16 *regp, UINT32 src) WORD_SUB(res, dst, src); } -void +void CPUCALL CMP_EwIx_ext(UINT32 madr, UINT32 src) { UINT32 dst, res; @@ -723,7 +734,7 @@ CMP_EwIx_ext(UINT32 madr, UINT32 src) WORD_SUB(res, dst, src); } -void +void CPUCALL CMP_EdIx(UINT32 *regp, UINT32 src) { UINT32 dst, res; @@ -732,7 +743,7 @@ CMP_EdIx(UINT32 *regp, UINT32 src) DWORD_SUB(res, dst, src); } -void +void CPUCALL CMP_EdIx_ext(UINT32 madr, UINT32 src) { UINT32 dst, res;