~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gmp/mpn/pa64/udiv.asm

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2007-04-09 11:51:51 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070409115151-ql8cr0kalzx1jmla
Tags: 0.9i-20070324-2
Upload to unstable. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
dnl  HP-PA 2.0 64-bit mpn_udiv_qrnnd_r.
 
2
 
 
3
dnl  Copyright 2001, 2002, 2003 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
 
19
dnl  to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 
20
dnl  Boston, MA 02110-1301, 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.0
 
54
')
 
55
PROLOGUE(mpn_udiv_qrnnd_r)
 
56
ifdef(`HAVE_ABI_2_0n',
 
57
`       depd            %r25,31,32,%r26
 
58
        depd            %r23,31,32,%r24
 
59
        copy            %r24,%r25
 
60
        ldd             -56(%r30),%r24
 
61
        ldw             -60(%r30),%r23
 
62
')
 
63
        ldi             0,q
 
64
        cmpib,*>=       0,d,L(large_divisor)
 
65
        ldi             8,%r31          C setup loop counter
 
66
 
 
67
        sub             %r0,d,dn
 
68
LDEF(Loop)
 
69
        divstep divstep divstep divstep divstep divstep divstep divstep
 
70
        addib,<>        -1,%r31,L(Loop)
 
71
        nop
 
72
 
 
73
ifdef(`HAVE_ABI_2_0n',
 
74
`       copy            %r28,%r29
 
75
        extrd,u         %r28,31,32,%r28
 
76
')
 
77
        bve             (%r2)
 
78
        std             n1,0(remptr)    C store remainder
 
79
 
 
80
LDEF(large_divisor)
 
81
        extrd,u         n0,63,1,%r19    C save lsb of dividend
 
82
        shrpd           n1,n0,1,n0      C n0 = lo(n1n0 >> 1)
 
83
        shrpd           %r0,n1,1,n1     C n1 = hi(n1n0 >> 1)
 
84
        extrd,u         d,63,1,%r20     C save lsb of divisor
 
85
        shrpd           %r0,d,1,d       C d = floor(orig_d / 2)
 
86
        add,l           %r20,d,d        C d = ceil(orig_d / 2)
 
87
 
 
88
        sub             %r0,d,dn
 
89
LDEF(Loop2)
 
90
        divstep divstep divstep divstep divstep divstep divstep divstep
 
91
        addib,<>        -1,%r31,L(Loop2)
 
92
        nop
 
93
 
 
94
        cmpib,*=        0,%r20,L(even_divisor)
 
95
        shladd          n1,1,%r19,n1    C shift in omitted dividend lsb
 
96
 
 
97
        add             d,d,d           C restore orig...
 
98
        sub             d,%r20,d        C ...d value
 
99
        sub             %r0,d,dn        C r21 = -d
 
100
 
 
101
        add,*nuv        n1,q,n1         C fix remainder for omitted divisor lsb
 
102
        add,l           n1,dn,n1        C adjust remainder if rem. fix carried
 
103
        add,dc          %r0,q,q         C adjust quotient accordingly
 
104
 
 
105
        sub,*<<         n1,d,%r0        C remainder >= divisor?
 
106
        add,l           n1,dn,n1        C adjust remainder
 
107
        add,dc          %r0,q,q         C adjust quotient
 
108
 
 
109
LDEF(even_divisor)
 
110
ifdef(`HAVE_ABI_2_0n',
 
111
`       copy            %r28,%r29
 
112
        extrd,u         %r28,31,32,%r28
 
113
')
 
114
        bve             (%r2)
 
115
        std             n1,0(remptr)    C store remainder
 
116
EPILOGUE(mpn_udiv_qrnnd_r)