summaryrefslogtreecommitdiff
path: root/src/backend/generator/assembly.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/generator/assembly.scm')
-rw-r--r--src/backend/generator/assembly.scm37
1 files changed, 34 insertions, 3 deletions
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)))