(define-module (backend tacky traverse) #:use-module (backend ast ir) #:export (func-ir stmt-ir )) (define (func-ir name instrs) (list 'srout-ir name instrs)) (define (stmt-ir val) (list 'instrs-ir (cons 'list (append (cdr val) `((instr-ir ret-ir ,(car 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 instrs op srcs) (let ((dst (make-temporary))) (cons dst (append instrs `((instr-ir ,op ,@srcs dst)))))) (define make-temporary (let ((count 100)) (lambda () (set! count (1+ count)) (list 'tmp-ir count))))