Properly check address mode for SIB

gas/testsuite/

	* gas/i386/addr32.s: Add an SIB test.
	* gas/i386/addr32.d: Updated.

opcodes/

	* i386-dis.c (get_sib): Add the sizeflag argument.  Properly
	check address mode.
	(print_insn): Pass sizeflag to get_sib.
This commit is contained in:
H.J. Lu
2013-03-27 18:49:10 +00:00
parent ec21308c43
commit 55cf16e10c
5 changed files with 17 additions and 4 deletions

View File

@@ -11285,11 +11285,11 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
}
static void
get_sib (disassemble_info *info)
get_sib (disassemble_info *info, int sizeflag)
{
/* If modrm.mod == 3, operand must be register. */
if (need_modrm
&& address_mode != mode_16bit
&& ((sizeflag & AFLAG) || address_mode == mode_64bit)
&& modrm.mod != 3
&& modrm.rm == 4)
{
@@ -11574,7 +11574,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
{
get_sib (info);
get_sib (info, sizeflag);
dofloat (sizeflag);
}
else
@@ -11582,7 +11582,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
dp = get_valid_dis386 (dp, info);
if (dp != NULL && putop (dp->name, sizeflag) == 0)
{
get_sib (info);
get_sib (info, sizeflag);
for (i = 0; i < MAX_OPERANDS; ++i)
{
obufp = op_out[i];