progs: added remaining benchmarks and offset correction for timer
[calu.git] / progs / fibmmem.s
1 #include "dt_inc.s"
2
3 .data
4 .org 0x0
5 list:
6         .fill 0x1 ;1. element = 1 ;0x10
7         .fill 0x1 ;2. element = 1 ;0x14
8         .fill 0x10, 0x0 ;nullen..
9 str:
10         .ascii "hier das ergebnis: "
11 .text
12 .org 0x0
13 start:
14         br+ main
15         br+ main
16         ret
17 main:
18         call+ u_init
19         call+ u_recv_byte
20         call u_send_newline
21
22         ; benchprolog
23         call t_init
24         call t_stop
25         ldis r1, 0
26         call t_valset
27         call t_start
28         ; /benchprolog
29
30         ; fib start
31         ldi r1, 9;
32         ldi r10, list@lo ; global pointer
33         ldih r10, list@hi
34         call+ fibcall;
35         ; fib ende
36
37         ; benchepilog
38         push r0
39         call+ t_init
40         call+ t_stop
41         call+ t_valget
42         subi r0, r0, 0xc ; offset abziehen
43         pop r3
44         push r0
45         push r3
46         ; /benchepilog
47
48         call u_init ; weil r10 ueberschrieben wird
49         ldis r1, str@lo
50         ldih r1, str@hi
51         ldis r2, 19
52         call u_send_string
53         
54         pop r1
55         call+ u_send_uint
56         call u_send_newline
57         pop r1
58         call+ u_send_uint
59         call u_send_newline
60
61 hang:
62         br hang
63
64         ; fib(n) {
65         ;   if (list[n] > 0) {
66         ;       return list[n]
67         ;   }
68         ;   a = fib(n-1)
69         ;   list[n] = a + list[n-2]
70         ;   return list[n]
71         ; }
72 fibcall:
73         ;update counter for aligned access
74         lls r1, r1, 2 ; *4
75         ;calculate adress of top element
76         add r2, r10, r1
77 fibmem:
78         ;load top element
79         ldw r0, 0(r2)
80         ;compare if set
81         cmpi r0, 0
82         ;return if set
83         retnz-
84         ;decrement adress for next lopp
85         subi r2, r2, 4
86         ;iterative call for n-1 element
87         call+ fibmem
88         ;load n-2 element
89         ldw r3, -4(r2)
90         ;add n-1 and n-2 element
91         add r0, r3, r0
92         ;increment address for n element
93         ;is needed because after return
94         ;we need r2 to be set to the address
95         ;of element n
96         addi r2, r2, 4
97         ;store fib n
98         stw r0, 0(r2)
99         ret+