Untitled
unknown
plain_text
3 years ago
1.7 kB
11
Indexable
(define (select-instructions p)
; (Imp-cmf-lang-v3 value) -> (List-of (Asm-lang-v2 effect)) and (Asm-lang-v2 aloc)
; Assigns the value v to a fresh temporary, returning two values: the list of
; statements the implement the assignment in Loc-lang, and the aloc that the
; value is stored in.
(define select-list `(begin ))
(define (add-select instr)
(begin
(set! select-list (append select-list `(,instr)))))
(define (value? value)
(or (int64? value)(aloc? value)(binop? (first value))))
(define (select-tail tail)
(begin
(if(value? tail)
(select-value tail)
(match tail
[`(begin ,effect ... ,tail)
(begin
(for-each select-effect effect)
(select-tail tail)
)
]
)
)
)
)
(define (select-value value)
(if (or(int64? value)(aloc? value))
(add-select `(halt ,value))
(let ([triv (fresh)])
(begin
(add-select `(set! ,triv ,(second value)))
(add-select `(set! ,triv (,(first value) ,triv ,(last value))))
(add-select `(halt ,triv))
)
)
)
)
(define (select-effect effect)
(match effect
[`(set! ,aloc ,value)
#:when (or(int64? value)(aloc? value))
(add-select `(set! ,aloc ,value))
]
[`(set! ,aloc (,op ,triv1 ,triv2))
#:when (binop? op)
(begin
(add-select `(set! ,aloc ,triv1))
(add-select `(set! ,aloc (,op ,aloc ,triv2)))
)
]
[`(begin ,effect ...)
(begin
(for-each select-effect effect)
)
]
)
)
(match p
[`(module ,tail)
(begin
(select-tail tail)
`(module () ,select-list)
)
]
)
)Editor is loading...