File tree Expand file tree Collapse file tree 22 files changed +82
-61
lines changed
Expand file tree Collapse file tree 22 files changed +82
-61
lines changed Original file line number Diff line number Diff line change 4141 ['write-byte
4242 (seq (assert-byte)
4343 (Mov rdi rax)
44- (Call 'write_byte )
45- (Mov rax (value->bits (void))))]))
44+ (Call 'write_byte ))]))
4645
4746
4847;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Original file line number Diff line number Diff line change 5050 pad-stack
5151 (Mov rdi rax)
5252 (Call 'write_byte )
53- unpad-stack
54- (Mov rax (value->bits (void))))]))
53+ unpad-stack)]))
5554
5655;; Op2 -> Asm
5756(define (compile-op2 p)
Original file line number Diff line number Diff line change 66(define rax 'rax ) ; return
77(define rsp 'rsp ) ; stack
88(define rdi 'rdi ) ; arg
9+ (define r15 'r15 ) ; stack pad (non-volatile)
910
10- ;; type CEnv = (Listof ID )
11+ ;; type CEnv = (Listof [Maybe Id] )
1112
1213;; Expr -> Asm
1314(define (compile e)
1718 (Extern 'raise_error )
1819 (Global 'entry )
1920 (Label 'entry )
21+ (Push r15) ; save callee-saved register
2022 (compile-e e '() )
23+ (Pop r15) ; restore callee-save register
2124 (Ret)
2225 (Label 'raise_error_align )
2326 pad-stack
Original file line number Diff line number Diff line change 5252 pad-stack
5353 (Mov rdi rax)
5454 (Call 'write_byte )
55- unpad-stack
56- (Mov rax (value->bits (void))))]
55+ unpad-stack)]
5756 ['box
5857 (seq (Mov (Offset rbx 0 ) rax)
5958 (Mov rax rbx)
144143 (seq (Pop r8)
145144 (Cmp rax r8)
146145 (if-equal))]
147- ['make-vector
146+ ['make-vector ;; size value
148147 (let ((loop (gensym))
149148 (done (gensym))
150149 (empty (gensym)))
151- (seq (Pop r8)
150+ (seq (Pop r8) ;; r8 = size
152151 (assert-natural r8)
153152 (Cmp r8 0 ) ; special case empty vector
154153 (Je empty)
174173 (Mov rax type-vect)
175174 (Label done)))]
176175
177- ['vector-ref
176+ ['vector-ref ; vector index
178177 (seq (Pop r8)
179178 (assert-vector r8)
180179 (assert-integer rax)
Original file line number Diff line number Diff line change 77(define rbx 'rbx ) ; heap
88(define rsp 'rsp ) ; stack
99(define rdi 'rdi ) ; arg
10+ (define r15 'r15 ) ; stack pad (non-volatile)
1011
11- ;; type CEnv = [ Listof Variable]
12+ ;; type CEnv = ( Listof [Maybe Id])
1213
1314;; Expr -> Asm
1415(define (compile e)
1920 (Global 'entry )
2021 (Label 'entry )
2122 (Push rbx) ; save callee-saved register
23+ (Push r15)
2224 (Mov rbx rdi) ; recv heap pointer
2325 (compile-e e '() )
24- (Pop rbx) ; restore callee-save register
26+ (Pop r15) ; restore callee-save register
27+ (Pop rbx)
2528 (Ret)
2629 (Label 'raise_error_align )
2730 pad-stack
Original file line number Diff line number Diff line change 4949 pad-stack
5050 (Mov rdi rax)
5151 (Call 'write_byte )
52- unpad-stack
53- (Mov rax val-void))]
52+ unpad-stack)]
5453 ['box
55- (seq (Mov (Offset rbx 0 ) rax)
56- (Mov rax rbx)
57- (Or rax type-box)
58- (Add rbx 8 ))]
54+ (seq (Mov (Offset rbx 0 ) rax) ; memory write
55+ (Mov rax rbx) ; put box in rax
56+ (Or rax type-box) ; tag as a box
57+ (Add rbx 8 ))] ; move rbx 8 bytes over
5958 ['unbox
6059 (seq (assert-box rax)
6160 (Xor rax type-box)
Original file line number Diff line number Diff line change 77(define rbx 'rbx ) ; heap
88(define rsp 'rsp ) ; stack
99(define rdi 'rdi ) ; arg
10+ (define r15 'r15 ) ; stack pad (non-volatile)
1011
11- ;; type CEnv = [ Listof Variable]
12+ ;; type CEnv = ( Listof [Maybe Id])
1213
1314;; Expr -> Asm
1415(define (compile e)
1920 (Global 'entry )
2021 (Label 'entry )
2122 (Push rbx) ; save callee-saved register
23+ (Push r15)
2224 (Mov rbx rdi) ; recv heap pointer
23- (compile-e e '() )
24- (Pop rbx) ; restore callee-save register
25+ (compile-e e '() )
26+ (Pop r15) ; restore callee-save register
27+ (Pop rbx)
2528 (Ret)
2629 (Label 'raise_error_align )
2730 pad-stack
Original file line number Diff line number Diff line change 5252 pad-stack
5353 (Mov rdi rax)
5454 (Call 'write_byte )
55- unpad-stack
56- (Mov rax (value->bits (void))))]
55+ unpad-stack)]
5756 ['box
5857 (seq (Mov (Offset rbx 0 ) rax)
5958 (Mov rax rbx)
Original file line number Diff line number Diff line change 77(define rbx 'rbx ) ; heap
88(define rsp 'rsp ) ; stack
99(define rdi 'rdi ) ; arg
10+ (define r15 'r15 ) ; stack pad (non-volatile)
1011
11- ;; type CEnv = [ Listof Variable]
12+ ;; type CEnv = ( Listof [Maybe Id])
1213
1314;; Prog -> Asm
1415(define (compile p)
1516 (match p
16- [(Prog ds e)
17+ [(Prog ds e)
1718 (prog (externs)
1819 (Global 'entry )
1920 (Label 'entry )
20- (Push rbx) ; save callee-saved register
21+ (Push rbx) ; save callee-saved register
22+ (Push r15)
2123 (Mov rbx rdi) ; recv heap pointer
2224 (compile-e e '() )
23- (Pop rbx) ; restore callee-save register
25+ (Pop r15) ; restore callee-save register
26+ (Pop rbx)
2427 (Ret)
2528 (compile-defines ds)
2629 (Label 'raise_error_align )
Original file line number Diff line number Diff line change 5252 pad-stack
5353 (Mov rdi rax)
5454 (Call 'write_byte )
55- unpad-stack
56- (Mov rax (value->bits (void))))]
55+ unpad-stack)]
5756 ['box
5857 (seq (Mov (Offset rbx 0 ) rax)
5958 (Mov rax rbx)
You can’t perform that action at this time.
0 commit comments