+ (declare (ignore node))
+ (let* ((ptype (sb!c::tn-primitive-type dst-tn))
+ (name (sb!c::primitive-type-name ptype))
+ (param (and (memq :cmov *backend-subfeatures*)
+ (cdr (or (assoc name *cmov-ptype-representation-vop*)
+ '(t descriptor-reg move-if/t))))))
+ (when param
+ (destructuring-bind (representation vop) param
+ (let ((scn (sc-number-or-lose representation)))
+ (labels ((make-tn ()
+ (make-representation-tn ptype scn))
+ (frob-tn (tn)
+ (if (immediate-tn-p tn)
+ tn
+ (make-tn))))
+ (values vop
+ (frob-tn x-tn) (frob-tn y-tn)
+ (make-tn)
+ nil)))))))
+
+(define-vop (move-if)
+ (:args (then) (else))
+ (:temporary (:sc unsigned-reg :from :eval) temp)
+ (:results (res))
+ (:info flags)
+ (:generator 0
+ (flet ((load-immediate (dst constant-tn
+ &optional (sc (sc-name (tn-sc dst))))
+ (let ((val (tn-value constant-tn)))
+ (etypecase val
+ (integer
+ (if (memq sc '(any-reg descriptor-reg))
+ (inst mov dst (fixnumize val))
+ (inst mov dst val)))
+ (symbol
+ (aver (eq sc 'descriptor-reg))
+ (load-symbol dst val))
+ (character
+ (cond ((memq sc '(any-reg descriptor-reg))
+ (inst mov dst
+ (logior (ash (char-code val) n-widetag-bits)
+ character-widetag)))
+ (t
+ (aver (eq sc 'character-reg))
+ (inst mov dst (char-code val)))))))))
+ (aver (null (rest flags)))
+ (if (sc-is else immediate)
+ (load-immediate res else)
+ (move res else))
+ (when (sc-is then immediate)
+ (load-immediate temp then (sc-name (tn-sc res)))
+ (setf then temp))
+ (inst cmov (first flags) res then))))
+
+(macrolet ((def-move-if (name type reg stack)
+ `(define-vop (,name move-if)
+ (:args (then :scs (immediate ,reg ,stack) :to :eval
+ :target temp
+ :load-if (not (or (sc-is then immediate)
+ (and (sc-is then ,stack)
+ (not (location= else res))))))
+ (else :scs (immediate ,reg ,stack) :target res
+ :load-if (not (sc-is else immediate ,stack))))
+ (:arg-types ,type ,type)
+ (:results (res :scs (,reg)
+ :from (:argument 1)))
+ (:result-types ,type))))
+ (def-move-if move-if/t t descriptor-reg control-stack)
+ (def-move-if move-if/fx tagged-num any-reg control-stack)
+ (def-move-if move-if/unsigned unsigned-num unsigned-reg unsigned-stack)
+ (def-move-if move-if/signed signed-num signed-reg signed-stack)
+ ;; FIXME: See *CMOV-PTYPE-REPRESENTATION-VOP* above.
+ #!+sb-unicode
+ (def-move-if move-if/char character character-reg character-stack)
+ (def-move-if move-if/sap system-area-pointer sap-reg sap-stack))