This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] MIPS Gas: generating mips16e jrc/jalrc instruction.


latest revised patch attached.
gas regression ok.  ok to comit??

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.

	* gas/mips/mips.exp: Run new test.
	* gas/testsuite/gas/mips/mips16e-jrc.s: New test for converting
	jalr/jr to the compact jalrc/jrc instructions.
	* gas/testsuite/gas/mips/mips16e-jrc.d: New.

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	19 Oct 2005 12:17:37 -0000
*************** append_insn (struct mips_cl_insn *ip, ex
*** 2693,2704 ****
--- 2693,2721 ----
  		 sync.p, we can not swap.  */
  	      || (prev_pinfo & INSN_SYNC))
  	    {
+ 	      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;
+ 		  install_insn (ip);
+ 		  insert_into_history (0, 1, ip);
+ 		} 
+ 	      else
+ 		{
  		  /* We could do even better for unconditional branches to
  		     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.  */
  		  insert_into_history (0, 1, ip);
  		  emit_nop ();
+ 		}
+ 		
  	      if (mips_relax.sequence)
  		mips_relax.sizes[mips_relax.sequence - 1] += 4;
  	    }

Index: gas/testsuite/gas/mips/mips.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/mips.exp,v
retrieving revision 1.109
diff -c -p -b -r1.109 mips.exp
*** gas/testsuite/gas/mips/mips.exp	6 Sep 2005 18:56:21 -0000	1.109
--- gas/testsuite/gas/mips/mips.exp	19 Oct 2005 12:17:55 -0000
*************** if { [istarget mips*-*-*] } then {
*** 771,774 ****
--- 771,775 ----
  	    run_dump_test "mips16-dwarf2-n32"
  	}
      }
+     if { !$no_mips16 } { run_dump_test "mips16e-jrc" }
  }

Index: gas/testsuite/gas/mips/mips16e-jrc.d
===================================================================
#objdump: -dr -mmips:isa32 -mmips:16
#as: -march=mips32 -mips16
#name: mips16e jalrc/jrc
.*:     file format .*
Disassembly of section .text:
00000000 <.text>:
   0:	eac0      	jalrc	v0
   2:	e8a0      	jrc	ra
   4:	6a01      	li	v0,1
   6:	6500      	nop
   8:	6500      	nop
   a:	6500      	nop
   c:	6500      	nop
   e:	6500      	nop


Index: gas/testsuite/gas/mips/mips16e-jrc.s
===================================================================
# Test the generation of jalrc/jrc opcodes
        jalr    $31,$2
        jr      $31
	li	$2,1

        .p2align 4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]