-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathcompile.rkt
More file actions
33 lines (28 loc) · 796 Bytes
/
compile.rkt
File metadata and controls
33 lines (28 loc) · 796 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#lang racket
(provide compile con-compiler)
(require "ast.rkt" "../a86/ast.rkt"
"../blackmail/compile.rkt")
(define con-compiler
(class blackmail-compiler
(super-new)
(inherit compile)
;; Expr -> Asm
(define/override (compile-e e)
(match e
[(IfZero e1 e2 e3) (compile-ifzero e1 e2 e3)]
[_ (super compile-e e)]))
;; Expr Expr Expr -> Asm
(define (compile-ifzero e1 e2 e3)
(let ((l1 (gensym 'if))
(l2 (gensym 'if)))
(seq (compile-e e1)
(Cmp 'rax 0)
(Je l1)
(compile-e e3)
(Jmp l2)
(Label l1)
(compile-e e2)
(Label l2))))))
(define compile
(let ([compiler (new con-compiler)])
(λ (p) (send compiler compile p))))