(define-module (backend emitter traverse) #:export (prog-ir subrout-ir instr-ir allocate-ir mov-ir ret-ir neg-ir not-ir allocate-ir reg-ir stack-ir imm-ir)) (define (prog-ir srout) (string-append/shared srout ".section .note.GNU-stack,\"\",@progbits\n")) (define (srout-ir label instrs) (format #f " .globl ~a ~a: \tpushq\t%rbp \tmovq\t%rsp, %rbp ~a" label label (apply string-append/shared instrs))) (define (mov-ir src dst) (format #f "\tmovl\t~a, ~a\n" src dst)) (define (ret-ir) "\tmovq\t%rbp, %rsp \tpopq\t%rbp \tret\n") (define (neg-ir dst) (emit-unary "negl" dst)) (define (not-ir dst) (emit-unary "notl" dst)) (define (plus-ir src dst) (emit-binary "addl" src dst)) (define (minus-ir src dst) (emit-binary "subl" src dst)) (define (mult-ir src dst) (emit-binary "imull" src dst)) (define (div-ir src) (emit-unary "idivl" src)) (define (cdq-ir) (format #f "\tcdq\n")) (define (alloc-ir size) (format #f "\tsubq\t$~a, %rsp\n" size)) (define (reg-ir r) (format #f "%~a" r)) (define (stack-ir loc) (format #f "~a(%rbp)" loc)) (define (imm-ir int) (format #f "$~a" int)) (define (emit-unary instr dst) (format #f "\t~a\t~a\n" instr dst)) (define (emit-binary instr src dst) (format #f "\t~a\t~a, ~a\n" instr src dst))