aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Patrick Conlon <cptjustice@gmail.com>2018-08-01 15:14:46 +0100
committerNick Clifton <nickc@redhat.com>2018-08-01 15:14:46 +0100
commit3cf2b6691cef024f7cdb48aaec5fab5189e1cffa (patch)
tree92a415246683a7a95ff238c5bf1d21bb5db95503
parentc25179e71fee952ace322ce26b3fe6b722ec77f9 (diff)
downloadgdb-3cf2b6691cef024f7cdb48aaec5fab5189e1cffa.zip
gdb-3cf2b6691cef024f7cdb48aaec5fab5189e1cffa.tar.gz
gdb-3cf2b6691cef024f7cdb48aaec5fab5189e1cffa.tar.bz2
Fix bug in PDP11 assembler when handling a JSr instruction with deferred auto increment.
PR 14480 * config/tc-pdp11.c (parse_op_noreg): Check for and handle auto increment deferred. * testsuite/gas/pdp11/pr14480.d: New test driver file. * testsuite/gas/pdp11/pr14480.s: New test source file file. * testsuite/gas/pdp11/pdp11.exp: Run the new test.
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/config/tc-pdp11.c16
-rw-r--r--gas/testsuite/gas/pdp11/pdp11.exp3
-rw-r--r--gas/testsuite/gas/pdp11/pr14480.d14
-rw-r--r--gas/testsuite/gas/pdp11/pr14480.s17
5 files changed, 57 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2976c79..4ba57b8 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2018-08-01 James Patrick Conlon <cptjustice@gmail.com>
+ Nick Clifton <nickc@redhat.com>
+
+ PR 14480
+ * config/tc-pdp11.c (parse_op_noreg): Check for and handle auto
+ increment deferred.
+ * testsuite/gas/pdp11/pr14480.d: New test driver file.
+ * testsuite/gas/pdp11/pr14480.s: New test source file file.
+ * testsuite/gas/pdp11/pdp11.exp: Run the new test.
+
2018-08-01 Nick Clifton <nickc@redhat.com>
* config/tc-ns32k.c (addr_mode): Replace "Drop through" comment
diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c
index 2ad6882..e151b27 100644
--- a/gas/config/tc-pdp11.c
+++ b/gas/config/tc-pdp11.c
@@ -581,7 +581,21 @@ parse_op_noreg (char *str, struct pdp11_code *operand)
if (*str == '@' || *str == '*')
{
- str = parse_op_no_deferred (str + 1, operand);
+ /* @(Rn) == @0(Rn): Mode 7, Indexed deferred.
+ Check for auto-increment deferred. */
+ if (str[1] == '('
+ && str[2] != 0
+ && str[3] != 0
+ && str[4] != 0
+ && str[5] != '+')
+ {
+ /* Change implied to explicit index deferred. */
+ *str = '0';
+ str = parse_op_no_deferred (str, operand);
+ }
+ else
+ str = parse_op_no_deferred (str + 1, operand);
+
if (operand->error)
return str;
operand->code |= 010;
diff --git a/gas/testsuite/gas/pdp11/pdp11.exp b/gas/testsuite/gas/pdp11/pdp11.exp
index a6dbf88..b3609f9 100644
--- a/gas/testsuite/gas/pdp11/pdp11.exp
+++ b/gas/testsuite/gas/pdp11/pdp11.exp
@@ -19,8 +19,7 @@
#
if [expr [istarget "pdp11-*-*"]] then {
-
run_dump_test "opcode"
run_dump_test "absreloc"
-
+ run_dump_test "pr14480"
}
diff --git a/gas/testsuite/gas/pdp11/pr14480.d b/gas/testsuite/gas/pdp11/pr14480.d
new file mode 100644
index 0000000..ca85441
--- /dev/null
+++ b/gas/testsuite/gas/pdp11/pr14480.d
@@ -0,0 +1,14 @@
+#name: PR 14480 - correct assembly of 'jsr pc, @(r0)'
+#objdump: -dw
+
+dump.o: +file format .*
+
+Disassembly of section .text:
+
+0+00 <start>:
+[ ]+0:[ ]+15c0 0014[ ]+mov[ ]+\$24, r0
+[ ]+4:[ ]+09c8[ ]+jsr[ ]+pc, \(r0\)
+[ ]+6:[ ]+09f8 0000[ ]+jsr[ ]+pc, \*0\(r0\)
+[ ]+a:[ ]+09f8 0000[ ]+jsr[ ]+pc, \*0\(r0\)
+[ ]+e:[ ]+09f8 0002[ ]+jsr[ ]+pc, \*2\(r0\)
+#pass
diff --git a/gas/testsuite/gas/pdp11/pr14480.s b/gas/testsuite/gas/pdp11/pr14480.s
new file mode 100644
index 0000000..505ca5d
--- /dev/null
+++ b/gas/testsuite/gas/pdp11/pr14480.s
@@ -0,0 +1,17 @@
+start: mov $ind,r0
+ jsr pc,(r0)
+ jsr pc,@(r0)
+ jsr pc,@0(r0)
+ jsr pc,@2(r0)
+ halt
+
+
+ind: .WORD dest
+ .WORD dest2
+
+dest: rts pc
+
+dest2: rts pc
+
+ .END
+