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)
* 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
;;; 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)
;;; 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)
;;; 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"