1dnl  HP-PA  __udiv_qrnnd division support, used from longlong.h.
2dnl  This version runs fast on pre-PA7000 CPUs.
3
4dnl  Copyright 1993, 1994, 2000, 2001, 2002 Free Software Foundation, Inc.
5
6dnl  This file is part of the GNU MP Library.
7
8dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9dnl  it under the terms of the GNU Lesser General Public License as published
10dnl  by the Free Software Foundation; either version 3 of the License, or (at
11dnl  your option) any later version.
12
13dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16dnl  License for more details.
17
18dnl  You should have received a copy of the GNU Lesser General Public License
19dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20
21include(`../config.m4')
22
23C INPUT PARAMETERS
24C rem_ptr	gr26
25C n1		gr25
26C n0		gr24
27C d		gr23
28
29C The code size is a bit excessive.  We could merge the last two ds;addc
30C sequences by simply moving the "bb,< Odd" instruction down.  The only
31C trouble is the FFFFFFFF code that would need some hacking.
32
33ASM_START()
34PROLOGUE(mpn_udiv_qrnnd)
35	comb,<		%r23,0,L(largedivisor)
36	 sub		%r0,%r23,%r1		C clear cy as side-effect
37	ds		%r0,%r1,%r0
38	addc		%r24,%r24,%r24
39	ds		%r25,%r23,%r25
40	addc		%r24,%r24,%r24
41	ds		%r25,%r23,%r25
42	addc		%r24,%r24,%r24
43	ds		%r25,%r23,%r25
44	addc		%r24,%r24,%r24
45	ds		%r25,%r23,%r25
46	addc		%r24,%r24,%r24
47	ds		%r25,%r23,%r25
48	addc		%r24,%r24,%r24
49	ds		%r25,%r23,%r25
50	addc		%r24,%r24,%r24
51	ds		%r25,%r23,%r25
52	addc		%r24,%r24,%r24
53	ds		%r25,%r23,%r25
54	addc		%r24,%r24,%r24
55	ds		%r25,%r23,%r25
56	addc		%r24,%r24,%r24
57	ds		%r25,%r23,%r25
58	addc		%r24,%r24,%r24
59	ds		%r25,%r23,%r25
60	addc		%r24,%r24,%r24
61	ds		%r25,%r23,%r25
62	addc		%r24,%r24,%r24
63	ds		%r25,%r23,%r25
64	addc		%r24,%r24,%r24
65	ds		%r25,%r23,%r25
66	addc		%r24,%r24,%r24
67	ds		%r25,%r23,%r25
68	addc		%r24,%r24,%r24
69	ds		%r25,%r23,%r25
70	addc		%r24,%r24,%r24
71	ds		%r25,%r23,%r25
72	addc		%r24,%r24,%r24
73	ds		%r25,%r23,%r25
74	addc		%r24,%r24,%r24
75	ds		%r25,%r23,%r25
76	addc		%r24,%r24,%r24
77	ds		%r25,%r23,%r25
78	addc		%r24,%r24,%r24
79	ds		%r25,%r23,%r25
80	addc		%r24,%r24,%r24
81	ds		%r25,%r23,%r25
82	addc		%r24,%r24,%r24
83	ds		%r25,%r23,%r25
84	addc		%r24,%r24,%r24
85	ds		%r25,%r23,%r25
86	addc		%r24,%r24,%r24
87	ds		%r25,%r23,%r25
88	addc		%r24,%r24,%r24
89	ds		%r25,%r23,%r25
90	addc		%r24,%r24,%r24
91	ds		%r25,%r23,%r25
92	addc		%r24,%r24,%r24
93	ds		%r25,%r23,%r25
94	addc		%r24,%r24,%r24
95	ds		%r25,%r23,%r25
96	addc		%r24,%r24,%r24
97	ds		%r25,%r23,%r25
98	addc		%r24,%r24,%r24
99	ds		%r25,%r23,%r25
100	addc		%r24,%r24,%r28
101	ds		%r25,%r23,%r25
102	comclr,>=	%r25,%r0,%r0
103	addl		%r25,%r23,%r25
104	stws		%r25,0(0,%r26)
105	bv		0(%r2)
106	 addc		%r28,%r28,%r28
107
108LDEF(largedivisor)
109	extru		%r24,31,1,%r19		C r19 = n0 & 1
110	bb,<		%r23,31,L(odd)
111	 extru		%r23,30,31,%r22		C r22 = d >> 1
112	shd		%r25,%r24,1,%r24	C r24 = new n0
113	extru		%r25,30,31,%r25		C r25 = new n1
114	sub		%r0,%r22,%r21
115	ds		%r0,%r21,%r0
116	addc		%r24,%r24,%r24
117	ds		%r25,%r22,%r25
118	addc		%r24,%r24,%r24
119	ds		%r25,%r22,%r25
120	addc		%r24,%r24,%r24
121	ds		%r25,%r22,%r25
122	addc		%r24,%r24,%r24
123	ds		%r25,%r22,%r25
124	addc		%r24,%r24,%r24
125	ds		%r25,%r22,%r25
126	addc		%r24,%r24,%r24
127	ds		%r25,%r22,%r25
128	addc		%r24,%r24,%r24
129	ds		%r25,%r22,%r25
130	addc		%r24,%r24,%r24
131	ds		%r25,%r22,%r25
132	addc		%r24,%r24,%r24
133	ds		%r25,%r22,%r25
134	addc		%r24,%r24,%r24
135	ds		%r25,%r22,%r25
136	addc		%r24,%r24,%r24
137	ds		%r25,%r22,%r25
138	addc		%r24,%r24,%r24
139	ds		%r25,%r22,%r25
140	addc		%r24,%r24,%r24
141	ds		%r25,%r22,%r25
142	addc		%r24,%r24,%r24
143	ds		%r25,%r22,%r25
144	addc		%r24,%r24,%r24
145	ds		%r25,%r22,%r25
146	addc		%r24,%r24,%r24
147	ds		%r25,%r22,%r25
148	addc		%r24,%r24,%r24
149	ds		%r25,%r22,%r25
150	addc		%r24,%r24,%r24
151	ds		%r25,%r22,%r25
152	addc		%r24,%r24,%r24
153	ds		%r25,%r22,%r25
154	addc		%r24,%r24,%r24
155	ds		%r25,%r22,%r25
156	addc		%r24,%r24,%r24
157	ds		%r25,%r22,%r25
158	addc		%r24,%r24,%r24
159	ds		%r25,%r22,%r25
160	addc		%r24,%r24,%r24
161	ds		%r25,%r22,%r25
162	addc		%r24,%r24,%r24
163	ds		%r25,%r22,%r25
164	addc		%r24,%r24,%r24
165	ds		%r25,%r22,%r25
166	addc		%r24,%r24,%r24
167	ds		%r25,%r22,%r25
168	addc		%r24,%r24,%r24
169	ds		%r25,%r22,%r25
170	addc		%r24,%r24,%r24
171	ds		%r25,%r22,%r25
172	addc		%r24,%r24,%r24
173	ds		%r25,%r22,%r25
174	addc		%r24,%r24,%r24
175	ds		%r25,%r22,%r25
176	addc		%r24,%r24,%r24
177	ds		%r25,%r22,%r25
178	addc		%r24,%r24,%r24
179	ds		%r25,%r22,%r25
180	comclr,>=	%r25,%r0,%r0
181	addl		%r25,%r22,%r25
182	sh1addl		%r25,%r19,%r25
183	stws		%r25,0(0,%r26)
184	bv		0(%r2)
185	 addc		%r24,%r24,%r28
186
187LDEF(odd)
188	addib,sv,n	1,%r22,L(FFFFFFFF)	C r22 = (d / 2 + 1)
189	shd		%r25,%r24,1,%r24	C r24 = new n0
190	extru		%r25,30,31,%r25		C r25 = new n1
191	sub		%r0,%r22,%r21
192	ds		%r0,%r21,%r0
193	addc		%r24,%r24,%r24
194	ds		%r25,%r22,%r25
195	addc		%r24,%r24,%r24
196	ds		%r25,%r22,%r25
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,%r28
258	comclr,>=	%r25,%r0,%r0
259	addl		%r25,%r22,%r25
260	sh1addl		%r25,%r19,%r25
261C We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
262	add,nuv		%r28,%r25,%r25
263	addl		%r25,%r1,%r25
264	addc		%r0,%r28,%r28
265	sub,<<		%r25,%r23,%r0
266	addl		%r25,%r1,%r25
267	stws		%r25,0(0,%r26)
268	bv		0(%r2)
269	 addc		%r0,%r28,%r28
270
271C This is just a special case of the code above.
272C We come here when d == 0xFFFFFFFF
273LDEF(FFFFFFFF)
274	add,uv		%r25,%r24,%r24
275	sub,<<		%r24,%r23,%r0
276	ldo		1(%r24),%r24
277	stws		%r24,0(0,%r26)
278	bv		0(%r2)
279	 addc		%r0,%r25,%r28
280EPILOGUE()
281