blob: eb8b297c38026af71998e68eaad8ffb25edf6ca2 (
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
|
(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)))
(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)))
|