From f77ef3e29a6246edee20b5908e99b2c92f245a6b Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 23 Jun 2011 20:21:38 +0000 Subject: [PATCH] gas/ 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 | 6 ++++++ gas/config/tc-mips.c | 14 ++++++++++++-- gas/testsuite/ChangeLog | 5 +++++ gas/testsuite/gas/mips/mips.exp | 2 ++ gas/testsuite/gas/mips/pr12915.d | 15 +++++++++++++++ gas/testsuite/gas/mips/pr12915.s | 5 +++++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/mips/pr12915.d create mode 100644 gas/testsuite/gas/mips/pr12915.s diff --git a/gas/ChangeLog b/gas/ChangeLog index be2b8f5..2abdf3e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2011-06-23 Richard Sandiford + + PR gas/12915 + * config/tc-mips.c (append_insn): Only consider hazards between the + pre-noreorder block and ip. + 2011-06-21 Sameera Deshpande * config/tc-arm.c (vfp_conv): Add check on range of immediate operand diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 33d8896..8430883 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -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. */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 087e778..ca62de9 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-23 Richard Sandiford + + * gas/mips/pr12915.s, gas/mips/pr12915.d: New test. + * gas/mips/mips.exp: Run it. + 2011-06-21 Sameera Deshpande * gas/arm/vcvt-bad.d: New test. diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index 8995518..d51ac43 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -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 index 0000000..95e4e2d --- /dev/null +++ b/gas/testsuite/gas/mips/pr12915.d @@ -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 index 0000000..6de26ca --- /dev/null +++ b/gas/testsuite/gas/mips/pr12915.s @@ -0,0 +1,5 @@ + lui $27, %hi(kernelsp) + lw $27, %lo(kernelsp)($27) + .set noreorder + mfc0 $28, $14 + addu $28, 4 -- 2.7.4