X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fpred.lisp;h=428c2c1de0135a47a61bb4b88418e62b5ee9cdab;hb=c712f88b26cd7547ee984b90e18c134401335bc3;hp=c74ed6012191d97e0347a3f058fea1184e39a116;hpb=d95f1e6476aa63695e018a7769a1ae9e002fca36;p=sbcl.git diff --git a/src/compiler/x86-64/pred.lisp b/src/compiler/x86-64/pred.lisp index c74ed60..428c2c1 100644 --- a/src/compiler/x86-64/pred.lisp +++ b/src/compiler/x86-64/pred.lisp @@ -78,6 +78,10 @@ ((unsigned-byte-64 unsigned-byte-63) unsigned-reg move-if/unsigned) (signed-byte-64 signed-reg move-if/signed) + ;; FIXME: Can't use CMOV with byte registers, and characters live + ;; in such outside of unicode builds. A better solution then just + ;; disabling MOVE-IF/CHAR should be possible, though. + #!+sb-unicode (character character-reg move-if/char) ((single-float complex-single-float @@ -103,10 +107,6 @@ (let ((scn (sc-number-or-lose representation))) (labels ((make-tn () (make-representation-tn ptype scn)) - (immediate-tn-p (tn) - (and (eq (sb!c::tn-kind tn) :constant) - (eq (sb!c::immediate-constant-sc (tn-value tn)) - (sc-number-or-lose 'immediate)))) (frob-tn (tn) (if (immediate-tn-p tn) tn @@ -180,33 +180,26 @@ (dolist (flag flags) (inst cmov flag res then)))))))) -(macrolet ((def-move-if (name type reg &optional stack) - (when stack (setf stack (list stack))) - - `(define-vop (,name move-if) - (:args (then :scs (immediate ,reg ,@stack) :to :eval - :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) - (def-move-if move-if/char - character character-reg character-stack) - (def-move-if move-if/sap - system-area-pointer sap-reg sap-stack)) - +(macrolet ((def-move-if (name type reg stack) + `(define-vop (,name move-if) + (:args (then :scs (immediate ,reg ,stack) :to :eval + :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)) ;;;; conditional VOPs