PR middle-end/20297
[official-gcc.git] / gcc / libgcc2.c
blob97717a428c92740b3bbc644e6c612bea4481bd60
1 /* More subroutines needed by GCC output code on some machines. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
20 executable.)
22 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
23 WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 for more details.
27 You should have received a copy of the GNU General Public License
28 along with GCC; see the file COPYING. If not, write to the Free
29 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
30 02110-1301, USA. */
32 #include "tconfig.h"
33 #include "tsystem.h"
34 #include "coretypes.h"
35 #include "tm.h"
37 #ifdef HAVE_GAS_HIDDEN
38 #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
39 #else
40 #define ATTRIBUTE_HIDDEN
41 #endif
43 #include "libgcc2.h"
45 #ifdef DECLARE_LIBRARY_RENAMES
46 DECLARE_LIBRARY_RENAMES
47 #endif
49 #if defined (L_negdi2)
50 DWtype
51 __negdi2 (DWtype u)
53 const DWunion uu = {.ll = u};
54 const DWunion w = { {.low = -uu.s.low,
55 .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
57 return w.ll;
59 #endif
61 #ifdef L_addvsi3
62 Wtype
63 __addvSI3 (Wtype a, Wtype b)
65 const Wtype w = a + b;
67 if (b >= 0 ? w < a : w > a)
68 abort ();
70 return w;
72 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
73 SItype
74 __addvsi3 (SItype a, SItype b)
76 const SItype w = a + b;
78 if (b >= 0 ? w < a : w > a)
79 abort ();
81 return w;
83 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
84 #endif
86 #ifdef L_addvdi3
87 DWtype
88 __addvDI3 (DWtype a, DWtype b)
90 const DWtype w = a + b;
92 if (b >= 0 ? w < a : w > a)
93 abort ();
95 return w;
97 #endif
99 #ifdef L_subvsi3
100 Wtype
101 __subvSI3 (Wtype a, Wtype b)
103 const Wtype w = a - b;
105 if (b >= 0 ? w > a : w < a)
106 abort ();
108 return w;
110 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
111 SItype
112 __subvsi3 (SItype a, SItype b)
114 const SItype w = a - b;
116 if (b >= 0 ? w > a : w < a)
117 abort ();
119 return w;
121 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
122 #endif
124 #ifdef L_subvdi3
125 DWtype
126 __subvDI3 (DWtype a, DWtype b)
128 const DWtype w = a - b;
130 if (b >= 0 ? w > a : w < a)
131 abort ();
133 return w;
135 #endif
137 #ifdef L_mulvsi3
138 Wtype
139 __mulvSI3 (Wtype a, Wtype b)
141 const DWtype w = (DWtype) a * (DWtype) b;
143 if ((Wtype) (w >> W_TYPE_SIZE) != (Wtype) w >> (W_TYPE_SIZE - 1))
144 abort ();
146 return w;
148 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
149 #undef WORD_SIZE
150 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
151 SItype
152 __mulvsi3 (SItype a, SItype b)
154 const DItype w = (DItype) a * (DItype) b;
156 if ((SItype) (w >> WORD_SIZE) != (SItype) w >> (WORD_SIZE-1))
157 abort ();
159 return w;
161 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
162 #endif
164 #ifdef L_negvsi2
165 Wtype
166 __negvSI2 (Wtype a)
168 const Wtype w = -a;
170 if (a >= 0 ? w > 0 : w < 0)
171 abort ();
173 return w;
175 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
176 SItype
177 __negvsi2 (SItype a)
179 const SItype w = -a;
181 if (a >= 0 ? w > 0 : w < 0)
182 abort ();
184 return w;
186 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
187 #endif
189 #ifdef L_negvdi2
190 DWtype
191 __negvDI2 (DWtype a)
193 const DWtype w = -a;
195 if (a >= 0 ? w > 0 : w < 0)
196 abort ();
198 return w;
200 #endif
202 #ifdef L_absvsi2
203 Wtype
204 __absvSI2 (Wtype a)
206 Wtype w = a;
208 if (a < 0)
209 #ifdef L_negvsi2
210 w = __negvSI2 (a);
211 #else
212 w = -a;
214 if (w < 0)
215 abort ();
216 #endif
218 return w;
220 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
221 SItype
222 __absvsi2 (SItype a)
224 SItype w = a;
226 if (a < 0)
227 #ifdef L_negvsi2
228 w = __negvsi2 (a);
229 #else
230 w = -a;
232 if (w < 0)
233 abort ();
234 #endif
236 return w;
238 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
239 #endif
241 #ifdef L_absvdi2
242 DWtype
243 __absvDI2 (DWtype a)
245 DWtype w = a;
247 if (a < 0)
248 #ifdef L_negvdi2
249 w = __negvDI2 (a);
250 #else
251 w = -a;
253 if (w < 0)
254 abort ();
255 #endif
257 return w;
259 #endif
261 #ifdef L_mulvdi3
262 DWtype
263 __mulvDI3 (DWtype u, DWtype v)
265 /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
266 but the checked multiplication needs only two. */
267 const DWunion uu = {.ll = u};
268 const DWunion vv = {.ll = v};
270 if (__builtin_expect (uu.s.high == uu.s.low >> (W_TYPE_SIZE - 1), 1))
272 /* u fits in a single Wtype. */
273 if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
275 /* v fits in a single Wtype as well. */
276 /* A single multiplication. No overflow risk. */
277 return (DWtype) uu.s.low * (DWtype) vv.s.low;
279 else
281 /* Two multiplications. */
282 DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
283 * (UDWtype) (UWtype) vv.s.low};
284 DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.low
285 * (UDWtype) (UWtype) vv.s.high};
287 if (vv.s.high < 0)
288 w1.s.high -= uu.s.low;
289 if (uu.s.low < 0)
290 w1.ll -= vv.ll;
291 w1.ll += (UWtype) w0.s.high;
292 if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
294 w0.s.high = w1.s.low;
295 return w0.ll;
299 else
301 if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
303 /* v fits into a single Wtype. */
304 /* Two multiplications. */
305 DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
306 * (UDWtype) (UWtype) vv.s.low};
307 DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.high
308 * (UDWtype) (UWtype) vv.s.low};
310 if (uu.s.high < 0)
311 w1.s.high -= vv.s.low;
312 if (vv.s.low < 0)
313 w1.ll -= uu.ll;
314 w1.ll += (UWtype) w0.s.high;
315 if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
317 w0.s.high = w1.s.low;
318 return w0.ll;
321 else
323 /* A few sign checks and a single multiplication. */
324 if (uu.s.high >= 0)
326 if (vv.s.high >= 0)
328 if (uu.s.high == 0 && vv.s.high == 0)
330 const DWtype w = (UDWtype) (UWtype) uu.s.low
331 * (UDWtype) (UWtype) vv.s.low;
332 if (__builtin_expect (w >= 0, 1))
333 return w;
336 else
338 if (uu.s.high == 0 && vv.s.high == (Wtype) -1)
340 DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
341 * (UDWtype) (UWtype) vv.s.low};
343 ww.s.high -= uu.s.low;
344 if (__builtin_expect (ww.s.high < 0, 1))
345 return ww.ll;
349 else
351 if (vv.s.high >= 0)
353 if (uu.s.high == (Wtype) -1 && vv.s.high == 0)
355 DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
356 * (UDWtype) (UWtype) vv.s.low};
358 ww.s.high -= vv.s.low;
359 if (__builtin_expect (ww.s.high < 0, 1))
360 return ww.ll;
363 else
365 if (uu.s.high == (Wtype) -1 && vv.s.high == (Wtype) - 1)
367 DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
368 * (UDWtype) (UWtype) vv.s.low};
370 ww.s.high -= uu.s.low;
371 ww.s.high -= vv.s.low;
372 if (__builtin_expect (ww.s.high >= 0, 1))
373 return ww.ll;
380 /* Overflow. */
381 abort ();
383 #endif
386 /* Unless shift functions are defined with full ANSI prototypes,
387 parameter b will be promoted to int if word_type is smaller than an int. */
388 #ifdef L_lshrdi3
389 DWtype
390 __lshrdi3 (DWtype u, word_type b)
392 if (b == 0)
393 return u;
395 const DWunion uu = {.ll = u};
396 const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
397 DWunion w;
399 if (bm <= 0)
401 w.s.high = 0;
402 w.s.low = (UWtype) uu.s.high >> -bm;
404 else
406 const UWtype carries = (UWtype) uu.s.high << bm;
408 w.s.high = (UWtype) uu.s.high >> b;
409 w.s.low = ((UWtype) uu.s.low >> b) | carries;
412 return w.ll;
414 #endif
416 #ifdef L_ashldi3
417 DWtype
418 __ashldi3 (DWtype u, word_type b)
420 if (b == 0)
421 return u;
423 const DWunion uu = {.ll = u};
424 const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
425 DWunion w;
427 if (bm <= 0)
429 w.s.low = 0;
430 w.s.high = (UWtype) uu.s.low << -bm;
432 else
434 const UWtype carries = (UWtype) uu.s.low >> bm;
436 w.s.low = (UWtype) uu.s.low << b;
437 w.s.high = ((UWtype) uu.s.high << b) | carries;
440 return w.ll;
442 #endif
444 #ifdef L_ashrdi3
445 DWtype
446 __ashrdi3 (DWtype u, word_type b)
448 if (b == 0)
449 return u;
451 const DWunion uu = {.ll = u};
452 const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
453 DWunion w;
455 if (bm <= 0)
457 /* w.s.high = 1..1 or 0..0 */
458 w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
459 w.s.low = uu.s.high >> -bm;
461 else
463 const UWtype carries = (UWtype) uu.s.high << bm;
465 w.s.high = uu.s.high >> b;
466 w.s.low = ((UWtype) uu.s.low >> b) | carries;
469 return w.ll;
471 #endif
473 #ifdef L_ffssi2
474 #undef int
476 __ffsSI2 (UWtype u)
478 UWtype count;
480 if (u == 0)
481 return 0;
483 count_trailing_zeros (count, u);
484 return count + 1;
486 #endif
488 #ifdef L_ffsdi2
489 #undef int
491 __ffsDI2 (DWtype u)
493 const DWunion uu = {.ll = u};
494 UWtype word, count, add;
496 if (uu.s.low != 0)
497 word = uu.s.low, add = 0;
498 else if (uu.s.high != 0)
499 word = uu.s.high, add = BITS_PER_UNIT * sizeof (Wtype);
500 else
501 return 0;
503 count_trailing_zeros (count, word);
504 return count + add + 1;
506 #endif
508 #ifdef L_muldi3
509 DWtype
510 __muldi3 (DWtype u, DWtype v)
512 const DWunion uu = {.ll = u};
513 const DWunion vv = {.ll = v};
514 DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
516 w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
517 + (UWtype) uu.s.high * (UWtype) vv.s.low);
519 return w.ll;
521 #endif
523 #if (defined (L_udivdi3) || defined (L_divdi3) || \
524 defined (L_umoddi3) || defined (L_moddi3))
525 #if defined (sdiv_qrnnd)
526 #define L_udiv_w_sdiv
527 #endif
528 #endif
530 #ifdef L_udiv_w_sdiv
531 #if defined (sdiv_qrnnd)
532 #if (defined (L_udivdi3) || defined (L_divdi3) || \
533 defined (L_umoddi3) || defined (L_moddi3))
534 static inline __attribute__ ((__always_inline__))
535 #endif
536 UWtype
537 __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
539 UWtype q, r;
540 UWtype c0, c1, b1;
542 if ((Wtype) d >= 0)
544 if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
546 /* Dividend, divisor, and quotient are nonnegative. */
547 sdiv_qrnnd (q, r, a1, a0, d);
549 else
551 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d. */
552 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
553 /* Divide (c1*2^32 + c0) by d. */
554 sdiv_qrnnd (q, r, c1, c0, d);
555 /* Add 2^31 to quotient. */
556 q += (UWtype) 1 << (W_TYPE_SIZE - 1);
559 else
561 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
562 c1 = a1 >> 1; /* A/2 */
563 c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
565 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
567 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
569 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
570 if ((d & 1) != 0)
572 if (r >= q)
573 r = r - q;
574 else if (q - r <= d)
576 r = r - q + d;
577 q--;
579 else
581 r = r - q + 2*d;
582 q -= 2;
586 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
588 c1 = (b1 - 1) - c1;
589 c0 = ~c0; /* logical NOT */
591 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
593 q = ~q; /* (A/2)/b1 */
594 r = (b1 - 1) - r;
596 r = 2*r + (a0 & 1); /* A/(2*b1) */
598 if ((d & 1) != 0)
600 if (r >= q)
601 r = r - q;
602 else if (q - r <= d)
604 r = r - q + d;
605 q--;
607 else
609 r = r - q + 2*d;
610 q -= 2;
614 else /* Implies c1 = b1 */
615 { /* Hence a1 = d - 1 = 2*b1 - 1 */
616 if (a0 >= -d)
618 q = -1;
619 r = a0 + d;
621 else
623 q = -2;
624 r = a0 + 2*d;
629 *rp = r;
630 return q;
632 #else
633 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
634 UWtype
635 __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
636 UWtype a1 __attribute__ ((__unused__)),
637 UWtype a0 __attribute__ ((__unused__)),
638 UWtype d __attribute__ ((__unused__)))
640 return 0;
642 #endif
643 #endif
645 #if (defined (L_udivdi3) || defined (L_divdi3) || \
646 defined (L_umoddi3) || defined (L_moddi3))
647 #define L_udivmoddi4
648 #endif
650 #ifdef L_clz
651 const UQItype __clz_tab[256] =
653 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
654 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
655 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
656 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
657 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
658 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
659 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
660 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
662 #endif
664 #ifdef L_clzsi2
665 #undef int
667 __clzSI2 (UWtype x)
669 Wtype ret;
671 count_leading_zeros (ret, x);
673 return ret;
675 #endif
677 #ifdef L_clzdi2
678 #undef int
680 __clzDI2 (UDWtype x)
682 const DWunion uu = {.ll = x};
683 UWtype word;
684 Wtype ret, add;
686 if (uu.s.high)
687 word = uu.s.high, add = 0;
688 else
689 word = uu.s.low, add = W_TYPE_SIZE;
691 count_leading_zeros (ret, word);
692 return ret + add;
694 #endif
696 #ifdef L_ctzsi2
697 #undef int
699 __ctzSI2 (UWtype x)
701 Wtype ret;
703 count_trailing_zeros (ret, x);
705 return ret;
707 #endif
709 #ifdef L_ctzdi2
710 #undef int
712 __ctzDI2 (UDWtype x)
714 const DWunion uu = {.ll = x};
715 UWtype word;
716 Wtype ret, add;
718 if (uu.s.low)
719 word = uu.s.low, add = 0;
720 else
721 word = uu.s.high, add = W_TYPE_SIZE;
723 count_trailing_zeros (ret, word);
724 return ret + add;
726 #endif
728 #ifdef L_popcount_tab
729 const UQItype __popcount_tab[256] =
731 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
732 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
733 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
734 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
735 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
736 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
737 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
738 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
740 #endif
742 #ifdef L_popcountsi2
743 #undef int
745 __popcountSI2 (UWtype x)
747 int i, ret = 0;
749 for (i = 0; i < W_TYPE_SIZE; i += 8)
750 ret += __popcount_tab[(x >> i) & 0xff];
752 return ret;
754 #endif
756 #ifdef L_popcountdi2
757 #undef int
759 __popcountDI2 (UDWtype x)
761 int i, ret = 0;
763 for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
764 ret += __popcount_tab[(x >> i) & 0xff];
766 return ret;
768 #endif
770 #ifdef L_paritysi2
771 #undef int
773 __paritySI2 (UWtype x)
775 #if W_TYPE_SIZE > 64
776 # error "fill out the table"
777 #endif
778 #if W_TYPE_SIZE > 32
779 x ^= x >> 32;
780 #endif
781 #if W_TYPE_SIZE > 16
782 x ^= x >> 16;
783 #endif
784 x ^= x >> 8;
785 x ^= x >> 4;
786 x &= 0xf;
787 return (0x6996 >> x) & 1;
789 #endif
791 #ifdef L_paritydi2
792 #undef int
794 __parityDI2 (UDWtype x)
796 const DWunion uu = {.ll = x};
797 UWtype nx = uu.s.low ^ uu.s.high;
799 #if W_TYPE_SIZE > 64
800 # error "fill out the table"
801 #endif
802 #if W_TYPE_SIZE > 32
803 nx ^= nx >> 32;
804 #endif
805 #if W_TYPE_SIZE > 16
806 nx ^= nx >> 16;
807 #endif
808 nx ^= nx >> 8;
809 nx ^= nx >> 4;
810 nx &= 0xf;
811 return (0x6996 >> nx) & 1;
813 #endif
815 #ifdef L_udivmoddi4
817 #if (defined (L_udivdi3) || defined (L_divdi3) || \
818 defined (L_umoddi3) || defined (L_moddi3))
819 static inline __attribute__ ((__always_inline__))
820 #endif
821 UDWtype
822 __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
824 const DWunion nn = {.ll = n};
825 const DWunion dd = {.ll = d};
826 DWunion rr;
827 UWtype d0, d1, n0, n1, n2;
828 UWtype q0, q1;
829 UWtype b, bm;
831 d0 = dd.s.low;
832 d1 = dd.s.high;
833 n0 = nn.s.low;
834 n1 = nn.s.high;
836 #if !UDIV_NEEDS_NORMALIZATION
837 if (d1 == 0)
839 if (d0 > n1)
841 /* 0q = nn / 0D */
843 udiv_qrnnd (q0, n0, n1, n0, d0);
844 q1 = 0;
846 /* Remainder in n0. */
848 else
850 /* qq = NN / 0d */
852 if (d0 == 0)
853 d0 = 1 / d0; /* Divide intentionally by zero. */
855 udiv_qrnnd (q1, n1, 0, n1, d0);
856 udiv_qrnnd (q0, n0, n1, n0, d0);
858 /* Remainder in n0. */
861 if (rp != 0)
863 rr.s.low = n0;
864 rr.s.high = 0;
865 *rp = rr.ll;
869 #else /* UDIV_NEEDS_NORMALIZATION */
871 if (d1 == 0)
873 if (d0 > n1)
875 /* 0q = nn / 0D */
877 count_leading_zeros (bm, d0);
879 if (bm != 0)
881 /* Normalize, i.e. make the most significant bit of the
882 denominator set. */
884 d0 = d0 << bm;
885 n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
886 n0 = n0 << bm;
889 udiv_qrnnd (q0, n0, n1, n0, d0);
890 q1 = 0;
892 /* Remainder in n0 >> bm. */
894 else
896 /* qq = NN / 0d */
898 if (d0 == 0)
899 d0 = 1 / d0; /* Divide intentionally by zero. */
901 count_leading_zeros (bm, d0);
903 if (bm == 0)
905 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
906 conclude (the most significant bit of n1 is set) /\ (the
907 leading quotient digit q1 = 1).
909 This special case is necessary, not an optimization.
910 (Shifts counts of W_TYPE_SIZE are undefined.) */
912 n1 -= d0;
913 q1 = 1;
915 else
917 /* Normalize. */
919 b = W_TYPE_SIZE - bm;
921 d0 = d0 << bm;
922 n2 = n1 >> b;
923 n1 = (n1 << bm) | (n0 >> b);
924 n0 = n0 << bm;
926 udiv_qrnnd (q1, n1, n2, n1, d0);
929 /* n1 != d0... */
931 udiv_qrnnd (q0, n0, n1, n0, d0);
933 /* Remainder in n0 >> bm. */
936 if (rp != 0)
938 rr.s.low = n0 >> bm;
939 rr.s.high = 0;
940 *rp = rr.ll;
943 #endif /* UDIV_NEEDS_NORMALIZATION */
945 else
947 if (d1 > n1)
949 /* 00 = nn / DD */
951 q0 = 0;
952 q1 = 0;
954 /* Remainder in n1n0. */
955 if (rp != 0)
957 rr.s.low = n0;
958 rr.s.high = n1;
959 *rp = rr.ll;
962 else
964 /* 0q = NN / dd */
966 count_leading_zeros (bm, d1);
967 if (bm == 0)
969 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
970 conclude (the most significant bit of n1 is set) /\ (the
971 quotient digit q0 = 0 or 1).
973 This special case is necessary, not an optimization. */
975 /* The condition on the next line takes advantage of that
976 n1 >= d1 (true due to program flow). */
977 if (n1 > d1 || n0 >= d0)
979 q0 = 1;
980 sub_ddmmss (n1, n0, n1, n0, d1, d0);
982 else
983 q0 = 0;
985 q1 = 0;
987 if (rp != 0)
989 rr.s.low = n0;
990 rr.s.high = n1;
991 *rp = rr.ll;
994 else
996 UWtype m1, m0;
997 /* Normalize. */
999 b = W_TYPE_SIZE - bm;
1001 d1 = (d1 << bm) | (d0 >> b);
1002 d0 = d0 << bm;
1003 n2 = n1 >> b;
1004 n1 = (n1 << bm) | (n0 >> b);
1005 n0 = n0 << bm;
1007 udiv_qrnnd (q0, n1, n2, n1, d1);
1008 umul_ppmm (m1, m0, q0, d0);
1010 if (m1 > n1 || (m1 == n1 && m0 > n0))
1012 q0--;
1013 sub_ddmmss (m1, m0, m1, m0, d1, d0);
1016 q1 = 0;
1018 /* Remainder in (n1n0 - m1m0) >> bm. */
1019 if (rp != 0)
1021 sub_ddmmss (n1, n0, n1, n0, m1, m0);
1022 rr.s.low = (n1 << b) | (n0 >> bm);
1023 rr.s.high = n1 >> bm;
1024 *rp = rr.ll;
1030 const DWunion ww = {{.low = q0, .high = q1}};
1031 return ww.ll;
1033 #endif
1035 #ifdef L_divdi3
1036 DWtype
1037 __divdi3 (DWtype u, DWtype v)
1039 word_type c = 0;
1040 DWunion uu = {.ll = u};
1041 DWunion vv = {.ll = v};
1042 DWtype w;
1044 if (uu.s.high < 0)
1045 c = ~c,
1046 uu.ll = -uu.ll;
1047 if (vv.s.high < 0)
1048 c = ~c,
1049 vv.ll = -vv.ll;
1051 w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
1052 if (c)
1053 w = -w;
1055 return w;
1057 #endif
1059 #ifdef L_moddi3
1060 DWtype
1061 __moddi3 (DWtype u, DWtype v)
1063 word_type c = 0;
1064 DWunion uu = {.ll = u};
1065 DWunion vv = {.ll = v};
1066 DWtype w;
1068 if (uu.s.high < 0)
1069 c = ~c,
1070 uu.ll = -uu.ll;
1071 if (vv.s.high < 0)
1072 vv.ll = -vv.ll;
1074 (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w);
1075 if (c)
1076 w = -w;
1078 return w;
1080 #endif
1082 #ifdef L_umoddi3
1083 UDWtype
1084 __umoddi3 (UDWtype u, UDWtype v)
1086 UDWtype w;
1088 (void) __udivmoddi4 (u, v, &w);
1090 return w;
1092 #endif
1094 #ifdef L_udivdi3
1095 UDWtype
1096 __udivdi3 (UDWtype n, UDWtype d)
1098 return __udivmoddi4 (n, d, (UDWtype *) 0);
1100 #endif
1102 #ifdef L_cmpdi2
1103 word_type
1104 __cmpdi2 (DWtype a, DWtype b)
1106 const DWunion au = {.ll = a};
1107 const DWunion bu = {.ll = b};
1109 if (au.s.high < bu.s.high)
1110 return 0;
1111 else if (au.s.high > bu.s.high)
1112 return 2;
1113 if ((UWtype) au.s.low < (UWtype) bu.s.low)
1114 return 0;
1115 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1116 return 2;
1117 return 1;
1119 #endif
1121 #ifdef L_ucmpdi2
1122 word_type
1123 __ucmpdi2 (DWtype a, DWtype b)
1125 const DWunion au = {.ll = a};
1126 const DWunion bu = {.ll = b};
1128 if ((UWtype) au.s.high < (UWtype) bu.s.high)
1129 return 0;
1130 else if ((UWtype) au.s.high > (UWtype) bu.s.high)
1131 return 2;
1132 if ((UWtype) au.s.low < (UWtype) bu.s.low)
1133 return 0;
1134 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1135 return 2;
1136 return 1;
1138 #endif
1140 #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
1141 DWtype
1142 __fixunstfDI (TFtype a)
1144 if (a < 0)
1145 return 0;
1147 /* Compute high word of result, as a flonum. */
1148 const TFtype b = (a / Wtype_MAXp1_F);
1149 /* Convert that to fixed (but not to DWtype!),
1150 and shift it into the high word. */
1151 UDWtype v = (UWtype) b;
1152 v <<= W_TYPE_SIZE;
1153 /* Remove high part from the TFtype, leaving the low part as flonum. */
1154 a -= (TFtype)v;
1155 /* Convert that to fixed (but not to DWtype!) and add it in.
1156 Sometimes A comes out negative. This is significant, since
1157 A has more bits than a long int does. */
1158 if (a < 0)
1159 v -= (UWtype) (- a);
1160 else
1161 v += (UWtype) a;
1162 return v;
1164 #endif
1166 #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
1167 DWtype
1168 __fixtfdi (TFtype a)
1170 if (a < 0)
1171 return - __fixunstfDI (-a);
1172 return __fixunstfDI (a);
1174 #endif
1176 #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
1177 DWtype
1178 __fixunsxfDI (XFtype a)
1180 if (a < 0)
1181 return 0;
1183 /* Compute high word of result, as a flonum. */
1184 const XFtype b = (a / Wtype_MAXp1_F);
1185 /* Convert that to fixed (but not to DWtype!),
1186 and shift it into the high word. */
1187 UDWtype v = (UWtype) b;
1188 v <<= W_TYPE_SIZE;
1189 /* Remove high part from the XFtype, leaving the low part as flonum. */
1190 a -= (XFtype)v;
1191 /* Convert that to fixed (but not to DWtype!) and add it in.
1192 Sometimes A comes out negative. This is significant, since
1193 A has more bits than a long int does. */
1194 if (a < 0)
1195 v -= (UWtype) (- a);
1196 else
1197 v += (UWtype) a;
1198 return v;
1200 #endif
1202 #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
1203 DWtype
1204 __fixxfdi (XFtype a)
1206 if (a < 0)
1207 return - __fixunsxfDI (-a);
1208 return __fixunsxfDI (a);
1210 #endif
1212 #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
1213 DWtype
1214 __fixunsdfDI (DFtype a)
1216 /* Get high part of result. The division here will just moves the radix
1217 point and will not cause any rounding. Then the conversion to integral
1218 type chops result as desired. */
1219 const UWtype hi = a / Wtype_MAXp1_F;
1221 /* Get low part of result. Convert `hi' to floating type and scale it back,
1222 then subtract this from the number being converted. This leaves the low
1223 part. Convert that to integral type. */
1224 const UWtype lo = a - (DFtype) hi * Wtype_MAXp1_F;
1226 /* Assemble result from the two parts. */
1227 return ((UDWtype) hi << W_TYPE_SIZE) | lo;
1229 #endif
1231 #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
1232 DWtype
1233 __fixdfdi (DFtype a)
1235 if (a < 0)
1236 return - __fixunsdfDI (-a);
1237 return __fixunsdfDI (a);
1239 #endif
1241 #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE
1242 DWtype
1243 __fixunssfDI (SFtype a)
1245 #if LIBGCC2_HAS_DF_MODE
1246 /* Convert the SFtype to a DFtype, because that is surely not going
1247 to lose any bits. Some day someone else can write a faster version
1248 that avoids converting to DFtype, and verify it really works right. */
1249 const DFtype dfa = a;
1251 /* Get high part of result. The division here will just moves the radix
1252 point and will not cause any rounding. Then the conversion to integral
1253 type chops result as desired. */
1254 const UWtype hi = dfa / Wtype_MAXp1_F;
1256 /* Get low part of result. Convert `hi' to floating type and scale it back,
1257 then subtract this from the number being converted. This leaves the low
1258 part. Convert that to integral type. */
1259 const UWtype lo = dfa - (DFtype) hi * Wtype_MAXp1_F;
1261 /* Assemble result from the two parts. */
1262 return ((UDWtype) hi << W_TYPE_SIZE) | lo;
1263 #elif FLT_MANT_DIG < W_TYPE_SIZE
1264 if (a < 1)
1265 return 0;
1266 if (a < Wtype_MAXp1_F)
1267 return (UWtype)a;
1268 if (a < Wtype_MAXp1_F * Wtype_MAXp1_F)
1270 /* Since we know that there are fewer significant bits in the SFmode
1271 quantity than in a word, we know that we can convert out all the
1272 significant bits in one step, and thus avoid losing bits. */
1274 /* ??? This following loop essentially performs frexpf. If we could
1275 use the real libm function, or poke at the actual bits of the fp
1276 format, it would be significantly faster. */
1278 UWtype shift = 0, counter;
1279 SFtype msb;
1281 a /= Wtype_MAXp1_F;
1282 for (counter = W_TYPE_SIZE / 2; counter != 0; counter >>= 1)
1284 SFtype counterf = (UWtype)1 << counter;
1285 if (a >= counterf)
1287 shift |= counter;
1288 a /= counterf;
1292 /* Rescale into the range of one word, extract the bits of that
1293 one word, and shift the result into position. */
1294 a *= Wtype_MAXp1_F;
1295 counter = a;
1296 return (DWtype)counter << shift;
1298 return -1;
1299 #else
1300 # error
1301 #endif
1303 #endif
1305 #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE
1306 DWtype
1307 __fixsfdi (SFtype a)
1309 if (a < 0)
1310 return - __fixunssfDI (-a);
1311 return __fixunssfDI (a);
1313 #endif
1315 #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
1316 XFtype
1317 __floatdixf (DWtype u)
1319 #if W_TYPE_SIZE > XF_SIZE
1320 # error
1321 #endif
1322 XFtype d = (Wtype) (u >> W_TYPE_SIZE);
1323 d *= Wtype_MAXp1_F;
1324 d += (UWtype)u;
1325 return d;
1327 #endif
1329 #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE
1330 XFtype
1331 __floatundixf (UDWtype u)
1333 #if W_TYPE_SIZE > XF_SIZE
1334 # error
1335 #endif
1336 XFtype d = (UWtype) (u >> W_TYPE_SIZE);
1337 d *= Wtype_MAXp1_F;
1338 d += (UWtype)u;
1339 return d;
1341 #endif
1343 #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
1344 TFtype
1345 __floatditf (DWtype u)
1347 #if W_TYPE_SIZE > TF_SIZE
1348 # error
1349 #endif
1350 TFtype d = (Wtype) (u >> W_TYPE_SIZE);
1351 d *= Wtype_MAXp1_F;
1352 d += (UWtype)u;
1353 return d;
1355 #endif
1357 #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE
1358 TFtype
1359 __floatunditf (UDWtype u)
1361 #if W_TYPE_SIZE > TF_SIZE
1362 # error
1363 #endif
1364 TFtype d = (UWtype) (u >> W_TYPE_SIZE);
1365 d *= Wtype_MAXp1_F;
1366 d += (UWtype)u;
1367 return d;
1369 #endif
1371 #if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE) \
1372 || (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE)
1373 #define DI_SIZE (W_TYPE_SIZE * 2)
1374 #define F_MODE_OK(SIZE) \
1375 (SIZE < DI_SIZE \
1376 && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1377 /* Don't use IBM Extended Double TFmode for TI->SF calculations. \
1378 The conversion from long double to float suffers from double \
1379 rounding, because we convert via double. In any case, the \
1380 fallback code is faster. */ \
1381 && !IS_IBM_EXTENDED (SIZE))
1382 #if defined(L_floatdisf)
1383 #define FUNC __floatdisf
1384 #define FSTYPE SFtype
1385 #define FSSIZE SF_SIZE
1386 #else
1387 #define FUNC __floatdidf
1388 #define FSTYPE DFtype
1389 #define FSSIZE DF_SIZE
1390 #endif
1392 FSTYPE
1393 FUNC (DWtype u)
1395 #if FSSIZE >= W_TYPE_SIZE
1396 /* When the word size is small, we never get any rounding error. */
1397 FSTYPE f = (Wtype) (u >> W_TYPE_SIZE);
1398 f *= Wtype_MAXp1_F;
1399 f += (UWtype)u;
1400 return f;
1401 #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (DF_SIZE)) \
1402 || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (XF_SIZE)) \
1403 || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (TF_SIZE))
1405 #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (DF_SIZE))
1406 # define FSIZE DF_SIZE
1407 # define FTYPE DFtype
1408 #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (XF_SIZE))
1409 # define FSIZE XF_SIZE
1410 # define FTYPE XFtype
1411 #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (TF_SIZE))
1412 # define FSIZE TF_SIZE
1413 # define FTYPE TFtype
1414 #else
1415 # error
1416 #endif
1418 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1420 /* Protect against double-rounding error.
1421 Represent any low-order bits, that might be truncated by a bit that
1422 won't be lost. The bit can go in anywhere below the rounding position
1423 of the FSTYPE. A fixed mask and bit position handles all usual
1424 configurations. */
1425 if (! (- ((DWtype) 1 << FSIZE) < u
1426 && u < ((DWtype) 1 << FSIZE)))
1428 if ((UDWtype) u & (REP_BIT - 1))
1430 u &= ~ (REP_BIT - 1);
1431 u |= REP_BIT;
1435 /* Do the calculation in a wider type so that we don't lose any of
1436 the precision of the high word while multiplying it. */
1437 FTYPE f = (Wtype) (u >> W_TYPE_SIZE);
1438 f *= Wtype_MAXp1_F;
1439 f += (UWtype)u;
1440 return (FSTYPE) f;
1441 #else
1442 #if FSSIZE >= W_TYPE_SIZE - 2
1443 # error
1444 #endif
1445 /* Finally, the word size is larger than the number of bits in the
1446 required FSTYPE, and we've got no suitable wider type. The only
1447 way to avoid double rounding is to special case the
1448 extraction. */
1450 /* If there are no high bits set, fall back to one conversion. */
1451 if ((Wtype)u == u)
1452 return (FSTYPE)(Wtype)u;
1454 /* Otherwise, find the power of two. */
1455 Wtype hi = u >> W_TYPE_SIZE;
1456 if (hi < 0)
1457 hi = -hi;
1459 UWtype count, shift;
1460 count_leading_zeros (count, hi);
1462 /* No leading bits means u == minimum. */
1463 if (count == 0)
1464 return -(Wtype_MAXp1_F * (Wtype_MAXp1_F / 2));
1466 shift = 1 + W_TYPE_SIZE - count;
1468 /* Shift down the most significant bits. */
1469 hi = u >> shift;
1471 /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1472 if (u & (((DWtype)1 << shift) - 1))
1473 hi |= 1;
1475 /* Convert the one word of data, and rescale. */
1476 FSTYPE f = hi;
1477 f *= (UDWtype)1 << shift;
1478 return f;
1479 #endif
1481 #endif
1483 #if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE) \
1484 || (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE)
1485 #define DI_SIZE (W_TYPE_SIZE * 2)
1486 #define F_MODE_OK(SIZE) \
1487 (SIZE < DI_SIZE \
1488 && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1489 /* Don't use IBM Extended Double TFmode for TI->SF calculations. \
1490 The conversion from long double to float suffers from double \
1491 rounding, because we convert via double. In any case, the \
1492 fallback code is faster. */ \
1493 && !IS_IBM_EXTENDED (SIZE))
1494 #if defined(L_floatundisf)
1495 #define FUNC __floatundisf
1496 #define FSTYPE SFtype
1497 #define FSSIZE SF_SIZE
1498 #else
1499 #define FUNC __floatundidf
1500 #define FSTYPE DFtype
1501 #define FSSIZE DF_SIZE
1502 #endif
1504 FSTYPE
1505 FUNC (UDWtype u)
1507 #if FSSIZE >= W_TYPE_SIZE
1508 /* When the word size is small, we never get any rounding error. */
1509 FSTYPE f = (UWtype) (u >> W_TYPE_SIZE);
1510 f *= Wtype_MAXp1_F;
1511 f += (UWtype)u;
1512 return f;
1513 #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (DF_SIZE)) \
1514 || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (XF_SIZE)) \
1515 || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (TF_SIZE))
1517 #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (DF_SIZE))
1518 # define FSIZE DF_SIZE
1519 # define FTYPE DFtype
1520 #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (XF_SIZE))
1521 # define FSIZE XF_SIZE
1522 # define FTYPE XFtype
1523 #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (TF_SIZE))
1524 # define FSIZE TF_SIZE
1525 # define FTYPE TFtype
1526 #else
1527 # error
1528 #endif
1530 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1532 /* Protect against double-rounding error.
1533 Represent any low-order bits, that might be truncated by a bit that
1534 won't be lost. The bit can go in anywhere below the rounding position
1535 of the FSTYPE. A fixed mask and bit position handles all usual
1536 configurations. */
1537 if (u >= ((UDWtype) 1 << FSIZE))
1539 if ((UDWtype) u & (REP_BIT - 1))
1541 u &= ~ (REP_BIT - 1);
1542 u |= REP_BIT;
1546 /* Do the calculation in a wider type so that we don't lose any of
1547 the precision of the high word while multiplying it. */
1548 FTYPE f = (UWtype) (u >> W_TYPE_SIZE);
1549 f *= Wtype_MAXp1_F;
1550 f += (UWtype)u;
1551 return (FSTYPE) f;
1552 #else
1553 #if FSSIZE == W_TYPE_SIZE - 1
1554 # error
1555 #endif
1556 /* Finally, the word size is larger than the number of bits in the
1557 required FSTYPE, and we've got no suitable wider type. The only
1558 way to avoid double rounding is to special case the
1559 extraction. */
1561 /* If there are no high bits set, fall back to one conversion. */
1562 if ((UWtype)u == u)
1563 return (FSTYPE)(UWtype)u;
1565 /* Otherwise, find the power of two. */
1566 UWtype hi = u >> W_TYPE_SIZE;
1568 UWtype count, shift;
1569 count_leading_zeros (count, hi);
1571 shift = W_TYPE_SIZE - count;
1573 /* Shift down the most significant bits. */
1574 hi = u >> shift;
1576 /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1577 if (u & (((UDWtype)1 << shift) - 1))
1578 hi |= 1;
1580 /* Convert the one word of data, and rescale. */
1581 FSTYPE f = hi;
1582 f *= (UDWtype)1 << shift;
1583 return f;
1584 #endif
1586 #endif
1588 #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
1589 /* Reenable the normal types, in case limits.h needs them. */
1590 #undef char
1591 #undef short
1592 #undef int
1593 #undef long
1594 #undef unsigned
1595 #undef float
1596 #undef double
1597 #undef MIN
1598 #undef MAX
1599 #include <limits.h>
1601 UWtype
1602 __fixunsxfSI (XFtype a)
1604 if (a >= - (DFtype) Wtype_MIN)
1605 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1606 return (Wtype) a;
1608 #endif
1610 #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
1611 /* Reenable the normal types, in case limits.h needs them. */
1612 #undef char
1613 #undef short
1614 #undef int
1615 #undef long
1616 #undef unsigned
1617 #undef float
1618 #undef double
1619 #undef MIN
1620 #undef MAX
1621 #include <limits.h>
1623 UWtype
1624 __fixunsdfSI (DFtype a)
1626 if (a >= - (DFtype) Wtype_MIN)
1627 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1628 return (Wtype) a;
1630 #endif
1632 #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE
1633 /* Reenable the normal types, in case limits.h needs them. */
1634 #undef char
1635 #undef short
1636 #undef int
1637 #undef long
1638 #undef unsigned
1639 #undef float
1640 #undef double
1641 #undef MIN
1642 #undef MAX
1643 #include <limits.h>
1645 UWtype
1646 __fixunssfSI (SFtype a)
1648 if (a >= - (SFtype) Wtype_MIN)
1649 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1650 return (Wtype) a;
1652 #endif
1654 /* Integer power helper used from __builtin_powi for non-constant
1655 exponents. */
1657 #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \
1658 || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
1659 || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
1660 || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
1661 # if defined(L_powisf2)
1662 # define TYPE SFtype
1663 # define NAME __powisf2
1664 # elif defined(L_powidf2)
1665 # define TYPE DFtype
1666 # define NAME __powidf2
1667 # elif defined(L_powixf2)
1668 # define TYPE XFtype
1669 # define NAME __powixf2
1670 # elif defined(L_powitf2)
1671 # define TYPE TFtype
1672 # define NAME __powitf2
1673 # endif
1675 #undef int
1676 #undef unsigned
1677 TYPE
1678 NAME (TYPE x, int m)
1680 unsigned int n = m < 0 ? -m : m;
1681 TYPE y = n % 2 ? x : 1;
1682 while (n >>= 1)
1684 x = x * x;
1685 if (n % 2)
1686 y = y * x;
1688 return m < 0 ? 1/y : y;
1691 #endif
1693 #if ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
1694 || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
1695 || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
1696 || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
1698 #undef float
1699 #undef double
1700 #undef long
1702 #if defined(L_mulsc3) || defined(L_divsc3)
1703 # define MTYPE SFtype
1704 # define CTYPE SCtype
1705 # define MODE sc
1706 # define CEXT f
1707 # define NOTRUNC __FLT_EVAL_METHOD__ == 0
1708 #elif defined(L_muldc3) || defined(L_divdc3)
1709 # define MTYPE DFtype
1710 # define CTYPE DCtype
1711 # define MODE dc
1712 # if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
1713 # define CEXT l
1714 # define NOTRUNC 1
1715 # else
1716 # define CEXT
1717 # define NOTRUNC __FLT_EVAL_METHOD__ == 0 || __FLT_EVAL_METHOD__ == 1
1718 # endif
1719 #elif defined(L_mulxc3) || defined(L_divxc3)
1720 # define MTYPE XFtype
1721 # define CTYPE XCtype
1722 # define MODE xc
1723 # define CEXT l
1724 # define NOTRUNC 1
1725 #elif defined(L_multc3) || defined(L_divtc3)
1726 # define MTYPE TFtype
1727 # define CTYPE TCtype
1728 # define MODE tc
1729 # define CEXT l
1730 # define NOTRUNC 1
1731 #else
1732 # error
1733 #endif
1735 #define CONCAT3(A,B,C) _CONCAT3(A,B,C)
1736 #define _CONCAT3(A,B,C) A##B##C
1738 #define CONCAT2(A,B) _CONCAT2(A,B)
1739 #define _CONCAT2(A,B) A##B
1741 /* All of these would be present in a full C99 implementation of <math.h>
1742 and <complex.h>. Our problem is that only a few systems have such full
1743 implementations. Further, libgcc_s.so isn't currently linked against
1744 libm.so, and even for systems that do provide full C99, the extra overhead
1745 of all programs using libgcc having to link against libm. So avoid it. */
1747 #define isnan(x) __builtin_expect ((x) != (x), 0)
1748 #define isfinite(x) __builtin_expect (!isnan((x) - (x)), 1)
1749 #define isinf(x) __builtin_expect (!isnan(x) & !isfinite(x), 0)
1751 #define INFINITY CONCAT2(__builtin_inf, CEXT) ()
1752 #define I 1i
1754 /* Helpers to make the following code slightly less gross. */
1755 #define COPYSIGN CONCAT2(__builtin_copysign, CEXT)
1756 #define FABS CONCAT2(__builtin_fabs, CEXT)
1758 /* Verify that MTYPE matches up with CEXT. */
1759 extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
1761 /* Ensure that we've lost any extra precision. */
1762 #if NOTRUNC
1763 # define TRUNC(x)
1764 #else
1765 # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x))
1766 #endif
1768 #if defined(L_mulsc3) || defined(L_muldc3) \
1769 || defined(L_mulxc3) || defined(L_multc3)
1771 CTYPE
1772 CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
1774 MTYPE ac, bd, ad, bc, x, y;
1776 ac = a * c;
1777 bd = b * d;
1778 ad = a * d;
1779 bc = b * c;
1781 TRUNC (ac);
1782 TRUNC (bd);
1783 TRUNC (ad);
1784 TRUNC (bc);
1786 x = ac - bd;
1787 y = ad + bc;
1789 if (isnan (x) && isnan (y))
1791 /* Recover infinities that computed as NaN + iNaN. */
1792 _Bool recalc = 0;
1793 if (isinf (a) || isinf (b))
1795 /* z is infinite. "Box" the infinity and change NaNs in
1796 the other factor to 0. */
1797 a = COPYSIGN (isinf (a) ? 1 : 0, a);
1798 b = COPYSIGN (isinf (b) ? 1 : 0, b);
1799 if (isnan (c)) c = COPYSIGN (0, c);
1800 if (isnan (d)) d = COPYSIGN (0, d);
1801 recalc = 1;
1803 if (isinf (c) || isinf (d))
1805 /* w is infinite. "Box" the infinity and change NaNs in
1806 the other factor to 0. */
1807 c = COPYSIGN (isinf (c) ? 1 : 0, c);
1808 d = COPYSIGN (isinf (d) ? 1 : 0, d);
1809 if (isnan (a)) a = COPYSIGN (0, a);
1810 if (isnan (b)) b = COPYSIGN (0, b);
1811 recalc = 1;
1813 if (!recalc
1814 && (isinf (ac) || isinf (bd)
1815 || isinf (ad) || isinf (bc)))
1817 /* Recover infinities from overflow by changing NaNs to 0. */
1818 if (isnan (a)) a = COPYSIGN (0, a);
1819 if (isnan (b)) b = COPYSIGN (0, b);
1820 if (isnan (c)) c = COPYSIGN (0, c);
1821 if (isnan (d)) d = COPYSIGN (0, d);
1822 recalc = 1;
1824 if (recalc)
1826 x = INFINITY * (a * c - b * d);
1827 y = INFINITY * (a * d + b * c);
1831 return x + I * y;
1833 #endif /* complex multiply */
1835 #if defined(L_divsc3) || defined(L_divdc3) \
1836 || defined(L_divxc3) || defined(L_divtc3)
1838 CTYPE
1839 CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
1841 MTYPE denom, ratio, x, y;
1843 /* ??? We can get better behavior from logarithmic scaling instead of
1844 the division. But that would mean starting to link libgcc against
1845 libm. We could implement something akin to ldexp/frexp as gcc builtins
1846 fairly easily... */
1847 if (FABS (c) < FABS (d))
1849 ratio = c / d;
1850 denom = (c * ratio) + d;
1851 x = ((a * ratio) + b) / denom;
1852 y = ((b * ratio) - a) / denom;
1854 else
1856 ratio = d / c;
1857 denom = (d * ratio) + c;
1858 x = ((b * ratio) + a) / denom;
1859 y = (b - (a * ratio)) / denom;
1862 /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
1863 are nonzero/zero, infinite/finite, and finite/infinite. */
1864 if (isnan (x) && isnan (y))
1866 if (denom == 0.0 && (!isnan (a) || !isnan (b)))
1868 x = COPYSIGN (INFINITY, c) * a;
1869 y = COPYSIGN (INFINITY, c) * b;
1871 else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
1873 a = COPYSIGN (isinf (a) ? 1 : 0, a);
1874 b = COPYSIGN (isinf (b) ? 1 : 0, b);
1875 x = INFINITY * (a * c + b * d);
1876 y = INFINITY * (b * c - a * d);
1878 else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
1880 c = COPYSIGN (isinf (c) ? 1 : 0, c);
1881 d = COPYSIGN (isinf (d) ? 1 : 0, d);
1882 x = 0.0 * (a * c + b * d);
1883 y = 0.0 * (b * c - a * d);
1887 return x + I * y;
1889 #endif /* complex divide */
1891 #endif /* all complex float routines */
1893 /* From here on down, the routines use normal data types. */
1895 #define SItype bogus_type
1896 #define USItype bogus_type
1897 #define DItype bogus_type
1898 #define UDItype bogus_type
1899 #define SFtype bogus_type
1900 #define DFtype bogus_type
1901 #undef Wtype
1902 #undef UWtype
1903 #undef HWtype
1904 #undef UHWtype
1905 #undef DWtype
1906 #undef UDWtype
1908 #undef char
1909 #undef short
1910 #undef int
1911 #undef long
1912 #undef unsigned
1913 #undef float
1914 #undef double
1916 #ifdef L__gcc_bcmp
1918 /* Like bcmp except the sign is meaningful.
1919 Result is negative if S1 is less than S2,
1920 positive if S1 is greater, 0 if S1 and S2 are equal. */
1923 __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
1925 while (size > 0)
1927 const unsigned char c1 = *s1++, c2 = *s2++;
1928 if (c1 != c2)
1929 return c1 - c2;
1930 size--;
1932 return 0;
1935 #endif
1937 /* __eprintf used to be used by GCC's private version of <assert.h>.
1938 We no longer provide that header, but this routine remains in libgcc.a
1939 for binary backward compatibility. Note that it is not included in
1940 the shared version of libgcc. */
1941 #ifdef L_eprintf
1942 #ifndef inhibit_libc
1944 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1945 #include <stdio.h>
1947 void
1948 __eprintf (const char *string, const char *expression,
1949 unsigned int line, const char *filename)
1951 fprintf (stderr, string, expression, line, filename);
1952 fflush (stderr);
1953 abort ();
1956 #endif
1957 #endif
1960 #ifdef L_clear_cache
1961 /* Clear part of an instruction cache. */
1963 void
1964 __clear_cache (char *beg __attribute__((__unused__)),
1965 char *end __attribute__((__unused__)))
1967 #ifdef CLEAR_INSN_CACHE
1968 CLEAR_INSN_CACHE (beg, end);
1969 #endif /* CLEAR_INSN_CACHE */
1972 #endif /* L_clear_cache */
1974 #ifdef L_enable_execute_stack
1975 /* Attempt to turn on execute permission for the stack. */
1977 #ifdef ENABLE_EXECUTE_STACK
1978 ENABLE_EXECUTE_STACK
1979 #else
1980 void
1981 __enable_execute_stack (void *addr __attribute__((__unused__)))
1983 #endif /* ENABLE_EXECUTE_STACK */
1985 #endif /* L_enable_execute_stack */
1987 #ifdef L_trampoline
1989 /* Jump to a trampoline, loading the static chain address. */
1991 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1994 getpagesize (void)
1996 #ifdef _ALPHA_
1997 return 8192;
1998 #else
1999 return 4096;
2000 #endif
2003 #ifdef __i386__
2004 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
2005 #endif
2008 mprotect (char *addr, int len, int prot)
2010 int np, op;
2012 if (prot == 7)
2013 np = 0x40;
2014 else if (prot == 5)
2015 np = 0x20;
2016 else if (prot == 4)
2017 np = 0x10;
2018 else if (prot == 3)
2019 np = 0x04;
2020 else if (prot == 1)
2021 np = 0x02;
2022 else if (prot == 0)
2023 np = 0x01;
2025 if (VirtualProtect (addr, len, np, &op))
2026 return 0;
2027 else
2028 return -1;
2031 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
2033 #ifdef TRANSFER_FROM_TRAMPOLINE
2034 TRANSFER_FROM_TRAMPOLINE
2035 #endif
2036 #endif /* L_trampoline */
2038 #ifndef __CYGWIN__
2039 #ifdef L__main
2041 #include "gbl-ctors.h"
2043 /* Some systems use __main in a way incompatible with its use in gcc, in these
2044 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2045 give the same symbol without quotes for an alternative entry point. You
2046 must define both, or neither. */
2047 #ifndef NAME__MAIN
2048 #define NAME__MAIN "__main"
2049 #define SYMBOL__MAIN __main
2050 #endif
2052 #if defined (INIT_SECTION_ASM_OP) || defined (INIT_ARRAY_SECTION_ASM_OP)
2053 #undef HAS_INIT_SECTION
2054 #define HAS_INIT_SECTION
2055 #endif
2057 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
2059 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
2060 code to run constructors. In that case, we need to handle EH here, too. */
2062 #ifdef EH_FRAME_SECTION_NAME
2063 #include "unwind-dw2-fde.h"
2064 extern unsigned char __EH_FRAME_BEGIN__[];
2065 #endif
2067 /* Run all the global destructors on exit from the program. */
2069 void
2070 __do_global_dtors (void)
2072 #ifdef DO_GLOBAL_DTORS_BODY
2073 DO_GLOBAL_DTORS_BODY;
2074 #else
2075 static func_ptr *p = __DTOR_LIST__ + 1;
2076 while (*p)
2078 p++;
2079 (*(p-1)) ();
2081 #endif
2082 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
2084 static int completed = 0;
2085 if (! completed)
2087 completed = 1;
2088 __deregister_frame_info (__EH_FRAME_BEGIN__);
2091 #endif
2093 #endif
2095 #ifndef HAS_INIT_SECTION
2096 /* Run all the global constructors on entry to the program. */
2098 void
2099 __do_global_ctors (void)
2101 #ifdef EH_FRAME_SECTION_NAME
2103 static struct object object;
2104 __register_frame_info (__EH_FRAME_BEGIN__, &object);
2106 #endif
2107 DO_GLOBAL_CTORS_BODY;
2108 atexit (__do_global_dtors);
2110 #endif /* no HAS_INIT_SECTION */
2112 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
2113 /* Subroutine called automatically by `main'.
2114 Compiling a global function named `main'
2115 produces an automatic call to this function at the beginning.
2117 For many systems, this routine calls __do_global_ctors.
2118 For systems which support a .init section we use the .init section
2119 to run __do_global_ctors, so we need not do anything here. */
2121 extern void SYMBOL__MAIN (void);
2122 void
2123 SYMBOL__MAIN (void)
2125 /* Support recursive calls to `main': run initializers just once. */
2126 static int initialized;
2127 if (! initialized)
2129 initialized = 1;
2130 __do_global_ctors ();
2133 #endif /* no HAS_INIT_SECTION or INVOKE__main */
2135 #endif /* L__main */
2136 #endif /* __CYGWIN__ */
2138 #ifdef L_ctors
2140 #include "gbl-ctors.h"
2142 /* Provide default definitions for the lists of constructors and
2143 destructors, so that we don't get linker errors. These symbols are
2144 intentionally bss symbols, so that gld and/or collect will provide
2145 the right values. */
2147 /* We declare the lists here with two elements each,
2148 so that they are valid empty lists if no other definition is loaded.
2150 If we are using the old "set" extensions to have the gnu linker
2151 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
2152 must be in the bss/common section.
2154 Long term no port should use those extensions. But many still do. */
2155 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2156 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
2157 func_ptr __CTOR_LIST__[2] = {0, 0};
2158 func_ptr __DTOR_LIST__[2] = {0, 0};
2159 #else
2160 func_ptr __CTOR_LIST__[2];
2161 func_ptr __DTOR_LIST__[2];
2162 #endif
2163 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
2164 #endif /* L_ctors */