This is the mail archive of the binutils@sources.redhat.com 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]

[patch] MIPS branch relaxation and swapping


Hello,

 I've noticed, when branch relaxation is enabled, swapping most often does
not happen.  Moreover, in the unlikely cases it actually does, the
resulting code is corrupted, the relocation that should be applied to the
branch is instead applied to the instruction in the delay slot.

 I've tracked down these problems and here are my conclusions:

1. Swapping does usually not happen because of the
"prev_insn_frag->fr_type == rs_machine_dependent" condition -- it's almost
always true, because frag_var is called for the relaxed branch and it
typically sets that fr_type to rs_machine_dependent.

2. Swapping does occasionally happen, because if there's no room in
prev_insn_frag left, frag_var closes it and starts a new frag for the
branch and then fr_type remains set to rs_fill.  Then prev_insn_frag is
still pointing to the frag containing the instruction to be swapped, but
frag_now is not pointing to the frag containing the branch.  It is
pointing to a newly-created empty frag and the frag containing the branch
lies in-between.  And the code that does swapping isn't prepared for such
a setup.

 Here is a fix that addresses these problems:

1. The fr_type member of prev_insn_frag is remembered before calling 
frag_var.  This way we know if the frag containing the instruction 
preceding the branch was a variant one before calling frag_var.  If it 
wasn't, then we can do a swap, even though frag_var made it a variant 
frag.

2. If the branch was relaxed, then the swapped instruction is moved from
its frag to the current, empty one, that was created by frag_now.  This
means, the fixed head of prev_insn_frag has to be shrunk and room has to
be consumed in frag_now.  If the relaxed branch to be swapped is contained
in the variant tail of prev_insn_frag (as opposed to being alone in a frag
created by frag_var), then pointers in the fixups are adjusted as well.

gas/ChangeLog
2004-01-14  Maciej W. Rozycki  <macro@ds2.pg.gda.pl>

	* config/tc-mips.c (append_insn): Properly detect variant frags 
	that preclude swapping of relaxed branches.  Correctly swap
	instructions between frags when dealing with relaxed branches.

gas/testsuite/ChangeLog
2004-01-14  Maciej W. Rozycki  <macro@ds2.pg.gda.pl>

	* gas/mips/relax-swap1-mips1.d: New test for branch relaxation 
	with swapping for MIPS1.
	* gas/mips/relax-swap1-mips2.d: New test for branch relaxation
	with swapping for MIPS2.
	* gas/mips/relax-swap1.l: Stderr output for the new tests.
	* gas/mips/relax-swap1.s: Source for the new tests.
	* gas/mips/relax-swap2.d: New test for branch likely relaxation
	with swapping.
	* gas/mips/relax-swap2.l: Stderr output for the new test.
	* gas/mips/relax-swap2.s: Source for the new test.
	* gas/mips/mips.exp: Run the new tests.

 Complete, wrapped up and with a testsuite. :-)  OK, to apply?

  Maciej

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: macro@ds2.pg.gda.pl, PGP key available        +

binutils-2.14.90-20031222-mips-brswap.patch
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/config/tc-mips.c binutils-2.14.90-20031222/gas/config/tc-mips.c
--- binutils-2.14.90-20031222.macro/gas/config/tc-mips.c	2003-12-19 04:25:25.000000000 +0000
+++ binutils-2.14.90-20031222/gas/config/tc-mips.c	2004-01-14 00:14:05.000000000 +0000
@@ -1539,6 +1539,8 @@ append_insn (char *place, struct mips_cl
   char *f;
   fixS *fixp[3];
   int nops = 0;
+  relax_stateT prev_insn_frag_type = 0;
+  bfd_boolean relaxed_branch = FALSE;
   bfd_boolean force_new_frag = FALSE;
 
   /* Mark instruction labels in mips16 mode.  */
@@ -1927,6 +1929,10 @@ append_insn (char *place, struct mips_cl
 	}
     }
 
