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-2002 Free Software Foundation, Inc.
5
6dnl  This file is part of the GNU MP Library.
7dnl
8dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9dnl  it under the terms of either:
10dnl
11dnl    * the GNU Lesser General Public License as published by the Free
12dnl      Software Foundation; either version 3 of the License, or (at your
13dnl      option) any later version.
14dnl
15dnl  or
16dnl
17dnl    * the GNU General Public License as published by the Free Software
18dnl      Foundation; either version 2 of the License, or (at your option) any
19dnl      later version.
20dnl
21dnl  or both in parallel, as here.
22dnl
23dnl  The GNU MP Library is distributed in the hope that it will be useful, but
24dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
25dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
26dnl  for more details.
27dnl
28dnl  You should have received copies of the GNU General Public License and the
29dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
30dnl  see https://www.gnu.org/licenses/.
31
32include(`../config.m4')
33
34C INPUT PARAMETERS
35C rem_ptr	gr26
36C n1		gr25
37C n0		gr24
38C d		gr23
39
40C The code size is a bit excessive.  We could merge the last two ds;addc
41C sequences by simply moving the "bb,< Odd" instruction down.  The only
42C trouble is the FFFFFFFF code that would need some hacking.
43
44ASM_START()
45PROLOGUE(mpn_udiv_qrnnd)
46	comb,<		%r23,0,L(largedivisor)
47	 sub		%r0,%r23,%r1		C clear cy as side-effect
48	ds		%r0,%r1,%r0
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,%r24
106	ds		%r25,%r23,%r25
107	addc		%r24,%r24,%r24
108	ds		%r25,%r23,%r25
109	addc		%r24,%r24,%r24
110	ds		%r25,%r23,%r25
111	addc		%r24,%r24,%r28
112	ds		%r25,%r23,%r25
113	comclr,>=	%r25,%r0,%r0
114	addl		%r25,%r23,%r25
115	stws		%r25,0(0,%r26)
116	bv		0(%r2)
117	 addc		%r28,%r28,%r28
118
119LDEF(largedivisor)
120	extru		%r24,31,1,%r19		C r19 = n0 & 1
121	bb,<		%r23,31,L(odd)
122	 extru		%r23,30,31,%r22		C r22 = d >> 1
123	shd		%r25,%r24,1,%r24	C r24 = new n0
124	extru		%r25,30,31,%r25		C r25 = new n1
125	sub		%r0,%r22,%r21
126	ds		%r0,%r21,%r0
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	addc		%r24,%r24,%r24
186	ds		%r25,%r22,%r25
187	addc		%r24,%r24,%r24
188	ds		%r25,%r22,%r25
189	addc		%r24,%r24,%r24
190	ds		%r25,%r22,%r25
191	comclr,>=	%r25,%r0,%r0
192	addl		%r25,%r22,%r25
193	sh1addl		%r25,%r19,%r25
194	stws		%r25,0(0,%r26)
195	bv		0(%r2)
196	 addc		%r24,%r24,%r28
197
198LDEF(odd)
199	addib,sv,n	1,%r22,L(FFFFFFFF)	C r22 = (d / 2 + 1)
200	shd		%r25,%r24,1,%r24	C r24 = new n0
201	extru		%r25,30,31,%r25		C r25 = new n1
202	sub		%r0,%r22,%r21
203	ds		%r0,%r21,%r0
204	addc		%r24,%r24,%r24
205	ds		%r25,%r22,%r25
206	addc		%r24,%r24,%r24
207	ds		%r25,%r22,%r25
208	addc		%r24,%r24,%r24
209	ds		%r25,%r22,%r25
210	addc		%r24,%r24,%r24
211	ds		%r25,%r22,%r25
212	addc		%r24,%r24,%r24
213	ds		%r25,%r22,%r25
214	addc		%r24,%r24,%r24
215	ds		%r25,%r22,%r25
216	addc		%r24,%r24,%r24
217	ds		%r25,%r22,%r25
218	addc		%r24,%r24,%r24
219	ds		%r25,%r22,%r25
220	addc		%r24,%r24,%r24
221	ds		%r25,%r22,%r25
222	addc		%r24,%r24,%r24
223	ds		%r25,%r22,%r25
224	addc		%r24,%r24,%r24
225	ds		%r25,%r22,%r25
226	addc		%r24,%r24,%r24
227	ds		%r25,%r22,%r25
228	addc		%r24,%r24,%r24
229	ds		%r25,%r22,%r25
230	addc		%r24,%r24,%r24
231	ds		%r25,%r22,%r25
232	addc		%r24,%r24,%r24
233	ds		%r25,%r22,%r25
234	addc		%r24,%r24,%r24
235	ds		%r25,%r22,%r25
236	addc		%r24,%r24,%r24
237	ds		%r25,%r22,%r25
238	addc		%r24,%r24,%r24
239	ds		%r25,%r22,%r25
240	addc		%r24,%r24,%r24
241	ds		%r25,%r22,%r25
242	addc		%r24,%r24,%r24
243	ds		%r25,%r22,%r25
244	addc		%r24,%r24,%r24
245	ds		%r25,%r22,%r25
246	addc		%r24,%r24,%r24
247	ds		%r25,%r22,%r25
248	addc		%r24,%r24,%r24
249	ds		%r25,%r22,%r25
250	addc		%r24,%r24,%r24
251	ds		%r25,%r22,%r25
252	addc		%r24,%r24,%r24
253	ds		%r25,%r22,%r25
254	addc		%r24,%r24,%r24
255	ds		%r25,%r22,%r25
256	addc		%r24,%r24,%r24
257	ds		%r25,%r22,%r25
258	addc		%r24,%r24,%r24
259	ds		%r25,%r22,%r25
260	addc		%r24,%r24,%r24
261	ds		%r25,%r22,%r25
262	addc		%r24,%r24,%r24
263	ds		%r25,%r22,%r25
264	addc		%r24,%r24,%r24
265	ds		%r25,%r22,%r25
266	addc		%r24,%r24,%r24
267	ds		%r25,%r22,%r25
268	addc		%r24,%r24,%r28
269	comclr,>=	%r25,%r0,%r0
270	addl		%r25,%r22,%r25
271	sh1addl		%r25,%r19,%r25
272C We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
273	add,nuv		%r28,%r25,%r25
274	addl		%r25,%r1,%r25
275	addc		%r0,%r28,%r28
276	sub,<<		%r25,%r23,%r0
277	addl		%r25,%r1,%r25
278	stws		%r25,0(0,%r26)
279	bv		0(%r2)
280	 addc		%r0,%r28,%r28
281
282C This is just a special case of the code above.
283C We come here when d == 0xFFFFFFFF
284LDEF(FFFFFFFF)
285	add,uv		%r25,%r24,%r24
286	sub,<<		%r24,%r23,%r0
287	ldo		1(%r24),%r24
288	stws		%r24,0(0,%r26)
289	bv		0(%r2)
290	 addc		%r0,%r25,%r28
291EPILOGUE()
292