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