[bench] vm: made loading of address correct
[calu.git] / 8_benchs / src / vm.s
1 .data
2 .org 0x10
3 inputdata:
4 ;8 * 8 4
5 .fill 1, 0x382A3834
6 ;1 X * 8
7 .fill 1, 0x31582A38
8 ;+ D X -
9 .fill 1, 0x2B44582D
10 ;P \xF8 J D
11 .fill 1, 0x50F84A44
12 ;+ * 8 6
13 .fill 1, 0x2B2A3836
14 ;\000 \020 I D
15 .fill 1, 0x00204944
16 ;~ < \000 \000
17 .fill 1, 0x7E3C0000
18 ;8 P \005 J
19 .fill 1, 0x3850054A
20 ;* 8
21 .fill 1, 0x2A38
22
23 stack:
24 .fill 256, 0
25
26 .text
27 main:
28         ;set address of input
29         ldil r1, inputdata@lo
30         ldih r1, inputdata@hi
31
32         call+ vm
33         br+ main
34
35 vm:
36         ;r0 ... lut address (can be overwritten)
37         ;r1 ... addr to input
38         ;r2 ... pc
39         ;r3 ... effective stack address
40         ;r4 ... effective input addr
41         ;r5 ... input
42
43         ;set pc to -1
44         ldis r2, 0xFFFF
45         ;load base address of stack
46         ldil r3, stack@lo
47         ldih r3, stack@hi
48
49 vm_default:     
50 vm_loop:
51         ;increment pc
52         addi r2, r2, 1
53         ;generate effective input addr
54         add r4, r1, r2
55         ;load input
56         ldb r5, 0(r4)
57         ;we need to multiply input by 4 to get correct address offset
58         lls r0, r5, 2
59         ;calc position in jumptable
60         ldw r0, jumptable(r0)
61         ;jump to instr
62         brr r0
63
64 vm_eof:
65         ;load stack[sp-1]
66         ldw r0, 0-4(r3);
67         ret+;
68
69 ;case *
70 ;42
71 vm_mul:
72         ;decrement sp
73         subi r3, r3, 4
74         ;load sp
75         ldw r6, 0(r3)
76         ;load sp-1
77         ldw r7, 0-4(r3)
78
79         ;return init
80         ldis r8, 0  
81         ;save of sp-1
82         mov r0, r7
83         ;check if sp-1 is even or odd
84         andx r0, 1
85         ;add sp to result
86         adddnz r8, r8, r6
87         ;if odd decrement sp-1
88         subinz r7, r7, 1
89         ;just to get zero flag unset
90         addizs r7, r7, 0
91 loop:
92         ;if last was not zero
93         ;add to sp-1 to result
94         adddnz r8, r8, r6
95         adddnz r8, r8, r6
96         ;decrement sp-1 by 2
97         subi r7, r7, 2
98         ;jump if not zero
99         brnz+ loop
100         ;save result
101         stw r8, 0-4(r3)
102         br+ vm_loop
103
104 ;case +
105 ;43
106 vm_add:
107         ;decrement sp
108         subi r3, r3, 4
109         ;load sp
110         ldw r6, 0(r3)
111         ;load sp-1
112         ldw r7, 0-4(r3)
113         ;sp-1 = sp-1 + sp
114         add r7, r7, r6
115         ;store sp-1
116         stw r7, 0-4(r3)
117         br+ vm_loop
118
119 ;case -
120 ;45
121 vm_sub:
122         ;decrement sp
123         subi r3, r3, 4
124         ;load sp
125         ldw r6, 0(r3)
126         ;load sp-1
127         ldw r7, 0-4(r3)
128         ;sp-1 = sp-1 - sp
129         sub r7, r7, r6
130         ;store sp-1
131         stw r7, 0-4(r3)
132         br+ vm_loop
133
134 ;case 0 1 2 3 4 5 6 7 8 9
135 ;48-57
136 vm_consts:
137         ;input minus offset
138         subi r6, r5, 48
139         ;store onto stack
140         stw r6, 0(r3)
141         ;increment stack addr
142         addi r3, r3, 4
143         br+ vm_loop
144
145 ;case <
146 ;60
147 vm_lessthan:
148         ;decrement sp
149         subi r3, r3, 4
150         ;load sp
151         ldw r6, 0(r3)
152         ;load sp-1
153         ldw r7, 0-4(r3)
154         ;load r8 with 0
155         ldi r8, 0
156         ;compare sp-1 with sp
157         cmp r7, r6
158         ;set r8 to -1 if less than
159         ldilt r8, 1
160         ;store r8 to sp-1
161         stw r8, 0-4(r3)
162         br+ vm_loop
163
164 ;case D
165 ;68
166 vm_dup:
167         ;load sp-1
168         ldw r6, 0-4(r3)
169         ;store to sp
170         stw r6, 0(r3)
171         ;increment stack addr
172         addi r3, r3, 4
173         br+ vm_loop
174
175 ;case I
176 ;73
177 vm_imm:
178         ;load new high byte
179         ldb r6, 4(r4)
180         ;shift high byte
181         lls r6, r6, 8
182         ;load 2nd byte
183         ldb r7, 3(r4)
184         ;add to high byte
185         add r6, r6, r7
186         ;shift
187         lls r6, r6, 8
188         ;load
189         ldb r7, 2(r4)
190         ;add
191         add r6, r6, r7
192         ;shift
193         lls r6, r6, 8
194         ;load
195         ldb r7, 1(r4)
196         ;add
197         add r6, r6, r7
198         ;store result to stack
199         stw r6, 0(r3)
200         ;pc+4
201         addi r2, r2, 4
202         ;increment sp
203         addi r3, r3, 4
204         br+ vm_loop
205
206 ;case J
207 ;74
208 vm_jmp:
209         ;decrement sp
210         subi r3, r3, 4
211         ;load sp
212         ldw r6, 0(r3)
213         ;compare to 0
214         cmpi r6,0
215         ;increment pc if == 0
216         addideq r2, r2, 1
217         breq+ vm_loop
218         ;if != 0
219         ;set r6 to 0 (to clear upper bytes)
220         ldis r6, 0
221         ;load pc+1 input
222         ldb r6, 1(r4)
223         ;compare input with neg. max of 8 bit
224         cmpi r6, 0x80
225         brlt- vm_possign
226         ldis r7, 0xFF00
227         add r6, r6, r7
228 vm_possign:
229         ;pc += data
230         add r2, r2, r6
231         br+ vm_loop
232
233 ;case P
234 ;80
235 vm_pop:
236         ;decrement stack addr
237         subi r3, r3, 4
238         br+ vm_loop
239
240 ;case X
241 ;88
242 vm_xch:
243         ;load sp-1
244         ldw r6, 0-4(r3)
245         ;load sp-2
246         ldw r7, 0-8(r3)
247         ;store sp-1 to sp-2
248         stw r6, 0-8(r3)
249         ;store sp-2 to sp-1
250         stw r7, 0-4(r3)
251         br+ vm_loop
252
253 ;case ~
254 ;126
255 vm_not:
256         ldw r6, 0-4(r3)
257         not r6
258         stw r6, 0-4(r3)
259         br+ vm_loop
260
261 .data
262 jumptable:
263 ;0
264 .fill 1, vm_eof
265 .fill 41, vm_default
266 ;42
267 .fill 1, vm_mul
268 ;43
269 .fill 1, vm_add
270 ;44
271 .fill 1, vm_default
272 ;45
273 .fill 1, vm_sub
274 ;46-47
275 .fill 2, vm_default
276 ;48-57
277 .fill 10, vm_consts
278 ;58-59
279 .fill 2, vm_default
280 ;60
281 .fill 1, vm_lessthan
282 ;61-67
283 .fill 7, vm_default
284 ;68
285 .fill 1, vm_dup
286 ;69-72
287 .fill 4, vm_default
288 ;73
289 .fill 1, vm_imm
290 ;74
291 .fill 1, vm_jmp
292 ;75-79
293 .fill 5, vm_default
294 ;80
295 .fill 1, vm_pop
296 ;81-87
297 .fill 7, vm_default
298 ;88
299 .fill 1, vm_xch
300 ;89-125
301 .fill 37, vm_default
302 ;126
303 .fill 1, vm_not
304 ;127-255
305 .fill 129, vm_default