* config/tc-tic4x.c (md_assemble): Added support for one-line parallel insns.

(tic4x_start_line): Fixed scrub bug and added error for three-element
	parallel insns.
This commit is contained in:
Svein Seldal 2003-05-18 22:23:15 +00:00
parent b645cb1726
commit a1f3c24c25
3 changed files with 43 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2003-05-19 Svein E. Seldal <Svein.Seldal@solidas.com>
* config/tc-tic4x.c (md_assemble): Added support for one-line parallel insns.
(tic4x_start_line): Fixed scrub bug and added error for three-element
parallel insns.
2003-05-18 Jason Eckhardt <jle@rice.edu>
* config/tc-i860.c (i860_process_insn): Initialize fc after

View File

@ -2567,27 +2567,44 @@ md_assemble (str)
tic4x_inst_t *inst; /* Instruction template. */
tic4x_inst_t *first_inst;
/* Scan for parallel operators */
if (str)
{
s = str;
while (*s && *s != '|')
s++;
if (*s && s[1]=='|')
{
if(insn->parallel)
{
as_bad ("Parallel opcode cannot contain more than two instructions");
insn->parallel = 0;
insn->in_use = 0;
return;
}
/* Lets take care of the first part of the parallel insn */
*s++ = 0;
md_assemble(str);
insn->parallel = 1;
str = ++s;
/* .. and let the second run though here */
}
}
if (str && insn->parallel)
{
int star;
/* Find mnemonic (second part of parallel instruction). */
s = str;
/* Skip past instruction mnemonic. */
while (*s && *s != ' ' && *s != '*')
while (*s && *s != ' ')
s++;
star = *s == '*';
if (*s) /* Null terminate for hash_find. */
*s++ = '\0'; /* and skip past null. */
strcat (insn->name, "_");
strncat (insn->name, str, TIC4X_NAME_MAX - strlen (insn->name));
/* Kludge to overcome problems with scrubber removing
space between mnemonic and indirect operand (starting with *)
on second line of parallel instruction. */
if (star)
*--s = '*';
insn->operands[insn->num_operands++].mode = M_PARALLEL;
if ((i = tic4x_operands_parse
@ -3141,13 +3158,19 @@ tic4x_start_line ()
if (insn->in_use)
{
insn->parallel = 1;
input_line_pointer += 2;
input_line_pointer ++;
*input_line_pointer = ' ';
/* So line counters get bumped. */
input_line_pointer[-1] = '\n';
}
else
{
as_bad ("Parallel opcode cannot contain more than two instructions");
}
}
else
{
/* Write out the previous insn here */
if (insn->in_use)
md_assemble (NULL);
input_line_pointer = s;

View File

@ -71,6 +71,9 @@
#define NO_RELOC 0
/* '||' denotes parallel instruction */
#define DOUBLEBAR_PARALLEL 1
/* Labels are not required to have a colon for a suffix. */
#define LABELS_WITHOUT_COLONS 1