;;; 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