* config/tc-mn10300.c (md_assemble): Insert operands into
authorJeff Law <law@redhat.com>
Tue, 5 Nov 1996 20:32:07 +0000 (20:32 +0000)
committerJeff Law <law@redhat.com>
Tue, 5 Nov 1996 20:32:07 +0000 (20:32 +0000)
        the extension part of the instruction if necessary.
        (mn10300_insert_operand): Accept pointer to extension word
        argument.  Make insn a pointer argument too.  Return type
        is now void.  All callers changed.
So we can correct insert operands into any instruction except those
which have 32bit operands.

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

index c90d55f96a128c4cf7e2c1aa69871cc1fcbbf34c..3ccf24555093ed1a72885b47e06ff12f9b618226 100644 (file)
@@ -1,3 +1,11 @@
+Tue Nov  5 13:30:40 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * config/tc-mn10300.c (md_assemble): Insert operands into
+       the extension part of the instruction if necessary.
+       (mn10300_insert_operand): Accept pointer to extension word
+       argument.  Make insn a pointer argument too.  Return type
+       is now void.  All callers changed.
+
 Mon Nov  4 12:53:40 1996  Jeffrey A Law  (law@cygnus.com)
 
        * config/tc-mn10300.c (mn10300_insert_operand): Handle
index a4e08efeac4535c908576014b43b514b11f46e9e..b120fa5ab5ae6103ea3ea202ffd9691a081a7476 100644 (file)
@@ -404,7 +404,7 @@ md_assemble (str)
   struct mn10300_opcode *next_opcode;
   const unsigned char *opindex_ptr;
   int next_opindex;
-  unsigned long insn, size;
+  unsigned long insn, extension, size;
   char *f;
   int i;
   int match;
@@ -441,6 +441,7 @@ md_assemble (str)
       match = 0;
       next_opindex = 0;
       insn = opcode->opcode;
+      extension = 0;
       for (op_idx = 1, opindex_ptr = opcode->operands;
           *opindex_ptr != 0;
           opindex_ptr++, op_idx++)
@@ -597,8 +598,9 @@ md_assemble (str)
              else
                extra_shift = 0;
              
-             insn = mn10300_insert_operand (insn, operand, ex.X_add_number,
-                                         (char *) NULL, 0, extra_shift);
+             mn10300_insert_operand (&insn, &extension, operand,
+                                     ex.X_add_number, (char *) NULL,
+                                     0, extra_shift);
 
              break;
 
@@ -614,8 +616,9 @@ md_assemble (str)
                  goto error;
                }
 
-             insn = mn10300_insert_operand (insn, operand, ex.X_add_number,
-                                         (char *) NULL, 0, 0);
+             mn10300_insert_operand (&insn, &extension, operand,
+                                     ex.X_add_number, (char *) NULL,
+                                     0, 0);
              break;
 
            default:
@@ -702,7 +705,7 @@ keep_going:
   f = frag_more (size);
   number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
   if (size > 4)
-    number_to_chars_bigendian (f + 4, 0, size - 4);
+    number_to_chars_bigendian (f + 4, extension, size - 4);
 }
 
 
@@ -792,7 +795,7 @@ md_apply_fix3 (fixp, valuep, seg)
       int opindex;
       const struct mn10300_operand *operand;
       char *where;
-      unsigned long insn;
+      unsigned long insn, extension;
 
       opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
       operand = &mn10300_operands[opindex];
@@ -805,8 +808,10 @@ md_apply_fix3 (fixp, valuep, seg)
       where = fixp->fx_frag->fr_literal + fixp->fx_where;
 
       insn = bfd_getl32((unsigned char *) where);
-      insn = mn10300_insert_operand (insn, operand, (offsetT) value,
-                                 fixp->fx_file, fixp->fx_line, 0);
+      extension = 0;
+      mn10300_insert_operand (&insn, &extension, operand,
+                             (offsetT) value, fixp->fx_file,
+                             fixp->fx_line, 0);
       bfd_putl32((bfd_vma) insn, (unsigned char *) where);
 
       if (fixp->fx_done)
@@ -843,9 +848,10 @@ md_apply_fix3 (fixp, valuep, seg)
 
 /* Insert an operand value into an instruction.  */
 
-static unsigned long
-mn10300_insert_operand (insn, operand, val, file, line, shift)
-     unsigned long insn;
+static void
+mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
+     unsigned long *insnp;
+     unsigned long *extensionp;
      const struct mn10300_operand *operand;
      offsetT val;
      char *file;
@@ -885,13 +891,24 @@ mn10300_insert_operand (insn, operand, val, file, line, shift)
         }
     }
 
-  insn |= (((long) val & ((1 << operand->bits) - 1))
-          << (operand->shift + shift));
+  if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
+    {
+      *insnp |= (((long) val & ((1 << operand->bits) - 1))
+                << (operand->shift + shift));
+
+      if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
+       *insnp |= (((long) val & ((1 << operand->bits) - 1))
+                  << (operand->shift + shift + 2));
+    }
+  else
+    {
+      *extensionp |= (((long) val & ((1 << operand->bits) - 1))
+                     << (operand->shift + shift));
 
-  if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
-    insn |= (((long) val & ((1 << operand->bits) - 1))
-            << (operand->shift + shift + 2));
-  return insn;
+      if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
+       *extensionp |= (((long) val & ((1 << operand->bits) - 1))
+                       << (operand->shift + shift + 2));
+    }
 }
 
 static unsigned long