diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/ast/ir.scm | 17 | ||||
-rw-r--r-- | src/backend/generator/assembly.scm | 37 | ||||
-rw-r--r-- | src/backend/generator/driver.scm | 9 | ||||
-rw-r--r-- | src/backend/generator/expansion.scm | 18 |
4 files changed, 56 insertions, 25 deletions
diff --git a/src/backend/ast/ir.scm b/src/backend/ast/ir.scm index 23bc87b..73911ab 100644 --- a/src/backend/ast/ir.scm +++ b/src/backend/ast/ir.scm @@ -1,20 +1,24 @@ (define-module (backend ast ir) #:export (prog-ir srout-ir - instr-ir + instr-ir mov-ir stack-ir reg-ir imm-ir tmp-ir ret-ir + cdq-ir neg-ir not-ir plus-ir minus-ir mult-ir div-ir - mod-ir)) + mod-ir + + def-ir-nodes + def-ir-syms)) ;;; Commentary: ;;; @@ -34,16 +38,18 @@ ((_ names ...) (begin (define names - 'names) ...)))) + 'names) ...)))) (def-ir-nodes prog-ir srout-ir instr-ir + mov-ir stack-ir reg-ir imm-ir - tmp-ir) + tmp-ir + cdq-ir) (def-ir-syms neg-ir @@ -53,5 +59,4 @@ mult-ir div-ir mod-ir - ret-ir - mov-ir) + ret-ir) diff --git a/src/backend/generator/assembly.scm b/src/backend/generator/assembly.scm index 205900b..1593a07 100644 --- a/src/backend/generator/assembly.scm +++ b/src/backend/generator/assembly.scm @@ -6,13 +6,44 @@ mov-ir)) +(define r10 (reg-ir "r10")) +(define r11 (reg-ir "r11")) + (define (instrs-ir lst) (cons 'list (cons (list 'alloc-ir (abs (get-frame-size))) (merge-instr lst)))) +;; no change +(def-ir-nodes + neg-ir + not-ir + ret-ir) + (define (mov-ir src dst) + (handle-double-mem? 'mov-ir src dst)) + +(define (plus-ir src dst) + (handle-double-mem? 'plus-ir src dst)) + +(define (minus-ir src dst) + (handle-double-mem? 'minus-ir src dst)) + +(define (mult-ir src dst) + (if (eq? 'stack-ir (car dst)) + (list (list 'mov-ir dst r11) + (list 'mult-ir src r11) + (list 'mov-ir r11 dst)) + (list 'mult-ir src dst))) + +(define (div-ir src) + (if (eq? 'imm-ir (car src)) + (list (list 'mov-ir src r10) + (list 'div-ir r10)) + (list 'div-ir src))) + +(define (handle-double-mem? op src dst) (if (and (eq? 'stack-ir (car dst)) (eq? 'stack-ir (car src))) - (append (list (list 'mov-ir src (reg-ir "r10d"))) - (list (list 'mov-ir (reg-ir "r10d") dst))) - (list 'mov-ir src dst))) + (list (list 'mov-ir src r10) + (list op r10 dst)) + (list op src dst))) diff --git a/src/backend/generator/driver.scm b/src/backend/generator/driver.scm index ac060f7..6625388 100644 --- a/src/backend/generator/driver.scm +++ b/src/backend/generator/driver.scm @@ -3,10 +3,7 @@ #:export (tacky->assembly)) -;; (define (tacky->assembly n) -;; (eval (expansion->allocate -;; (eval n (resolve-module '(backend generator expansion)))) -;; (resolve-module '(backend generator assembly)))) - (define (tacky->assembly n) - (eval n (resolve-module '(backend generator expansion)))) + (eval (expansion->allocate + (eval n (resolve-module '(backend generator expansion)))) + (resolve-module '(backend generator assembly)))) diff --git a/src/backend/generator/expansion.scm b/src/backend/generator/expansion.scm index dd2962c..c9e4709 100644 --- a/src/backend/generator/expansion.scm +++ b/src/backend/generator/expansion.scm @@ -9,7 +9,6 @@ (define edx (reg-ir "edx")) (define (instrs-ir lst) - (display lst) (list 'instrs-ir (cons 'list (merge-instr lst)))) (define (instr-ir op dst . srcs) @@ -20,20 +19,19 @@ ((div-ir mod-ir) (handle-binary-q/r op (car srcs) (cadr srcs) dst)))) (define (handle-ret src) - (list (list 'instr-ir 'mov-ir src eax) - (list 'instr-ir 'ret-ir))) + (list (list 'mov-ir src eax) + (list 'ret-ir src))) (define (handle-unary op src dst) (list (list 'mov-ir src dst) (list op dst))) (define (handle-binary op src1 src2 dst) - (list (list 'instr-ir 'mov-ir src1 dst) - (list 'instr-ir op src2 dst))) + (list (list 'mov-ir src1 dst) + (list op src2 dst))) (define (handle-binary-q/r op src1 src2 dst) - (map (lambda (x) (cons 'instr-ir x)) - (list (list 'mov-ir src1 eax) - (list 'cdq) - (list op src2) - (list 'mov-ir (if (eq? op div-ir) eax edx) dst)))) + (list (list 'mov-ir src1 eax) + (list 'cdq-ir) + (list 'div-ir src2) + (list 'mov-ir (if (eq? op div-ir) eax edx) dst))) |