Changeset 11111


Ignore:
Timestamp:
Oct 17, 2008, 7:01:21 AM (11 years ago)
Author:
rme
Message:

%MULTIPLY-AND-ADD-LOOP: New function, adapted from x8632 code.

MULTIPLY-BIGNUMS: use said new function for inner loop.

Location:
trunk/source/level-0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/level-0/X86/X8664/x8664-bignum.lisp

    r8404 r11111  
    3636  (single-value-return))
    3737 
     38;; multiply x[i] by y and add to result starting at digit idx
     39(defx86lapfunction %multiply-and-add-loop
     40    ((x 16) (y 8) #|(ra 0)|# (r arg_x) (idx arg_y) (ylen arg_z))
     41  (let ((cc mm2)
     42        (xx mm3)
     43        (yy mm4)
     44        (rr mm5)
     45        (i imm0)
     46        (j imm1))
     47    (unbox-fixnum idx i)
     48    (movq (@ x (% rsp)) (% temp0))
     49    (movd (@ x8664::misc-data-offset (% temp0) (% i) 4) (% xx)) ;x[i]
     50    (movq (@ y (% rsp)) (% temp0))
     51    (movq (% r) (% temp1))
     52    (pxor (% cc) (% cc))
     53    (xorq (% j) (% j))
     54    @loop
     55    (movd (@ x8664::misc-data-offset (% temp0) (% j) 4) (% yy)) ;y[j]
     56    (pmuludq (% xx) (% yy))
     57    ;; 64-bit product now in %yy
     58    (movd (@ x8664::misc-data-offset (% temp1) (% i) 4) (% rr))
     59    ;; add in digit from r[i]
     60    (paddq (% yy) (% rr))
     61    ;; add in carry
     62    (paddq (% cc) (% rr))
     63    (movd (% rr) (@ x8664::misc-data-offset (% temp1) (% i) 4)) ;update r[i]
     64    (movq (% rr) (% cc))
     65    (psrlq ($ 32) (% cc))               ;get carry digit into low word
     66    (addq ($ 1) (% i))
     67    (addq ($ 1) (% j))
     68    (subq ($ '1) (% ylen))
     69    (jg @loop)
     70    (movd (% cc) (@ x8664::misc-data-offset (% temp1) (% i) 4))
     71    (single-value-return 4)))
    3872
    3973
  • trunk/source/level-0/l0-bignum64.lisp

    r8529 r11111  
    755755                    (res (%allocate-bignum len-res)) )
    756756               (declare (bignum-index len-a len-b len-res))
    757                (dotimes (i len-a)
    758                  (declare (type bignum-index i))
    759                  (let* ((carry-digit 0)
    760                         (x (bignum-ref a i))
    761                         (k i))
    762                    (declare (fixnum k))
    763                    (dotimes (j len-b)
    764                      (multiple-value-bind (big-carry res-digit)
    765                          (%multiply-and-add4 x
    766                                              (bignum-ref b j)
    767                                              (bignum-ref res k)
    768                                              carry-digit)
    769                        (setf (bignum-ref res k) res-digit
    770                              carry-digit big-carry
    771                              k (1+ k))))
    772                    (setf (bignum-ref res k) carry-digit)))
    773                  res)))
     757               (dotimes (i len-a)
     758                 (declare (type bignum-index i))
     759                 (%multiply-and-add-loop a b res i len-b))
     760               res)))
    774761      (let* ((res (with-negated-bignum-buffers a b multiply-unsigned-bignums)))
    775762        (if signs-differ (negate-bignum-in-place res))
Note: See TracChangeset for help on using the changeset viewer.