[bench] vm: bug fix
[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(r2)
179         ;shift high byte
180         lls r6, r6, 8
181         ;load 2nd byte
182         ldb r7, 3(r2)
183         ;add to high byte
184         add r6, r6, r7
185         ;shift
186         lls r6, r6, 8
187         ;load
188         ldb r7, 2(r2)
189         ;add
190         add r6, r6, r7
191         ;shift
192         lls r6, r6, 8
193         ;load
194         ldb r7, 1(r2)
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         br+ vm_loop
202
203 ;case J
204 ;74
205 vm_jmp:
206         ;decrement sp
207         subi r3, r3, 4
208         ;load sp
209         ldw r6, 0(r3)
210         ;compare to 0
211         cmpi r6,0
212         ;increment pc if == 0
213         addideq r2, r2, 1
214         breq+ vm_loop
215         ;if != 0
216         ;set r6 to 0 (to clear upper bytes)
217         ldis r6, 0
218         ;load pc+1 input
219         ldb r6, 1(r4)
220         ;compare input with neg. max of 8 bit
221         cmpi r6, 0x80
222         brlt- vm_possign
223         ldis r7, 0xFF00
224         add r6, r6, r7
225 vm_possign:
226         ;pc += data
227         add r2, r2, r6
228         br+ vm_loop
229
230 ;case P
231 ;80
232 vm_pop:
233         ;decrement stack addr
234         subi r3, r3, 4
235         br+ vm_loop
236
237 ;case X
238 ;88
239 vm_xch:
240         ;load sp-1
241         ldw r6, 0-4(r3)
242         ;load sp-2
243         ldw r7, 0-8(r3)
244         ;store sp-1 to sp-2
245         stw r6, 0-8(r3)
246         ;store sp-2 to sp-1
247         stw r7, 0-4(r3)
248         br+ vm_loop
249
250 ;case ~
251 ;126
252 vm_not:
253         ldw r6, 0-4(r3)
254         not r6
255         stw r6, 0-4(r3)
256         br+ vm_loop
257
258 .data
259 jumptable:
260 ;0
261 .fill 1, vm_eof
262 .fill 41, vm_default
263 ;42
264 .fill 1, vm_mul
265 ;43
266 .fill 1, vm_add
267 ;44
268 .fill 1, vm_default
269 ;45
270 .fill 1, vm_sub
271 ;46-47
272 .fill 2, vm_default
273 ;48-57
274 .fill 10, vm_consts
275 ;58-59
276 .fill 2, vm_default
277 ;60
278 .fill 1, vm_lessthan
279 ;61-67
280 .fill 7, vm_default
281 ;68
282 .fill 1, vm_dup
283 ;69-72
284 .fill 4, vm_default
285 ;73
286 .fill 1, vm_imm
287 ;74
288 .fill 1, vm_jmp
289 ;75-79
290 .fill 5, vm_default
291 ;80
292 .fill 1, vm_pop
293 ;81-87
294 .fill 7, vm_default
295 ;88
296 .fill 1, vm_xch
297 ;89-125
298 .fill 37, vm_default
299 ;126
300 .fill 1, vm_not
301 ;127-255
302 .fill 129, vm_default