|
19 | 19 | (define (compile-e e c t?) |
20 | 20 | (match e |
21 | 21 | [(Quote d) (compile-datum d)] |
22 | | - [(Eof) (seq (Mov rax (imm->bits eof)))] |
| 22 | + [(Eof) (seq (Mov rax (value->bits eof)))] |
23 | 23 | [(Var x) (compile-variable x c)] |
24 | 24 | [(Prim0 p) (compile-prim0 p c)] |
25 | 25 | [(Prim1 p e) (compile-prim1 p e c)] |
|
214 | 214 | (define (compile-match-clause p e c done t?) |
215 | 215 | (let ((next (gensym))) |
216 | 216 | (match (compile-pattern p '() next) |
217 | | - [(list i f cm) |
| 217 | + [(list i cm) |
218 | 218 | (seq (Mov rax (Offset rsp 0)) ; restore value being matched |
219 | 219 | i |
220 | 220 | (compile-e e (append cm c) t?) |
221 | 221 | (Add rsp (* 8 (length cm))) |
222 | 222 | (Jmp done) |
223 | | - f |
224 | 223 | (Label next))]))) |
225 | 224 |
|
226 | | -;; Pat CEnv Symbol -> (list Asm Asm CEnv) |
| 225 | +;; Pat CEnv Symbol -> (list Asm CEnv) |
227 | 226 | (define (compile-pattern p cm next) |
228 | 227 | (match p |
229 | 228 | [(PWild) |
230 | | - (list (seq) (seq) cm)] |
| 229 | + (list (seq) cm)] |
231 | 230 | [(PVar x) |
232 | | - (list (seq (Push rax)) |
233 | | - (seq) |
234 | | - (cons x cm))] |
| 231 | + (list (seq (Push rax)) (cons x cm))] |
235 | 232 | [(PStr s) |
236 | | - (let ((fail (gensym))) |
| 233 | + (let ((ok (gensym)) |
| 234 | + (fail (gensym))) |
237 | 235 | (list (seq (Lea rdi (symbol->data-label (string->symbol s))) |
238 | 236 | (Mov r8 rax) |
239 | 237 | (And r8 ptr-mask) |
240 | 238 | (Cmp r8 type-str) |
241 | | - (Jne fail) |
| 239 | + (Je ok) |
| 240 | + (Label fail) |
| 241 | + (Add rsp (* 8 (length cm))) |
| 242 | + (Jmp next) |
| 243 | + (Label ok) |
242 | 244 | (Xor rax type-str) |
243 | 245 | (Mov rsi rax) |
244 | 246 | pad-stack |
245 | 247 | (Call 'symb_cmp) |
246 | 248 | unpad-stack |
247 | 249 | (Cmp rax 0) |
248 | 250 | (Jne fail)) |
249 | | - (seq (Label fail) |
250 | | - (Add rsp (* 8 (length cm))) |
251 | | - (Jmp next)) |
252 | 251 | cm))] |
253 | 252 | [(PSymb s) |
254 | | - (let ((fail (gensym))) |
| 253 | + (let ((ok (gensym))) |
255 | 254 | (list (seq (Lea r9 (Plus (symbol->data-label s) type-symb)) |
256 | 255 | (Cmp rax r9) |
257 | | - (Jne fail)) |
258 | | - (seq (Label fail) |
| 256 | + (Je ok) |
259 | 257 | (Add rsp (* 8 (length cm))) |
260 | | - (Jmp next)) |
| 258 | + (Jmp next) |
| 259 | + (Label ok)) |
261 | 260 | cm))] |
262 | 261 | [(PLit l) |
263 | | - (let ((fail (gensym))) |
264 | | - (list (seq (Cmp rax (imm->bits l)) |
265 | | - (Jne fail)) |
266 | | - (seq (Label fail) |
| 262 | + (let ((ok (gensym))) |
| 263 | + (list (seq (Cmp rax (value->bits l)) |
| 264 | + (Je ok) |
267 | 265 | (Add rsp (* 8 (length cm))) |
268 | | - (Jmp next)) |
| 266 | + (Jmp next) |
| 267 | + (Label ok)) |
269 | 268 | cm))] |
270 | 269 | [(PAnd p1 p2) |
271 | 270 | (match (compile-pattern p1 (cons #f cm) next) |
272 | | - [(list i1 f1 cm1) |
| 271 | + [(list i1 cm1) |
273 | 272 | (match (compile-pattern p2 cm1 next) |
274 | | - [(list i2 f2 cm2) |
| 273 | + [(list i2 cm2) |
275 | 274 | (list |
276 | 275 | (seq (Push rax) |
277 | 276 | i1 |
278 | 277 | (Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm))))) |
279 | 278 | i2) |
280 | | - (seq f1 f2) |
281 | 279 | cm2)])])] |
282 | 280 | [(PBox p) |
283 | 281 | (match (compile-pattern p cm next) |
284 | | - [(list i1 f1 cm1) |
285 | | - (let ((fail (gensym))) |
| 282 | + [(list i1 cm1) |
| 283 | + (let ((ok (gensym))) |
286 | 284 | (list |
287 | 285 | (seq (Mov r8 rax) |
288 | 286 | (And r8 ptr-mask) |
289 | 287 | (Cmp r8 type-box) |
290 | | - (Jne fail) |
| 288 | + (Je ok) |
| 289 | + (Add rsp (* 8 (length cm))) ; haven't pushed anything yet |
| 290 | + (Jmp next) |
| 291 | + (Label ok) |
291 | 292 | (Xor rax type-box) |
292 | 293 | (Mov rax (Offset rax 0)) |
293 | 294 | i1) |
294 | | - (seq f1 |
295 | | - (Label fail) |
296 | | - (Add rsp (* 8 (length cm))) ; haven't pushed anything yet |
297 | | - (Jmp next)) |
298 | 295 | cm1))])] |
299 | 296 | [(PCons p1 p2) |
300 | 297 | (match (compile-pattern p1 (cons #f cm) next) |
301 | | - [(list i1 f1 cm1) |
| 298 | + [(list i1 cm1) |
302 | 299 | (match (compile-pattern p2 cm1 next) |
303 | | - [(list i2 f2 cm2) |
304 | | - (let ((fail (gensym))) |
| 300 | + [(list i2 cm2) |
| 301 | + (let ((ok (gensym))) |
305 | 302 | (list |
306 | 303 | (seq (Mov r8 rax) |
307 | 304 | (And r8 ptr-mask) |
308 | 305 | (Cmp r8 type-cons) |
309 | | - (Jne fail) |
| 306 | + (Je ok) |
| 307 | + (Add rsp (* 8 (length cm))) ; haven't pushed anything yet |
| 308 | + (Jmp next) |
| 309 | + (Label ok) |
310 | 310 | (Xor rax type-cons) |
311 | 311 | (Mov r8 (Offset rax 0)) |
312 | 312 | (Push r8) ; push cdr |
313 | 313 | (Mov rax (Offset rax 8)) ; mov rax car |
314 | 314 | i1 |
315 | 315 | (Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm))))) |
316 | 316 | i2) |
317 | | - (seq f1 |
318 | | - f2 |
319 | | - (Label fail) |
320 | | - (Add rsp (* 8 (length cm))) ; haven't pushed anything yet |
321 | | - (Jmp next)) |
322 | 317 | cm2))])])])) |
0 commit comments