summaryrefslogtreecommitdiff
path: root/src/backend/tacky/traverse.scm
blob: 022d961c5ac95f948bcace711d5f67f0f60d10ea (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
(define-module (backend tacky traverse)
  #:use-module (backend ast ir)
  #:export (func-ir
            stmt-ir
	    ))


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

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

(define (expr-ir op val)
  (make-instruction op (car val) (cdr val)))

(define (const-ir val)
  (cons (imm-ir val) '()))

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

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