Annotation of OpenXM_contrib/gmp/mpn/hppa/udiv_qrnnd.s, Revision 1.1.1.1
1.1 maekawa 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., 59 Temple Place - Suite 330, Boston,
21: ; MA 02111-1307, USA.
22:
23:
24: ; INPUT PARAMETERS
25: ; rem_ptr gr26
26: ; n1 gr25
27: ; n0 gr24
28: ; d gr23
29:
30: ; The code size is a bit excessive. We could merge the last two ds;addc
31: ; sequences by simply moving the "bb,< Odd" instruction down. The only
32: ; trouble is the FFFFFFFF code that would need some hacking.
33:
34: .code
35: .export __udiv_qrnnd
36: __udiv_qrnnd
37: .proc
38: .callinfo frame=0,no_calls
39: .entry
40:
41: comb,< %r23,0,L$largedivisor
42: sub %r0,%r23,%r1 ; clear cy as side-effect
43: ds %r0,%r1,%r0
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,%r24
101: ds %r25,%r23,%r25
102: addc %r24,%r24,%r24
103: ds %r25,%r23,%r25
104: addc %r24,%r24,%r24
105: ds %r25,%r23,%r25
106: addc %r24,%r24,%r28
107: ds %r25,%r23,%r25
108: comclr,>= %r25,%r0,%r0
109: addl %r25,%r23,%r25
110: stws %r25,0(0,%r26)
111: bv 0(%r2)
112: addc %r28,%r28,%r28
113:
114: L$largedivisor
115: extru %r24,31,1,%r19 ; r19 = n0 & 1
116: bb,< %r23,31,L$odd
117: extru %r23,30,31,%r22 ; r22 = d >> 1
118: shd %r25,%r24,1,%r24 ; r24 = new n0
119: extru %r25,30,31,%r25 ; r25 = new n1
120: sub %r0,%r22,%r21
121: ds %r0,%r21,%r0
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: addc %r24,%r24,%r24
181: ds %r25,%r22,%r25
182: addc %r24,%r24,%r24
183: ds %r25,%r22,%r25
184: addc %r24,%r24,%r24
185: ds %r25,%r22,%r25
186: comclr,>= %r25,%r0,%r0
187: addl %r25,%r22,%r25
188: sh1addl %r25,%r19,%r25
189: stws %r25,0(0,%r26)
190: bv 0(%r2)
191: addc %r24,%r24,%r28
192:
193: L$odd addib,sv,n 1,%r22,L$FF.. ; r22 = (d / 2 + 1)
194: shd %r25,%r24,1,%r24 ; r24 = new n0
195: extru %r25,30,31,%r25 ; r25 = new n1
196: sub %r0,%r22,%r21
197: ds %r0,%r21,%r0
198: addc %r24,%r24,%r24
199: ds %r25,%r22,%r25
200: addc %r24,%r24,%r24
201: ds %r25,%r22,%r25
202: addc %r24,%r24,%r24
203: ds %r25,%r22,%r25
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,%r28
263: comclr,>= %r25,%r0,%r0
264: addl %r25,%r22,%r25
265: sh1addl %r25,%r19,%r25
266: ; We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
267: add,nuv %r28,%r25,%r25
268: addl %r25,%r1,%r25
269: addc %r0,%r28,%r28
270: sub,<< %r25,%r23,%r0
271: addl %r25,%r1,%r25
272: stws %r25,0(0,%r26)
273: bv 0(%r2)
274: addc %r0,%r28,%r28
275:
276: ; This is just a special case of the code above.
277: ; We come here when d == 0xFFFFFFFF
278: L$FF.. add,uv %r25,%r24,%r24
279: sub,<< %r24,%r23,%r0
280: ldo 1(%r24),%r24
281: stws %r24,0(0,%r26)
282: bv 0(%r2)
283: addc %r0,%r25,%r28
284:
285: .exit
286: .procend
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>