1 /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
2  * Note: I added some stuff for use with gnupg
3  *
4  * Copyright (C) 1991, 1992, 1993, 1994, 1996, 1998,
5  *	2000, 2001, 2002, 2003 Free Software Foundation, Inc.
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Library General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or (at your
10  * option) any later version.
11  *
12  * This file is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this file; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20  * MA 02111-1307, USA. */
21 
22 /* You have to define the following before including this file:
23  *
24  * UWtype -- An unsigned type, default type for operations (typically a "word")
25  * UHWtype -- An unsigned type, at least half the size of UWtype.
26  * UDWtype -- An unsigned type, at least twice as large a UWtype
27  * W_TYPE_SIZE -- size in bits of UWtype
28  *
29  * SItype, USItype -- Signed and unsigned 32 bit types.
30  * DItype, UDItype -- Signed and unsigned 64 bit types.
31  *
32  * On a 32 bit machine UWtype should typically be USItype;
33  * on a 64 bit machine, UWtype should typically be UDItype.
34 */
35 
36 #define __BITS4 (W_TYPE_SIZE / 4)
37 #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
38 #define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
39 #define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
40 
41 /* This is used to make sure no undesirable sharing between different libraries
42 	that use this file takes place.  */
43 #ifndef __MPN
44 #define __MPN(x) __##x
45 #endif
46 
47 /* Define auxiliary asm macros.
48  *
49  * 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two
50  * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
51  * word product in HIGH_PROD and LOW_PROD.
52  *
53  * 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
54  * UDWtype product.  This is just a variant of umul_ppmm.
55 
56  * 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
57  * denominator) divides a UDWtype, composed by the UWtype integers
58  * HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
59  * in QUOTIENT and the remainder in REMAINDER.	HIGH_NUMERATOR must be less
60  * than DENOMINATOR for correct operation.  If, in addition, the most
61  * significant bit of DENOMINATOR must be 1, then the pre-processor symbol
62  * UDIV_NEEDS_NORMALIZATION is defined to 1.
63  * 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
64  * denominator).  Like udiv_qrnnd but the numbers are signed.  The quotient
65  * is rounded towards 0.
66  *
67  * 5) count_leading_zeros(count, x) counts the number of zero-bits from the
68  * msb to the first non-zero bit in the UWtype X.  This is the number of
69  * steps X needs to be shifted left to set the msb.  Undefined for X == 0,
70  * unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
71  *
72  * 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
73  * from the least significant end.
74  *
75  * 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
76  * high_addend_2, low_addend_2) adds two UWtype integers, composed by
77  * HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
78  * respectively.  The result is placed in HIGH_SUM and LOW_SUM.  Overflow
79  * (i.e. carry out) is not stored anywhere, and is lost.
80  *
81  * 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
82  * high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
83  * composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
84  * LOW_SUBTRAHEND_2 respectively.  The result is placed in HIGH_DIFFERENCE
85  * and LOW_DIFFERENCE.	Overflow (i.e. carry out) is not stored anywhere,
86  * and is lost.
87  *
88  * If any of these macros are left undefined for a particular CPU,
89  * C macros are used.  */
90 
91 /* The CPUs come in alphabetical order below.
92  *
93  * Please add support for more CPUs here, or improve the current support
94  * for the CPUs below!	*/
95 
96 #if defined(__GNUC__) && !defined(NO_ASM)
97 
98 /* We sometimes need to clobber "cc" with gcc2, but that would not be
99 	understood by gcc1.	Use cpp to avoid major code duplication.  */
100 #if __GNUC__ < 2
101 #define __CLOBBER_CC
102 #define __AND_CLOBBER_CC
103 #else /* __GNUC__ >= 2 */
104 #define __CLOBBER_CC : "cc"
105 #define __AND_CLOBBER_CC , "cc"
106 #endif /* __GNUC__ < 2 */
107 
108 /***************************************
109 	**************  A29K  *****************
110 	***************************************/
111 #if (defined(__a29k__) || defined(_AM29K)) && W_TYPE_SIZE == 32
112 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
113 	__asm__ ("add %1,%4,%5\n" \
114 		"addc %0,%2,%3" \
115 	: "=r" ((USItype)(sh)), \
116 		"=&r" ((USItype)(sl)) \
117 	: "%r" ((USItype)(ah)), \
118 		"rI" ((USItype)(bh)), \
119 		"%r" ((USItype)(al)), \
120 		"rI" ((USItype)(bl)))
121 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
122 	__asm__ ("sub %1,%4,%5\n" \
123 		"subc %0,%2,%3" \
124 	: "=r" ((USItype)(sh)), \
125 		"=&r" ((USItype)(sl)) \
126 	: "r" ((USItype)(ah)), \
127 		"rI" ((USItype)(bh)), \
128 		"r" ((USItype)(al)), \
129 		"rI" ((USItype)(bl)))
130 #define umul_ppmm(xh, xl, m0, m1) \
131 do { \
132 		USItype __m0 = (m0), __m1 = (m1); \
133 		__asm__ ("multiplu %0,%1,%2" \
134 		: "=r" ((USItype)(xl)) \
135 		: "r" (__m0), \
136 			"r" (__m1)); \
137 		__asm__ ("multmu %0,%1,%2" \
138 		: "=r" ((USItype)(xh)) \
139 		: "r" (__m0), \
140 			"r" (__m1)); \
141 } while (0)
142 #define udiv_qrnnd(q, r, n1, n0, d) \
143 	__asm__ ("dividu %0,%3,%4" \
144 	: "=r" ((USItype)(q)), \
145 		"=q" ((USItype)(r)) \
146 	: "1" ((USItype)(n1)), \
147 		"r" ((USItype)(n0)), \
148 		"r" ((USItype)(d)))
149 
150 #define count_leading_zeros(count, x) \
151 	__asm__ ("clz %0,%1" \
152 	: "=r" ((USItype)(count)) \
153 	: "r" ((USItype)(x)))
154 #define COUNT_LEADING_ZEROS_0 32
155 #endif /* __a29k__ */
156 
157 #if defined(__alpha) && W_TYPE_SIZE == 64
158 #define umul_ppmm(ph, pl, m0, m1) \
159 do { \
160 		UDItype __m0 = (m0), __m1 = (m1); \
161 		__asm__ ("umulh %r1,%2,%0" \
162 		: "=r" ((UDItype) ph) \
163 		: "%rJ" (__m0), \
164 			"rI" (__m1)); \
165 		(pl) = __m0 * __m1; \
166 	} while (0)
167 #define UMUL_TIME 46
168 #ifndef LONGLONG_STANDALONE
169 #define udiv_qrnnd(q, r, n1, n0, d) \
170 do { UDItype __r; \
171 	(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
172 	(r) = __r; \
173 } while (0)
174 extern UDItype __udiv_qrnnd();
175 #define UDIV_TIME 220
176 #endif /* LONGLONG_STANDALONE */
177 #endif /* __alpha */
178 
179 /***************************************
180 	**************  ARM  ******************
181 	***************************************/
182 #if defined(__arm__) && W_TYPE_SIZE == 32
183 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
184 	__asm__ ("adds %1, %4, %5\n" \
185 		"adc  %0, %2, %3" \
186 	: "=r" ((USItype)(sh)), \
187 		"=&r" ((USItype)(sl)) \
188 	: "%r" ((USItype)(ah)), \
189 		"rI" ((USItype)(bh)), \
190 		"%r" ((USItype)(al)), \
191 		"rI" ((USItype)(bl)))
192 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
193 	__asm__ ("subs %1, %4, %5\n" \
194 		"sbc  %0, %2, %3" \
195 	: "=r" ((USItype)(sh)), \
196 		"=&r" ((USItype)(sl)) \
197 	: "r" ((USItype)(ah)), \
198 		"rI" ((USItype)(bh)), \
199 		"r" ((USItype)(al)), \
200 		"rI" ((USItype)(bl)))
201 #if defined __ARM_ARCH_2__ || defined __ARM_ARCH_3__
202 #define umul_ppmm(xh, xl, a, b) \
203 	__asm__ ("%@ Inlined umul_ppmm\n" \
204 		"mov	%|r0, %2, lsr #16		@ AAAA\n" \
205 		"mov	%|r2, %3, lsr #16		@ BBBB\n" \
206 		"bic	%|r1, %2, %|r0, lsl #16		@ aaaa\n" \
207 		"bic	%0, %3, %|r2, lsl #16		@ bbbb\n" \
208 		"mul	%1, %|r1, %|r2			@ aaaa * BBBB\n" \
209 		"mul	%|r2, %|r0, %|r2		@ AAAA * BBBB\n" \
210 		"mul	%|r1, %0, %|r1			@ aaaa * bbbb\n" \
211 		"mul	%0, %|r0, %0			@ AAAA * bbbb\n" \
212 		"adds	%|r0, %1, %0			@ central sum\n" \
213 		"addcs	%|r2, %|r2, #65536\n" \
214 		"adds	%1, %|r1, %|r0, lsl #16\n" \
215 		"adc	%0, %|r2, %|r0, lsr #16" \
216 	: "=&r" ((USItype)(xh)), \
217 		"=r" ((USItype)(xl)) \
218 	: "r" ((USItype)(a)), \
219 		"r" ((USItype)(b)) \
220 	: "r0", "r1", "r2")
221 #else
222 #define umul_ppmm(xh, xl, a, b) \
223 	__asm__ ("%@ Inlined umul_ppmm\n" \
224 		"umull %r1, %r0, %r2, %r3" \
225 	: "=&r" ((USItype)(xh)), \
226 			"=r" ((USItype)(xl)) \
227 	: "r" ((USItype)(a)), \
228 			"r" ((USItype)(b)) \
229 	: "r0", "r1")
230 #endif
231 #define UMUL_TIME 20
232 #define UDIV_TIME 100
233 #endif /* __arm__ */
234 
235 /***************************************
236 	**************  CLIPPER  **************
237 	***************************************/
238 #if defined(__clipper__) && W_TYPE_SIZE == 32
239 #define umul_ppmm(w1, w0, u, v) \
240 	({union {UDItype __ll; \
241 		struct {USItype __l, __h; } __i; \
242 	} __xx; \
243 	__asm__ ("mulwux %2,%0" \
244 	: "=r" (__xx.__ll) \
245 	: "%0" ((USItype)(u)), \
246 		"r" ((USItype)(v))); \
247 	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
248 #define smul_ppmm(w1, w0, u, v) \
249 	({union {DItype __ll; \
250 		struct {SItype __l, __h; } __i; \
251 	} __xx; \
252 	__asm__ ("mulwx %2,%0" \
253 	: "=r" (__xx.__ll) \
254 	: "%0" ((SItype)(u)), \
255 		"r" ((SItype)(v))); \
256 	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
257 #define __umulsidi3(u, v) \
258 	({UDItype __w; \
259 	__asm__ ("mulwux %2,%0" \
260 	: "=r" (__w) \
261 	: "%0" ((USItype)(u)), \
262 		"r" ((USItype)(v))); \
263 	__w; })
264 #endif /* __clipper__ */
265 
266 /***************************************
267 	**************  GMICRO  ***************
268 	***************************************/
269 #if defined(__gmicro__) && W_TYPE_SIZE == 32
270 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
271 	__asm__ ("add.w %5,%1\n" \
272 		"addx %3,%0" \
273 	: "=g" ((USItype)(sh)), \
274 		"=&g" ((USItype)(sl)) \
275 	: "%0" ((USItype)(ah)), \
276 		"g" ((USItype)(bh)), \
277 		"%1" ((USItype)(al)), \
278 		"g" ((USItype)(bl)))
279 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
280 	__asm__ ("sub.w %5,%1\n" \
281 		"subx %3,%0" \
282 	: "=g" ((USItype)(sh)), \
283 		"=&g" ((USItype)(sl)) \
284 	: "0" ((USItype)(ah)), \
285 		"g" ((USItype)(bh)), \
286 		"1" ((USItype)(al)), \
287 		"g" ((USItype)(bl)))
288 #define umul_ppmm(ph, pl, m0, m1) \
289 	__asm__ ("mulx %3,%0,%1" \
290 	: "=g" ((USItype)(ph)), \
291 		"=r" ((USItype)(pl)) \
292 	: "%0" ((USItype)(m0)), \
293 		"g" ((USItype)(m1)))
294 #define udiv_qrnnd(q, r, nh, nl, d) \
295 	__asm__ ("divx %4,%0,%1" \
296 	: "=g" ((USItype)(q)), \
297 		"=r" ((USItype)(r)) \
298 	: "1" ((USItype)(nh)), \
299 		"0" ((USItype)(nl)), \
300 		"g" ((USItype)(d)))
301 #define count_leading_zeros(count, x) \
302 	__asm__ ("bsch/1 %1,%0" \
303 	: "=g" (count) \
304 	: "g" ((USItype)(x)), \
305 	     "0" ((USItype)0))
306 #endif
307 
308 /***************************************
309 	**************  HPPA  *****************
310 	***************************************/
311 #if defined(__hppa) && W_TYPE_SIZE == 32
312 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
313 	__asm__ ("add %4,%5,%1\n" \
314 		   "addc %2,%3,%0" \
315 	: "=r" ((USItype)(sh)), \
316 	     "=&r" ((USItype)(sl)) \
317 	: "%rM" ((USItype)(ah)), \
318 	     "rM" ((USItype)(bh)), \
319 	     "%rM" ((USItype)(al)), \
320 	     "rM" ((USItype)(bl)))
321 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
322 	__asm__ ("sub %4,%5,%1\n" \
323 	   "subb %2,%3,%0" \
324 	: "=r" ((USItype)(sh)), \
325 	     "=&r" ((USItype)(sl)) \
326 	: "rM" ((USItype)(ah)), \
327 	     "rM" ((USItype)(bh)), \
328 	     "rM" ((USItype)(al)), \
329 	     "rM" ((USItype)(bl)))
330 #if defined(_PA_RISC1_1)
331 #define umul_ppmm(wh, wl, u, v) \
332 do { \
333 	union {UDItype __ll; \
334 	struct {USItype __h, __l; } __i; \
335 	} __xx; \
336 	__asm__ ("xmpyu %1,%2,%0" \
337 	: "=*f" (__xx.__ll) \
338 	: "*f" ((USItype)(u)), \
339 	       "*f" ((USItype)(v))); \
340 	(wh) = __xx.__i.__h; \
341 	(wl) = __xx.__i.__l; \
342 } while (0)
343 #define UMUL_TIME 8
344 #define UDIV_TIME 60
345 #else
346 #define UMUL_TIME 40
347 #define UDIV_TIME 80
348 #endif
349 #ifndef LONGLONG_STANDALONE
350 #define udiv_qrnnd(q, r, n1, n0, d) \
351 do { USItype __r; \
352 	(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
353 	(r) = __r; \
354 } while (0)
355 extern USItype __udiv_qrnnd();
356 #endif /* LONGLONG_STANDALONE */
357 #define count_leading_zeros(count, x) \
358 do { \
359 	USItype __tmp; \
360 	__asm__ ( \
361 	"ldi             1,%0\n" \
362 	"extru,=	%1,15,16,%%r0  ; Bits 31..16 zero?\n" \
363 	"extru,tr	%1,15,16,%1    ; No.  Shift down, skip add.\n" \
364 	"ldo		16(%0),%0      ; Yes.	Perform add.\n" \
365 	"extru,=	%1,23,8,%%r0   ; Bits 15..8 zero?\n" \
366 	"extru,tr	%1,23,8,%1     ; No.  Shift down, skip add.\n" \
367 	"ldo		8(%0),%0       ; Yes.	Perform add.\n" \
368 	"extru,=	%1,27,4,%%r0   ; Bits 7..4 zero?\n" \
369 	"extru,tr	%1,27,4,%1     ; No.  Shift down, skip add.\n" \
370 	"ldo		4(%0),%0       ; Yes.	Perform add.\n" \
371 	"extru,=	%1,29,2,%%r0   ; Bits 3..2 zero?\n" \
372 	"extru,tr	%1,29,2,%1     ; No.  Shift down, skip add.\n" \
373 	"ldo		2(%0),%0       ; Yes.	Perform add.\n" \
374 	"extru		%1,30,1,%1     ; Extract bit 1.\n" \
375 	"sub		%0,%1,%0       ; Subtract it.              " \
376 	: "=r" (count), "=r" (__tmp) : "1" (x)); \
377 } while (0)
378 #endif /* hppa */
379 
380 /***************************************
381 	**************  I370  *****************
382 	***************************************/
383 #if (defined(__i370__) || defined(__mvs__)) && W_TYPE_SIZE == 32
384 #define umul_ppmm(xh, xl, m0, m1) \
385 do { \
386 	union {UDItype __ll; \
387 	   struct {USItype __h, __l; } __i; \
388 	} __xx; \
389 	USItype __m0 = (m0), __m1 = (m1); \
390 	__asm__ ("mr %0,%3" \
391 	: "=r" (__xx.__i.__h), \
392 	       "=r" (__xx.__i.__l) \
393 	: "%1" (__m0), \
394 	       "r" (__m1)); \
395 	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
396 	(xh) += ((((SItype) __m0 >> 31) & __m1) \
397 	     + (((SItype) __m1 >> 31) & __m0)); \
398 } while (0)
399 #define smul_ppmm(xh, xl, m0, m1) \
400 do { \
401 	union {DItype __ll; \
402 	   struct {USItype __h, __l; } __i; \
403 	} __xx; \
404 	__asm__ ("mr %0,%3" \
405 	: "=r" (__xx.__i.__h), \
406 	       "=r" (__xx.__i.__l) \
407 	: "%1" (m0), \
408 	       "r" (m1)); \
409 	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
410 } while (0)
411 #define sdiv_qrnnd(q, r, n1, n0, d) \
412 do { \
413 	union {DItype __ll; \
414 	   struct {USItype __h, __l; } __i; \
415 	} __xx; \
416 	__xx.__i.__h = n1; __xx.__i.__l = n0; \
417 	__asm__ ("dr %0,%2" \
418 	: "=r" (__xx.__ll) \
419 	: "0" (__xx.__ll), "r" (d)); \
420 	(q) = __xx.__i.__l; (r) = __xx.__i.__h; \
421 } while (0)
422 #endif
423 
424 /***************************************
425 	**************  I386  *****************
426 	***************************************/
427 #undef __i386__
428 #if (defined(__i386__) || defined(__i486__)) && W_TYPE_SIZE == 32
429 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
430 	__asm__ ("addl %5,%1\n" \
431 	   "adcl %3,%0" \
432 	: "=r" ((USItype)(sh)), \
433 	     "=&r" ((USItype)(sl)) \
434 	: "%0" ((USItype)(ah)), \
435 	     "g" ((USItype)(bh)), \
436 	     "%1" ((USItype)(al)), \
437 	     "g" ((USItype)(bl)))
438 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
439 	__asm__ ("subl %5,%1\n" \
440 	   "sbbl %3,%0" \
441 	: "=r" ((USItype)(sh)), \
442 	     "=&r" ((USItype)(sl)) \
443 	: "0" ((USItype)(ah)), \
444 	     "g" ((USItype)(bh)), \
445 	     "1" ((USItype)(al)), \
446 	     "g" ((USItype)(bl)))
447 #define umul_ppmm(w1, w0, u, v) \
448 	__asm__ ("mull %3" \
449 	: "=a" ((USItype)(w0)), \
450 	     "=d" ((USItype)(w1)) \
451 	: "%0" ((USItype)(u)), \
452 	     "rm" ((USItype)(v)))
453 #define udiv_qrnnd(q, r, n1, n0, d) \
454 	__asm__ ("divl %4" \
455 	: "=a" ((USItype)(q)), \
456 	     "=d" ((USItype)(r)) \
457 	: "0" ((USItype)(n0)), \
458 	     "1" ((USItype)(n1)), \
459 	     "rm" ((USItype)(d)))
460 #define count_leading_zeros(count, x) \
461 do { \
462 	USItype __cbtmp; \
463 	__asm__ ("bsrl %1,%0" \
464 	: "=r" (__cbtmp) : "rm" ((USItype)(x))); \
465 	(count) = __cbtmp ^ 31; \
466 } while (0)
467 #define count_trailing_zeros(count, x) \
468 	__asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)))
469 #ifndef UMUL_TIME
470 #define UMUL_TIME 40
471 #endif
472 #ifndef UDIV_TIME
473 #define UDIV_TIME 40
474 #endif
475 #endif /* 80x86 */
476 
477 /***************************************
478 	**************  I860  *****************
479 	***************************************/
480 #if defined(__i860__) && W_TYPE_SIZE == 32
481 #define rshift_rhlc(r, h, l, c) \
482 	__asm__ ("shr %3,r0,r0\n" \
483 	"shrd %1,%2,%0" \
484 	   "=r" (r) : "r" (h), "r" (l), "rn" (c))
485 #endif /* i860 */
486 
487 /***************************************
488 	**************  I960  *****************
489 	***************************************/
490 #if defined(__i960__) && W_TYPE_SIZE == 32
491 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
492 	__asm__ ("cmpo 1,0\n" \
493 	"addc %5,%4,%1\n" \
494 	"addc %3,%2,%0" \
495 	: "=r" ((USItype)(sh)), \
496 	     "=&r" ((USItype)(sl)) \
497 	: "%dI" ((USItype)(ah)), \
498 	     "dI" ((USItype)(bh)), \
499 	     "%dI" ((USItype)(al)), \
500 	     "dI" ((USItype)(bl)))
501 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
502 	__asm__ ("cmpo 0,0\n" \
503 	"subc %5,%4,%1\n" \
504 	"subc %3,%2,%0" \
505 	: "=r" ((USItype)(sh)), \
506 	     "=&r" ((USItype)(sl)) \
507 	: "dI" ((USItype)(ah)), \
508 	     "dI" ((USItype)(bh)), \
509 	     "dI" ((USItype)(al)), \
510 	     "dI" ((USItype)(bl)))
511 #define umul_ppmm(w1, w0, u, v) \
512 	({union {UDItype __ll; \
513 	   struct {USItype __l, __h; } __i; \
514 	} __xx; \
515 	__asm__ ("emul        %2,%1,%0" \
516 	: "=d" (__xx.__ll) \
517 	: "%dI" ((USItype)(u)), \
518 	     "dI" ((USItype)(v))); \
519 	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
520 #define __umulsidi3(u, v) \
521 	({UDItype __w; \
522 	__asm__ ("emul      %2,%1,%0" \
523 	: "=d" (__w) \
524 	: "%dI" ((USItype)(u)), \
525 	       "dI" ((USItype)(v))); \
526 	__w; })
527 #define udiv_qrnnd(q, r, nh, nl, d) \
528 do { \
529 	union {UDItype __ll; \
530 	   struct {USItype __l, __h; } __i; \
531 	} __nn; \
532 	__nn.__i.__h = (nh); __nn.__i.__l = (nl); \
533 	__asm__ ("ediv %d,%n,%0" \
534 	: "=d" (__rq.__ll) \
535 	: "dI" (__nn.__ll), \
536 	     "dI" ((USItype)(d))); \
537 	(r) = __rq.__i.__l; (q) = __rq.__i.__h; \
538 } while (0)
539 #define count_leading_zeros(count, x) \
540 do { \
541 	USItype __cbtmp; \
542 	__asm__ ("scanbit %1,%0" \
543 	: "=r" (__cbtmp) \
544 	: "r" ((USItype)(x))); \
545 	(count) = __cbtmp ^ 31; \
546 } while (0)
547 #define COUNT_LEADING_ZEROS_0 (-32)	/* sic */
548 #if defined(__i960mx)		/* what is the proper symbol to test??? */
549 #define rshift_rhlc(r, h, l, c) \
550 do { \
551 	union {UDItype __ll; \
552 	   struct {USItype __l, __h; } __i; \
553 	} __nn; \
554 	__nn.__i.__h = (h); __nn.__i.__l = (l); \
555 	__asm__ ("shre %2,%1,%0" \
556 	: "=d" (r) : "dI" (__nn.__ll), "dI" (c)); \
557 }
558 #endif /* i960mx */
559 #endif /* i960 */
560 
561 /***************************************
562 	**************  68000	****************
563 	***************************************/
564 #if (defined(__mc68000__) || defined(__mc68020__) || defined(__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32
565 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
566 	__asm__ ("add%.l %5,%1\n" \
567 	   "addx%.l %3,%0" \
568 	: "=d" ((USItype)(sh)), \
569 	     "=&d" ((USItype)(sl)) \
570 	: "%0" ((USItype)(ah)), \
571 	     "d" ((USItype)(bh)), \
572 	     "%1" ((USItype)(al)), \
573 	     "g" ((USItype)(bl)))
574 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
575 	__asm__ ("sub%.l %5,%1\n" \
576 	   "subx%.l %3,%0" \
577 	: "=d" ((USItype)(sh)), \
578 	     "=&d" ((USItype)(sl)) \
579 	: "0" ((USItype)(ah)), \
580 	     "d" ((USItype)(bh)), \
581 	     "1" ((USItype)(al)), \
582 	     "g" ((USItype)(bl)))
583 #if (defined(__mc68020__) || defined(__NeXT__) || defined(mc68020))
584 #define umul_ppmm(w1, w0, u, v) \
585 	__asm__ ("mulu%.l %3,%1:%0" \
586 	: "=d" ((USItype)(w0)), \
587 	     "=d" ((USItype)(w1)) \
588 	: "%0" ((USItype)(u)), \
589 	     "dmi" ((USItype)(v)))
590 #define UMUL_TIME 45
591 #define udiv_qrnnd(q, r, n1, n0, d) \
592 	__asm__ ("divu%.l %4,%1:%0" \
593 	: "=d" ((USItype)(q)), \
594 	     "=d" ((USItype)(r)) \
595 	: "0" ((USItype)(n0)), \
596 	     "1" ((USItype)(n1)), \
597 	     "dmi" ((USItype)(d)))
598 #define UDIV_TIME 90
599 #define sdiv_qrnnd(q, r, n1, n0, d) \
600 	__asm__ ("divs%.l %4,%1:%0" \
601 	: "=d" ((USItype)(q)), \
602 	     "=d" ((USItype)(r)) \
603 	: "0" ((USItype)(n0)), \
604 	     "1" ((USItype)(n1)), \
605 	     "dmi" ((USItype)(d)))
606 #define count_leading_zeros(count, x) \
607 	__asm__ ("bfffo %1{%b2:%b2},%0" \
608 	: "=d" ((USItype)(count)) \
609 	: "od" ((USItype)(x)), "n" (0))
610 #define COUNT_LEADING_ZEROS_0 32
611 #else /* not mc68020 */
612 #define umul_ppmm(xh, xl, a, b) \
613 do { USItype __umul_tmp1, __umul_tmp2; \
614 	__asm__ ("| Inlined umul_ppmm\n" \
615 	"move%.l %5,%3\n" \
616 	"move%.l %2,%0\n" \
617 	"move%.w %3,%1\n" \
618 	"swap	%3\n" \
619 	"swap	%0\n" \
620 	"mulu	%2,%1\n" \
621 	"mulu	%3,%0\n" \
622 	"mulu	%2,%3\n" \
623 	"swap	%2\n" \
624 	"mulu	%5,%2\n" \
625 	"add%.l	%3,%2\n" \
626 	"jcc	1f\n" \
627 	"add%.l	%#0x10000,%0\n" \
628 	"1:	move%.l %2,%3\n" \
629 	"clr%.w	%2\n" \
630 	"swap	%2\n" \
631 	"swap	%3\n" \
632 	"clr%.w	%3\n" \
633 	"add%.l	%3,%1\n" \
634 	"addx%.l %2,%0\n" \
635 	"| End inlined umul_ppmm" \
636 	: "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \
637 		"=d" (__umul_tmp1), "=&d" (__umul_tmp2) \
638 	: "%2" ((USItype)(a)), "d" ((USItype)(b))); \
639 } while (0)
640 #define UMUL_TIME 100
641 #define UDIV_TIME 400
642 #endif /* not mc68020 */
643 #endif /* mc68000 */
644 
645 /***************************************
646 	**************  88000	****************
647 	***************************************/
648 #if defined(__m88000__) && W_TYPE_SIZE == 32
649 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
650 	__asm__ ("addu.co %1,%r4,%r5\n" \
651 	   "addu.ci %0,%r2,%r3" \
652 	: "=r" ((USItype)(sh)), \
653 	     "=&r" ((USItype)(sl)) \
654 	: "%rJ" ((USItype)(ah)), \
655 	     "rJ" ((USItype)(bh)), \
656 	     "%rJ" ((USItype)(al)), \
657 	     "rJ" ((USItype)(bl)))
658 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
659 	__asm__ ("subu.co %1,%r4,%r5\n" \
660 	   "subu.ci %0,%r2,%r3" \
661 	: "=r" ((USItype)(sh)), \
662 	     "=&r" ((USItype)(sl)) \
663 	: "rJ" ((USItype)(ah)), \
664 	     "rJ" ((USItype)(bh)), \
665 	     "rJ" ((USItype)(al)), \
666 	     "rJ" ((USItype)(bl)))
667 #define count_leading_zeros(count, x) \
668 do { \
669 	USItype __cbtmp; \
670 	__asm__ ("ff1 %0,%1" \
671 	: "=r" (__cbtmp) \
672 	: "r" ((USItype)(x))); \
673 	(count) = __cbtmp ^ 31; \
674 } while (0)
675 #define COUNT_LEADING_ZEROS_0 63	/* sic */
676 #if defined(__m88110__)
677 #define umul_ppmm(wh, wl, u, v) \
678 do { \
679 	union {UDItype __ll; \
680 	   struct {USItype __h, __l; } __i; \
681 	} __x; \
682 	__asm__ ("mulu.d %0,%1,%2" : "=r" (__x.__ll) : "r" (u), "r" (v)); \
683 	(wh) = __x.__i.__h; \
684 	(wl) = __x.__i.__l; \
685 } while (0)
686 #define udiv_qrnnd(q, r, n1, n0, d) \
687 	({union {UDItype __ll; \
688 	   struct {USItype __h, __l; } __i; \
689 	} __x, __q; \
690 	__x.__i.__h = (n1); __x.__i.__l = (n0); \
691 	__asm__ ("divu.d %0,%1,%2" \
692 	: "=r" (__q.__ll) : "r" (__x.__ll), "r" (d)); \
693 	(r) = (n0) - __q.__l * (d); (q) = __q.__l; })
694 #define UMUL_TIME 5
695 #define UDIV_TIME 25
696 #else
697 #define UMUL_TIME 17
698 #define UDIV_TIME 150
699 #endif /* __m88110__ */
700 #endif /* __m88000__ */
701 
702 /***************************************
703 	**************  MIPS  *****************
704 	***************************************/
705 #if defined(__mips__) && W_TYPE_SIZE == 32
706 #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
707 #define umul_ppmm(w1, w0, u, v) \
708 	__asm__ ("multu %2,%3" \
709 	: "=l" ((USItype)(w0)), \
710 	     "=h" ((USItype)(w1)) \
711 	: "d" ((USItype)(u)), \
712 	     "d" ((USItype)(v)))
713 #else
714 #define umul_ppmm(w1, w0, u, v) \
715 	__asm__ ("multu %2,%3\n" \
716 	   "mflo %0\n" \
717 	   "mfhi %1" \
718 	: "=d" ((USItype)(w0)), \
719 	     "=d" ((USItype)(w1)) \
720 	: "d" ((USItype)(u)), \
721 	     "d" ((USItype)(v)))
722 #endif
723 #define UMUL_TIME 10
724 #define UDIV_TIME 100
725 #endif /* __mips__ */
726 
727 /***************************************
728 	**************  MIPS/64  **************
729 	***************************************/
730 #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
731 #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
732 #define umul_ppmm(w1, w0, u, v) \
733 	__asm__ ("dmultu %2,%3" \
734 	: "=l" ((UDItype)(w0)), \
735 	     "=h" ((UDItype)(w1)) \
736 	: "d" ((UDItype)(u)), \
737 	     "d" ((UDItype)(v)))
738 #else
739 #define umul_ppmm(w1, w0, u, v) \
740 	__asm__ ("dmultu %2,%3\n" \
741 	   "mflo %0\n" \
742 	   "mfhi %1" \
743 	: "=d" ((UDItype)(w0)), \
744 	     "=d" ((UDItype)(w1)) \
745 	: "d" ((UDItype)(u)), \
746 	     "d" ((UDItype)(v)))
747 #endif
748 #define UMUL_TIME 20
749 #define UDIV_TIME 140
750 #endif /* __mips__ */
751 
752 /***************************************
753 	**************  32000	****************
754 	***************************************/
755 #if defined(__ns32000__) && W_TYPE_SIZE == 32
756 #define umul_ppmm(w1, w0, u, v) \
757 	({union {UDItype __ll; \
758 	   struct {USItype __l, __h; } __i; \
759 	} __xx; \
760 	__asm__ ("meid %2,%0" \
761 	: "=g" (__xx.__ll) \
762 	: "%0" ((USItype)(u)), \
763 	     "g" ((USItype)(v))); \
764 	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
765 #define __umulsidi3(u, v) \
766 	({UDItype __w; \
767 	__asm__ ("meid %2,%0" \
768 	: "=g" (__w) \
769 	: "%0" ((USItype)(u)), \
770 	       "g" ((USItype)(v))); \
771 	__w; })
772 #define udiv_qrnnd(q, r, n1, n0, d) \
773 	({union {UDItype __ll; \
774 	   struct {USItype __l, __h; } __i; \
775 	} __xx; \
776 	__xx.__i.__h = (n1); __xx.__i.__l = (n0); \
777 	__asm__ ("deid %2,%0" \
778 	: "=g" (__xx.__ll) \
779 	: "0" (__xx.__ll), \
780 	     "g" ((USItype)(d))); \
781 	(r) = __xx.__i.__l; (q) = __xx.__i.__h; })
782 #define count_trailing_zeros(count, x) \
783 do { \
784 	__asm__("ffsd      %2,%0" \
785 	: "=r"((USItype) (count)) \
786 	: "0"((USItype) 0), "r"((USItype) (x))); \
787 	} while (0)
788 #endif /* __ns32000__ */
789 
790 /***************************************
791 	**************  PPC  ******************
792 	***************************************/
793 #if (defined(_ARCH_PPC) || defined(_IBMR2)) && W_TYPE_SIZE == 32
794 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
795 do { \
796 	if (__builtin_constant_p(bh) && (bh) == 0) \
797 		__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
798 		: "=r" ((USItype)(sh)), \
799 		"=&r" ((USItype)(sl)) \
800 		: "%r" ((USItype)(ah)), \
801 		"%r" ((USItype)(al)), \
802 		"rI" ((USItype)(bl))); \
803 	else if (__builtin_constant_p(bh) && (bh) == ~(USItype) 0) \
804 		__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
805 		: "=r" ((USItype)(sh)), \
806 		"=&r" ((USItype)(sl)) \
807 		: "%r" ((USItype)(ah)), \
808 		"%r" ((USItype)(al)), \
809 		"rI" ((USItype)(bl))); \
810 	else \
811 		__asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
812 		: "=r" ((USItype)(sh)), \
813 		"=&r" ((USItype)(sl)) \
814 		: "%r" ((USItype)(ah)), \
815 		"r" ((USItype)(bh)), \
816 		"%r" ((USItype)(al)), \
817 		"rI" ((USItype)(bl))); \
818 } while (0)
819 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
820 do { \
821 	if (__builtin_constant_p(ah) && (ah) == 0) \
822 		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
823 		: "=r" ((USItype)(sh)), \
824 		"=&r" ((USItype)(sl)) \
825 		: "r" ((USItype)(bh)), \
826 		"rI" ((USItype)(al)), \
827 		"r" ((USItype)(bl))); \
828 	else if (__builtin_constant_p(ah) && (ah) == ~(USItype) 0) \
829 		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
830 		: "=r" ((USItype)(sh)), \
831 		"=&r" ((USItype)(sl)) \
832 		: "r" ((USItype)(bh)), \
833 		"rI" ((USItype)(al)), \
834 		"r" ((USItype)(bl))); \
835 	else if (__builtin_constant_p(bh) && (bh) == 0) \
836 		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
837 		: "=r" ((USItype)(sh)), \
838 		"=&r" ((USItype)(sl)) \
839 		: "r" ((USItype)(ah)), \
840 		"rI" ((USItype)(al)), \
841 		"r" ((USItype)(bl))); \
842 	else if (__builtin_constant_p(bh) && (bh) == ~(USItype) 0) \
843 		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
844 		: "=r" ((USItype)(sh)), \
845 		"=&r" ((USItype)(sl)) \
846 		: "r" ((USItype)(ah)), \
847 		"rI" ((USItype)(al)), \
848 		"r" ((USItype)(bl))); \
849 	else \
850 		__asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
851 		: "=r" ((USItype)(sh)), \
852 		"=&r" ((USItype)(sl)) \
853 		: "r" ((USItype)(ah)), \
854 		"r" ((USItype)(bh)), \
855 		"rI" ((USItype)(al)), \
856 		"r" ((USItype)(bl))); \
857 } while (0)
858 #define count_leading_zeros(count, x) \
859 	__asm__ ("{cntlz|cntlzw} %0,%1" \
860 	: "=r" ((USItype)(count)) \
861 	: "r" ((USItype)(x)))
862 #define COUNT_LEADING_ZEROS_0 32
863 #if defined(_ARCH_PPC)
864 #define umul_ppmm(ph, pl, m0, m1) \
865 do { \
866 	USItype __m0 = (m0), __m1 = (m1); \
867 	__asm__ ("mulhwu %0,%1,%2" \
868 	: "=r" ((USItype) ph) \
869 	: "%r" (__m0), \
870 	"r" (__m1)); \
871 	(pl) = __m0 * __m1; \
872 } while (0)
873 #define UMUL_TIME 15
874 #define smul_ppmm(ph, pl, m0, m1) \
875 do { \
876 	SItype __m0 = (m0), __m1 = (m1); \
877 	__asm__ ("mulhw %0,%1,%2" \
878 	: "=r" ((SItype) ph) \
879 	: "%r" (__m0), \
880 	"r" (__m1)); \
881 	(pl) = __m0 * __m1; \
882 } while (0)
883 #define SMUL_TIME 14
884 #define UDIV_TIME 120
885 #else
886 #define umul_ppmm(xh, xl, m0, m1) \
887 do { \
888 	USItype __m0 = (m0), __m1 = (m1); \
889 	__asm__ ("mul %0,%2,%3" \
890 	: "=r" ((USItype)(xh)), \
891 	"=q" ((USItype)(xl)) \
892 	: "r" (__m0), \
893 	"r" (__m1)); \
894 	(xh) += ((((SItype) __m0 >> 31) & __m1) \
895 	+ (((SItype) __m1 >> 31) & __m0)); \
896 } while (0)
897 #define UMUL_TIME 8
898 #define smul_ppmm(xh, xl, m0, m1) \
899 	__asm__ ("mul %0,%2,%3" \
900 	: "=r" ((SItype)(xh)), \
901 	"=q" ((SItype)(xl)) \
902 	: "r" (m0), \
903 	"r" (m1))
904 #define SMUL_TIME 4
905 #define sdiv_qrnnd(q, r, nh, nl, d) \
906 	__asm__ ("div %0,%2,%4" \
907 	: "=r" ((SItype)(q)), "=q" ((SItype)(r)) \
908 	: "r" ((SItype)(nh)), "1" ((SItype)(nl)), "r" ((SItype)(d)))
909 #define UDIV_TIME 100
910 #endif
911 #endif /* Power architecture variants.  */
912 
913 /***************************************
914 	**************  PYR  ******************
915 	***************************************/
916 #if defined(__pyr__) && W_TYPE_SIZE == 32
917 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
918 	__asm__ ("addw        %5,%1\n" \
919 	"addwc	%3,%0" \
920 	: "=r" ((USItype)(sh)), \
921 	"=&r" ((USItype)(sl)) \
922 	: "%0" ((USItype)(ah)), \
923 	"g" ((USItype)(bh)), \
924 	"%1" ((USItype)(al)), \
925 	"g" ((USItype)(bl)))
926 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
927 	__asm__ ("subw        %5,%1\n" \
928 	"subwb	%3,%0" \
929 	: "=r" ((USItype)(sh)), \
930 	"=&r" ((USItype)(sl)) \
931 	: "0" ((USItype)(ah)), \
932 	"g" ((USItype)(bh)), \
933 	"1" ((USItype)(al)), \
934 	"g" ((USItype)(bl)))
935 	/* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP.  */
936 #define umul_ppmm(w1, w0, u, v) \
937 	({union {UDItype __ll; \
938 	struct {USItype __h, __l; } __i; \
939 	} __xx; \
940 	__asm__ ("movw %1,%R0\n" \
941 	"uemul %2,%0" \
942 	: "=&r" (__xx.__ll) \
943 	: "g" ((USItype) (u)), \
944 	"g" ((USItype)(v))); \
945 	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
946 #endif /* __pyr__ */
947 
948 /***************************************
949 	**************  RT/ROMP  **************
950 	***************************************/
951 #if defined(__ibm032__) /* RT/ROMP */	&& W_TYPE_SIZE == 32
952 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
953 	__asm__ ("a %1,%5\n" \
954 	"ae %0,%3" \
955 	: "=r" ((USItype)(sh)), \
956 	"=&r" ((USItype)(sl)) \
957 	: "%0" ((USItype)(ah)), \
958 	"r" ((USItype)(bh)), \
959 	"%1" ((USItype)(al)), \
960 	"r" ((USItype)(bl)))
961 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
962 	__asm__ ("s %1,%5\n" \
963 	"se %0,%3" \
964 	: "=r" ((USItype)(sh)), \
965 	"=&r" ((USItype)(sl)) \
966 	: "0" ((USItype)(ah)), \
967 	"r" ((USItype)(bh)), \
968 	"1" ((USItype)(al)), \
969 	"r" ((USItype)(bl)))
970 #define umul_ppmm(ph, pl, m0, m1) \
971 do { \
972 	USItype __m0 = (m0), __m1 = (m1); \
973 	__asm__ ( \
974 	"s       r2,r2\n" \
975 	"mts	r10,%2\n" \
976 	"m	r2,%3\n" \
977 	"m	r2,%3\n" \
978 	"m	r2,%3\n" \
979 	"m	r2,%3\n" \
980 	"m	r2,%3\n" \
981 	"m	r2,%3\n" \
982 	"m	r2,%3\n" \
983 	"m	r2,%3\n" \
984 	"m	r2,%3\n" \
985 	"m	r2,%3\n" \
986 	"m	r2,%3\n" \
987 	"m	r2,%3\n" \
988 	"m	r2,%3\n" \
989 	"m	r2,%3\n" \
990 	"m	r2,%3\n" \
991 	"m	r2,%3\n" \
992 	"cas	%0,r2,r0\n" \
993 	"mfs	r10,%1" \
994 	: "=r" ((USItype)(ph)), \
995 	"=r" ((USItype)(pl)) \
996 	: "%r" (__m0), \
997 	"r" (__m1) \
998 	: "r2"); \
999 	(ph) += ((((SItype) __m0 >> 31) & __m1) \
1000 	+ (((SItype) __m1 >> 31) & __m0)); \
1001 } while (0)
1002 #define UMUL_TIME 20
1003 #define UDIV_TIME 200
1004 #define count_leading_zeros(count, x) \
1005 do { \
1006 	if ((x) >= 0x10000) \
1007 		__asm__ ("clz     %0,%1" \
1008 		: "=r" ((USItype)(count)) \
1009 		: "r" ((USItype)(x) >> 16)); \
1010 	else { \
1011 		__asm__ ("clz   %0,%1" \
1012 		: "=r" ((USItype)(count)) \
1013 		: "r" ((USItype)(x))); \
1014 		(count) += 16; \
1015 	} \
1016 } while (0)
1017 #endif /* RT/ROMP */
1018 
1019 /***************************************
1020 	**************  SH2  ******************
1021 	***************************************/
1022 #if (defined(__sh2__) || defined(__sh3__) || defined(__SH4__)) \
1023 	&& W_TYPE_SIZE == 32
1024 #define umul_ppmm(w1, w0, u, v) \
1025 	__asm__ ( \
1026 	"dmulu.l %2,%3\n" \
1027 	"sts	macl,%1\n" \
1028 	"sts	mach,%0" \
1029 	: "=r" ((USItype)(w1)), \
1030 	"=r" ((USItype)(w0)) \
1031 	: "r" ((USItype)(u)), \
1032 	"r" ((USItype)(v)) \
1033 	: "macl", "mach")
1034 #define UMUL_TIME 5
1035 #endif
1036 
1037 /***************************************
1038 	**************  SPARC	****************
1039 	***************************************/
1040 #if defined(__sparc__) && W_TYPE_SIZE == 32
1041 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1042 	__asm__ ("addcc %r4,%5,%1\n" \
1043 	"addx %r2,%3,%0" \
1044 	: "=r" ((USItype)(sh)), \
1045 	"=&r" ((USItype)(sl)) \
1046 	: "%rJ" ((USItype)(ah)), \
1047 	"rI" ((USItype)(bh)), \
1048 	"%rJ" ((USItype)(al)), \
1049 	"rI" ((USItype)(bl)) \
1050 	__CLOBBER_CC)
1051 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1052 	__asm__ ("subcc %r4,%5,%1\n" \
1053 	"subx %r2,%3,%0" \
1054 	: "=r" ((USItype)(sh)), \
1055 	"=&r" ((USItype)(sl)) \
1056 	: "rJ" ((USItype)(ah)), \
1057 	"rI" ((USItype)(bh)), \
1058 	"rJ" ((USItype)(al)), \
1059 	"rI" ((USItype)(bl)) \
1060 	__CLOBBER_CC)
1061 #if defined(__sparc_v8__)
1062 /* Don't match immediate range because, 1) it is not often useful,
1063 	2) the 'I' flag thinks of the range as a 13 bit signed interval,
1064 	while we want to match a 13 bit interval, sign extended to 32 bits,
1065 	but INTERPRETED AS UNSIGNED.  */
1066 #define umul_ppmm(w1, w0, u, v) \
1067 	__asm__ ("umul %2,%3,%1;rd %%y,%0" \
1068 	: "=r" ((USItype)(w1)), \
1069 	"=r" ((USItype)(w0)) \
1070 	: "r" ((USItype)(u)), \
1071 	"r" ((USItype)(v)))
1072 #define UMUL_TIME 5
1073 #ifndef SUPERSPARC		/* SuperSPARC's udiv only handles 53 bit dividends */
1074 #define udiv_qrnnd(q, r, n1, n0, d) \
1075 do { \
1076 	USItype __q; \
1077 	__asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0" \
1078 	: "=r" ((USItype)(__q)) \
1079 	: "r" ((USItype)(n1)), \
1080 	"r" ((USItype)(n0)), \
1081 	"r" ((USItype)(d))); \
1082 	(r) = (n0) - __q * (d); \
1083 	(q) = __q; \
1084 } while (0)
1085 #define UDIV_TIME 25
1086 #endif /* SUPERSPARC */
1087 #else /* ! __sparc_v8__ */
1088 #if defined(__sparclite__)
1089 /* This has hardware multiply but not divide.  It also has two additional
1090 	instructions scan (ffs from high bit) and divscc.  */
1091 #define umul_ppmm(w1, w0, u, v) \
1092 	__asm__ ("umul %2,%3,%1;rd %%y,%0" \
1093 	: "=r" ((USItype)(w1)), \
1094 	"=r" ((USItype)(w0)) \
1095 	: "r" ((USItype)(u)), \
1096 	"r" ((USItype)(v)))
1097 #define UMUL_TIME 5
1098 #define udiv_qrnnd(q, r, n1, n0, d) \
1099 	__asm__ ("! Inlined udiv_qrnnd\n" \
1100 	"wr	%%g0,%2,%%y	! Not a delayed write for sparclite\n" \
1101 	"tst	%%g0\n" \
1102 	"divscc	%3,%4,%%g1\n" \
1103 	"divscc	%%g1,%4,%%g1\n" \
1104 	"divscc	%%g1,%4,%%g1\n" \
1105 	"divscc	%%g1,%4,%%g1\n" \
1106 	"divscc	%%g1,%4,%%g1\n" \
1107 	"divscc	%%g1,%4,%%g1\n" \
1108 	"divscc	%%g1,%4,%%g1\n" \
1109 	"divscc	%%g1,%4,%%g1\n" \
1110 	"divscc	%%g1,%4,%%g1\n" \
1111 	"divscc	%%g1,%4,%%g1\n" \
1112 	"divscc	%%g1,%4,%%g1\n" \
1113 	"divscc	%%g1,%4,%%g1\n" \
1114 	"divscc	%%g1,%4,%%g1\n" \
1115 	"divscc	%%g1,%4,%%g1\n" \
1116 	"divscc	%%g1,%4,%%g1\n" \
1117 	"divscc	%%g1,%4,%%g1\n" \
1118 	"divscc	%%g1,%4,%%g1\n" \
1119 	"divscc	%%g1,%4,%%g1\n" \
1120 	"divscc	%%g1,%4,%%g1\n" \
1121 	"divscc	%%g1,%4,%%g1\n" \
1122 	"divscc	%%g1,%4,%%g1\n" \
1123 	"divscc	%%g1,%4,%%g1\n" \
1124 	"divscc	%%g1,%4,%%g1\n" \
1125 	"divscc	%%g1,%4,%%g1\n" \
1126 	"divscc	%%g1,%4,%%g1\n" \
1127 	"divscc	%%g1,%4,%%g1\n" \
1128 	"divscc	%%g1,%4,%%g1\n" \
1129 	"divscc	%%g1,%4,%%g1\n" \
1130 	"divscc	%%g1,%4,%%g1\n" \
1131 	"divscc	%%g1,%4,%%g1\n" \
1132 	"divscc	%%g1,%4,%%g1\n" \
1133 	"divscc	%%g1,%4,%0\n" \
1134 	"rd	%%y,%1\n" \
1135 	"bl,a 1f\n" \
1136 	"add	%1,%4,%1\n" \
1137 	"1:	! End of inline udiv_qrnnd" \
1138 	: "=r" ((USItype)(q)), \
1139 	"=r" ((USItype)(r)) \
1140 	: "r" ((USItype)(n1)), \
1141 	"r" ((USItype)(n0)), \
1142 	"rI" ((USItype)(d)) \
1143 	: "%g1" __AND_CLOBBER_CC)
1144 #define UDIV_TIME 37
1145 #define count_leading_zeros(count, x) \
1146 	__asm__ ("scan %1,0,%0" \
1147 	: "=r" ((USItype)(x)) \
1148 	: "r" ((USItype)(count)))
1149 /* Early sparclites return 63 for an argument of 0, but they warn that future
1150 	implementations might change this.  Therefore, leave COUNT_LEADING_ZEROS_0
1151 	undefined.  */
1152 #endif /* __sparclite__ */
1153 #endif /* __sparc_v8__ */
1154 	/* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd.  */
1155 #ifndef umul_ppmm
1156 #define umul_ppmm(w1, w0, u, v) \
1157 	__asm__ ("! Inlined umul_ppmm\n" \
1158 	"wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr\n" \
1159 	"sra	%3,31,%%g2	! Don't move this insn\n" \
1160 	"and	%2,%%g2,%%g2	! Don't move this insn\n" \
1161 	"andcc	%%g0,0,%%g1	! Don't move this insn\n" \
1162 	"mulscc	%%g1,%3,%%g1\n" \
1163 	"mulscc	%%g1,%3,%%g1\n" \
1164 	"mulscc	%%g1,%3,%%g1\n" \
1165 	"mulscc	%%g1,%3,%%g1\n" \
1166 	"mulscc	%%g1,%3,%%g1\n" \
1167 	"mulscc	%%g1,%3,%%g1\n" \
1168 	"mulscc	%%g1,%3,%%g1\n" \
1169 	"mulscc	%%g1,%3,%%g1\n" \
1170 	"mulscc	%%g1,%3,%%g1\n" \
1171 	"mulscc	%%g1,%3,%%g1\n" \
1172 	"mulscc	%%g1,%3,%%g1\n" \
1173 	"mulscc	%%g1,%3,%%g1\n" \
1174 	"mulscc	%%g1,%3,%%g1\n" \
1175 	"mulscc	%%g1,%3,%%g1\n" \
1176 	"mulscc	%%g1,%3,%%g1\n" \
1177 	"mulscc	%%g1,%3,%%g1\n" \
1178 	"mulscc	%%g1,%3,%%g1\n" \
1179 	"mulscc	%%g1,%3,%%g1\n" \
1180 	"mulscc	%%g1,%3,%%g1\n" \
1181 	"mulscc	%%g1,%3,%%g1\n" \
1182 	"mulscc	%%g1,%3,%%g1\n" \
1183 	"mulscc	%%g1,%3,%%g1\n" \
1184 	"mulscc	%%g1,%3,%%g1\n" \
1185 	"mulscc	%%g1,%3,%%g1\n" \
1186 	"mulscc	%%g1,%3,%%g1\n" \
1187 	"mulscc	%%g1,%3,%%g1\n" \
1188 	"mulscc	%%g1,%3,%%g1\n" \
1189 	"mulscc	%%g1,%3,%%g1\n" \
1190 	"mulscc	%%g1,%3,%%g1\n" \
1191 	"mulscc	%%g1,%3,%%g1\n" \
1192 	"mulscc	%%g1,%3,%%g1\n" \
1193 	"mulscc	%%g1,%3,%%g1\n" \
1194 	"mulscc	%%g1,0,%%g1\n" \
1195 	"add	%%g1,%%g2,%0\n" \
1196 	"rd	%%y,%1" \
1197 	: "=r" ((USItype)(w1)), \
1198 	"=r" ((USItype)(w0)) \
1199 	: "%rI" ((USItype)(u)), \
1200 	"r" ((USItype)(v)) \
1201 	: "%g1", "%g2" __AND_CLOBBER_CC)
1202 #define UMUL_TIME 39		/* 39 instructions */
1203 /* It's quite necessary to add this much assembler for the sparc.
1204    The default udiv_qrnnd (in C) is more than 10 times slower!  */
1205 #define udiv_qrnnd(q, r, n1, n0, d) \
1206   __asm__ ("! Inlined udiv_qrnnd\n\t"					\
1207 	   "mov	32,%%g1\n\t"						\
1208 	   "subcc	%1,%2,%%g0\n\t"					\
1209 	   "1:	bcs	5f\n\t"						\
1210 	   "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n\t"	\
1211 	   "sub	%1,%2,%1	! this kills msb of n\n\t"		\
1212 	   "addx	%1,%1,%1	! so this can't give carry\n\t"	\
1213 	   "subcc	%%g1,1,%%g1\n\t"				\
1214 	   "2:	bne	1b\n\t"						\
1215 	   "subcc	%1,%2,%%g0\n\t"					\
1216 	   "bcs	3f\n\t"							\
1217 	   "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n\t"	\
1218 	   "b		3f\n\t"						\
1219 	   "sub	%1,%2,%1	! this kills msb of n\n\t"		\
1220 	   "4:	sub	%1,%2,%1\n\t"					\
1221 	   "5:	addxcc	%1,%1,%1\n\t"					\
1222 	   "bcc	2b\n\t"							\
1223 	   "subcc	%%g1,1,%%g1\n\t"				\
1224 	   "! Got carry from n.  Subtract next step to cancel this carry.\n\t" \
1225 	   "bne	4b\n\t"							\
1226 	   "addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb\n\t" \
1227 	   "sub	%1,%2,%1\n\t"						\
1228 	   "3:	xnor	%0,0,%0\n\t"					\
1229 	   "! End of inline udiv_qrnnd\n"				\
1230 	   : "=&r" ((USItype)(q)),					\
1231 	     "=&r" ((USItype)(r))					\
1232 	   : "r" ((USItype)(d)),					\
1233 	     "1" ((USItype)(n1)),					\
1234 	     "0" ((USItype)(n0)) : "%g1", "cc")
1235 #define UDIV_TIME (3+7*32)      /* 7 instructions/iteration. 32 iterations.  */
1236 #endif
1237 #endif /* __sparc__ */
1238 
1239 /***************************************
1240 	**************  VAX  ******************
1241 	***************************************/
1242 #if defined(__vax__) && W_TYPE_SIZE == 32
1243 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1244 	__asm__ ("addl2 %5,%1\n" \
1245 	"adwc %3,%0" \
1246 	: "=g" ((USItype)(sh)), \
1247 	"=&g" ((USItype)(sl)) \
1248 	: "%0" ((USItype)(ah)), \
1249 	"g" ((USItype)(bh)), \
1250 	"%1" ((USItype)(al)), \
1251 	"g" ((USItype)(bl)))
1252 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1253 	__asm__ ("subl2 %5,%1\n" \
1254 	"sbwc %3,%0" \
1255 	: "=g" ((USItype)(sh)), \
1256 	"=&g" ((USItype)(sl)) \
1257 	: "0" ((USItype)(ah)), \
1258 	"g" ((USItype)(bh)), \
1259 	"1" ((USItype)(al)), \
1260 	"g" ((USItype)(bl)))
1261 #define umul_ppmm(xh, xl, m0, m1) \
1262 do { \
1263 	union {UDItype __ll; \
1264 	struct {USItype __l, __h; } __i; \
1265 	} __xx; \
1266 	USItype __m0 = (m0), __m1 = (m1); \
1267 	__asm__ ("emul %1,%2,$0,%0" \
1268 	: "=g" (__xx.__ll) \
1269 	: "g" (__m0), \
1270 	"g" (__m1)); \
1271 	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
1272 	(xh) += ((((SItype) __m0 >> 31) & __m1) \
1273 	+ (((SItype) __m1 >> 31) & __m0)); \
1274 } while (0)
1275 #define sdiv_qrnnd(q, r, n1, n0, d) \
1276 do { \
1277 	union {DItype __ll; \
1278 	struct {SItype __l, __h; } __i; \
1279 	} __xx; \
1280 	__xx.__i.__h = n1; __xx.__i.__l = n0; \
1281 	__asm__ ("ediv %3,%2,%0,%1" \
1282 	: "=g" (q), "=g" (r) \
1283 	: "g" (__xx.__ll), "g" (d)); \
1284 } while (0)
1285 #endif /* __vax__ */
1286 
1287 /***************************************
1288 	**************  Z8000	****************
1289 	***************************************/
1290 #if defined(__z8000__) && W_TYPE_SIZE == 16
1291 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1292 	__asm__ ("add %H1,%H5\n\tadc  %H0,%H3" \
1293 	: "=r" ((unsigned int)(sh)), \
1294 	"=&r" ((unsigned int)(sl)) \
1295 	: "%0" ((unsigned int)(ah)), \
1296 	"r" ((unsigned int)(bh)), \
1297 	"%1" ((unsigned int)(al)), \
1298 	"rQR" ((unsigned int)(bl)))
1299 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1300 	__asm__ ("sub %H1,%H5\n\tsbc  %H0,%H3" \
1301 	: "=r" ((unsigned int)(sh)), \
1302 	"=&r" ((unsigned int)(sl)) \
1303 	: "0" ((unsigned int)(ah)), \
1304 	"r" ((unsigned int)(bh)), \
1305 	"1" ((unsigned int)(al)), \
1306 	"rQR" ((unsigned int)(bl)))
1307 #define umul_ppmm(xh, xl, m0, m1) \
1308 do { \
1309 	union {long int __ll; \
1310 	struct {unsigned int __h, __l; } __i; \
1311 	} __xx; \
1312 	unsigned int __m0 = (m0), __m1 = (m1); \
1313 	__asm__ ("mult      %S0,%H3" \
1314 	: "=r" (__xx.__i.__h), \
1315 	"=r" (__xx.__i.__l) \
1316 	: "%1" (__m0), \
1317 	"rQR" (__m1)); \
1318 	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
1319 	(xh) += ((((signed int) __m0 >> 15) & __m1) \
1320 	+ (((signed int) __m1 >> 15) & __m0)); \
1321 } while (0)
1322 #endif /* __z8000__ */
1323 
1324 #endif /* __GNUC__ */
1325 
1326 /***************************************
1327 	***********  Generic Versions	********
1328 	***************************************/
1329 #if !defined(umul_ppmm) && defined(__umulsidi3)
1330 #define umul_ppmm(ph, pl, m0, m1) \
1331 { \
1332 	UDWtype __ll = __umulsidi3(m0, m1); \
1333 	ph = (UWtype) (__ll >> W_TYPE_SIZE); \
1334 	pl = (UWtype) __ll; \
1335 }
1336 #endif
1337 
1338 #if !defined(__umulsidi3)
1339 #define __umulsidi3(u, v) \
1340 	({UWtype __hi, __lo; \
1341 	umul_ppmm(__hi, __lo, u, v); \
1342 	((UDWtype) __hi << W_TYPE_SIZE) | __lo; })
1343 #endif
1344 
1345 	/* If this machine has no inline assembler, use C macros.  */
1346 
1347 #if !defined(add_ssaaaa)
1348 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1349 do { \
1350 	UWtype __x; \
1351 	__x = (al) + (bl); \
1352 	(sh) = (ah) + (bh) + (__x < (al)); \
1353 	(sl) = __x; \
1354 } while (0)
1355 #endif
1356 
1357 #if !defined(sub_ddmmss)
1358 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1359 do { \
1360 	UWtype __x; \
1361 	__x = (al) - (bl); \
1362 	(sh) = (ah) - (bh) - (__x > (al)); \
1363 	(sl) = __x; \
1364 } while (0)
1365 #endif
1366 
1367 #if !defined(umul_ppmm)
1368 #define umul_ppmm(w1, w0, u, v) \
1369 do { \
1370 	UWtype __x0, __x1, __x2, __x3; \
1371 	UHWtype __ul, __vl, __uh, __vh; \
1372 	UWtype __u = (u), __v = (v); \
1373 	\
1374 	__ul = __ll_lowpart(__u); \
1375 	__uh = __ll_highpart(__u); \
1376 	__vl = __ll_lowpart(__v); \
1377 	__vh = __ll_highpart(__v); \
1378 	\
1379 	__x0 = (UWtype) __ul * __vl; \
1380 	__x1 = (UWtype) __ul * __vh; \
1381 	__x2 = (UWtype) __uh * __vl; \
1382 	__x3 = (UWtype) __uh * __vh; \
1383 	\
1384 	__x1 += __ll_highpart(__x0);/* this can't give carry */ \
1385 	__x1 += __x2;		/* but this indeed can */ \
1386 	if (__x1 < __x2)		/* did we get it? */ \
1387 	__x3 += __ll_B;		/* yes, add it in the proper pos. */ \
1388 	\
1389 	(w1) = __x3 + __ll_highpart(__x1); \
1390 	(w0) = (__ll_lowpart(__x1) << W_TYPE_SIZE/2) + __ll_lowpart(__x0); \
1391 } while (0)
1392 #endif
1393 
1394 #if !defined(umul_ppmm)
1395 #define smul_ppmm(w1, w0, u, v) \
1396 do { \
1397 	UWtype __w1; \
1398 	UWtype __m0 = (u), __m1 = (v); \
1399 	umul_ppmm(__w1, w0, __m0, __m1); \
1400 	(w1) = __w1 - (-(__m0 >> (W_TYPE_SIZE - 1)) & __m1) \
1401 	- (-(__m1 >> (W_TYPE_SIZE - 1)) & __m0); \
1402 } while (0)
1403 #endif
1404 
1405 	/* Define this unconditionally, so it can be used for debugging.  */
1406 #define __udiv_qrnnd_c(q, r, n1, n0, d) \
1407 do { \
1408 	UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \
1409 	__d1 = __ll_highpart(d); \
1410 	__d0 = __ll_lowpart(d); \
1411 	\
1412 	__r1 = (n1) % __d1; \
1413 	__q1 = (n1) / __d1; \
1414 	__m = (UWtype) __q1 * __d0; \
1415 	__r1 = __r1 * __ll_B | __ll_highpart(n0); \
1416 	if (__r1 < __m) { \
1417 		__q1--, __r1 += (d); \
1418 		if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */ \
1419 		if (__r1 < __m) \
1420 			__q1--, __r1 += (d); \
1421 	} \
1422 	__r1 -= __m; \
1423 	\
1424 	__r0 = __r1 % __d1; \
1425 	__q0 = __r1 / __d1; \
1426 	__m = (UWtype) __q0 * __d0; \
1427 	__r0 = __r0 * __ll_B | __ll_lowpart(n0); \
1428 	if (__r0 < __m) { \
1429 		__q0--, __r0 += (d); \
1430 		if (__r0 >= (d)) \
1431 			if (__r0 < __m) \
1432 				__q0--, __r0 += (d); \
1433 	} \
1434 	__r0 -= __m; \
1435 	\
1436 	(q) = (UWtype) __q1 * __ll_B | __q0; \
1437 	(r) = __r0; \
1438 } while (0)
1439 
1440 /* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
1441 	__udiv_w_sdiv (defined in libgcc or elsewhere).  */
1442 #if !defined(udiv_qrnnd) && defined(sdiv_qrnnd)
1443 #define udiv_qrnnd(q, r, nh, nl, d) \
1444 do { \
1445 	UWtype __r; \
1446 	(q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d); \
1447 	(r) = __r; \
1448 } while (0)
1449 #endif
1450 
1451 	/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c.  */
1452 #if !defined(udiv_qrnnd)
1453 #define UDIV_NEEDS_NORMALIZATION 1
1454 #define udiv_qrnnd __udiv_qrnnd_c
1455 #endif
1456 
1457 #undef count_leading_zeros
1458 #if !defined(count_leading_zeros)
1459 	extern
1460 #ifdef __STDC__
1461 			const
1462 #endif
1463 			unsigned char __clz_tab[];
1464 #define count_leading_zeros(count, x) \
1465 do { \
1466 	UWtype __xr = (x); \
1467 	UWtype __a; \
1468 	\
1469 	if (W_TYPE_SIZE <= 32) { \
1470 		__a = __xr < ((UWtype) 1 << 2*__BITS4) \
1471 		? (__xr < ((UWtype) 1 << __BITS4) ? 0 : __BITS4) \
1472 		: (__xr < ((UWtype) 1 << 3*__BITS4) ?  2*__BITS4 : 3*__BITS4); \
1473 	} \
1474 	else { \
1475 		for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \
1476 			if (((__xr >> __a) & 0xff) != 0) \
1477 				break; \
1478 	} \
1479 	\
1480 	(count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
1481 } while (0)
1482 	/* This version gives a well-defined value for zero. */
1483 #define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
1484 #endif
1485 
1486 #if !defined(count_trailing_zeros)
1487 /* Define count_trailing_zeros using count_leading_zeros.  The latter might be
1488 	defined in asm, but if it is not, the C version above is good enough.  */
1489 #define count_trailing_zeros(count, x) \
1490 do { \
1491 	UWtype __ctz_x = (x); \
1492 	UWtype __ctz_c; \
1493 	count_leading_zeros(__ctz_c, __ctz_x & -__ctz_x); \
1494 	(count) = W_TYPE_SIZE - 1 - __ctz_c; \
1495 } while (0)
1496 #endif
1497 
1498 #ifndef UDIV_NEEDS_NORMALIZATION
1499 #define UDIV_NEEDS_NORMALIZATION 0
1500 #endif
1501