|
2 | 2 | (provide compile-op0 compile-op1 compile-op2 compile-op3 pad-stack assert-cons) |
3 | 3 | (require "ast.rkt") |
4 | 4 | (require "types.rkt") |
| 5 | +(require "assert.rkt") |
5 | 6 | (require a86/ast) |
6 | 7 |
|
7 | 8 | (define rax 'rax) |
|
44 | 45 | (Sar rax char-shift) |
45 | 46 | (Sal rax int-shift))] |
46 | 47 | ['integer->char |
47 | | - (seq (assert-codepoint) |
| 48 | + (seq (assert-codepoint rax) |
48 | 49 | (Sar rax int-shift) |
49 | 50 | (Sal rax char-shift) |
50 | 51 | (Xor rax type-char))] |
51 | 52 | ['eof-object? |
52 | 53 | (seq (Cmp rax (value->bits eof)) |
53 | 54 | if-equal)] |
54 | 55 | ['write-byte |
55 | | - (seq assert-byte |
| 56 | + (seq (assert-byte rax) |
56 | 57 | pad-stack |
57 | 58 | (Mov rdi rax) |
58 | 59 | (Call 'write_byte) |
|
270 | 271 | (Mov (Offset r8 8) rax) |
271 | 272 | (Mov rax (value->bits (void))))])) |
272 | 273 |
|
| 274 | +(define (type-pred mask type) |
| 275 | + (seq (And rax mask) |
| 276 | + (Cmp rax type) |
| 277 | + if-equal)) |
273 | 278 |
|
274 | | -;; -> Asm |
| 279 | +;; Asm |
275 | 280 | ;; set rax to #t or #f if comparison flag is equal |
276 | 281 | (define if-equal |
277 | 282 | (seq (Mov rax (value->bits #f)) |
278 | 283 | (Mov r9 (value->bits #t)) |
279 | 284 | (Cmove rax r9))) |
280 | 285 |
|
281 | | -;; -> Asm |
| 286 | +;; Asm |
282 | 287 | ;; set rax to #t or #f if comparison flag is less than |
283 | 288 | (define if-lt |
284 | 289 | (seq (Mov rax (value->bits #f)) |
285 | 290 | (Mov r9 (value->bits #t)) |
286 | 291 | (Cmovl rax r9))) |
287 | 292 |
|
288 | | -(define (assert-type mask type) |
289 | | - (λ (arg) |
290 | | - (seq (Mov r9 arg) |
291 | | - (And r9 mask) |
292 | | - (Cmp r9 type) |
293 | | - (Jne 'err)))) |
294 | | - |
295 | | -(define (type-pred mask type) |
296 | | - (seq (And rax mask) |
297 | | - (Cmp rax type) |
298 | | - if-equal)) |
299 | | - |
300 | | -(define assert-integer |
301 | | - (assert-type mask-int type-int)) |
302 | | -(define assert-char |
303 | | - (assert-type mask-char type-char)) |
304 | | -(define assert-box |
305 | | - (assert-type ptr-mask type-box)) |
306 | | -(define assert-cons |
307 | | - (assert-type ptr-mask type-cons)) |
308 | | -(define assert-vector |
309 | | - (assert-type ptr-mask type-vect)) |
310 | | -(define assert-string |
311 | | - (assert-type ptr-mask type-str)) |
312 | | - |
313 | | -(define (assert-codepoint) |
314 | | - (let ((ok (gensym))) |
315 | | - (seq (assert-integer rax) |
316 | | - (Cmp rax (value->bits 0)) |
317 | | - (Jl 'err) |
318 | | - (Cmp rax (value->bits 1114111)) |
319 | | - (Jg 'err) |
320 | | - (Cmp rax (value->bits 55295)) |
321 | | - (Jl ok) |
322 | | - (Cmp rax (value->bits 57344)) |
323 | | - (Jg ok) |
324 | | - (Jmp 'err) |
325 | | - (Label ok)))) |
326 | | - |
327 | | -(define assert-byte |
328 | | - (seq (assert-integer rax) |
329 | | - (Cmp rax (value->bits 0)) |
330 | | - (Jl 'err) |
331 | | - (Cmp rax (value->bits 255)) |
332 | | - (Jg 'err))) |
333 | | - |
334 | | -(define (assert-natural r) |
335 | | - (seq (assert-integer r) |
336 | | - (Cmp r (value->bits 0)) |
337 | | - (Jl 'err))) |
338 | 293 |
|
339 | 294 | ;; Asm |
340 | 295 | ;; Dynamically pad the stack to be aligned for a call |
|
0 commit comments