(define-module (backend generator assembly) #:use-module (backend ast ir) #:use-module (backend utils assign-stack) #:use-module (backend utils merge-instructions) #:export (instrs-ir 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))) (list (list 'mov-ir src r10) (list op r10 dst)) (list op src dst)))