0.9.6.24:
authorJuho Snellman <jsnell@iki.fi>
Sun, 6 Nov 2005 04:00:38 +0000 (04:00 +0000)
committerJuho Snellman <jsnell@iki.fi>
Sun, 6 Nov 2005 04:00:38 +0000 (04:00 +0000)
Faster bignum subtraction and division.

        (Patch from sbcl-devel "A microoptimisation of bignum subtraction
        on x86/x86-64" by Lutz Euler on 2005-10-16)

NEWS
src/compiler/x86-64/arith.lisp
src/compiler/x86/arith.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index ca8d410..aa9d6b8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,8 @@ changes in sbcl-0.9.7 relative to sbcl-0.9.6:
   * optimization: much faster memory allocation on x86-64
   * optimization: faster garbage collections (latency and throughput)
     on gencgc
+  * optimization: faster bignum subtraction and division on x86 and x86-64 
+    (thanks to Lutz Euler)
 
 changes in sbcl-0.9.6 relative to sbcl-0.9.5:
   * bug fix: add a workaround to SBCL looping infinitely at startup on
index 3045903..d509aac 100644 (file)
 
 
 ;;; For add and sub with carry the sc of carry argument is any-reg so
-;;; the it may be passed as a fixnum or word and thus may be 0, 1, or
-;;; 4. This is easy to deal with and may save a fixnum-word
+;;; that it may be passed as a fixnum or word and thus may be 0, 1, or
+;;; 8. This is easy to deal with and may save a fixnum-word
 ;;; conversion.
 (define-vop (add-w/carry)
   (:translate sb!bignum:%add-with-carry)
     (inst mov carry 0)
     (inst adc carry carry)))
 
-;;; Note: the borrow is the oppostite of the x86 convention - 1 for no
-;;; borrow and 0 for a borrow.
+;;; Note: the borrow is 1 for no borrow and 0 for a borrow, the opposite
+;;; of the x86-64 convention.
 (define-vop (sub-w/borrow)
   (:translate sb!bignum:%subtract-with-borrow)
   (:policy :fast-safe)
     (inst cmp c 1) ; Set the carry flag to 1 if c=0 else to 0
     (move result a)
     (inst sbb result b)
-    (inst mov borrow 0)
-    (inst adc borrow borrow)
-    (inst xor borrow 1)))
+    (inst mov borrow 1)
+    (inst sbb borrow 0)))
 
 
 (define-vop (bignum-mult-and-add-3-arg)
index 46f5326..7c6b433 100644 (file)
 
 
 ;;; For add and sub with carry the sc of carry argument is any-reg so
-;;; the it may be passed as a fixnum or word and thus may be 0, 1, or
+;;; that it may be passed as a fixnum or word and thus may be 0, 1, or
 ;;; 4. This is easy to deal with and may save a fixnum-word
 ;;; conversion.
 (define-vop (add-w/carry)
     (inst mov carry 0)
     (inst adc carry carry)))
 
-;;; Note: the borrow is the oppostite of the x86 convention - 1 for no
-;;; borrow and 0 for a borrow.
+;;; Note: the borrow is 1 for no borrow and 0 for a borrow, the opposite
+;;; of the x86 convention.
 (define-vop (sub-w/borrow)
   (:translate sb!bignum:%subtract-with-borrow)
   (:policy :fast-safe)
     (inst cmp c 1) ; Set the carry flag to 1 if c=0 else to 0
     (move result a)
     (inst sbb result b)
-    (inst mov borrow 0)
-    (inst adc borrow borrow)
-    (inst xor borrow 1)))
+    (inst mov borrow 1)
+    (inst sbb borrow 0)))
 
 
 (define-vop (bignum-mult-and-add-3-arg)
index a267a31..4337bf5 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.6.23"
+"0.9.6.24"