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]

[commit] SPU i-cache: Always use "compact stubs"


Hello,

as the cache manager now only supports the "compact" stubs, there's really
no reason to support both variants in the linker.  This patch removes support
for the non-compact version.

Tested on spu-elf with no regressions.
Approved off-line by Alan Modra; committed to mainline.

Bye,
Ulrich


ChangeLog:

bfd/
	* elf32-spu.c (build_stub): Always build "compact" sofware
	i-cache stubs.

ld/
	* emultempl/spuelf.em (PARSE_AND_LIST_ARGS_CASES): Always use
	compact stubs with software i-cache.

ld/testsuite/
	* ld-spu/icache1.d: Update for compact stubs.


diff -urNp src.orig/bfd/elf32-spu.c src/bfd/elf32-spu.c
--- src.orig/bfd/elf32-spu.c	2009-05-12 14:22:58.000000000 +0200
+++ src/bfd/elf32-spu.c	2009-05-12 14:25:59.000000000 +0200
@@ -1271,7 +1271,8 @@ build_stub (struct bfd_link_info *info,
       bfd_put_32 (sec->owner, (dest & 0x3ffff) | (dest_ovl << 18),
 		  sec->contents + sec->size + 4);
     }
-  else if (htab->params->ovly_flavour == ovly_soft_icache)
+  else if (htab->params->ovly_flavour == ovly_soft_icache
+	   && htab->params->compact_stub)
     {
       lrlive = 0;
       if (stub_type == nonovl_stub)
@@ -1357,61 +1358,32 @@ build_stub (struct bfd_link_info *info,
 	      + htab->ovly_entry[1]->root.u.def.section->output_offset
 	      + htab->ovly_entry[1]->root.u.def.section->output_section->vma);
 
-      if (!htab->params->compact_stub)
-	{
-	  /* The branch that uses this stub goes to stub_addr + 12.  We'll
-	     set up an xor pattern that can be used by the icache manager
-	     to modify this branch to go directly to its destination.  */
-	  g->stub_addr += 12;
-	  br_dest = g->stub_addr;
-	  if (irela == NULL)
-	    {
-	      /* Except in the case of _SPUEAR_ stubs, the branch in
-		 question is the one in the stub itself.  */
-	      BFD_ASSERT (stub_type == nonovl_stub);
-	      g->br_addr = g->stub_addr;
-	      br_dest = to;
-	    }
-
-	  bfd_put_32 (sec->owner, dest_ovl - 1,
-		      sec->contents + sec->size + 0);
-	  set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
-	  bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
-		      sec->contents + sec->size + 4);
-	  bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
-		      sec->contents + sec->size + 8);
-	  bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
-		      sec->contents + sec->size + 12);
-	  patt = dest ^ br_dest;
-	  if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
-	    patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
-	  bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
-		      sec->contents + sec->size + 16 + (g->br_addr & 0xf));
-	}
-      else
-	{
-	  g->stub_addr += 4;
-	  br_dest = g->stub_addr;
-	  if (irela == NULL)
-	    {
-	      BFD_ASSERT (stub_type == nonovl_stub);
-	      g->br_addr = g->stub_addr;
-	      br_dest = to;
-	    }
-
-	  set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
-	  bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
-		      sec->contents + sec->size);
-	  bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
-		      sec->contents + sec->size + 4);
-	  bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
-		      sec->contents + sec->size + 8);
-	  patt = dest ^ br_dest;
-	  if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
-	    patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
-	  bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
-		      sec->contents + sec->size + 12);
-	}
+      /* The branch that uses this stub goes to stub_addr + 4.  We'll
+	 set up an xor pattern that can be used by the icache manager
+	 to modify this branch to go directly to its destination.  */
+      g->stub_addr += 4;
+      br_dest = g->stub_addr;
+      if (irela == NULL)
+	{
+	  /* Except in the case of _SPUEAR_ stubs, the branch in
+	     question is the one in the stub itself.  */
+	  BFD_ASSERT (stub_type == nonovl_stub);
+	  g->br_addr = g->stub_addr;
+	  br_dest = to;
+	}
+
+      set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
+      bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
+		  sec->contents + sec->size);
+      bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
+		  sec->contents + sec->size + 4);
+      bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
+		  sec->contents + sec->size + 8);
+      patt = dest ^ br_dest;
+      if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
+	patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
+      bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
+		  sec->contents + sec->size + 12);
 
       if (ovl == 0)
 	/* Extra space for linked list entries.  */
diff -urNp src.orig/ld/emultempl/spuelf.em src/ld/emultempl/spuelf.em
--- src.orig/ld/emultempl/spuelf.em	2009-05-12 14:17:37.000000000 +0200
+++ src/ld/emultempl/spuelf.em	2009-05-12 14:27:03.000000000 +0200
@@ -719,6 +719,8 @@ PARSE_AND_LIST_ARGS_CASES='
 
     case OPTION_SPU_SOFT_ICACHE:
       params.ovly_flavour = ovly_soft_icache;
