130 lines
9.5 KiB
Plaintext
130 lines
9.5 KiB
Plaintext
170 loadI 0 => r_nul // initialise zero register
|
|
171 loadI 176 => r_arp // malloc
|
|
172 push r_arp // malloc
|
|
173 loadI 24 => r_arp // malloc
|
|
174 push r_arp // malloc
|
|
175 jumpI -> memalloc // malloc
|
|
176 pop => r_arp // malloc
|
|
177 addI r_arp,16 => r_arp // construct main AR
|
|
178 jumpI -> s0 // define successor - jump over body
|
|
179 nop // define successor - entry point
|
|
180 addI r_arp,0 => r_1 // add offset
|
|
181 load r_1 => r_1 // load address
|
|
182 loadI 1 => r_2 // 1
|
|
183 add r_1,r_2 => r_1 // +
|
|
184 storeAI r_1 => r_arp,-12 // define successor - move result
|
|
185 loadAI r_arp,-8 => r_2 // load ref count
|
|
186 loadI 1 => r_1 // one
|
|
187 cmp_LE r_2,r_1 => r_2 // check more than one ref
|
|
188 cbr r_2 -> ycl1,ncl2 // remove vars if last reference
|
|
189 ycl1: nop // cleanup target
|
|
190 ncl2: nop // no cleanup target
|
|
191 loadAI r_arp,-8 => r_1 // define successor - load return address
|
|
192 jump -> r_1 // define successor - go to return address
|
|
193 s0: nop // define successor - skip target
|
|
194 loadI 199 => r_1 // malloc
|
|
195 push r_1 // malloc
|
|
196 loadI 12 => r_1 // malloc
|
|
197 push r_1 // malloc
|
|
198 jumpI -> memalloc // malloc
|
|
199 pop => r_1 // malloc
|
|
200 loadI 179 => r_2 // define successor - load target address
|
|
201 storeAI r_2 => r_1,0 // define successor - set target address
|
|
202 storeAI r_arp => r_1,4 // define successor - copy ARP
|
|
203 loadI 20 => r_2 // define successor - load AR size
|
|
204 storeAI r_2 => r_1,8 // define successor - set AR size
|
|
205 storeAI r_1 => r_arp,0 // define successor - set function reference
|
|
206 i2i r_arp => ART // AR incRef
|
|
207 cmp_NE ART,r_nul => r_1 // AR incRef
|
|
208 cbr r_1 -> aril3,arid4 // AR incRef
|
|
209 aril3: loadI 214 => r_1 // AR incRef
|
|
210 push r_1 // AR incRef
|
|
211 subI ART,16 => r_1 // AR incRef
|
|
212 push r_1 // AR incRef
|
|
213 jumpI -> memaddref // AR incRef
|
|
214 loadAI ART,-16 => ART // AR incRef
|
|
215 cmp_NE ART,r_nul => r_1 // AR incRef
|
|
216 cbr r_1 -> aril3,arid4 // AR incRef
|
|
217 arid4: nop // AR incRef
|
|
218 addI r_arp,4 => r_1 // add offset
|
|
219 in "" => r_1 //
|
|
220 addI r_arp,4 => r_2 // add offset
|
|
221 store r_1 => r_2 // save to var x
|
|
222 addI r_arp,0 => r_3 // add offset
|
|
223 load r_3 => r_2 // call successor - load function reference
|
|
224 loadAI r_2,8 => r_2 // call successor - load AR size
|
|
225 loadI 229 => r_1 // malloc
|
|
226 push r_1 // malloc
|
|
227 push r_2 // malloc
|
|
228 jumpI -> memalloc // malloc
|
|
229 pop => r_1 // malloc
|
|
230 addI r_1,16 => r_1 // call successor - shift AR
|
|
231 addI r_arp,4 => r_2 // add offset
|
|
232 load r_2 => r_2 // load address
|
|
233 storeAI r_2 => r_1,0 // call successor - store param 0
|
|
234 addI r_arp,0 => r_4 // add offset
|
|
235 load r_4 => r_2 // call successor - load function reference
|
|
236 storeAI r_arp => r_1,-4 // call successor - link caller ARP
|
|
237 loadAI r_2,4 => r_3 // call successor - load AL
|
|
238 storeAI r_3 => r_1,-16 // call successor - link AL
|
|
239 loadAI r_1,-16 => ART // add ref for callee's AL
|
|
240 i2i ART => ART // AR incRef
|
|
241 cmp_NE ART,r_nul => r_3 // AR incRef
|
|
242 cbr r_3 -> aril5,arid6 // AR incRef
|
|
243 aril5: loadI 248 => r_3 // AR incRef
|
|
244 push r_3 // AR incRef
|
|
245 subI ART,16 => r_3 // AR incRef
|
|
246 push r_3 // AR incRef
|
|
247 jumpI -> memaddref // AR incRef
|
|
248 loadAI ART,-16 => ART // AR incRef
|
|
249 cmp_NE ART,r_nul => r_3 // AR incRef
|
|
250 cbr r_3 -> aril5,arid6 // AR incRef
|
|
251 arid6: nop // AR incRef
|
|
252 loadI 257 => r_3 // call successor - load return address
|
|
253 storeAI r_3 => r_1,-8 // call successor - set return address
|
|
254 i2i r_1 => r_arp // call successor - move ARP
|
|
255 loadAI r_2,0 => r_3 // call successor - load target address
|
|
256 jump -> r_3 // call successor - execute
|
|
257 i2i r_arp => ART // AR decRef
|
|
258 cmp_NE ART,r_nul => r_2 // AR decRef
|
|
259 cbr r_2 -> ardl7,ardd8 // AR decRef
|
|
260 ardl7: loadI 265 => r_2 // AR decRef
|
|
261 push r_2 // AR decRef
|
|
262 subI ART,16 => r_2 // AR decRef
|
|
263 push r_2 // AR decRef
|
|
264 jumpI -> memfree // AR decRef
|
|
265 loadAI ART,-16 => ART // AR decRef
|
|
266 cmp_NE ART,r_nul => r_2 // AR decRef
|
|
267 cbr r_2 -> ardl7,ardd8 // AR decRef
|
|
268 ardd8: nop // AR decRef
|
|
269 loadAI r_arp,-12 => r_1 // call successor - load result
|
|
270 loadAI r_arp,-4 => r_arp // call successor - reset ARP
|
|
271 out "",r_1 //
|
|
272 loadAI r_arp,0 => r_3 // remove reference get var
|
|
273 cmp_EQ r_3,r_nul => r_2 // remove reference
|
|
274 cbr r_2 -> ynul9,nnul10 // remove reference
|
|
275 nnul10: nop // remove reference
|
|
276 loadI 280 => r_2 // free
|
|
277 push r_2 // free
|
|
278 push r_3 // free
|
|
279 jumpI -> memfree // free
|
|
280 loadAI r_3,4 => r_3 // remove reference
|
|
281 i2i r_3 => ART // AR decRef
|
|
282 cmp_NE ART,r_nul => r_2 // AR decRef
|
|
283 cbr r_2 -> ardl11,ardd12 // AR decRef
|
|
284 ardl11: loadI 289 => r_2 // AR decRef
|
|
285 push r_2 // AR decRef
|
|
286 subI ART,16 => r_2 // AR decRef
|
|
287 push r_2 // AR decRef
|
|
288 jumpI -> memfree // AR decRef
|
|
289 loadAI ART,-16 => ART // AR decRef
|
|
290 cmp_NE ART,r_nul => r_2 // AR decRef
|
|
291 cbr r_2 -> ardl11,ardd12 // AR decRef
|
|
292 ardd12: nop // AR decRef
|
|
293 ynul9: nop // remove reference
|
|
294 subI r_arp,16 => r_arp // deconstruct main AR
|
|
295 loadI 299 => r_3 // free
|
|
296 push r_3 // free
|
|
297 push r_arp // free
|
|
298 jumpI -> memfree // free
|