s3e: fix build break
[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         ;update counter for aligned access
25         lls r1, r1, 2 ; *4
26         ;calculate adress of top element
27         add r2, r10, r1
28 fibmem:
29         ;load top element
30         ldw r0, 0(r2)
31         ;compare if set
32         cmpi r0, 0
33         ;return if set
34         retnz-
35         ;decrement adress for next lopp
36         subi r2, r2, 4
37         ;iterative call for n-1 element
38         call+ fibmem
39         ;load n-2 element
40         ldw r3, 0-4(r2)
41         ;add n-1 and n-2 element
42         add r0, r3, r0
43         ;increment address for n element
44         ;is needed because after return
45         ;we need r2 to be set to the address
46         ;of element n
47         addi r2, r2, 4
48         ;store fib n
49         stw r0, 0(r2)
50         ret+