[BACK]Return to submul_1.asm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpn / pa32 / hppa1_1 / pa7100

Annotation of OpenXM_contrib/gmp/mpn/pa32/hppa1_1/pa7100/submul_1.asm, Revision 1.1

1.1     ! ohara       1: dnl  HP-PA 7100/7200 mpn_submul_1 -- Multiply a limb vector with a limb and
        !             2: dnl  subtract the result from a second limb vector.
        !             3:
        !             4: dnl  Copyright 1995, 2000, 2001, 2002 Free Software Foundation, Inc.
        !             5:
        !             6: dnl  This file is part of the GNU MP Library.
        !             7:
        !             8: dnl  The GNU MP Library is free software; you can redistribute it and/or modify
        !             9: dnl  it under the terms of the GNU Lesser General Public License as published
        !            10: dnl  by the Free Software Foundation; either version 2.1 of the License, or (at
        !            11: dnl  your option) any later version.
        !            12:
        !            13: dnl  The GNU MP Library is distributed in the hope that it will be useful, but
        !            14: dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            15: dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
        !            16: dnl  License for more details.
        !            17:
        !            18: dnl  You should have received a copy of the GNU Lesser General Public License
        !            19: dnl  along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !            20: dnl  the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            21: dnl  MA 02111-1307, USA.
        !            22:
        !            23: include(`../config.m4')
        !            24:
        !            25: C INPUT PARAMETERS
        !            26: define(`res_ptr',`%r26')
        !            27: define(`s1_ptr',`%r25')
        !            28: define(`size_param',`%r24')
        !            29: define(`s2_limb',`%r23')
        !            30:
        !            31: define(`cylimb',`%r28')
        !            32: define(`s0',`%r19')
        !            33: define(`s1',`%r20')
        !            34: define(`s2',`%r3')
        !            35: define(`s3',`%r4')
        !            36: define(`lo0',`%r21')
        !            37: define(`lo1',`%r5')
        !            38: define(`lo2',`%r6')
        !            39: define(`lo3',`%r7')
        !            40: define(`hi0',`%r22')
        !            41: define(`hi1',`%r23')                           C safe to reuse
        !            42: define(`hi2',`%r29')
        !            43: define(`hi3',`%r1')
        !            44:
        !            45: ASM_START()
        !            46: PROLOGUE(mpn_submul_1)
        !            47: C      .callinfo       frame=128,no_calls
        !            48:
        !            49:        ldo     128(%r30),%r30
        !            50:        stws    s2_limb,-16(%r30)
        !            51:        add      %r0,%r0,cylimb                 C clear cy and cylimb
        !            52:        addib,< -4,size_param,L(few_limbs)
        !            53:        fldws   -16(%r30),%fr31R
        !            54:
        !            55:        ldo     -112(%r30),%r31
        !            56:        stw     %r3,-96(%r30)
        !            57:        stw     %r4,-92(%r30)
        !            58:        stw     %r5,-88(%r30)
        !            59:        stw     %r6,-84(%r30)
        !            60:        stw     %r7,-80(%r30)
        !            61:
        !            62:        bb,>=,n  s1_ptr,29,L(0)
        !            63:
        !            64:        fldws,ma 4(s1_ptr),%fr4
        !            65:        ldws     0(res_ptr),s0
        !            66:        xmpyu    %fr4,%fr31R,%fr5
        !            67:        fstds    %fr5,-16(%r31)
        !            68:        ldws    -16(%r31),cylimb
        !            69:        ldws    -12(%r31),lo0
        !            70:        sub      s0,lo0,s0
        !            71:        add      s0,lo0,%r0                     C invert cy
        !            72:        addib,< -1,size_param,L(few_limbs)
        !            73:        stws,ma  s0,4(res_ptr)
        !            74:
        !            75: C start software pipeline ----------------------------------------------------
        !            76:        .label  L(0)
        !            77:        fldds,ma 8(s1_ptr),%fr4
        !            78:        fldds,ma 8(s1_ptr),%fr8
        !            79:
        !            80:        xmpyu    %fr4L,%fr31R,%fr5
        !            81:        xmpyu    %fr4R,%fr31R,%fr6
        !            82:        xmpyu    %fr8L,%fr31R,%fr9
        !            83:        xmpyu    %fr8R,%fr31R,%fr10
        !            84:
        !            85:        fstds    %fr5,-16(%r31)
        !            86:        fstds    %fr6,-8(%r31)
        !            87:        fstds    %fr9,0(%r31)
        !            88:        fstds    %fr10,8(%r31)
        !            89:
        !            90:        ldws   -16(%r31),hi0
        !            91:        ldws   -12(%r31),lo0
        !            92:        ldws    -8(%r31),hi1
        !            93:        ldws    -4(%r31),lo1
        !            94:        ldws     0(%r31),hi2
        !            95:        ldws     4(%r31),lo2
        !            96:        ldws     8(%r31),hi3
        !            97:        ldws    12(%r31),lo3
        !            98:
        !            99:        addc     lo0,cylimb,lo0
        !           100:        addc     lo1,hi0,lo1
        !           101:        addc     lo2,hi1,lo2
        !           102:        addc     lo3,hi2,lo3
        !           103:
        !           104:        addib,<  -4,size_param,L(end)
        !           105:        addc     %r0,hi3,cylimb                 C propagate carry into cylimb
        !           106: C main loop ------------------------------------------------------------------
        !           107:        .label  L(loop)
        !           108:        fldds,ma 8(s1_ptr),%fr4
        !           109:        fldds,ma 8(s1_ptr),%fr8
        !           110:
        !           111:        ldws     0(res_ptr),s0
        !           112:        xmpyu    %fr4L,%fr31R,%fr5
        !           113:        ldws     4(res_ptr),s1
        !           114:        xmpyu    %fr4R,%fr31R,%fr6
        !           115:        ldws     8(res_ptr),s2
        !           116:        xmpyu    %fr8L,%fr31R,%fr9
        !           117:        ldws    12(res_ptr),s3
        !           118:        xmpyu    %fr8R,%fr31R,%fr10
        !           119:
        !           120:        fstds    %fr5,-16(%r31)
        !           121:        sub      s0,lo0,s0
        !           122:        fstds    %fr6,-8(%r31)
        !           123:        subb     s1,lo1,s1
        !           124:        fstds    %fr9,0(%r31)
        !           125:        subb     s2,lo2,s2
        !           126:        fstds    %fr10,8(%r31)
        !           127:        subb     s3,lo3,s3
        !           128:        subb     %r0,%r0,lo0                    C these two insns ...
        !           129:        add      lo0,lo0,%r0                    C ... just invert cy
        !           130:
        !           131:        ldws   -16(%r31),hi0
        !           132:        ldws   -12(%r31),lo0
        !           133:        ldws    -8(%r31),hi1
        !           134:        ldws    -4(%r31),lo1
        !           135:        ldws     0(%r31),hi2
        !           136:        ldws     4(%r31),lo2
        !           137:        ldws     8(%r31),hi3
        !           138:        ldws    12(%r31),lo3
        !           139:
        !           140:        addc     lo0,cylimb,lo0
        !           141:        stws,ma  s0,4(res_ptr)
        !           142:        addc     lo1,hi0,lo1
        !           143:        stws,ma  s1,4(res_ptr)
        !           144:        addc     lo2,hi1,lo2
        !           145:        stws,ma  s2,4(res_ptr)
        !           146:        addc     lo3,hi2,lo3
        !           147:        stws,ma  s3,4(res_ptr)
        !           148:
        !           149:        addib,>= -4,size_param,L(loop)
        !           150:        addc     %r0,hi3,cylimb                 C propagate carry into cylimb
        !           151: C finish software pipeline ---------------------------------------------------
        !           152:        .label  L(end)
        !           153:        ldws     0(res_ptr),s0
        !           154:        ldws     4(res_ptr),s1
        !           155:        ldws     8(res_ptr),s2
        !           156:        ldws    12(res_ptr),s3
        !           157:
        !           158:        sub      s0,lo0,s0
        !           159:        stws,ma  s0,4(res_ptr)
        !           160:        subb     s1,lo1,s1
        !           161:        stws,ma  s1,4(res_ptr)
        !           162:        subb     s2,lo2,s2
        !           163:        stws,ma  s2,4(res_ptr)
        !           164:        subb     s3,lo3,s3
        !           165:        stws,ma  s3,4(res_ptr)
        !           166:        subb     %r0,%r0,lo0                    C these two insns ...
        !           167:        add      lo0,lo0,%r0                    C ... invert cy
        !           168:
        !           169: C restore callee-saves registers ---------------------------------------------
        !           170:        ldw     -96(%r30),%r3
        !           171:        ldw     -92(%r30),%r4
        !           172:        ldw     -88(%r30),%r5
        !           173:        ldw     -84(%r30),%r6
        !           174:        ldw     -80(%r30),%r7
        !           175:
        !           176:        .label  L(few_limbs)
        !           177:        addib,=,n 4,size_param,L(ret)
        !           178:
        !           179:        .label  L(loop2)
        !           180:        fldws,ma 4(s1_ptr),%fr4
        !           181:        ldws     0(res_ptr),s0
        !           182:        xmpyu    %fr4,%fr31R,%fr5
        !           183:        fstds    %fr5,-16(%r30)
        !           184:        ldws    -16(%r30),hi0
        !           185:        ldws    -12(%r30),lo0
        !           186:        addc     lo0,cylimb,lo0
        !           187:        addc     %r0,hi0,cylimb
        !           188:        sub      s0,lo0,s0
        !           189:        add      s0,lo0,%r0                     C invert cy
        !           190:        stws,ma  s0,4(res_ptr)
        !           191:        addib,<> -1,size_param,L(loop2)
        !           192:        nop
        !           193:
        !           194:        .label  L(ret)
        !           195:        addc     %r0,cylimb,cylimb
        !           196:        bv       0(%r2)
        !           197:        ldo      -128(%r30),%r30
        !           198: EPILOGUE(mpn_submul_1)

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