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.
This commit is contained in:
James Patrick Conlon 2018-08-01 15:14:46 +01:00 committed by Nick Clifton
parent c25179e71f
commit 3cf2b6691c
5 changed files with 57 additions and 3 deletions

View file

@ -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

View file

@ -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;

View file

@ -19,8 +19,7 @@
#
if [expr [istarget "pdp11-*-*"]] then {
run_dump_test "opcode"
run_dump_test "absreloc"
run_dump_test "pr14480"
}

View file

@ -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

View file

@ -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