Skip to content

Commit 8bde3ce

Browse files
committed
Treatment for Hustle.
1 parent 30b9f05 commit 8bde3ce

5 files changed

Lines changed: 62 additions & 79 deletions

File tree

langs/hustle/compile-ops.rkt

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
;; Op0 -> Asm
1414
(define (compile-op0 p)
1515
(match p
16-
['void (seq (Mov rax val-void))]
16+
['void (seq (Mov rax (value->bits (void))))]
1717
['read-byte (seq pad-stack
1818
(Call 'read_byte)
1919
unpad-stack)]
@@ -26,18 +26,13 @@
2626
(match p
2727
['add1
2828
(seq (assert-integer rax)
29-
(Add rax (imm->bits 1)))]
29+
(Add rax (value->bits 1)))]
3030
['sub1
3131
(seq (assert-integer rax)
32-
(Sub rax (imm->bits 1)))]
32+
(Sub rax (value->bits 1)))]
3333
['zero?
34-
(let ((l1 (gensym)))
35-
(seq (assert-integer rax)
36-
(Cmp rax 0)
37-
(Mov rax val-true)
38-
(Je l1)
39-
(Mov rax val-false)
40-
(Label l1)))]
34+
(seq (assert-integer rax)
35+
(eq-value 0))]
4136
['char? (type-pred mask-char type-char)]
4237
['char->integer
4338
(seq (assert-char rax)
@@ -48,7 +43,7 @@
4843
(Sar rax int-shift)
4944
(Sal rax char-shift)
5045
(Xor rax type-char))]
51-
['eof-object? (eq-imm val-eof)]
46+
['eof-object? (eq-value eof)]
5247
['write-byte
5348
(seq (assert-byte rax)
5449
pad-stack
@@ -73,7 +68,7 @@
7368
(seq (assert-cons rax)
7469
(Xor rax type-cons)
7570
(Mov rax (Offset rax 0)))]
76-
['empty? (eq-imm val-empty)]
71+
['empty? (eq-value '())]
7772
['cons? (type-pred ptr-mask type-cons)]
7873
['box? (type-pred ptr-mask type-box)]))
7974

@@ -96,21 +91,13 @@
9691
(assert-integer r8)
9792
(assert-integer rax)
9893
(Cmp r8 rax)
99-
(Mov rax val-true)
100-
(let ((true (gensym)))
101-
(seq (Jl true)
102-
(Mov rax val-false)
103-
(Label true))))]
94+
(if-lt))]
10495
['=
10596
(seq (Pop r8)
10697
(assert-integer r8)
10798
(assert-integer rax)
10899
(Cmp r8 rax)
109-
(Mov rax val-true)
110-
(let ((true (gensym)))
111-
(seq (Je true)
112-
(Mov rax val-false)
113-
(Label true))))]
100+
(if-equal))]
114101
['cons
115102
(seq (Mov (Offset rbx 0) rax)
116103
(Pop rax)
@@ -120,7 +107,8 @@
120107
(Add rbx 16))]
121108
['eq?
122109
(seq (Pop r8)
123-
(eq r8 rax))]))
110+
(Cmp rax r8)
111+
(if-equal))]))
124112

125113

