This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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."


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]