[commit] SPU i-cache: Always use "compact stubs"
Ulrich Weigand
uweigand@de.ibm.com
Thu May 14 18:03:00 GMT 2009
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
More information about the Binutils
mailing list