From 3fb49709438e204177373646585a76116caf23fb Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Fri, 23 Dec 2016 12:38:35 +0000 Subject: [PATCH] MIPS16/GAS: Fix forced size suffixes with argumentless instructions Correct the handling of `.e' and `.t' instruction size suffixes with instruction mnemonics which are not followed by any text on the same line, such as arguments or white space, e.g.: $ cat test.s .set mips16 foo: entry.t # comment entry.t exit.t # comment exit.t nop.t # comment nop.t $ as -32 -o test.o test.s test.s: Assembler messages: test.s:4: Error: unrecognized opcode `entry.t' test.s:6: Error: unrecognized opcode `exit.t' test.s:8: Error: unrecognized opcode `nop.t' $ gas/ * config/tc-mips.c (mips16_ip): Handle `.e' and `.t' instruction suffixes followed by a null character rather than a space too. * testsuite/gas/mips/mips16-insn-length-noargs.d: New test. * testsuite/gas/mips/mips16-insn-length-noargs.s: New test source. * testsuite/gas/mips/mips.exp: Run the new test. --- gas/ChangeLog | 9 +++++++ gas/config/tc-mips.c | 25 +++++++++++-------- gas/testsuite/gas/mips/mips.exp | 1 + .../gas/mips/mips16-insn-length-noargs.d | 14 +++++++++++ .../gas/mips/mips16-insn-length-noargs.s | 12 +++++++++ 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 gas/testsuite/gas/mips/mips16-insn-length-noargs.d create mode 100644 gas/testsuite/gas/mips/mips16-insn-length-noargs.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 53fa95280cc..feac41ed7f9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2016-12-23 Maciej W. Rozycki + + * config/tc-mips.c (mips16_ip): Handle `.e' and `.t' instruction + suffixes followed by a null character rather than a space too. + * testsuite/gas/mips/mips16-insn-length-noargs.d: New test. + * testsuite/gas/mips/mips16-insn-length-noargs.s: New test + source. + * testsuite/gas/mips/mips.exp: Run the new test. + 2016-12-23 Maciej W. Rozycki * testsuite/gas/mips/mips16-extend-swap.d: New test. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index a68e267d5ae..7536a5ba067 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -13857,13 +13857,14 @@ mips16_ip (char *str, struct mips_cl_insn *insn) char *end, *s, c; struct mips_opcode *first; struct mips_operand_token *tokens; - - forced_insn_length = 0; + unsigned int l; for (s = str; ISLOWER (*s); ++s) ; end = s; c = *end; + + l = 0; switch (c) { case '\0': @@ -13874,23 +13875,27 @@ mips16_ip (char *str, struct mips_cl_insn *insn) break; case '.': - if (s[1] == 't' && s[2] == ' ') + s++; + if (*s == 't') { - forced_insn_length = 2; - s += 3; - break; + l = 2; + s++; } - else if (s[1] == 'e' && s[2] == ' ') + else if (*s == 'e') { - forced_insn_length = 4; - s += 3; - break; + l = 4; + s++; } + if (*s == '\0') + break; + else if (*s++ == ' ') + break; /* Fall through. */ default: set_insn_error (0, _("unrecognized opcode")); return; } + forced_insn_length = l; *end = 0; first = (struct mips_opcode *) hash_find (mips16_op_hash, str); diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index c16891ad698..a5c722c3763 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -1344,6 +1344,7 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test "mips16-extend-swap" run_dump_test "mips16-sprel-swap" run_dump_test "mips16-sdrasp" + run_dump_test "mips16-insn-length-noargs" run_dump_test "mips16-branch-unextended-1" run_dump_test "mips16-branch-unextended-2" diff --git a/gas/testsuite/gas/mips/mips16-insn-length-noargs.d b/gas/testsuite/gas/mips/mips16-insn-length-noargs.d new file mode 100644 index 00000000000..18047957472 --- /dev/null +++ b/gas/testsuite/gas/mips/mips16-insn-length-noargs.d @@ -0,0 +1,14 @@ +#objdump: -d --prefix-addresses --show-raw-insn +#name: MIPS16 argumentless instruction size override +#as: -32 + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> e809 entry +[0-9a-f]+ <[^>]*> e809 entry +[0-9a-f]+ <[^>]*> ef09 exit +[0-9a-f]+ <[^>]*> ef09 exit +[0-9a-f]+ <[^>]*> 6500 nop +[0-9a-f]+ <[^>]*> 6500 nop + \.\.\. diff --git a/gas/testsuite/gas/mips/mips16-insn-length-noargs.s b/gas/testsuite/gas/mips/mips16-insn-length-noargs.s new file mode 100644 index 00000000000..b24ff853bfc --- /dev/null +++ b/gas/testsuite/gas/mips/mips16-insn-length-noargs.s @@ -0,0 +1,12 @@ + .set mips16 +foo: + entry.t # comment + entry.t + exit.t # comment + exit.t + nop.t # comment + nop.t + +# Force some (non-delay-slot) zero bytes, to make 'objdump' print ... + .align 4, 0 + .space 16 -- 2.30.2