aboutsummaryrefslogtreecommitdiffstats
path: root/test/e2e/fibo/fibo.atk16
blob: fe38fe542b1dc97724d3c7f1764ea47e28ebaf2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; bootstrap code (must be called to setup mandatory data)
; will jump to label main
@include bootstrap

@label main
  ldi 10 RA
  calli fibo                   ; call fibo subroutine with parameter 10
  hlt

@label fibo                   ; fibo(n) subroutine
                              ; arguments: n (RA)
                              ; return: fibo(n) (RA)

  stack_stash RB RC RD        ; store RB, RC on stack
  subi RA 2 RB
  bri sign fibo_early         ; if n < 2, return n
  ldi 0 RB                    ; a = 0
  ldi 1 RC                    ; 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 zero fibo_done
  jpi fibo_loop               ; loop while n > 0
@label fibo_early
  stack_restore RB RC RD      ; restore used registers
  return                      ; return from subroutine
@label fibo_done
  mov RD RA                   ; restore used registers
  stack_restore RB RC RD      ; return from subroutine
  return