126114
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -133,13 +121,9 @@
133121
(Jne 'raise_error_align))))
134122

135123
(define (type-pred mask type)
136-
(let ((l (gensym)))
137-
(seq (And rax mask)
138-
(Cmp rax type)
139-
(Mov rax (imm->bits #t))
140-
(Je l)
141-
(Mov rax (imm->bits #f))
142-
(Label l))))
124+
(seq (And rax mask)
125+
(Cmp rax type)
126+
(if-equal)))
143127

144128
(define assert-integer
145129
(assert-type mask-int type-int))
@@ -153,40 +137,38 @@
153137
(define (assert-codepoint r)
154138
(let ((ok (gensym)))
155139
(seq (assert-integer r)
156-
(Cmp r (imm->bits 0))
140+
(Cmp r (value->bits 0))
157141
(Jl 'raise_error_align)
158-
(Cmp r (imm->bits 1114111))
142+
(Cmp r (value->bits 1114111))
159143
(Jg 'raise_error_align)
160-
(Cmp r (imm->bits 55295))
144+
(Cmp r (value->bits 55295))
161145
(Jl ok)
162-
(Cmp r (imm->bits 57344))
146+
(Cmp r (value->bits 57344))
163147
(Jg ok)
164148
(Jmp 'raise_error_align)
165149
(Label ok))))
166150

167151
(define (assert-byte r)
168152
(seq (assert-integer r)
169-
(Cmp r (imm->bits 0))
153+
(Cmp r (value->bits 0))
170154
(Jl 'raise_error_align)
171-
(Cmp r (imm->bits 255))
155+
(Cmp r (value->bits 255))
172156
(Jg 'raise_error_align)))
173157

174-
;; Imm -> Asm
175-
(define (eq-imm imm)
176-
(let ((l1 (gensym)))
177-
(seq (Cmp rax imm)
178-
(Mov rax val-true)
179-
(Je l1)
180-
(Mov rax val-false)
181-
(Label l1))))
182-
183-
(define (eq ir1 ir2)
184-
(let ((l1 (gensym)))
185-
(seq (Cmp ir1 ir2)
186-
(Mov rax val-true)
187-
(Je l1)
188-
(Mov rax val-false)
189-
(Label l1))))
158+
;; -> Asm
159+
;; set rax to #t or #f based on given comparison
160+
(define (if-compare c)
161+
(seq (Mov rax (value->bits #f))
162+
(Mov r9 (value->bits #t))
163+
(c rax r9)))
164+
165+
(define (if-equal) (if-compare Cmove))
166+
(define (if-lt) (if-compare Cmovl))
167+
168+
;; Value -> Asm
169+
(define (eq-value v)
170+
(seq (Cmp rax (value->bits v))
171+
(if-equal)))
190172

191173
;; Asm
192174
;; Dynamically pad the stack to be aligned for a call

langs/hustle/compile.rkt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
;; Value -> Asm
4747
(define (compile-value v)
48-
(seq (Mov rax (imm->bits v))))
48+
(seq (Mov rax (value->bits v))))
4949

5050
;; Id CEnv -> Asm
5151
(define (compile-variable x c)
@@ -73,7 +73,7 @@
7373
(let ((l1 (gensym 'if))
7474
(l2 (gensym 'if)))
7575
(seq (compile-e e1 c)
76-
(Cmp rax val-false)
76+
(Cmp rax (value->bits #f))
7777
(Je l1)
7878
(compile-e e2 c)
7979
(Jmp l2)

langs/hustle/interp-heap-bits.rkt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
;; Expr REnv Heap -> Answer
1919
(define (interp-env-heap e r h)
2020
(match e
21-
[(Int i) (cons h (imm->bits i))]
22-
[(Bool b) (cons h (imm->bits b))]
23-
[(Char c) (cons h (imm->bits c))]
24-
[(Eof) (cons h (imm->bits eof))]
25-
[(Empty) (cons h (imm->bits '()))]
21+
[(Int i) (cons h (value->bits i))]
22+
[(Bool b) (cons h (value->bits b))]
23+
[(Char c) (cons h (value->bits c))]
24+
[(Eof) (cons h (value->bits eof))]
25+
[(Empty) (cons h (value->bits '()))]
2626
[(Var x) (cons h (lookup r x))]
27-
[(Prim0 'void) (cons h (imm->bits (void)))]
28-
[(Prim0 'read-byte) (cons h (imm->bits (read-byte)))]
29-
[(Prim0 'peek-byte) (cons h (imm->bits (peek-byte)))]
27+
[(Prim0 'void) (cons h (value->bits (void)))]
28+
[(Prim0 'read-byte) (cons h (value->bits (read-byte)))]
29+
[(Prim0 'peek-byte) (cons h (value->bits (peek-byte)))]
3030
[(Prim1 p e)
3131
(match (interp-env-heap e r h)
3232
['err 'err]
@@ -44,7 +44,7 @@
4444
(match (interp-env-heap p r h)
4545
['err 'err]
4646
[(cons h v)
47-
(if (= v (imm->bits #f))
47+
(if (= v (value->bits #f))
4848
(interp-env-heap e2 r h)
4949
(interp-env-heap e1 r h))])]
5050
[(Begin e1 e2)

langs/hustle/interp-prims-heap-bits.rkt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,39 @@
66
;; Op1 Value* Heap -> Answer*
77
(define (interp-prim1 p v h)
88
(match (list p v)
9-
[(list 'add1 (? int-bits? i)) (cons h (+ i (imm->bits 1)))]
10-
[(list 'sub1 (? int-bits? i)) (cons h (- i (imm->bits 1)))]
11-
[(list 'zero? (? int-bits? i)) (cons h (imm->bits (zero? i)))]
12-
[(list 'char? v) (cons h (imm->bits (char-bits? v)))]
13-
[(list 'char->integer (? char-bits?)) (cons h (imm->bits (char->integer (bits->value v))))]
14-
[(list 'integer->char (? cp-bits?)) (cons h (imm->bits (integer->char (bits->value v))))]
15-
[(list 'eof-object? v) (cons h (if (= v (imm->bits eof)) val-true val-false))]
9+
[(list 'add1 (? int-bits? i)) (cons h (+ i (value->bits 1)))]
10+
[(list 'sub1 (? int-bits? i)) (cons h (- i (value->bits 1)))]
11+
[(list 'zero? (? int-bits? i)) (cons h (value->bits (zero? i)))]
12+
[(list 'char? v) (cons h (value->bits (char-bits? v)))]
13+
[(list 'char->integer (? char-bits?)) (cons h (value->bits (char->integer (bits->value v))))]
14+
[(list 'integer->char (? cp-bits?)) (cons h (value->bits (integer->char (bits->value v))))]
15+
[(list 'eof-object? v) (cons h (if (= v (value->bits eof)) val-true val-false))]
1616
[(list 'write-byte (? byte-bits?)) (cons h (begin (write-byte (bits->value v)) val-void))]
1717
[(list 'box v) (alloc-box v h)]
1818
[(list 'unbox (? box-bits? i)) (cons h (heap-ref h i))]
1919
[(list 'car (? cons-bits? i)) (cons h (heap-ref h i))]
2020
[(list 'cdr (? cons-bits? i)) (cons h (heap-ref h (+ i (arithmetic-shift 1 imm-shift))))]
21-
[(list 'empty? v) (cons h (if (= (imm->bits '()) v) val-true val-false))]
21+
[(list 'empty? v) (cons h (if (= (value->bits '()) v) val-true val-false))]
2222
[_ 'err]))
2323

2424
;; Op2 Value* Value* Heap -> Answer*
2525
(define (interp-prim2 p v1 v2 h)
2626
(match (list p v1 v2)
2727
[(list '+ (? int-bits? i1) (? int-bits? i2)) (cons h (+ i1 i2))]
2828
[(list '- (? int-bits? i1) (? int-bits? i2)) (cons h (- i1 i2))]
29-
[(list '< (? int-bits? i1) (? int-bits? i2)) (cons h (imm->bits (< i1 i2)))]
30-
[(list '= (? int-bits? i1) (? int-bits? i2)) (cons h (imm->bits (= i1 i2)))]
31-
[(list 'eq? v1 v2) (cons h (imm->bits (= v1 v2)))]
29+
[(list '< (? int-bits? i1) (? int-bits? i2)) (cons h (value->bits (< i1 i2)))]
30+
[(list '= (? int-bits? i1) (? int-bits? i2)) (cons h (value->bits (= i1 i2)))]
31+
[(list 'eq? v1 v2) (cons h (value->bits (= v1 v2)))]
3232
[(list 'cons v1 v2) (alloc-cons v1 v2 h)]
3333
[_ 'err]))
3434

3535
;; Bits -> Boolean
3636
(define (byte-bits? i)
3737
(and (int-bits? i)
38-
(<= (imm->bits 0) i (imm->bits 255))))
38+
(<= (value->bits 0) i (value->bits 255))))
3939

4040
;; Bits -> Boolean
4141
(define (cp-bits? v)
4242
(and (int-bits? v)
43-
(or (<= (imm->bits 0) v (imm->bits 55295))
44-
(<= (imm->bits 57344) v (imm->bits 1114111)))))
43+
(or (<= (value->bits 0) v (value->bits 55295))
44+
(<= (value->bits 57344) v (value->bits 1114111)))))

langs/hustle/types.rkt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
[(= b val-empty) '()]
3131
[else (error "invalid bits")]))
3232

33-
(define (imm->bits v)
33+
(define (value->bits v)
3434
(cond [(eof-object? v) val-eof]
3535
[(integer? v) (arithmetic-shift v int-shift)]
3636
[(char? v)
@@ -39,7 +39,8 @@
3939
[(eq? v #t) val-true]
4040
[(eq? v #f) val-false]
4141
[(void? v) val-void]
42-
[(empty? v) val-empty]))
42+
[(empty? v) val-empty]
43+
[else (error "not an immediate value" v)]))
4344

4445

4546
(define (imm-bits? v)

0 commit comments

Comments
 (0)