summaryrefslogtreecommitdiff
path: root/src/backend/generator/expansion.scm
blob: c9e4709b7811e5cd1b22a8c70a355b01888f597a (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 src)))

(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)))