* config/tc-v850.c (md_apply_fix3): Use little endian get/put
authorJeff Law <law@redhat.com>
Sat, 31 Aug 1996 05:52:38 +0000 (05:52 +0000)
committerJeff Law <law@redhat.com>
Sat, 31 Aug 1996 05:52:38 +0000 (05:52 +0000)
        routines to fetch/store the updated instruction from/to memory.
        (v850_insert_operand): If the operand has a specialized insert
        routine, call it.
Getting fixups closer.  At least br <target> works now.

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

index c480f7a371dba07da962af24bfb3b76b49aecd9b..0ba20b8e56682cb3d9012012f715cc30fd2a7585 100644 (file)
@@ -1,4 +1,11 @@
 start-sanitize-v850
+Fri Aug 30 23:50:08 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * config/tc-v850.c (md_apply_fix3): Use little endian get/put
+       routines to fetch/store the updated instruction from/to memory.
+       (v850_insert_operand): If the operand has a specialized insert
+       routine, call it.
+
 Fri Aug 30 18:35:26 1996  J.T. Conklin  <jtc@hippo.cygnus.com>
 
        * config/tc-v850.c (reg_name_search): Align calling convention to
index 8f562344472fa2e60fdd483e3bcef5b86a3a3b11..80249937509f970d6c258a94f9756bf6ae88bbcd 100644 (file)
@@ -883,12 +883,16 @@ md_apply_fix3 (fixp, valuep, seg)
       operand = &v850_operands[opindex];
 
       /* Fetch the instruction, insert the fully resolved operand
-         value, and stuff the instruction back again. */
+         value, and stuff the instruction back again.
+
+        Note the instruction has been stored in little endian
+        format!  */
       where = fixp->fx_frag->fr_literal + fixp->fx_where;
-      insn = bfd_getb32((unsigned char *) where);
+
+      insn = bfd_getl32((unsigned char *) where);
       insn = v850_insert_operand (insn, operand, (offsetT) value,
                                  fixp->fx_file, fixp->fx_line);
-      bfd_putb32((bfd_vma) insn, (unsigned char *) where);
+      bfd_putl32((bfd_vma) insn, (unsigned char *) where);
 
       if (fixp->fx_done)
        {
@@ -971,6 +975,19 @@ v850_insert_operand (insn, operand, val, file, line)
         }
     }
 
-  insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
+  if (operand->insert)
+    {
+      const char *message = NULL;
+      insn = (operand->insert) (insn, val, &message);
+      if (message != NULL)
+       {
+         if (file == (char *) NULL)
+           as_warn (message);
+         else
+           as_warn_where (file, line, message);
+       }
+    }
+  else
+    insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
   return insn;
 }