1a433518c982b3ffc220f245704e69cc8191dfe6
[calu.git] / progs / sum.s
1 #include "dt_inc.s"
2 .data
3 .org 0x0
4 arr:
5         .fill 2
6         .fill 3
7         .fill 5
8         .fill 7
9         .fill 11
10         .fill 13
11         .fill 17
12         .fill 19
13         .fill 23
14         .fill 29
15         .fill 31
16         .fill 37
17         .fill 41
18         .fill 43
19         .fill 47
20         .fill 53
21 str:
22         .ascii "hier das ergebnis: "
23 .text
24 .org 0x0
25 start:
26         br+ main
27         br+ main
28         ret
29 main:
30         call+ u_init
31         call+ u_recv_byte
32         call u_send_newline
33
34         ; benchprolog
35         call t_init
36         call t_stop
37         ldis r1, 0
38         call t_valset
39         call t_start
40         ; /benchprolog
41
42         ; sum start
43         ldis r1, 16
44         ldis r2, arr@lo
45         ldih r2, arr@hi
46         call+ sum
47         ; sum ende
48
49         ; benchepilog
50         push r0
51         call+ t_init
52         call+ t_stop
53         call+ t_valget
54         subi r0, r0, 0xc ; offset abziehen
55         pop r3
56         push r0
57         push r3
58         ; /benchepilog
59
60         call u_init ; weil r10 ueberschrieben wird
61         ldis r1, str@lo
62         ldih r1, str@hi
63         ldis r2, 19
64         call u_send_string
65
66         pop r1
67         call+ u_send_uint
68         call u_send_newline
69         pop r1
70         call+ u_send_uint
71         call u_send_newline
72
73         br+ main
74
75 sum:
76         ;r1 = len
77         ;r2 = arr
78         ;r3 = i
79         ;r0 = sum
80         ;r4 arr data
81         ldis r0, 0
82         addi r3, r1, 0
83         retzs- ; check len != 0
84
85         andx r1, 0x3
86
87         cmpi r1, 0
88         breq+ go_loop
89
90         cmpi r1, 1
91         addideq r3, r3, 3
92         subideq r2, r2, 12
93         breq- loop1
94
95         cmpi r1, 2
96         addideq r3, r3, 2
97         subideq r2, r2, 8
98         breq- loop2
99
100         cmpi r1, 3
101         addideq r3, r3, 1
102         subideq r2, r2, 4
103         breq- loop3
104
105 go_loop:
106         addi r3, r3, 4
107 loop:
108         subi r3, r3, 4
109         retzs-
110         ldw r4, 0(r2)
111         add r0, r0, r4
112
113 loop3:
114         ldw r4, 4(r2)
115         add r0, r0, r4
116
117 loop2:
118         ldw r4, 8(r2)
119         add r0, r0, r4
120
121 loop1:
122         ldw r4, 12(r2)
123         add r0, r0, r4
124
125         addi r2, r2, 4*4
126         br+ loop