;; Compiled from file bench/fib20.lsp on Tue, 13 Dec 2022 15:11:14 GMT

(set-dynamic :load *situation*)

(openlisp:lap-require "loader")

(lap-loader '(
 ;;
 ;; fib
 ;;
  ((fentry fib 1 0 0)
   (param 0)
   (jeq _l004 '1)
   (jneq _l003 '2)
   (move a1 '1)
   (return)
  _l003
   (gsub1 a1)
   (recurse 1)
   (move a2 a1)
   (param 0)
   (gsub a1 '2)
   (recurse 1)
   (gadd a2 a1)
  _l004
   (return)
   (end))
))

(defgeneric gfib (n))

(lap-loader '(
 ;;
 ;; ilos::GF$gfib$i
 ;;
  ((fentry ilos::|GF$gfib$i| 1 0 0)
   (param 0)
   (jeq _l004 '1)
   (jneq _l003 '2)
   (move a1 '1)
   (return)
  _l003
   (sub1 a1)
   (call-method 'gfib a1)
   (move a2 a1)
   (param 0)
   (sub a1 '2)
   (call-method 'gfib a1)
   (gadd a2 a1)
  _l004
   (return)
   (end))
))

(defmethod gfib ((n <integer>)) . ilos::|GF$gfib$i|)

(defglobal matrix #(1 1 1 0))
(lap-loader '(
 ;;
 ;; matrix-*
 ;;
  ((fentry matrix-* 2 0 0)
   (push-function 'islisp:vector)
   (param 1)
   (elt a1 '0)
   (move a2 a1)
   (param 0)
   (elt a1 '0)
   (gmul a2 a1)
   (move a2 a1)
   (param 1)
   (elt a1 '1)
   (move a3 a1)
   (param 0)
   (elt a1 '2)
   (gmul a3 a1)
   (gadd a2 a1)
   (push a1)
   (param 1)
   (elt a1 '0)
   (move a2 a1)
   (param 0)
   (elt a1 '1)
   (gmul a2 a1)
   (move a2 a1)
   (param 1)
   (elt a1 '1)
   (move a3 a1)
   (param 0)
   (elt a1 '3)
   (gmul a3 a1)
   (gadd a2 a1)
   (push a1)
   (param 1)
   (elt a1 '2)
   (move a2 a1)
   (param 0)
   (elt a1 '0)
   (gmul a2 a1)
   (move a2 a1)
   (param 1)
   (elt a1 '3)
   (move a3 a1)
   (param 0)
   (elt a1 '2)
   (gmul a3 a1)
   (gadd a2 a1)
   (push a1)
   (param 1)
   (elt a1 '2)
   (move a2 a1)
   (param 0)
   (elt a1 '1)
   (gmul a2 a1)
   (move a2 a1)
   (param 1)
   (elt a1 '3)
   (move a3 a1)
   (param 0)
   (elt a1 '3)
   (gmul a3 a1)
   (gadd a2 a1)
   (push a1)
   (call 5)
   (return)
   (end))
))

(lap-loader '(
 ;;
 ;; matrix-power
 ;;
  ((fentry matrix-power 2 0 0)
   (param 0)
   (jneq _l001 '0)
   (move a1 '#(1 0 0 1))
   (return)
  _l001
   (jneq _l003 '1)
   (param 1)
   (return)
  _l003
   (mod a1 '2)
   (jneq _l005 '0)
   (param 1)
   (move a2 a1)
   (call-reg 'matrix-* a2 a1)
   (push a1)
   (param 0)
   (divn a1 '2)
   (push a1)
   (tailrec 2 2)
  _l005
   (param 1)
   (move a2 a1)
   (move a3 a1)
   (call-reg 'matrix-* a3 a1)
   (push a1)
   (param 0)
   (gsub1 a1)
   (divn a1 '2)
   (push a1)
   (recurse 2)
   (call-reg 'matrix-* a2 a1)
   (return)
   (end))
))

(lap-loader '(
 ;;
 ;; fibm
 ;;
  ((fentry fibm 1 0 0)
   (param 0)
   (glt a1 '2)
   (jnil _l001)
   (move a1 '1)
   (return)
  _l001
   (gref a2 'matrix)
   (param 0)
   (gsub1 a1)
   (call-reg 'matrix-power a2 a1)
   (elt a1 '0)
   (return)
   (end))
))

;; End of LAP file