hamayan です。
廣田> jsrを実行した後、戻り先をスタックに積むより処理が速くなると言っても
廣田> 飛び先のサブルーチンがさらにjsrをネスティングするためには結局、PRを
廣田> どこかに保存しなければなりません。
必ずしもサブルーチンの中から、またサブルーチンを呼ぶとは限らないからでは?
簡単な関数ならインライン展開されてしまう事が多いです。
廣田> おそらく、Cコンパイラも、ある関数を汎用的に作ろうとするなら、結局prを
廣田> スタック上に積んだり、戻したりする処理をつけるでしょう。
コンパイラは何でしょう?
HEWでの結果です。こんなどうでも良い関数をやらせてみました。
int prociduer(int a, int b);
int kotae;
void main(void)
{
kotae = prociduer(1, 2);
}
int prociduer(int a, int b)
{
return a + b;
}
アセンブル結果は、
_main: ; function: main
; frame size=4
STS.L PR,@-R15
MOV #1,R4 ; H'00000001
BSR _prociduer
MOV #2,R5 ; H'00000002
MOV.L L12+2,R6 ; _kotae
LDS.L @R15+,PR
RTS
MOV.L R0,@R6
_prociduer: ; function: prociduer
; frame size=0
ADD R5,R4
RTS
MOV R4,R0
L12:
.RES.W 1
.DATA.L _kotae
.SECTION B,DATA,ALIGN=4
_kotae: ; static: kotae
.RES.L 1
.END
でした。
関数prociduerは、関数の内部で完結していると判断できるので、この様な場合
HEWはSPEEDオプションを付けると、徹底的に最適化します。
スタックはメモリ上に詰まれますが、もしかして8bitサイズで、低速なメモリ
かもしれないので、あてには出来なかったのでは?