summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@imgtec.com>2016-06-30 12:46:47 +0100
committerMaciej W. Rozycki <macro@imgtec.com>2016-06-30 15:11:23 +0100
commit5e35670ba76690524dc69cc7a2bc8d7df8eb4249 (patch)
tree8a11d2a765cc5ef22e797cbdc133c753bc27f24b
parent93a24ba79b59ec343611c16cd0024a116a705274 (diff)
downloadbinutils-5e35670ba76690524dc69cc7a2bc8d7df8eb4249.tar.gz
binutils-5e35670ba76690524dc69cc7a2bc8d7df8eb4249.tar.bz2
binutils-5e35670ba76690524dc69cc7a2bc8d7df8eb4249.zip
MIPS/GAS: Simplify non-MIPS16 branch swapping sequence
Simplify non-MIPS16 branch swapping by copying the MIPS16 variant, which sets the new position for the current instruction first and reduces the calculation of the new position of the previous instruction. Also refer to previous instruction's frag and position via `delay' for consistency. Reintroduce an explanatory comment, updated, previously removed with: commit 1e91584932efd70020c8c98037d0cb93a0552a20 Author: Richard Sandiford <rdsandiford@googlemail.com> Date: Wed Mar 9 09:17:02 2005 +0000 <https://sourceware.org/ml/binutils/2005-03/msg00217.html>, ("Rework MIPS nop-insertion code, add -mfix-vr4130 [5/11]"). gas/ * config/tc-mips.c (append_insn): Simplify non-MIPS16 branch swapping sequence.
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c7
2 files changed, 9 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 300d5ca37b7..4459273acc2 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,10 @@
2016-06-30 Maciej W. Rozycki <macro@imgtec.com>
+ * config/tc-mips.c (append_insn): Simplify non-MIPS16 branch
+ swapping sequence.
+
+2016-06-30 Maciej W. Rozycki <macro@imgtec.com>
+
PR gas/20312
* write.c (subsegs_finish_section): Force no section padding to
alignment on failed assembly, always set last frag's alignment
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 092e7b430d2..77ba0c92268 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -7537,9 +7537,10 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
}
else
{
- move_insn (&delay, ip->frag,
- ip->where - branch_disp + insn_length (ip));
- move_insn (ip, history[0].frag, history[0].where);
+ /* If this is not a relaxed branch and we are in the
+ same frag, then just swap the instructions. */
+ move_insn (ip, delay.frag, delay.where);
+ move_insn (&delay, ip->frag, ip->where + insn_length (ip));
}
history[0] = *ip;
delay.fixed_p = 1;