--- np2/i386c/ia32/resolve.c 2004/01/07 14:49:42 1.3 +++ np2/i386c/ia32/resolve.c 2005/03/12 12:32:54 1.9 @@ -1,4 +1,4 @@ -/* $Id: resolve.c,v 1.3 2004/01/07 14:49:42 monaka Exp $ */ +/* $Id: resolve.c,v 1.9 2005/03/12 12:32:54 monaka Exp $ */ /* * Copyright (c) 2002-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 @@ -32,26 +30,14 @@ #include "ia32.mcr" -static DWORD (*calc_ea_dst_tbl[0x100])(void); -static DWORD (*calc_ea32_dst_tbl[0x100])(void); - - -DWORD -calc_ea_dst(DWORD op) -{ - - __ASSERT(op < 0x100); - - if (!CPU_INST_AS32) - return ((*calc_ea_dst_tbl[op])() & 0xffff); - return (*calc_ea32_dst_tbl[op])(); -} +UINT32 (*calc_ea_dst_tbl[0x100])(void); +UINT32 (*calc_ea32_dst_tbl[0x100])(void); /* * common */ -DWORD +static UINT32 ea_nop(void) { @@ -67,281 +53,233 @@ ea_nop(void) /* * ea_dest */ -static DWORD +static UINT32 ea_bx_si(void) { - PROFILE_INC_EA16(0); - CPU_INST_SEGREG_INDEX = DS_FIX; return (CPU_BX + CPU_SI); } -static DWORD +static UINT32 ea_bx_si_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA16(1); + UINT32 adrs; - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_SI); } -static DWORD +static UINT32 ea_bx_si_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(2); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_SI); } -static DWORD +static UINT32 ea_bx_di(void) { - PROFILE_INC_EA16(3); - CPU_INST_SEGREG_INDEX = DS_FIX; return (CPU_BX + CPU_DI); } -static DWORD +static UINT32 ea_bx_di_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA16(4); + UINT32 adrs; - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_DI); } -static DWORD +static UINT32 ea_bx_di_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(5); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_DI); } -static DWORD +static UINT32 ea_bp_si(void) { - PROFILE_INC_EA16(6); - CPU_INST_SEGREG_INDEX = SS_FIX; return (CPU_BP + CPU_SI); } -static DWORD +static UINT32 ea_bp_si_disp8(void) { - SDWORD adrs; + UINT32 adrs; - PROFILE_INC_EA16(7); - - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_SI); } -static DWORD +static UINT32 ea_bp_si_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(8); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_SI); } -static DWORD +static UINT32 ea_bp_di(void) { - PROFILE_INC_EA16(9); - CPU_INST_SEGREG_INDEX = SS_FIX; return (CPU_BP + CPU_DI); } -static DWORD +static UINT32 ea_bp_di_disp8(void) { - SDWORD adrs; + UINT32 adrs; - PROFILE_INC_EA16(10); - - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_DI); } -static DWORD +static UINT32 ea_bp_di_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(11); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_DI); } -static DWORD +static UINT32 ea_si(void) { - PROFILE_INC_EA16(12); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_SI; } -static DWORD +static UINT32 ea_si_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA16(13); + UINT32 adrs; - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_SI); } -static DWORD +static UINT32 ea_si_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(14); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_SI); } -static DWORD +static UINT32 ea_di(void) { - PROFILE_INC_EA16(15); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_DI; } -static DWORD +static UINT32 ea_di_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA16(16); + UINT32 adrs; - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_DI); } -static DWORD +static UINT32 ea_di_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(17); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_DI); } -static DWORD +static UINT32 ea_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(18); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs; } -static DWORD +static UINT32 ea_bp_disp8(void) { - SDWORD adrs; + UINT32 adrs; - PROFILE_INC_EA16(19); - - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP); } -static DWORD +static UINT32 ea_bp_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(20); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP); } -static DWORD +static UINT32 ea_bx(void) { - PROFILE_INC_EA16(21); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_BX; } -static DWORD +static UINT32 ea_bx_disp8(void) { - SDWORD adrs; + UINT32 adrs; - PROFILE_INC_EA16(22); - - GET_PCBYTESD(adrs); + GET_PCBYTES(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX); } -static DWORD +static UINT32 ea_bx_disp16(void) { - DWORD adrs; - - PROFILE_INC_EA16(23); + UINT32 adrs; GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX); } -static DWORD (*c_ea_dst_tbl[])(void) = { +static UINT32 (*c_ea_dst_tbl[])(void) = { ea_bx_si, ea_bx_di, ea_bp_si, ea_bp_di, ea_si, ea_di, @@ -363,59 +301,50 @@ static DWORD (*c_ea_dst_tbl[])(void) = { /* * ea_dest 32 */ -static DWORD +static UINT32 ea32_eax(void) { - PROFILE_INC_EA32(0); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EAX; } -static DWORD +static UINT32 ea32_ecx(void) { - PROFILE_INC_EA32(1); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_ECX; } -static DWORD +static UINT32 ea32_edx(void) { - PROFILE_INC_EA32(2); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EDX; } -static DWORD +static UINT32 ea32_ebx(void) { - PROFILE_INC_EA32(3); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EBX; } -static DWORD +static UINT32 ea32_sib(void) { - DWORD op, dst; - DWORD base, idx, scale; - - PROFILE_INC_EA32(4); + UINT32 dst; + UINT32 op; + UINT32 base, idx, scale; GET_PCBYTE(op); - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX; @@ -439,105 +368,89 @@ ea32_sib(void) } if (idx != 4) dst += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB0(op); return dst; } -static DWORD +static UINT32 ea32_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(5); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs; } -static DWORD +static UINT32 ea32_esi(void) { - PROFILE_INC_EA32(6); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_ESI; } -static DWORD +static UINT32 ea32_edi(void) { - PROFILE_INC_EA32(7); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EDI; } -static DWORD +static UINT32 ea32_eax_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(8); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EAX; } -static DWORD +static UINT32 ea32_ecx_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(9); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ECX; } -static DWORD +static UINT32 ea32_edx_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(10); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDX; } -static DWORD +static UINT32 ea32_ebx_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(11); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EBX; } -static DWORD +static UINT32 ea32_sib_disp8(void) { - SDWORD adrs; - DWORD op; - DWORD base, idx, scale; - - PROFILE_INC_EA32(12); + SINT32 adrs; + UINT32 op; + UINT32 base, idx, scale; GET_PCBYTE(op); - GET_PCBYTESD(adrs); - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + + GET_PCBYTESD(adrs); + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX; @@ -549,109 +462,93 @@ ea32_sib_disp8(void) } if (idx != 4) adrs += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB1(op); return CPU_REGS_DWORD(base) + adrs; } -static DWORD +static UINT32 ea32_ebp_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(13); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return adrs + CPU_EBP; } -static DWORD +static UINT32 ea32_esi_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(14); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ESI; } -static DWORD +static UINT32 ea32_edi_disp8(void) { - SDWORD adrs; - - PROFILE_INC_EA32(15); + SINT32 adrs; GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDI; } -static DWORD +static UINT32 ea32_eax_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(16); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EAX; } -static DWORD +static UINT32 ea32_ecx_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(17); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ECX; } -static DWORD +static UINT32 ea32_edx_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(18); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDX; } -static DWORD +static UINT32 ea32_ebx_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(19); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EBX; } -static DWORD +static UINT32 ea32_sib_disp32(void) { - DWORD adrs; - DWORD op; - DWORD base, idx, scale; - - PROFILE_INC_EA32(20); + UINT32 adrs; + UINT32 op; + UINT32 base, idx, scale; GET_PCBYTE(op); - GET_PCDWORD(adrs); - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + + GET_PCDWORD(adrs); + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX; @@ -663,47 +560,40 @@ ea32_sib_disp32(void) } if (idx != 4) adrs += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB2(op); return CPU_REGS_DWORD(base) + adrs; } -static DWORD +static UINT32 ea32_ebp_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(21); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return adrs + CPU_EBP; } -static DWORD +static UINT32 ea32_esi_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(22); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ESI; } -static DWORD +static UINT32 ea32_edi_disp32(void) { - DWORD adrs; - - PROFILE_INC_EA32(23); + UINT32 adrs; GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDI; } -static DWORD (*c_ea32_dst_tbl[])(void) = { +static UINT32 (*c_ea32_dst_tbl[])(void) = { ea32_eax, ea32_ecx, ea32_edx, ea32_ebx, ea32_sib, ea32_disp32,