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-2021 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 Lesser General Public License as published by
10;! the Free Software Foundation; either version 2.1 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 Lesser General Public
16;! License for more details.
17
18;! You should have received a copy of the GNU Lesser General Public License
19;! along with the GNU MP Library.  If not, see
20;! <https://www.gnu.org/licenses/>.
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	.text
34	.export		__udiv_qrnnd
35__udiv_qrnnd:
36	.proc
37	.callinfo	frame=0,no_calls
38	.entry
39
40	comb,<		%r23,%r0,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(%r26)
110	bv		0(%r2)
111	 addc		%r28,%r28,%r28
112
113L$largedivisor:
114	extru		%r24,31,1,%r20		;! r20 = 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,%r20,%r25
188	stws		%r25,0(%r26)
189	bv		0(%r2)
190	 addc		%r24,%r24,%r28
191
192L$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,%r20,%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(%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
277L$FF..:	add,uv		%r25,%r24,%r24
278	sub,<<		%r24,%r23,%r0
279	ldo		1(%r24),%r24
280	stws		%r24,0(%r26)
281	bv		0(%r2)
282	 addc		%r0,%r25,%r28
283
284	.exit
285	.procend
286