Annotation of OpenXM_contrib/gmp/mpn/pa64/udiv_qrnnd.asm, Revision 1.1
1.1 ! ohara 1: dnl HP-PA 2.0 64-bit mpn_udiv_qrnnd.
! 2:
! 3: dnl Copyright 2001, 2002 Free Software Foundation, Inc.
! 4:
! 5: dnl This file is part of the GNU MP Library.
! 6:
! 7: dnl The GNU MP Library is free software; you can redistribute it and/or modify
! 8: dnl it under the terms of the GNU Lesser General Public License as published
! 9: dnl by the Free Software Foundation; either version 2.1 of the License, or (at
! 10: dnl your option) any later version.
! 11:
! 12: dnl The GNU MP Library is distributed in the hope that it will be useful, but
! 13: dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 15: dnl License for more details.
! 16:
! 17: dnl You should have received a copy of the GNU Lesser General Public License
! 18: dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 19: dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: dnl MA 02111-1307, USA.
! 21:
! 22: include(`../config.m4')
! 23:
! 24: C This runs at about 280 cycles on both PA8000 and PA8500, corresponding to a
! 25: C bit more than 4 cycles/bit.
! 26:
! 27: C INPUT PARAMETERS
! 28: define(`n1',`%r26')
! 29: define(`n0',`%r25')
! 30: define(`d',`%r24')
! 31: define(`remptr',`%r23')
! 32:
! 33: define(`q',`%r28')
! 34: define(`dn',`%r29')
! 35:
! 36: define(`old_divstep',
! 37: `add,dc n0,n0,n0
! 38: add,dc n1,n1,n1
! 39: sub,*<< n1,d,%r22
! 40: copy %r22,n1')
! 41:
! 42: define(`divstep',
! 43: `add n0,n0,n0
! 44: add,dc n1,n1,n1
! 45: sub n1,d,%r1
! 46: add,dc q,q,q
! 47: cmpclr,*<< n1,d,%r0
! 48: copy %r1,n1
! 49: ')
! 50:
! 51: ifdef(`HAVE_ABI_2_0w',
! 52: ` .level 2.0W
! 53: ',` .level 2.0N
! 54: ')
! 55: PROLOGUE(mpn_udiv_qrnnd)
! 56: .proc
! 57: .entry
! 58: .callinfo frame=0,no_calls,save_rp,entry_gr=7
! 59:
! 60: ifdef(`HAVE_ABI_2_0n',
! 61: ` depd %r25,31,32,%r26
! 62: depd %r23,31,32,%r24
! 63: copy %r24,%r25
! 64: ldd -56(%r30),%r24
! 65: ldw -60(%r30),%r23
! 66: ')
! 67: ldi 0,q
! 68: cmpib,*>= 0,d,large_divisor
! 69: ldi 8,%r31 C setup loop counter
! 70:
! 71: sub %r0,d,dn
! 72: Loop divstep divstep divstep divstep divstep divstep divstep divstep
! 73: addib,<> -1,%r31,Loop
! 74: nop
! 75:
! 76: ifdef(`HAVE_ABI_2_0n',
! 77: ` copy %r28,%r29
! 78: extrd,u %r28,31,32,%r28
! 79: ')
! 80: bve (%r2)
! 81: std n1,0(remptr) C store remainder
! 82:
! 83: large_divisor
! 84: extrd,u n0,63,1,%r19 C save lsb of dividend
! 85: shrpd n1,n0,1,n0 C n0 = lo(n1n0 >> 1)
! 86: shrpd %r0,n1,1,n1 C n1 = hi(n1n0 >> 1)
! 87: extrd,u d,63,1,%r20 C save lsb of divisor
! 88: shrpd %r0,d,1,d C d = floor(orig_d / 2)
! 89: add,l %r20,d,d C d = ceil(orig_d / 2)
! 90:
! 91: sub %r0,d,dn
! 92: Loop2 divstep divstep divstep divstep divstep divstep divstep divstep
! 93: addib,<> -1,%r31,Loop2
! 94: nop
! 95:
! 96: cmpib,*= 0,%r20,even_divisor
! 97: shladd n1,1,%r19,n1 C shift in omitted dividend lsb
! 98:
! 99: add d,d,d C restore orig...
! 100: sub d,%r20,d C ...d value
! 101: sub %r0,d,dn C r21 = -d
! 102:
! 103: add,*nuv n1,q,n1 C fix remainder for omitted divisor lsb
! 104: add,l n1,dn,n1 C adjust remainder if rem. fix carried
! 105: add,dc %r0,q,q C adjust quotient accordingly
! 106:
! 107: sub,*<< n1,d,%r0 C remainder >= divisor?
! 108: add,l n1,dn,n1 C adjust remainder
! 109: add,dc %r0,q,q C adjust quotient
! 110:
! 111: even_divisor
! 112: ifdef(`HAVE_ABI_2_0n',
! 113: ` copy %r28,%r29
! 114: extrd,u %r28,31,32,%r28
! 115: ')
! 116: bve (%r2)
! 117: std n1,0(remptr) C store remainder
! 118:
! 119: .procend
! 120: EPILOGUE(mpn_udiv_qrnnd)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>