From 8f9ea98bebb629f0e6993be015f042bf45dcdd18 Mon Sep 17 00:00:00 2001 From: James Patrick Conlon Date: Tue, 7 Aug 2018 08:34:08 +0100 Subject: [PATCH] Correct the parsing of derferred register addressing in the PDP11 assembler. PR 23481 * config/tc-pdp11.c (parse_op_noreg): Check for deferred register addressing before assuming non-deferred addressing. * testsuite/gas/pdp11/pr23481.s: New test source file. * testsuite/gas/pdp11/pr23481.d: New test driver file. * testsuite/gas/pdp11/pdp11.exp: Run the new test. --- gas/ChangeLog | 12 +++++++++++- gas/config/tc-pdp11.c | 18 +++++++++++++----- gas/testsuite/gas/pdp11/pdp11.exp | 1 + gas/testsuite/gas/pdp11/pr23481.d | 14 ++++++++++++++ gas/testsuite/gas/pdp11/pr23481.s | 10 ++++++++++ 5 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 gas/testsuite/gas/pdp11/pr23481.d create mode 100644 gas/testsuite/gas/pdp11/pr23481.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 4467bb2fb8b..7874132d7f8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2018-08-07 James Patrick Conlon + Nick Clifton + + PR 23481 + * config/tc-pdp11.c (parse_op_noreg): Check for deferred register + addressing before assuming non-deferred addressing. + * testsuite/gas/pdp11/pr23481.s: New test source file. + * testsuite/gas/pdp11/pr23481.d: New test driver file. + * testsuite/gas/pdp11/pdp11.exp: Run the new test. + 2018-08-06 Claudiu Zissulescu * config/tc-arc.c (rf16_only): New static variable. @@ -93,7 +103,7 @@ (swap_2_operands): Also swap flags fields. * config/tc-i386-intel.c (i386_intel_operand): Likewise. -2018-08-01 James Patrick Conlon +2018-08-01 James Patrick Conlon Nick Clifton PR 14480 diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c index e151b274f6c..1ebd461d265 100644 --- a/gas/config/tc-pdp11.c +++ b/gas/config/tc-pdp11.c @@ -350,10 +350,7 @@ parse_reg (char *str, struct pdp11_code *operand) str += 2; } else - { - operand->error = _("Bad register name"); - return str; - } + operand->error = _("Bad register name"); return str; } @@ -594,10 +591,21 @@ parse_op_noreg (char *str, struct pdp11_code *operand) str = parse_op_no_deferred (str, operand); } else - str = parse_op_no_deferred (str + 1, operand); + { + /* @Rn == (Rn): Register deferred. */ + str = parse_reg (str + 1, operand); + + /* Not @Rn */ + if (operand->error) + { + operand->error = NULL; + str = parse_op_no_deferred (str, operand); + } + } if (operand->error) return str; + operand->code |= 010; } else diff --git a/gas/testsuite/gas/pdp11/pdp11.exp b/gas/testsuite/gas/pdp11/pdp11.exp index b3609f9ba06..0c785666d14 100644 --- a/gas/testsuite/gas/pdp11/pdp11.exp +++ b/gas/testsuite/gas/pdp11/pdp11.exp @@ -22,4 +22,5 @@ if [expr [istarget "pdp11-*-*"]] then { run_dump_test "opcode" run_dump_test "absreloc" run_dump_test "pr14480" + run_dump_test "pr23481" } diff --git a/gas/testsuite/gas/pdp11/pr23481.d b/gas/testsuite/gas/pdp11/pr23481.d new file mode 100644 index 00000000000..fb40785871c --- /dev/null +++ b/gas/testsuite/gas/pdp11/pr23481.d @@ -0,0 +1,14 @@ +#name: PR 23481 - correct assembly of '@rN' and '(rN)' +#objdump: -dw + +dump.o: +file format .* + +Disassembly of section .text: + +0+00 : +[ ]+0:[ ]+2009[ ]+cmp[ ]+r0, \(r1\) +[ ]+2:[ ]+2009[ ]+cmp[ ]+r0, \(r1\) +[ ]+4:[ ]+2240[ ]+cmp[ ]+\(r1\), r0 +[ ]+6:[ ]+2240[ ]+cmp[ ]+\(r1\), r0 +[ ]+8:[ ]+2249[ ]+cmp[ ]+\(r1\), \(r1\) +#pass diff --git a/gas/testsuite/gas/pdp11/pr23481.s b/gas/testsuite/gas/pdp11/pr23481.s new file mode 100644 index 00000000000..5a61b985762 --- /dev/null +++ b/gas/testsuite/gas/pdp11/pr23481.s @@ -0,0 +1,10 @@ +start: + cmp r0,(r1) + cmp r0,@r1 + cmp (r1),r0 + cmp @r1,r0 + cmp (r1),@r1 + + halt + + .END -- 2.30.2