SH Target & sp_switch
Tony Bryant
brd@paradise.net.nz
Wed Sep 5 04:00:00 GMT 2001
"sp_switch" is a SH target specific function attribute that causes a load to
SP on entry to a function (and restore on exit). It allow a function to run
with a different stack. A godsend on the SH2, where you only have a small
amount of fast internal ram.
Except that it doesn't work.
#1. The optimizer will gladly move the SP load and restore code to a random
place in the function. Which is of course a problem, it needs to be exactly
the first and final (except the RTE) in the function.
I've fixed this one, by changing the machine description. I'll submitthat fix
to someone "in the loop" eventually.
#2. How is it supposed to work anyway? Here's an example:
//-------------------
// C code input
//-------------------
volatile int x;
#pragma interrupt
void timerinterrupt() __attribute__ ((sp_switch ("blah")));
void timerinterrupt()
{
x+=1
}
//-------------------
// result of "cc1 -S -Os test.c"
//-------------------
.file "test.c"
.text
.align 1
.global _timerinterrupt
.type _timerinterrupt,@function
_timerinterrupt:
mov.l r0,@-r15
mov.l #_blah,r0
mov.l @r0,r0
mov.l r15,@-r0
mov r0,r15
mov.l r1,@-r15
mov.l r2,@-r15
mov.l .L4,r2
mov.l @r2,r1
mov.l r14,@-r15
add #1,r1
mov.l r1,@r2
mov r15,r14
mov r14,r15
mov.l @r15+,r14
mov.l @r15+,r2
mov.l @r15+,r1
mov.l @r15+,r15
mov.l @r15+,r0
rte
nop
.L5:
.align 2
.L4:
.long _x
.Lfe1:
.size _timerinterrupt,.Lfe1-_timerinterrupt
.comm _x,4,4
.ident "GCC: (GNU) 3.0"
The BIG question I have is what was the writer of this feature expecting
"blah" to be? Considering the SH can only load constants of values -128 to
127? So if "blah" is variable if needs to be in this range. Unlikely I think.
Can any one think of anything workable to put in place of "blah" here?
I'm seriously considering changing the definition to remove the #, thus
allowing "blah" be a label close somewhere nearby.
I'm betting this feature was never made to work before now.
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com
More information about the crossgcc
mailing list