* config/tc-mn10300.c (md_assemble): Handle MN10300_OPERAND_REG_LIST.

So GCC can use movm in prologue/epilogues.
This commit is contained in:
Jeff Law 1996-11-19 20:35:19 +00:00
parent 99246e03f9
commit 7f02192d13
2 changed files with 76 additions and 2 deletions

View file

@ -1,3 +1,7 @@
Tue Nov 19 13:35:22 1996 Jeffrey A Law (law@cygnus.com)
* config/tc-mn10300.c (md_assemble): Handle MN10300_OPERAND_REG_LIST.
Mon Nov 18 15:26:55 1996 Jeffrey A Law (law@cygnus.com)
* config/tc-mn10300.c (mn10300_insert_operand): Provide prototype

View file

@ -465,7 +465,7 @@ md_assemble (str)
errmsg = NULL;
while (*str == ' ' || *str == ',' || *str == '[' || *str == ']')
while (*str == ' ' || *str == ',')
++str;
/* Gather the operand. */
@ -547,6 +547,76 @@ md_assemble (str)
*input_line_pointer = c;
goto keep_going;
}
else if (operand->flags & MN10300_OPERAND_REG_LIST)
{
unsigned int value = 0;
if (*input_line_pointer != '[')
{
input_line_pointer = hold;
str = hold;
goto error;
}
/* Eat the '['. */
input_line_pointer++;
/* A null register list can not be specified. */
if (*input_line_pointer == ']')
{
input_line_pointer = hold;
str = hold;
goto error;
}
while (*input_line_pointer != ']')
{
char *start;
char c;
if (*input_line_pointer == ',')
input_line_pointer++;
start = input_line_pointer;
c = get_symbol_end ();
if (strcmp (start, "d2") == 0)
{
value |= 0x80;
*input_line_pointer = c;
}
else if (strcmp (start, "d3") == 0)
{
value |= 0x40;
*input_line_pointer = c;
}
else if (strcmp (start, "a2") == 0)
{
value |= 0x20;
*input_line_pointer = c;
}
else if (strcmp (start, "a3") == 0)
{
value |= 0x10;
*input_line_pointer = c;
}
else if (strcmp (start, "other") == 0)
{
value |= 0x08;
*input_line_pointer = c;
}
else
{
input_line_pointer = hold;
str = hold;
goto error;
}
}
input_line_pointer++;
mn10300_insert_operand (&insn, &extension, operand,
value, (char *) NULL, 0, 0);
goto keep_going;
}
else if (data_register_name (&ex))
{
input_line_pointer = hold;
@ -649,7 +719,7 @@ keep_going:
str = input_line_pointer;
input_line_pointer = hold;
while (*str == ' ' || *str == ',' || *str == '[' || *str == ']')
while (*str == ' ' || *str == ',')
++str;
}