Fix another assumption w.r.t fixnum width and n-lowtag-bits
authorPaul Khuong <pvk@pvk.ca>
Sat, 22 Oct 2011 01:02:17 +0000 (21:02 -0400)
committerPaul Khuong <pvk@pvk.ca>
Sat, 22 Oct 2011 01:04:55 +0000 (21:04 -0400)
 This time in LOGBITP.

 Reported by Eric Marsden on sbcl-devel.

src/code/numbers.lisp
tests/arith.pure.lisp

index b6ba6a2..7bb61f9 100644 (file)
@@ -1085,9 +1085,9 @@ the first."
   #!+sb-doc
   "Predicate returns T if bit index of integer is a 1."
   (number-dispatch ((index integer) (integer integer))
-    ((fixnum fixnum) (if (> index #.(- sb!vm:n-word-bits sb!vm:n-lowtag-bits))
-                         (minusp integer)
-                         (not (zerop (logand integer (ash 1 index))))))
+    ((fixnum fixnum) (if (< index sb!vm:n-positive-fixnum-bits)
+                         (not (zerop (logand integer (ash 1 index))))
+                         (minusp integer)))
     ((fixnum bignum) (bignum-logbitp index integer))
     ((bignum (foreach fixnum bignum)) (minusp integer))))
 
index de2d600..9f04fcf 100644 (file)
                       (error "bad results for ~s with dividend type ~s"
                              (list fun dividend divisor)
                              dividend-type))))))))))))
+
+;; The fast path for logbitp underestimated sb!vm:n-positive-fixnum-bits
+;; for > 61 bit fixnums.
+(with-test (:name :logbitp-wide-fixnum)
+  (assert (not (logbitp (1- (integer-length most-positive-fixnum))
+                        most-negative-fixnum))))