Skip to content

Commit a465513

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

3 files changed

Lines changed: 38 additions & 49 deletions

File tree

langs/hoax/compile-ops.rkt

Lines changed: 33 additions & 45 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -287,10 +280,7 @@
287280
(let ((l (gensym)))
288281
(seq (And rax mask)
289282
(Cmp rax type)
290-
(Mov rax (imm->bits #t))
291-
(Je l)
292-
(Mov rax (imm->bits #f))
293-
(Label l))))
283+
(if-equal))))
294284

295285
(define assert-integer
296286
(assert-type mask-int type-int))
@@ -308,45 +298,43 @@
308298
(define (assert-codepoint r)
309299
(let ((ok (gensym)))
310300
(seq (assert-integer r)
311-
(Cmp r (imm->bits 0))
301+
(Cmp r (value->bits 0))
312302
(Jl 'raise_error_align)
313-
(Cmp r (imm->bits 1114111))
303+
(Cmp r (value->bits 1114111))
314304
(Jg 'raise_error_align)
315-
(Cmp r (imm->bits 55295))
305+
(Cmp r (value->bits 55295))
316306
(Jl ok)
317-
(Cmp r (imm->bits 57344))
307+
(Cmp r (value->bits 57344))
318308
(Jg ok)
319309
(Jmp 'raise_error_align)
320310
(Label ok))))
321311

322312
(define (assert-byte r)
323313
(seq (assert-integer r)
324-
(Cmp r (imm->bits 0))
314+
(Cmp r (value->bits 0))
325315
(Jl 'raise_error_align)
326-
(Cmp r (imm->bits 255))
316+
(Cmp r (value->bits 255))
327317
(Jg 'raise_error_align)))
328318

329319
(define (assert-natural r)
330320
(seq (assert-integer r)
331-
(Cmp r (imm->bits 0))
321+
(Cmp r (value->bits 0))
332322
(Jl 'raise_error_align)))
333323

324+
;; -> Asm
325+
;; set rax to #t or #f based on given comparison
326+
(define (if-compare c)
327+
(seq (Mov rax (value->bits #f))
328+
(Mov r9 (value->bits #t))
329+
(c rax r9)))
330+
331+
(define (if-equal) (if-compare Cmove))
332+
(define (if-lt) (if-compare Cmovl))
333+
334334
;; 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))))
335+
(define (eq-value v)
336+
(seq (Cmp rax (value->bits v))
337+
(if-equal)))
350338

351339
;; Asm
352340
;; 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)