[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