summaryrefslogtreecommitdiff
path: root/src/backend/generator/assembly.scm
blob: d7167d7a8c4cd111b3b09990e73bf5524029751b (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
(define-module (backend generator assembly)
  #:use-module (backend ast ir)
  #:use-module (backend utils assign-stack)
  #:use-module (backend utils merge-instructions)
  #:export (instrs-ir
            mov-ir))


(define r10 (reg-ir "r10d"))
(define r11 (reg-ir "r11d"))

(define (instrs-ir lst)
  (cons 'list (cons (list 'alloc-ir (abs (get-frame-size)))
                    (merge-instr lst))))

;; no change
(def-ir-nodes
  neg-ir
  not-ir
  ret-ir)

(define (mov-ir src dst)
  (handle-double-mem? 'mov-ir src dst))

(define (plus-ir src dst)
  (handle-double-mem? 'plus-ir src dst))

(define (minus-ir src dst)
  (handle-double-mem? 'minus-ir src dst))

(define (mult-ir src dst)
  (if (eq? 'stack-ir (car dst))
      (list (list 'mov-ir dst r11)
            (list 'mult-ir src r11)
            (list 'mov-ir r11 dst))
      (list 'mult-ir src dst)))

(define (div-ir src)
  (if (eq? 'imm-ir (car src))
      (list (list 'mov-ir src r10)
            (list 'div-ir r10))
      (list 'div-ir src)))

(define (handle-double-mem? op src dst)
  (if (and (eq? 'stack-ir (car dst))
           (eq? 'stack-ir (car src)))
      (list (list 'mov-ir src r10)
            (list op r10 dst))
      (list op src dst)))