aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/testsuite/ChangeLog9
-rw-r--r--gas/testsuite/gas/i386/i386.exp2
-rw-r--r--gas/testsuite/gas/i386/nops.d17
-rw-r--r--gas/testsuite/gas/i386/nops.s12
-rw-r--r--gas/testsuite/gas/i386/x86-64-nops.d17
-rw-r--r--gas/testsuite/gas/i386/x86-64-nops.s12
-rw-r--r--include/opcode/ChangeLog4
-rw-r--r--include/opcode/i386.h6
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/i386-dis.c4
10 files changed, 85 insertions, 3 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 2b16921..8ff202d 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,5 +1,14 @@
2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+ * gas/i386/i386.exp: Run nops and x86-64-nops.
+
+ * gas/i386/nops.d: New file.
+ * gas/i386/nops.s: Likewise.
+ * gas/i386/x86-64-nops.d: Likewise.
+ * gas/i386/x86-64-nops.s: Likewise.
+
+2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+
* gas/i386/opcode.s: Add "xchg %ax,%ax".
* gas/i386/opcode.d: Updated.
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index fd5ea37..3f353bc 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -72,6 +72,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "rep"
run_dump_test "rep-suffix"
run_dump_test "fp"
+ run_dump_test "nops"
# These tests require support for 8 and 16 bit relocs,
# so we only run them for ELF and COFF targets.
@@ -144,6 +145,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
run_dump_test "x86-64-rep"
run_dump_test "x86-64-rep-suffix"
run_dump_test "x86-64-gidt"
+ run_dump_test "x86-64-nops"
if { ![istarget "*-*-aix*"]
&& ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/nops.d b/gas/testsuite/gas/i386/nops.d
new file mode 100644
index 0000000..74eaf86
--- /dev/null
+++ b/gas/testsuite/gas/i386/nops.d
@@ -0,0 +1,17 @@
+#objdump: -drw
+#name: i386 nops
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+000 <.text>:
+[ ]*0:[ ]+0f 1f 00[ ]+nopl[ ]+\(%eax\)
+[ ]*3:[ ]+0f 1f 40 00[ ]+nopl[ ]+0x0\(%eax\)
+[ ]*7:[ ]+0f 1f 44 00 00[ ]+nopl[ ]+0x0\(%eax,%eax,1\)
+[ ]*c:[ ]+66 0f 1f 44 00 00[ ]+nopw[ ]+0x0\(%eax,%eax,1\)
+[ ]*12:[ ]+0f 1f 80 00 00 00 00[ ]+nopl[ ]+0x0\(%eax\)
+[ ]*19:[ ]+0f 1f 84 00 00 00 00 00[ ]+nopl[ ]+0x0\(%eax,%eax,1\)
+[ ]*21:[ ]+66 0f 1f 84 00 00 00 00 00[ ]+nopw[ ]+0x0\(%eax,%eax,1\)
+[ ]*2a:[ ]+66 2e 0f 1f 84 00 00 00 00 00[ ]+nopw[ ]+%cs:0x0\(%eax,%eax,1\)
+#pass
diff --git a/gas/testsuite/gas/i386/nops.s b/gas/testsuite/gas/i386/nops.s
new file mode 100644
index 0000000..e4eec09
--- /dev/null
+++ b/gas/testsuite/gas/i386/nops.s
@@ -0,0 +1,12 @@
+ .text
+
+ .byte 0x0f, 0x1f, 0x0
+ .byte 0x0f, 0x1f, 0x40, 0x0
+ .byte 0x0f, 0x1f, 0x44, 0x0, 0x0
+ .byte 0x66, 0x0f, 0x1f, 0x44, 0x0, 0x0
+ .byte 0x0f, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x66, 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+
+ .p2align 4
diff --git a/gas/testsuite/gas/i386/x86-64-nops.d b/gas/testsuite/gas/i386/x86-64-nops.d
new file mode 100644
index 0000000..e51c0c1
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-nops.d
@@ -0,0 +1,17 @@
+#objdump: -drw
+#name: x86-64 nops
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+000 <.text>:
+[ ]*0:[ ]+0f 1f 00[ ]+nopl[ ]+\(%rax\)
+[ ]*3:[ ]+0f 1f 40 00[ ]+nopl[ ]+0x0\(%rax\)
+[ ]*7:[ ]+0f 1f 44 00 00[ ]+nopl[ ]+0x0\(%rax,%rax,1\)
+[ ]*c:[ ]+66 0f 1f 44 00 00[ ]+nopw[ ]+0x0\(%rax,%rax,1\)
+[ ]*12:[ ]+0f 1f 80 00 00 00 00[ ]+nopl[ ]+0x0\(%rax\)
+[ ]*19:[ ]+0f 1f 84 00 00 00 00 00[ ]+nopl[ ]+0x0\(%rax,%rax,1\)
+[ ]*21:[ ]+66 0f 1f 84 00 00 00 00 00[ ]+nopw[ ]+0x0\(%rax,%rax,1\)
+[ ]*2a:[ ]+66 2e 0f 1f 84 00 00 00 00 00[ ]+nopw[ ]+%cs:0x0\(%rax,%rax,1\)
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-nops.s b/gas/testsuite/gas/i386/x86-64-nops.s
new file mode 100644
index 0000000..e4eec09
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-nops.s
@@ -0,0 +1,12 @@
+ .text
+
+ .byte 0x0f, 0x1f, 0x0
+ .byte 0x0f, 0x1f, 0x40, 0x0
+ .byte 0x0f, 0x1f, 0x44, 0x0, 0x0
+ .byte 0x66, 0x0f, 0x1f, 0x44, 0x0, 0x0
+ .byte 0x0f, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x66, 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0
+
+ .p2align 4
diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog
index edc00fa..13c3b40 100644
--- a/include/opcode/ChangeLog
+++ b/include/opcode/ChangeLog
@@ -1,5 +1,9 @@
2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+ * i386.h (i386_optab): Add "nop" with memory reference.
+
+2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+
* i386.h (i386_optab): Update comment for 64bit NOP.
2006-06-06 Ben Elliston <bje@au.ibm.com>
diff --git a/include/opcode/i386.h b/include/opcode/i386.h
index c46c86d..76b5172 100644
--- a/include/opcode/i386.h
+++ b/include/opcode/i386.h
@@ -555,7 +555,11 @@ static const template i386_optab[] =
{"bound", 2, 0x62, X, Cpu186|CpuNo64, wl_Suf|Modrm, { WordReg, WordMem, 0} },
{"hlt", 0, 0xf4, X, 0, NoSuf, { 0, 0, 0} },
-/* nop is actually 'xchgl %eax, %eax'. */
+
+{"nop", 1, 0x0f1f, X, Cpu686, wl_Suf|Modrm, { WordMem, 0, 0} },
+
+/* nop is actually "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
+ 32bit mode and "xchg %rax,%rax" in 64bit mode. */
{"nop", 0, 0x90, X, 0, NoSuf, { 0, 0, 0} },
/* Protection control. */
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 826c54e..b8eea11 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,10 @@
2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+ * i386-dis.c (dis386_twobyte): Use "nopQ" for 0x1f.
+ (twobyte_has_modrm): Set 1 for 0x1f.
+
+2006-06-12 H.J. Lu <hongjiu.lu@intel.com>
+
* i386-dis.c (NOP_Fixup): Removed.
(NOP_Fixup1): New.
(NOP_Fixup2): Likewise.
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 49a3e9f..40be226 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -843,7 +843,7 @@ static const struct dis386 dis386_twobyte[] = {
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
- { "(bad)", XX, XX, XX },
+ { "nopQ", Ev, XX, XX },
/* 20 */
{ "movZ", Rm, Cm, XX },
{ "movZ", Rm, Dm, XX },
@@ -1125,7 +1125,7 @@ static const unsigned char twobyte_has_modrm[256] = {
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* ------------------------------- */
/* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
- /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
+ /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
/* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
/* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
/* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */