+
+;;; CAST
+(defun ir2-convert-cast (node block)
+ (declare (type cast node)
+ (type ir2-block block))
+ (let* ((cont (node-cont node))
+ (2cont (continuation-info cont))
+ (value (cast-value node))
+ (2value (continuation-info value)))
+ (cond ((not 2cont))
+ ((eq (ir2-continuation-kind 2cont) :unused))
+ ((eq (ir2-continuation-kind 2cont) :unknown)
+ (aver (eq (ir2-continuation-kind 2value) :unknown))
+ (aver (not (cast-type-check node)))
+ (move-results-coerced node block
+ (ir2-continuation-locs 2value)
+ (ir2-continuation-locs 2cont)))
+ ((eq (ir2-continuation-kind 2cont) :fixed)
+ (aver (eq (ir2-continuation-kind 2value) :fixed))
+ (if (cast-type-check node)
+ (move-results-checked node block
+ (ir2-continuation-locs 2value)
+ (ir2-continuation-locs 2cont)
+ (multiple-value-bind (check types)
+ (cast-check-types node nil)
+ (aver (eq check :simple))
+ types))
+ (move-results-coerced node block
+ (ir2-continuation-locs 2value)
+ (ir2-continuation-locs 2cont))))
+ (t (bug "CAST cannot be :DELAYED.")))))