[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Sat Jul 17 11:27:58 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv18176
Modified Files:
integers.lisp
Log Message:
This bignum multiply is twice as good in time, space, and read/portability.
Date: Sat Jul 17 04:27:58 2004
Author: ffjeld
Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.69 movitz/losp/muerte/integers.lisp:1.70
--- movitz/losp/muerte/integers.lisp:1.69 Fri Jul 16 18:48:08 2004
+++ movitz/losp/muerte/integers.lisp Sat Jul 17 04:27:58 2004
@@ -9,7 +9,7 @@
;;;; Created at: Wed Nov 8 18:44:57 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: integers.lisp,v 1.69 2004/07/17 01:48:08 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.70 2004/07/17 11:27:58 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -487,11 +487,7 @@
0)
((< minuend subtrahend)
(let ((x (- subtrahend minuend)))
- (when (typep x 'bignum)
- (setf (memref x ,(bt:slot-offset 'movitz::movitz-bignum 'movitz::sign)
- 0 :unsigned-byte8)
- #xff))
- x))
+ (%negatef x subtrahend minuend)))
(t (%bignum-canonicalize
(with-inline-assembly (:returns :eax)
(:compile-two-forms (:eax :ebx) (copy-bignum minuend) subtrahend)
@@ -1093,6 +1089,7 @@
(cond
((= 0 count)
integer)
+ ((= 0 integer) 0)
((plusp count)
(let ((result-length (+ (integer-length integer) count)))
(cond
@@ -1382,13 +1379,11 @@
(if (< x y)
(* y x)
;; X is the biggest factor.
- (let ((r 0) (f 0))
- (dotimes (half-bigit (* 2 (%bignum-bigits y)))
- (let* ((digit (* x (memref y -2 half-bigit :unsigned-byte16)))
- (delta1 (ash digit f)))
- (incf r delta1))
- (incf f 16))
- r)))
+ (do ((r 0)
+ (length (integer-length y))
+ (i 0 (+ i 29)))
+ ((>= i length) r)
+ (incf r (ash (* x (ldb (byte 29 i) y)) i)))))
((t (integer * -1))
(%negatef (* x (- y)) x y))
(((integer * -1) t)
More information about the Movitz-cvs
mailing list