(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) (format #f "\tnegl\t~a\n" dst)) (define (not-ir dst) (format #f "\tnotl\t~a\n" dst)) (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))