c39a84797904649acec73f7228215012f63e54c7
[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         ret+;
65
66 ;case *
67 ;42
68 vm_mul:
69         ;decrement sp
70         subi r3, r3, 4
71         ;load sp
72         ldw r6, 0(r3)
73         ;load sp-1
74         ldw r7, 0-4(r3)
75
76         ;return init
77         ldis r8, 0  
78         ;save of sp-1
79         mov r0, r7
80         ;check if sp-1 is even or odd
81         andx r0, 1
82         ;add sp to result
83         adddnz r8, r8, r6
84         ;if odd decrement sp-1
85         subinz r7, r7, 1
86         ;just to get zero flag unset
87         addizs r7, r7, 0
88 loop:
89         ;if last was not zero
90         ;add to sp-1 to result
91         adddnz r8, r8, r6
92         adddnz r8, r8, r6
93         ;decrement sp-1 by 2
94         subi r7, r7, 2
95         ;jump if not zero
96         brnz+ loop
97         ;save result
98         stw r8, 0-4(r3)
99         br+ vm_loop
100
101 ;case +
102 ;43
103 vm_add:
104         ;decrement sp
105         subi r3, r3, 4
106         ;load sp
107         ldw r6, 0(r3)
108         ;load sp-1
109         ldw r7, 0-4(r3)
110         ;sp-1 = sp-1 + sp
111         add r7, r7, r6
112         ;store sp-1
113         stw r7, 0-4(r3)
114         br+ vm_loop
115
116 ;case -
117 ;45
118 vm_sub:
119         ;decrement sp
120         subi r3, r3, 4
121         ;load sp
122         ldw r6, 0(r3)
123         ;load sp-1
124         ldw r7, 0-4(r3)
125         ;sp-1 = sp-1 - sp
126         sub r7, r7, r6
127         ;store sp-1
128         stw r7, 0-4(r3)
129         br+ vm_loop
130
131 ;case 0 1 2 3 4 5 6 7 8 9
132 ;48-57
133 vm_consts:
134         ;input minus offset
135         subi r6, r5, 48
136         ;store onto stack
137         stw r6, 0(r3)
138         ;increment stack addr
139         addi r3, r3, 4
140         br+ vm_loop
141
142 ;case <
143 ;60
144 vm_lessthan:
145         ;decrement sp
146         subi r3, r3, 4
147         ;load sp
148         ldw r6, 0(r3)
149         ;load sp-1
150         ldw r7, 0-4(r3)
151         ;load r8 with 0
152         ldi r8, 0
153         ;compare sp-1 with sp
154         cmp r7, r6
155         ;set r8 to -1 if less than
156         ldilt r8, 1
157         ;store r8 to sp-1
158         stw r8, 0-4(r3)
159         br+ vm_loop
160
161 ;case D
162 ;68
163 vm_dup:
164         ;load sp-1
165         ldw r6, 0-4(r3)
166         ;store to sp
167         stw r6, 0(r3)
168         ;increment stack addr
169         addi r3, r3, 4
170         br+ vm_loop
171
172 ;case I
173 ;73
174 vm_imm:
175         ;load new high byte
176         ldb r6, 4(r1)
177         ;shift high byte
178         lls r6, r6, 8
179         ;load 2nd byte
180         ldb r7, 3(r1)
181         ;add to high byte
182         add r6, r6, r7
183         ;shift
184         lls r6, r6, 8
185         ;load
186         ldb r7, 2(r1)
187         ;add
188         add r6, r6, r7
189         ;shift
190         lls r6, r6, 8
191         ;load
192         ldb r7, 1(r1)
193         ;add
194         add r6, r6, r7
195         ;store result to stack
196         stw r6, 0(r3)
197         ;pc+4
198         addi r1, r1, 4
199         ;increment sp
200         addi r3, r3, 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 r1, r1, 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(r1)
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 r1, r1, 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