| Index: gcc/gmp/mpn/alpha/ev6/sub_n.asm
|
| diff --git a/gcc/gmp/mpn/alpha/ev6/sub_n.asm b/gcc/gmp/mpn/alpha/ev6/sub_n.asm
|
| deleted file mode 100644
|
| index f23ad44a15a7619e691526b503199a9eb2bdd306..0000000000000000000000000000000000000000
|
| --- a/gcc/gmp/mpn/alpha/ev6/sub_n.asm
|
| +++ /dev/null
|
| @@ -1,272 +0,0 @@
|
| -dnl Alpha ev6 mpn_sub_n -- Subtract two limb vectors of the same length > 0
|
| -dnl and store difference in a third limb vector.
|
| -
|
| -dnl Copyright 2000, 2003, 2005 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 EV4: ?
|
| -C EV5: 5.4
|
| -C EV6: 2.125
|
| -
|
| -C INPUT PARAMETERS
|
| -C rp r16
|
| -C up r17
|
| -C vp r18
|
| -C n r19
|
| -C cy r20 (for mpn_add_nc)
|
| -
|
| -C TODO
|
| -C Finish cleaning up cy registers r22, r23 (make them use cy0/cy1)
|
| -C Use multi-pronged feed-in.
|
| -C Perform additional micro-tuning
|
| -
|
| -C This code was written in cooperation with ev6 pipeline expert Steve Root.
|
| -
|
| -C Pair loads and stores where possible
|
| -C Store pairs oct-aligned where possible (didn't need it here)
|
| -C Stores are delayed every third cycle
|
| -C Loads and stores are delayed by fills
|
| -C U stays still, put code there where possible (note alternation of U1 and U0)
|
| -C L moves because of loads and stores
|
| -C Note dampers in L to limit damage
|
| -
|
| -C This odd-looking optimization expects that were having random bits in our
|
| -C data, so that a pure zero result is unlikely. so we penalize the unlikely
|
| -C case to help the common case.
|
| -
|
| -define(`u0', `r0') define(`u1', `r3')
|
| -define(`v0', `r1') define(`v1', `r4')
|
| -
|
| -define(`cy0', `r20') define(`cy1', `r21')
|
| -
|
| -MULFUNC_PROLOGUE(mpn_sub_n mpn_sub_nc)
|
| -
|
| -ASM_START()
|
| -PROLOGUE(mpn_sub_nc)
|
| - br r31, $entry
|
| -EPILOGUE()
|
| -PROLOGUE(mpn_sub_n)
|
| - bis r31, r31, cy0 C clear carry in
|
| -$entry: cmpult r19, 5, r22 C L1 move counter
|
| - ldq u1, 0(r17) C L0 get next ones
|
| - ldq v1, 0(r18) C L1
|
| - bne r22, $Lsmall
|
| -
|
| - ldq u0, 8(r17) C L0 get next ones
|
| - ldq v0, 8(r18) C L1
|
| - subq u1, v1, r5 C U0 sub two data
|
| -
|
| - cmpult u1, v1, r23 C U0 did it borrow
|
| - ldq u1, 16(r17) C L0 get next ones
|
| - ldq v1, 16(r18) C L1
|
| -
|
| - subq u0, v0, r8 C U1 sub two data
|
| - subq r5, cy0, r24 C U0 borrow in
|
| -
|
| - cmpult u0, v0, r22 C U1 did it borrow
|
| - beq r5, $fix5f C U0 fix exact zero
|
| -$ret5f: ldq u0, 24(r17) C L0 get next ones
|
| - ldq v0, 24(r18) C L1
|
| -
|
| - subq r8, r23, r25 C U1 borrow from last
|
| - subq u1, v1, r7 C U0 sub two data
|
| -
|
| - beq r8, $fix6f C U1 fix exact zero
|
| -$ret6f: cmpult u1, v1, r23 C U0 did it borrow
|
| - ldq u1, 32(r17) C L0 get next ones
|
| - ldq v1, 32(r18) C L1
|
| -
|
| - lda r17, 40(r17) C L0 move pointer
|
| - lda r18, 40(r18) C L1 move pointer
|
| -
|
| - lda r16, -8(r16)
|
| - lda r19, -13(r19) C L1 move counter
|
| - blt r19, $Lend C U1 loop control
|
| -
|
| -
|
| -C Main loop. 8-way unrolled.
|
| - ALIGN(16)
|
| -$Loop: subq u0, v0, r2 C U1 sub two data
|
| - stq r24, 8(r16) C L0 put an answer
|
| - subq r7, r22, r24 C U0 borrow from last
|
| - stq r25, 16(r16) C L1 pair
|
| -
|
| - cmpult u0, v0, cy1 C U1 did it borrow
|
| - beq r7, $fix7 C U0 fix exact 0
|
| -$ret7: ldq u0, 0(r17) C L0 get next ones
|
| - ldq v0, 0(r18) C L1
|
| -
|
| - bis r31, r31, r31 C L damp out
|
| - subq r2, r23, r25 C U1 borrow from last
|
| - bis r31, r31, r31 C L moves in L !
|
| - subq u1, v1, r5 C U0 sub two data
|
| -
|
| - beq r2, $fix0 C U1 fix exact zero
|
| -$ret0: cmpult u1, v1, cy0 C U0 did it borrow
|
| - ldq u1, 8(r17) C L0 get next ones
|
| - ldq v1, 8(r18) C L1
|
| -
|
| - subq u0, v0, r8 C U1 sub two data
|
| - stq r24, 24(r16) C L0 store pair
|
| - subq r5, cy1, r24 C U0 borrow from last
|
| - stq r25, 32(r16) C L1
|
| -
|
| - cmpult u0, v0, r22 C U1 did it borrow
|
| - beq r5, $fix1 C U0 fix exact zero
|
| -$ret1: ldq u0, 16(r17) C L0 get next ones
|
| - ldq v0, 16(r18) C L1
|
| -
|
| - lda r16, 64(r16) C L0 move pointer
|
| - subq r8, cy0, r25 C U1 borrow from last
|
| - lda r19, -8(r19) C L1 move counter
|
| - subq u1, v1, r7 C U0 sub two data
|
| -
|
| - beq r8, $fix2 C U1 fix exact zero
|
| -$ret2: cmpult u1, v1, r23 C U0 did it borrow
|
| - ldq u1, 24(r17) C L0 get next ones
|
| - ldq v1, 24(r18) C L1
|
| -
|
| - subq u0, v0, r2 C U1 sub two data
|
| - stq r24, -24(r16) C L0 put an answer
|
| - subq r7, r22, r24 C U0 borrow from last
|
| - stq r25, -16(r16) C L1 pair
|
| -
|
| - cmpult u0, v0, cy1 C U1 did it borrow
|
| - beq r7, $fix3 C U0 fix exact 0
|
| -$ret3: ldq u0, 32(r17) C L0 get next ones
|
| - ldq v0, 32(r18) C L1
|
| -
|
| - bis r31, r31, r31 C L damp out
|
| - subq r2, r23, r25 C U1 borrow from last
|
| - bis r31, r31, r31 C L moves in L !
|
| - subq u1, v1, r5 C U0 sub two data
|
| -
|
| - beq r2, $fix4 C U1 fix exact zero
|
| -$ret4: cmpult u1, v1, cy0 C U0 did it borrow
|
| - ldq u1, 40(r17) C L0 get next ones
|
| - ldq v1, 40(r18) C L1
|
| -
|
| - subq u0, v0, r8 C U1 sub two data
|
| - stq r24, -8(r16) C L0 store pair
|
| - subq r5, cy1, r24 C U0 borrow from last
|
| - stq r25, 0(r16) C L1
|
| -
|
| - cmpult u0, v0, r22 C U1 did it borrow
|
| - beq r5, $fix5 C U0 fix exact zero
|
| -$ret5: ldq u0, 48(r17) C L0 get next ones
|
| - ldq v0, 48(r18) C L1
|
| -
|
| - ldl r31, 256(r17) C L0 prefetch
|
| - subq r8, cy0, r25 C U1 borrow from last
|
| - ldl r31, 256(r18) C L1 prefetch
|
| - subq u1, v1, r7 C U0 sub two data
|
| -
|
| - beq r8, $fix6 C U1 fix exact zero
|
| -$ret6: cmpult u1, v1, r23 C U0 did it borrow
|
| - ldq u1, 56(r17) C L0 get next ones
|
| - ldq v1, 56(r18) C L1
|
| -
|
| - lda r17, 64(r17) C L0 move pointer
|
| - bis r31, r31, r31 C U
|
| - lda r18, 64(r18) C L1 move pointer
|
| - bge r19, $Loop C U1 loop control
|
| -C ==== main loop end
|
| -
|
| -$Lend: subq u0, v0, r2 C U1 sub two data
|
| - stq r24, 8(r16) C L0 put an answer
|
| - subq r7, r22, r24 C U0 borrow from last
|
| - stq r25, 16(r16) C L1 pair
|
| - cmpult u0, v0, cy1 C U1 did it borrow
|
| - beq r7, $fix7c C U0 fix exact 0
|
| -$ret7c: subq r2, r23, r25 C U1 borrow from last
|
| - subq u1, v1, r5 C U0 sub two data
|
| - beq r2, $fix0c C U1 fix exact zero
|
| -$ret0c: cmpult u1, v1, cy0 C U0 did it borrow
|
| - stq r24, 24(r16) C L0 store pair
|
| - subq r5, cy1, r24 C U0 borrow from last
|
| - stq r25, 32(r16) C L1
|
| - beq r5, $fix1c C U0 fix exact zero
|
| -$ret1c: stq r24, 40(r16) C L0 put an answer
|
| - lda r16, 48(r16) C L0 move pointer
|
| -
|
| - lda r19, 8(r19)
|
| - beq r19, $Lret
|
| -
|
| - ldq u1, 0(r17)
|
| - ldq v1, 0(r18)
|
| -$Lsmall:
|
| - lda r19, -1(r19)
|
| - beq r19, $Lend0
|
| -
|
| - ALIGN(8)
|
| -$Loop0: subq u1, v1, r2 C main sub
|
| - cmpult u1, v1, r8 C compute bw from last sub
|
| - ldq u1, 8(r17)
|
| - ldq v1, 8(r18)
|
| - subq r2, cy0, r5 C borrow sub
|
| - lda r17, 8(r17)
|
| - lda r18, 8(r18)
|
| - stq r5, 0(r16)
|
| - cmpult r2, cy0, cy0 C compute bw from last sub
|
| - lda r19, -1(r19) C decr loop cnt
|
| - bis r8, cy0, cy0 C combine bw from the two subs
|
| - lda r16, 8(r16)
|
| - bne r19, $Loop0
|
| -$Lend0: subq u1, v1, r2 C main sub
|
| - subq r2, cy0, r5 C borrow sub
|
| - cmpult u1, v1, r8 C compute bw from last sub
|
| - cmpult r2, cy0, cy0 C compute bw from last sub
|
| - stq r5, 0(r16)
|
| - bis r8, cy0, r0 C combine bw from the two subs
|
| - ret r31,(r26),1
|
| -
|
| - ALIGN(8)
|
| -$Lret: lda r0, 0(cy0) C copy borrow into return register
|
| - ret r31,(r26),1
|
| -
|
| -$fix5f: bis r23, cy0, r23 C bring forward borrow
|
| - br r31, $ret5f
|
| -$fix6f: bis r22, r23, r22 C bring forward borrow
|
| - br r31, $ret6f
|
| -$fix0: bis cy1, r23, cy1 C bring forward borrow
|
| - br r31, $ret0
|
| -$fix1: bis cy0, cy1, cy0 C bring forward borrow
|
| - br r31, $ret1
|
| -$fix2: bis r22, cy0, r22 C bring forward borrow
|
| - br r31, $ret2
|
| -$fix3: bis r23, r22, r23 C bring forward borrow
|
| - br r31, $ret3
|
| -$fix4: bis cy1, r23, cy1 C bring forward borrow
|
| - br r31, $ret4
|
| -$fix5: bis cy1, cy0, cy0 C bring forward borrow
|
| - br r31, $ret5
|
| -$fix6: bis r22, cy0, r22 C bring forward borrow
|
| - br r31, $ret6
|
| -$fix7: bis r23, r22, r23 C bring forward borrow
|
| - br r31, $ret7
|
| -$fix0c: bis cy1, r23, cy1 C bring forward borrow
|
| - br r31, $ret0c
|
| -$fix1c: bis cy0, cy1, cy0 C bring forward borrow
|
| - br r31, $ret1c
|
| -$fix7c: bis r23, r22, r23 C bring forward borrow
|
| - br r31, $ret7c
|
| -
|
| -EPILOGUE()
|
| -ASM_END()
|
|
|