summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/ast/ir.scm44
-rw-r--r--src/backend/tacky/traverse.scm14
2 files changed, 42 insertions, 16 deletions
diff --git a/src/backend/ast/ir.scm b/src/backend/ast/ir.scm
index 90617cd..129fcd2 100644
--- a/src/backend/ast/ir.scm
+++ b/src/backend/ast/ir.scm
@@ -1,19 +1,19 @@
(define-module (backend ast ir)
#:export (prog-ir
srout-ir
- neg-ir
- not-ir
- plus-ir
- minus-ir
- mult-ir
- div-ir
- mod-ir
mov-ir
stack-ir
reg-ir
imm-ir
tmp-ir
- ret-ir))
+ ret-ir
+ neg-ir
+ not-ir
+ plus-ir
+ minus-ir
+ mult-ir
+ div-ir
+ mod-ir))
;;; Commentary:
;;;
@@ -26,7 +26,31 @@
((_ names ...)
(begin
(define (names . args)
- (cons 'names args)) ...))))
+ (cons 'names args)) ...))))
+
+(define-syntax def-ir-syms
+ (syntax-rules ()
+ ((_ names ...)
+ (begin
+ (define names
+ 'names) ...))))
(def-ir-nodes
- prog-ir srout-ir neg-ir not-ir plus-ir minus-ir mult-ir div-ir mod-ir mov-ir stack-ir reg-ir imm-ir tmp-ir ret-ir)
+ 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)
diff --git a/src/backend/tacky/traverse.scm b/src/backend/tacky/traverse.scm
index 022d961..da63124 100644
--- a/src/backend/tacky/traverse.scm
+++ b/src/backend/tacky/traverse.scm
@@ -2,7 +2,7 @@
#:use-module (backend ast ir)
#:export (func-ir
stmt-ir
- ))
+ ))
(define (func-ir name instrs)
@@ -11,19 +11,21 @@
(define (stmt-ir val)
(list 'instrs-ir
(cons 'list (append (cdr val)
- (list (list 'ret-ir (car val)))))))
+ `((instr-ir ret-ir ,(car val)))))))
-(define (expr-ir op val)
- (make-instruction op (car val) (cdr val)))
+(define (expr-ir op . args)
+ ;; args is an alist--key: last reg, value: instrs
+ (make-instruction (apply append (map cdr args))
+ op (map car args)))
(define (const-ir val)
(cons (imm-ir val) '()))
-(define (make-instruction op src instrs)
+(define (make-instruction instrs op srcs)
(let ((dst (make-temporary)))
(cons dst
(append instrs
- (list (op src dst))))))
+ `((instr-ir ,op ,@srcs dst))))))
(define make-temporary
(let ((count 100))