boppi/doc/successor.iloc.txt

130 lines
9.5 KiB
Plaintext
Raw Normal View History

2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
268 ardd8: nop // AR decRef
269 loadAI r_arp,-12 => r_1 // call successor - load result
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
275 nnul10: nop // remove reference
276 loadI 280 => r_2 // free
277 push r_2 // free
278 push r_3 // free
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
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
2018-02-18 18:15:37 +00:00
297 push r_arp // free
298 jumpI -> memfree // free