s3e: fix build break
[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 ... address to input, every byte is a new input
38         ;       includes pc implicitly
39         ;r3 ... effective stack address
40         ;r5 ... input
41
42         ;decrement address to input by 1
43         subi r1, r1, 1
44         ;load base address of stack
45         ldil r3, stack@lo
46         ldih r3, stack@hi
47
48 vm_default:     
49 vm_loop:
50         ;increment input address
51         addi r1, r1, 1
52         ;load input
53         ldb r5, 0(r1)
54         ;we need to multiply input by 4 to get correct address offset
55         lls r0, r5, 2
56         ;calc position in jumptable
57         ldw r0, jumptable(r0)
58         ;jump to instr
59         brr r0
60
61 vm_eof:
62         ;load stack[sp-1]
63         ;ldw r0, 0-4(r3);
64         pop r0
65         ret+;
66
67 ;case *
68 ;42
69 vm_mul:
70         ;decrement sp
71         ;subi r3, r3, 4
72         ;load sp
73         ;ldw r6, 0(r3)
74         pop r6
75         ;load sp-1
76         ;ldw r7, 0-4(r3)
77         pop r7
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         push r8
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         pop r6
113         ;load sp-1
114         ;ldw r7, 0-4(r3)
115         pop r7
116         ;sp-1 = sp-1 + sp
117         add r7, r7, r6
118         ;store sp-1
119         ;stw r7, 0-4(r3)
120         push r7
121         br+ vm_loop
122
123 ;case -
124 ;45
125 vm_sub:
126         ;decrement sp
127         ;subi r3, r3, 4
128         ;load sp
129         ;ldw r6, 0(r3)
130         pop r6
131         ;load sp-1
132         ;ldw r7, 0-4(r3)
133         pop r7
134         ;sp-1 = sp-1 - sp
135         sub r7, r7, r6
136         ;store sp-1
137         ;stw r7, 0-4(r3)
138         push r7
139         br+ vm_loop
140
141 ;case 0 1 2 3 4 5 6 7 8 9
142 ;48-57
143 vm_consts:
144         ;input minus offset
145         subi r6, r5, 48
146         ;store onto stack
147         ;stw r6, 0(r3)
148         push r6
149         ;increment stack addr
150         ;addi r3, r3, 4
151         br+ vm_loop
152
153 ;case <
154 ;60
155 vm_lessthan:
156         ;decrement sp
157         ;subi r3, r3, 4
158         ;load sp
159         ;ldw r6, 0(r3)
160         pop r6
161         ;load sp-1
162         ;ldw r7, 0-4(r3)
163         pop r7
164         ;load r8 with 0
165         ldis r8, 0
166         ;compare sp-1 with sp
167         cmp r7, r6
168         ;set r8 to -1 if less than
169         ldislt r8, 0xFF
170         ;store r8 to sp-1
171         ;stw r8, 0-4(r3)
172         push r8
173         br+ vm_loop
174
175 ;case D
176 ;68
177 vm_dup:
178         ;load sp-1
179         ;ldw r6, 0-4(r3)
180         fetch r6
181         ;store to sp
182         ;stw r6, 0(r3)
183         push r6
184         ;increment stack addr
185         ;addi r3, r3, 4
186         br+ vm_loop
187
188 ;case I
189 ;73
190 vm_imm:
191         ;load new high byte
192         ldb r6, 4(r1)
193         ;shift high byte
194         lls r6, r6, 8
195         ;load 2nd byte
196         ldb r7, 3(r1)
197         ;add to high byte
198         add r6, r6, r7
199         ;shift
200         lls r6, r6, 8
201         ;load
202         ldb r7, 2(r1)
203         ;add
204         add r6, r6, r7
205         ;shift
206         lls r6, r6, 8
207         ;load
208         ldb r7, 1(r1)
209         ;add
210         add r6, r6, r7
211         ;store result to stack
212         ;stw r6, 0(r3)
213         push r6
214         ;pc+4
215         addi r1, r1, 4
216         ;increment sp
217         ;addi r3, r3, 4
218         br+ vm_loop
219
220 ;case J
221 ;74
222 vm_jmp:
223         ;decrement sp
224         ;subi r3, r3, 4
225         ;load sp
226         ;ldw r6, 0(r3)
227         pop r6
228         ;compare to 0
229         cmpi r6,0
230         ;increment pc if == 0
231         addideq r1, r1, 1
232         breq+ vm_loop
233         ;if != 0
234         ;set r6 to 0 (to clear upper bytes)
235         ldis r6, 0
236         ;load pc+1 input
237         ldb r6, 1(r1)
238         ;compare input with neg. max of 8 bit
239         cmpi r6, 0x80
240         brlt- vm_possign
241         ldis r7, 0xFF00
242         add r6, r6, r7
243 vm_possign:
244         ;pc += data
245         add r1, r1, r6
246         br+ vm_loop
247
248 ;case P
249 ;80
250 vm_pop:
251         ;decrement stack addr
252         ;subi r3, r3, 4
253         disc r0
254         br+ vm_loop
255
256 ;case X
257 ;88
258 vm_xch:
259         ;load sp-1
260         ;ldw r6, 0-4(r3)
261         pop r6
262         ;load sp-2
263         ;ldw r7, 0-8(r3)
264         pop r7
265         ;store sp-1 to sp-2
266         ;stw r6, 0-8(r3)
267         push r6
268         ;store sp-2 to sp-1
269         ;stw r7, 0-4(r3)
270         push r7
271         br+ vm_loop
272
273 ;case ~
274 ;126
275 vm_not:
276         ;ldw r6, 0-4(r3)
277         pop r6
278         not r6
279         ;stw r6, 0-4(r3)
280         push r6
281         br+ vm_loop
282
283 .data
284 jumptable:
285 ;0
286 .fill 1, vm_eof
287 .fill 41, vm_default
288 ;42
289 .fill 1, vm_mul
290 ;43
291 .fill 1, vm_add
292 ;44
293 .fill 1, vm_default
294 ;45
295 .fill 1, vm_sub
296 ;46-47
297 .fill 2, vm_default
298 ;48-57
299 .fill 10, vm_consts
300 ;58-59
301 .fill 2, vm_default
302 ;60
303 .fill 1, vm_lessthan
304 ;61-67
305 .fill 7, vm_default
306 ;68
307 .fill 1, vm_dup
308 ;69-72
309 .fill 4, vm_default
310 ;73
311 .fill 1, vm_imm
312 ;74
313 .fill 1, vm_jmp
314 ;75-79
315 .fill 5, vm_default
316 ;80
317 .fill 1, vm_pop
318 ;81-87
319 .fill 7, vm_default
320 ;88
321 .fill 1, vm_xch
322 ;89-125
323 .fill 37, vm_default
324 ;126
325 .fill 1, vm_not
326 ;127-255
327 .fill 129, vm_default