--- np2/i386c/ia32/resolve.c 2003/12/22 18:00:31 1.2 +++ np2/i386c/ia32/resolve.c 2004/01/27 15:53:56 1.5 @@ -1,4 +1,4 @@ -/* $Id: resolve.c,v 1.2 2003/12/22 18:00:31 monaka Exp $ */ +/* $Id: resolve.c,v 1.5 2004/01/27 15:53:56 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -32,10 +32,10 @@ #include "ia32.mcr" -static DWORD (*calc_ea_dst_tbl[0x100])(void); -static DWORD (*calc_ea32_dst_tbl[0x100])(void); - +DWORD (*calc_ea_dst_tbl[0x100])(void); +DWORD (*calc_ea32_dst_tbl[0x100])(void); +#if defined(DEBUG) || !defined(IA32_INLINE_CALC_EA) DWORD calc_ea_dst(DWORD op) { @@ -46,6 +46,7 @@ calc_ea_dst(DWORD op) return ((*calc_ea_dst_tbl[op])() & 0xffff); return (*calc_ea32_dst_tbl[op])(); } +#endif /* IA32_INLINE_CALC_EA */ /* @@ -71,8 +72,6 @@ static DWORD ea_bx_si(void) { - PROFILE_INC_EA16(0); - CPU_INST_SEGREG_INDEX = DS_FIX; return (CPU_BX + CPU_SI); } @@ -82,8 +81,6 @@ ea_bx_si_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(1); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_SI); @@ -94,8 +91,6 @@ ea_bx_si_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(2); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_SI); @@ -105,8 +100,6 @@ static DWORD ea_bx_di(void) { - PROFILE_INC_EA16(3); - CPU_INST_SEGREG_INDEX = DS_FIX; return (CPU_BX + CPU_DI); } @@ -116,8 +109,6 @@ ea_bx_di_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(4); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_DI); @@ -128,8 +119,6 @@ ea_bx_di_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(5); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX + CPU_DI); @@ -139,8 +128,6 @@ static DWORD ea_bp_si(void) { - PROFILE_INC_EA16(6); - CPU_INST_SEGREG_INDEX = SS_FIX; return (CPU_BP + CPU_SI); } @@ -150,8 +137,6 @@ ea_bp_si_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(7); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_SI); @@ -162,8 +147,6 @@ ea_bp_si_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(8); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_SI); @@ -173,8 +156,6 @@ static DWORD ea_bp_di(void) { - PROFILE_INC_EA16(9); - CPU_INST_SEGREG_INDEX = SS_FIX; return (CPU_BP + CPU_DI); } @@ -184,8 +165,6 @@ ea_bp_di_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(10); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_DI); @@ -196,8 +175,6 @@ ea_bp_di_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(11); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP + CPU_DI); @@ -207,8 +184,6 @@ static DWORD ea_si(void) { - PROFILE_INC_EA16(12); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_SI; } @@ -218,8 +193,6 @@ ea_si_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(13); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_SI); @@ -230,8 +203,6 @@ ea_si_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(14); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_SI); @@ -241,8 +212,6 @@ static DWORD ea_di(void) { - PROFILE_INC_EA16(15); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_DI; } @@ -252,8 +221,6 @@ ea_di_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(16); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_DI); @@ -264,8 +231,6 @@ ea_di_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(17); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_DI); @@ -276,8 +241,6 @@ ea_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(18); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs; @@ -288,8 +251,6 @@ ea_bp_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(19); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP); @@ -300,8 +261,6 @@ ea_bp_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(20); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return (adrs + CPU_BP); @@ -311,8 +270,6 @@ static DWORD ea_bx(void) { - PROFILE_INC_EA16(21); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_BX; } @@ -322,8 +279,6 @@ ea_bx_disp8(void) { SDWORD adrs; - PROFILE_INC_EA16(22); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX); @@ -334,8 +289,6 @@ ea_bx_disp16(void) { DWORD adrs; - PROFILE_INC_EA16(23); - GET_PCWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return (adrs + CPU_BX); @@ -367,8 +320,6 @@ static DWORD ea32_eax(void) { - PROFILE_INC_EA32(0); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EAX; } @@ -377,8 +328,6 @@ static DWORD ea32_ecx(void) { - PROFILE_INC_EA32(1); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_ECX; } @@ -387,8 +336,6 @@ static DWORD ea32_edx(void) { - PROFILE_INC_EA32(2); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EDX; } @@ -397,8 +344,6 @@ static DWORD ea32_ebx(void) { - PROFILE_INC_EA32(3); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EBX; } @@ -409,14 +354,11 @@ ea32_sib(void) DWORD op, dst; DWORD base, idx, scale; - PROFILE_INC_EA32(4); - GET_PCBYTE(op); - dst = 0; /* compiler happy */ - 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; @@ -432,10 +374,14 @@ ea32_sib(void) CPU_INST_SEGREG_INDEX = DS_FIX; GET_PCDWORD(dst); break; + + default: + dst = 0; /* compiler happy */ + ia32_panic("ea32_sib: invalid base = %d", base); + break; } if (idx != 4) dst += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB0(op); return dst; } @@ -444,8 +390,6 @@ ea32_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(5); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs; @@ -455,8 +399,6 @@ static DWORD ea32_esi(void) { - PROFILE_INC_EA32(6); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_ESI; } @@ -465,8 +407,6 @@ static DWORD ea32_edi(void) { - PROFILE_INC_EA32(7); - CPU_INST_SEGREG_INDEX = DS_FIX; return CPU_EDI; } @@ -476,8 +416,6 @@ ea32_eax_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(8); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EAX; @@ -488,8 +426,6 @@ ea32_ecx_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(9); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ECX; @@ -500,8 +436,6 @@ ea32_edx_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(10); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDX; @@ -512,8 +446,6 @@ ea32_ebx_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(11); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EBX; @@ -526,14 +458,13 @@ ea32_sib_disp8(void) DWORD op; DWORD base, idx, scale; - PROFILE_INC_EA32(12); - 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; @@ -545,7 +476,6 @@ ea32_sib_disp8(void) } if (idx != 4) adrs += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB1(op); return CPU_REGS_DWORD(base) + adrs; } @@ -554,8 +484,6 @@ ea32_ebp_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(13); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return adrs + CPU_EBP; @@ -566,8 +494,6 @@ ea32_esi_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(14); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ESI; @@ -578,8 +504,6 @@ ea32_edi_disp8(void) { SDWORD adrs; - PROFILE_INC_EA32(15); - GET_PCBYTESD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDI; @@ -590,8 +514,6 @@ ea32_eax_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(16); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EAX; @@ -602,8 +524,6 @@ ea32_ecx_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(17); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ECX; @@ -614,8 +534,6 @@ ea32_edx_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(18); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDX; @@ -626,8 +544,6 @@ ea32_ebx_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(19); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EBX; @@ -640,14 +556,13 @@ ea32_sib_disp32(void) DWORD op; DWORD base, idx, scale; - PROFILE_INC_EA32(20); - 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; @@ -659,7 +574,6 @@ ea32_sib_disp32(void) } if (idx != 4) adrs += CPU_REGS_DWORD(idx) << scale; - PROFILE_INC_SIB2(op); return CPU_REGS_DWORD(base) + adrs; } @@ -668,8 +582,6 @@ ea32_ebp_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(21); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = SS_FIX; return adrs + CPU_EBP; @@ -680,8 +592,6 @@ ea32_esi_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(22); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_ESI; @@ -692,8 +602,6 @@ ea32_edi_disp32(void) { DWORD adrs; - PROFILE_INC_EA32(23); - GET_PCDWORD(adrs); CPU_INST_SEGREG_INDEX = DS_FIX; return adrs + CPU_EDI;