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.
This commit is contained in:
Maciej W. Rozycki 2016-12-23 12:38:35 +00:00
parent 645c455650
commit 3fb4970943
5 changed files with 51 additions and 10 deletions

View 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.

View 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);

View 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"

View File

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

View File

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