[BACK]Return to addmul_1.S CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpn / pa64w

Annotation of OpenXM_contrib/gmp/mpn/pa64w/addmul_1.S, Revision 1.1.1.1

1.1       maekawa     1: ; HP-PA 2.0 64-bit __gmpn_addmul_1 -- Multiply a limb vector with a limb and
                      2: ; add the result to a second limb vector.
                      3:
                      4: ; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
                      5:
                      6: ; This file is part of the GNU MP Library.
                      7:
                      8: ; The GNU MP Library is free software; you can redistribute it and/or modify
                      9: ; it under the terms of the GNU Lesser General Public License as published by
                     10: ; the Free Software Foundation; either version 2.1 of the License, or (at your
                     11: ; option) any later version.
                     12:
                     13: ; The GNU MP Library is distributed in the hope that it will be useful, but
                     14: ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15: ; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
                     16: ; License for more details.
                     17:
                     18: ; You should have received a copy of the GNU Lesser General Public License
                     19: ; along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
                     20: ; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                     21: ; MA 02111-1307, USA.
                     22:
                     23: ; INPUT PARAMETERS
                     24: #define rptr           %r26
                     25: #define sptr           %r25
                     26: #define size           %r24
                     27: #define s2limb         %r23
                     28:
                     29: ; This runs at 11 cycles/limb on a PA8000.  It might be possible to make
                     30: ; it faster, but the PA8000 pipeline is not publically documented and it
                     31: ; is very complex to reverse engineer
                     32:
                     33: #define t1 %r19
                     34: #define rlimb %r20
                     35: #define hi %r21
                     36: #define lo %r22
                     37: #define m0 %r28
                     38: #define m1 %r3
                     39: #define cylimb %r29
                     40: #define t3 %r4
                     41: #define t2 %r6
                     42: #define t5 %r23
                     43: #define t4 %r31
                     44:        .level  2.0w
                     45:        .code
                     46:        .export __gmpn_addmul_1,entry
                     47: __gmpn_addmul_1
                     48:        .proc
                     49:        .callinfo frame=128,no_calls
                     50:        .entry
                     51:        std             s2limb,-56(%r30)
                     52:         fldd           -56(%r30),%fr5
                     53:        ldo             128(%r30),%r30
                     54:        add             %r0,%r0,cylimb          ; clear cy and cylimb
                     55:
                     56:        std             %r3,-96(%r30)
                     57:        std             %r4,-88(%r30)
                     58:        std             %r5,-80(%r30)
                     59:        std             %r6,-72(%r30)
                     60:        depdi,z         1,31,1,%r5
                     61:
                     62:        fldd            0(sptr),%fr4
                     63:        ldo             8(sptr),sptr
                     64:
                     65:        xmpyu           %fr5R,%fr4R,%fr6
                     66:        fstd            %fr6,-128(%r30)
                     67:        xmpyu           %fr5R,%fr4L,%fr7
                     68:        fstd            %fr7,-120(%r30)
                     69:        xmpyu           %fr5L,%fr4R,%fr8
                     70:        fstd            %fr8,-112(%r30)
                     71:        xmpyu           %fr5L,%fr4L,%fr9
                     72:        fstd            %fr9,-104(%r30)
                     73:        ldd             -128(%r30),lo           ; lo = low 64 bit of product
                     74:        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
                     75:        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
                     76:        ldd             -104(%r30),hi           ; hi = high 64 bit of product
                     77:        addib,=         -1,%r24,L$end1
                     78:        nop
                     79:        fldd            0(sptr),%fr4
                     80:        ldo             8(sptr),sptr
                     81:        addib,=         -1,%r24,L$end2
                     82:        nop
                     83: L$loop
                     84:        xmpyu           %fr5R,%fr4R,%fr6
                     85:        fstd            %fr6,-128(%r30)
                     86:        xmpyu           %fr5R,%fr4L,%fr7
                     87:        fstd            %fr7,-120(%r30)
                     88:        xmpyu           %fr5L,%fr4R,%fr8
                     89:        fstd            %fr8,-112(%r30)
                     90:        xmpyu           %fr5L,%fr4L,%fr9
                     91:        fstd            %fr9,-104(%r30)
                     92:        ldd             0(rptr),rlimb
                     93:        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
                     94:        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
                     95:        add,l           m0,t1,t1                ; t1 += m0
                     96:        add,l,*nuv      m1,t1,t1                ; t1 += m1
                     97:         add,l          %r5,hi,hi               ; propagate carry
                     98:        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
                     99:        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
                    100:        add,l           t5,t4,t4                ; t4 += lo32(t1)
                    101:        ldd             -128(%r30),lo           ; lo = low 64 bit of product
                    102:        add             cylimb,rlimb,rlimb
                    103:        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
                    104:        add,dc          t2,hi,cylimb
                    105:        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
                    106:        add             t4,rlimb,t3
                    107:        ldd             -104(%r30),hi           ; hi = high 64 bit of product
                    108:        add,dc          %r0,cylimb,cylimb
                    109:        fldd            0(sptr),%fr4
                    110:        ldo             8(sptr),sptr
                    111:        std             t3,0(rptr)
                    112:        addib,<>        -1,%r24,L$loop
                    113:        ldo             8(rptr),rptr
                    114: L$end2
                    115:        xmpyu           %fr5R,%fr4R,%fr6
                    116:        fstd            %fr6,-128(%r30)
                    117:        xmpyu           %fr5R,%fr4L,%fr7
                    118:        fstd            %fr7,-120(%r30)
                    119:        xmpyu           %fr5L,%fr4R,%fr8
                    120:        fstd            %fr8,-112(%r30)
                    121:        xmpyu           %fr5L,%fr4L,%fr9
                    122:        fstd            %fr9,-104(%r30)
                    123:        ldd             0(rptr),rlimb
                    124:        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
                    125:        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
                    126:        add,l           m0,t1,t1                ; t1 += m0
                    127:        add,l,*nuv      m1,t1,t1                ; t1 += m0
                    128:         add,l          %r5,hi,hi               ; propagate carry
                    129:        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
                    130:        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
                    131:        add,l           t5,t4,t4                ; t4 += lo32(t1)
                    132:        ldd             -128(%r30),lo           ; lo = low 64 bit of product
                    133:        add             cylimb,rlimb,rlimb
                    134:        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
                    135:        add,dc          t2,hi,cylimb
                    136:        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
                    137:        add             t4,rlimb,t3
                    138:        ldd             -104(%r30),hi           ; hi = high 64 bit of product
                    139:        add,dc          %r0,cylimb,cylimb
                    140:        std             t3,0(rptr)
                    141:        ldo             8(rptr),rptr
                    142: L$end1
                    143:        ldd             0(rptr),rlimb
                    144:        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
                    145:        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
                    146:        add,l           m0,t1,t1                ; t1 += m0
                    147:        add,l,*nuv      m1,t1,t1                ; t1 += m0
                    148:         add,l          %r5,hi,hi               ; propagate carry
                    149:        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
                    150:        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
                    151:        add,l           t5,t4,t4                ; t4 += lo32(t1)
                    152:        add             cylimb,rlimb,rlimb
                    153:        add,dc          t2,hi,cylimb
                    154:        add             t4,rlimb,t3
                    155:        add,dc          %r0,cylimb,cylimb
                    156:        std             t3,0(rptr)
                    157:        ldo             8(rptr),rptr
                    158:
                    159:        ldd             -96(%r30),%r3
                    160:        ldd             -88(%r30),%r4
                    161:        ldd             -80(%r30),%r5
                    162:        ldd             -72(%r30),%r6
                    163:
                    164:        copy            cylimb,%r28
                    165:        bve             (%r2)
                    166:        .exit
                    167:        ldo             -128(%r30),%r30
                    168:        .procend

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>