+      /* Software i-cache stubs are always "compact".  */
+      params.compact_stub = 1;
       if (!num_lines_set)
 	params.num_lines = 32;
       else if ((params.num_lines & -params.num_lines) != params.num_lines)
diff -u -p -r1.6 icache1.d
--- src.orig/ld/testsuite/ld-spu/icache1.d	14 May 2009 16:04:02 -0000	1.6
+++ src/ld/testsuite/ld-spu/icache1.d	14 May 2009 16:52:29 -0000
@@ -26,30 +26,23 @@ Disassembly of section \.ovly2:
 .*	24 00 40 80 	stqd	\$0,16\(\$1\)
 .*	1c f0 00 81 	ai	\$1,\$1,-64
 .*	24 00 00 81 	stqd	\$1,0\(\$1\)
-.*	33 00 73 80 	brsl	\$0,7ac .*
-.*	33 00 77 00 	brsl	\$0,7cc .*
+.*	33 00 78 80 	brsl	\$0,7d4 .*
+.*	33 00 7a 00 	brsl	\$0,7e4 .*
 	\.\.\.
-.*	32 00 16 80 	br	7ec .*
+.*	32 00 17 80 	br	7f4 .*
 	\.\.\.
- 7a0:	00 00 00 02.*
- 7a4:	00 04 09 04.*
- 7a8:	a0 00 04 10.*
- 7ac:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
- 7b0:	00 00 ed 00.*
-	\.\.\.
- 7c0:	00 00 00 02.*
- 7c4:	00 04 08 00.*
- 7c8:	a0 00 04 14.*
- 7cc:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
- 7d0:	00 00 00 00.*
- 7d4:	00 00 0a 80.*
-	\.\.\.
- 7e4:	00 04 00 00.*
- 7e8:	20 00 07 38.*
- 7ec:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
-	\.\.\.
- 7f8:	00 7f 0f 80.*
- 7fc:	00 00 00 00.*
+ 7d0:	00 04 09 04.*
+ 7d4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7d8:	a0 00 04 10.*
+ 7dc:	00 00 e6 00.*
+ 7e0:	00 04 08 00.*
+ 7e4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7e8:	a0 00 04 14.*
+ 7ec:	00 00 07 80.*
+ 7f0:	00 04 00 00.*
+ 7f4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7f8:	20 00 07 38.*
+ 7fc:	00 7f 0e 80.*
 
 Disassembly of section \.ovly3:
 
@@ -86,43 +79,33 @@ Disassembly of section \.ovly5:
 .*	42 01 00 03 	ila	\$3,200 .*
 .*	18 00 c0 81 	a	\$1,\$1,\$3
 .*	34 00 40 80 	lqd	\$0,16\(\$1\)
-.*	30 00 7d 80 	bra	3ec .*
-	\.\.\.
- 3e0:	00 00 00 03.*
- 3e4:	00 04 0c 00.*
- 3e8:	a0 00 03 2c.*
- 3ec:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+.*	30 00 7e 80 	bra	3f4 .*
 	\.\.\.
- 3fc:	00 01 fd 80.*
+ 3f0:	00 04 0c 00.*
+ 3f4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 3f8:	a0 00 03 2c.*
+ 3fc:	00 01 fe 80.*
 
 Disassembly of section \.ovly6:
 
 00000400 <\.ovly6>:
-.*	31 00 f5 80 	brasl	\$0,7ac .*
-.*	33 00 79 00 	brsl	\$0,7cc .*
+.*	31 00 fa 80 	brasl	\$0,7d4 .*
+.*	33 00 7c 00 	brsl	\$0,7e4 .*
 	\.\.\.
-.*	32 00 18 80 	br	7ec .*
+.*	32 00 19 80 	br	7f4 .*
 	\.\.\.
- 7a0:	00 00 00 07.*
- 7a4:	00 08 0c 00.*
- 7a8:	a0 00 04 00.*
- 7ac:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
- 7b0:	00 01 75 80.*
-	\.\.\.
- 7c0:	00 00 00 07.*
- 7c4:	00 08 0c 00.*
- 7c8:	a0 00 04 04.*
- 7cc:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
- 7d0:	00 00 00 00.*
- 7d4:	00 00 86 80.*
-	\.\.\.
- 7e0:	00 00 00 04.*
- 7e4:	00 08 00 00.*
- 7e8:	20 00 07 28.*
- 7ec:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
-	\.\.\.
- 7f8:	00 7f 03 80.*
- 7fc:	00 00 00 00.*
+ 7d0:	00 08 0c 00.*
+ 7d4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7d8:	a0 00 04 00.*
+ 7dc:	00 01 7a 80.*
+ 7e0:	00 08 0c 00.*
+ 7e4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7e8:	a0 00 04 04.*
+ 7ec:	00 00 83 80.*
+ 7f0:	00 08 00 00.*
+ 7f4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ 7f8:	20 00 07 28.*
+ 7fc:	00 7f 02 80.*
 
 Disassembly of section \.ovly7:
 
