micro-optimize FIXNUMP on known (signed-byte 64) quantities on x86-64
authorNathan Froyd <froydnj@gmail.com>
Fri, 13 Apr 2012 17:25:31 +0000 (13:25 -0400)
committerNathan Froyd <froydnj@gmail.com>
Fri, 13 Apr 2012 17:26:49 +0000 (13:26 -0400)
Also attempt to keep things working for those who want smaller fixnums.

src/compiler/x86-64/type-vops.lisp

index 58e8854..0e8c9c4 100644 (file)
 (define-vop (fixnump/signed-byte-64 type-predicate)
   (:args (value :scs (signed-reg)))
   (:info)
-  (:conditional :z)
+  (:conditional #.(if (= sb!vm:n-fixnum-tag-bits 1) :ns :z))
   (:arg-types signed-num)
   (:translate fixnump)
   (:generator 5
     ;;    ((x-a) >> n) = 0
     (inst mov rax-tn #.(- sb!xc:most-negative-fixnum))
     (inst add rax-tn value)
-    (inst shr rax-tn #.(integer-length (- sb!xc:most-positive-fixnum
-                                          sb!xc:most-negative-fixnum)))))
+    (unless (= n-fixnum-tag-bits 1)
+      (inst shr rax-tn n-fixnum-bits))))
 
 ;;; A (SIGNED-BYTE 64) can be represented with either fixnum or a bignum with
 ;;; exactly one digit.