0.9.18.71: fix build on Darwin 7.9.0 (OS X 10.3)
[sbcl.git] / src / code / bignum.lisp
index ad30b2f..c07fc19 100644 (file)
 ;;; results, such as GCD, use this. It assumes Result is big enough for the
 ;;; result.
 (defun subtract-bignum-buffers-with-len (a len-a b len-b result len-res)
-  (declare (type bignum-type a b)
-           (type bignum-index len-a len-b))
+  (declare (type bignum-type a b result)
+           (type bignum-index len-a len-b len-res))
   (subtract-bignum-loop a len-a b len-b result len-res
                         %normalize-bignum-buffer))
 
 (defun subtract-bignum-buffers (a len-a b len-b result)
-  (declare (type bignum-type a b)
+  (declare (type bignum-type a b result)
            (type bignum-index len-a len-b))
   (subtract-bignum-loop a len-a b len-b result (max len-a len-b)
                         %normalize-bignum-buffer))
 
 (defun bignum-logcount (bignum)
   (declare (type bignum-type bignum))
-  (let* ((length (%bignum-length bignum))
-         (plusp (%bignum-0-or-plusp bignum length))
-         (result 0))
+  (let ((length (%bignum-length bignum))
+        (result 0))
     (declare (type bignum-index length)
              (fixnum result))
     (do ((index 0 (1+ index)))
-        ((= index length) result)
+        ((= index length)
+         (if (%bignum-0-or-plusp bignum length)
+             result
+             (- (* length digit-size) result)))
       (let ((digit (%bignum-ref bignum index)))
         (declare (type bignum-element-type digit))
-        (incf result (logcount (if plusp digit (%lognot digit))))))))
+        (incf result (logcount digit))))))
 \f
 ;;;; logical operations