Skip to content

Commit 30b9f05

Browse files
committed
Treatment for Hoax.
1 parent 5f0789c commit 30b9f05

3 files changed

Lines changed: 40 additions & 52 deletions

File tree

langs/hoax/compile-ops.rkt

Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
;; Op0 -> Asm
1616
(define (compile-op0 p)
1717
(match p
18-
['void (seq (Mov rax val-void))]
18+
['void (seq (Mov rax (value->bits (void))))]
1919
['read-byte (seq pad-stack
2020
(Call 'read_byte)
2121
unpad-stack)]
@@ -28,13 +28,13 @@
2828
(match p
2929
['add1
3030
(seq (assert-integer rax)
31-
(Add rax (imm->bits 1)))]
31+
(Add rax (value->bits 1)))]
3232
['sub1
3333
(seq (assert-integer rax)
34-
(Sub rax (imm->bits 1)))]
34+
(Sub rax (value->bits 1)))]
3535
['zero?
3636
(seq (assert-integer rax)
37-
(eq-imm 0))]
37+
(eq-value 0))]
3838
['char?
3939
(type-pred mask-char type-char)]
4040
['char->integer
@@ -46,14 +46,14 @@
4646
(Sar rax int-shift)
4747
(Sal rax char-shift)
4848
(Xor rax type-char))]
49-
['eof-object? (eq-imm eof)]
49+
['eof-object? (eq-value eof)]
5050
['write-byte
5151
(seq (assert-byte rax)
5252
pad-stack
5353
(Mov rdi rax)
5454
(Call 'write_byte)
5555
unpad-stack
56-
(Mov rax val-void))]
56+
(Mov rax (value->bits (void))))]
5757
['box
5858
(seq (Mov (Offset rbx 0) rax)
5959
(Mov rax rbx)
@@ -71,7 +71,7 @@
7171
(seq (assert-cons rax)
7272
(Xor rax type-cons)
7373
(Mov rax (Offset rax 0)))]
74-
['empty? (eq-imm '())]
74+
['empty? (eq-value '())]
7575
['box?
7676
(type-pred ptr-mask type-box)]
7777
['cons?
@@ -126,21 +126,13 @@
126126
(assert-integer r8)
127127
(assert-integer rax)
128128
(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))]
134130
['=
135131
(seq (Pop r8)
136132
(assert-integer r8)
137133
(assert-integer rax)
138134
(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))]
144136
['cons
145137
(seq (Mov (Offset rbx 0) rax)
146138
(Pop rax)
@@ -150,7 +142,8 @@
150142
(Add rbx 16))]
151143
['eq?
152144
(seq (Pop r8)
153-
(eq r8 rax))]
145+
(Cmp rax r8)
146+
(if-equal))]
154147
['make-vector
155148
(let ((loop (gensym))
156149
(done (gensym))
@@ -271,7 +264,7 @@
271264
(Sal r10 3)
272265
(Add r8 r10)
273266
(Mov (Offset r8 8) rax)
274-
(Mov rax val-void))]))
267+
(Mov rax (value->bits (void))))]))
275268

276269

277270
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -284,13 +277,9 @@
284277
(Jne 'raise_error_align))))
285278

286279
(define (type-pred mask type)
287-
(let ((l (gensym)))
288-
(seq (And rax mask)
289-
(Cmp rax type)
290-
(Mov rax (imm->bits #t))
291-
(Je l)
292-
(Mov rax (imm->bits #f))
293-
(Label l))))
280+
(seq (And rax mask)
281+
(Cmp rax type)
282+
(if-equal)))
294283

295284
(define assert-integer
296285
(assert-type mask-int type-int))
@@ -308,45 +297,43 @@
308297
(define (assert-codepoint r)
309298
(let ((ok (gensym)))
310299
(seq (assert-integer r)
311-
(Cmp r (imm->bits 0))
300+
(Cmp r (value->bits 0))
312301
(Jl 'raise_error_align)
313-
(Cmp r (imm->bits 1114111))
302+
(Cmp r (value->bits 1114111))
314303
(Jg 'raise_error_align)
315-
(Cmp r (imm->bits 55295))
304+
(Cmp r (value->bits 55295))
316305
(Jl ok)
317-
(Cmp r (imm->bits 57344))
306+
(Cmp r (value->bits 57344))
318307
(Jg ok)
319308
(Jmp 'raise_error_align)
320309
(Label ok))))
321310

322311
(define (assert-byte r)
323312
(seq (assert-integer r)
324-
(Cmp r (imm->bits 0))
313+
(Cmp r (value->bits 0))
325314
(Jl 'raise_error_align)
326-
(Cmp r (imm->bits 255))
315+
(Cmp r (value->bits 255))
327316
(Jg 'raise_error_align)))
328317

329318
(define (assert-natural r)
330319
(seq (assert-integer r)
331-
(Cmp r (imm->bits 0))
320+
(Cmp r (value->bits 0))
332321
(Jl 'raise_error_align)))
333322

323+
;; -> Asm
324+
;; set rax to #t or #f based on given comparison
325+
(define (if-compare c)
326+
(seq (Mov rax (value->bits #f))
327+
(Mov r9 (value->bits #t))
328+
(c rax r9)))
329+
330+
(define (if-equal) (if-compare Cmove))
331+
(define (if-lt) (if-compare Cmovl))
332+
334333
;; Value -> Asm
335-
(define (eq-imm imm)
336-
(let ((l1 (gensym)))
337-
(seq (Cmp rax (imm->bits imm))
338-
(Mov rax val-true)
339-
(Je l1)
340-
(Mov rax val-false)
341-
(Label l1))))
342-
343-
(define (eq ir1 ir2)
344-
(let ((l1 (gensym)))
345-
(seq (Cmp ir1 ir2)
346-
(Mov rax val-true)
347-
(Je l1)
348-
(Mov rax val-false)
349-
(Label l1))))
334+
(define (eq-value v)
335+
(seq (Cmp rax (value->bits v))
336+
(if-equal)))
350337

351338
;; Asm
352339
;; Dynamically pad the stack to be aligned for a call

langs/hoax/compile.rkt

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

4848
;; Value -> Asm
4949
(define (compile-value v)
50-
(seq (Mov rax (imm->bits v))))
50+
(seq (Mov rax (value->bits v))))
5151

5252
;; Id CEnv -> Asm
5353
(define (compile-variable x c)
@@ -106,7 +106,7 @@
106106
(let ((l1 (gensym 'if))
107107
(l2 (gensym 'if)))
108108
(seq (compile-e e1 c)
109-
(Cmp rax val-false)
109+
(Cmp rax (value->bits #f))
110110
(Je l1)
111111
(compile-e e2 c)
112112
(Jmp l2)

langs/hoax/types.rkt

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

35-
(define (imm->bits v)
35+
(define (value->bits v)
3636
(cond [(eof-object? v) val-eof]
3737
[(integer? v) (arithmetic-shift v int-shift)]
3838
[(char? v)
@@ -41,7 +41,8 @@
4141
[(eq? v #t) val-true]
4242
[(eq? v #f) val-false]
4343
[(void? v) val-void]
44-
[(empty? v) val-empty]))
44+
[(empty? v) val-empty]
45+
[else (error "not an immediate value" v)]))
4546

4647

4748
(define (imm-bits? v)

0 commit comments

Comments
 (0)