bench: fibmmem ++
[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         subi r1, r1, 4
31         call+ fibmem
32         ldw r3, 0-4(r2)
33         add r0, r3, r0
34         addi r2, r2, 4
35         stw r0, 0(r2) ; ergebnis speichern
36         ret+