aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorDavid Ung <davidu@mips.com>2005-09-01 16:35:41 +0000
committerDavid Ung <davidu@mips.com>2005-09-01 16:35:41 +0000
commite9df6573ba865dc6aa5328277ad81922a7ac3ee3 (patch)
tree1657741f7f0d11fde3749e887e26b114bdb01ea0 /gas
parent84320456461de4db843a980c115aef27d107b126 (diff)
downloadgdb-e9df6573ba865dc6aa5328277ad81922a7ac3ee3.zip
gdb-e9df6573ba865dc6aa5328277ad81922a7ac3ee3.tar.gz
gdb-e9df6573ba865dc6aa5328277ad81922a7ac3ee3.tar.bz2
* config/tc-mips.c (append_insn): Correctly handle mips16 case
when the frags are different for the 2 instructions we want to swap. If the lengths of the 2 instructions are not the same, we won't do the swap but emit an nop.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-mips.c19
2 files changed, 23 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8c54b20..56d99c1 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2005-09-01 David Ung <davidu@mips.com>
+
+ * config/tc-mips.c (append_insn): Correctly handle mips16 case
+ when the frags are different for the 2 instructions we want to
+ swap. If the lengths of the 2 instructions are not the same, we
+ won't do the swap but emit an nop.
+
2005-09-01 Dmitry Diky <diwil@spec.ru>
* config/tc-msp430.c (msp430_operands): Emit dwarf2_emit_insn()
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 37d2613..a2879b1 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -2698,9 +2698,22 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
struct mips_cl_insn delay = history[0];
if (mips_opts.mips16)
{
- know (delay.frag == ip->frag);
- move_insn (ip, delay.frag, delay.where);
- move_insn (&delay, ip->frag, ip->where + insn_length (ip));
+ if (delay.frag == ip->frag)
+ {
+ move_insn (ip, delay.frag, delay.where);
+ move_insn (&delay, ip->frag, delay.where
+ + insn_length (ip));
+ }
+ else if (insn_length (ip) == insn_length (&delay))
+ {
+ move_insn (&delay, ip->frag, ip->where);
+ move_insn (ip, history[0].frag, history[0].where);
+ }
+ else
+ {
+ add_fixed_insn (NOP_INSN);
+ delay = *NOP_INSN;
+ }
}
else if (relaxed_branch)
{