Untitled
unknown
plain_text
2 years ago
1.7 kB
9
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...