summaryrefslogtreecommitdiff
path: root/src/backend/emitter/traverse.scm
blob: e88f2072024d00e56ad82e2cb6d077cdf35b0dbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(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))