Marc:
I don't know why, but I got looking at the compiled code for fib, and it
seems to use much more stack space than needed, 8 words per invocation,
which seems counter-intuitive to me; is there a problem with the
compiler? I'm using the latest git compiler.
Brad
I started with
(declare (standard-bindings)
(extended-bindings)
(block)
(not safe))
(define (fib n)
(if (or (fx= n 0)
(fx= n 1))
n
(fx+ (fib (fx- n 1))
(fib (fx- n 2)))))
and got
#undef ___PH_PROC
#define ___PH_PROC ___H_fib
#undef ___PH_LBL0
#define ___PH_LBL0 3
#undef ___PD_ALL
#define ___PD_ALL ___D_FP ___D_R0 ___D_R1
#undef ___PR_ALL
#define ___PR_ALL ___R_FP ___R_R0 ___R_R1
#undef ___PW_ALL
#define ___PW_ALL ___W_FP ___W_R0 ___W_R1
___BEGIN_P_COD
___BEGIN_P_HLBL
___DEF_P_HLBL_INTRO
___DEF_P_HLBL(___L0_fib)
___DEF_P_HLBL(___L1_fib)
___DEF_P_HLBL(___L2_fib)
___DEF_P_HLBL(___L3_fib)
___DEF_P_HLBL(___L4_fib)
___END_P_HLBL
___BEGIN_P_SW
___DEF_SLBL(0,___L0_fib)
___IF_NARGS_EQ(1,___NOTHING)
___WRONG_NARGS(0,1,0,0)
___DEF_GLBL(___L_fib)
___IF(___FIXEQ(___R1,___FIX(0L)))
___GOTO(___L7_fib)
___END_IF
___GOTO(___L6_fib)
___DEF_GLBL(___L5_fib)
___SET_STK(1,___R0)
___SET_STK(2,___R1)
___SET_R1(___FIXSUB(___R1,___FIX(1L)))
___SET_R0(___LBL(2))
___ADJFP(8)
___POLL(1)
___DEF_SLBL(1,___L1_fib)
___IF(___FIXEQ(___R1,___FIX(0L)))
___GOTO(___L7_fib)
___END_IF
___DEF_GLBL(___L6_fib)
___IF(___NOT(___FIXEQ(___R1,___FIX(1L))))
___GOTO(___L5_fib)
___END_IF
___DEF_GLBL(___L7_fib)
___JUMPPRM(___NOTHING,___R0)
___DEF_SLBL(2,___L2_fib)
___SET_STK(-5,___R1)
___SET_R1(___FIXSUB(___STK(-6),___FIX(2L)))
___SET_R0(___LBL(3))
___IF(___FIXEQ(___R1,___FIX(0L)))
___GOTO(___L7_fib)
___END_IF
___GOTO(___L6_fib)
___DEF_SLBL(3,___L3_fib)
___SET_R1(___FIXADD(___STK(-5),___R1))
___POLL(4)
___DEF_SLBL(4,___L4_fib)
___ADJFP(-8)
___JUMPPRM(___NOTHING,___STK(1))
___END_P_SW
___END_P_COD