This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


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

SH Target & sp_switch


"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


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