gas/arc: Remove preprocess_operands function

The preprocess_operands function changes the incoming list of assembler
tokens based on the assumption that the first arc_operand found will be
the same instruction class as all of the arc_operands for the same
mnemonic.

Though this assumption is probably fine, removing this assumption, and
pushing the token change down into assemble_tokens makes the code no
more complex, and might even be easier to follow.

There should be no user visible changes after this commit.

gas/ChangeLog:

	* config/tc-arc.c (find_opcode_match): Handle O_symbol case, add
	new de_fault label.
	(preprocess_operands): Delete.
	(assemble_tokens): Remove call to preprocess_operands.
This commit is contained in:
Andrew Burgess 2016-03-28 15:49:25 +01:00
parent e140100a5d
commit 22b92fc42c
2 changed files with 40 additions and 46 deletions

View file

@ -1,3 +1,10 @@
2016-04-07 Andrew Burgess <andrew.burgess@embecosm.com>
* config/tc-arc.c (find_opcode_match): Handle O_symbol case, add
new de_fault label.
(preprocess_operands): Delete.
(assemble_tokens): Remove call to preprocess_operands.
2016-04-07 Nick Clifton <nickc@redhat.com>
PR gas/19910

View file

@ -1506,6 +1506,38 @@ find_opcode_match (const struct arc_opcode *first_opcode,
++ntok;
break;
case O_symbol:
{
const char *p;
size_t len;
const struct arc_aux_reg *auxr;
unsigned j;
if (opcode->class != AUXREG)
goto de_fault;
p = S_GET_NAME (tok[tokidx].X_add_symbol);
len = strlen (p);
auxr = &arc_aux_regs[0];
for (j = 0; j < arc_num_aux_regs; j++, auxr++)
if (len == auxr->length
&& strcasecmp (auxr->name, p) == 0
&& ((auxr->subclass == NONE)
|| check_cpu_feature (auxr->subclass)))
{
/* We modify the token array here, safe in the
knowledge, that if this was the wrong choice
then the original contents will be restored
from BKTOK. */
tok[tokidx].X_op = O_constant;
tok[tokidx].X_add_number = auxr->address;
break;
}
if (tok[tokidx].X_op != O_constant)
goto de_fault;
}
/* Fall-through */
case O_constant:
/* Check the range. */
if (operand->bits != 32
@ -1578,6 +1610,7 @@ find_opcode_match (const struct arc_opcode *first_opcode,
break;
}
default:
de_fault:
if (operand->default_reloc == 0)
goto match_failed; /* The operand needs relocation. */
@ -1970,50 +2003,6 @@ find_special_case (const char *opname,
return opcode;
}
static void
preprocess_operands (const struct arc_opcode *opcode,
expressionS *tok,
int ntok)
{
int i;
size_t len;
const char *p;
unsigned j;
const struct arc_aux_reg *auxr;
for (i = 0; i < ntok; i++)
{
switch (tok[i].X_op)
{
case O_illegal:
case O_absent:
break; /* Throw and error. */
case O_symbol:
if (opcode->class != AUXREG)
break;
/* Convert the symbol to a constant if possible. */
p = S_GET_NAME (tok[i].X_add_symbol);
len = strlen (p);
auxr = &arc_aux_regs[0];
for (j = 0; j < arc_num_aux_regs; j++, auxr++)
if (len == auxr->length
&& (strcasecmp (auxr->name, p) == 0)
&& ((auxr->subclass == NONE)
|| check_cpu_feature (auxr->subclass)))
{
tok[i].X_op = O_constant;
tok[i].X_add_number = auxr->address;
break;
}
break;
default:
break;
}
}
}
/* Given an opcode name, pre-tockenized set of argumenst and the
opcode flags, take it all the way through emission. */
@ -2041,8 +2030,6 @@ assemble_tokens (const char *opname,
frag_now->fr_file, frag_now->fr_line, opcode->name,
opcode->opcode);
preprocess_operands (opcode, tok, ntok);
found_something = TRUE;
opcode = find_opcode_match (opcode, tok, &ntok, pflags, nflgs, &cpumatch);
if (opcode)