Skip to content

Instantly share code, notes, and snippets.

@rgm
Created May 8, 2014 23:33
Show Gist options
  • Save rgm/c241b986d1b61572d6a1 to your computer and use it in GitHub Desktop.
Save rgm/c241b986d1b61572d6a1 to your computer and use it in GitHub Desktop.
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
;; becomes
(controller
(assign continue (label fib-done))
fib-loop
(test (op <) (reg n) (const 2))
(branch (label immediate-answer))
;; set up to compute fib(n-1)
(save continue)
(assign continue (label (after-fib-n-1)))
(save n) ; save old n
(assign n (op -) (reg n) (const 1)) ; clobber n to n - 1
(goto (label fib-loop)) ; perform recursive call
after-fib-n-1 ; on return, val contains fib(n-1)
(restore n)
(restore continue)
(assign n (op -) (reg n) (const 2))
(save continue)
(assign continue (label after-fib-n-2))
(save val) ; save fib(n-1)
(goto (label fib-loop))
after-fib-n-2 ; on return val contains fib(n-2)
(assign n (reg val)) ; n has fib(n-2)
(restore val) ; val now fib(n-1)
(restore continue)
(assign val (op +) (reg val) (reg n)) ; fib(n-1) + fib(n-2)
(goto (reg continue)) ; return to caller, answer in val
immediate-answer
(assign val (reg n))
(goto (reg continue))
fib-done)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment