corrected ILOC output (register naming, instruction name spacing)
This commit is contained in:
parent
a537217c4a
commit
11a0616010
File diff suppressed because it is too large
Load Diff
|
@ -6,94 +6,94 @@
|
|||
175 jumpI -> memalloc // malloc
|
||||
176 pop => r_arp // malloc
|
||||
177 addI r_arp,16 => r_arp // construct main AR
|
||||
178 loadI 183 => __1 // malloc
|
||||
179 push __1 // malloc
|
||||
180 loadI 8 => __1 // malloc
|
||||
181 push __1 // malloc
|
||||
178 loadI 183 => r_1 // malloc
|
||||
179 push r_1 // malloc
|
||||
180 loadI 8 => r_1 // malloc
|
||||
181 push r_1 // malloc
|
||||
182 jumpI -> memalloc // malloc
|
||||
183 pop => __1 // malloc
|
||||
184 loadI 189 => __2 // malloc
|
||||
185 push __2 // malloc
|
||||
186 loadI 8 => __2 // malloc
|
||||
187 push __2 // malloc
|
||||
183 pop => r_1 // malloc
|
||||
184 loadI 189 => r_2 // malloc
|
||||
185 push r_2 // malloc
|
||||
186 loadI 8 => r_2 // malloc
|
||||
187 push r_2 // malloc
|
||||
188 jumpI -> memalloc // malloc
|
||||
189 pop => __2 // malloc
|
||||
190 loadI 1 => __3 // 1
|
||||
191 storeAI __3 => __2,0 // store array element
|
||||
192 loadI 2 => __3 // 2
|
||||
193 storeAI __3 => __2,4 // store array element
|
||||
194 storeAI __2 => __1,0 // store array element
|
||||
195 loadI 200 => __2 // malloc
|
||||
196 push __2 // malloc
|
||||
197 loadI 8 => __2 // malloc
|
||||
198 push __2 // malloc
|
||||
189 pop => r_2 // malloc
|
||||
190 loadI 1 => r_3 // 1
|
||||
191 storeAI r_3 => r_2,0 // store array element
|
||||
192 loadI 2 => r_3 // 2
|
||||
193 storeAI r_3 => r_2,4 // store array element
|
||||
194 storeAI r_2 => r_1,0 // store array element
|
||||
195 loadI 200 => r_2 // malloc
|
||||
196 push r_2 // malloc
|
||||
197 loadI 8 => r_2 // malloc
|
||||
198 push r_2 // malloc
|
||||
199 jumpI -> memalloc // malloc
|
||||
200 pop => __2 // malloc
|
||||
201 loadI 3 => __3 // 3
|
||||
202 storeAI __3 => __2,0 // store array element
|
||||
203 loadI 4 => __3 // 4
|
||||
204 storeAI __3 => __2,4 // store array element
|
||||
205 storeAI __2 => __1,4 // store array element
|
||||
206 addI r_arp,0 => __2 // add offset
|
||||
207 load __2 => __3 // load reference
|
||||
208 cmp_EQ __3,r_nul => __4 // remove old reference
|
||||
209 cbr __4 -> ynul0,nnul1 // remove old reference
|
||||
200 pop => r_2 // malloc
|
||||
201 loadI 3 => r_3 // 3
|
||||
202 storeAI r_3 => r_2,0 // store array element
|
||||
203 loadI 4 => r_3 // 4
|
||||
204 storeAI r_3 => r_2,4 // store array element
|
||||
205 storeAI r_2 => r_1,4 // store array element
|
||||
206 addI r_arp,0 => r_2 // add offset
|
||||
207 load r_2 => r_3 // load reference
|
||||
208 cmp_EQ r_3,r_nul => r_4 // remove old reference
|
||||
209 cbr r_4 -> ynul0,nnul1 // remove old reference
|
||||
210 nnul1: nop // remove old reference
|
||||
211 loadI 215 => __4 // free
|
||||
212 push __4 // free
|
||||
213 push __3 // free
|
||||
211 loadI 215 => r_4 // free
|
||||
212 push r_4 // free
|
||||
213 push r_3 // free
|
||||
214 jumpI -> memfree // free
|
||||
215 ynul0: nop // remove old reference
|
||||
216 store __1 => __2 // to matrix
|
||||
217 load __2 => __3 // load reference
|
||||
218 loadI 222 => __5 // memaddref
|
||||
219 push __5 // memaddref
|
||||
220 push __3 // memaddref
|
||||
216 store r_1 => r_2 // to matrix
|
||||
217 load r_2 => r_3 // load reference
|
||||
218 loadI 222 => r_5 // memaddref
|
||||
219 push r_5 // memaddref
|
||||
220 push r_3 // memaddref
|
||||
221 jumpI -> memaddref // memaddref
|
||||
222 cmp_EQ __1,r_nul => __3 // remove old reference
|
||||
223 cbr __3 -> ynul2,nnul3 // remove old reference
|
||||
222 cmp_EQ r_1,r_nul => r_3 // remove old reference
|
||||
223 cbr r_3 -> ynul2,nnul3 // remove old reference
|
||||
224 nnul3: nop // remove old reference
|
||||
225 loadI 229 => __3 // free
|
||||
226 push __3 // free
|
||||
227 push __1 // free
|
||||
225 loadI 229 => r_3 // free
|
||||
226 push r_3 // free
|
||||
227 push r_1 // free
|
||||
228 jumpI -> memfree // free
|
||||
229 ynul2: nop // remove old reference
|
||||
230 addI r_arp,0 => __2 // add offset
|
||||
231 load __2 => __2 // get array object
|
||||
232 loadI 0 => __3 // 0
|
||||
233 loadAI __2,-4 => __1 // check array index
|
||||
234 divI __1,4 => __1 // check array index
|
||||
235 cmp_LT __3,__1 => __1 // check array index
|
||||
236 cmp_GE __3,r_nul => __4 // check array index
|
||||
237 and __1,__4 => __4 // check array index
|
||||
238 cbr __4 -> nob5,oob4 // check array index
|
||||
230 addI r_arp,0 => r_2 // add offset
|
||||
231 load r_2 => r_2 // get array object
|
||||
232 loadI 0 => r_3 // 0
|
||||
233 loadAI r_2,-4 => r_1 // check array index
|
||||
234 divI r_1,4 => r_1 // check array index
|
||||
235 cmp_LT r_3,r_1 => r_1 // check array index
|
||||
236 cmp_GE r_3,r_nul => r_4 // check array index
|
||||
237 and r_1,r_4 => r_4 // check array index
|
||||
238 cbr r_4 -> nob5,oob4 // check array index
|
||||
239 oob4: haltI 1634692962 // array index out of bounds
|
||||
240 nob5: multI __3,4 => __3 // multiply index by size
|
||||
241 add __2,__3 => __2 // get array index address
|
||||
242 load __2 => __2 // get array object
|
||||
243 loadI 1 => __4 // 1
|
||||
244 loadAI __2,-4 => __3 // check array index
|
||||
245 divI __3,4 => __3 // check array index
|
||||
246 cmp_LT __4,__3 => __3 // check array index
|
||||
247 cmp_GE __4,r_nul => __1 // check array index
|
||||
248 and __3,__1 => __1 // check array index
|
||||
249 cbr __1 -> nob7,oob6 // check array index
|
||||
240 nob5: multI r_3,4 => r_3 // multiply index by size
|
||||
241 add r_2,r_3 => r_2 // get array index address
|
||||
242 load r_2 => r_2 // get array object
|
||||
243 loadI 1 => r_4 // 1
|
||||
244 loadAI r_2,-4 => r_3 // check array index
|
||||
245 divI r_3,4 => r_3 // check array index
|
||||
246 cmp_LT r_4,r_3 => r_3 // check array index
|
||||
247 cmp_GE r_4,r_nul => r_1 // check array index
|
||||
248 and r_3,r_1 => r_1 // check array index
|
||||
249 cbr r_1 -> nob7,oob6 // check array index
|
||||
250 oob6: haltI 1634692962 // array index out of bounds
|
||||
251 nob7: multI __4,4 => __4 // multiply index by size
|
||||
252 add __2,__4 => __2 // get array index address
|
||||
253 load __2 => __2 // load address
|
||||
254 out "",__2 //
|
||||
255 loadAI r_arp,0 => __4 // remove reference get var
|
||||
256 cmp_EQ __4,r_nul => __1 // remove reference
|
||||
257 cbr __1 -> ynul8,nnul9 // remove reference
|
||||
251 nob7: multI r_4,4 => r_4 // multiply index by size
|
||||
252 add r_2,r_4 => r_2 // get array index address
|
||||
253 load r_2 => r_2 // load address
|
||||
254 out "",r_2 //
|
||||
255 loadAI r_arp,0 => r_4 // remove reference get var
|
||||
256 cmp_EQ r_4,r_nul => r_1 // remove reference
|
||||
257 cbr r_1 -> ynul8,nnul9 // remove reference
|
||||
258 nnul9: nop // remove reference
|
||||
259 loadI 263 => __1 // free
|
||||
260 push __1 // free
|
||||
261 push __4 // free
|
||||
259 loadI 263 => r_1 // free
|
||||
260 push r_1 // free
|
||||
261 push r_4 // free
|
||||
262 jumpI -> memfree // free
|
||||
263 ynul8: nop // remove reference
|
||||
264 subI r_arp,16 => r_arp // deconstruct main AR
|
||||
265 loadI 269 => __2 // free
|
||||
266 push __2 // free
|
||||
265 loadI 269 => r_2 // free
|
||||
266 push r_2 // free
|
||||
267 push r_arp // free
|
||||
268 jumpI -> memfree // free
|
||||
|
|
|
@ -93,28 +93,28 @@ The compound expression simply generates its inner expressions in order. See \cr
|
|||
\begin{subfigure}{0.7\textwidth}
|
||||
\caption{Generated ILOC}
|
||||
\begin{minted}{boppi}
|
||||
loadI 5 => __1 // 5
|
||||
loadI 5 => r_1 // 5
|
||||
|
||||
loadI 99 => __1 // 'c'
|
||||
i2c __1 => __1 // 'c'
|
||||
loadI 99 => r_1 // 'c'
|
||||
i2c r_1 => r_1 // 'c'
|
||||
|
||||
loadI 4 => __1 // 4
|
||||
loadI 2 => __2 // 2
|
||||
loadI 3 => __3 // 3
|
||||
mult __2,__3 => __2 // *
|
||||
loadI 1 => __3 // 1
|
||||
rsubI __3,0 => __3 // unary -
|
||||
div __2,__3 => __2 // /
|
||||
add __1,__2 => __1 // +
|
||||
loadI 4 => r_1 // 4
|
||||
loadI 2 => r_2 // 2
|
||||
loadI 3 => r_3 // 3
|
||||
mult r_2,r_3 => r_2 // *
|
||||
loadI 1 => r_3 // 1
|
||||
rsubI r_3,0 => r_3 // unary -
|
||||
div r_2,r_3 => r_2 // /
|
||||
add r_1,r_2 => r_1 // +
|
||||
|
||||
loadI 1 => __2 // true
|
||||
loadI 0 => __1 // false
|
||||
and __2,__1 => __2 // &&
|
||||
loadI 1 => r_2 // true
|
||||
loadI 0 => r_1 // false
|
||||
and r_2,r_1 => r_2 // &&
|
||||
|
||||
loadI 3 => __1 // 3
|
||||
loadI 3 => r_1 // 3
|
||||
|
||||
loadI 4 => __2 // 4
|
||||
add __1,__2 => __1 // +
|
||||
loadI 4 => r_2 // 4
|
||||
add r_1,r_2 => r_1 // +
|
||||
\end{minted}
|
||||
\end{subfigure}
|
||||
\end{figure}
|
||||
|
@ -221,26 +221,26 @@ c := b := x < y;
|
|||
\begin{subfigure}{0.7\textwidth}
|
||||
\caption{Generated ILOC}
|
||||
\begin{minted}{boppi}
|
||||
loadI 4 => __1 // 4
|
||||
addI r_arp,0 => __2 // add offset
|
||||
store __1 => __2 // to x
|
||||
loadI 4 => r_1 // 4
|
||||
addI r_arp,0 => r_2 // add offset
|
||||
store r_1 => r_2 // to x
|
||||
|
||||
loadI 3 => __1 // 3
|
||||
addI r_arp,0 => __2 // add offset
|
||||
load __2 => __2 // load address
|
||||
add __1,__2 => __1 // +
|
||||
addI r_arp,4 => __2 // add offset
|
||||
store __1 => __2 // to y
|
||||
loadI 3 => r_1 // 3
|
||||
addI r_arp,0 => r_2 // add offset
|
||||
load r_2 => r_2 // load address
|
||||
add r_1,r_2 => r_1 // +
|
||||
addI r_arp,4 => r_2 // add offset
|
||||
store r_1 => r_2 // to y
|
||||
|
||||
addI r_arp,0 => __1 // add offset
|
||||
load __1 => __1 // load address
|
||||
addI r_arp,4 => __2 // add offset
|
||||
load __2 => __2 // load address
|
||||
cmp_LT __1,__2 => __1 // <
|
||||
addI r_arp,9 => __2 // add offset
|
||||
store __1 => __2 // to b
|
||||
addI r_arp,13 => __2 // add offset
|
||||
store __1 => __2 // to c
|
||||
addI r_arp,0 => r_1 // add offset
|
||||
load r_1 => r_1 // load address
|
||||
addI r_arp,4 => r_2 // add offset
|
||||
load r_2 => r_2 // load address
|
||||
cmp_LT r_1,r_2 => r_1 // <
|
||||
addI r_arp,9 => r_2 // add offset
|
||||
store r_1 => r_2 // to b
|
||||
addI r_arp,13 => r_2 // add offset
|
||||
store r_1 => r_2 // to c
|
||||
\end{minted}
|
||||
\end{subfigure}
|
||||
\end{figure}
|
||||
|
@ -462,19 +462,19 @@ fi
|
|||
\begin{subfigure}{0.7\textwidth}
|
||||
\caption{Generated ILOC}
|
||||
\begin{minted}{boppi}
|
||||
loadI 2 => __1 // 2
|
||||
loadI 1 => __2 // 1
|
||||
cmp_GT __1,__2 => __1 // >
|
||||
cbr __1 -> if_t0,if_f1 //
|
||||
loadI 2 => r_1 // 2
|
||||
loadI 1 => r_2 // 1
|
||||
cmp_GT r_1,r_2 => r_1 // >
|
||||
cbr r_1 -> if_t0,if_f1 //
|
||||
if_t0: nop //
|
||||
loadI 84 => __2 // 'T'
|
||||
i2c __2 => __2 // 'T'
|
||||
i2i __2 => __1 // result
|
||||
loadI 84 => r_2 // 'T'
|
||||
i2c r_2 => r_2 // 'T'
|
||||
i2i r_2 => r_1 // result
|
||||
jumpI -> if_e2 //
|
||||
if_f1: nop //
|
||||
loadI 70 => __2 // 'F'
|
||||
i2c __2 => __2 // 'F'
|
||||
i2i __2 => __1 // result
|
||||
loadI 70 => r_2 // 'F'
|
||||
i2c r_2 => r_2 // 'F'
|
||||
i2i r_2 => r_1 // result
|
||||
\end{minted}
|
||||
\end{subfigure}
|
||||
\end{figure}
|
||||
|
@ -496,10 +496,10 @@ od
|
|||
\begin{minted}{boppi}
|
||||
jumpI -> while_f1 // to condition
|
||||
while_t0: nop // loop target
|
||||
loadI 1 => __1 // 1
|
||||
loadI 1 => r_1 // 1
|
||||
while_f1: nop // condition target
|
||||
loadI 1 => __1 // true
|
||||
cbr __1 -> while_t0,while_e2 //
|
||||
loadI 1 => r_1 // true
|
||||
cbr r_1 -> while_t0,while_e2 //
|
||||
while_e2: nop // end target
|
||||
\end{minted}
|
||||
\end{subfigure}
|
||||
|
@ -751,18 +751,18 @@ Retrieving the length of an array requires a few steps because the length is onl
|
|||
\caption{Array access snippet from \cref{arrays-code}.}
|
||||
\label{arrays-access-snippet}
|
||||
\begin{minted}{boppi}
|
||||
addI r_arp,0 => __2 // add offset
|
||||
load __2 => __2 // get array object
|
||||
loadI 0 => __3 // 0
|
||||
loadAI __2,-4 => __1 // check array index
|
||||
divI __1,4 => __1 // check array index
|
||||
cmp_LT __3,__1 => __1 // check array index
|
||||
cmp_GE __3,r_nul => __4 // check array index
|
||||
and __1,__4 => __4 // check array index
|
||||
cbr __4 -> nob5,oob4 // check array index
|
||||
addI r_arp,0 => r_2 // add offset
|
||||
load r_2 => r_2 // get array object
|
||||
loadI 0 => r_3 // 0
|
||||
loadAI r_2,-4 => r_1 // check array index
|
||||
divI r_1,4 => r_1 // check array index
|
||||
cmp_LT r_3,r_1 => r_1 // check array index
|
||||
cmp_GE r_3,r_nul => r_4 // check array index
|
||||
and r_1,r_4 => r_4 // check array index
|
||||
cbr r_4 -> nob5,oob4 // check array index
|
||||
oob4: haltI 1634692962 // array index out of bounds
|
||||
nob5: multI __3,4 => __3 // multiply index by size
|
||||
add __2,__3 => __2 // get array index address
|
||||
nob5: multI r_3,4 => r_3 // multiply index by size
|
||||
add r_2,r_3 => r_2 // get array index address
|
||||
\end{minted}
|
||||
\end{figure}
|
||||
|
||||
|
|
|
@ -8,122 +8,122 @@
|
|||
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 => __1 // add offset
|
||||
181 load __1 => __1 // load address
|
||||
182 loadI 1 => __2 // 1
|
||||
183 add __1,__2 => __1 // +
|
||||
184 storeAI __1 => r_arp,-12 // define successor - move result
|
||||
185 loadAI r_arp,-8 => __2 // load ref count
|
||||
186 loadI 1 => __1 // one
|
||||
187 cmp_LE __2,__1 => __2 // check more than one ref
|
||||
188 cbr __2 -> ycl1,ncl2 // remove vars if last reference
|
||||
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 => __1 // define successor - load return address
|
||||
192 jump -> __1 // define successor - go to return address
|
||||
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 => __1 // malloc
|
||||
195 push __1 // malloc
|
||||
196 loadI 12 => __1 // malloc
|
||||
197 push __1 // malloc
|
||||
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 => __1 // malloc
|
||||
200 loadI 179 => __2 // define successor - load target address
|
||||
201 storeAI __2 => __1,0 // define successor - set target address
|
||||
202 storeAI r_arp => __1,4 // define successor - copy ARP
|
||||
203 loadI 20 => __2 // define successor - load AR size
|
||||
204 storeAI __2 => __1,8 // define successor - set AR size
|
||||
205 storeAI __1 => r_arp,0 // define successor - set function reference
|
||||
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 => __1 // AR incRef
|
||||
208 cbr __1 -> aril3,arid4 // AR incRef
|
||||
209 aril3: loadI 214 => __1 // AR incRef
|
||||
210 push __1 // AR incRef
|
||||
211 subI ART,16 => __1 // AR incRef
|
||||
212 push __1 // 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 => __1 // AR incRef
|
||||
216 cbr __1 -> aril3,arid4 // 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 => __1 // add offset
|
||||
219 in "" => __1 //
|
||||
220 addI r_arp,4 => __2 // add offset
|
||||
221 store __1 => __2 // save to var x
|
||||
222 addI r_arp,0 => __3 // add offset
|
||||
223 load __3 => __2 // call successor - load function reference
|
||||
224 loadAI __2,8 => __2 // call successor - load AR size
|
||||
225 loadI 229 => __1 // malloc
|
||||
226 push __1 // malloc
|
||||
227 push __2 // malloc
|
||||
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 => __1 // malloc
|
||||
230 addI __1,16 => __1 // call successor - shift AR
|
||||
231 addI r_arp,4 => __2 // add offset
|
||||
232 load __2 => __2 // load address
|
||||
233 storeAI __2 => __1,0 // call successor - store param 0
|
||||
234 addI r_arp,0 => __4 // add offset
|
||||
235 load __4 => __2 // call successor - load function reference
|
||||
236 storeAI r_arp => __1,-4 // call successor - link caller ARP
|
||||
237 loadAI __2,4 => __3 // call successor - load AL
|
||||
238 storeAI __3 => __1,-16 // call successor - link AL
|
||||
239 loadAI __1,-16 => ART // add ref for callee's AL
|
||||
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 => __3 // AR incRef
|
||||
242 cbr __3 -> aril5,arid6 // AR incRef
|
||||
243 aril5: loadI 248 => __3 // AR incRef
|
||||
244 push __3 // AR incRef
|
||||
245 subI ART,16 => __3 // AR incRef
|
||||
246 push __3 // 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 => __3 // AR incRef
|
||||
250 cbr __3 -> aril5,arid6 // 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 => __3 // call successor - load return address
|
||||
253 storeAI __3 => __1,-8 // call successor - set return address
|
||||
254 i2i __1 => r_arp // call successor - move ARP
|
||||
255 loadAI __2,0 => __3 // call successor - load target address
|
||||
256 jump -> __3 // call successor - execute
|
||||
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 => __2 // AR decRef
|
||||
259 cbr __2 -> ardl7,ardd8 // AR decRef
|
||||
260 ardl7: loadI 265 => __2 // AR decRef
|
||||
261 push __2 // AR decRef
|
||||
262 subI ART,16 => __2 // AR decRef
|
||||
263 push __2 // 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 => __2 // AR decRef
|
||||
267 cbr __2 -> ardl7,ardd8 // 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 => __1 // call successor - load result
|
||||
269 loadAI r_arp,-12 => r_1 // call successor - load result
|
||||
270 loadAI r_arp,-4 => r_arp // call successor - reset ARP
|
||||
271 out "",__1 //
|
||||
272 loadAI r_arp,0 => __3 // remove reference get var
|
||||
273 cmp_EQ __3,r_nul => __2 // remove reference
|
||||
274 cbr __2 -> ynul9,nnul10 // remove reference
|
||||
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 => __2 // free
|
||||
277 push __2 // free
|
||||
278 push __3 // free
|
||||
276 loadI 280 => r_2 // free
|
||||
277 push r_2 // free
|
||||
278 push r_3 // free
|
||||
279 jumpI -> memfree // free
|
||||
280 loadAI __3,4 => __3 // remove reference
|
||||
281 i2i __3 => ART // AR decRef
|
||||
282 cmp_NE ART,r_nul => __2 // AR decRef
|
||||
283 cbr __2 -> ardl11,ardd12 // AR decRef
|
||||
284 ardl11: loadI 289 => __2 // AR decRef
|
||||
285 push __2 // AR decRef
|
||||
286 subI ART,16 => __2 // AR decRef
|
||||
287 push __2 // AR decRef
|
||||
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 => __2 // AR decRef
|
||||
291 cbr __2 -> ardl11,ardd12 // 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 => __3 // free
|
||||
296 push __3 // free
|
||||
295 loadI 299 => r_3 // free
|
||||
296 push r_3 // free
|
||||
297 push r_arp // free
|
||||
298 jumpI -> memfree // free
|
||||
|
|
|
@ -332,6 +332,6 @@ public class Machine {
|
|||
String regs = this.registers.entrySet().parallelStream().sorted((el1, el2) -> el1.getKey().compareTo(el2.getKey())).map((el) -> el.getKey()+": "+String.format("%8x", el.getValue()).replace(" ", ".")).collect(Collectors.joining(", ", "{", "}"));
|
||||
|
||||
return String.format("Registers: %s%nConstants: %s%nMemory: %n%s%n",
|
||||
regs, this.symbMap, this.memory);
|
||||
regs, this.symbMap, this.memory.toString(this));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,8 +2,6 @@ package pp.iloc.eval;
|
|||
|
||||
import java.util.Arrays;
|
||||
|
||||
import pp.s1184725.boppi.ToolChain;
|
||||
|
||||
/** Simulated memory. */
|
||||
public class Memory {
|
||||
/** The default size of the memory, in number of bytes. */
|
||||
|
@ -22,8 +20,8 @@ public class Memory {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the value at a given memory location.
|
||||
* The value is 0 if the location was never accessed before.
|
||||
* Returns the value at a given memory location. The value is 0 if the
|
||||
* location was never accessed before.
|
||||
*/
|
||||
public byte get(int loc) {
|
||||
return this.mem[loc];
|
||||
|
@ -39,79 +37,61 @@ public class Memory {
|
|||
Arrays.fill(this.mem, (byte) 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
/**
|
||||
* Returns the heap area of this memory for a given machine using memlib.
|
||||
*
|
||||
* @param m
|
||||
* the machine to which this memory belongs
|
||||
* @return the heap space of this memory
|
||||
*/
|
||||
public String toString(Machine m) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
// boolean wasEmpty = false;
|
||||
// for (int i = 0; i < size(); i++) {
|
||||
//// if (get(i) == 0) {
|
||||
//// continue;
|
||||
//// }
|
||||
//// if (result.length() > 0) {
|
||||
//// result.append(", ");
|
||||
//// }
|
||||
//// result.append(i);
|
||||
//// result.append(":");
|
||||
//// result.append(String.format("%02X", get(i) & 0xFF));
|
||||
// if (i % 32 == 0) {
|
||||
// boolean anyNonzero = false;
|
||||
//
|
||||
// for (int j = i; j < i+32 && j < size(); j++)
|
||||
// if ((get(j) & 0xFF) != 0) {
|
||||
// anyNonzero = true;
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// if (!anyNonzero) {
|
||||
// if (!wasEmpty)
|
||||
// result.append("\n. . .");
|
||||
// wasEmpty = true;
|
||||
//
|
||||
// i += 31;
|
||||
// continue;
|
||||
// }
|
||||
// else
|
||||
// wasEmpty = false;
|
||||
//
|
||||
// result.append("\n");
|
||||
// result.append(String.format("%08x ", i));
|
||||
// }
|
||||
// if ((get(i) & 0xFF) != 0)
|
||||
// result.append(String.format("%02X", get(i) & 0xFF));
|
||||
// else
|
||||
// result.append("..");
|
||||
// if (i % 4 == 3)
|
||||
// result.append(" ");
|
||||
// }
|
||||
|
||||
int loc = 4;
|
||||
|
||||
System.err.flush();
|
||||
|
||||
while (loc != 0 && loc < ToolChain.machine.getReg("brk")) {
|
||||
int size = ToolChain.machine.load(loc+4);
|
||||
int nloc = ToolChain.machine.load(loc);
|
||||
while (loc != 0 && loc < m.getReg("brk")) {
|
||||
int size = m.load(loc + 4);
|
||||
int nloc = m.load(loc);
|
||||
|
||||
if (!(size == 0 && nloc == 0)) {
|
||||
result.append(String.format("0x%05x ", loc+8));
|
||||
result.append(String.format("0x%05x ", loc + 8));
|
||||
|
||||
if ((nloc >= ToolChain.machine.load(0) && nloc > loc) || nloc == 0)
|
||||
result.append(" free");
|
||||
else
|
||||
result.append(String.format("% 2d ref ", ToolChain.machine.load(loc)));
|
||||
|
||||
for(int i = 0; i < size && i < 40; i += 4) {
|
||||
if (ToolChain.machine.load(loc+8+i) == 0)
|
||||
result.append("........");
|
||||
if ((nloc >= m.load(0) && nloc > loc) || nloc == 0)
|
||||
result.append(" free");
|
||||
else
|
||||
result.append(String.format("%8x", ToolChain.machine.load(loc+8+i)).replace(" ", "."));
|
||||
result.append(" ");
|
||||
result.append(String.format("% 2d ref ", m.load(loc)));
|
||||
|
||||
for (int i = 0; i < size && i < 40; i += 4) {
|
||||
if (m.load(loc + 8 + i) == 0)
|
||||
result.append("........");
|
||||
else
|
||||
result.append(String.format("%8x", m.load(loc + 8 + i)).replace(" ", "."));
|
||||
result.append(" ");
|
||||
}
|
||||
result.append(size > 40 ? "...\n" : "\n");
|
||||
}
|
||||
result.append(size > 40 ? "...\n" : "\n");
|
||||
}
|
||||
loc += size+8;
|
||||
loc += size + 8;
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder result = new StringBuilder();
|
||||
int lineLength = 4 * 8;
|
||||
|
||||
for (int base = 0; base < this.mem.length; base += lineLength) {
|
||||
result.append(String.format("0x%08x ", base));
|
||||
for (int offset = 0; offset < lineLength && base + offset < this.mem.length; offset++) {
|
||||
if (offset % 4 == 0 && offset > 0)
|
||||
result.append(" ");
|
||||
|
||||
result.append(String.format("%02x", this.mem[base + offset]));
|
||||
}
|
||||
result.append("\n");
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -144,11 +144,11 @@ public class Op extends Instr {
|
|||
}
|
||||
else if (getOpCode() == OpCode.out) {
|
||||
int size = sourceSize + targetSize + arrowSize;
|
||||
result.append(String.format("%-8s", getOpCode().name()));
|
||||
result.append(String.format("%-9s", getOpCode().name()));
|
||||
result.append(String.format("%-" + size + "s ", toSourceString()));
|
||||
result.append(toCommentString());
|
||||
} else {
|
||||
result.append(String.format("%-8s", getOpCode().name()));
|
||||
result.append(String.format("%-9s", getOpCode().name()));
|
||||
if (sourceSize > 0) {
|
||||
result.append(String.format("%-" + sourceSize + "s",
|
||||
toSourceString()));
|
||||
|
|
|
@ -125,7 +125,7 @@ public class RegisterPool {
|
|||
logger.warning(String.format("Using more than %d registers. Consider rebalancing your expressions.",
|
||||
RECOMMENDED_REGISTER_COUNT));
|
||||
|
||||
return new Reg("__" + (regInUse.size() + 1));
|
||||
return new Reg("r_" + (regInUse.size() + 1));
|
||||
});
|
||||
|
||||
regFree.remove(reg);
|
||||
|
|
Loading…
Reference in New Issue