* config/tc-mips.c (append_insn): For mips16, insert a nop between
authorGavin Romig-Koch <gavin@redhat.com>
Tue, 29 Dec 1998 15:46:59 +0000 (15:46 +0000)
committerGavin Romig-Koch <gavin@redhat.com>
Tue, 29 Dec 1998 15:46:59 +0000 (15:46 +0000)
a read of HI or LO and an immediatly following branch.

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

index 8b74eb28a8df465b7f49d67844d0ef694b527efd..c3b7408cb862deea77ab43af8798d3944de84886 100644 (file)
@@ -1,3 +1,8 @@
+1998-12-29  Gavin Romig-Koch  <gavin@cygnus.com>
+
+       * config/tc-mips.c (append_insn): For mips16, insert a nop between
+       a read of HI or LO and an immediatly following branch.
+
 1998-12-29  Gavin Romig-Koch  <gavin@cygnus.com>
 
        * config/tc-mips.c (md_begin): Another correction to the setting of
index a2e1afe3c4b0ecf2cf8e8c075d03260fae693f55..26b12e30cb87b94080b1d6f0445f509970813c18 100644 (file)
@@ -1689,6 +1689,16 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
              && (mips_optimize == 0
                  || (pinfo & INSN_WRITE_LO)))
            nops += 2;
+         /* Most mips16 branch insns don't have a delay slot.
+            If a read from LO is immediately followed by a branch
+            to a write to LO we have a read followed by a write
+            less than 2 insns away.  We assume the target of
+            a branch might be a write to LO, and insert a nop
+            between a read and an immediately following branch. */
+         else if (mips_opts.mips16
+                  && (mips_optimize == 0
+                      || (pinfo & MIPS16_INSN_BRANCH)))
+           nops += 1;
        }
       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
        {
@@ -1701,6 +1711,16 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
              && (mips_optimize == 0
                  || (pinfo & INSN_WRITE_HI)))
            nops += 2;
+         /* Most mips16 branch insns don't have a delay slot.
+            If a read from HI is immediately followed by a branch
+            to a write to HI we have a read followed by a write
+            less than 2 insns away.  We assume the target of
+            a branch might be a write to HI, and insert a nop
+            between a read and an immediately following branch. */
+         else if (mips_opts.mips16
+                  && (mips_optimize == 0
+                      || (pinfo & MIPS16_INSN_BRANCH)))
+           nops += 1;
        }
 
       /* If the previous instruction was in a noreorder section, then