Created
May 8, 2014 23:33
-
-
Save rgm/c241b986d1b61572d6a1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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