summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-01-29 22:11:47 -0500
committerbd <bdunahu@operationnull.com>2025-01-29 22:11:47 -0500
commita27138cd3fb680b616c04fed02b73d630b681451 (patch)
treeffbdc54a80046a27f38a5d804d667ed66a51ebf9 /src/backend
parent64a11c10aeb8ea331a9408708cf85b6750524d61 (diff)
Add fixup rules new binary operators
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/ast/ir.scm17
-rw-r--r--src/backend/generator/assembly.scm37
-rw-r--r--src/backend/generator/driver.scm9
-rw-r--r--src/backend/generator/expansion.scm18
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)))