mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-14 04:43:38 +08:00
gas/
* 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:
parent
1a00e61226
commit
d436c1c2e8
@ -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.
|
||||
|
@ -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))
|
||||
|
@ -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,
|
||||
|
@ -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\)\)'
|
||||
|
@ -6,3 +6,6 @@ foo:
|
||||
lui $2, 65536
|
||||
lui $2, 0x10000000000000000
|
||||
lui $2, $3
|
||||
lui $2, ($3)
|
||||
lui $2, 0+$3
|
||||
lui $2, (($3))
|
||||
|
@ -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'
|
||||
|
Loading…
Reference in New Issue
Block a user