[Git][cmucl/cmucl][rtoy-bignum-mult-less-consing] Refactor common code into a routine

Raymond Toy rtoy at common-lisp.net
Sun Jul 15 20:47:58 UTC 2018


Raymond Toy pushed to branch rtoy-bignum-mult-less-consing at cmucl / cmucl


Commits:
228359b6 by Raymond Toy at 2018-07-15T13:47:44-07:00
Refactor common code into a routine

The code for applying the correction is pretty much identical for each
negative operant, so add a routine to do that.

- - - - -


1 changed file:

- src/code/bignum.lisp


Changes:

=====================================
src/code/bignum.lisp
=====================================
--- a/src/code/bignum.lisp
+++ b/src/code/bignum.lisp
@@ -963,31 +963,29 @@ down to individual words.")
 	    (setf carry-digit big-carry)
 	    (incf k)))
 	(setf (%bignum-ref res k) carry-digit)))
-    ;; Apply corrections if either of the arguments is negative.
-    (unless (%bignum-0-or-plusp a len-a)
-      (let ((borrow 1))
-	(dotimes (j len-b)
-	  (declare (type bignum-index j))
-	  (let ((index (+ j len-a)))
-	    (declare (type bignum-index index))
-	    (multiple-value-bind (d borrow-out)
-		(%subtract-with-borrow (%bignum-ref res index)
-				       (%bignum-ref b j)
-				       borrow)
-	      (setf (%bignum-ref res index) d)
-	      (setf borrow borrow-out))))))
-    (unless (%bignum-0-or-plusp b len-b)
-      (let ((borrow 1))
-	(dotimes (j len-a)
-	  (declare (type bignum-index j))
-	  (let ((index (+ j len-b)))
-	    (declare (type bignum-index index))
-	    (multiple-value-bind (d borrow-out)
-		(%subtract-with-borrow (%bignum-ref res index)
-				       (%bignum-ref a j)
-				       borrow)
-	      (setf (%bignum-ref res index) d)
-	      (setf borrow borrow-out))))))
+    (flet ((apply-correction (neg-arg neg-len pos-arg pos-len)
+	     ;; Applies the correction by basically subtracting out
+	     ;; 2^M*b where M is the length (in bits) of b and b is
+	     ;; the positive term in pos-arg.  neg-arg is the negative
+	     ;; arg.
+	     (let ((borrow 1))
+	       (dotimes (j pos-len)
+		 (declare (type bignum-index j))
+		 (let ((index (+ j neg-len)))
+		   (declare (type bignum-index index))
+		   (multiple-value-bind (d borrow-out)
+		       (%subtract-with-borrow (%bignum-ref res index)
+					      (%bignum-ref pos-arg j)
+					      borrow)
+		     (setf (%bignum-ref res index) d)
+		     (setf borrow borrow-out)))))))
+      ;; Apply corrections if either of the arguments is negative.
+      (unless (%bignum-0-or-plusp a len-a)
+	;; A is negative
+	(apply-correction a len-a b len-b))
+      (unless (%bignum-0-or-plusp b len-b)
+	;; B is negative
+	(apply-correction b len-b a len-a)))
     (%normalize-bignum res len-res)))
 
 (defparameter *min-karatsuba-bits* 512



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/228359b66be83465dcbda3c1a05ea1bb1cf85605

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/228359b66be83465dcbda3c1a05ea1bb1cf85605
You're receiving this email because of your account on gitlab.common-lisp.net.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20180715/2ef210eb/attachment-0001.html>


More information about the cmucl-cvs mailing list