--- np2/i386c/ia32/resolve.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/resolve.c 2004/01/27 15:53:56 1.5 @@ -1,4 +1,4 @@ -/* $Id: resolve.c,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: resolve.c,v 1.5 2004/01/27 15:53:56 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -32,18 +32,21 @@ #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) { + __ASSERT(op < 0x100); + if (!CPU_INST_AS32) return ((*calc_ea_dst_tbl[op])() & 0xffff); return (*calc_ea32_dst_tbl[op])(); } +#endif /* IA32_INLINE_CALC_EA */ /* @@ -352,11 +355,10 @@ ea32_sib(void) DWORD base, idx, scale; 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; @@ -372,6 +374,11 @@ 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; @@ -452,11 +459,12 @@ ea32_sib_disp8(void) DWORD 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,11 +557,12 @@ ea32_sib_disp32(void) DWORD 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;