X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Ftype-vops.lisp;h=bc246c596dec985b6fcd86236465e0ecd37cc77a;hb=6794373d588cef4333fbbb9d04b931ae0a414a7f;hp=8e99ec1e23c0798931afe81fca59b1e1efb813f0;hpb=39117fb4cade75e692196cfca1ae3c320546a254;p=sbcl.git diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 8e99ec1..bc246c5 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -219,17 +219,19 @@ (:args (value :scs (unsigned-reg))) (:arg-types unsigned-num) (:translate fixnump) - (:temporary (:sc unsigned-reg) tmp) + (:temporary (:sc unsigned-reg :from (:argument 0)) tmp) (:info) (:conditional :z) (:generator 5 - (inst mov tmp value) + (move tmp value) (inst shr tmp n-positive-fixnum-bits))) -(define-vop (fixnump/signed-byte-64 type-predicate) +#-#.(cl:if (cl:= sb!vm:n-fixnum-tag-bits 1) '(:and) '(:or)) +(define-vop (fixnump/signed-byte-64 simple-type-predicate) (:args (value :scs (signed-reg))) (:info) - (:conditional #.(if (= sb!vm:n-fixnum-tag-bits 1) :ns :z)) + (:conditional :z) + (:temporary (:sc unsigned-reg :offset eax-offset) eax) (:arg-types signed-num) (:translate fixnump) (:generator 5 @@ -239,8 +241,20 @@ ;; ((x-a) >> n) = 0 (inst mov rax-tn #.(- sb!xc:most-negative-fixnum)) (inst add rax-tn value) - (unless (= n-fixnum-tag-bits 1) - (inst shr rax-tn n-fixnum-bits)))) + (inst shr rax-tn n-fixnum-bits))) + +#+#.(cl:if (cl:= sb!vm:n-fixnum-tag-bits 1) '(:and) '(:or)) +(define-vop (fixnump/signed-byte-64 simple-type-predicate) + (:args (value :scs (signed-reg) :target temp)) + (:info) + (:conditional :no) + (:temporary (:sc unsigned-reg :from (:argument 0)) temp) + (:arg-types signed-num) + (:translate fixnump) + (:generator 5 + (move temp value) + ;; The overflow flag will be set if the reg's sign bit changes. + (inst shl temp 1))) ;;; A (SIGNED-BYTE 64) can be represented with either fixnum or a bignum with ;;; exactly one digit.