bench: fibmem.s @ 177 instructions
[calu.git] / 8_benchs / src / fibmem.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         ;   erg = list[n] = fib(n-1) + (n-2)
20         ;   return erg
21         ; }
22 fibcall:
23         lls r1, r1, 2 ; *4
24 fibmem:
25         add r2, r10, r1
26         ldw r0, 0(r2)
27         cmpi r0, 0
28         retnz-
29         push r2 ; addr pushen
30         push r1 ; param pushen
31         subi r1, r1, 4
32         call+ fibmem
33         pop r1 ; param poppen
34         push r0 ; zwischenerg pushen
35         subi r1, r1, 8
36         call+ fibmem
37         pop r2 ; zwischenerg poppen
38         add r0, r2, r0
39         pop r2 ; addr poppen
40         stw r0, 0(r2) ; ergebnis speichern
41         ret+