From e9df6573ba865dc6aa5328277ad81922a7ac3ee3 Mon Sep 17 00:00:00 2001 From: David Ung Date: Thu, 1 Sep 2005 16:35:41 +0000 Subject: [PATCH] * 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. --- gas/ChangeLog | 7 +++++++ gas/config/tc-mips.c | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 8c54b2053e..56d99c14ce 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2005-09-01 David Ung + + * 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 * 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 37d26138b2..a2879b12ac 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) {