a91543ddbcc3e7acfc922dd6d0301b7879d2bdf5
[calu.git] / 8_benchs / src / fibmmem.s
1 .data
2 .org 0x10
3 list:
4         .fill 0x1 ;1. element = 1 ;0x10
5         .fill 0x1 ;2. element = 1 ;0x14
6         .fill 0x100, 0x0 ;nullen..
7 .text
8 main:
9         ldi r1, 9;
10         ldil r10, list@lo ; global pointer
11         ldih r10, list@hi
12         call+ fibcall;
13         br+ main;
14
15         ; fib(n) {
16         ;   if (list[n] > 0) {
17         ;       return list[n]
18         ;   }
19         ;   a = fib(n-1)
20         ;   list[n] = a + list[n-2]
21         ;   return list[n]
22         ; }
23 fibcall:
24         lls r1, r1, 2 ; *4
25 fibmem:
26         add r2, r10, r1
27         ldw r0, 0(r2)
28         cmpi r0, 0
29         retnz-
30         push r2 ; addr pushen
31         subi r1, r1, 4
32         call+ fibmem
33         ldw r2, 0-4(r2)
34         add r0, r2, r0
35         pop r2 ; addr poppen
36         stw r0, 0(r2) ; ergebnis speichern
37         addi r1, r1, 4
38         ret+