2010-05-26  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-dis.c (sib): New.
	(get_sib): Likewise.
	(print_insn): Call get_sib.
	OP_E_memory): Use sib.
This commit is contained in:
H.J. Lu
2010-05-26 16:08:23 +00:00
parent 5e0f337e8c
commit dfc8cf43a1
2 changed files with 35 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2010-05-26 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (sib): New.
(get_sib): Likewise.
(print_insn): Call get_sib.
OP_E_memory): Use sib.
2010-05-26 Catherine Moore <clm@codesoourcery.com> 2010-05-26 Catherine Moore <clm@codesoourcery.com>
* mips-dis.c (mips_arch): Remove INSN_MIPS16. * mips-dis.c (mips_arch): Remove INSN_MIPS16.

View File

@ -2303,6 +2303,13 @@ static struct
} }
modrm; modrm;
static unsigned char need_modrm; static unsigned char need_modrm;
static struct
{
int scale;
int index;
int base;
}
sib;
static struct static struct
{ {
int register_specifier; int register_specifier;
@ -11243,6 +11250,22 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
return get_valid_dis386 (dp, info); return get_valid_dis386 (dp, info);
} }
static void
get_sib (disassemble_info *info)
{
/* If modrm.mod == 3, operand must be register. */
if (need_modrm
&& address_mode != mode_16bit
&& modrm.mod != 3
&& modrm.rm == 4)
{
FETCH_DATA (info, codep + 2);
sib.index = (codep [1] >> 3) & 7;
sib.scale = (codep [1] >> 6) & 3;
sib.base = codep [1] & 7;
}
}
static int static int
print_insn (bfd_vma pc, disassemble_info *info) print_insn (bfd_vma pc, disassemble_info *info)
{ {
@ -11528,6 +11551,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE) if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
{ {
get_sib (info);
dofloat (sizeflag); dofloat (sizeflag);
} }
else else
@ -11535,6 +11559,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
dp = get_valid_dis386 (dp, info); dp = get_valid_dis386 (dp, info);
if (dp != NULL && putop (dp->name, sizeflag) == 0) if (dp != NULL && putop (dp->name, sizeflag) == 0)
{ {
get_sib (info);
for (i = 0; i < MAX_OPERANDS; ++i) for (i = 0; i < MAX_OPERANDS; ++i)
{ {
obufp = op_out[i]; obufp = op_out[i];
@ -12935,10 +12960,9 @@ OP_E_memory (int bytemode, int sizeflag)
if (base == 4) if (base == 4)
{ {
havesib = 1; havesib = 1;
FETCH_DATA (the_info, codep + 1); vindex = sib.index;
vindex = (*codep >> 3) & 7; scale = sib.scale;
scale = (*codep >> 6) & 3; base = sib.base;
base = *codep & 7;
USED_REX (REX_X); USED_REX (REX_X);
if (rex & REX_X) if (rex & REX_X)
vindex += 8; vindex += 8;