gas/
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 23 Jun 2011 20:21:38 +0000 (20:21 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Thu, 23 Jun 2011 20:21:38 +0000 (20:21 +0000)
PR gas/12915
* config/tc-mips.c (append_insn): Only consider hazards between the
pre-noreorder block and ip.

gas/testsuite/
* gas/mips/pr12915.s, gas/mips/pr12915.d: New test.
* gas/mips/mips.exp: Run it.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/pr12915.d [new file with mode: 0644]
gas/testsuite/gas/mips/pr12915.s [new file with mode: 0644]

index be2b8f5081814b1eb66d5e37a4f27a0f24950309..2abdf3eb0da6bc3059f439669722ba81014007b2 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-23  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR gas/12915
+       * config/tc-mips.c (append_insn): Only consider hazards between the
+       pre-noreorder block and ip.
+
 2011-06-21  Sameera Deshpande  <sameera.deshpande@arm.com>
 
        * config/tc-arm.c (vfp_conv): Add check on range of immediate operand
index 33d88964f899f6e441f90b0ba9febeb43eeb7063..84308831c1d66f40d010184581c22d1116976fd1 100644 (file)
@@ -3154,8 +3154,18 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
     }
   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
     {
-      /* Work out how many nops in prev_nop_frag are needed by IP.  */
-      int nops = nops_for_insn_or_target (history, ip);
+      struct mips_cl_insn stubbed_history[ARRAY_SIZE (history)];
+      int nops, i;
+
+      /* Work out how many nops in prev_nop_frag are needed by IP.
+        Base this on a history in which all insns since prev_nop_frag
+        are stubbed out with nops.  */
+      for (i = 0; i < (int) ARRAY_SIZE (history); i++)
+       if (i < prev_nop_frag_since)
+         stubbed_history[i] = *NOP_INSN;
+       else
+         stubbed_history[i] = history[i];
+      nops = nops_for_insn_or_target (stubbed_history, ip);
       gas_assert (nops <= prev_nop_frag_holds);
 
       /* Enforce NOPS as a minimum.  */
index 087e7782876bb2b6e87ea31a0c58f05baf1bd058..ca62de95b6b46b3183239e72b679bd61318bc690 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-23  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gas/mips/pr12915.s, gas/mips/pr12915.d: New test.
+       * gas/mips/mips.exp: Run it.
+
 2011-06-21  Sameera Deshpande  <sameera.deshpande@arm.com>
 
        * gas/arm/vcvt-bad.d: New test.
index 8995518a769dc57f191df88565530e2fcc798886..d51ac43b3cadabe6dc7968fb5c5ee6ba8fb82a64 100644 (file)
@@ -1000,4 +1000,6 @@ if { [istarget mips*-*-vxworks*] } {
                                        [mips_arch_list_matching mips32r2] ] ]
 
     if $has_newabi { run_dump_test "cfi-n64-1" }
+
+    run_dump_test "pr12915"
 }
diff --git a/gas/testsuite/gas/mips/pr12915.d b/gas/testsuite/gas/mips/pr12915.d
new file mode 100644 (file)
index 0000000..95e4e2d
--- /dev/null
@@ -0,0 +1,15 @@
+#as: -32 -mips1
+#objdump: -dr
+
+.*
+
+
+Disassembly of section \.text:
+
+00000000 <\.text>:
+   0:  3c1b0000        lui     k1,0x0
+                       0: R_MIPS_HI16  kernelsp
+   4:  8f7b0000        lw      k1,0\(k1\)
+                       4: R_MIPS_LO16  kernelsp
+   8:  401c7000        mfc0    gp,c0_epc
+   c:  279c0004        addiu   gp,gp,4
diff --git a/gas/testsuite/gas/mips/pr12915.s b/gas/testsuite/gas/mips/pr12915.s
new file mode 100644 (file)
index 0000000..6de26ca
--- /dev/null
@@ -0,0 +1,5 @@
+       lui     $27, %hi(kernelsp)
+       lw      $27, %lo(kernelsp)($27)
+       .set    noreorder
+       mfc0    $28, $14
+       addu    $28, 4