diff options
author | bd <bdunahu@operationnull.com> | 2025-01-29 21:09:29 -0500 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-01-29 21:09:29 -0500 |
commit | 64a11c10aeb8ea331a9408708cf85b6750524d61 (patch) | |
tree | d29c37ad7f7aa39cc2439d7ba81408f65423d3fb | |
parent | 5ba1942302c6034c0bc7b3e6e2d3608e8f40fffa (diff) |
Modify assembly pass to expand new binary operators
-rw-r--r-- | src/backend/ast/ir.scm | 7 | ||||
-rw-r--r-- | src/backend/generator/driver.scm | 9 | ||||
-rw-r--r-- | src/backend/generator/expansion.scm | 36 | ||||
-rw-r--r-- | src/backend/tacky/traverse.scm | 2 |
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)) |