@opt stack_pointer RG @opt csr_scratch RF @use ext_std:* @label program ; call fibo subroutine with parameter 10 ldi RA 10 csi fibo hlt @label fibo ; function fibo ; parameters: ; RA n : u16 ; return value: ; RA fibo(n) : u16 spu RB ; prelude spu RC subi RA 2 RA ; if n < 2, return n bri f_sign fibo_early spu RD ; prelude ldi RB 0 ; a = 0 ldi RC 1 ; b = 1 @label fibo_loop add RB RC RD ; v = a + b mov RC RB ; a = b mov RD RC ; b = v dec RA ; n -= 1 bri f_zero fibo_done ; loop while n > 0 jpi fibo_loop @label fibo_early spo RC spo RB rsr @label fibo_done mov RD RA spo RD ; restore registers spo RC spo RB rsr