"Clever" PRESERVING |
|
(define (preserving regs seq1 seq2)
(if (null? regs)
(append-instruction-sequences seq1 seq2)
(let ((first-reg (car regs)))
(if (and (needs-register? seq2 first-reg) ; **
(modifies-register? seq1 first-reg)) ; **
(preserving (cdr regs)
(make-instruction-sequence
(list-union (list first-reg) ; ** needs
(registers-needed seq1)) ; **
(list-difference (registers-modified seq1) ; ** modifies
(list first-reg)) ; **
(append `((save ,first-reg))
(statements seq1)
`((restore ,first-reg))))
seq2)
(preserving (cdr regs) seq1 seq2)))))