766 lines
56 KiB
Plaintext
766 lines
56 KiB
Plaintext
|
000 // memlib - simple memory allocator for ILOC
|
||
|
001 //
|
||
|
002 // This library maintains a single-linked list (of monotonically increasing addresses) of free
|
||
|
003 // slots in memory and a reference count for occupied slots. Each slot contains a tuple `(next
|
||
|
004 // free slot address,size)` followed by `size` free bytes. The memory is initiliased with a
|
||
|
005 // pointer to the first free slot at `#fst_ptr` and one free slot at `#slot1` of size
|
||
|
006 // `brk-slot1-header`. When a piece of memory is requested for allocation, a tuple
|
||
|
007 // `(reference count, size)` followed by `size` bytes for the object is formed. The calling
|
||
|
008 // convention of the functions in this library consists of pushing the return address followed by
|
||
|
009 // any arguments (in order) to the stack. Any return values will be pushed to the stack likewise.
|
||
|
010 //
|
||
|
011 // Requires a register `brk` for the highest address available for heap allocation.
|
||
|
012 // Requires an instruction `halt` when memory runs out
|
||
|
013 //
|
||
|
014 // @author Frank Wibbelink
|
||
|
015 // initialise
|
||
|
016 memlib_: loadI 0 => m_0
|
||
|
017 loadI @slot1 => m_1
|
||
|
018 subI brk,@slot1 => m_2
|
||
|
019 subI m_2,@header => m_2
|
||
|
020 storeAI m_1 => m_0,@fst_ptr // pointer to first slot
|
||
|
021 storeAI m_0 => m_1,@off_next // next slot is null
|
||
|
022 storeAI m_2 => m_1,@off_size // first slot size
|
||
|
023 jumpI -> ememlib_
|
||
|
024 // allocate memory
|
||
|
025 // searches through the free slots for either a slot size of ~~exactly #4+8 or a size of~~ at
|
||
|
026 // least #4+16
|
||
|
027 // stack: [return address, object size] -> [object address]
|
||
|
028 memalloc: loadI 0 => m_0
|
||
|
029 pop => m_s // load size
|
||
|
030 loadI @fst_ptr => m_p // load previous address (base pointer)
|
||
|
031 loadAI m_p,@off_next => m_c // load current address (first slot)
|
||
|
032 ma_loop: cmp_EQ m_0,m_c => m_1 // check if address pointer is null
|
||
|
033 cbr m_1 -> ma_null,ma_cont // if null, go to end and return null pointer
|
||
|
034 ma_cont: loadAI m_c,@off_size => m_1 // load slot size
|
||
|
035 cmp_EQ m_1,m_s => m_2 // check if request fits exactly
|
||
|
036 cbr m_2 -> ma_yxct,ma_nxct
|
||
|
037 ma_nxct: subI m_1,@header => m_1 // subtract free slot size
|
||
|
038 cmp_GE m_1,m_s => m_1 // check if request fits
|
||
|
039 cbr m_1 -> ma_found,ma_next
|
||
|
040 ma_next: i2i m_c => m_p
|
||
|
041 loadAI m_p,@off_next => m_c
|
||
|
042 jumpI -> ma_loop
|
||
|
043 ma_yxct: loadAI m_c,@off_next => m_n // location of next free slot
|
||
|
044 jumpI -> ma_final
|
||
|
045 ma_found: addI m_s,@header => m_1
|
||
|
046 add m_1,m_c => m_n // location of new free slot
|
||
|
047 loadAI m_c,@off_size => m_1
|
||
|
048 subI m_1,@header => m_1
|
||
|
049 sub m_1,m_s => m_1 // size of new free slot
|
||
|
050 storeAI m_1 => m_n,@off_size
|
||
|
051 loadAI m_c,@off_next => m_1 // location of next free slot
|
||
|
052 storeAI m_1 => m_n,@off_next
|
||
|
053 ma_final: storeAI m_n => m_p,@off_next // link previous free slot to new
|
||
|
054 addI m_c,@header => m_c // move to object location
|
||
|
055 loadI 1 => m_1
|
||
|
056 storeAI m_1 => m_c,@off_oref // set reference count to 1
|
||
|
057 storeAI m_s => m_c,@off_osize // set object size
|
||
|
058 ma_null: pop => m_1 // load return address
|
||
|
059 push m_c // store object address
|
||
|
060 jump -> m_1
|
||
|
061 // increase reference count of object
|
||
|
062 // stack: [return address, object address] -> []
|
||
|
063 memaddref: loadI 0 => m_0
|
||
|
064 pop => m_n // load object address
|
||
|
065 cmp_EQ m_0,m_n => m_1
|
||
|
066 cbr m_1 -> mr_ynul,mr_nnul // check if null pointer
|
||
|
067 mr_ynul: haltI 1865445997
|
||
|
068 mr_nnul: loadAI m_n,@off_oref => m_1
|
||
|
069 addI m_1,1 => m_1
|
||
|
070 storeAI m_1 => m_n,@off_oref
|
||
|
071 pop => m_1 // load return address
|
||
|
072 jump -> m_1
|
||
|
073 // decrease reference count of object
|
||
|
074 // frees memory if count goes to zero
|
||
|
075 // stack: [return address, object address] -> []
|
||
|
076 memfree: loadI 0 => m_0
|
||
|
077 pop => m_n // load object address
|
||
|
078 cmp_EQ m_0,m_n => m_1
|
||
|
079 cbr m_1 -> mf_ynul,mf_nnul // check if null pointer
|
||
|
080 mf_ynul: haltI 1865442925
|
||
|
081 mf_nnul: loadAI m_n,@off_oref => m_1
|
||
|
082 subI m_1,1 => m_1
|
||
|
083 cmp_GT m_1,m_0 => m_2
|
||
|
084 cbr m_2 -> mf_exit,mf_free
|
||
|
085 mf_exit: storeAI m_1 => m_n,@off_oref
|
||
|
086 pop => m_1 // load return address
|
||
|
087 jump -> m_1
|
||
|
088 mf_free: subI m_n,@header => m_n
|
||
|
089 loadI @fst_ptr => m_p
|
||
|
090 loadAI m_p,@off_next => m_c
|
||
|
091 mf_loop: cmp_EQ m_0,m_c => m_1 // loop until the surrounding free blocks are found
|
||
|
092 cbr m_1 -> mf_halt,mf_cont // check if address pointer is null
|
||
|
093 mf_halt: haltI 1882220141 // halt program; object beyond last free slot (or memory corrupted)
|
||
|
094 mf_cont: cmp_EQ m_c,m_n => m_1
|
||
|
095 cbr m_1 -> mf_hal2,mf_con2
|
||
|
096 mf_hal2: haltI 1717855853 // halt program; object is free slot
|
||
|
097 mf_con2: cmp_LE m_c,m_n => m_1
|
||
|
098 cbr m_1 -> mf_next,mf_done
|
||
|
099 mf_next: i2i m_c => m_p
|
||
|
100 loadAI m_p,@off_next => m_c
|
||
|
101 jumpI -> mf_loop
|
||
|
102 mf_done: loadAI m_p,@off_size => m_1
|
||
|
103 addI m_1,@header => m_1
|
||
|
104 add m_1,m_p => m_2
|
||
|
105 cmp_EQ m_2,m_n => m_2
|
||
|
106 cbr m_2 -> mf_yprv,mf_nprv
|
||
|
107 mf_yprv: loadAI m_n,@off_size => m_2 // merge with previous free slot
|
||
|
108 add m_1,m_2 => m_1 // new size of previous free slot
|
||
|
109 storeAI m_1 => m_p,@off_size
|
||
|
110 i2i m_p => m_n
|
||
|
111 jumpI -> mf_dprv
|
||
|
112 mf_nprv: storeAI m_n => m_p,@off_next // link previous free slot with new
|
||
|
113 mf_dprv: loadAI m_n,@off_size => m_1
|
||
|
114 addI m_1,@header => m_1
|
||
|
115 add m_1,m_n => m_2
|
||
|
116 cmp_EQ m_2,m_c => m_2
|
||
|
117 cbr m_2 -> mf_ynxt,mf_nnxt
|
||
|
118 mf_ynxt: loadAI m_c,@off_size => m_2 // merge with next free slot
|
||
|
119 add m_1,m_2 => m_1 // new size of next free slot
|
||
|
120 storeAI m_1 => m_n,@off_size
|
||
|
121 loadAI m_c,@off_next => m_1
|
||
|
122 storeAI m_1 => m_n,@off_next // move link of next's next to new free slot
|
||
|
123 pop => m_1 // load return address
|
||
|
124 jump -> m_1
|
||
|
125 mf_nnxt: storeAI m_c => m_n,@off_next // link new free slot with next
|
||
|
126 pop => m_1 // load return address
|
||
|
127 jump -> m_1
|
||
|
128 // copy object to location
|
||
|
129 // stack: [return address, object address, destination] -> []
|
||
|
130 memcopy: loadI 0 => m_0
|
||
|
131 haltI 1835626101 // unimplemented
|
||
|
132 pop => m_1 // load return address
|
||
|
133 jump -> m_1
|
||
|
134 ememlib_: nop
|
||
|
135 // end of memlib
|
||
|
136 // stdlib - generic subroutines for ILOC
|
||
|
137 //
|
||
|
138 // This library contains a few common subroutines for Boppi.
|
||
|
139 //
|
||
|
140 // @author Frank Wibbelink
|
||
|
141 // initialise
|
||
|
142 stdlib_: jumpI -> estdlib_
|
||
|
143 // write a boolean to output
|
||
|
144 // stack: [return address, bool] -> []
|
||
|
145 stdbout: pop => m_1 // get boolean
|
||
|
146 loadI 0 => m_2 // load zero-length string
|
||
|
147 push m_2
|
||
|
148 cbr m_1 -> sbout_t,sbout_f
|
||
|
149 sbout_t: cout "true"
|
||
|
150 jumpI -> sbout_e
|
||
|
151 sbout_f: cout "false"
|
||
|
152 sbout_e: pop => m_1 // load return address
|
||
|
153 jump -> m_1
|
||
|
154 // read a character from input
|
||
|
155 // stack: [return address] -> [char]
|
||
|
156 stdcin: cin "" // get line
|
||
|
157 pop => m_1 // get length
|
||
|
158 cbr m_1 -> scin_t,stdcin // repeat until at least one character
|
||
|
159 scin_t: cpop => m_2 // save character
|
||
|
160 scin_lc: subI m_1,1 => m_1 // decrement char count
|
||
|
161 cbr m_1 -> scin_ll,scin_le
|
||
|
162 scin_ll: cpop => m_0 // discard character
|
||
|
163 jumpI -> scin_lc // repeat
|
||
|
164 scin_le: loadI 0 => m_0 // reset zero register
|
||
|
165 pop => m_1 // get return address
|
||
|
166 cpush m_2 // push result character
|
||
|
167 jump -> m_1
|
||
|
168 estdlib_: nop
|
||
|
169 // end of stdlib
|
||
|
170 loadI 0 => r_nul // initialise zero register
|
||
|
171 loadI 176 => r_arp // malloc
|
||
|
172 push r_arp // malloc
|
||
|
173 loadI 28 => 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 memoizedFib - jump over body
|
||
|
179 nop // define memoizedFib - entry point
|
||
|
180 loadI 50 => __1 // 50
|
||
|
181 multI __1,4 => __1 // produce array size
|
||
|
182 cmp_GE __1,r_nul => __2 // check size non negative
|
||
|
183 cbr __2 -> aszt1,aszf2 //
|
||
|
184 aszf2: haltI 1634628474 // invalid array size
|
||
|
185 aszt1: nop // valid array size
|
||
|
186 loadI 190 => __2 // malloc
|
||
|
187 push __2 // malloc
|
||
|
188 push __1 // malloc
|
||
|
189 jumpI -> memalloc // malloc
|
||
|
190 pop => __2 // malloc
|
||
|
191 addI r_arp,0 => __1 // add offset
|
||
|
192 load __1 => __3 // load reference
|
||
|
193 cmp_EQ __3,r_nul => __4 // remove old reference
|
||
|
194 cbr __4 -> ynul3,nnul4 // remove old reference
|
||
|
195 nnul4: nop // remove old reference
|
||
|
196 loadI 200 => __4 // free
|
||
|
197 push __4 // free
|
||
|
198 push __3 // free
|
||
|
199 jumpI -> memfree // free
|
||
|
200 ynul3: nop // remove old reference
|
||
|
201 store __2 => __1 // to memo
|
||
|
202 load __1 => __3 // load reference
|
||
|
203 loadI 207 => __5 // memaddref
|
||
|
204 push __5 // memaddref
|
||
|
205 push __3 // memaddref
|
||
|
206 jumpI -> memaddref // memaddref
|
||
|
207 cmp_EQ __2,r_nul => __3 // remove old reference
|
||
|
208 cbr __3 -> ynul5,nnul6 // remove old reference
|
||
|
209 nnul6: nop // remove old reference
|
||
|
210 loadI 214 => __3 // free
|
||
|
211 push __3 // free
|
||
|
212 push __2 // free
|
||
|
213 jumpI -> memfree // free
|
||
|
214 ynul5: nop // remove old reference
|
||
|
215 jumpI -> s7 // define fib - jump over body
|
||
|
216 nop // define fib - entry point
|
||
|
217 addI r_arp,0 => __1 // add offset
|
||
|
218 load __1 => __1 // load address
|
||
|
219 loadI 1 => __3 // 1
|
||
|
220 cmp_LT __1,__3 => __1 // <
|
||
|
221 addI r_arp,0 => __2 // add offset
|
||
|
222 load __2 => __2 // load address
|
||
|
223 loadI 46 => __5 // 46
|
||
|
224 cmp_GT __2,__5 => __2 // >
|
||
|
225 or __1,__2 => __1 // ||
|
||
|
226 cbr __1 -> if_t8,if_f9 //
|
||
|
227 if_t8: nop //
|
||
|
228 loadI 0 => __2 // 0
|
||
|
229 i2i __2 => __5 // result
|
||
|
230 jumpI -> if_e10 //
|
||
|
231 if_f9: nop //
|
||
|
232 addI r_arp,0 => __1 // add offset
|
||
|
233 load __1 => __1 // load address
|
||
|
234 loadI 2 => __3 // 2
|
||
|
235 cmp_LT __1,__3 => __1 // <
|
||
|
236 cbr __1 -> if_t11,if_f12 //
|
||
|
237 if_t11: nop //
|
||
|
238 loadI 1 => __2 // 1
|
||
|
239 i2i __2 => __3 // result
|
||
|
240 jumpI -> if_e13 //
|
||
|
241 if_f12: nop //
|
||
|
242 i2i r_arp => ART // travelling ALs
|
||
|
243 loadAI ART,-16 => ART // \
|
||
|
244 addI ART,0 => __1 // add offset
|
||
|
245 load __1 => __1 // get array object
|
||
|
246 addI r_arp,0 => __2 // add offset
|
||
|
247 load __2 => __2 // load address
|
||
|
248 loadAI __1,-4 => __6 // check array index
|
||
|
249 divI __6,4 => __6 // check array index
|
||
|
250 cmp_LT __2,__6 => __6 // check array index
|
||
|
251 cmp_GE __2,r_nul => __4 // check array index
|
||
|
252 and __6,__4 => __4 // check array index
|
||
|
253 cbr __4 -> nob18,oob17 // check array index
|
||
|
254 oob17: haltI 1634692962 // array index out of bounds
|
||
|
255 nob18: multI __2,4 => __2 // multiply index by size
|
||
|
256 add __1,__2 => __1 // get array index address
|
||
|
257 load __1 => __1 // load address
|
||
|
258 loadI 0 => __4 // 0
|
||
|
259 cmp_GT __1,__4 => __1 // >
|
||
|
260 cbr __1 -> if_t14,if_f15 //
|
||
|
261 if_t14: nop //
|
||
|
262 i2i r_arp => ART // travelling ALs
|
||
|
263 loadAI ART,-16 => ART // \
|
||
|
264 addI ART,0 => __2 // add offset
|
||
|
265 load __2 => __2 // get array object
|
||
|
266 addI r_arp,0 => __1 // add offset
|
||
|
267 load __1 => __1 // load address
|
||
|
268 loadAI __2,-4 => __7 // check array index
|
||
|
269 divI __7,4 => __7 // check array index
|
||
|
270 cmp_LT __1,__7 => __7 // check array index
|
||
|
271 cmp_GE __1,r_nul => __6 // check array index
|
||
|
272 and __7,__6 => __6 // check array index
|
||
|
273 cbr __6 -> nob20,oob19 // check array index
|
||
|
274 oob19: haltI 1634692962 // array index out of bounds
|
||
|
275 nob20: multI __1,4 => __1 // multiply index by size
|
||
|
276 add __2,__1 => __2 // get array index address
|
||
|
277 load __2 => __2 // load address
|
||
|
278 i2i __2 => __4 // result
|
||
|
279 jumpI -> if_e16 //
|
||
|
280 if_f15: nop //
|
||
|
281 i2i r_arp => ART // travelling ALs
|
||
|
282 loadAI ART,-16 => ART // \
|
||
|
283 addI ART,4 => __2 // add offset
|
||
|
284 load __2 => __6 // call fib - load function reference
|
||
|
285 loadAI __6,8 => __6 // call fib - load AR size
|
||
|
286 loadI 290 => __1 // malloc
|
||
|
287 push __1 // malloc
|
||
|
288 push __6 // malloc
|
||
|
289 jumpI -> memalloc // malloc
|
||
|
290 pop => __1 // malloc
|
||
|
291 addI __1,16 => __1 // call fib - shift AR
|
||
|
292 addI r_arp,0 => __2 // add offset
|
||
|
293 load __2 => __2 // load address
|
||
|
294 loadI 1 => __6 // 1
|
||
|
295 sub __2,__6 => __2 // -
|
||
|
296 storeAI __2 => __1,0 // call fib - store param 0
|
||
|
297 push __5 // call fib - register save __5
|
||
|
298 push __3 // call fib - register save __3
|
||
|
299 push __4 // call fib - register save __4
|
||
|
300 i2i r_arp => ART // travelling ALs
|
||
|
301 loadAI ART,-16 => ART // \
|
||
|
302 addI ART,4 => __6 // add offset
|
||
|
303 load __6 => __7 // call fib - load function reference
|
||
|
304 storeAI r_arp => __1,-4 // call fib - link caller ARP
|
||
|
305 loadAI __7,4 => __2 // call fib - load AL
|
||
|
306 storeAI __2 => __1,-16 // call fib - link AL
|
||
|
307 loadAI __1,-16 => ART // add ref for callee's AL
|
||
|
308 i2i ART => ART // AR incRef
|
||
|
309 cmp_NE ART,r_nul => __2 // AR incRef
|
||
|
310 cbr __2 -> aril21,arid22 // AR incRef
|
||
|
311 aril21: loadI 316 => __2 // AR incRef
|
||
|
312 push __2 // AR incRef
|
||
|
313 subI ART,16 => __2 // AR incRef
|
||
|
314 push __2 // AR incRef
|
||
|
315 jumpI -> memaddref // AR incRef
|
||
|
316 loadAI ART,-16 => ART // AR incRef
|
||
|
317 cmp_NE ART,r_nul => __2 // AR incRef
|
||
|
318 cbr __2 -> aril21,arid22 // AR incRef
|
||
|
319 arid22: nop // AR incRef
|
||
|
320 loadI 325 => __2 // call fib - load return address
|
||
|
321 storeAI __2 => __1,-8 // call fib - set return address
|
||
|
322 i2i __1 => r_arp // call fib - move ARP
|
||
|
323 loadAI __7,0 => __2 // call fib - load target address
|
||
|
324 jump -> __2 // call fib - execute
|
||
|
325 i2i r_arp => ART // AR decRef
|
||
|
326 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
327 cbr __7 -> ardl23,ardd24 // AR decRef
|
||
|
328 ardl23: loadI 333 => __7 // AR decRef
|
||
|
329 push __7 // AR decRef
|
||
|
330 subI ART,16 => __7 // AR decRef
|
||
|
331 push __7 // AR decRef
|
||
|
332 jumpI -> memfree // AR decRef
|
||
|
333 loadAI ART,-16 => ART // AR decRef
|
||
|
334 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
335 cbr __7 -> ardl23,ardd24 // AR decRef
|
||
|
336 ardd24: nop // AR decRef
|
||
|
337 pop => __4 // call fib - register unsave __4
|
||
|
338 pop => __3 // call fib - register unsave __3
|
||
|
339 pop => __5 // call fib - register unsave __5
|
||
|
340 loadAI r_arp,-12 => __1 // call fib - load result
|
||
|
341 loadAI r_arp,-4 => r_arp // call fib - reset ARP
|
||
|
342 i2i r_arp => ART // travelling ALs
|
||
|
343 loadAI ART,-16 => ART // \
|
||
|
344 addI ART,4 => __6 // add offset
|
||
|
345 load __6 => __7 // call fib - load function reference
|
||
|
346 loadAI __7,8 => __7 // call fib - load AR size
|
||
|
347 loadI 351 => __2 // malloc
|
||
|
348 push __2 // malloc
|
||
|
349 push __7 // malloc
|
||
|
350 jumpI -> memalloc // malloc
|
||
|
351 pop => __2 // malloc
|
||
|
352 addI __2,16 => __2 // call fib - shift AR
|
||
|
353 addI r_arp,0 => __7 // add offset
|
||
|
354 load __7 => __7 // load address
|
||
|
355 loadI 2 => __6 // 2
|
||
|
356 sub __7,__6 => __7 // -
|
||
|
357 storeAI __7 => __2,0 // call fib - store param 0
|
||
|
358 push __5 // call fib - register save __5
|
||
|
359 push __3 // call fib - register save __3
|
||
|
360 push __4 // call fib - register save __4
|
||
|
361 push __1 // call fib - register save __1
|
||
|
362 i2i r_arp => ART // travelling ALs
|
||
|
363 loadAI ART,-16 => ART // \
|
||
|
364 addI ART,4 => __8 // add offset
|
||
|
365 load __8 => __7 // call fib - load function reference
|
||
|
366 storeAI r_arp => __2,-4 // call fib - link caller ARP
|
||
|
367 loadAI __7,4 => __6 // call fib - load AL
|
||
|
368 storeAI __6 => __2,-16 // call fib - link AL
|
||
|
369 loadAI __2,-16 => ART // add ref for callee's AL
|
||
|
370 i2i ART => ART // AR incRef
|
||
|
371 cmp_NE ART,r_nul => __6 // AR incRef
|
||
|
372 cbr __6 -> aril25,arid26 // AR incRef
|
||
|
373 aril25: loadI 378 => __6 // AR incRef
|
||
|
374 push __6 // AR incRef
|
||
|
375 subI ART,16 => __6 // AR incRef
|
||
|
376 push __6 // AR incRef
|
||
|
377 jumpI -> memaddref // AR incRef
|
||
|
378 loadAI ART,-16 => ART // AR incRef
|
||
|
379 cmp_NE ART,r_nul => __6 // AR incRef
|
||
|
380 cbr __6 -> aril25,arid26 // AR incRef
|
||
|
381 arid26: nop // AR incRef
|
||
|
382 loadI 387 => __6 // call fib - load return address
|
||
|
383 storeAI __6 => __2,-8 // call fib - set return address
|
||
|
384 i2i __2 => r_arp // call fib - move ARP
|
||
|
385 loadAI __7,0 => __6 // call fib - load target address
|
||
|
386 jump -> __6 // call fib - execute
|
||
|
387 i2i r_arp => ART // AR decRef
|
||
|
388 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
389 cbr __7 -> ardl27,ardd28 // AR decRef
|
||
|
390 ardl27: loadI 395 => __7 // AR decRef
|
||
|
391 push __7 // AR decRef
|
||
|
392 subI ART,16 => __7 // AR decRef
|
||
|
393 push __7 // AR decRef
|
||
|
394 jumpI -> memfree // AR decRef
|
||
|
395 loadAI ART,-16 => ART // AR decRef
|
||
|
396 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
397 cbr __7 -> ardl27,ardd28 // AR decRef
|
||
|
398 ardd28: nop // AR decRef
|
||
|
399 pop => __1 // call fib - register unsave __1
|
||
|
400 pop => __4 // call fib - register unsave __4
|
||
|
401 pop => __3 // call fib - register unsave __3
|
||
|
402 pop => __5 // call fib - register unsave __5
|
||
|
403 loadAI r_arp,-12 => __2 // call fib - load result
|
||
|
404 loadAI r_arp,-4 => r_arp // call fib - reset ARP
|
||
|
405 add __1,__2 => __1 // +
|
||
|
406 i2i r_arp => ART // travelling ALs
|
||
|
407 loadAI ART,-16 => ART // \
|
||
|
408 addI ART,0 => __7 // add offset
|
||
|
409 load __7 => __7 // get array object
|
||
|
410 addI r_arp,0 => __6 // add offset
|
||
|
411 load __6 => __6 // load address
|
||
|
412 loadAI __7,-4 => __8 // check array index
|
||
|
413 divI __8,4 => __8 // check array index
|
||
|
414 cmp_LT __6,__8 => __8 // check array index
|
||
|
415 cmp_GE __6,r_nul => __2 // check array index
|
||
|
416 and __8,__2 => __2 // check array index
|
||
|
417 cbr __2 -> nob30,oob29 // check array index
|
||
|
418 oob29: haltI 1634692962 // array index out of bounds
|
||
|
419 nob30: multI __6,4 => __6 // multiply index by size
|
||
|
420 add __7,__6 => __7 // get array index address
|
||
|
421 store __1 => __7 // to memo[n]
|
||
|
422 i2i __1 => __4 // result
|
||
|
423 if_e16: nop // end target
|
||
|
424 i2i __4 => __3 // result
|
||
|
425 if_e13: nop // end target
|
||
|
426 i2i __3 => __5 // result
|
||
|
427 if_e10: nop // end target
|
||
|
428 storeAI __5 => r_arp,-12 // define fib - move result
|
||
|
429 loadAI r_arp,-8 => __1 // load ref count
|
||
|
430 loadI 1 => __4 // one
|
||
|
431 cmp_LE __1,__4 => __1 // check more than one ref
|
||
|
432 cbr __1 -> ycl31,ncl32 // remove vars if last reference
|
||
|
433 ycl31: nop // cleanup target
|
||
|
434 ncl32: nop // no cleanup target
|
||
|
435 loadAI r_arp,-8 => __4 // define fib - load return address
|
||
|
436 jump -> __4 // define fib - go to return address
|
||
|
437 s7: nop // define fib - skip target
|
||
|
438 loadI 443 => __3 // malloc
|
||
|
439 push __3 // malloc
|
||
|
440 loadI 12 => __3 // malloc
|
||
|
441 push __3 // malloc
|
||
|
442 jumpI -> memalloc // malloc
|
||
|
443 pop => __3 // malloc
|
||
|
444 loadI 216 => __1 // define fib - load target address
|
||
|
445 storeAI __1 => __3,0 // define fib - set target address
|
||
|
446 storeAI r_arp => __3,4 // define fib - copy ARP
|
||
|
447 loadI 20 => __1 // define fib - load AR size
|
||
|
448 storeAI __1 => __3,8 // define fib - set AR size
|
||
|
449 storeAI __3 => r_arp,4 // define fib - set function reference
|
||
|
450 i2i r_arp => ART // AR incRef
|
||
|
451 cmp_NE ART,r_nul => __3 // AR incRef
|
||
|
452 cbr __3 -> aril33,arid34 // AR incRef
|
||
|
453 aril33: loadI 458 => __3 // AR incRef
|
||
|
454 push __3 // AR incRef
|
||
|
455 subI ART,16 => __3 // AR incRef
|
||
|
456 push __3 // AR incRef
|
||
|
457 jumpI -> memaddref // AR incRef
|
||
|
458 loadAI ART,-16 => ART // AR incRef
|
||
|
459 cmp_NE ART,r_nul => __3 // AR incRef
|
||
|
460 cbr __3 -> aril33,arid34 // AR incRef
|
||
|
461 arid34: nop // AR incRef
|
||
|
462 addI r_arp,4 => __4 // add offset
|
||
|
463 load __4 => __4 // load address
|
||
|
464 loadI 468 => __7 // memaddref
|
||
|
465 push __7 // memaddref
|
||
|
466 push __4 // memaddref
|
||
|
467 jumpI -> memaddref // memaddref
|
||
|
468 loadAI __4,4 => __5 // add new reference
|
||
|
469 i2i __5 => ART // AR incRef
|
||
|
470 cmp_NE ART,r_nul => __7 // AR incRef
|
||
|
471 cbr __7 -> aril35,arid36 // AR incRef
|
||
|
472 aril35: loadI 477 => __7 // AR incRef
|
||
|
473 push __7 // AR incRef
|
||
|
474 subI ART,16 => __7 // AR incRef
|
||
|
475 push __7 // AR incRef
|
||
|
476 jumpI -> memaddref // AR incRef
|
||
|
477 loadAI ART,-16 => ART // AR incRef
|
||
|
478 cmp_NE ART,r_nul => __7 // AR incRef
|
||
|
479 cbr __7 -> aril35,arid36 // AR incRef
|
||
|
480 arid36: nop // AR incRef
|
||
|
481 storeAI __4 => r_arp,-12 // define memoizedFib - move result
|
||
|
482 loadAI r_arp,-8 => __3 // load ref count
|
||
|
483 loadI 1 => __7 // one
|
||
|
484 cmp_LE __3,__7 => __3 // check more than one ref
|
||
|
485 cbr __3 -> ycl37,ncl38 // remove vars if last reference
|
||
|
486 ycl37: nop // cleanup target
|
||
|
487 loadAI r_arp,0 => __5 // remove reference get var
|
||
|
488 cmp_EQ __5,r_nul => __4 // remove reference
|
||
|
489 cbr __4 -> ynul39,nnul40 // remove reference
|
||
|
490 nnul40: nop // remove reference
|
||
|
491 loadI 495 => __4 // free
|
||
|
492 push __4 // free
|
||
|
493 push __5 // free
|
||
|
494 jumpI -> memfree // free
|
||
|
495 ynul39: nop // remove reference
|
||
|
496 loadAI r_arp,4 => __5 // remove reference get var
|
||
|
497 cmp_EQ __5,r_nul => __4 // remove reference
|
||
|
498 cbr __4 -> ynul41,nnul42 // remove reference
|
||
|
499 nnul42: nop // remove reference
|
||
|
500 loadI 504 => __4 // free
|
||
|
501 push __4 // free
|
||
|
502 push __5 // free
|
||
|
503 jumpI -> memfree // free
|
||
|
504 loadAI __5,4 => __5 // remove reference
|
||
|
505 i2i __5 => ART // AR decRef
|
||
|
506 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
507 cbr __4 -> ardl43,ardd44 // AR decRef
|
||
|
508 ardl43: loadI 513 => __4 // AR decRef
|
||
|
509 push __4 // AR decRef
|
||
|
510 subI ART,16 => __4 // AR decRef
|
||
|
511 push __4 // AR decRef
|
||
|
512 jumpI -> memfree // AR decRef
|
||
|
513 loadAI ART,-16 => ART // AR decRef
|
||
|
514 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
515 cbr __4 -> ardl43,ardd44 // AR decRef
|
||
|
516 ardd44: nop // AR decRef
|
||
|
517 ynul41: nop // remove reference
|
||
|
518 ncl38: nop // no cleanup target
|
||
|
519 loadAI r_arp,-8 => __7 // define memoizedFib - load return address
|
||
|
520 jump -> __7 // define memoizedFib - go to return address
|
||
|
521 s0: nop // define memoizedFib - skip target
|
||
|
522 loadI 527 => __5 // malloc
|
||
|
523 push __5 // malloc
|
||
|
524 loadI 12 => __5 // malloc
|
||
|
525 push __5 // malloc
|
||
|
526 jumpI -> memalloc // malloc
|
||
|
527 pop => __5 // malloc
|
||
|
528 loadI 179 => __3 // define memoizedFib - load target address
|
||
|
529 storeAI __3 => __5,0 // define memoizedFib - set target address
|
||
|
530 storeAI r_arp => __5,4 // define memoizedFib - copy ARP
|
||
|
531 loadI 24 => __3 // define memoizedFib - load AR size
|
||
|
532 storeAI __3 => __5,8 // define memoizedFib - set AR size
|
||
|
533 storeAI __5 => r_arp,0 // define memoizedFib - set function reference
|
||
|
534 i2i r_arp => ART // AR incRef
|
||
|
535 cmp_NE ART,r_nul => __5 // AR incRef
|
||
|
536 cbr __5 -> aril45,arid46 // AR incRef
|
||
|
537 aril45: loadI 542 => __5 // AR incRef
|
||
|
538 push __5 // AR incRef
|
||
|
539 subI ART,16 => __5 // AR incRef
|
||
|
540 push __5 // AR incRef
|
||
|
541 jumpI -> memaddref // AR incRef
|
||
|
542 loadAI ART,-16 => ART // AR incRef
|
||
|
543 cmp_NE ART,r_nul => __5 // AR incRef
|
||
|
544 cbr __5 -> aril45,arid46 // AR incRef
|
||
|
545 arid46: nop // AR incRef
|
||
|
546 addI r_arp,0 => __1 // add offset
|
||
|
547 load __1 => __4 // call memoizedFib - load function reference
|
||
|
548 loadAI __4,8 => __4 // call memoizedFib - load AR size
|
||
|
549 loadI 553 => __7 // malloc
|
||
|
550 push __7 // malloc
|
||
|
551 push __4 // malloc
|
||
|
552 jumpI -> memalloc // malloc
|
||
|
553 pop => __7 // malloc
|
||
|
554 addI __7,16 => __7 // call memoizedFib - shift AR
|
||
|
555 addI r_arp,0 => __6 // add offset
|
||
|
556 load __6 => __5 // call memoizedFib - load function reference
|
||
|
557 storeAI r_arp => __7,-4 // call memoizedFib - link caller ARP
|
||
|
558 loadAI __5,4 => __3 // call memoizedFib - load AL
|
||
|
559 storeAI __3 => __7,-16 // call memoizedFib - link AL
|
||
|
560 loadAI __7,-16 => ART // add ref for callee's AL
|
||
|
561 i2i ART => ART // AR incRef
|
||
|
562 cmp_NE ART,r_nul => __3 // AR incRef
|
||
|
563 cbr __3 -> aril47,arid48 // AR incRef
|
||
|
564 aril47: loadI 569 => __3 // AR incRef
|
||
|
565 push __3 // AR incRef
|
||
|
566 subI ART,16 => __3 // AR incRef
|
||
|
567 push __3 // AR incRef
|
||
|
568 jumpI -> memaddref // AR incRef
|
||
|
569 loadAI ART,-16 => ART // AR incRef
|
||
|
570 cmp_NE ART,r_nul => __3 // AR incRef
|
||
|
571 cbr __3 -> aril47,arid48 // AR incRef
|
||
|
572 arid48: nop // AR incRef
|
||
|
573 loadI 578 => __3 // call memoizedFib - load return address
|
||
|
574 storeAI __3 => __7,-8 // call memoizedFib - set return address
|
||
|
575 i2i __7 => r_arp // call memoizedFib - move ARP
|
||
|
576 loadAI __5,0 => __3 // call memoizedFib - load target address
|
||
|
577 jump -> __3 // call memoizedFib - execute
|
||
|
578 i2i r_arp => ART // AR decRef
|
||
|
579 cmp_NE ART,r_nul => __3 // AR decRef
|
||
|
580 cbr __3 -> ardl49,ardd50 // AR decRef
|
||
|
581 ardl49: loadI 586 => __3 // AR decRef
|
||
|
582 push __3 // AR decRef
|
||
|
583 subI ART,16 => __3 // AR decRef
|
||
|
584 push __3 // AR decRef
|
||
|
585 jumpI -> memfree // AR decRef
|
||
|
586 loadAI ART,-16 => ART // AR decRef
|
||
|
587 cmp_NE ART,r_nul => __3 // AR decRef
|
||
|
588 cbr __3 -> ardl49,ardd50 // AR decRef
|
||
|
589 ardd50: nop // AR decRef
|
||
|
590 loadAI r_arp,-12 => __5 // call memoizedFib - load result
|
||
|
591 loadAI r_arp,-4 => r_arp // call memoizedFib - reset ARP
|
||
|
592 addI r_arp,4 => __6 // add offset
|
||
|
593 load __6 => __4 // load reference
|
||
|
594 cmp_EQ __4,r_nul => __1 // remove old reference
|
||
|
595 cbr __1 -> ynul51,nnul52 // remove old reference
|
||
|
596 nnul52: nop // remove old reference
|
||
|
597 loadI 601 => __1 // free
|
||
|
598 push __1 // free
|
||
|
599 push __4 // free
|
||
|
600 jumpI -> memfree // free
|
||
|
601 loadAI __4,4 => __4 // remove old reference
|
||
|
602 i2i __4 => ART // AR decRef
|
||
|
603 cmp_NE ART,r_nul => __1 // AR decRef
|
||
|
604 cbr __1 -> ardl53,ardd54 // AR decRef
|
||
|
605 ardl53: loadI 610 => __1 // AR decRef
|
||
|
606 push __1 // AR decRef
|
||
|
607 subI ART,16 => __1 // AR decRef
|
||
|
608 push __1 // AR decRef
|
||
|
609 jumpI -> memfree // AR decRef
|
||
|
610 loadAI ART,-16 => ART // AR decRef
|
||
|
611 cmp_NE ART,r_nul => __1 // AR decRef
|
||
|
612 cbr __1 -> ardl53,ardd54 // AR decRef
|
||
|
613 ardd54: nop // AR decRef
|
||
|
614 ynul51: nop // remove old reference
|
||
|
615 store __5 => __6 // to myFib
|
||
|
616 load __6 => __3 // load reference
|
||
|
617 loadI 621 => __1 // memaddref
|
||
|
618 push __1 // memaddref
|
||
|
619 push __3 // memaddref
|
||
|
620 jumpI -> memaddref // memaddref
|
||
|
621 loadAI __3,4 => __7 // add new reference
|
||
|
622 i2i __7 => ART // AR incRef
|
||
|
623 cmp_NE ART,r_nul => __1 // AR incRef
|
||
|
624 cbr __1 -> aril55,arid56 // AR incRef
|
||
|
625 aril55: loadI 630 => __1 // AR incRef
|
||
|
626 push __1 // AR incRef
|
||
|
627 subI ART,16 => __1 // AR incRef
|
||
|
628 push __1 // AR incRef
|
||
|
629 jumpI -> memaddref // AR incRef
|
||
|
630 loadAI ART,-16 => ART // AR incRef
|
||
|
631 cmp_NE ART,r_nul => __1 // AR incRef
|
||
|
632 cbr __1 -> aril55,arid56 // AR incRef
|
||
|
633 arid56: nop // AR incRef
|
||
|
634 cmp_EQ __5,r_nul => __7 // remove old reference
|
||
|
635 cbr __7 -> ynul57,nnul58 // remove old reference
|
||
|
636 nnul58: nop // remove old reference
|
||
|
637 loadI 641 => __7 // free
|
||
|
638 push __7 // free
|
||
|
639 push __5 // free
|
||
|
640 jumpI -> memfree // free
|
||
|
641 loadAI __5,4 => __5 // remove old reference
|
||
|
642 i2i __5 => ART // AR decRef
|
||
|
643 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
644 cbr __7 -> ardl59,ardd60 // AR decRef
|
||
|
645 ardl59: loadI 650 => __7 // AR decRef
|
||
|
646 push __7 // AR decRef
|
||
|
647 subI ART,16 => __7 // AR decRef
|
||
|
648 push __7 // AR decRef
|
||
|
649 jumpI -> memfree // AR decRef
|
||
|
650 loadAI ART,-16 => ART // AR decRef
|
||
|
651 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
652 cbr __7 -> ardl59,ardd60 // AR decRef
|
||
|
653 ardd60: nop // AR decRef
|
||
|
654 ynul57: nop // remove old reference
|
||
|
655 jumpI -> while_f62 // to condition
|
||
|
656 while_t61: nop // loop target
|
||
|
657 addI r_arp,4 => __1 // add offset
|
||
|
658 load __1 => __3 // call myFib - load function reference
|
||
|
659 loadAI __3,8 => __3 // call myFib - load AR size
|
||
|
660 loadI 664 => __6 // malloc
|
||
|
661 push __6 // malloc
|
||
|
662 push __3 // malloc
|
||
|
663 jumpI -> memalloc // malloc
|
||
|
664 pop => __6 // malloc
|
||
|
665 addI __6,16 => __6 // call myFib - shift AR
|
||
|
666 addI r_arp,8 => __5 // add offset
|
||
|
667 load __5 => __5 // load address
|
||
|
668 storeAI __5 => __6,0 // call myFib - store param 0
|
||
|
669 addI r_arp,4 => __4 // add offset
|
||
|
670 load __4 => __1 // call myFib - load function reference
|
||
|
671 storeAI r_arp => __6,-4 // call myFib - link caller ARP
|
||
|
672 loadAI __1,4 => __7 // call myFib - load AL
|
||
|
673 storeAI __7 => __6,-16 // call myFib - link AL
|
||
|
674 loadAI __6,-16 => ART // add ref for callee's AL
|
||
|
675 i2i ART => ART // AR incRef
|
||
|
676 cmp_NE ART,r_nul => __7 // AR incRef
|
||
|
677 cbr __7 -> aril64,arid65 // AR incRef
|
||
|
678 aril64: loadI 683 => __7 // AR incRef
|
||
|
679 push __7 // AR incRef
|
||
|
680 subI ART,16 => __7 // AR incRef
|
||
|
681 push __7 // AR incRef
|
||
|
682 jumpI -> memaddref // AR incRef
|
||
|
683 loadAI ART,-16 => ART // AR incRef
|
||
|
684 cmp_NE ART,r_nul => __7 // AR incRef
|
||
|
685 cbr __7 -> aril64,arid65 // AR incRef
|
||
|
686 arid65: nop // AR incRef
|
||
|
687 loadI 692 => __7 // call myFib - load return address
|
||
|
688 storeAI __7 => __6,-8 // call myFib - set return address
|
||
|
689 i2i __6 => r_arp // call myFib - move ARP
|
||
|
690 loadAI __1,0 => __7 // call myFib - load target address
|
||
|
691 jump -> __7 // call myFib - execute
|
||
|
692 i2i r_arp => ART // AR decRef
|
||
|
693 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
694 cbr __7 -> ardl66,ardd67 // AR decRef
|
||
|
695 ardl66: loadI 700 => __7 // AR decRef
|
||
|
696 push __7 // AR decRef
|
||
|
697 subI ART,16 => __7 // AR decRef
|
||
|
698 push __7 // AR decRef
|
||
|
699 jumpI -> memfree // AR decRef
|
||
|
700 loadAI ART,-16 => ART // AR decRef
|
||
|
701 cmp_NE ART,r_nul => __7 // AR decRef
|
||
|
702 cbr __7 -> ardl66,ardd67 // AR decRef
|
||
|
703 ardd67: nop // AR decRef
|
||
|
704 loadAI r_arp,-12 => __1 // call myFib - load result
|
||
|
705 loadAI r_arp,-4 => r_arp // call myFib - reset ARP
|
||
|
706 out "",__1 //
|
||
|
707 while_f62: nop // condition target
|
||
|
708 addI r_arp,8 => __6 // add offset
|
||
|
709 in "" => __7 //
|
||
|
710 addI r_arp,8 => __4 // add offset
|
||
|
711 store __7 => __4 // save to var n
|
||
|
712 loadI 0 => __1 // 0
|
||
|
713 cmp_GT __7,__1 => __7 // >
|
||
|
714 cbr __7 -> while_t61,while_e63 //
|
||
|
715 while_e63: nop // end target
|
||
|
716 loadAI r_arp,0 => __6 // remove reference get var
|
||
|
717 cmp_EQ __6,r_nul => __4 // remove reference
|
||
|
718 cbr __4 -> ynul68,nnul69 // remove reference
|
||
|
719 nnul69: nop // remove reference
|
||
|
720 loadI 724 => __4 // free
|
||
|
721 push __4 // free
|
||
|
722 push __6 // free
|
||
|
723 jumpI -> memfree // free
|
||
|
724 loadAI __6,4 => __6 // remove reference
|
||
|
725 i2i __6 => ART // AR decRef
|
||
|
726 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
727 cbr __4 -> ardl70,ardd71 // AR decRef
|
||
|
728 ardl70: loadI 733 => __4 // AR decRef
|
||
|
729 push __4 // AR decRef
|
||
|
730 subI ART,16 => __4 // AR decRef
|
||
|
731 push __4 // AR decRef
|
||
|
732 jumpI -> memfree // AR decRef
|
||
|
733 loadAI ART,-16 => ART // AR decRef
|
||
|
734 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
735 cbr __4 -> ardl70,ardd71 // AR decRef
|
||
|
736 ardd71: nop // AR decRef
|
||
|
737 ynul68: nop // remove reference
|
||
|
738 loadAI r_arp,4 => __6 // remove reference get var
|
||
|
739 cmp_EQ __6,r_nul => __4 // remove reference
|
||
|
740 cbr __4 -> ynul72,nnul73 // remove reference
|
||
|
741 nnul73: nop // remove reference
|
||
|
742 loadI 746 => __4 // free
|
||
|
743 push __4 // free
|
||
|
744 push __6 // free
|
||
|
745 jumpI -> memfree // free
|
||
|
746 loadAI __6,4 => __6 // remove reference
|
||
|
747 i2i __6 => ART // AR decRef
|
||
|
748 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
749 cbr __4 -> ardl74,ardd75 // AR decRef
|
||
|
750 ardl74: loadI 755 => __4 // AR decRef
|
||
|
751 push __4 // AR decRef
|
||
|
752 subI ART,16 => __4 // AR decRef
|
||
|
753 push __4 // AR decRef
|
||
|
754 jumpI -> memfree // AR decRef
|
||
|
755 loadAI ART,-16 => ART // AR decRef
|
||
|
756 cmp_NE ART,r_nul => __4 // AR decRef
|
||
|
757 cbr __4 -> ardl74,ardd75 // AR decRef
|
||
|
758 ardd75: nop // AR decRef
|
||
|
759 ynul72: nop // remove reference
|
||
|
760 subI r_arp,16 => r_arp // deconstruct main AR
|
||
|
761 loadI 765 => __7 // free
|
||
|
762 push __7 // free
|
||
|
763 push r_arp // free
|
||
|
764 jumpI -> memfree // free
|