[patch] MIPS Gas: generating mips16e jrc/jalrc instruction.
David Ung
davidu@mips.com
Thu Oct 13 16:35:00 GMT 2005
This patch allows the assembler to patch MIPS16 jr/jalr instructions
with their "compact" versions (jrc/jalrc in MIPS16e for
MIPS32/MIPS32R2/MIPS64/MIPS64R2) in the case where a nop would normally
be emitted as a delay slot instruction after the jump.
Tested and passes gcc regressions under mips-sim-idt32/-mips32/-mips16.
Ok for mainline?
David.
* config/tc-mips.c (append_insn): Convert MIPS16 jr/jalr jumps
into jrc/jalrc versions if ISA_MIPS32+ and not doing the swap,
hence avoiding to emit a nop.
Index: gas/config/tc-mips.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-mips.c,v
retrieving revision 1.323
diff -c -p -b -r1.323 tc-mips.c
*** gas/config/tc-mips.c 11 Oct 2005 11:16:16 -0000 1.323
--- gas/config/tc-mips.c 13 Oct 2005 16:08:05 -0000
*************** append_insn (struct mips_cl_insn *ip, ex
*** 2697,2704 ****
--- 2697,2722 ----
portions of this object file; we could pick up the
instruction at the destination, put it in the delay
slot, and bump the destination address. */
+ if (mips_opts.mips16
+ && (pinfo & INSN_UNCOND_BRANCH_DELAY)
+ && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
+ && (mips_opts.isa == ISA_MIPS32
+ || mips_opts.isa == ISA_MIPS32R2
+ || mips_opts.isa == ISA_MIPS64
+ || mips_opts.isa == ISA_MIPS64R2))
+ {
+ /* convert MIPS16 jr/jalr into a "compact" jump */
+ ip->insn_opcode |= 0x0080;
+ md_number_to_chars (ip->frag->fr_literal + ip->where,
+ ip->insn_opcode, 2);
+ insert_into_history (0, 1, ip);
+ }
+ else
+ {
insert_into_history (0, 1, ip);
emit_nop ();
+ }
+
if (mips_relax.sequence)
mips_relax.sizes[mips_relax.sequence - 1] += 4;
}
More information about the Binutils
mailing list