[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Jul 16 10:42:41 UTC 2004


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv12224

Modified Files:
	integers.lisp 
Log Message:
Fixed a nasty bug in ash which failed to handle the situation when a
bignum got shifted to zero. Also fixed a bug in truncate on negatives.

Date: Fri Jul 16 03:42:41 2004
Author: ffjeld

Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.67 movitz/losp/muerte/integers.lisp:1.68
--- movitz/losp/muerte/integers.lisp:1.67	Thu Jul 15 17:03:05 2004
+++ movitz/losp/muerte/integers.lisp	Fri Jul 16 03:42:40 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.67 2004/07/16 00:03:05 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.68 2004/07/16 10:42:40 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -1133,21 +1133,23 @@
 	     (:andl -4 :eax)
 	     (:cld)))
 	  (positive-bignum
-	   (let* ((result-length (- (integer-length integer) count))
-		  (result (%make-bignum (truncate (+ result-length 31) 32))))
-	     (multiple-value-bind (long short)
-		 (truncate count 16)
-	       (let ((src-max-bigit (* 2 (%bignum-bigits integer))))
-		 (dotimes (i (* 2 (%bignum-bigits result)))
-		   (let ((src (+ i long)))
-		     (setf (memref result -2 i :unsigned-byte16)
-		       (if (< src src-max-bigit)
-			   (memref integer -2 src :unsigned-byte16)
-			 0)))))
-	       (setf result (%bignum-canonicalize result))
-	       (dotimes (i short result)
-		 (setf result (truncate result 2)))
-	       result))))))))
+	   (let ((result-length (- (integer-length integer) count)))
+	     (if (<= result-length 0)
+		 0
+	       (let ((result (%make-bignum (truncate (+ result-length 31) 32))))
+		 (multiple-value-bind (long short)
+		     (truncate count 16)
+		   (let ((src-max-bigit (* 2 (%bignum-bigits integer))))
+		     (dotimes (i (* 2 (%bignum-bigits result)))
+		       (let ((src (+ i long)))
+			 (setf (memref result -2 i :unsigned-byte16)
+			   (if (< src src-max-bigit)
+			       (memref integer -2 src :unsigned-byte16)
+			     0)))))
+		   (setf result (%bignum-canonicalize result))
+		   (dotimes (i short result)
+		     (setf result (truncate result 2)))
+		   result))))))))))
 
 ;;;;
 
@@ -1540,12 +1542,12 @@
 		   (%negatef r number divisor))))
 	(((integer 0 *) (integer * -1))
 	 (multiple-value-bind (q r)
-	     (truncate (- number) divisor)
+	     (truncate number (- divisor))
 	   (values (%negatef q number divisor)
 		   r)))
 	(((integer * -1) (integer * -1))
 	 (multiple-value-bind (q r)
-	     (truncate (- number) divisor)
+	     (truncate (- number) (- divisor))
 	   (values q (%negatef r number divisor))))
 	))))
 





More information about the Movitz-cvs mailing list