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