* config/tc-mips.c (match_expression):  Report uses of registers here.
	Add a "must be an immediate expression" error.  Handle elided offsets
	here rather than...
	(match_int_operand): ...here.

gas/testsuite/
	* gas/mips/octeon-ill.l: Adjust expected output.
	* gas/mips/lui-1.l, gas/mips/lui-1.s: Add more cases.
This commit is contained in:
Richard Sandiford 2013-08-19 19:30:37 +00:00
parent 1a00e61226
commit d436c1c2e8
6 changed files with 52 additions and 37 deletions

View File

@ -1,3 +1,10 @@
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
* config/tc-mips.c (match_expression): Report uses of registers here.
Add a "must be an immediate expression" error. Handle elided offsets
here rather than...
(match_int_operand): ...here.
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
* config/tc-mips.c (mips_arg_info): Remove soft_match.

View File

@ -4325,6 +4325,26 @@ static bfd_boolean
match_expression (struct mips_arg_info *arg, expressionS *value,
bfd_reloc_code_real_type *r)
{
/* If the next token is a '(' that was parsed as being part of a base
expression, assume we have an elided offset. The later match will fail
if this turns out to be wrong. */
if (arg->token->type == OT_CHAR && arg->token->u.ch == '(')
{
value->X_op = O_constant;
value->X_add_number = 0;
r[0] = r[1] = r[2] = BFD_RELOC_UNUSED;
return TRUE;
}
/* Reject register-based expressions such as "0+$2" and "(($2))".
For plain registers the default error seems more appropriate. */
if (arg->token->type == OT_INTEGER
&& arg->token->u.integer.value.X_op == O_register)
{
set_insn_error (arg->argnum, _("register value used as expression"));
return FALSE;
}
if (arg->token->type == OT_INTEGER)
{
*value = arg->token->u.integer.value;
@ -4333,29 +4353,10 @@ match_expression (struct mips_arg_info *arg, expressionS *value,
return TRUE;
}
/* Error-reporting is more consistent if we treat registers as O_register
rather than rejecting them outright. "$1", "($1)" and "(($1))" are
then handled in the same way. */
if (arg->token->type == OT_REG)
{
value->X_add_number = arg->token->u.regno;
++arg->token;
}
else if (arg->token[0].type == OT_CHAR
&& arg->token[0].u.ch == '('
&& arg->token[1].type == OT_REG
&& arg->token[2].type == OT_CHAR
&& arg->token[2].u.ch == ')')
{
value->X_add_number = arg->token[1].u.regno;
arg->token += 3;
}
else
return FALSE;
value->X_op = O_register;
r[0] = r[1] = r[2] = BFD_RELOC_UNUSED;
return TRUE;
set_insn_error_i
(arg->argnum, _("operand %d must be an immediate expression"),
arg->argnum);
return FALSE;
}
/* Try to get a constant expression from the next tokens in ARG. Consume
@ -4561,15 +4562,11 @@ match_int_operand (struct mips_arg_info *arg,
if (arg->lax_max)
max_val = ((1 << operand_base->size) - 1) << operand->shift;
if (arg->token->type == OT_CHAR && arg->token->u.ch == '(')
/* Assume we have an elided offset. The later match will fail
if this turns out to be wrong. */
sval = 0;
else if (operand_base->lsb == 0
&& operand_base->size == 16
&& operand->shift == 0
&& operand->bias == 0
&& (operand->max_val == 32767 || operand->max_val == 65535))
if (operand_base->lsb == 0
&& operand_base->size == 16
&& operand->shift == 0
&& operand->bias == 0
&& (operand->max_val == 32767 || operand->max_val == 65535))
{
/* The operand can be relocated. */
if (!match_expression (arg, &offset_expr, offset_reloc))

View File

@ -1,3 +1,8 @@
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
* gas/mips/octeon-ill.l: Adjust expected output.
* gas/mips/lui-1.l, gas/mips/lui-1.s: Add more cases.
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
* gas/mips/ext-ill.l, gas/mips/lui-1.l, gas/mips/mips16e-64.l,

View File

@ -2,4 +2,7 @@
.*\.s:5: Error: operand 2 out of range `lui \$2,-1'
.*\.s:6: Error: operand 2 out of range `lui \$2,65536'
.*\.s:7: Error: bignum invalid
.*\.s:8: Error: register value used as expression
.*\.s:8: Error: operand 2 must be an immediate expression `lui \$2,\$3'
.*\.s:9: Error: Illegal operands `lui \$2,\(\$3\)'
.*\.s:10: Error: register value used as expression `lui \$2,0\+\$3'
.*\.s:11: Error: register value used as expression `lui \$2,\(\(\$3\)\)'

View File

@ -6,3 +6,6 @@ foo:
lui $2, 65536
lui $2, 0x10000000000000000
lui $2, $3
lui $2, ($3)
lui $2, 0+$3
lui $2, (($3))

View File

@ -30,10 +30,10 @@
.*:43: Error: Opcode not supported on this processor.*
.*:45: Error: operand 2 out of range `dmfc2 \$2,0x10000'
.*:46: Error: operand 2 out of range `dmtc2 \$2,0x12345'
.*:47: Error: operand 2 must be constant `dmfc2 \$9,\$12'
.*:48: Error: operand 2 must be constant `dmfc2 \$4,\$15,4'
.*:49: Error: operand 2 must be constant `dmtc2 \$16,\$8'
.*:50: Error: operand 2 must be constant `dmtc2 \$22,\$7,\$4'
.*:47: Error: operand 2 must be an immediate expression `dmfc2 \$9,\$12'
.*:48: Error: operand 2 must be an immediate expression `dmfc2 \$4,\$15,4'
.*:49: Error: operand 2 must be an immediate expression `dmtc2 \$16,\$8'
.*:50: Error: operand 2 must be an immediate expression `dmtc2 \$22,\$7,\$4'
.*:52: Error: operand 3 out of range `exts \$26,26,32'
.*:54: Error: operand 3 out of range `exts32 \$7,\$21,32,10'
.*:55: Error: operand 4 out of range `exts32 \$31,\$13,3,29'