This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[commit] SPU i-cache: Always use "compact stubs"
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: binutils at sourceware dot org
- Date: Thu, 14 May 2009 20:02:54 +0200 (CEST)
- Subject: [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