From 55cf16e10ce64a8696137d2ce50092b4559561e7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 27 Mar 2013 18:49:10 +0000 Subject: [PATCH] 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. --- gas/testsuite/ChangeLog | 5 +++++ gas/testsuite/gas/i386/addr32.d | 1 + gas/testsuite/gas/i386/addr32.s | 1 + opcodes/ChangeLog | 6 ++++++ opcodes/i386-dis.c | 8 ++++---- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 58fb22f..8206282 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-27 H.J. Lu + + * gas/i386/addr32.s: Add an SIB test. + * gas/i386/addr32.d: Updated. + 2013-03-27 Alexis Deruelle PR binutils/15068 diff --git a/gas/testsuite/gas/i386/addr32.d b/gas/testsuite/gas/i386/addr32.d index 5866a30..8553fc3 100644 --- a/gas/testsuite/gas/i386/addr32.d +++ b/gas/testsuite/gas/i386/addr32.d @@ -12,4 +12,5 @@ Disassembly of section .text: [ ]*13:[ ]+67 a2 98 08 60 00[ ]+addr32[ ]+mov[ ]+%al,0x600898 [ ]*19:[ ]+67 a3 98 08 60 00[ ]+addr32[ ]+mov[ ]+%ax,0x600898 [ ]*1f:[ ]+67 66 a3 98 08 60 00[ ]+addr32[ ]+mov[ ]+%eax,0x600898 +[ ]*26:[ ]+67 66 c7 04 24 01 00 00 00[ ]+movl[ ]+\$0x1,\(%esp\) #pass diff --git a/gas/testsuite/gas/i386/addr32.s b/gas/testsuite/gas/i386/addr32.s index 3dab339..b899ebd 100644 --- a/gas/testsuite/gas/i386/addr32.s +++ b/gas/testsuite/gas/i386/addr32.s @@ -6,3 +6,4 @@ addr32 mov %al,0x600898 addr32 mov %ax,0x600898 addr32 mov %eax,0x600898 + addr32 movl $0x1,(%esp) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 533c4a3..39c256e 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2013-03-27 H.J. Lu + + * i386-dis.c (get_sib): Add the sizeflag argument. Properly + check address mode. + (print_insn): Pass sizeflag to get_sib. + 2013-03-27 Alexis Deruelle PR binutils/15068 diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 5a77255..eeaf22e 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -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]; -- 2.7.4