summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/ast/ir.scm7
-rw-r--r--src/backend/generator/driver.scm9
-rw-r--r--src/backend/generator/expansion.scm36
-rw-r--r--src/backend/tacky/traverse.scm2
4 files changed, 37 insertions, 17 deletions
diff --git a/src/backend/ast/ir.scm b/src/backend/ast/ir.scm
index 129fcd2..23bc87b 100644
--- a/src/backend/ast/ir.scm
+++ b/src/backend/ast/ir.scm
@@ -1,6 +1,7 @@
(define-module (backend ast ir)
#:export (prog-ir
srout-ir
+ instr-ir
mov-ir
stack-ir
reg-ir
@@ -39,18 +40,18 @@
prog-ir
srout-ir
instr-ir
- mov-ir
stack-ir
reg-ir
imm-ir
tmp-ir)
(def-ir-syms
- ret-ir
neg-ir
not-ir
plus-ir
minus-ir
mult-ir
div-ir
- mod-ir)
+ mod-ir
+ ret-ir
+ mov-ir)
diff --git a/src/backend/generator/driver.scm b/src/backend/generator/driver.scm
index 6625388..ac060f7 100644
--- a/src/backend/generator/driver.scm
+++ b/src/backend/generator/driver.scm
@@ -3,7 +3,10 @@
#: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 (expansion->allocate
- (eval n (resolve-module '(backend generator expansion))))
- (resolve-module '(backend generator assembly))))
+ (eval n (resolve-module '(backend generator expansion))))
diff --git a/src/backend/generator/expansion.scm b/src/backend/generator/expansion.scm
index 1745e23..dd2962c 100644
--- a/src/backend/generator/expansion.scm
+++ b/src/backend/generator/expansion.scm
@@ -2,22 +2,38 @@
#:use-module (backend ast ir)
#:use-module (backend utils merge-instructions)
#:export (instrs-ir
- not-ir
- neg-ir
- ret-ir))
+ instr-ir))
+(define eax (reg-ir "eax"))
+(define edx (reg-ir "edx"))
+
(define (instrs-ir lst)
- #f
+ (display lst)
(list 'instrs-ir (cons 'list (merge-instr lst))))
-(define (not-ir src dst) (unary 'not-ir src dst))
-(define (neg-ir src dst) (unary 'neg-ir src dst))
+(define (instr-ir op dst . srcs)
+ (case op
+ ((ret-ir) (handle-ret dst))
+ ((neg-ir not-ir) (handle-unary op (car srcs) dst))
+ ((plus-ir minus-ir mult-ir) (handle-binary op (car srcs) (cadr srcs) dst))
+ ((div-ir mod-ir) (handle-binary-q/r op (car srcs) (cadr srcs) dst))))
-(define (ret-ir src)
- (list (list 'mov-ir src (list 'reg-ir "eax"))
- (list 'ret-ir)))
+(define (handle-ret src)
+ (list (list 'instr-ir 'mov-ir src eax)
+ (list 'instr-ir 'ret-ir)))
-(define (unary op src dst)
+(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)))
+
+(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))))
diff --git a/src/backend/tacky/traverse.scm b/src/backend/tacky/traverse.scm
index da63124..e759bab 100644
--- a/src/backend/tacky/traverse.scm
+++ b/src/backend/tacky/traverse.scm
@@ -25,7 +25,7 @@
(let ((dst (make-temporary)))
(cons dst
(append instrs
- `((instr-ir ,op ,@srcs dst))))))
+ `((instr-ir ,op ,dst ,@srcs))))))
(define make-temporary
(let ((count 100))