aboutsummaryrefslogtreecommitdiffstats
path: root/test/e2e/fibo/fibo.atk16
blob: 5b9030be698fe0eb57d3655742f01df64918d826 (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
33
@include %bootstrap

@data iters 51

@label main
  ldi iters RA
  ldr RA RA
  calli fibo                  ; call fibo subroutine with parameter 1000
  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