* config/tc-mn10300.c (md_assemble): Handle MN10300_OPERAND_REG_LIST.
authorJeff Law <law@redhat.com>
Tue, 19 Nov 1996 20:35:19 +0000 (20:35 +0000)
committerJeff Law <law@redhat.com>
Tue, 19 Nov 1996 20:35:19 +0000 (20:35 +0000)
So GCC can use movm in prologue/epilogues.

gas/ChangeLog
gas/config/tc-mn10300.c

index fe76333..a98f085 100644 (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
index 02f78b1..53b5ddb 100644 (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;
 
        }