diff options
author | James Patrick Conlon <cptjustice@gmail.com> | 2018-08-01 15:14:46 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-08-01 15:14:46 +0100 |
commit | 3cf2b6691cef024f7cdb48aaec5fab5189e1cffa (patch) | |
tree | 92a415246683a7a95ff238c5bf1d21bb5db95503 /gas | |
parent | c25179e71fee952ace322ce26b3fe6b722ec77f9 (diff) | |
download | binutils-3cf2b6691cef024f7cdb48aaec5fab5189e1cffa.zip binutils-3cf2b6691cef024f7cdb48aaec5fab5189e1cffa.tar.gz binutils-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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 10 | ||||
-rw-r--r-- | gas/config/tc-pdp11.c | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/pdp11/pdp11.exp | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/pdp11/pr14480.d | 14 | ||||
-rw-r--r-- | gas/testsuite/gas/pdp11/pr14480.s | 17 |
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 + |