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