Skip to content

Commit cf44210

Browse files
committed
Treatment for iniquity.
1 parent 8bde3ce commit cf44210

3 files changed

Lines changed: 39 additions & 47 deletions

File tree

langs/iniquity/compile-ops.rkt

Lines changed: 34 additions & 43 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,9 +280,9 @@
287280
(let ((l (gensym)))
288281
(seq (And rax mask)
289282
(Cmp rax type)
290-
(Mov rax (imm->bits #t))
283+
(Mov rax (value->bits #t))
291284
(Je l)
292-
(Mov rax (imm->bits #f))
285+
(Mov rax (value->bits #f))
293286
(Label l))))
294287

295288
(define assert-integer
@@ -308,45 +301,43 @@
308301
(define (assert-codepoint r)
309302
(let ((ok (gensym)))
310303
(seq (assert-integer r)
311-
(Cmp r (imm->bits 0))
304+
(Cmp r (value->bits 0))
312305
(Jl 'raise_error_align)
313-
(Cmp r (imm->bits 1114111))
306+
(Cmp r (value->bits 1114111))
314307
(Jg 'raise_error_align)
315-
(Cmp r (imm->bits 55295))
308+
(Cmp r (value->bits 55295))
316309
(Jl ok)
317-
(Cmp r (imm->bits 57344))
310+
(Cmp r (value->bits 57344))
318311
(Jg ok)
319312
(Jmp 'raise_error_align)
320313
(Label ok))))
321314

322315
(define (assert-byte r)
323316
(seq (assert-integer r)
324-
(Cmp r (imm->bits 0))
317+
(Cmp r (value->bits 0))
325318
(Jl 'raise_error_align)
326-
(Cmp r (imm->bits 255))
319+
(Cmp r (value->bits 255))
327320
(Jg 'raise_error_align)))
328321

329322
(define (assert-natural r)
330323
(seq (assert-integer r)
331-
(Cmp r (imm->bits 0))
324+
(Cmp r (value->bits 0))
332325
(Jl 'raise_error_align)))
333326

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

351342
;; Asm
352343
;; Dynamically pad the stack to be aligned for a call

langs/iniquity/compile.rkt

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

7272
;; Value -> Asm
7373
(define (compile-value v)
74-
(seq (Mov rax (imm->bits v))))
74+
(seq (Mov rax (value->bits v))))
7575

7676
;; Id CEnv -> Asm
7777
(define (compile-variable x c)
@@ -130,7 +130,7 @@
130130
(let ((l1 (gensym 'if))
131131
(l2 (gensym 'if)))
132132
(seq (compile-e e1 c)
133-
(Cmp rax val-false)
133+
(Cmp rax (value->bits #f))
134134
(Je l1)
135135
(compile-e e2 c)
136136
(Jmp l2)

langs/iniquity/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)