Updated from ../=mpn/gmp-1.906.7
[kopensolaris-gnu/glibc.git] / sysdeps / hppa / udiv_qrnnd.s
1 ; HP-PA  __udiv_qrnnd division support, used from longlong.h.
2 ; This version runs fast on pre-PA7000 CPUs.
3
4 ; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
5
6 ; This file is part of the GNU MP Library.
7
8 ; The GNU MP Library is free software; you can redistribute it and/or modify
9 ; it under the terms of the GNU Library General Public License as published by
10 ; the Free Software Foundation; either version 2 of the License, or (at your
11 ; option) any later version.
12
13 ; The GNU MP Library is distributed in the hope that it will be useful, but
14 ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
16 ; License for more details.
17
18 ; You should have received a copy of the GNU Library General Public License
19 ; along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 ; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22
23 ; INPUT PARAMETERS
24 ; rem_ptr       gr26
25 ; n1            gr25
26 ; n0            gr24
27 ; d             gr23
28
29 ; The code size is a bit excessive.  We could merge the last two ds;addc
30 ; sequences by simply moving the "bb,< Odd" instruction down.  The only
31 ; trouble is the FFFFFFFF code that would need some hacking.
32
33         .code
34         .export         __udiv_qrnnd
35 __udiv_qrnnd
36         .proc
37         .callinfo       frame=0,no_calls
38         .entry
39
40         comb,<          %r23,0,L$largedivisor
41          sub            %r0,%r23,%r1            ; clear cy as side-effect
42         ds              %r0,%r1,%r0
43         addc            %r24,%r24,%r24
44         ds              %r25,%r23,%r25
45         addc            %r24,%r24,%r24
46         ds              %r25,%r23,%r25
47         addc            %r24,%r24,%r24
48         ds              %r25,%r23,%r25
49         addc            %r24,%r24,%r24
50         ds              %r25,%r23,%r25
51         addc            %r24,%r24,%r24
52         ds              %r25,%r23,%r25
53         addc            %r24,%r24,%r24
54         ds              %r25,%r23,%r25
55         addc            %r24,%r24,%r24
56         ds              %r25,%r23,%r25
57         addc            %r24,%r24,%r24
58         ds              %r25,%r23,%r25
59         addc            %r24,%r24,%r24
60         ds              %r25,%r23,%r25
61         addc            %r24,%r24,%r24
62         ds              %r25,%r23,%r25
63         addc            %r24,%r24,%r24
64         ds              %r25,%r23,%r25
65         addc            %r24,%r24,%r24
66         ds              %r25,%r23,%r25
67         addc            %r24,%r24,%r24
68         ds              %r25,%r23,%r25
69         addc            %r24,%r24,%r24
70         ds              %r25,%r23,%r25
71         addc            %r24,%r24,%r24
72         ds              %r25,%r23,%r25
73         addc            %r24,%r24,%r24
74         ds              %r25,%r23,%r25
75         addc            %r24,%r24,%r24
76         ds              %r25,%r23,%r25
77         addc            %r24,%r24,%r24
78         ds              %r25,%r23,%r25
79         addc            %r24,%r24,%r24
80         ds              %r25,%r23,%r25
81         addc            %r24,%r24,%r24
82         ds              %r25,%r23,%r25
83         addc            %r24,%r24,%r24
84         ds              %r25,%r23,%r25
85         addc            %r24,%r24,%r24
86         ds              %r25,%r23,%r25
87         addc            %r24,%r24,%r24
88         ds              %r25,%r23,%r25
89         addc            %r24,%r24,%r24
90         ds              %r25,%r23,%r25
91         addc            %r24,%r24,%r24
92         ds              %r25,%r23,%r25
93         addc            %r24,%r24,%r24
94         ds              %r25,%r23,%r25
95         addc            %r24,%r24,%r24
96         ds              %r25,%r23,%r25
97         addc            %r24,%r24,%r24
98         ds              %r25,%r23,%r25
99         addc            %r24,%r24,%r24
100         ds              %r25,%r23,%r25
101         addc            %r24,%r24,%r24
102         ds              %r25,%r23,%r25
103         addc            %r24,%r24,%r24
104         ds              %r25,%r23,%r25
105         addc            %r24,%r24,%r28
106         ds              %r25,%r23,%r25
107         comclr,>=       %r25,%r0,%r0
108         addl            %r25,%r23,%r25
109         stws            %r25,0(0,%r26)
110         bv              0(%r2)
111          addc           %r28,%r28,%r28
112
113 L$largedivisor
114         extru           %r24,31,1,%r19          ; r19 = n0 & 1
115         bb,<            %r23,31,L$odd
116          extru          %r23,30,31,%r22         ; r22 = d >> 1
117         shd             %r25,%r24,1,%r24        ; r24 = new n0
118         extru           %r25,30,31,%r25         ; r25 = new n1
119         sub             %r0,%r22,%r21
120         ds              %r0,%r21,%r0
121         addc            %r24,%r24,%r24
122         ds              %r25,%r22,%r25
123         addc            %r24,%r24,%r24
124         ds              %r25,%r22,%r25
125         addc            %r24,%r24,%r24
126         ds              %r25,%r22,%r25
127         addc            %r24,%r24,%r24
128         ds              %r25,%r22,%r25
129         addc            %r24,%r24,%r24
130         ds              %r25,%r22,%r25
131         addc            %r24,%r24,%r24
132         ds              %r25,%r22,%r25
133         addc            %r24,%r24,%r24
134         ds              %r25,%r22,%r25
135         addc            %r24,%r24,%r24
136         ds              %r25,%r22,%r25
137         addc            %r24,%r24,%r24
138         ds              %r25,%r22,%r25
139         addc            %r24,%r24,%r24
140         ds              %r25,%r22,%r25
141         addc            %r24,%r24,%r24
142         ds              %r25,%r22,%r25
143         addc            %r24,%r24,%r24
144         ds              %r25,%r22,%r25
145         addc            %r24,%r24,%r24
146         ds              %r25,%r22,%r25
147         addc            %r24,%r24,%r24
148         ds              %r25,%r22,%r25
149         addc            %r24,%r24,%r24
150         ds              %r25,%r22,%r25
151         addc            %r24,%r24,%r24
152         ds              %r25,%r22,%r25
153         addc            %r24,%r24,%r24
154         ds              %r25,%r22,%r25
155         addc            %r24,%r24,%r24
156         ds              %r25,%r22,%r25
157         addc            %r24,%r24,%r24
158         ds              %r25,%r22,%r25
159         addc            %r24,%r24,%r24
160         ds              %r25,%r22,%r25
161         addc            %r24,%r24,%r24
162         ds              %r25,%r22,%r25
163         addc            %r24,%r24,%r24
164         ds              %r25,%r22,%r25
165         addc            %r24,%r24,%r24
166         ds              %r25,%r22,%r25
167         addc            %r24,%r24,%r24
168         ds              %r25,%r22,%r25
169         addc            %r24,%r24,%r24
170         ds              %r25,%r22,%r25
171         addc            %r24,%r24,%r24
172         ds              %r25,%r22,%r25
173         addc            %r24,%r24,%r24
174         ds              %r25,%r22,%r25
175         addc            %r24,%r24,%r24
176         ds              %r25,%r22,%r25
177         addc            %r24,%r24,%r24
178         ds              %r25,%r22,%r25
179         addc            %r24,%r24,%r24
180         ds              %r25,%r22,%r25
181         addc            %r24,%r24,%r24
182         ds              %r25,%r22,%r25
183         addc            %r24,%r24,%r24
184         ds              %r25,%r22,%r25
185         comclr,>=       %r25,%r0,%r0
186         addl            %r25,%r22,%r25
187         sh1addl         %r25,%r19,%r25
188         stws            %r25,0(0,%r26)
189         bv              0(%r2)
190          addc           %r24,%r24,%r28
191
192 L$odd   addib,sv,n      1,%r22,L$FF..           ; r22 = (d / 2 + 1)
193         shd             %r25,%r24,1,%r24        ; r24 = new n0
194         extru           %r25,30,31,%r25         ; r25 = new n1
195         sub             %r0,%r22,%r21
196         ds              %r0,%r21,%r0
197         addc            %r24,%r24,%r24
198         ds              %r25,%r22,%r25
199         addc            %r24,%r24,%r24
200         ds              %r25,%r22,%r25
201         addc            %r24,%r24,%r24
202         ds              %r25,%r22,%r25
203         addc            %r24,%r24,%r24
204         ds              %r25,%r22,%r25
205         addc            %r24,%r24,%r24
206         ds              %r25,%r22,%r25
207         addc            %r24,%r24,%r24
208         ds              %r25,%r22,%r25
209         addc            %r24,%r24,%r24
210         ds              %r25,%r22,%r25
211         addc            %r24,%r24,%r24
212         ds              %r25,%r22,%r25
213         addc            %r24,%r24,%r24
214         ds              %r25,%r22,%r25
215         addc            %r24,%r24,%r24
216         ds              %r25,%r22,%r25
217         addc            %r24,%r24,%r24
218         ds              %r25,%r22,%r25
219         addc            %r24,%r24,%r24
220         ds              %r25,%r22,%r25
221         addc            %r24,%r24,%r24
222         ds              %r25,%r22,%r25
223         addc            %r24,%r24,%r24
224         ds              %r25,%r22,%r25
225         addc            %r24,%r24,%r24
226         ds              %r25,%r22,%r25
227         addc            %r24,%r24,%r24
228         ds              %r25,%r22,%r25
229         addc            %r24,%r24,%r24
230         ds              %r25,%r22,%r25
231         addc            %r24,%r24,%r24
232         ds              %r25,%r22,%r25
233         addc            %r24,%r24,%r24
234         ds              %r25,%r22,%r25
235         addc            %r24,%r24,%r24
236         ds              %r25,%r22,%r25
237         addc            %r24,%r24,%r24
238         ds              %r25,%r22,%r25
239         addc            %r24,%r24,%r24
240         ds              %r25,%r22,%r25
241         addc            %r24,%r24,%r24
242         ds              %r25,%r22,%r25
243         addc            %r24,%r24,%r24
244         ds              %r25,%r22,%r25
245         addc            %r24,%r24,%r24
246         ds              %r25,%r22,%r25
247         addc            %r24,%r24,%r24
248         ds              %r25,%r22,%r25
249         addc            %r24,%r24,%r24
250         ds              %r25,%r22,%r25
251         addc            %r24,%r24,%r24
252         ds              %r25,%r22,%r25
253         addc            %r24,%r24,%r24
254         ds              %r25,%r22,%r25
255         addc            %r24,%r24,%r24
256         ds              %r25,%r22,%r25
257         addc            %r24,%r24,%r24
258         ds              %r25,%r22,%r25
259         addc            %r24,%r24,%r24
260         ds              %r25,%r22,%r25
261         addc            %r24,%r24,%r28
262         comclr,>=       %r25,%r0,%r0
263         addl            %r25,%r22,%r25
264         sh1addl         %r25,%r19,%r25
265 ; We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
266         add,nuv         %r28,%r25,%r25
267         addl            %r25,%r1,%r25
268         addc            %r0,%r28,%r28
269         sub,<<          %r25,%r23,%r0
270         addl            %r25,%r1,%r25
271         stws            %r25,0(0,%r26)
272         bv              0(%r2)
273          addc           %r0,%r28,%r28
274
275 ; This is just a special case of the code above.
276 ; We come here when d == 0xFFFFFFFF
277 L$FF..  add,uv          %r25,%r24,%r24
278         sub,<<          %r24,%r23,%r0
279         ldo             1(%r24),%r24
280         stws            %r24,0(0,%r26)
281         bv              0(%r2)
282          addc           %r0,%r25,%r28
283
284         .exit
285         .procend