OSDN Git Service

* config/tc-tic4x.c (md_assemble): Added support for one-line parallel insns.
authorSvein Seldal <svein@dev.seldal.com>
Sun, 18 May 2003 22:23:15 +0000 (22:23 +0000)
committerSvein Seldal <svein@dev.seldal.com>
Sun, 18 May 2003 22:23:15 +0000 (22:23 +0000)
(tic4x_start_line): Fixed scrub bug and added error for three-element
parallel insns.

gas/ChangeLog
gas/config/tc-tic4x.c
gas/config/tc-tic4x.h

index cf40ace..c31a747 100644 (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
index 203fb42..09a90de 100644 (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;
index 14b0683..0d6c72c 100644 (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