X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fpred.lisp;h=9d1eb67814e66166ee94001da1c9f0edebbabb80;hb=ba871531b6b394da295c9a4527346e1e6327ccca;hp=01d1d9a604bc9a63c2240aa7691f035a56826ba3;hpb=78fa16bf55be44cc16845be84d98023e83fb14bc;p=sbcl.git diff --git a/src/compiler/x86-64/pred.lisp b/src/compiler/x86-64/pred.lisp index 01d1d9a..9d1eb67 100644 --- a/src/compiler/x86-64/pred.lisp +++ b/src/compiler/x86-64/pred.lisp @@ -27,12 +27,12 @@ ;;; not immediate data. (define-vop (if-eq) (:args (x :scs (any-reg descriptor-reg control-stack constant) - :load-if (not (and (sc-is x immediate) - (sc-is y any-reg descriptor-reg - control-stack constant)))) - (y :scs (any-reg descriptor-reg immediate) - :load-if (not (and (sc-is x any-reg descriptor-reg immediate) - (sc-is y control-stack constant))))) + :load-if (not (and (sc-is x immediate) + (sc-is y any-reg descriptor-reg + control-stack constant)))) + (y :scs (any-reg descriptor-reg immediate) + :load-if (not (and (sc-is x any-reg descriptor-reg immediate) + (sc-is y control-stack constant))))) (:temporary (:sc descriptor-reg) temp) (:conditional) (:info target not-p) @@ -42,41 +42,41 @@ (cond ((sc-is y immediate) (let ((val (tn-value y))) - (etypecase val - (integer - (if (and (zerop val) (sc-is x any-reg descriptor-reg)) - (inst test x x) ; smaller - (let ((fixnumized (fixnumize val))) - (if (typep fixnumized - '(or (signed-byte 32) (unsigned-byte 31))) - (inst cmp x fixnumized) - (progn - (inst mov temp fixnumized) - (inst cmp x temp)))))) - (symbol - (inst cmp x (+ nil-value (static-symbol-offset val)))) - (character - (inst cmp x (logior (ash (char-code val) n-widetag-bits) - character-widetag)))))) + (etypecase val + (integer + (if (and (zerop val) (sc-is x any-reg descriptor-reg)) + (inst test x x) ; smaller + (let ((fixnumized (fixnumize val))) + (if (typep fixnumized + '(or (signed-byte 32) (unsigned-byte 31))) + (inst cmp x fixnumized) + (progn + (inst mov temp fixnumized) + (inst cmp x temp)))))) + (symbol + (inst cmp x (+ nil-value (static-symbol-offset val)))) + (character + (inst cmp x (logior (ash (char-code val) n-widetag-bits) + character-widetag)))))) ((sc-is x immediate) ; and y not immediate ;; Swap the order to fit the compare instruction. (let ((val (tn-value x))) - (etypecase val - (integer - (if (and (zerop val) (sc-is y any-reg descriptor-reg)) - (inst test y y) ; smaller - (let ((fixnumized (fixnumize val))) - (if (typep fixnumized - '(or (signed-byte 32) (unsigned-byte 31))) - (inst cmp y fixnumized) - (progn - (inst mov temp fixnumized) - (inst cmp y temp)))))) - (symbol - (inst cmp y (+ nil-value (static-symbol-offset val)))) - (character - (inst cmp y (logior (ash (char-code val) n-widetag-bits) - character-widetag)))))) + (etypecase val + (integer + (if (and (zerop val) (sc-is y any-reg descriptor-reg)) + (inst test y y) ; smaller + (let ((fixnumized (fixnumize val))) + (if (typep fixnumized + '(or (signed-byte 32) (unsigned-byte 31))) + (inst cmp y fixnumized) + (progn + (inst mov temp fixnumized) + (inst cmp y temp)))))) + (symbol + (inst cmp y (+ nil-value (static-symbol-offset val)))) + (character + (inst cmp y (logior (ash (char-code val) n-widetag-bits) + character-widetag)))))) (t (inst cmp x y)))