aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/i386/i386.exp1
-rw-r--r--gas/testsuite/gas/i386/sib.d15
-rw-r--r--gas/testsuite/gas/i386/sib.s11
-rw-r--r--opcodes/ChangeLog4
-rw-r--r--opcodes/i386-dis.c4
6 files changed, 41 insertions, 1 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 24c5cc8..ed357fb 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2005-01-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386/i386.exp: Run "sib".
+
+ * gas/i386/sib.d: New file.
+ * gas/i386/sib.s: Likewise.
+
2005-01-09 Andreas Schwab <schwab@suse.de>
* gas/i386/intel16.d: Ignore trailing text with #pass.
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 1846268..98b6ea6 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -57,6 +57,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "sse2"
run_dump_test "sub"
run_dump_test "prescott"
+ run_dump_test "sib"
if {![istarget "*-*-aix*"]
&& (![is_elf_format] || [istarget "*-*-linux*"]
diff --git a/gas/testsuite/gas/i386/sib.d b/gas/testsuite/gas/i386/sib.d
new file mode 100644
index 0000000..2a5dbb6
--- /dev/null
+++ b/gas/testsuite/gas/i386/sib.d
@@ -0,0 +1,15 @@
+#objdump: -dw
+#name: i386 SIB
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+000 <foo>:
+ 0: 8b 04 23 [ ]*mov [ ]*\(%ebx\),%eax
+ 3: 8b 04 63 [ ]*mov [ ]*\(%ebx\),%eax
+ 6: 8b 04 a3 [ ]*mov [ ]*\(%ebx\),%eax
+ 9: 8b 04 e3 [ ]*mov [ ]*\(%ebx\),%eax
+ c: 90 [ ]*nop [ ]*
+ d: 90 [ ]*nop [ ]*
+ ...
diff --git a/gas/testsuite/gas/i386/sib.s b/gas/testsuite/gas/i386/sib.s
new file mode 100644
index 0000000..25d88b7
--- /dev/null
+++ b/gas/testsuite/gas/i386/sib.s
@@ -0,0 +1,11 @@
+#Test the special case of the index bits, 0x4, in SIB.
+
+ .text
+foo:
+ .byte 0x8B, 0x04, 0x23 # effect is: movl (%ebx), %eax
+ .byte 0x8B, 0x04, 0x63 # effect is: movl (%ebx), %eax
+ .byte 0x8B, 0x04, 0xA3 # effect is: movl (%ebx), %eax
+ .byte 0x8B, 0x04, 0xE3 # effect is: movl (%ebx), %eax
+ nop
+ nop
+ .p2align 4,0
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 2effaf3..1b9fc94 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,7 @@
+2005-01-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * i386-dis.c (OP_E): Ignore scale when index == 0x4 in SIB.
+
2005-01-10 Andreas Schwab <schwab@suse.de>
* disassemble.c (disassemble_init_for_target) <case
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index b5cc638..c24c656 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -3191,8 +3191,10 @@ OP_E (int bytemode, int sizeflag)
{
havesib = 1;
FETCH_DATA (the_info, codep + 1);
- scale = (*codep >> 6) & 3;
index = (*codep >> 3) & 7;
+ if (index != 0x4)
+ /* When INDEX == 0x4, scale is ignored. */
+ scale = (*codep >> 6) & 3;
base = *codep & 7;
USED_REX (REX_EXTY);
USED_REX (REX_EXTZ);