blob: 1593a07464b80949057b9bc587b61cc2f08ae1af (
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 "r10"))
(define r11 (reg-ir "r11"))
(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)))
|