|
28 | 28 | {:> E0 F} (Sub rsp 8) |
29 | 29 | {:> A F} (compile-e e) |
30 | 30 | {:> E0 F} (Add rsp 8) |
31 | | - {:> F} (Push r15) {:> F} ; save callee-saved register |
| 31 | + {:> F} ;; save callee-saved register |
| 32 | + {:> F} (Push r15) |
32 | 33 | {:> H0} (Push rbx) |
33 | | - {:> H0} (Mov rbx rdi) {:> H0} ; recv heap pointer |
34 | | - {:> F} (compile-e e '()) |
| 34 | + {:> H0} ;; recv heap pointer |
| 35 | + {:> H0} (Mov rbx rdi) |
| 36 | + {:> F} (compile-e e '()) |
35 | 37 | {:> H0} (Pop rbx) |
36 | | - {:> F} (Pop r15) {:> F} ; restore callee-save register |
| 38 | + {:> F} ;; restore callee-save register |
| 39 | + {:> F} (Pop r15) |
37 | 40 | (Ret) |
38 | 41 | {:> E1} ;; Error handler |
39 | 42 | {:> E1} (Label 'err) |
|
61 | 64 | {:> L} |
62 | 65 | (compile-e e (reverse (define-ids ds)) #f) |
63 | 66 | {:> L} |
64 | | - (Add rsp (* 8 (length ds))) {:> L} ;; pop function definitions |
| 67 | + (Add rsp (* 8 (length ds))) {:> L} ;; pop function definitions |
65 | 68 | (Pop r15) ; restore callee-save register |
66 | 69 | (Pop rbx) |
67 | 70 | (Ret) |
|
122 | 125 | (match l |
123 | 126 | [(Lam f xs e) |
124 | 127 | (let ((env (append (reverse fvs) (reverse xs) (list #f)))) |
125 | | - (seq (Label (symbol->label f)) |
| 128 | + (seq (Label (symbol->label f)) |
126 | 129 | (Mov rax (Offset rsp (* 8 (length xs)))) |
127 | 130 | (Xor rax type-proc) |
128 | 131 | (copy-env-to-stack fvs 8) |
|
151 | 154 | {:> A D0} |
152 | 155 | [(Lit i) (seq (Mov rax i))] |
153 | 156 | {:> D0} |
154 | | - [(Lit d) (compile-value d)] |
| 157 | + [(Lit d) (compile-value d)] |
155 | 158 | {:> E0} |
156 | | - [(Eof) (compile-value eof)] |
| 159 | + [(Eof) (compile-value eof)] |
157 | 160 | {:> H0} |
158 | | - [(Empty) (compile-value '())] |
| 161 | + [(Empty) (compile-value '())] |
159 | 162 | {:> F} |
160 | | - [(Var x) (compile-variable x c)] |
| 163 | + [(Var x) (compile-variable x c)] |
161 | 164 | {:> E0} |
162 | | - [(Prim0 p) (compile-prim0 p)] |
| 165 | + [(Prim0 p) (compile-prim0 p)] |
163 | 166 | {:> B} |
164 | | - [(Prim1 p e) (compile-prim1 p e {:> F} c)] |
| 167 | + [(Prim1 p e) (compile-prim1 p e {:> F} c)] |
165 | 168 | {:> F} |
166 | 169 | [(Prim2 p e1 e2) (compile-prim2 p e1 e2 c)] |
167 | 170 | {:> H1} |
|
186 | 189 | (compile-app e es c t?)] |
187 | 190 | {:> L} |
188 | 191 | [(Lam f xs e) |
189 | | - (compile-lam f xs e c)] |
| 192 | + (compile-lam f xs e c)] |
190 | 193 | {:> K} |
191 | 194 | [(Match e ps es) (compile-match e ps es c t?)])) |
192 | 195 |
|
|
235 | 238 | (compile-op0 p)) |
236 | 239 |
|
237 | 240 | {:> B F} ;; Op1 Expr -> Asm |
238 | | -{:> F} ;; Op1 Expr CEnv -> Asm |
239 | | -{:> B} |
240 | | -(define (compile-prim1 p e {:> F} c) |
241 | | - (seq (compile-e e {:> F} c {:> J} #f) |
| 241 | +{:> B F} |
| 242 | +(define (compile-prim1 p e) |
| 243 | + (seq (compile-e e) |
| 244 | + (compile-op1 p))) |
| 245 | + |
| 246 | +{:> F J} ;; Op1 Expr CEnv -> Asm |
| 247 | +{:> F J} |
| 248 | +(define (compile-prim1 p e c) |
| 249 | + (seq (compile-e e c) |
| 250 | + (compile-op1 p))) |
| 251 | + |
| 252 | +{:> J} |
| 253 | +(define (compile-prim1 p e c) |
| 254 | + (seq (compile-e e c #f) |
242 | 255 | (compile-op1 p))) |
243 | 256 |
|
244 | 257 | {:> F} ;; Op2 Expr Expr CEnv -> Asm |
|
259 | 272 | (compile-e e3 (cons #f (cons #f c)) {:> J} #f) |
260 | 273 | (compile-op3 p))) |
261 | 274 |
|
262 | | - |
263 | 275 | {:> C D0} ;; Expr Expr Expr -> Asm |
264 | 276 | {:> C D0} |
265 | 277 | (define (compile-ifzero e1 e2 e3) |
|
377 | 389 | (i (* 8 (length es)))) |
378 | 390 | (seq (Lea rax r) |
379 | 391 | (Push rax) |
380 | | - (compile-es (cons e es) (cons #f c)) |
| 392 | + (compile-es (cons e es) (cons #f c)) |
381 | 393 | (Mov rax (Offset rsp i)) |
382 | 394 | (assert-proc rax) |
383 | 395 | (Xor rax type-proc) |
|
402 | 414 | [(cons (Defn f xs e) ds) |
403 | 415 | (let ((fvs (fv (Lam f xs e)))) |
404 | 416 | (seq (Lea rax (symbol->label f)) |
405 | | - (Mov (Offset rbx off) rax) |
| 417 | + (Mov (Offset rbx off) rax) |
406 | 418 | (Mov rax rbx) |
407 | 419 | (Add rax off) |
408 | 420 | (Or rax type-proc) |
|
431 | 443 |
|
432 | 444 | {:> L} ;; Id [Listof Id] Expr CEnv -> Asm |
433 | 445 | {:> L} |
434 | | -(define (compile-lam f xs e c) |
| 446 | +(define (compile-lam f xs e c) |
435 | 447 | (let ((fvs (fv (Lam f xs e)))) |
436 | 448 | (seq (Lea rax (symbol->label f)) |
437 | 449 | (Mov (Offset rbx 0) rax) |
438 | 450 | (free-vars-to-heap fvs c 8) |
439 | 451 | (Mov rax rbx) ; return value |
440 | | - (Or rax type-proc) |
| 452 | + (Or rax type-proc) |
441 | 453 | (Add rbx (* 8 (add1 (length fvs))))))) |
442 | 454 |
|
443 | 455 | {:> L} ;; [Listof Id] CEnv Int -> Asm |
|
0 commit comments