+  /* Record the frag type before frag_var.  */
+  if (prev_insn_frag)
+    prev_insn_frag_type = prev_insn_frag->fr_type;
+
   if (place == NULL
       && address_expr
       && *reloc_type == BFD_RELOC_16_PCREL_S2
@@ -1940,6 +1946,7 @@ append_insn (char *place, struct mips_cl
       && !(mips_opts.noat && mips_pic != NO_PIC)
       && !mips_opts.mips16)
     {
+      relaxed_branch = TRUE;
       f = frag_var (rs_machine_dependent,
 		    relaxed_branch_length
 		    (NULL, NULL,
@@ -2270,12 +2277,12 @@ append_insn (char *place, struct mips_cl
 		 there are any branches to anything other than a
 		 label, users must use .set noreorder.  */
 	      || insn_labels != NULL
-	      /* If the previous instruction is in a variant frag, we
-		 can not do the swap.  This does not apply to the
-		 mips16, which uses variant frags for different
-		 purposes.  */
+	      /* If the previous instruction is in a variant frag
+		 other than this branch's one, we cannot do the swap.
+		 This does not apply to the mips16, which uses variant
+		 frags for different purposes.  */
 	      || (! mips_opts.mips16
-		  && prev_insn_frag->fr_type == rs_machine_dependent)
+		  && prev_insn_frag_type == rs_machine_dependent)
 	      /* If the branch reads the condition codes, we don't
 		 even try to swap, because in the sequence
 		   ctc1 $X,$31
@@ -2460,9 +2467,29 @@ append_insn (char *place, struct mips_cl
 		  char temp[4];
 
 		  prev_f = prev_insn_frag->fr_literal + prev_insn_where;
-		  memcpy (temp, prev_f, 4);
-		  memcpy (prev_f, f, 4);
-		  memcpy (f, temp, 4);
+		  if (!relaxed_branch)
+		    {
+		      /* If this is not a relaxed branch, then just
+			 swap the instructions.  */
+		      memcpy (temp, prev_f, 4);
+		      memcpy (prev_f, f, 4);
+		      memcpy (f, temp, 4);
+		    }
+		  else
+		    {
+		      /* If this is a relaxed branch, then we move the
+			 instruction to be placed in the delay slot to
+			 the current frag, shrinking the fixed part of
+			 the originating frag.  If the branch occupies
+			 the tail of the latter, we move it backwards,
+			 into the space freed by the moved instruction.  */
+		      f = frag_more (4);
+		      memcpy (f, prev_f, 4);
+		      prev_insn_frag->fr_fix -= 4;
+		      if (prev_insn_frag->fr_type == rs_machine_dependent)
+			memmove (prev_f, prev_f + 4, prev_insn_frag->fr_var);
+		    }
+
 		  if (prev_insn_fixp[0])
 		    {
 		      prev_insn_fixp[0]->fx_frag = frag_now;
@@ -2490,20 +2517,33 @@ append_insn (char *place, struct mips_cl
 			 frag.  */
 		      force_new_frag = TRUE;
 		    }
-		  if (fixp[0])
-		    {
-		      fixp[0]->fx_frag = prev_insn_frag;
-		      fixp[0]->fx_where = prev_insn_where;
-		    }
-		  if (fixp[1])
+
+		  if (!relaxed_branch)
 		    {
-		      fixp[1]->fx_frag = prev_insn_frag;
-		      fixp[1]->fx_where = prev_insn_where;
+		      if (fixp[0])
+			{
+			  fixp[0]->fx_frag = prev_insn_frag;
+			  fixp[0]->fx_where = prev_insn_where;
+			}
+		      if (fixp[1])
+			{
+			  fixp[1]->fx_frag = prev_insn_frag;
+			  fixp[1]->fx_where = prev_insn_where;
+			}
+		      if (fixp[2])
+			{
+			  fixp[2]->fx_frag = prev_insn_frag;
+			  fixp[2]->fx_where = prev_insn_where;
+			}
 		    }
-		  if (fixp[2])
+		  else if (prev_insn_frag->fr_type == rs_machine_dependent)
 		    {
-		      fixp[2]->fx_frag = prev_insn_frag;
-		      fixp[2]->fx_where = prev_insn_where;
+		      if (fixp[0])
+			fixp[0]->fx_where -= 4;
+		      if (fixp[1])
+			fixp[1]->fx_where -= 4;
+		      if (fixp[2])
+			fixp[2]->fx_where -= 4;
 		    }
 		}
 	      else
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/mips.exp binutils-2.14.90-20031222/gas/testsuite/gas/mips/mips.exp
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/mips.exp	2003-12-19 04:25:25.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/mips.exp	2004-01-14 02:57:42.000000000 +0000
@@ -588,6 +588,9 @@ if { [istarget mips*-*-*] } then {
     }
 
     run_dump_test "relax"
+    run_dump_test "relax-swap1-mips1"
+    run_dump_test "relax-swap1-mips2"
+    run_dump_test "relax-swap2"
 
     run_list_test "illegal" "-32"
     run_list_test "baddata1" "-32"
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1-mips1.d binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1-mips1.d
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1-mips1.d	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1-mips1.d	2004-01-14 03:23:30.000000000 +0000
@@ -0,0 +1,311 @@
+#objdump: -dr --prefix-addresses -mmips:3000
+#name: MIPS1 branch relaxation with swapping
+#as: -32 -mips1 -KPIC -relax-branch
+#source: relax-swap1.s
+#stderr: relax-swap1.l
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+0+0000 <[^>]*> b	00000000 <foo>
+0+0004 <[^>]*> move	v0,a0
+0+0008 <[^>]*> lw	at,2\(gp\)
+[ 	]*8: R_MIPS_GOT16	\.text
+0+000c <[^>]*> nop
+0+0010 <[^>]*> addiu	at,at,1000
+[ 	]*10: R_MIPS_LO16	\.text
+0+0014 <[^>]*> jr	at
+0+0018 <[^>]*> move	v0,a0
+0+001c <[^>]*> lw	v0,0\(a0\)
+0+0020 <[^>]*> b	00000000 <foo>
+0+0024 <[^>]*> nop
+0+0028 <[^>]*> lw	v0,0\(a0\)
+0+002c <[^>]*> lw	at,2\(gp\)
+[ 	]*2c: R_MIPS_GOT16	\.text
+0+0030 <[^>]*> nop
+0+0034 <[^>]*> addiu	at,at,1000
+[ 	]*34: R_MIPS_LO16	\.text
+0+0038 <[^>]*> jr	at
+0+003c <[^>]*> nop
+0+0040 <[^>]*> b	00000000 <foo>
+0+0044 <[^>]*> sw	v0,0\(a0\)
+0+0048 <[^>]*> lw	at,2\(gp\)
+[ 	]*48: R_MIPS_GOT16	\.text
+0+004c <[^>]*> nop
+0+0050 <[^>]*> addiu	at,at,1000
+[ 	]*50: R_MIPS_LO16	\.text
+0+0054 <[^>]*> jr	at
+0+0058 <[^>]*> sw	v0,0\(a0\)
+0+005c <[^>]*> move	v0,a0
+0+0060 <[^>]*> beq	v0,v1,00000000 <foo>
+0+0064 <[^>]*> nop
+0+0068 <[^>]*> move	v0,a0
+0+006c <[^>]*> bne	v0,v1,00000084 <foo\+0x84>
+0+0070 <[^>]*> nop
+0+0074 <[^>]*> lw	at,2\(gp\)
+[ 	]*74: R_MIPS_GOT16	\.text
+0+0078 <[^>]*> nop
+0+007c <[^>]*> addiu	at,at,1000
+[ 	]*7c: R_MIPS_LO16	\.text
+0+0080 <[^>]*> jr	at
+0+0084 <[^>]*> nop
+0+0088 <[^>]*> beq	a0,a1,00000000 <foo>
+0+008c <[^>]*> move	v0,a0
+0+0090 <[^>]*> bne	a0,a1,000000a8 <foo\+0xa8>
+0+0094 <[^>]*> nop
+0+0098 <[^>]*> lw	at,2\(gp\)
+[ 	]*98: R_MIPS_GOT16	\.text
+0+009c <[^>]*> nop
+0+00a0 <[^>]*> addiu	at,at,1000
+[ 	]*a0: R_MIPS_LO16	\.text
+0+00a4 <[^>]*> jr	at
+0+00a8 <[^>]*> move	v0,a0
+0+00ac <[^>]*> addiu	v0,a0,1
+0+00b0 <[^>]*> beq	v0,v1,00000000 <foo>
+0+00b4 <[^>]*> nop
+0+00b8 <[^>]*> addiu	v0,a0,1
+0+00bc <[^>]*> bne	v0,v1,000000d4 <foo\+0xd4>
+0+00c0 <[^>]*> nop
+0+00c4 <[^>]*> lw	at,2\(gp\)
+[ 	]*c4: R_MIPS_GOT16	\.text
+0+00c8 <[^>]*> nop
+0+00cc <[^>]*> addiu	at,at,1000
+[ 	]*cc: R_MIPS_LO16	\.text
+0+00d0 <[^>]*> jr	at
+0+00d4 <[^>]*> nop
+0+00d8 <[^>]*> beq	a0,a1,00000000 <foo>
+0+00dc <[^>]*> addiu	v0,a0,1
+0+00e0 <[^>]*> bne	a0,a1,000000f8 <foo\+0xf8>
+0+00e4 <[^>]*> nop
+0+00e8 <[^>]*> lw	at,2\(gp\)
+[ 	]*e8: R_MIPS_GOT16	\.text
+0+00ec <[^>]*> nop
+0+00f0 <[^>]*> addiu	at,at,1000
+[ 	]*f0: R_MIPS_LO16	\.text
+0+00f4 <[^>]*> jr	at
+0+00f8 <[^>]*> addiu	v0,a0,1
+0+00fc <[^>]*> lw	v0,0\(a0\)
+0+0100 <[^>]*> nop
+0+0104 <[^>]*> beq	v0,v1,00000000 <foo>
+0+0108 <[^>]*> nop
+0+010c <[^>]*> lw	v0,0\(a0\)
+0+0110 <[^>]*> nop
+0+0114 <[^>]*> bne	v0,v1,0000012c <foo\+0x12c>
+0+0118 <[^>]*> nop
+0+011c <[^>]*> lw	at,2\(gp\)
+[ 	]*11c: R_MIPS_GOT16	\.text
+0+0120 <[^>]*> nop
+0+0124 <[^>]*> addiu	at,at,1000
+[ 	]*124: R_MIPS_LO16	\.text
+0+0128 <[^>]*> jr	at
+0+012c <[^>]*> nop
+0+0130 <[^>]*> lw	v0,0\(a0\)
+0+0134 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0138 <[^>]*> nop
+0+013c <[^>]*> lw	v0,0\(a0\)
+0+0140 <[^>]*> bne	a0,a1,00000158 <foo\+0x158>
+0+0144 <[^>]*> nop
+0+0148 <[^>]*> lw	at,2\(gp\)
+[ 	]*148: R_MIPS_GOT16	\.text
+0+014c <[^>]*> nop
+0+0150 <[^>]*> addiu	at,at,1000
+[ 	]*150: R_MIPS_LO16	\.text
+0+0154 <[^>]*> jr	at
+0+0158 <[^>]*> nop
+0+015c <[^>]*> beq	v0,v1,00000000 <foo>
+0+0160 <[^>]*> sw	v0,0\(a0\)
+0+0164 <[^>]*> bne	v0,v1,0000017c <foo\+0x17c>
+0+0168 <[^>]*> nop
+0+016c <[^>]*> lw	at,2\(gp\)
+[ 	]*16c: R_MIPS_GOT16	\.text
+0+0170 <[^>]*> nop
+0+0174 <[^>]*> addiu	at,at,1000
+[ 	]*174: R_MIPS_LO16	\.text
+0+0178 <[^>]*> jr	at
+0+017c <[^>]*> sw	v0,0\(a0\)
+0+0180 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0184 <[^>]*> sw	v0,0\(a0\)
+0+0188 <[^>]*> bne	a0,a1,000001a0 <foo\+0x1a0>
+0+018c <[^>]*> nop
+0+0190 <[^>]*> lw	at,2\(gp\)
+[ 	]*190: R_MIPS_GOT16	\.text
+0+0194 <[^>]*> nop
+0+0198 <[^>]*> addiu	at,at,1000
+[ 	]*198: R_MIPS_LO16	\.text
+0+019c <[^>]*> jr	at
+0+01a0 <[^>]*> sw	v0,0\(a0\)
+0+01a4 <[^>]*> mfc1	v0,\$f0
+0+01a8 <[^>]*> move	a2,a3
+0+01ac <[^>]*> beq	v0,v1,00000000 <foo>
+0+01b0 <[^>]*> nop
+0+01b4 <[^>]*> mfc1	v0,\$f0
+0+01b8 <[^>]*> move	a2,a3
+0+01bc <[^>]*> bne	v0,v1,000001d4 <foo\+0x1d4>
+0+01c0 <[^>]*> nop
+0+01c4 <[^>]*> lw	at,2\(gp\)
+[ 	]*1c4: R_MIPS_GOT16	\.text
+0+01c8 <[^>]*> nop
+0+01cc <[^>]*> addiu	at,at,1000
+[ 	]*1cc: R_MIPS_LO16	\.text
+0+01d0 <[^>]*> jr	at
+0+01d4 <[^>]*> nop
+0+01d8 <[^>]*> mfc1	v0,\$f0
+0+01dc <[^>]*> beq	a0,a1,00000000 <foo>
+0+01e0 <[^>]*> move	a2,a3
+0+01e4 <[^>]*> mfc1	v0,\$f0
+0+01e8 <[^>]*> bne	a0,a1,00000200 <foo\+0x200>
+0+01ec <[^>]*> nop
+0+01f0 <[^>]*> lw	at,2\(gp\)
+[ 	]*1f0: R_MIPS_GOT16	\.text
+0+01f4 <[^>]*> nop
+0+01f8 <[^>]*> addiu	at,at,1000
+[ 	]*1f8: R_MIPS_LO16	\.text
+0+01fc <[^>]*> jr	at
+0+0200 <[^>]*> move	a2,a3
+0+0204 <[^>]*> move	v0,a0
+0+0208 <[^>]*> bc1t	00000000 <foo>
+0+020c <[^>]*> nop
+0+0210 <[^>]*> move	v0,a0
+0+0214 <[^>]*> bc1f	0000022c <foo\+0x22c>
+0+0218 <[^>]*> nop
+0+021c <[^>]*> lw	at,2\(gp\)
+[ 	]*21c: R_MIPS_GOT16	\.text
+0+0220 <[^>]*> nop
+0+0224 <[^>]*> addiu	at,at,1000
+[ 	]*224: R_MIPS_LO16	\.text
+0+0228 <[^>]*> jr	at
+0+022c <[^>]*> nop
+0+0230 <[^>]*> move	v0,a0
+0+0234 <[^>]*> b	00000000 <foo>
+0+0238 <[^>]*> nop
+0+023c <[^>]*> move	v0,a0
+0+0240 <[^>]*> lw	at,2\(gp\)
+[ 	]*240: R_MIPS_GOT16	\.text
+0+0244 <[^>]*> nop
+0+0248 <[^>]*> addiu	at,at,1000
+[ 	]*248: R_MIPS_LO16	\.text
+0+024c <[^>]*> jr	at
+0+0250 <[^>]*> nop
+0+0254 <[^>]*> move	v0,a0
+0+0258 <[^>]*> b	00000000 <foo>
+0+025c <[^>]*> nop
+0+0260 <[^>]*> move	v0,a0
+0+0264 <[^>]*> lw	at,2\(gp\)
+[ 	]*264: R_MIPS_GOT16	\.text
+0+0268 <[^>]*> nop
+0+026c <[^>]*> addiu	at,at,1000
+[ 	]*26c: R_MIPS_LO16	\.text
+0+0270 <[^>]*> jr	at
+0+0274 <[^>]*> nop
+0+0278 <[^>]*> move	a2,a3
+0+027c <[^>]*> move	v0,a0
+0+0280 <[^>]*> b	00000000 <foo>
+0+0284 <[^>]*> nop
+0+0288 <[^>]*> move	a2,a3
+0+028c <[^>]*> move	v0,a0
+0+0290 <[^>]*> lw	at,2\(gp\)
+[ 	]*290: R_MIPS_GOT16	\.text
+0+0294 <[^>]*> nop
+0+0298 <[^>]*> addiu	at,at,1000
+[ 	]*298: R_MIPS_LO16	\.text
+0+029c <[^>]*> jr	at
+0+02a0 <[^>]*> nop
+0+02a4 <[^>]*> lw	at,0\(gp\)
+[ 	]*2a4: R_MIPS_GOT16	\.text
+0+02a8 <[^>]*> nop
+0+02ac <[^>]*> addiu	at,at,692
+[ 	]*2ac: R_MIPS_LO16	\.text
+0+02b0 <[^>]*> sw	v0,0\(at\)
+0+02b4 <[^>]*> b	00000000 <foo>
+0+02b8 <[^>]*> nop
+0+02bc <[^>]*> lw	at,0\(gp\)
+[ 	]*2bc: R_MIPS_GOT16	\.text
+0+02c0 <[^>]*> nop
+0+02c4 <[^>]*> addiu	at,at,716
+[ 	]*2c4: R_MIPS_LO16	\.text
+0+02c8 <[^>]*> sw	v0,0\(at\)
+0+02cc <[^>]*> lw	at,2\(gp\)
+[ 	]*2cc: R_MIPS_GOT16	\.text
+0+02d0 <[^>]*> nop
+0+02d4 <[^>]*> addiu	at,at,1000
+[ 	]*2d4: R_MIPS_LO16	\.text
+0+02d8 <[^>]*> jr	at
+0+02dc <[^>]*> nop
+0+02e0 <[^>]*> lwc1	\$f0,0\(a0\)
+0+02e4 <[^>]*> b	00000000 <foo>
+0+02e8 <[^>]*> nop
+0+02ec <[^>]*> lwc1	\$f0,0\(a0\)
+0+02f0 <[^>]*> lw	at,2\(gp\)
+[ 	]*2f0: R_MIPS_GOT16	\.text
+0+02f4 <[^>]*> nop
+0+02f8 <[^>]*> addiu	at,at,1000
+[ 	]*2f8: R_MIPS_LO16	\.text
+0+02fc <[^>]*> jr	at
+0+0300 <[^>]*> nop
+0+0304 <[^>]*> cfc1	v0,\$31
+0+0308 <[^>]*> b	00000000 <foo>
+0+030c <[^>]*> nop
+0+0310 <[^>]*> cfc1	v0,\$31
+0+0314 <[^>]*> lw	at,2\(gp\)
+[ 	]*314: R_MIPS_GOT16	\.text
+0+0318 <[^>]*> nop
+0+031c <[^>]*> addiu	at,at,1000
+[ 	]*31c: R_MIPS_LO16	\.text
+0+0320 <[^>]*> jr	at
+0+0324 <[^>]*> nop
+0+0328 <[^>]*> ctc1	v0,\$31
+0+032c <[^>]*> b	00000000 <foo>
+0+0330 <[^>]*> nop
+0+0334 <[^>]*> ctc1	v0,\$31
+0+0338 <[^>]*> lw	at,2\(gp\)
+[ 	]*338: R_MIPS_GOT16	\.text
+0+033c <[^>]*> nop
+0+0340 <[^>]*> addiu	at,at,1000
+[ 	]*340: R_MIPS_LO16	\.text
+0+0344 <[^>]*> jr	at
+0+0348 <[^>]*> nop
+0+034c <[^>]*> mtc1	v0,\$f31
+0+0350 <[^>]*> b	00000000 <foo>
+0+0354 <[^>]*> nop
+0+0358 <[^>]*> mtc1	v0,\$f31
+0+035c <[^>]*> lw	at,2\(gp\)
+[ 	]*35c: R_MIPS_GOT16	\.text
+0+0360 <[^>]*> nop
+0+0364 <[^>]*> addiu	at,at,1000
+[ 	]*364: R_MIPS_LO16	\.text
+0+0368 <[^>]*> jr	at
+0+036c <[^>]*> nop
+0+0370 <[^>]*> mfhi	v0
+0+0374 <[^>]*> b	00000000 <foo>
+0+0378 <[^>]*> nop
+0+037c <[^>]*> mfhi	v0
+0+0380 <[^>]*> lw	at,2\(gp\)
+[ 	]*380: R_MIPS_GOT16	\.text
+0+0384 <[^>]*> nop
+0+0388 <[^>]*> addiu	at,at,1000
+[ 	]*388: R_MIPS_LO16	\.text
+0+038c <[^>]*> jr	at
+0+0390 <[^>]*> nop
+0+0394 <[^>]*> move	v0,a0
+0+0398 <[^>]*> jr	v0
+0+039c <[^>]*> nop
+0+03a0 <[^>]*> jr	a0
+0+03a4 <[^>]*> move	v0,a0
+0+03a8 <[^>]*> move	v0,a0
+0+03ac <[^>]*> jalr	v0
+0+03b0 <[^>]*> nop
+0+03b4 <[^>]*> jalr	a0
+0+03b8 <[^>]*> move	v0,a0
+0+03bc <[^>]*> move	v0,ra
+0+03c0 <[^>]*> jalr	v1
+0+03c4 <[^>]*> nop
+0+03c8 <[^>]*> move	ra,a0
+0+03cc <[^>]*> jalr	a1
+0+03d0 <[^>]*> nop
+0+03d4 <[^>]*> jalr	v0,v1
+0+03d8 <[^>]*> move	ra,a0
+0+03dc <[^>]*> move	v0,ra
+0+03e0 <[^>]*> jalr	v0,v1
+0+03e4 <[^>]*> nop
+	\.\.\.
+	\.\.\.
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1-mips2.d binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1-mips2.d
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1-mips2.d	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1-mips2.d	2004-01-14 03:23:21.000000000 +0000
@@ -0,0 +1,280 @@
+#objdump: -dr --prefix-addresses -mmips:6000
+#name: MIPS2 branch relaxation with swapping
+#as: -32 -mips2 -KPIC -relax-branch
+#source: relax-swap1.s
+#stderr: relax-swap1.l
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+0+0000 <[^>]*> b	00000000 <foo>
+0+0004 <[^>]*> move	v0,a0
+0+0008 <[^>]*> lw	at,2\(gp\)
+[ 	]*8: R_MIPS_GOT16	\.text
+0+000c <[^>]*> addiu	at,at,876
+[ 	]*c: R_MIPS_LO16	\.text
+0+0010 <[^>]*> jr	at
+0+0014 <[^>]*> move	v0,a0
+0+0018 <[^>]*> b	00000000 <foo>
+0+001c <[^>]*> lw	v0,0\(a0\)
+0+0020 <[^>]*> lw	at,2\(gp\)
+[ 	]*20: R_MIPS_GOT16	\.text
+0+0024 <[^>]*> addiu	at,at,876
+[ 	]*24: R_MIPS_LO16	\.text
+0+0028 <[^>]*> jr	at
+0+002c <[^>]*> lw	v0,0\(a0\)
+0+0030 <[^>]*> b	00000000 <foo>
+0+0034 <[^>]*> sw	v0,0\(a0\)
+0+0038 <[^>]*> lw	at,2\(gp\)
+[ 	]*38: R_MIPS_GOT16	\.text
+0+003c <[^>]*> addiu	at,at,876
+[ 	]*3c: R_MIPS_LO16	\.text
+0+0040 <[^>]*> jr	at
+0+0044 <[^>]*> sw	v0,0\(a0\)
+0+0048 <[^>]*> move	v0,a0
+0+004c <[^>]*> beq	v0,v1,00000000 <foo>
+0+0050 <[^>]*> nop
+0+0054 <[^>]*> move	v0,a0
+0+0058 <[^>]*> bne	v0,v1,0000006c <foo\+0x6c>
+0+005c <[^>]*> nop
+0+0060 <[^>]*> lw	at,2\(gp\)
+[ 	]*60: R_MIPS_GOT16	\.text
+0+0064 <[^>]*> addiu	at,at,876
+[ 	]*64: R_MIPS_LO16	\.text
+0+0068 <[^>]*> jr	at
+0+006c <[^>]*> nop
+0+0070 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0074 <[^>]*> move	v0,a0
+0+0078 <[^>]*> bne	a0,a1,0000008c <foo\+0x8c>
+0+007c <[^>]*> nop
+0+0080 <[^>]*> lw	at,2\(gp\)
+[ 	]*80: R_MIPS_GOT16	\.text
+0+0084 <[^>]*> addiu	at,at,876
+[ 	]*84: R_MIPS_LO16	\.text
+0+0088 <[^>]*> jr	at
+0+008c <[^>]*> move	v0,a0
+0+0090 <[^>]*> addiu	v0,a0,1
+0+0094 <[^>]*> beq	v0,v1,00000000 <foo>
+0+0098 <[^>]*> nop
+0+009c <[^>]*> addiu	v0,a0,1
+0+00a0 <[^>]*> bne	v0,v1,000000b4 <foo\+0xb4>
+0+00a4 <[^>]*> nop
+0+00a8 <[^>]*> lw	at,2\(gp\)
+[ 	]*a8: R_MIPS_GOT16	\.text
+0+00ac <[^>]*> addiu	at,at,876
+[ 	]*ac: R_MIPS_LO16	\.text
+0+00b0 <[^>]*> jr	at
+0+00b4 <[^>]*> nop
+0+00b8 <[^>]*> beq	a0,a1,00000000 <foo>
+0+00bc <[^>]*> addiu	v0,a0,1
+0+00c0 <[^>]*> bne	a0,a1,000000d4 <foo\+0xd4>
+0+00c4 <[^>]*> nop
+0+00c8 <[^>]*> lw	at,2\(gp\)
+[ 	]*c8: R_MIPS_GOT16	\.text
+0+00cc <[^>]*> addiu	at,at,876
+[ 	]*cc: R_MIPS_LO16	\.text
+0+00d0 <[^>]*> jr	at
+0+00d4 <[^>]*> addiu	v0,a0,1
+0+00d8 <[^>]*> lw	v0,0\(a0\)
+0+00dc <[^>]*> beq	v0,v1,00000000 <foo>
+0+00e0 <[^>]*> nop
+0+00e4 <[^>]*> lw	v0,0\(a0\)
+0+00e8 <[^>]*> bne	v0,v1,000000fc <foo\+0xfc>
+0+00ec <[^>]*> nop
+0+00f0 <[^>]*> lw	at,2\(gp\)
+[ 	]*f0: R_MIPS_GOT16	\.text
+0+00f4 <[^>]*> addiu	at,at,876
+[ 	]*f4: R_MIPS_LO16	\.text
+0+00f8 <[^>]*> jr	at
+0+00fc <[^>]*> nop
+0+0100 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0104 <[^>]*> lw	v0,0\(a0\)
+0+0108 <[^>]*> bne	a0,a1,0000011c <foo\+0x11c>
+0+010c <[^>]*> nop
+0+0110 <[^>]*> lw	at,2\(gp\)
+[ 	]*110: R_MIPS_GOT16	\.text
+0+0114 <[^>]*> addiu	at,at,876
+[ 	]*114: R_MIPS_LO16	\.text
+0+0118 <[^>]*> jr	at
+0+011c <[^>]*> lw	v0,0\(a0\)
+0+0120 <[^>]*> beq	v0,v1,00000000 <foo>
+0+0124 <[^>]*> sw	v0,0\(a0\)
+0+0128 <[^>]*> bne	v0,v1,0000013c <foo\+0x13c>
+0+012c <[^>]*> nop
+0+0130 <[^>]*> lw	at,2\(gp\)
+[ 	]*130: R_MIPS_GOT16	\.text
+0+0134 <[^>]*> addiu	at,at,876
+[ 	]*134: R_MIPS_LO16	\.text
+0+0138 <[^>]*> jr	at
+0+013c <[^>]*> sw	v0,0\(a0\)
+0+0140 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0144 <[^>]*> sw	v0,0\(a0\)
+0+0148 <[^>]*> bne	a0,a1,0000015c <foo\+0x15c>
+0+014c <[^>]*> nop
+0+0150 <[^>]*> lw	at,2\(gp\)
+[ 	]*150: R_MIPS_GOT16	\.text
+0+0154 <[^>]*> addiu	at,at,876
+[ 	]*154: R_MIPS_LO16	\.text
+0+0158 <[^>]*> jr	at
+0+015c <[^>]*> sw	v0,0\(a0\)
+0+0160 <[^>]*> mfc1	v0,\$f0
+0+0164 <[^>]*> move	a2,a3
+0+0168 <[^>]*> beq	v0,v1,00000000 <foo>
+0+016c <[^>]*> nop
+0+0170 <[^>]*> mfc1	v0,\$f0
+0+0174 <[^>]*> move	a2,a3
+0+0178 <[^>]*> bne	v0,v1,0000018c <foo\+0x18c>
+0+017c <[^>]*> nop
+0+0180 <[^>]*> lw	at,2\(gp\)
+[ 	]*180: R_MIPS_GOT16	\.text
+0+0184 <[^>]*> addiu	at,at,876
+[ 	]*184: R_MIPS_LO16	\.text
+0+0188 <[^>]*> jr	at
+0+018c <[^>]*> nop
+0+0190 <[^>]*> mfc1	v0,\$f0
+0+0194 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0198 <[^>]*> move	a2,a3
+0+019c <[^>]*> mfc1	v0,\$f0
+0+01a0 <[^>]*> bne	a0,a1,000001b4 <foo\+0x1b4>
+0+01a4 <[^>]*> nop
+0+01a8 <[^>]*> lw	at,2\(gp\)
+[ 	]*1a8: R_MIPS_GOT16	\.text
+0+01ac <[^>]*> addiu	at,at,876
+[ 	]*1ac: R_MIPS_LO16	\.text
+0+01b0 <[^>]*> jr	at
+0+01b4 <[^>]*> move	a2,a3
+0+01b8 <[^>]*> move	v0,a0
+0+01bc <[^>]*> bc1t	00000000 <foo>
+0+01c0 <[^>]*> nop
+0+01c4 <[^>]*> move	v0,a0
+0+01c8 <[^>]*> bc1f	000001dc <foo\+0x1dc>
+0+01cc <[^>]*> nop
+0+01d0 <[^>]*> lw	at,2\(gp\)
+[ 	]*1d0: R_MIPS_GOT16	\.text
+0+01d4 <[^>]*> addiu	at,at,876
+[ 	]*1d4: R_MIPS_LO16	\.text
+0+01d8 <[^>]*> jr	at
+0+01dc <[^>]*> nop
+0+01e0 <[^>]*> move	v0,a0
+0+01e4 <[^>]*> b	00000000 <foo>
+0+01e8 <[^>]*> nop
+0+01ec <[^>]*> move	v0,a0
+0+01f0 <[^>]*> lw	at,2\(gp\)
+[ 	]*1f0: R_MIPS_GOT16	\.text
+0+01f4 <[^>]*> addiu	at,at,876
+[ 	]*1f4: R_MIPS_LO16	\.text
+0+01f8 <[^>]*> jr	at
+0+01fc <[^>]*> nop
+0+0200 <[^>]*> move	v0,a0
+0+0204 <[^>]*> b	00000000 <foo>
+0+0208 <[^>]*> nop
+0+020c <[^>]*> move	v0,a0
+0+0210 <[^>]*> lw	at,2\(gp\)
+[ 	]*210: R_MIPS_GOT16	\.text
+0+0214 <[^>]*> addiu	at,at,876
+[ 	]*214: R_MIPS_LO16	\.text
+0+0218 <[^>]*> jr	at
+0+021c <[^>]*> nop
+0+0220 <[^>]*> move	a2,a3
+0+0224 <[^>]*> move	v0,a0
+0+0228 <[^>]*> b	00000000 <foo>
+0+022c <[^>]*> nop
+0+0230 <[^>]*> move	a2,a3
+0+0234 <[^>]*> move	v0,a0
+0+0238 <[^>]*> lw	at,2\(gp\)
+[ 	]*238: R_MIPS_GOT16	\.text
+0+023c <[^>]*> addiu	at,at,876
+[ 	]*23c: R_MIPS_LO16	\.text
+0+0240 <[^>]*> jr	at
+0+0244 <[^>]*> nop
+0+0248 <[^>]*> lw	at,0\(gp\)
+[ 	]*248: R_MIPS_GOT16	\.text
+0+024c <[^>]*> nop
+0+0250 <[^>]*> addiu	at,at,600
+[ 	]*250: R_MIPS_LO16	\.text
+0+0254 <[^>]*> sw	v0,0\(at\)
+0+0258 <[^>]*> b	00000000 <foo>
+0+025c <[^>]*> nop
+0+0260 <[^>]*> lw	at,0\(gp\)
+[ 	]*260: R_MIPS_GOT16	\.text
+0+0264 <[^>]*> nop
+0+0268 <[^>]*> addiu	at,at,624
+[ 	]*268: R_MIPS_LO16	\.text
+0+026c <[^>]*> sw	v0,0\(at\)
+0+0270 <[^>]*> lw	at,2\(gp\)
+[ 	]*270: R_MIPS_GOT16	\.text
+0+0274 <[^>]*> addiu	at,at,876
+[ 	]*274: R_MIPS_LO16	\.text
+0+0278 <[^>]*> jr	at
+0+027c <[^>]*> nop
+0+0280 <[^>]*> b	00000000 <foo>
+0+0284 <[^>]*> lwc1	\$f0,0\(a0\)
+0+0288 <[^>]*> lw	at,2\(gp\)
+[ 	]*288: R_MIPS_GOT16	\.text
+0+028c <[^>]*> addiu	at,at,876
+[ 	]*28c: R_MIPS_LO16	\.text
+0+0290 <[^>]*> jr	at
+0+0294 <[^>]*> lwc1	\$f0,0\(a0\)
+0+0298 <[^>]*> cfc1	v0,\$31
+0+029c <[^>]*> b	00000000 <foo>
+0+02a0 <[^>]*> nop
+0+02a4 <[^>]*> cfc1	v0,\$31
+0+02a8 <[^>]*> lw	at,2\(gp\)
+[ 	]*2a8: R_MIPS_GOT16	\.text
+0+02ac <[^>]*> addiu	at,at,876
+[ 	]*2ac: R_MIPS_LO16	\.text
+0+02b0 <[^>]*> jr	at
+0+02b4 <[^>]*> nop
+0+02b8 <[^>]*> ctc1	v0,\$31
+0+02bc <[^>]*> b	00000000 <foo>
+0+02c0 <[^>]*> nop
+0+02c4 <[^>]*> ctc1	v0,\$31
+0+02c8 <[^>]*> lw	at,2\(gp\)
+[ 	]*2c8: R_MIPS_GOT16	\.text
+0+02cc <[^>]*> addiu	at,at,876
+[ 	]*2cc: R_MIPS_LO16	\.text
+0+02d0 <[^>]*> jr	at
+0+02d4 <[^>]*> nop
+0+02d8 <[^>]*> mtc1	v0,\$f31
+0+02dc <[^>]*> b	00000000 <foo>
+0+02e0 <[^>]*> nop
+0+02e4 <[^>]*> mtc1	v0,\$f31
+0+02e8 <[^>]*> lw	at,2\(gp\)
+[ 	]*2e8: R_MIPS_GOT16	\.text
+0+02ec <[^>]*> addiu	at,at,876
+[ 	]*2ec: R_MIPS_LO16	\.text
+0+02f0 <[^>]*> jr	at
+0+02f4 <[^>]*> nop
+0+02f8 <[^>]*> mfhi	v0
+0+02fc <[^>]*> b	00000000 <foo>
+0+0300 <[^>]*> nop
+0+0304 <[^>]*> mfhi	v0
+0+0308 <[^>]*> lw	at,2\(gp\)
+[ 	]*308: R_MIPS_GOT16	\.text
+0+030c <[^>]*> addiu	at,at,876
+[ 	]*30c: R_MIPS_LO16	\.text
+0+0310 <[^>]*> jr	at
+0+0314 <[^>]*> nop
+0+0318 <[^>]*> move	v0,a0
+0+031c <[^>]*> jr	v0
+0+0320 <[^>]*> nop
+0+0324 <[^>]*> jr	a0
+0+0328 <[^>]*> move	v0,a0
+0+032c <[^>]*> move	v0,a0
+0+0330 <[^>]*> jalr	v0
+0+0334 <[^>]*> nop
+0+0338 <[^>]*> jalr	a0
+0+033c <[^>]*> move	v0,a0
+0+0340 <[^>]*> move	v0,ra
+0+0344 <[^>]*> jalr	v1
+0+0348 <[^>]*> nop
+0+034c <[^>]*> move	ra,a0
+0+0350 <[^>]*> jalr	a1
+0+0354 <[^>]*> nop
+0+0358 <[^>]*> jalr	v0,v1
+0+035c <[^>]*> move	ra,a0
+0+0360 <[^>]*> move	v0,ra
+0+0364 <[^>]*> jalr	v0,v1
+0+0368 <[^>]*> nop
+	\.\.\.
+0+2036c <[^>]*> nop
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1.l binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1.l
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1.l	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1.l	2004-01-14 03:09:21.000000000 +0000
@@ -0,0 +1,24 @@
+.*: Assembler messages:
+.*:9: Warning: relaxed out-of-range branch into a jump
+.*:14: Warning: relaxed out-of-range branch into a jump
+.*:19: Warning: relaxed out-of-range branch into a jump
+.*:24: Warning: relaxed out-of-range branch into a jump
+.*:28: Warning: relaxed out-of-range branch into a jump
+.*:33: Warning: relaxed out-of-range branch into a jump
+.*:37: Warning: relaxed out-of-range branch into a jump
+.*:42: Warning: relaxed out-of-range branch into a jump
+.*:46: Warning: relaxed out-of-range branch into a jump
+.*:51: Warning: relaxed out-of-range branch into a jump
+.*:55: Warning: relaxed out-of-range branch into a jump
+.*:62: Warning: relaxed out-of-range branch into a jump
+.*:68: Warning: relaxed out-of-range branch into a jump
+.*:73: Warning: relaxed out-of-range branch into a jump
+.*:79: Warning: relaxed out-of-range branch into a jump
+.*:85: Warning: relaxed out-of-range branch into a jump
+.*:96: Warning: relaxed out-of-range branch into a jump
+.*:101: Warning: relaxed out-of-range branch into a jump
+.*:106: Warning: relaxed out-of-range branch into a jump
+.*:111: Warning: relaxed out-of-range branch into a jump
+.*:116: Warning: relaxed out-of-range branch into a jump
+.*:121: Warning: relaxed out-of-range branch into a jump
+.*:126: Warning: relaxed out-of-range branch into a jump
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1.s binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1.s
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap1.s	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap1.s	2004-01-14 02:45:57.000000000 +0000
@@ -0,0 +1,149 @@
+# Source file used to test branch relaxation with swapping.
+
+	.text
+foo:
+
+	move	$2, $4
+	b	foo
+	move	$2, $4
+	b	bar
+
+	lw	$2, ($4)
+	b	foo
+	lw	$2, ($4)
+	b	bar
+
+	sw	$2, ($4)
+	b	foo
+	sw	$2, ($4)
+	b	bar
+
+	move	$2, $4
+	beq	$2, $3, foo
+	move	$2, $4
+	beq	$2, $3, bar
+	move	$2, $4
+	beq	$4, $5, foo
+	move	$2, $4
+	beq	$4, $5, bar
+
+	addiu	$2, $4, 1
+	beq	$2, $3, foo
+	addiu	$2, $4, 1
+	beq	$2, $3, bar
+	addiu	$2, $4, 1
+	beq	$4, $5, foo
+	addiu	$2, $4, 1
+	beq	$4, $5, bar
+
+	lw	$2, ($4)
+	beq	$2, $3, foo
+	lw	$2, ($4)
+	beq	$2, $3, bar
+	lw	$2, ($4)
+	beq	$4, $5, foo
+	lw	$2, ($4)
+	beq	$4, $5, bar
+
+	sw	$2, ($4)
+	beq	$2, $3, foo
+	sw	$2, ($4)
+	beq	$2, $3, bar
+	sw	$2, ($4)
+	beq	$4, $5, foo
+	sw	$2, ($4)
+	beq	$4, $5, bar
+
+	mfc1	$2, $0
+	move	$6, $7
+	beq	$2, $3, foo
+	mfc1	$2, $0
+	move	$6, $7
+	beq	$2, $3, bar
+	mfc1	$2, $0
+	move	$6, $7
+	beq	$4, $5, foo
+	mfc1	$2, $0
+	move	$6, $7
+	beq	$4, $5, bar
+
+	move	$2, $4
+	bc1t	foo
+	move	$2, $4
+	bc1t	bar
+
+	.set	nomove
+	move	$2, $4
+	b	foo
+	move	$2, $4
+	b	bar
+	.set	move
+
+	move	$2, $4
+0:	b	foo
+	move	$2, $4
+0:	b	bar
+
+	.set	noreorder
+	move	$6, $7
+	.set	reorder
+	move	$2, $4
+	b	foo
+	.set	noreorder
+	move	$6, $7
+	.set	reorder
+	move	$2, $4
+	b	bar
+
+	sw	$2, 0f
+0:	b	foo
+	sw	$2, 0f
+0:	b	bar
+
+	lwc1	$0, ($4)
+	b	foo
+	lwc1	$0, ($4)
+	b	bar
+
+	cfc1	$2, $31
+	b	foo
+	cfc1	$2, $31
+	b	bar
+
+	ctc1	$2, $31
+	b	foo
+	ctc1	$2, $31
+	b	bar
+
+	mtc1	$2, $31
+	b	foo
+	mtc1	$2, $31
+	b	bar
+
+	mfhi	$2
+	b	foo
+	mfhi	$2
+	b	bar
+
+	move	$2, $4
+	jr	$2
+	move	$2, $4
+	jr	$4
+
+	move	$2, $4
+	jalr	$2
+	move	$2, $4
+	jalr	$4
+
+	move	$2, $31
+	jalr	$3
+	move	$31, $4
+	jalr	$5
+
+	move	$31, $4
+	jalr	$2, $3
+	move	$2, $31
+	jalr	$2, $3
+
+        .space  0x20000         # to make a 128kb loop body
+bar:
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.d binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.d
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.d	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.d	2004-01-14 03:24:19.000000000 +0000
@@ -0,0 +1,135 @@
+#objdump: -dr --prefix-addresses -mmips:6000
+#name: MIPS2 branch likely relaxation with swapping
+#as: -32 -mips2 -KPIC -relax-branch
+#source: relax-swap2.s
+#stderr: relax-swap2.l
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+0+0000 <[^>]*> move	v0,a0
+0+0004 <[^>]*> beql	v0,v1,00000000 <foo>
+0+0008 <[^>]*> nop
+0+000c <[^>]*> move	v0,a0
+0+0010 <[^>]*> beql	v0,v1,00000020 <foo\+0x20>
+0+0014 <[^>]*> nop
+0+0018 <[^>]*> beqzl	zero,00000030 <foo\+0x30>
+0+001c <[^>]*> nop
+0+0020 <[^>]*> lw	at,2\(gp\)
+[ 	]*20: R_MIPS_GOT16	\.text
+0+0024 <[^>]*> addiu	at,at,424
+[ 	]*24: R_MIPS_LO16	\.text
+0+0028 <[^>]*> jr	at
+0+002c <[^>]*> nop
+0+0030 <[^>]*> move	v0,a0
+0+0034 <[^>]*> beql	a0,a1,00000000 <foo>
+0+0038 <[^>]*> nop
+0+003c <[^>]*> move	v0,a0
+0+0040 <[^>]*> beql	a0,a1,00000050 <foo\+0x50>
+0+0044 <[^>]*> nop
+0+0048 <[^>]*> beqzl	zero,00000060 <foo\+0x60>
+0+004c <[^>]*> nop
+0+0050 <[^>]*> lw	at,2\(gp\)
+[ 	]*50: R_MIPS_GOT16	\.text
+0+0054 <[^>]*> addiu	at,at,424
+[ 	]*54: R_MIPS_LO16	\.text
+0+0058 <[^>]*> jr	at
+0+005c <[^>]*> nop
+0+0060 <[^>]*> addiu	v0,a0,1
+0+0064 <[^>]*> beql	v0,v1,00000000 <foo>
+0+0068 <[^>]*> nop
+0+006c <[^>]*> addiu	v0,a0,1
+0+0070 <[^>]*> beql	v0,v1,00000080 <foo\+0x80>
+0+0074 <[^>]*> nop
+0+0078 <[^>]*> beqzl	zero,00000090 <foo\+0x90>
+0+007c <[^>]*> nop
+0+0080 <[^>]*> lw	at,2\(gp\)
+[ 	]*80: R_MIPS_GOT16	\.text
+0+0084 <[^>]*> addiu	at,at,424
+[ 	]*84: R_MIPS_LO16	\.text
+0+0088 <[^>]*> jr	at
+0+008c <[^>]*> nop
+0+0090 <[^>]*> addiu	v0,a0,1
+0+0094 <[^>]*> beql	a0,a1,00000000 <foo>
+0+0098 <[^>]*> nop
+0+009c <[^>]*> addiu	v0,a0,1
+0+00a0 <[^>]*> beql	a0,a1,000000b0 <foo\+0xb0>
+0+00a4 <[^>]*> nop
+0+00a8 <[^>]*> beqzl	zero,000000c0 <foo\+0xc0>
+0+00ac <[^>]*> nop
+0+00b0 <[^>]*> lw	at,2\(gp\)
+[ 	]*b0: R_MIPS_GOT16	\.text
+0+00b4 <[^>]*> addiu	at,at,424
+[ 	]*b4: R_MIPS_LO16	\.text
+0+00b8 <[^>]*> jr	at
+0+00bc <[^>]*> nop
+0+00c0 <[^>]*> lw	v0,0\(a0\)
+0+00c4 <[^>]*> beql	v0,v1,00000000 <foo>
+0+00c8 <[^>]*> nop
+0+00cc <[^>]*> lw	v0,0\(a0\)
+0+00d0 <[^>]*> beql	v0,v1,000000e0 <foo\+0xe0>
+0+00d4 <[^>]*> nop
+0+00d8 <[^>]*> beqzl	zero,000000f0 <foo\+0xf0>
+0+00dc <[^>]*> nop
+0+00e0 <[^>]*> lw	at,2\(gp\)
+[ 	]*e0: R_MIPS_GOT16	\.text
+0+00e4 <[^>]*> addiu	at,at,424
+[ 	]*e4: R_MIPS_LO16	\.text
+0+00e8 <[^>]*> jr	at
+0+00ec <[^>]*> nop
+0+00f0 <[^>]*> lw	v0,0\(a0\)
+0+00f4 <[^>]*> beql	a0,a1,00000000 <foo>
+0+00f8 <[^>]*> nop
+0+00fc <[^>]*> lw	v0,0\(a0\)
+0+0100 <[^>]*> beql	a0,a1,00000110 <foo\+0x110>
+0+0104 <[^>]*> nop
+0+0108 <[^>]*> beqzl	zero,00000120 <foo\+0x120>
+0+010c <[^>]*> nop
+0+0110 <[^>]*> lw	at,2\(gp\)
+[ 	]*110: R_MIPS_GOT16	\.text
+0+0114 <[^>]*> addiu	at,at,424
+[ 	]*114: R_MIPS_LO16	\.text
+0+0118 <[^>]*> jr	at
+0+011c <[^>]*> nop
+0+0120 <[^>]*> sw	v0,0\(a0\)
+0+0124 <[^>]*> beql	v0,v1,00000000 <foo>
+0+0128 <[^>]*> nop
+0+012c <[^>]*> sw	v0,0\(a0\)
+0+0130 <[^>]*> beql	v0,v1,00000140 <foo\+0x140>
+0+0134 <[^>]*> nop
+0+0138 <[^>]*> beqzl	zero,00000150 <foo\+0x150>
+0+013c <[^>]*> nop
+0+0140 <[^>]*> lw	at,2\(gp\)
+[ 	]*140: R_MIPS_GOT16	\.text
+0+0144 <[^>]*> addiu	at,at,424
+[ 	]*144: R_MIPS_LO16	\.text
+0+0148 <[^>]*> jr	at
+0+014c <[^>]*> nop
+0+0150 <[^>]*> sw	v0,0\(a0\)
+0+0154 <[^>]*> beql	a0,a1,00000000 <foo>
+0+0158 <[^>]*> nop
+0+015c <[^>]*> sw	v0,0\(a0\)
+0+0160 <[^>]*> beql	a0,a1,00000170 <foo\+0x170>
+0+0164 <[^>]*> nop
+0+0168 <[^>]*> beqzl	zero,00000180 <foo\+0x180>
+0+016c <[^>]*> nop
+0+0170 <[^>]*> lw	at,2\(gp\)
+[ 	]*170: R_MIPS_GOT16	\.text
+0+0174 <[^>]*> addiu	at,at,424
+[ 	]*174: R_MIPS_LO16	\.text
+0+0178 <[^>]*> jr	at
+0+017c <[^>]*> nop
+0+0180 <[^>]*> teq	v0,a0
+0+0184 <[^>]*> beq	a0,a1,00000000 <foo>
+0+0188 <[^>]*> nop
+0+018c <[^>]*> teq	v0,a0
+0+0190 <[^>]*> bne	a0,a1,000001a4 <foo\+0x1a4>
+0+0194 <[^>]*> nop
+0+0198 <[^>]*> lw	at,2\(gp\)
+[ 	]*198: R_MIPS_GOT16	\.text
+0+019c <[^>]*> addiu	at,at,424
+[ 	]*19c: R_MIPS_LO16	\.text
+0+01a0 <[^>]*> jr	at
+0+01a4 <[^>]*> nop
+	\.\.\.
+	\.\.\.
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.l binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.l
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.l	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.l	2004-01-14 03:09:27.000000000 +0000
@@ -0,0 +1,10 @@
+.*: Assembler messages:
+.*:9: Warning: relaxed out-of-range branch into a jump
+.*:13: Warning: relaxed out-of-range branch into a jump
+.*:18: Warning: relaxed out-of-range branch into a jump
+.*:22: Warning: relaxed out-of-range branch into a jump
+.*:27: Warning: relaxed out-of-range branch into a jump
+.*:31: Warning: relaxed out-of-range branch into a jump
+.*:36: Warning: relaxed out-of-range branch into a jump
+.*:40: Warning: relaxed out-of-range branch into a jump
+.*:45: Warning: relaxed out-of-range branch into a jump
diff -up --recursive --new-file binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.s binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.s
--- binutils-2.14.90-20031222.macro/gas/testsuite/gas/mips/relax-swap2.s	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.14.90-20031222/gas/testsuite/gas/mips/relax-swap2.s	2004-01-14 01:55:17.000000000 +0000
@@ -0,0 +1,48 @@
+# Source file used to test branch likely relaxation with swapping.
+
+	.text
+foo:
+
+	move	$2, $4
+	beql	$2, $3, foo
+	move	$2, $4
+	beql	$2, $3, bar
+	move	$2, $4
+	beql	$4, $5, foo
+	move	$2, $4
+	beql	$4, $5, bar
+
+	addiu	$2, $4, 1
+	beql	$2, $3, foo
+	addiu	$2, $4, 1
+	beql	$2, $3, bar
+	addiu	$2, $4, 1
+	beql	$4, $5, foo
+	addiu	$2, $4, 1
+	beql	$4, $5, bar
+
+	lw	$2, ($4)
+	beql	$2, $3, foo
+	lw	$2, ($4)
+	beql	$2, $3, bar
+	lw	$2, ($4)
+	beql	$4, $5, foo
+	lw	$2, ($4)
+	beql	$4, $5, bar
+
+	sw	$2, ($4)
+	beql	$2, $3, foo
+	sw	$2, ($4)
+	beql	$2, $3, bar
+	sw	$2, ($4)
+	beql	$4, $5, foo
+	sw	$2, ($4)
+	beql	$4, $5, bar
+
+	teq	$2, $4
+	beq	$4, $5, foo
+	teq	$2, $4
+	beq	$4, $5, bar
+
+        .space  0x20000         # to make a 128kb loop body
+bar:


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