aorslsh1_n.asm
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:5k
- dnl PA64 mpn_addlsh1_n/mpn_sublsh1_n -- rp[] = up[] +- (vp[] << 1).
- dnl Copyright 2003 Free Software Foundation, Inc.
- dnl This file is part of the GNU MP Library.
- dnl The GNU MP Library is free software; you can redistribute it and/or modify
- dnl it under the terms of the GNU Lesser General Public License as published
- dnl by the Free Software Foundation; either version 3 of the License, or (at
- dnl your option) any later version.
- dnl The GNU MP Library is distributed in the hope that it will be useful, but
- dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- dnl License for more details.
- dnl You should have received a copy of the GNU Lesser General Public License
- dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/.
- include(`../config.m4')
- C cycles/limb
- C 8000,8200: 2
- C 8500,8600,8700: 1.75
- C TODO
- C * Write special feed-in code for each (n mod 8). (See the ia64 code.)
- C * Try to make this run at closer to 1.5 c/l.
- C * Set up register aliases (define(`u0',`%r19')).
- C * Explicitly align loop.
- dnl INPUT PARAMETERS
- define(`rp',`%r26')
- define(`up',`%r25')
- define(`vp',`%r24')
- define(`n',`%r23')
- ifdef(`OPERATION_addlsh1_n',`
- define(ADCSBC, `add,dc')
- define(INITC, `ldi 0,')
- define(func, mpn_addlsh1_n)
- ')
- ifdef(`OPERATION_sublsh1_n',`
- define(ADCSBC, `sub,db')
- define(INITC, `ldi 1,')
- define(func, mpn_sublsh1_n)
- ')
- MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_sublsh1_n)
- ifdef(`HAVE_ABI_2_0w',`
- define(LEVEL, `.level 2.0w')
- define(RETREG, `%r28')
- define(CLRRET1, `dnl')
- ')
- ifdef(`HAVE_ABI_2_0n',`
- define(LEVEL, `.level 2.0')
- define(RETREG, `%r29')
- define(CLRRET1, `ldi 0, %r28')
- ')
- LEVEL
- PROLOGUE(func)
- std,ma %r3, 0x100(%r30) C save reg
- INITC %r1 C init saved cy
- C Primitive code for the first (n mod 8) limbs:
- extrd,u n, 63, 3, %r22 C count for loop0
- comib,= 0, %r22, L(unrolled) C skip loop0?
- copy %r0, %r28
- LDEF(loop0)
- ldd 0(vp), %r21
- ldo 8(vp), vp
- ldd 0(up), %r19
- ldo 8(up), up
- shrpd %r21, %r28, 63, %r31
- addi -1, %r1, %r0 C restore cy
- ADCSBC %r19, %r31, %r29
- std %r29, 0(rp)
- add,dc %r0, %r0, %r1 C save cy
- copy %r21, %r28
- addib,> -1, %r22, L(loop0)
- ldo 8(rp), rp
- addib,>= -8, n, L(unrolled)
- addi -1, %r1, %r0 C restore cy
- shrpd %r0, %r28, 63, %r28
- ADCSBC %r0, %r28, RETREG
- ifdef(`OPERATION_sublsh1_n',
- ` sub %r0, RETREG, RETREG')
- CLRRET1
- bve (%r2)
- ldd,mb -0x100(%r30), %r3
- LDEF(unrolled)
- std %r4, -0xf8(%r30) C save reg
- ldd 0(vp), %r4
- std %r5, -0xf0(%r30) C save reg
- ldd 8(vp), %r5
- std %r6, -0xe8(%r30) C save reg
- ldd 16(vp), %r6
- std %r7, -0xe0(%r30) C save reg
- ldd 24(vp), %r7
- shrpd %r4, %r28, 63, %r31
- std %r8, -0xd8(%r30) C save reg
- ldd 32(vp), %r8
- shrpd %r5, %r4, 63, %r4
- std %r9, -0xd0(%r30) C save reg
- ldd 40(vp), %r9
- shrpd %r6, %r5, 63, %r5
- ldd 48(vp), %r3
- shrpd %r7, %r6, 63, %r6
- ldd 56(vp), %r28
- shrpd %r8, %r7, 63, %r7
- ldd 0(up), %r19
- shrpd %r9, %r8, 63, %r8
- ldd 8(up), %r20
- shrpd %r3, %r9, 63, %r9
- ldd 16(up), %r21
- shrpd %r28, %r3, 63, %r3
- ldd 24(up), %r22
- nop C alignment FIXME
- addib,<= -8, n, L(end)
- addi -1, %r1, %r0 C restore cy
- LDEF(loop)
- ADCSBC %r19, %r31, %r29
- ldd 32(up), %r19
- std %r29, 0(rp)
- ADCSBC %r20, %r4, %r29
- ldd 40(up), %r20
- std %r29, 8(rp)
- ADCSBC %r21, %r5, %r29
- ldd 48(up), %r21
- std %r29, 16(rp)
- ADCSBC %r22, %r6, %r29
- ldd 56(up), %r22
- std %r29, 24(rp)
- ADCSBC %r19, %r7, %r29
- ldd 64(vp), %r4
- std %r29, 32(rp)
- ADCSBC %r20, %r8, %r29
- ldd 72(vp), %r5
- std %r29, 40(rp)
- ADCSBC %r21, %r9, %r29
- ldd 80(vp), %r6
- std %r29, 48(rp)
- ADCSBC %r22, %r3, %r29
- std %r29, 56(rp)
- add,dc %r0, %r0, %r1 C save cy
- ldd 88(vp), %r7
- shrpd %r4, %r28, 63, %r31
- ldd 96(vp), %r8
- shrpd %r5, %r4, 63, %r4
- ldd 104(vp), %r9
- shrpd %r6, %r5, 63, %r5
- ldd 112(vp), %r3
- shrpd %r7, %r6, 63, %r6
- ldd 120(vp), %r28
- shrpd %r8, %r7, 63, %r7
- ldd 64(up), %r19
- shrpd %r9, %r8, 63, %r8
- ldd 72(up), %r20
- shrpd %r3, %r9, 63, %r9
- ldd 80(up), %r21
- shrpd %r28, %r3, 63, %r3
- ldd 88(up), %r22
- ldo 64(vp), vp
- ldo 64(rp), rp
- ldo 64(up), up
- addib,> -8, n, L(loop)
- addi -1, %r1, %r0 C restore cy
- LDEF(end)
- ADCSBC %r19, %r31, %r29
- ldd 32(up), %r19
- std %r29, 0(rp)
- ADCSBC %r20, %r4, %r29
- ldd 40(up), %r20
- std %r29, 8(rp)
- ADCSBC %r21, %r5, %r29
- ldd 48(up), %r21
- std %r29, 16(rp)
- ADCSBC %r22, %r6, %r29
- ldd 56(up), %r22
- std %r29, 24(rp)
- ADCSBC %r19, %r7, %r29
- ldd -0xf8(%r30), %r4 C restore reg
- std %r29, 32(rp)
- ADCSBC %r20, %r8, %r29
- ldd -0xf0(%r30), %r5 C restore reg
- std %r29, 40(rp)
- ADCSBC %r21, %r9, %r29
- ldd -0xe8(%r30), %r6 C restore reg
- std %r29, 48(rp)
- ADCSBC %r22, %r3, %r29
- ldd -0xe0(%r30), %r7 C restore reg
- std %r29, 56(rp)
- shrpd %r0, %r28, 63, %r28
- ldd -0xd8(%r30), %r8 C restore reg
- ADCSBC %r0, %r28, RETREG
- ifdef(`OPERATION_sublsh1_n',
- ` sub %r0, RETREG, RETREG')
- CLRRET1
- ldd -0xd0(%r30), %r9 C restore reg
- bve (%r2)
- ldd,mb -0x100(%r30), %r3 C restore reg
- EPILOGUE()