projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add support to the MSP430 linker for the automatic placement of code and data into...
[deliverable/binutils-gdb.git]
/
ld
/
emultempl
/
spu_ovl.S
diff --git
a/ld/emultempl/spu_ovl.S
b/ld/emultempl/spu_ovl.S
index 3f9c83bbca4e18baae3595891fbae1f872a1a026..6640e1ea61a9a5469d648d66a423f1a063dde8ed 100644
(file)
--- a/
ld/emultempl/spu_ovl.S
+++ b/
ld/emultempl/spu_ovl.S
@@
-1,6
+1,6
@@
/* Overlay manager for SPU.
/* Overlay manager for SPU.
- Copyright
2006, 2007
Free Software Foundation, Inc.
+ Copyright
(C) 2006-2015
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
This file is part of the GNU Binutils.
@@
-46,12
+46,13
@@
#define cgbits reserved2
#define off3 reserved2
#define off4 reserved2
#define cgbits reserved2
#define off3 reserved2
#define off4 reserved2
+#define addr4 reserved2
#define off5 reserved2
#define tagstat reserved2
#define reserved3 $77
#define off5 reserved2
#define tagstat reserved2
#define reserved3 $77
-#define
buf1
reserved3
-#define
buf2
reserved3
+#define
size1
reserved3
+#define
size2
reserved3
#define rv3 reserved3
#define ealo reserved3
#define cmd reserved3
#define rv3 reserved3
#define ealo reserved3
#define cmd reserved3
@@
-66,11
+67,13
@@
#define rv5 reserved4
#define cgshuf reserved4
#define newovl reserved4
#define rv5 reserved4
#define cgshuf reserved4
#define newovl reserved4
+#define irqtmp1 reserved4
+#define irqtmp2 reserved4
#define reserved5 $79
#define target reserved5
#define reserved5 $79
#define target reserved5
-#define save1 $7
2
+#define save1 $7
4
#define rv4 save1
#define rv7 save1
#define tagid save1
#define rv4 save1
#define rv7 save1
#define tagid save1
@@
-86,7
+89,7
@@
#define oldovl save2
#define newvma save2
#define oldovl save2
#define newvma save2
-#define save3 $7
4
+#define save3 $7
2
#define rv1 save3
#define ea64 save3
#define buf3 save3
#define rv1 save3
#define ea64 save3
#define buf3 save3
@@
-94,6
+97,8
@@
#define newmap save3
#define oldmask save3
#define newmap save3
#define oldmask save3
+#define save4 $71
+#define irq_stat save4
.text
.align 4
.text
.align 4
@@
-139,24
+144,29
@@
__ovly_return:
#nop; lnop
#nop
lqx vma, tab1, off1 # 1,6 8
#nop; lnop
#nop
lqx vma, tab1, off1 # 1,6 8
+#ifdef OVLY_IRQ_SAVE
+ nop
+ stqd save4, -64($sp) # 1,6 9
+#else
#nop; lnop
#nop; lnop
+#endif
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
#nop
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
#nop
- rotqbyi
buf1, vma, 12
# 1,4 14
+ rotqbyi
size1, vma, 4
# 1,4 14
#nop
stqd save3, -48($sp) # 1,6 15
#nop
stqd save2, -32($sp) # 1,6 16
#nop
stqd save1, -16($sp) # 1,6 17
#nop
stqd save3, -48($sp) # 1,6 15
#nop
stqd save2, -32($sp) # 1,6 16
#nop
stqd save1, -16($sp) # 1,6 17
- andi present1,
buf1, 1
# 0,2 18
- stq
d ovl, (__ovly_current - __ovly_return)($lr)
# 1,6 18
+ andi present1,
size1, 1
# 0,2 18
+ stq
r ovl, __ovly_current
# 1,6 18
#nop; lnop
#nop
#nop; lnop
#nop
- brz present1,
__ovly_load_event
# 1,4 20
+ brz present1,
do_load
# 1,4 20
ovly_ret9:
#nop
bi target # 1,4 21
ovly_ret9:
#nop
bi target # 1,4 21
@@
-167,7
+177,9
@@
ovly_ret9:
* On entry $75 points to a word consisting of the overlay index in
* the top 14 bits, and the target address in the bottom 18 bits.
*
* On entry $75 points to a word consisting of the overlay index in
* the top 14 bits, and the target address in the bottom 18 bits.
*
- * Sets up $lr to return via __ovly_return.
+ * Sets up $lr to return via __ovly_return. If $lr is already set
+ * to return via __ovly_return, don't change it. In that case we
+ * have a tail call from one overlay function to another.
* Updates __ovly_current.
*/
.align 3
* Updates __ovly_current.
*/
.align 3
@@
-197,11
+209,11
@@
__ovly_load:
#lnop
#nop; lnop
#nop
#lnop
#nop; lnop
#nop
- lq
d cur, (__ovly_current - __ovly_return)(rv1)
# 1,6 2
+ lq
r cur, __ovly_current
# 1,6 2
shli off2, ovl, 4 # 0,4 3
shli off2, ovl, 4 # 0,4 3
- stq
d ovl, (__ovly_current - __ovly_return)(rv1)
# 1,6 3
+ stq
r ovl, __ovly_current
# 1,6 3
ceq rv2, $lr, rv1 # 0,2 4
ceq rv2, $lr, rv1 # 0,2 4
- lq
d rv3, (__rv_pattern - __ovly_return)(rv1)
# 1,6 4
+ lq
r rv3, __rv_pattern
# 1,6 4
#nop; lnop
#nop; lnop
#nop
#nop; lnop
#nop; lnop
#nop
@@
-214,11
+226,11
@@
__ovly_load:
ila rv1, __ovly_return # 0,2 1
stqd save2, -32($sp) # 1,6 1
shli off2, ovl, 4 # 0,4 2
ila rv1, __ovly_return # 0,2 1
stqd save2, -32($sp) # 1,6 1
shli off2, ovl, 4 # 0,4 2
- lq
a
cur, __ovly_current # 1,6 2
+ lq
r
cur, __ovly_current # 1,6 2
nop
nop
- stq
a
ovl, __ovly_current # 1,6 3
+ stq
r
ovl, __ovly_current # 1,6 3
ceq rv2, $lr, rv1 # 0,2 4
ceq rv2, $lr, rv1 # 0,2 4
- lq
d rv3, (__rv_pattern - __ovly_return)(rv1)
# 1,6 4
+ lq
r rv3, __rv_pattern
# 1,6 4
#nop
hbr ovly_load9, target # 1,15 5
#nop
#nop
hbr ovly_load9, target # 1,15 5
#nop
@@
-237,18
+249,22
@@
__ovly_load:
#nop
rotqmbyi rv6, $lr, -8 # 1,4 12
#nop
#nop
rotqmbyi rv6, $lr, -8 # 1,4 12
#nop
- rotqbyi
buf2, vma, 12
# 1,4 13
+ rotqbyi
size2, vma, 4
# 1,4 13
#nop
lqd save3, -48($sp) # 1,6 14
#nop; lnop
or rv7, rv4, rv6 # 0,2 16
lqd save2, -32($sp) # 1,6 16
#nop
lqd save3, -48($sp) # 1,6 14
#nop; lnop
or rv7, rv4, rv6 # 0,2 16
lqd save2, -32($sp) # 1,6 16
- andi present2, buf2, 1 # 0,2 17
+ andi present2, size2, 1 # 0,2 17
+#ifdef OVLY_IRQ_SAVE
+ stqd save4, -64($sp) # 1,6 17
+#else
lnop # 1,0 17
lnop # 1,0 17
+#endif
selb $lr, rv7, $lr, rv5 # 0,2 18
lqd save1, -16($sp) # 1,6 18
#nop
selb $lr, rv7, $lr, rv5 # 0,2 18
lqd save1, -16($sp) # 1,6 18
#nop
- brz present2,
__ovly_load_event
# 1,4 19
+ brz present2,
do_load
# 1,4 19
ovly_load9:
#nop
bi target # 1,4 20
ovly_load9:
#nop
bi target # 1,4 20
@@
-266,14
+282,25
@@
ovly_load9:
.global __ovly_load_event
.type __ovly_load_event, @function
__ovly_load_event:
.global __ovly_load_event
.type __ovly_load_event, @function
__ovly_load_event:
+do_load:
+#ifdef OVLY_IRQ_SAVE
+ ila irqtmp1, do_load10 # 0,2 -5
+ rotqbyi sz, vma, 8 # 1,4 -5
#nop
#nop
- rotqbyi sz, vma, 8 # 1,4 0
+ rdch irq_stat, $SPU_RdMachStat # 1,6 -4
+#nop
+ bid irqtmp1 # 1,4 -3
+do_load10:
+ nop
+#else
#nop
#nop
+ rotqbyi sz, vma, 8 # 1,4 0
+#endif
rotqbyi osize, vma, 4 # 1,4 1
#nop
lqa ea64, _EAR_ # 1,6 2
#nop
rotqbyi osize, vma, 4 # 1,4 1
#nop
lqa ea64, _EAR_ # 1,6 2
#nop
- lq
d cgshuf, (__cg_pattern - __ovly_return)($lr)
# 1,6 3
+ lq
r cgshuf, __cg_pattern
# 1,6 3
/* We could predict the branch at the end of this loop by adding a few
instructions, and there are plenty of free cycles to do so without
/* We could predict the branch at the end of this loop by adding a few
instructions, and there are plenty of free cycles to do so without
@@
-316,13
+343,13
@@
__ovly_xfer_loop:
brnz osize, __ovly_xfer_loop # 1,4 24
/* Now update our data structions while waiting for DMA to complete.
brnz osize, __ovly_xfer_loop # 1,4 24
/* Now update our data structions while waiting for DMA to complete.
- Low bit of .
buf
needs to be cleared on the _ovly_table entry
+ Low bit of .
size
needs to be cleared on the _ovly_table entry
corresponding to the evicted overlay, and set on the entry for the
newly loaded overlay. Note that no overlay may in fact be evicted
corresponding to the evicted overlay, and set on the entry for the
newly loaded overlay. Note that no overlay may in fact be evicted
- as _ovly_buf_table[] starts with all zeros. Don't zap .
buf
entry
+ as _ovly_buf_table[] starts with all zeros. Don't zap .
size
entry
for zero index! Also of course update the _ovly_buf_table entry. */
#nop
for zero index! Also of course update the _ovly_buf_table entry. */
#nop
- lq
d newovl, (__ovly_current - __ovly_return)($lr)
# 1,6 25
+ lq
r newovl, __ovly_current
# 1,6 25
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
@@
-333,7
+360,7
@@
__ovly_xfer_loop:
ila tab3, _ovly_table - 16 # 0,2 32
#lnop
#nop
ila tab3, _ovly_table - 16 # 0,2 32
#lnop
#nop
- fsmbi pbyte,
1
# 1,4 33
+ fsmbi pbyte,
0x100
# 1,4 33
#nop; lnop
#nop
lqx vma, tab3, off3 # 1,6 35
#nop; lnop
#nop
lqx vma, tab3, off3 # 1,6 35
@@
-351,7
+378,7
@@
__ovly_xfer_loop:
#nop; lnop
shli off4, buf3, 2 # 1,4 45
#lnop
#nop; lnop
shli off4, buf3, 2 # 1,4 45
#lnop
- ila tab4, _ovly_buf_table
# 0,2 46
+ ila tab4, _ovly_buf_table
- 4
# 0,2 46
#lnop
#nop; lnop
#nop; lnop
#lnop
#nop; lnop
#nop; lnop
@@
-359,13
+386,14
@@
__ovly_xfer_loop:
lqx map, tab4, off4 # 1,6 49
#nop
cwx genwi, tab4, off4 # 1,4 50
lqx map, tab4, off4 # 1,6 49
#nop
cwx genwi, tab4, off4 # 1,4 50
-#nop; lnop
+ a addr4, tab4, off4 # 0,2 51
+#lnop
#nop; lnop
#nop; lnop
#nop; lnop
#nop
#nop; lnop
#nop; lnop
#nop; lnop
#nop
- rotqby oldovl, map,
off4
# 1,4 55
-
nop
+ rotqby oldovl, map,
addr4
# 1,4 55
+
#
nop
shufb newmap, newovl, map, genwi # 0,4 56
#if MFC_TAG_ID < 16
ila newmask, 1 << MFC_TAG_ID # 0,2 57
shufb newmap, newovl, map, genwi # 0,4 56
#if MFC_TAG_ID < 16
ila newmask, 1 << MFC_TAG_ID # 0,2 57
@@
-375,7
+403,7
@@
__ovly_xfer_loop:
#lnop
#nop; lnop
#nop; lnop
#lnop
#nop; lnop
#nop; lnop
- stq
x newmap, tab4, off4
# 1,6 60
+ stq
d newmap, 0(addr4)
# 1,6 60
/* Save app's tagmask, wait for DMA complete, restore mask. */
ila tagstat, MFC_TAG_UPDATE_ALL # 0,2 61
/* Save app's tagmask, wait for DMA complete, restore mask. */
ila tagstat, MFC_TAG_UPDATE_ALL # 0,2 61
@@
-407,14
+435,30
@@
__ovly_xfer_loop:
#nop; lnop
andc pbit, pbit, zovl # 0,2 74
lqd save2, -32($sp) # 1,6 74
#nop; lnop
andc pbit, pbit, zovl # 0,2 74
lqd save2, -32($sp) # 1,6 74
+#ifdef OVLY_IRQ_SAVE
+ ila irqtmp2, do_load90 # 0,2 75
+#lnop
+ andi irq_stat, irq_stat, 1 # 0,2 76
+#lnop
+#else
#nop; lnop
#nop; lnop
#nop; lnop
#nop; lnop
+#endif
andc oldvma, oldvma, pbit # 0,2 77
lqd save1, -16($sp) # 1,6 77
andc oldvma, oldvma, pbit # 0,2 77
lqd save1, -16($sp) # 1,6 77
-#nop; lnop
- nop
+ nop # 0,0 78
+#lnop
+#nop
stqx oldvma, tab5, off5 # 1,6 79
stqx oldvma, tab5, off5 # 1,6 79
+#nop
+#ifdef OVLY_IRQ_SAVE
+ binze irq_stat, irqtmp2 # 1,4 80
+do_load90:
+#nop
+ lqd save4, -64($sp) # 1,6 84
+#else
#nop; lnop
#nop; lnop
+#endif
.global _ovly_debug_event
.type _ovly_debug_event, @function
.global _ovly_debug_event
.type _ovly_debug_event, @function
@@
-422,6
+466,6
@@
_ovly_debug_event:
nop
/* Branch to target address. */
do_load99:
nop
/* Branch to target address. */
do_load99:
- bi target # 1,4 81
+ bi target # 1,4 81
/85
.size __ovly_load, . - __ovly_load
.size __ovly_load, . - __ovly_load
This page took
0.049543 seconds
and
4
git commands to generate.