Untitled

 avatar
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...