|
15 | 15 | ;; Op0 -> Asm |
16 | 16 | (define (compile-op0 p) |
17 | 17 | (match p |
18 | | - ['void (seq (Mov rax val-void))] |
| 18 | + ['void (seq (Mov rax (value->bits (void))))] |
19 | 19 | ['read-byte (seq pad-stack |
20 | 20 | (Call 'read_byte) |
21 | 21 | unpad-stack)] |
|
28 | 28 | (match p |
29 | 29 | ['add1 |
30 | 30 | (seq (assert-integer rax) |
31 | | - (Add rax (imm->bits 1)))] |
| 31 | + (Add rax (value->bits 1)))] |
32 | 32 | ['sub1 |
33 | 33 | (seq (assert-integer rax) |
34 | | - (Sub rax (imm->bits 1)))] |
| 34 | + (Sub rax (value->bits 1)))] |
35 | 35 | ['zero? |
36 | 36 | (seq (assert-integer rax) |
37 | | - (eq-imm 0))] |
| 37 | + (eq-value 0))] |
38 | 38 | ['char? |
39 | 39 | (type-pred mask-char type-char)] |
40 | 40 | ['char->integer |
|
46 | 46 | (Sar rax int-shift) |
47 | 47 | (Sal rax char-shift) |
48 | 48 | (Xor rax type-char))] |
49 | | - ['eof-object? (eq-imm eof)] |
| 49 | + ['eof-object? (eq-value eof)] |
50 | 50 | ['write-byte |
51 | 51 | (seq (assert-byte rax) |
52 | 52 | pad-stack |
53 | 53 | (Mov rdi rax) |
54 | 54 | (Call 'write_byte) |
55 | 55 | unpad-stack |
56 | | - (Mov rax val-void))] |
| 56 | + (Mov rax (value->bits (void))))] |
57 | 57 | ['box |
58 | 58 | (seq (Mov (Offset rbx 0) rax) |
59 | 59 | (Mov rax rbx) |
|
71 | 71 | (seq (assert-cons rax) |
72 | 72 | (Xor rax type-cons) |
73 | 73 | (Mov rax (Offset rax 0)))] |
74 | | - ['empty? (eq-imm '())] |
| 74 | + ['empty? (eq-value '())] |
75 | 75 | ['box? |
76 | 76 | (type-pred ptr-mask type-box)] |
77 | 77 | ['cons? |
|
126 | 126 | (assert-integer r8) |
127 | 127 | (assert-integer rax) |
128 | 128 | (Cmp r8 rax) |
129 | | - (Mov rax val-true) |
130 | | - (let ((true (gensym))) |
131 | | - (seq (Jl true) |
132 | | - (Mov rax val-false) |
133 | | - (Label true))))] |
| 129 | + (if-lt))] |
134 | 130 | ['= |
135 | 131 | (seq (Pop r8) |
136 | 132 | (assert-integer r8) |
137 | 133 | (assert-integer rax) |
138 | 134 | (Cmp r8 rax) |
139 | | - (Mov rax val-true) |
140 | | - (let ((true (gensym))) |
141 | | - (seq (Je true) |
142 | | - (Mov rax val-false) |
143 | | - (Label true))))] |
| 135 | + (if-equal))] |
144 | 136 | ['cons |
145 | 137 | (seq (Mov (Offset rbx 0) rax) |
146 | 138 | (Pop rax) |
|
150 | 142 | (Add rbx 16))] |
151 | 143 | ['eq? |
152 | 144 | (seq (Pop r8) |
153 | | - (eq r8 rax))] |
| 145 | + (Cmp rax r8) |
| 146 | + (if-equal))] |
154 | 147 | ['make-vector |
155 | 148 | (let ((loop (gensym)) |
156 | 149 | (done (gensym)) |
|
275 | 268 | (Sal r10 3) |
276 | 269 | (Add r8 r10) |
277 | 270 | (Mov (Offset r8 8) rax) |
278 | | - (Mov rax val-void))])) |
| 271 | + (Mov rax (value->bits (void))))])) |
279 | 272 |
|
280 | 273 |
|
281 | 274 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
291 | 284 | (let ((l (gensym))) |
292 | 285 | (seq (And rax mask) |
293 | 286 | (Cmp rax type) |
294 | | - (Mov rax (imm->bits #t)) |
| 287 | + (Mov rax (value->bits #t)) |
295 | 288 | (Je l) |
296 | | - (Mov rax (imm->bits #f)) |
| 289 | + (Mov rax (value->bits #f)) |
297 | 290 | (Label l)))) |
298 | 291 |
|
299 | 292 | (define assert-integer |
|
312 | 305 | (define (assert-codepoint r) |
313 | 306 | (let ((ok (gensym))) |
314 | 307 | (seq (assert-integer r) |
315 | | - (Cmp r (imm->bits 0)) |
| 308 | + (Cmp r (value->bits 0)) |
316 | 309 | (Jl 'raise_error_align) |
317 | | - (Cmp r (imm->bits 1114111)) |
| 310 | + (Cmp r (value->bits 1114111)) |
318 | 311 | (Jg 'raise_error_align) |
319 | | - (Cmp r (imm->bits 55295)) |
| 312 | + (Cmp r (value->bits 55295)) |
320 | 313 | (Jl ok) |
321 | | - (Cmp r (imm->bits 57344)) |
| 314 | + (Cmp r (value->bits 57344)) |
322 | 315 | (Jg ok) |
323 | 316 | (Jmp 'raise_error_align) |
324 | 317 | (Label ok)))) |
325 | 318 |
|
326 | 319 | (define (assert-byte r) |
327 | 320 | (seq (assert-integer r) |
328 | | - (Cmp r (imm->bits 0)) |
| 321 | + (Cmp r (value->bits 0)) |
329 | 322 | (Jl 'raise_error_align) |
330 | | - (Cmp r (imm->bits 255)) |
| 323 | + (Cmp r (value->bits 255)) |
331 | 324 | (Jg 'raise_error_align))) |
332 | 325 |
|
333 | 326 | (define (assert-natural r) |
334 | 327 | (seq (assert-integer r) |
335 | | - (Cmp r (imm->bits 0)) |
| 328 | + (Cmp r (value->bits 0)) |
336 | 329 | (Jl 'raise_error_align))) |
337 | 330 |
|
| 331 | +;; -> Asm |
| 332 | +;; set rax to #t or #f based on given comparison |
| 333 | +(define (if-compare c) |
| 334 | + (seq (Mov rax (value->bits #f)) |
| 335 | + (Mov r9 (value->bits #t)) |
| 336 | + (c rax r9))) |
| 337 | + |
| 338 | +(define (if-equal) (if-compare Cmove)) |
| 339 | +(define (if-lt) (if-compare Cmovl)) |
| 340 | + |
338 | 341 | ;; Value -> Asm |
339 | | -(define (eq-imm imm) |
340 | | - (let ((l1 (gensym))) |
341 | | - (seq (Cmp rax (imm->bits imm)) |
342 | | - (Mov rax val-true) |
343 | | - (Je l1) |
344 | | - (Mov rax val-false) |
345 | | - (Label l1)))) |
346 | | - |
347 | | -(define (eq ir1 ir2) |
348 | | - (let ((l1 (gensym))) |
349 | | - (seq (Cmp ir1 ir2) |
350 | | - (Mov rax val-true) |
351 | | - (Je l1) |
352 | | - (Mov rax val-false) |
353 | | - (Label l1)))) |
| 342 | +(define (eq-value v) |
| 343 | + (seq (Cmp rax (value->bits v)) |
| 344 | + (if-equal))) |
354 | 345 |
|
355 | 346 | ;; Asm |
356 | 347 | ;; Dynamically pad the stack to be aligned for a call |
|
0 commit comments