[bench] fix bug in mul
[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         ;save of sp-1
117         mov r7, r0
118         ;check if sp-1 is even or odd
119         andx r0, 1
120         ;add sp to result
121         adddnz r8, r8, r6
122         ;if odd decrement sp-1
123         subinz r7, r7, 1
124         ;just to get zero flag unset
125         addizs r7, r7, 0
126 loop:
127         ;if last was not zero
128         ;add to sp-1 to result
129         adddnz r8, r8, r6
130         adddnz r8, r8, r6
131         ;decrement sp-1 by 2
132         subi r7, r7, 2
133         ;jump if not zero
134         brnz+ loop
135         ;save result
136         stw r8, 0-4(r3)
137         br+ vm_loop
138
139 ;case +
140 ;43
141 vm_add:
142         ;decrement sp
143         subi r3, r3, 4
144         ;load sp
145         ldw r6, 0(r3)
146         ;load sp-1
147         ldw r7, 0-4(r3)
148         ;sp-1 = sp-1 + sp
149         add r7, r7, r6
150         ;store sp-1
151         stw r7, 0-4(r3)
152         br+ vm_loop
153
154 ;case -
155 ;45
156 vm_sub:
157         ;decrement sp
158         subi r3, r3, 4
159         ;load sp
160         ldw r6, 0(r3)
161         ;load sp-1
162         ldw r7, 0-4(r3)
163         ;sp-1 = sp-1 - sp
164         sub r7, r7, r6
165         ;store sp-1
166         stw r7, 0-4(r3)
167         br+ vm_loop
168
169 ;case 0 1 2 3 4 5 6 7 8 9
170 ;48-57
171 vm_consts:
172         ;input minus offset
173         subi r6, r5, 48
174         ;store onto stack
175         stw r6, 0(r3)
176         ;increment stack addr
177         addi r3, r3, 4
178         br+ vm_loop
179
180 ;case <
181 ;60
182 vm_lessthan:
183         ;decrement sp
184         subi r3, r3, 4
185         ;load sp
186         ldw r6, 0(r3)
187         ;load sp-1
188         ldw r7, 0-4(r3)
189         ;load r8 with 0
190         ldi r8, 0
191         ;compare sp-1 with sp
192         cmp r7, r6
193         ;set r8 to -1 if less than
194         ldilt r8, 1
195         ;store r8 to sp-1
196         stw r8, 0-4(r3)
197         br+ vm_loop
198         
199
200 ;case D
201 ;68
202 vm_dup:
203         ;load sp-1
204         ldw r6, 0-4(r3)
205         ;store to sp
206         stw r6, 0(r3)
207         ;increment stack addr
208         addi r3, r3, 4
209         br+ vm_loop
210
211 ;case I
212 ;73
213 vm_imm:
214         ;load new high byte
215         ldb r6, 4(pc)
216         ;shift high byte
217         lls r6, r6, 8
218         ;load 2nd byte
219         ldb r7, 3(pc)
220         ;add to high byte
221         add r6, r6, r7
222         ;shift
223         lls r6, r6, 8
224         ;load
225         ldb r7, 2(pc)
226         ;add
227         add r6, r6, r7
228         ;shift
229         lls r6, r6, 8
230         ;load
231         ldb r7, 1(pc)
232         ;add
233         add r6, r6, r7
234         ;store result to stack
235         stw r6, 0(r3)
236         ;pc+4
237         addi r2, r2, 4
238         br+ vm_loop
239
240 ;case J
241 ;74
242 vm_jmp:
243         ;decrement sp
244         sub r3, r3, 4
245         ;load sp
246         ldw r6, 0(r3)
247         ;compare to 0
248         cmpi r6,0
249         ;increment pc if == 0
250         addieqD r2, r2, 4
251         brnq+ vm_loop
252         ;if != 0
253         ;load pc+1 input
254         ldb r6, 1(r4)
255         ;pc += data
256         add r2, r2, r6
257         br+ vm_loop
258
259 ;case P
260 ;80
261 vm_pop:
262         ;decrement stack addr
263         subi r3, r3, 4
264         br+ vm_loop
265
266 ;case X
267 ;88
268 vm_xch:
269         ;load sp-1
270         ldw r6, 0-4(r3)
271         ;load sp-2
272         ldw r7, 0-8(r3)
273         ;store sp-1 to sp-2
274         stw r6, 0-8(r3)
275         ;store sp-2 to sp-1
276         stw r7, 0-4(r3)
277         br+ vm_loop
278
279 ;case ~
280 ;126
281 vm_not:
282         ldw r6, 0-4(r3)
283         not r6
284         stw r6, 0-4(r3)
285         br+ vm_loop