Changeset 12847


Ignore:
Timestamp:
Sep 16, 2009, 7:33:22 PM (10 years ago)
Author:
rme
Message:

Try doing bignum multiplies 64 bits at a time on ppc64, too.

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

Legend:

Unmodified
Added
Removed
  • trunk/source/level-0/PPC/PPC64/ppc64-bignum.lisp

    r11112 r12847  
    7373    (blr)))
    7474
     75(defppclapfunction %multiply-and-add-loop64
     76    ((x 8) (y 0) (r arg_x) (idx arg_y) (ylen arg_z))
     77  (let ((i imm0)
     78        (j imm1)
     79        (xx imm2)
     80        (yy imm3)
     81        (rr imm4)
     82        (dd imm5)
     83        (cc nargs))
     84    (ld temp0 x vsp)
     85    (la i ppc64::misc-data-offset idx)
     86    (ldx xx temp0 i)                    ;x[i]
     87    (rotldi xx xx 32)
     88    (ld temp0 y vsp)
     89    (li cc 0)
     90    (li j ppc64::misc-data-offset)
     91    @loop
     92    (ldx yy temp0 j)                    ;y[j]
     93    (rotldi yy yy 32)
     94    (mulld dd xx yy)  ;low
     95    (ldx rr r i)                        ;r[i]
     96    (rotldi rr rr 32)
     97    (addc rr rr dd)                     ;r[i] = r[i] + low
     98    (mulhdu dd xx yy)                   ;high
     99    (addze dd dd)                       ;carry from addding in low
     100    (addc rr rr cc)                     ;add in carry digit
     101    (addze cc dd)
     102    (rotldi rr rr 32)
     103    (stdx rr r i)                       ;update r[i]
     104    (cmpdi ylen '1)
     105    (la i 8 i)
     106    (la j 8 j)
     107    (subi ylen ylen '1)
     108    (bne @loop)
     109    (rotldi cc cc 32)
     110    (stdx cc r i)
     111    (set-nargs 0)
     112    (la vsp 16 vsp)
     113    (blr)))
     114
    75115;;; Multiply the (32-bit) digits X and Y, producing a 64-bit result.
    76116;;; Add the 32-bit "prev" digit and the 32-bit carry-in digit to that 64-bit
  • trunk/source/level-0/l0-bignum64.lisp

    r12839 r12847  
    821821               res)))
    822822      (let* ((res (with-negated-bignum-buffers a b
    823                                                #-x86-target
    824                                                multiply-unsigned-bignums
    825                                                #+x86-target
    826823                                               multiply-unsigned-bignums64)))
    827824        (if signs-differ (negate-bignum-in-place res))
Note: See TracChangeset for help on using the changeset viewer.