blob: 15bda1012d4ddc66caaf8543c599dc756da418f5 (
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
(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))
|