This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[committed] Tweak tracking of MIPS branch history
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: binutils at sourceware dot org
- Date: Wed, 29 Jun 2011 21:45:31 +0100
- Subject: [committed] Tweak tracking of MIPS branch history
We currently clear the history after an unconditional branch in
a ".set reorder" section. We should really do the same for
unconditional branches in a ".set noreorder" section, so that
hazards between earlier instructions don't come into play once
the ".set noreorder" block is over.
Tested on:
mips64-elf mips64el-unknown-kfreebsd-gnu mips64-linux-gnu
mips64octeon-linux-gnu mips64-unknown-kfreebsd-gnu
mipsel-unknown-kfreebsd-gnu mipsisa32el-linux-gnu
mipsisa64-elf mips-linux-gnu mips-sgi-irix6.5
mips-unknown-kfreebsd-gnu mips-wrs-vxworks
and applied.
Richard
gas/
* config/tc-mips.c (append_insn): Always clear the history after an
unconditional branch.
Index: gas/config/tc-mips.c
===================================================================
--- gas/config/tc-mips.c 2011-06-29 19:56:09.000000000 +0100
+++ gas/config/tc-mips.c 2011-06-29 19:56:59.000000000 +0100
@@ -3609,13 +3609,6 @@ append_insn (struct mips_cl_insn *ip, ex
delay.fixed_p = 1;
insert_into_history (0, 1, &delay);
}
-
- /* If that was an unconditional branch, forget the previous
- insn information. */
- if (pinfo & INSN_UNCOND_BRANCH_DELAY)
- {
- mips_no_prev_insn ();
- }
}
else if (pinfo & INSN_COND_BRANCH_LIKELY)
{
@@ -3632,6 +3625,12 @@ append_insn (struct mips_cl_insn *ip, ex
else
insert_into_history (0, 1, ip);
+ /* If we have just completed an unconditional branch, clear the history. */
+ if ((history[1].insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY)
+ || (mips_opts.mips16
+ && (history[0].insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH)))
+ mips_no_prev_insn ();
+
/* We just output an insn, so the next one doesn't have a label. */
mips_clear_insn_labels ();
}