summaryrefslogtreecommitdiff
path: root/src/modules/tacky/traverse.scm
blob: 24c405467d7e07ab8eb1f755c3dd0d892dfa8e8c (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
(define-module (modules tacky traverse)
  #:use-module (modules ast ir)
  #:export (prog
            func
            stmt
            unary
            const))


(define (prog srout)
  (list 'prog srout))

(define (func name instrs)
  (list 'srout name instrs))

(define (stmt val)
  (list 'instrs
        (cons 'list (append (cdr val)
                            (list (list 'ret (car val)))))))

(define (expr op val)
  (cond
   ((integer? val) (make-instruction op (imm val) '()))
   (#t (make-instruction op (car val) (cdr val)))))

(define (make-instruction op src instrs)
  (let ((dst (make-temporary)))
    (cons dst
            (append instrs
                    (list (op dst src))))))

(define make-temporary
  (let ((count 100))
    (lambda ()
      (set! count (1+ count))
      (list 'tmp count))))

(define (neg dst src)
  (list 'neg dst src))

(define (not dst src)
  (list 'not dst src))