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