(define-module (backend generator expansion) #:use-module (backend ast ir) #:use-module (backend utils merge-instructions) #:export (instrs-ir instr-ir)) (define eax (reg-ir "eax")) (define edx (reg-ir "edx")) (define (instrs-ir lst) (list 'instrs-ir (cons 'list (merge-instr lst)))) (define (instr-ir op dst . srcs) (case op ((ret-ir) (handle-ret dst)) ((neg-ir not-ir) (handle-unary op (car srcs) dst)) ((plus-ir minus-ir mult-ir) (handle-binary op (car srcs) (cadr srcs) dst)) ((div-ir mod-ir) (handle-binary-q/r op (car srcs) (cadr srcs) dst)))) (define (handle-ret src) (list (list 'mov-ir src eax) (list 'ret-ir src))) (define (handle-unary op src dst) (list (list 'mov-ir src dst) (list op dst))) (define (handle-binary op src1 src2 dst) (list (list 'mov-ir src1 dst) (list op src2 dst))) (define (handle-binary-q/r op src1 src2 dst) (list (list 'mov-ir src1 eax) (list 'cdq-ir) (list 'div-ir src2) (list 'mov-ir (if (eq? op div-ir) eax edx) dst)))