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