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