MIPS16/GAS: Fix forced size suffixes with argumentless instructions
authorMaciej W. Rozycki <macro@imgtec.com>
Fri, 23 Dec 2016 12:38:35 +0000 (12:38 +0000)
committerMaciej W. Rozycki <macro@imgtec.com>
Fri, 23 Dec 2016 19:28:23 +0000 (19:28 +0000)
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
gas/config/tc-mips.c
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-insn-length-noargs.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-insn-length-noargs.s [new file with mode: 0644]

index 53fa95280ccd2fb302caf3517419819a6c488558..feac41ed7f98473790120ef275a72bd4c339fe68 100644 (file)
@@ -1,3 +1,12 @@
+2016-12-23  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * 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  <macro@imgtec.com>
 
        * testsuite/gas/mips/mips16-extend-swap.d: New test.
index a68e267d5ae99fd7b5be3ce233c875add2b986a3..7536a5ba06742fdfcb040b56c7d35f62f28416f1 100644 (file)
@@ -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);
index c16891ad6984a9b15c0c9a72984529069b1f23a2..a5c722c376322fa6ca74e309aa9d6c36c323a1da 100644 (file)
@@ -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 (file)
index 0000000..1804795
--- /dev/null
@@ -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 (file)
index 0000000..b24ff85
--- /dev/null
@@ -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