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