Skip to content
Merged

Jo #117

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions langs/a86/ast.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@
(error n "expects symbol; given ~v" x))
x))

(define check:cmov
(λ (a1 a2 n)
(unless (register? a1)
(error n "expects register; given ~v" a1))
(unless (or (register? a2) (offset? a2))
(error n "expects register or offset; given ~v" a2))
(values a1 a2)))

(define check:arith
(λ (a1 a2 n)
(unless (register? a1)
Expand Down Expand Up @@ -157,6 +165,20 @@
(instruct Jle (x) check:target)
(instruct Jg (x) check:target)
(instruct Jge (x) check:target)
(instruct Jo (x) check:target)
(instruct Jno (x) check:target)
(instruct Jc (x) check:target)
(instruct Jnc (x) check:target)
(instruct Cmove (dst src) check:cmov)
(instruct Cmovne (dst src) check:cmov)
(instruct Cmovl (dst src) check:cmov)
(instruct Cmovle (dst src) check:cmov)
(instruct Cmovg (dst src) check:cmov)
(instruct Cmovge (dst src) check:cmov)
(instruct Cmovo (dst src) check:cmov)
(instruct Cmovno (dst src) check:cmov)
(instruct Cmovc (dst src) check:cmov)
(instruct Cmovnc (dst src) check:cmov)
(instruct And (dst src) check:src-dest)
(instruct Or (dst src) check:src-dest)
(instruct Xor (dst src) check:src-dest)
Expand All @@ -165,6 +187,7 @@
(instruct Push (a1) check:push)
(instruct Pop (a1) check:register)
(instruct Lea (dst x) check:lea)
(instruct Not (x) check:register)
(instruct Div (den) check:register)

(instruct Offset (r i) check:offset)
Expand Down Expand Up @@ -229,6 +252,20 @@
(Jle? x)
(Jg? x)
(Jge? x)
(Jo? x)
(Jno? x)
(Jc? x)
(Jnc? x)
(Cmove? x)
(Cmovne? x)
(Cmovl? x)
(Cmovle? x)
(Cmovg? x)
(Cmovge? x)
(Cmovo? x)
(Cmovno? x)
(Cmovc? x)
(Cmovnc? x)
(And? x)
(Or? x)
(Xor? x)
Expand All @@ -237,6 +274,7 @@
(Push? x)
(Pop? x)
(Lea? x)
(Not? x)
(Div? x)
(Comment? x)
(Equ? x)
Expand Down
55 changes: 55 additions & 0 deletions langs/a86/printer.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,58 @@
[(Jge l)
(string-append tab "jge "
(jump-target->string l))]
[(Jo l)
(string-append tab "jo "
(jump-target->string l))]
[(Jno l)
(string-append tab "jno "
(jump-target->string l))]
[(Jc l)
(string-append tab "jc "
(jump-target->string l))]
[(Jnc l)
(string-append tab "jnc "
(jump-target->string l))]
[(Cmove dst src)
(string-append tab "cmove "
(reg->string dst) ", "
(arg->string src))]
[(Cmovne dst src)
(string-append tab "cmovne "
(reg->string dst) ", "
(arg->string src))]
[(Cmovl dst src)
(string-append tab "cmovl "
(reg->string dst) ", "
(arg->string src))]
[(Cmovle dst src)
(string-append tab "cmovle "
(reg->string dst) ", "
(arg->string src))]
[(Cmovg dst src)
(string-append tab "cmovg "
(reg->string dst) ", "
(arg->string src))]
[(Cmovge dst src)
(string-append tab "cmovge "
(reg->string dst) ", "
(arg->string src))]
[(Cmovo dst src)
(string-append tab "cmovo "
(reg->string dst) ", "
(arg->string src))]
[(Cmovno dst src)
(string-append tab "cmovno "
(reg->string dst) ", "
(arg->string src))]
[(Cmovc dst src)
(string-append tab "cmovc "
(reg->string dst) ", "
(arg->string src))]
[(Cmovnc dst src)
(string-append tab "cmovnc "
(reg->string dst) ", "
(arg->string src))]
[(Call l)
(string-append tab "call "
(jump-target->string l))]
Expand All @@ -158,6 +210,9 @@
(string-append tab "lea "
(arg->string d) ", [rel "
(exp->string x) "]")]
[(Not r)
(string-append tab "not "
(reg->string r))]
[(Div r)
(string-append tab "div "
(arg->string r))]
Expand Down
24 changes: 10 additions & 14 deletions langs/dodger/compile-ops.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,24 @@
(require "ast.rkt" "types.rkt" a86/ast)

(define rax 'rax)
(define r9 'r9) ; scratch

;; Op1 -> Asm
(define (compile-op1 p)
(match p
['add1 (Add rax (value->bits 1))]
['sub1 (Sub rax (value->bits 1))]
['zero?
(let ((l1 (gensym)))
(seq (Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (Cmp rax 0)
(Mov rax val-false)
(Mov r9 val-true)
(Cmove rax r9))]
['char?
(let ((l1 (gensym)))
(seq (And rax mask-char)
(Xor rax type-char)
(Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (And rax mask-char)
(Cmp rax type-char)
(Mov rax val-false)
(Mov r9 val-true)
(Cmove rax r9))]
['char->integer
(seq (Sar rax char-shift)
(Sal rax int-shift))]
Expand Down
11 changes: 5 additions & 6 deletions langs/dupe/compile-ops.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@
(require "ast.rkt" "types.rkt" a86/ast)

(define rax 'rax)
(define r9 'r9) ; scratch

;; Op1 -> Asm
(define (compile-op1 p)
(match p
['add1 (Add rax (value->bits 1))]
['sub1 (Sub rax (value->bits 1))]
['zero?
(let ((l1 (gensym)))
(seq (Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]))
(seq (Cmp rax 0)
(Mov rax (value->bits #f))
(Mov r9 (value->bits #t))
(Cmove rax r9))]))
39 changes: 17 additions & 22 deletions langs/evildoer/compile-ops.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

(define rax 'rax) ; return
(define rdi 'rdi) ; arg
(define r9 'r9) ; scratch

;; Op0 -> Asm
(define (compile-op0 p)
(match p
['void (seq (Mov rax val-void))]
['void (seq (Mov rax (value->bits (void))))]
['read-byte (seq (Call 'read_byte))]
['peek-byte (seq (Call 'peek_byte))]))

Expand All @@ -18,21 +19,12 @@
['add1 (Add rax (value->bits 1))]
['sub1 (Sub rax (value->bits 1))]
['zero?
(let ((l1 (gensym)))
(seq (Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (Cmp rax 0)
(if-equal))]
['char?
(let ((l1 (gensym)))
(seq (And rax mask-char)
(Xor rax type-char)
(Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (And rax mask-char)
(Cmp rax type-char)
(if-equal))]
['char->integer
(seq (Sar rax char-shift)
(Sal rax int-shift))]
Expand All @@ -41,13 +33,16 @@
(Sal rax char-shift)
(Xor rax type-char))]
['eof-object?
(let ((l1 (gensym)))
(seq (Cmp rax val-eof)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (Cmp rax (value->bits eof))
(if-equal))]
['write-byte
(seq (Mov rdi rax)
(Call 'write_byte)
(Mov rax val-void))]))
(Mov rax (value->bits (void))))]))

;; -> Asm
;; set rax to #t or #f if comparison flag is equal
(define (if-equal)
(seq (Mov rax (value->bits #f))
(Mov r9 (value->bits #t))
(Cmove rax r9)))
2 changes: 1 addition & 1 deletion langs/evildoer/compile.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
(let ((l1 (gensym 'if))
(l2 (gensym 'if)))
(seq (compile-e e1)
(Cmp rax val-false)
(Cmp rax (value->bits #f))
(Je l1)
(compile-e e2)
(Jmp l2)
Expand Down
56 changes: 22 additions & 34 deletions langs/extort/compile-ops.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

(define rax 'rax) ; return
(define rdi 'rdi) ; arg
(define r9 'r9) ; scratch in assert-type
(define r9 'r9) ; scratch

;; Op0 -> Asm
(define (compile-op0 p)
(match p
['void (seq (Mov rax val-void))]
['void (seq (Mov rax (value->bits (void))))]
['read-byte (seq (Call 'read_byte))]
['peek-byte (seq (Call 'peek_byte))]))

Expand All @@ -23,22 +23,11 @@
(seq (assert-integer rax)
(Sub rax (value->bits 1)))]
['zero?
(let ((l1 (gensym)))
(seq (assert-integer rax)
(Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(seq (assert-integer rax)
(Cmp rax 0)
(if-equal))]
['char?
(let ((l1 (gensym)))
(seq (And rax mask-char)
(Xor rax type-char)
(Cmp rax 0)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1)))]
(type-pred mask-char type-char)]
['char->integer
(seq (assert-char rax)
(Sar rax char-shift)
Expand All @@ -48,12 +37,12 @@
(Sar rax int-shift)
(Sal rax char-shift)
(Xor rax type-char))]
['eof-object? (eq-imm val-eof)]
['eof-object? (eq-value eof)]
['write-byte
(seq (assert-byte)
(Mov rdi rax)
(Call 'write_byte)
(Mov rax val-void))]))
(Mov rax (value->bits (void))))]))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Expand All @@ -66,13 +55,9 @@
(Jne 'err))))

(define (type-pred mask type)
(let ((l (gensym)))
(seq (And rax mask)
(Cmp rax type)
(Mov rax (value->bits #t))
(Je l)
(Mov rax (value->bits #f))
(Label l))))
(seq (And rax mask)
(Cmp rax type)
(if-equal)))

(define assert-integer
(assert-type mask-int type-int))
Expand Down Expand Up @@ -100,11 +85,14 @@
(Cmp rax (value->bits 255))
(Jg 'err)))

;; Imm -> Asm
(define (eq-imm imm)
(let ((l1 (gensym)))
(seq (Cmp rax imm)
(Mov rax val-true)
(Je l1)
(Mov rax val-false)
(Label l1))))
;; -> Asm
;; set rax to #t or #f if comparison flag is equal
(define (if-equal)
(seq (Mov rax (value->bits #f))
(Mov r9 (value->bits #t))
(Cmove rax r9)))

;; Value -> Asm
(define (eq-value v)
(seq (Cmp rax (value->bits v))
(if-equal)))
2 changes: 1 addition & 1 deletion langs/extort/compile.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
(let ((l1 (gensym 'if))
(l2 (gensym 'if)))
(seq (compile-e e1)
(Cmp rax val-false)
(Cmp rax (value->bits #f))
(Je l1)
(compile-e e2)
(Jmp l2)
Expand Down
Loading