diff options
author | bd <bdunahu@operationnull.com> | 2025-01-29 19:51:40 -0500 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-01-29 19:51:40 -0500 |
commit | 5ba1942302c6034c0bc7b3e6e2d3608e8f40fffa (patch) | |
tree | ee9c98e33f3540f050c25f1e4052557e8f888334 | |
parent | aea28b9ece45eb0340a480b4f3eb0a4470fdc85b (diff) |
tacky generation for binary operations
-rw-r--r-- | src/backend/ast/ir.scm | 44 | ||||
-rw-r--r-- | src/backend/tacky/traverse.scm | 14 |
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)) |