|
1 | 1 | #lang crook |
2 | | -{:= A B C D0 D1 E0 E1 F H0 H1 I J K} |
| 2 | +{:= A B C D0 D0.A D1 E0 E1 F H0 H1 I J K} |
3 | 3 | (provide (all-defined-out)) |
4 | 4 | (require "ast.rkt") |
5 | 5 | {:> B} (require "compile-ops.rkt") |
|
13 | 13 | {:> J} (define r8 'r8) {:> J} ; scratch |
14 | 14 | {:> F} (define r15 'r15) {:> F} ; stack pad (non-volatile) |
15 | 15 |
|
16 | | -{:> A I} ;; Expr -> Asm |
17 | | -{:> A I} |
| 16 | +{:> A H0} ;; Expr -> Asm |
| 17 | +{:> A H0} |
18 | 18 | (define (compile e) |
19 | 19 | (prog (Global 'entry) |
20 | 20 | {:> E0} (Extern 'peek_byte) |
21 | 21 | {:> E0} (Extern 'read_byte) |
22 | 22 | {:> E0} (Extern 'write_byte) |
23 | 23 | {:> E1} (Extern 'raise_error) |
24 | 24 | (Label 'entry) |
25 | | - {:> E0 F} (Sub rsp 8) |
26 | | - {:> A F} (compile-e e) |
27 | | - {:> E0 F} (Add rsp 8) |
| 25 | + {:> E0 H0} (Sub rsp 8) |
| 26 | + {:> A H0} (compile-e e) |
| 27 | + {:> E0 H0} (Add rsp 8) |
28 | 28 | {:> F} (Push r15) {:> F} ; save callee-saved register |
29 | 29 | {:> H0} (Push rbx) |
30 | 30 | {:> H0} (Mov rbx rdi) {:> H0} ; recv heap pointer |
|
86 | 86 | {:> J} ;; Expr CEnv Boolean -> Asm |
87 | 87 | (define (compile-e e {:> F} c {:> J} t?) |
88 | 88 | (match e |
89 | | - {:> A D0} |
| 89 | + {:> A C} |
90 | 90 | [(Lit i) (seq (Mov rax i))] |
91 | 91 | {:> D0} |
92 | 92 | [(Lit d) (compile-value d)] |
|
104 | 104 | [(Prim2 p e1 e2) (compile-prim2 p e1 e2 c)] |
105 | 105 | {:> H1} |
106 | 106 | [(Prim3 p e1 e2 e3) (compile-prim3 p e1 e2 e3 c)] |
107 | | - {:> C D0} |
| 107 | + {:> C C} |
108 | 108 | [(IfZero e1 e2 e3) |
109 | | - (compile-ifzero e1 e2 e3 {:> J} t?)] |
| 109 | + (compile-ifzero e1 e2 e3)] |
110 | 110 | {:> D0} |
111 | 111 | [(If e1 e2 e3) |
112 | 112 | (compile-if e1 e2 e3 {:> F} c {:> J} t?)] |
|
125 | 125 | {:> D0} ;; Value -> Asm |
126 | 126 | {:> D0} |
127 | 127 | (define (compile-value v) |
128 | | - {:> D0 H1} |
| 128 | + {:> D0 H0} |
129 | 129 | (seq (Mov rax (value->bits v))) |
130 | 130 | {:> H1} |
131 | 131 | (cond [(string? v) (compile-string v)] |
|
166 | 166 | (define (compile-prim0 p) |
167 | 167 | (compile-op0 p)) |
168 | 168 |
|
169 | | -{:> B F} ;; Op1 Expr -> Asm |
170 | | -{:> F} ;; Op1 Expr CEnv -> Asm |
| 169 | +{:> B H0} ;; Op1 Expr -> Asm |
| 170 | +{:> F} ;; Op1 Expr CEnv -> Asm |
171 | 171 | {:> B} |
172 | 172 | (define (compile-prim1 p e {:> F} c) |
173 | 173 | (seq (compile-e e {:> F} c {:> J} #f) |
|
192 | 192 | (compile-op3 p))) |
193 | 193 |
|
194 | 194 |
|
195 | | -{:> C D0} ;; Expr Expr Expr -> Asm |
196 | | -{:> C D0} |
| 195 | +{:> C C} ;; Expr Expr Expr -> Asm |
| 196 | +{:> C C} |
197 | 197 | (define (compile-ifzero e1 e2 e3) |
198 | 198 | (let ((l1 (gensym 'ifz)) |
199 | 199 | (l2 (gensym 'ifz))) |
|
206 | 206 | (compile-e e3) |
207 | 207 | (Label l2)))) |
208 | 208 |
|
209 | | -{:> D0 F} ;; Expr Expr Expr -> Asm |
210 | | -{:> F J} ;; Expr Expr Expr CEnv -> Asm |
211 | | -{:> J} ;; Expr Expr Expr CEnv Boolean -> Asm |
| 209 | +{:> D0 H0} ;; Expr Expr Expr -> Asm |
| 210 | +{:> F I} ;; Expr Expr Expr CEnv -> Asm |
| 211 | +{:> J} ;; Expr Expr Expr CEnv Boolean -> Asm |
212 | 212 | {:> D0} |
213 | 213 | (define (compile-if e1 e2 e3 {:> F} c {:> J} t?) |
214 | 214 | (let ((l1 (gensym 'if)) |
|
222 | 222 | (compile-e e3 {:> F} c {:> J} t?) |
223 | 223 | (Label l2)))) |
224 | 224 |
|
225 | | -{:> E0 F} ;; Expr Expr -> Asm |
226 | | -{:> F J} ;; Expr Expr CEnv -> Asm |
227 | | -{:> J} ;; Expr Expr CEnv Boolean -> Asm |
| 225 | +{:> E0 H0} ;; Expr Expr -> Asm |
| 226 | +{:> F I} ;; Expr Expr CEnv -> Asm |
| 227 | +{:> J} ;; Expr Expr CEnv Boolean -> Asm |
228 | 228 | {:> E0} |
229 | 229 | (define (compile-begin e1 e2 {:> F} c {:> J} t?) |
230 | 230 | (seq (compile-e e1 {:> F} c {:> J} #f) |
231 | 231 | (compile-e e2 {:> F} c {:> J} t?))) |
232 | 232 |
|
233 | | -{:> F J} ;; Id Expr Expr CEnv -> Asm |
| 233 | +{:> F I} ;; Id Expr Expr CEnv -> Asm |
234 | 234 | {:> J} ;; Id Expr Expr CEnv -> Asm |
235 | 235 | {:> F} |
236 | 236 | (define (compile-let x e1 e2 c {:> J} t?) |
|
267 | 267 | {:> I} ;; Id [Listof Expr] CEnv -> Asm |
268 | 268 | {:> I} ;; The return address is placed above the arguments, so callee pops |
269 | 269 | {:> I} ;; arguments and return address is next frame |
270 | | -{:> I J} |
| 270 | +{:> I I} |
271 | 271 | (define (compile-app f es c) |
272 | 272 | (let ((r (gensym 'ret))) |
273 | 273 | (seq (Lea rax r) |
|
0 commit comments