(wat-aro)

生きてます

SICP 問題 5.06

Fibonacci計算機の余分なsaveとrestoreを取り除く

  afterfib-n-1
    (restore n)
    (restore continue)                  ;ここでcontinueをrestoreしているのに
    (assign n (op -) (reg n) (const 2))
    (save continue)                     ;ここでそのままcontinueをsaveして
    (assign continue (label afterfib-n-2)) ;ここでcontinueを上書きしている.
    (save val)
    (goto (label fib-loop))

余分なところを削除すると

  afterfib-n-1
    (restore n)
    (assign n (op -) (reg n) (const 2))
    (assign continue (label afterfib-n-2))
    (save val)
    (goto (label fib-loop))

こうなる. 全文は以下の通り.

(controller
    (assign continue (label fib-done))
  fib-loop
    (test (op <) (reg n) (const 2))
    (branch (label immediate-answer))
    (save continue)
    (assign continue (label afterfib-n-1))
    (save n)
    (assign n (op -) (reg n) (const 1))
    (goto (label fib-loop))
  afterfib-n-1
    (restore n)
    (assign n (op -) (reg n) (const 2))
    (assign continue (label afterfib-n-2))
    (save val)
    (goto (label fib-loop))
  afterfib-n-2
    (assign n (reg val))
    (restore val)
    (restore continue)
    (assign val
            (op +) (reg val) (reg n))
    (goto (reg continue))
  immediate-answer
    (assign val (reg n))
    (goto (reg continue))
    fib-done)