diff options
Diffstat (limited to 'src/backend/tacky/traverse.scm')
-rw-r--r-- | src/backend/tacky/traverse.scm | 14 |
1 files changed, 8 insertions, 6 deletions
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)) |