784dc93cdc101d6d6243221833e00b25b55788d4
[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         br+ vm_loop
108
109 ;case +
110 ;43
111 vm_add:
112         ;decrement sp
113         subi r3, r3, 4
114         ;load sp
115         ldw r6, 0(r3)
116         ;load sp-1
117         ldw r7, 0-4(r3)
118         ;sp-1 = sp-1 + sp
119         add r7, r7, r6
120         ;store sp-1
121         stw r7, 0-4(r3)
122         br+ vm_loop
123
124 ;case -
125 ;45
126 vm_sub:
127         ;decrement sp
128         subi r3, r3, 4
129         ;load sp
130         ldw r6, 0(r3)
131         ;load sp-1
132         ldw r7, 0-4(r3)
133         ;sp-1 = sp-1 - sp
134         sub r7, r7, r6
135         ;store sp-1
136         stw r7, 0-4(r3)
137         br+ vm_loop
138
139 ;case 0 1 2 3 4 5 6 7 8 9
140 ;48-57
141 vm_consts:
142         ;input minus offset
143         subi r6, r5, 48
144         ;store onto stack
145         stw r6, 0(r3)
146         ;increment stack addr
147         addi r3, r3, 4
148         br+ vm_loop
149
150 ;case <
151 ;60
152 vm_lessthan:
153         ;decrement sp
154         subi r3, r3, 4
155         ;load sp
156         ldw r6, 0(r3)
157         ;load sp-1
158         ldw r7, 0-4(r3)
159         ;load r8 with 0
160         ldi r8, 0
161         ;compare sp-1 with sp
162         cmp r7, r6
163         ;set r8 to -1 if less than
164         ldilt r8, 1
165         ;store r8 to sp-1
166         stw r8, 0-4(r3)
167         br+ vm_loop
168         
169
170 ;case D
171 ;68
172 vm_dup:
173         ;load sp-1
174         ldw r6, 0-4(r3)
175         ;store to sp
176         stw r6, 0(r3)
177         ;increment stack addr
178         addi r3, r3, 4
179         br+ vm_loop
180
181 ;case I
182 ;73
183 vm_imm:
184         ;load new high byte
185         ldb r6, 4(pc)
186         ;shift high byte
187         lls r6, r6, 8
188         ;load 2nd byte
189         ldb r7, 3(pc)
190         ;add to high byte
191         add r6, r6, r7
192         ;shift
193         lls r6, r6, 8
194         ;load
195         ldb r7, 2(pc)
196         ;add
197         add r6, r6, r7
198         ;shift
199         lls r6, r6, 8
200         ;load
201         ldb r7, 1(pc)
202         ;add
203         add r6, r6, r7
204         ;store result to stack
205         stw r6, 0(r3)
206         ;pc+4
207         addi r2, r2, 4
208         br+ vm_loop
209
210 ;case J
211 ;74
212 vm_jmp:
213         ;decrement sp
214         sub r3, r3, 4
215         ;load sp
216         ldw r6, 0(r3)
217         ;compare to 0
218         cmpi r6,0
219         ;increment pc if == 0
220         addieqD r2, r2, 4
221         brnq+ vm_loop
222         ;if != 0
223         ;load pc+1 input
224         ldb r6, 1(r4)
225         ;pc += data
226         add r2, r2, r6
227         br+ vm_loop
228
229 ;case P
230 ;80
231 vm_pop:
232         ;decrement stack addr
233         subi r3, r3, 4
234         br+ vm_loop
235
236 ;case X
237 ;88
238 vm_xch:
239         ;load sp-1
240         ldw r6, 0-4(r3)
241         ;load sp-2
242         ldw r7, 0-8(r3)
243         ;store sp-1 to sp-2
244         stw r6, 0-8(r3)
245         ;store sp-2 to sp-1
246         stw r7, 0-4(r3)
247         br+ vm_loop
248
249 ;case ~
250 ;126
251 vm_not:
252         ldw r6, 0-4(r3)
253         not r6
254         stw r6, 0-4(r3)
255         br+ vm_loop