This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Fix assembling 68851 pmove insns
- From: Andreas Schwab <schwab at linux-m68k dot org>
- To: binutils at sourceware dot org
- Date: Mon, 09 Jan 2012 13:59:04 +0100
- Subject: [PATCH] Fix assembling 68851 pmove insns
The 68851 pmove insns with BADx/BACx register were misassembled due to
misinterpreting the R/W bit. As a side effect the pmove insns with
PSR/PCSR register were wrongly disassembled because they were matched
already by the entries for the former insns, which are less specific.
The disassembler treats all pmmu register constraints the same, so the
reordering isn't strictly necessary.
Andreas.
2012-01-09 Andreas Schwab <schwab@linux-m68k.org>
opcodes/
* m68k-opc.c (m68k_opcodes): Fix entries for pmove with BADx/BACx
register and move them after pmove with PSR/PCSR register.
gas/testsuite/
* gas/m68k/pmove.s, gas/testsuite/gas/m68k/pmove.d: New test.
* gas/m68k/all.exp: Run it.
diff --git a/gas/testsuite/gas/m68k/all.exp b/gas/testsuite/gas/m68k/all.exp
index 6035286..2bcce35 100644
--- a/gas/testsuite/gas/m68k/all.exp
+++ b/gas/testsuite/gas/m68k/all.exp
@@ -99,6 +99,8 @@ if { [istarget m68*-*-*] || [istarget fido*-*-*] } then {
}
run_dump_test pr11676
+
+ run_dump_test pmove
}
if [info exists errorInfo] then {
unset errorInfo
diff --git a/gas/testsuite/gas/m68k/pmove.d b/gas/testsuite/gas/m68k/pmove.d
new file mode 100644
index 0000000..33e68f7
--- /dev/null
+++ b/gas/testsuite/gas/m68k/pmove.d
@@ -0,0 +1,16 @@
+#as: -m68030
+#objdump: --architecture=m68k:68030 -d
+#name: pmove
+
+# Test handling of the 68030/68851 pmove instructions.
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <.*>:
+[ 0-9a-f]+: f010 6200 pmove %psr,%a0@
+[ 0-9a-f]+: f011 6000 pmove %a1@,%psr
+[ 0-9a-f]+: f012 6600 pmove %pcsr,%a2@
+[ 0-9a-f]+: f013 7200 pmove %bad0,%a3@
+[ 0-9a-f]+: f014 7004 pmove %a4@,%bad1
diff --git a/gas/testsuite/gas/m68k/pmove.s b/gas/testsuite/gas/m68k/pmove.s
new file mode 100644
index 0000000..7f1ec00
--- /dev/null
+++ b/gas/testsuite/gas/m68k/pmove.s
@@ -0,0 +1,6 @@
+# Test handling of the 68030/68851 pmove instructions.
+ pmove %psr,%a0@
+ pmove %a1@,%psr
+ pmove %pcsr,%a2@
+ pmove %bad0,%a3@
+ pmove %a4@,%bad1
diff --git a/opcodes/m68k-opc.c b/opcodes/m68k-opc.c
index 3c8310a..8347ef1 100644
--- a/opcodes/m68k-opc.c
+++ b/opcodes/m68k-opc.c
@@ -1850,11 +1850,11 @@ const struct m68k_opcode m68k_opcodes[] =
{"pmove", 4, two(0xf000,0x4200), two(0xffc0,0xe3ff), "28%s", m68851 },
{"pmove", 4, two(0xf000,0x4000), two(0xffc0,0xe3ff), "|sW8", m68030|m68851 },
{"pmove", 4, two(0xf000,0x4200), two(0xffc0,0xe3ff), "W8~s", m68030|m68851 },
-{"pmove", 4, two(0xf000,0x6200), two(0xffc0,0xe3e3), "*wX3", m68851 },
-{"pmove", 4, two(0xf000,0x6000), two(0xffc0,0xe3e3), "X3%s", m68851 },
{"pmove", 4, two(0xf000,0x6000), two(0xffc0,0xffff), "*wY8", m68030|m68851 },
{"pmove", 4, two(0xf000,0x6200), two(0xffc0,0xffff), "Y8%s", m68030|m68851 },
{"pmove", 4, two(0xf000,0x6600), two(0xffc0,0xffff), "Z8%s", m68851 },
+{"pmove", 4, two(0xf000,0x6000), two(0xffc0,0xe3e3), "*wX3", m68851 },
+{"pmove", 4, two(0xf000,0x6200), two(0xffc0,0xe3e3), "X3%s", m68851 },
{"pmove", 4, two(0xf000,0x0800), two(0xffc0,0xfbff), "*l38", m68030 },
{"pmove", 4, two(0xf000,0x0a00), two(0xffc0,0xfbff), "38%s", m68030 },
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."