* config/tc-mips.c (append_insn): Warn about an attempt to put an
authorIan Lance Taylor <ian@airs.com>
Wed, 12 Feb 1997 20:20:11 +0000 (20:20 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 12 Feb 1997 20:20:11 +0000 (20:20 +0000)
  extended instruction in a delay slot when not reordering.  Set
  prev_insn_valid even if not reordering.
(md_convert_frag): Warn if an extended instruction appears in a
delay slot.

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

index 0afe16e9348d2301fdb73dc2eb10de59d1c67b6e..2e3978d2a037e6b258c135d0343e103d768bd23d 100644 (file)
@@ -1,5 +1,11 @@
 Wed Feb 12 14:36:29 1997  Ian Lance Taylor  <ian@cygnus.com>
 
+       * config/tc-mips.c (append_insn): Warn about an attempt to put an
+       extended instruction in a delay slot when not reordering.  Set
+       prev_insn_valid even if not reordering.
+       (md_convert_frag): Warn if an extended instruction appears in a
+       delay slot.
+
        * config/tc-mips.c (mips_pseudo_table): Add "insn".
        (s_insn): New static function.
        * doc/c-mips.texi: Document .insn.
index 683019846b2f0fb0a03acb05981ef43df75542f9..04be71e9410f5c24c2ee8ccd63dbd6947b71d95e 100644 (file)
@@ -1493,7 +1493,15 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
       f = frag_more (2);
     }
   else
-    f = frag_more (4);
+    {
+      if (mips16
+         && mips_noreorder
+         && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
+       as_warn ("extended instruction in delay slot");
+
+      f = frag_more (4);
+    }
+
   fixp = NULL;
   if (address_expr != NULL && reloc_type < BFD_RELOC_UNUSED)
     {
@@ -1980,6 +1988,7 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
          PC relative relocs.  */
       prev_insn = *ip;
       prev_insn_reloc_type = reloc_type;
+      prev_insn_valid = 1;
     }
 
   /* We just output an insn, so the next one doesn't have a label.  */
@@ -9969,6 +9978,12 @@ md_convert_frag (abfd, asec, fragp)
            record_alignment (asec, op->shift);
        }
 
+      if (ext
+         && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
+             || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
+       as_warn_where (fragp->fr_file, fragp->fr_line,
+                      "extended instruction in delay slot");
+
       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
 
       if (target_big_endian)