@@ -133,32 +116,24 @@ Disassembly of section \.ovly7:
 .*	00 20 00 00 	lnop
 .*	04 00 02 01 	ori	\$1,\$4,0
 .*	24 00 02 04 	stqd	\$4,0\(\$4\)
-.*	33 00 72 80 	brsl	\$0,bac .*
-.*	33 00 76 00 	brsl	\$0,bcc .*
+.*	33 00 77 80 	brsl	\$0,bd4 .*
+.*	33 00 79 00 	brsl	\$0,be4 .*
 .*	34 00 00 81 	lqd	\$1,0\(\$1\)
 	\.\.\.
-.*	32 00 15 00 	br	bec .*
-	\.\.\.
- ba0:	00 00 00 03.*
- ba4:	00 04 0c 00.*
- ba8:	a0 00 08 18.*
- bac:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
-	\.\.\.
- bb8:	00 00 0f 80.*
- bbc:	00 00 00 00.*
- bc0:	00 00 00 07.*
- bc4:	00 08 0c 00.*
- bc8:	a0 00 08 1c.*
- bcc:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+.*	32 00 16 00 	br	bf4 .*
 	\.\.\.
+ bd0:	00 04 0c 00.*
+ bd4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ bd8:	a0 00 08 18.*
  bdc:	00 00 0a 80.*
- be0:	00 00 00 05.*
- be4:	00 08 04 00.*
- be8:	20 00 0b 44.*
- bec:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
- bf0:	00 00 00 00.*
- bf4:	00 7f 02 80.*
-	\.\.\.
+ be0:	00 08 0c 00.*
+ be4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ be8:	a0 00 08 1c.*
+ bec:	00 00 05 80.*
+ bf0:	00 08 04 00.*
+ bf4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+ bf8:	20 00 0b 44.*
+ bfc:	00 7f 01 80.*
 
 Disassembly of section \.ovly8:
 
@@ -166,39 +141,32 @@ Disassembly of section \.ovly8:
 .*	24 00 40 80 	stqd	\$0,16\(\$1\)
 .*	24 f8 00 81 	stqd	\$1,-512\(\$1\)
 .*	1c 80 00 81 	ai	\$1,\$1,-512
-.*	31 01 f9 80 	brasl	\$0,fcc .*
-	\.\.\.
-.*	32 00 17 80 	br	fec .*
+.*	31 01 fc 80 	brasl	\$0,fe4 .*
 	\.\.\.
-     fc0:	00 00 00 02.*
-     fc4:	00 04 09 04.*
-     fc8:	a0 00 0c 0c.*
-     fcc:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
-	\.\.\.
-     fdc:	00 00 d9 00.*
-     fe0:	00 00 00 06.*
-     fe4:	00 08 08 00.*
-     fe8:	20 00 0f 30.*
-     fec:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
-     ff0:	00 7f 0d 80.*
+.*	32 00 18 80 	br	ff4 .*
 	\.\.\.
+     fe0:	00 04 09 04.*
+     fe4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+     fe8:	a0 00 0c 0c.*
+     fec:	00 00 dc 00.*
+     ff0:	00 08 08 00.*
+     ff4:	31 02 01 cb 	brasl	\$75,100c <__icache_br_handler>
+     ff8:	20 00 0f 30.*
+     ffc:	00 7f 02 80.*
 
 Disassembly of section \.text:
 
 00001000 <_start>:
 .*	41 00 02 03 	ilhu	\$3,4
 .*	60 86 00 03 	iohl	\$3,3072	# c00
-.*	32 00 04 80 	br	102c.*
+.*	32 00 03 80 	br	1024.*
 0000100c <__icache_br_handler>:
     100c:	00 00 00 00 	stop
 00001010 <__icache_call_handler>:
 	\.\.\.
-    1020:	00 00 00 01.*
-    1024:	00 04 04 00.*
+    1020:	00 04 04 00.*
+    1024:	31 02 02 4b 	brasl	\$75,1010 <__icache_call_handler>
     1028:	a0 00 10 08.*
-    102c:	31 02 02 4b 	brasl	\$75,1010 <__icache_call_handler>
-	\.\.\.
-    1038:	00 7e 7b 80.*
-	\.\.\.
+    102c:	00 7e 7c 80.*
 
 #pass
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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