OSDN Git Service

PR middle-end/24998
[pf3gnuchains/gcc-fork.git] / gcc / libgcc2.c
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.
5
6 This file is part of GCC.
7
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.
12
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.)
21
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.
26
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.  */
31
32 #include "tconfig.h"
33 #include "tsystem.h"
34 #include "coretypes.h"
35 #include "tm.h"
36
37 #ifdef HAVE_GAS_HIDDEN
38 #define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
39 #else
40 #define ATTRIBUTE_HIDDEN
41 #endif
42
43 #include "libgcc2.h"
44 \f
45 #ifdef DECLARE_LIBRARY_RENAMES
46   DECLARE_LIBRARY_RENAMES
47 #endif
48
49 #if defined (L_negdi2)
50 DWtype
51 __negdi2 (DWtype u)
52 {
53   const DWunion uu = {.ll = u};
54   const DWunion w = { {.low = -uu.s.low,
55                        .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
56
57   return w.ll;
58 }
59 #endif
60
61 #ifdef L_addvsi3
62 Wtype
63 __addvSI3 (Wtype a, Wtype b)
64 {
65   const Wtype w = a + b;
66
67   if (b >= 0 ? w < a : w > a)
68     abort ();
69
70   return w;
71 }
72 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
73 SItype
74 __addvsi3 (SItype a, SItype b)
75 {
76   const SItype w = a + b;
77
78   if (b >= 0 ? w < a : w > a)
79     abort ();
80
81   return w;
82 }
83 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
84 #endif
85 \f
86 #ifdef L_addvdi3
87 DWtype
88 __addvDI3 (DWtype a, DWtype b)
89 {
90   const DWtype w = a + b;
91
92   if (b >= 0 ? w < a : w > a)
93     abort ();
94
95   return w;
96 }
97 #endif
98 \f
99 #ifdef L_subvsi3
100 Wtype
101 __subvSI3 (Wtype a, Wtype b)
102 {
103   const Wtype w = a - b;
104
105   if (b >= 0 ? w > a : w < a)
106     abort ();
107
108   return w;
109 }
110 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
111 SItype
112 __subvsi3 (SItype a, SItype b)
113 {
114   const SItype w = a - b;
115
116   if (b >= 0 ? w > a : w < a)
117     abort ();
118
119   return w;
120 }
121 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
122 #endif
123 \f
124 #ifdef L_subvdi3
125 DWtype
126 __subvDI3 (DWtype a, DWtype b)
127 {
128   const DWtype w = a - b;
129
130   if (b >= 0 ? w > a : w < a)
131     abort ();
132
133   return w;
134 }
135 #endif
136 \f
137 #ifdef L_mulvsi3
138 Wtype
139 __mulvSI3 (Wtype a, Wtype b)
140 {
141   const DWtype w = (DWtype) a * (DWtype) b;
142
143   if ((Wtype) (w >> W_TYPE_SIZE) != (Wtype) w >> (W_TYPE_SIZE - 1))
144     abort ();
145
146   return w;
147 }
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)
153 {
154   const DItype w = (DItype) a * (DItype) b;
155
156   if ((SItype) (w >> WORD_SIZE) != (SItype) w >> (WORD_SIZE-1))
157     abort ();
158
159   return w;
160 }
161 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
162 #endif
163 \f
164 #ifdef L_negvsi2
165 Wtype
166 __negvSI2 (Wtype a)
167 {
168   const Wtype w = -a;
169
170   if (a >= 0 ? w > 0 : w < 0)
171     abort ();
172
173    return w;
174 }
175 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
176 SItype
177 __negvsi2 (SItype a)
178 {
179   const SItype w = -a;
180
181   if (a >= 0 ? w > 0 : w < 0)
182     abort ();
183
184    return w;
185 }
186 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
187 #endif
188 \f
189 #ifdef L_negvdi2
190 DWtype
191 __negvDI2 (DWtype a)
192 {
193   const DWtype w = -a;
194
195   if (a >= 0 ? w > 0 : w < 0)
196     abort ();
197
198   return w;
199 }
200 #endif
201 \f
202 #ifdef L_absvsi2
203 Wtype
204 __absvSI2 (Wtype a)
205 {
206   Wtype w = a;
207
208   if (a < 0)
209 #ifdef L_negvsi2
210     w = __negvSI2 (a);
211 #else
212     w = -a;
213
214   if (w < 0)
215     abort ();
216 #endif
217
218    return w;
219 }
220 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
221 SItype
222 __absvsi2 (SItype a)
223 {
224   SItype w = a;
225
226   if (a < 0)
227 #ifdef L_negvsi2
228     w = __negvsi2 (a);
229 #else
230     w = -a;
231
232   if (w < 0)
233     abort ();
234 #endif
235
236    return w;
237 }
238 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
239 #endif
240 \f
241 #ifdef L_absvdi2
242 DWtype
243 __absvDI2 (DWtype a)
244 {
245   DWtype w = a;
246
247   if (a < 0)
248 #ifdef L_negvdi2
249     w = __negvDI2 (a);
250 #else
251     w = -a;
252
253   if (w < 0)
254     abort ();
255 #endif
256
257   return w;
258 }
259 #endif
260 \f
261 #ifdef L_mulvdi3
262 DWtype
263 __mulvDI3 (DWtype u, DWtype v)
264 {
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};
269
270   if (__builtin_expect (uu.s.high == uu.s.low >> (W_TYPE_SIZE - 1), 1))
271     {
272       /* u fits in a single Wtype.  */
273       if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
274         {
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;
278         }
279       else
280         {
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};
286
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))
293             {
294               w0.s.high = w1.s.low;
295               return w0.ll;
296             }
297         }
298     }
299   else
300     {
301       if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
302         {
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};
309
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))
316             {
317               w0.s.high = w1.s.low;
318               return w0.ll;
319             }
320         }
321       else
322         {
323           /* A few sign checks and a single multiplication.  */
324           if (uu.s.high >= 0)
325             {
326               if (vv.s.high >= 0)
327                 {
328                   if (uu.s.high == 0 && vv.s.high == 0)
329                     {
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;
334                     }
335                 }
336               else
337                 {
338                   if (uu.s.high == 0 && vv.s.high == (Wtype) -1)
339                     {
340                       DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
341                                     * (UDWtype) (UWtype) vv.s.low};
342
343                       ww.s.high -= uu.s.low;
344                       if (__builtin_expect (ww.s.high < 0, 1))
345                         return ww.ll;
346                     }
347                 }
348             }
349           else
350             {
351               if (vv.s.high >= 0)
352                 {
353                   if (uu.s.high == (Wtype) -1 && vv.s.high == 0)
354                     {
355                       DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
356                                     * (UDWtype) (UWtype) vv.s.low};
357
358                       ww.s.high -= vv.s.low;
359                       if (__builtin_expect (ww.s.high < 0, 1))
360                         return ww.ll;
361                     }
362                 }
363               else
364                 {
365                   if (uu.s.high == (Wtype) -1 && vv.s.high == (Wtype) - 1)
366                     {
367                       DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
368                                     * (UDWtype) (UWtype) vv.s.low};
369
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;
374                     }
375                 }
376             }
377         }
378     }
379
380   /* Overflow.  */
381   abort ();
382 }
383 #endif
384 \f
385
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)
391 {
392   if (b == 0)
393     return u;
394
395   const DWunion uu = {.ll = u};
396   const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
397   DWunion w;
398
399   if (bm <= 0)
400     {
401       w.s.high = 0;
402       w.s.low = (UWtype) uu.s.high >> -bm;
403     }
404   else
405     {
406       const UWtype carries = (UWtype) uu.s.high << bm;
407
408       w.s.high = (UWtype) uu.s.high >> b;
409       w.s.low = ((UWtype) uu.s.low >> b) | carries;
410     }
411
412   return w.ll;
413 }
414 #endif
415
416 #ifdef L_ashldi3
417 DWtype
418 __ashldi3 (DWtype u, word_type b)
419 {
420   if (b == 0)
421     return u;
422
423   const DWunion uu = {.ll = u};
424   const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
425   DWunion w;
426
427   if (bm <= 0)
428     {
429       w.s.low = 0;
430       w.s.high = (UWtype) uu.s.low << -bm;
431     }
432   else
433     {
434       const UWtype carries = (UWtype) uu.s.low >> bm;
435
436       w.s.low = (UWtype) uu.s.low << b;
437       w.s.high = ((UWtype) uu.s.high << b) | carries;
438     }
439
440   return w.ll;
441 }
442 #endif
443
444 #ifdef L_ashrdi3
445 DWtype
446 __ashrdi3 (DWtype u, word_type b)
447 {
448   if (b == 0)
449     return u;
450
451   const DWunion uu = {.ll = u};
452   const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
453   DWunion w;
454
455   if (bm <= 0)
456     {
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;
460     }
461   else
462     {
463       const UWtype carries = (UWtype) uu.s.high << bm;
464
465       w.s.high = uu.s.high >> b;
466       w.s.low = ((UWtype) uu.s.low >> b) | carries;
467     }
468
469   return w.ll;
470 }
471 #endif
472 \f
473 #ifdef L_ffssi2
474 #undef int
475 int
476 __ffsSI2 (UWtype u)
477 {
478   UWtype count;
479
480   if (u == 0)
481     return 0;
482
483   count_trailing_zeros (count, u);
484   return count + 1;
485 }
486 #endif
487 \f
488 #ifdef L_ffsdi2
489 #undef int
490 int
491 __ffsDI2 (DWtype u)
492 {
493   const DWunion uu = {.ll = u};
494   UWtype word, count, add;
495
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;
502
503   count_trailing_zeros (count, word);
504   return count + add + 1;
505 }
506 #endif
507 \f
508 #ifdef L_muldi3
509 DWtype
510 __muldi3 (DWtype u, DWtype v)
511 {
512   const DWunion uu = {.ll = u};
513   const DWunion vv = {.ll = v};
514   DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
515
516   w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
517                + (UWtype) uu.s.high * (UWtype) vv.s.low);
518
519   return w.ll;
520 }
521 #endif
522 \f
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
529
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)
538 {
539   UWtype q, r;
540   UWtype c0, c1, b1;
541
542   if ((Wtype) d >= 0)
543     {
544       if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
545         {
546           /* Dividend, divisor, and quotient are nonnegative.  */
547           sdiv_qrnnd (q, r, a1, a0, d);
548         }
549       else
550         {
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);
557         }
558     }
559   else
560     {
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);
564
565       if (a1 < b1)                      /* A < 2^32*b1, so A/2 < 2^31*b1 */
566         {
567           sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
568
569           r = 2*r + (a0 & 1);           /* Remainder from A/(2*b1) */
570           if ((d & 1) != 0)
571             {
572               if (r >= q)
573                 r = r - q;
574               else if (q - r <= d)
575                 {
576                   r = r - q + d;
577                   q--;
578                 }
579               else
580                 {
581                   r = r - q + 2*d;
582                   q -= 2;
583                 }
584             }
585         }
586       else if (c1 < b1)                 /* So 2^31 <= (A/2)/b1 < 2^32 */
587         {
588           c1 = (b1 - 1) - c1;
589           c0 = ~c0;                     /* logical NOT */
590
591           sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
592
593           q = ~q;                       /* (A/2)/b1 */
594           r = (b1 - 1) - r;
595
596           r = 2*r + (a0 & 1);           /* A/(2*b1) */
597
598           if ((d & 1) != 0)
599             {
600               if (r >= q)
601                 r = r - q;
602               else if (q - r <= d)
603                 {
604                   r = r - q + d;
605                   q--;
606                 }
607               else
608                 {
609                   r = r - q + 2*d;
610                   q -= 2;
611                 }
612             }
613         }
614       else                              /* Implies c1 = b1 */
615         {                               /* Hence a1 = d - 1 = 2*b1 - 1 */
616           if (a0 >= -d)
617             {
618               q = -1;
619               r = a0 + d;
620             }
621           else
622             {
623               q = -2;
624               r = a0 + 2*d;
625             }
626         }
627     }
628
629   *rp = r;
630   return q;
631 }
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__)))
639 {
640   return 0;
641 }
642 #endif
643 #endif
644 \f
645 #if (defined (L_udivdi3) || defined (L_divdi3) || \
646      defined (L_umoddi3) || defined (L_moddi3))
647 #define L_udivmoddi4
648 #endif
649
650 #ifdef L_clz
651 const UQItype __clz_tab[256] =
652 {
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
661 };
662 #endif
663 \f
664 #ifdef L_clzsi2
665 #undef int
666 int
667 __clzSI2 (UWtype x)
668 {
669   Wtype ret;
670
671   count_leading_zeros (ret, x);
672
673   return ret;
674 }
675 #endif
676 \f
677 #ifdef L_clzdi2
678 #undef int
679 int
680 __clzDI2 (UDWtype x)
681 {
682   const DWunion uu = {.ll = x};
683   UWtype word;
684   Wtype ret, add;
685
686   if (uu.s.high)
687     word = uu.s.high, add = 0;
688   else
689     word = uu.s.low, add = W_TYPE_SIZE;
690
691   count_leading_zeros (ret, word);
692   return ret + add;
693 }
694 #endif
695 \f
696 #ifdef L_ctzsi2
697 #undef int
698 int
699 __ctzSI2 (UWtype x)
700 {
701   Wtype ret;
702
703   count_trailing_zeros (ret, x);
704
705   return ret;
706 }
707 #endif
708 \f
709 #ifdef L_ctzdi2
710 #undef int
711 int
712 __ctzDI2 (UDWtype x)
713 {
714   const DWunion uu = {.ll = x};
715   UWtype word;
716   Wtype ret, add;
717
718   if (uu.s.low)
719     word = uu.s.low, add = 0;
720   else
721     word = uu.s.high, add = W_TYPE_SIZE;
722
723   count_trailing_zeros (ret, word);
724   return ret + add;
725 }
726 #endif
727
728 #ifdef L_popcount_tab
729 const UQItype __popcount_tab[256] =
730 {
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
739 };
740 #endif
741 \f
742 #ifdef L_popcountsi2
743 #undef int
744 int
745 __popcountSI2 (UWtype x)
746 {
747   UWtype i, ret = 0;
748
749   for (i = 0; i < W_TYPE_SIZE; i += 8)
750     ret += __popcount_tab[(x >> i) & 0xff];
751
752   return ret;
753 }
754 #endif
755 \f
756 #ifdef L_popcountdi2
757 #undef int
758 int
759 __popcountDI2 (UDWtype x)
760 {
761   UWtype i, ret = 0;
762
763   for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
764     ret += __popcount_tab[(x >> i) & 0xff];
765
766   return ret;
767 }
768 #endif
769 \f
770 #ifdef L_paritysi2
771 #undef int
772 int
773 __paritySI2 (UWtype x)
774 {
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;
788 }
789 #endif
790 \f
791 #ifdef L_paritydi2
792 #undef int
793 int
794 __parityDI2 (UDWtype x)
795 {
796   const DWunion uu = {.ll = x};
797   UWtype nx = uu.s.low ^ uu.s.high;
798
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;
812 }
813 #endif
814
815 #ifdef L_udivmoddi4
816
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)
823 {
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;
830
831   d0 = dd.s.low;
832   d1 = dd.s.high;
833   n0 = nn.s.low;
834   n1 = nn.s.high;
835
836 #if !UDIV_NEEDS_NORMALIZATION
837   if (d1 == 0)
838     {
839       if (d0 > n1)
840         {
841           /* 0q = nn / 0D */
842
843           udiv_qrnnd (q0, n0, n1, n0, d0);
844           q1 = 0;
845
846           /* Remainder in n0.  */
847         }
848       else
849         {
850           /* qq = NN / 0d */
851
852           if (d0 == 0)
853             d0 = 1 / d0;        /* Divide intentionally by zero.  */
854
855           udiv_qrnnd (q1, n1, 0, n1, d0);
856           udiv_qrnnd (q0, n0, n1, n0, d0);
857
858           /* Remainder in n0.  */
859         }
860
861       if (rp != 0)
862         {
863           rr.s.low = n0;
864           rr.s.high = 0;
865           *rp = rr.ll;
866         }
867     }
868
869 #else /* UDIV_NEEDS_NORMALIZATION */
870
871   if (d1 == 0)
872     {
873       if (d0 > n1)
874         {
875           /* 0q = nn / 0D */
876
877           count_leading_zeros (bm, d0);
878
879           if (bm != 0)
880             {
881               /* Normalize, i.e. make the most significant bit of the
882                  denominator set.  */
883
884               d0 = d0 << bm;
885               n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
886               n0 = n0 << bm;
887             }
888
889           udiv_qrnnd (q0, n0, n1, n0, d0);
890           q1 = 0;
891
892           /* Remainder in n0 >> bm.  */
893         }
894       else
895         {
896           /* qq = NN / 0d */
897
898           if (d0 == 0)
899             d0 = 1 / d0;        /* Divide intentionally by zero.  */
900
901           count_leading_zeros (bm, d0);
902
903           if (bm == 0)
904             {
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).
908
909                  This special case is necessary, not an optimization.
910                  (Shifts counts of W_TYPE_SIZE are undefined.)  */
911
912               n1 -= d0;
913               q1 = 1;
914             }
915           else
916             {
917               /* Normalize.  */
918
919               b = W_TYPE_SIZE - bm;
920
921               d0 = d0 << bm;
922               n2 = n1 >> b;
923               n1 = (n1 << bm) | (n0 >> b);
924               n0 = n0 << bm;
925
926               udiv_qrnnd (q1, n1, n2, n1, d0);
927             }
928
929           /* n1 != d0...  */
930
931           udiv_qrnnd (q0, n0, n1, n0, d0);
932
933           /* Remainder in n0 >> bm.  */
934         }
935
936       if (rp != 0)
937         {
938           rr.s.low = n0 >> bm;
939           rr.s.high = 0;
940           *rp = rr.ll;
941         }
942     }
943 #endif /* UDIV_NEEDS_NORMALIZATION */
944
945   else
946     {
947       if (d1 > n1)
948         {
949           /* 00 = nn / DD */
950
951           q0 = 0;
952           q1 = 0;
953
954           /* Remainder in n1n0.  */
955           if (rp != 0)
956             {
957               rr.s.low = n0;
958               rr.s.high = n1;
959               *rp = rr.ll;
960             }
961         }
962       else
963         {
964           /* 0q = NN / dd */
965
966           count_leading_zeros (bm, d1);
967           if (bm == 0)
968             {
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).
972
973                  This special case is necessary, not an optimization.  */
974
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)
978                 {
979                   q0 = 1;
980                   sub_ddmmss (n1, n0, n1, n0, d1, d0);
981                 }
982               else
983                 q0 = 0;
984
985               q1 = 0;
986
987               if (rp != 0)
988                 {
989                   rr.s.low = n0;
990                   rr.s.high = n1;
991                   *rp = rr.ll;
992                 }
993             }
994           else
995             {
996               UWtype m1, m0;
997               /* Normalize.  */
998
999               b = W_TYPE_SIZE - bm;
1000
1001               d1 = (d1 << bm) | (d0 >> b);
1002               d0 = d0 << bm;
1003               n2 = n1 >> b;
1004               n1 = (n1 << bm) | (n0 >> b);
1005               n0 = n0 << bm;
1006
1007               udiv_qrnnd (q0, n1, n2, n1, d1);
1008               umul_ppmm (m1, m0, q0, d0);
1009
1010               if (m1 > n1 || (m1 == n1 && m0 > n0))
1011                 {
1012                   q0--;
1013                   sub_ddmmss (m1, m0, m1, m0, d1, d0);
1014                 }
1015
1016               q1 = 0;
1017
1018               /* Remainder in (n1n0 - m1m0) >> bm.  */
1019               if (rp != 0)
1020                 {
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;
1025                 }
1026             }
1027         }
1028     }
1029
1030   const DWunion ww = {{.low = q0, .high = q1}};
1031   return ww.ll;
1032 }
1033 #endif
1034
1035 #ifdef L_divdi3
1036 DWtype
1037 __divdi3 (DWtype u, DWtype v)
1038 {
1039   word_type c = 0;
1040   DWunion uu = {.ll = u};
1041   DWunion vv = {.ll = v};
1042   DWtype w;
1043
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;
1050
1051   w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
1052   if (c)
1053     w = -w;
1054
1055   return w;
1056 }
1057 #endif
1058
1059 #ifdef L_moddi3
1060 DWtype
1061 __moddi3 (DWtype u, DWtype v)
1062 {
1063   word_type c = 0;
1064   DWunion uu = {.ll = u};
1065   DWunion vv = {.ll = v};
1066   DWtype w;
1067
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;
1073
1074   (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w);
1075   if (c)
1076     w = -w;
1077
1078   return w;
1079 }
1080 #endif
1081
1082 #ifdef L_umoddi3
1083 UDWtype
1084 __umoddi3 (UDWtype u, UDWtype v)
1085 {
1086   UDWtype w;
1087
1088   (void) __udivmoddi4 (u, v, &w);
1089
1090   return w;
1091 }
1092 #endif
1093
1094 #ifdef L_udivdi3
1095 UDWtype
1096 __udivdi3 (UDWtype n, UDWtype d)
1097 {
1098   return __udivmoddi4 (n, d, (UDWtype *) 0);
1099 }
1100 #endif
1101 \f
1102 #ifdef L_cmpdi2
1103 word_type
1104 __cmpdi2 (DWtype a, DWtype b)
1105 {
1106   const DWunion au = {.ll = a};
1107   const DWunion bu = {.ll = b};
1108
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;
1118 }
1119 #endif
1120
1121 #ifdef L_ucmpdi2
1122 word_type
1123 __ucmpdi2 (DWtype a, DWtype b)
1124 {
1125   const DWunion au = {.ll = a};
1126   const DWunion bu = {.ll = b};
1127
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;
1137 }
1138 #endif
1139 \f
1140 #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
1141 DWtype
1142 __fixunstfDI (TFtype a)
1143 {
1144   if (a < 0)
1145     return 0;
1146
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;
1163 }
1164 #endif
1165
1166 #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
1167 DWtype
1168 __fixtfdi (TFtype a)
1169 {
1170   if (a < 0)
1171     return - __fixunstfDI (-a);
1172   return __fixunstfDI (a);
1173 }
1174 #endif
1175
1176 #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
1177 DWtype
1178 __fixunsxfDI (XFtype a)
1179 {
1180   if (a < 0)
1181     return 0;
1182
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;
1199 }
1200 #endif
1201
1202 #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
1203 DWtype
1204 __fixxfdi (XFtype a)
1205 {
1206   if (a < 0)
1207     return - __fixunsxfDI (-a);
1208   return __fixunsxfDI (a);
1209 }
1210 #endif
1211
1212 #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
1213 DWtype
1214 __fixunsdfDI (DFtype a)
1215 {
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;
1220
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;
1225
1226   /* Assemble result from the two parts.  */
1227   return ((UDWtype) hi << W_TYPE_SIZE) | lo;
1228 }
1229 #endif
1230
1231 #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
1232 DWtype
1233 __fixdfdi (DFtype a)
1234 {
1235   if (a < 0)
1236     return - __fixunsdfDI (-a);
1237   return __fixunsdfDI (a);
1238 }
1239 #endif
1240
1241 #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE
1242 DWtype
1243 __fixunssfDI (SFtype a)
1244 {
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;
1250
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;
1255
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;
1260
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)
1269     {
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.  */
1273
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.  */
1277
1278       UWtype shift = 0, counter;
1279       SFtype msb;
1280
1281       a /= Wtype_MAXp1_F;
1282       for (counter = W_TYPE_SIZE / 2; counter != 0; counter >>= 1)
1283         {
1284           SFtype counterf = (UWtype)1 << counter;
1285           if (a >= counterf)
1286             {
1287               shift |= counter;
1288               a /= counterf;
1289             }
1290         }
1291
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;
1297     }
1298   return -1;
1299 #else
1300 # error
1301 #endif
1302 }
1303 #endif
1304
1305 #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE
1306 DWtype
1307 __fixsfdi (SFtype a)
1308 {
1309   if (a < 0)
1310     return - __fixunssfDI (-a);
1311   return __fixunssfDI (a);
1312 }
1313 #endif
1314
1315 #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
1316 XFtype
1317 __floatdixf (DWtype u)
1318 {
1319   XFtype d = (Wtype) (u >> W_TYPE_SIZE);
1320   d *= Wtype_MAXp1_F;
1321   d += (UWtype)u;
1322   return d;
1323 }
1324 #endif
1325
1326 #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE
1327 XFtype
1328 __floatundixf (UDWtype u)
1329 {
1330   XFtype d = (UWtype) (u >> W_TYPE_SIZE);
1331   d *= Wtype_MAXp1_F;
1332   d += (UWtype)u;
1333   return d;
1334 }
1335 #endif
1336
1337 #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
1338 TFtype
1339 __floatditf (DWtype u)
1340 {
1341   TFtype d = (Wtype) (u >> W_TYPE_SIZE);
1342   d *= Wtype_MAXp1_F;
1343   d += (UWtype)u;
1344   return d;
1345 }
1346 #endif
1347
1348 #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE
1349 TFtype
1350 __floatunditf (UDWtype u)
1351 {
1352   TFtype d = (UWtype) (u >> W_TYPE_SIZE);
1353   d *= Wtype_MAXp1_F;
1354   d += (UWtype)u;
1355   return d;
1356 }
1357 #endif
1358
1359 #if defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE
1360 DFtype
1361 __floatdidf (DWtype u)
1362 {
1363   DFtype d = (Wtype) (u >> W_TYPE_SIZE);
1364   d *= Wtype_MAXp1_F;
1365   d += (UWtype)u;
1366   return d;
1367 }
1368 #endif
1369
1370 #if defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE
1371 DFtype
1372 __floatundidf (UDWtype u)
1373 {
1374   DFtype d = (UWtype) (u >> W_TYPE_SIZE);
1375   d *= Wtype_MAXp1_F;
1376   d += (UWtype)u;
1377   return d;
1378 }
1379 #endif
1380
1381 #if defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE
1382 #define DI_SIZE (W_TYPE_SIZE * 2)
1383 #define SF_SIZE FLT_MANT_DIG
1384
1385 SFtype
1386 __floatdisf (DWtype u)
1387 {
1388 #if SF_SIZE >= W_TYPE_SIZE
1389   /* When the word size is small, we never get any rounding error.  */
1390   SFtype f = (Wtype) (u >> W_TYPE_SIZE);
1391   f *= Wtype_MAXp1_F;
1392   f += (UWtype)u;
1393   return f;
1394 #elif LIBGCC2_HAS_DF_MODE
1395
1396 #if LIBGCC2_DOUBLE_TYPE_SIZE == 64
1397 #define DF_SIZE DBL_MANT_DIG
1398 #elif LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
1399 #define DF_SIZE LDBL_MANT_DIG
1400 #else
1401 # error
1402 #endif
1403
1404 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1405
1406   /* Protect against double-rounding error.
1407      Represent any low-order bits, that might be truncated by a bit that
1408      won't be lost.  The bit can go in anywhere below the rounding position
1409      of the SFmode.  A fixed mask and bit position handles all usual
1410      configurations.  It doesn't handle the case of 128-bit DImode, however.  */
1411   if (DF_SIZE < DI_SIZE
1412       && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1413     {
1414       if (! (- ((DWtype) 1 << DF_SIZE) < u
1415              && u < ((DWtype) 1 << DF_SIZE)))
1416         {
1417           if ((UDWtype) u & (REP_BIT - 1))
1418             {
1419               u &= ~ (REP_BIT - 1);
1420               u |= REP_BIT;
1421             }
1422         }
1423     }
1424
1425   /* Do the calculation in DFmode so that we don't lose any of the
1426      precision of the high word while multiplying it.  */
1427   DFtype f = (Wtype) (u >> W_TYPE_SIZE);
1428   f *= Wtype_MAXp1_F;
1429   f += (UWtype)u;
1430   return (SFtype) f;
1431 #else
1432   /* Finally, the word size is larger than the number of bits in SFmode,
1433      and we've got no DFmode.  The only way to avoid double rounding is
1434      to special case the extraction.  */
1435
1436   /* If there are no high bits set, fall back to one conversion.  */
1437   if ((Wtype)u == u)
1438     return (SFtype)(Wtype)u;
1439
1440   /* Otherwise, find the power of two.  */
1441   Wtype hi = u >> W_TYPE_SIZE;
1442   if (hi < 0)
1443     hi = -hi;
1444
1445   UWtype count, shift;
1446   count_leading_zeros (count, hi);
1447
1448   /* No leading bits means u == minimum.  */
1449   if (count == 0)
1450     return -(Wtype_MAXp1_F * Wtype_MAXp1_F / 2);
1451
1452   shift = W_TYPE_SIZE - count;
1453
1454   /* Shift down the most significant bits.  */
1455   hi = u >> shift;
1456
1457   /* If we lost any nonzero bits, set the lsb to ensure correct rounding.  */
1458   if (u & ((1 << shift) - 1))
1459     hi |= 1;
1460
1461   /* Convert the one word of data, and rescale.  */
1462   SFtype f = hi;
1463   f *= (UWtype)1 << shift;
1464   return f;
1465 #endif
1466 }
1467 #endif
1468
1469 #if defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE
1470 #define DI_SIZE (W_TYPE_SIZE * 2)
1471 #define SF_SIZE FLT_MANT_DIG
1472
1473 SFtype
1474 __floatundisf (UDWtype u)
1475 {
1476 #if SF_SIZE >= W_TYPE_SIZE
1477   /* When the word size is small, we never get any rounding error.  */
1478   SFtype f = (UWtype) (u >> W_TYPE_SIZE);
1479   f *= Wtype_MAXp1_F;
1480   f += (UWtype)u;
1481   return f;
1482 #elif LIBGCC2_HAS_DF_MODE
1483
1484 #if LIBGCC2_DOUBLE_TYPE_SIZE == 64
1485 #define DF_SIZE DBL_MANT_DIG
1486 #elif LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
1487 #define DF_SIZE LDBL_MANT_DIG
1488 #else
1489 # error
1490 #endif
1491
1492 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1493
1494   /* Protect against double-rounding error.
1495      Represent any low-order bits, that might be truncated by a bit that
1496      won't be lost.  The bit can go in anywhere below the rounding position
1497      of the SFmode.  A fixed mask and bit position handles all usual
1498      configurations.  It doesn't handle the case of 128-bit DImode, however.  */
1499   if (DF_SIZE < DI_SIZE
1500       && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1501     {
1502       if (u >= ((UDWtype) 1 << DF_SIZE))
1503         {
1504           if ((UDWtype) u & (REP_BIT - 1))
1505             {
1506               u &= ~ (REP_BIT - 1);
1507               u |= REP_BIT;
1508             }
1509         }
1510     }
1511
1512   /* Do the calculation in DFmode so that we don't lose any of the
1513      precision of the high word while multiplying it.  */
1514   DFtype f = (UWtype) (u >> W_TYPE_SIZE);
1515   f *= Wtype_MAXp1_F;
1516   f += (UWtype)u;
1517   return (SFtype) f;
1518 #else
1519   /* Finally, the word size is larger than the number of bits in SFmode,
1520      and we've got no DFmode.  The only way to avoid double rounding is
1521      to special case the extraction.  */
1522
1523   /* If there are no high bits set, fall back to one conversion.  */
1524   if ((UWtype)u == u)
1525     return (SFtype)(UWtype)u;
1526
1527   /* Otherwise, find the power of two.  */
1528   UWtype hi = u >> W_TYPE_SIZE;
1529
1530   UWtype count, shift;
1531   count_leading_zeros (count, hi);
1532
1533   shift = W_TYPE_SIZE - count;
1534
1535   /* Shift down the most significant bits.  */
1536   hi = u >> shift;
1537
1538   /* If we lost any nonzero bits, set the lsb to ensure correct rounding.  */
1539   if (u & ((1 << shift) - 1))
1540     hi |= 1;
1541
1542   /* Convert the one word of data, and rescale.  */
1543   SFtype f = hi;
1544   f *= (UWtype)1 << shift;
1545   return f;
1546 #endif
1547 }
1548 #endif
1549
1550 #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
1551 /* Reenable the normal types, in case limits.h needs them.  */
1552 #undef char
1553 #undef short
1554 #undef int
1555 #undef long
1556 #undef unsigned
1557 #undef float
1558 #undef double
1559 #undef MIN
1560 #undef MAX
1561 #include <limits.h>
1562
1563 UWtype
1564 __fixunsxfSI (XFtype a)
1565 {
1566   if (a >= - (DFtype) Wtype_MIN)
1567     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1568   return (Wtype) a;
1569 }
1570 #endif
1571
1572 #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
1573 /* Reenable the normal types, in case limits.h needs them.  */
1574 #undef char
1575 #undef short
1576 #undef int
1577 #undef long
1578 #undef unsigned
1579 #undef float
1580 #undef double
1581 #undef MIN
1582 #undef MAX
1583 #include <limits.h>
1584
1585 UWtype
1586 __fixunsdfSI (DFtype a)
1587 {
1588   if (a >= - (DFtype) Wtype_MIN)
1589     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1590   return (Wtype) a;
1591 }
1592 #endif
1593
1594 #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE
1595 /* Reenable the normal types, in case limits.h needs them.  */
1596 #undef char
1597 #undef short
1598 #undef int
1599 #undef long
1600 #undef unsigned
1601 #undef float
1602 #undef double
1603 #undef MIN
1604 #undef MAX
1605 #include <limits.h>
1606
1607 UWtype
1608 __fixunssfSI (SFtype a)
1609 {
1610   if (a >= - (SFtype) Wtype_MIN)
1611     return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1612   return (Wtype) a;
1613 }
1614 #endif
1615 \f
1616 /* Integer power helper used from __builtin_powi for non-constant
1617    exponents.  */
1618
1619 #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \
1620     || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
1621     || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
1622     || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
1623 # if defined(L_powisf2)
1624 #  define TYPE SFtype
1625 #  define NAME __powisf2
1626 # elif defined(L_powidf2)
1627 #  define TYPE DFtype
1628 #  define NAME __powidf2
1629 # elif defined(L_powixf2)
1630 #  define TYPE XFtype
1631 #  define NAME __powixf2
1632 # elif defined(L_powitf2)
1633 #  define TYPE TFtype
1634 #  define NAME __powitf2
1635 # endif
1636
1637 #undef int
1638 #undef unsigned
1639 TYPE
1640 NAME (TYPE x, int m)
1641 {
1642   unsigned int n = m < 0 ? -m : m;
1643   TYPE y = n % 2 ? x : 1;
1644   while (n >>= 1)
1645     {
1646       x = x * x;
1647       if (n % 2)
1648         y = y * x;
1649     }
1650   return m < 0 ? 1/y : y;
1651 }
1652
1653 #endif
1654 \f
1655 #if ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
1656     || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
1657     || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
1658     || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
1659
1660 #undef float
1661 #undef double
1662 #undef long
1663
1664 #if defined(L_mulsc3) || defined(L_divsc3)
1665 # define MTYPE  SFtype
1666 # define CTYPE  SCtype
1667 # define MODE   sc
1668 # define CEXT   f
1669 # define NOTRUNC __FLT_EVAL_METHOD__ == 0
1670 #elif defined(L_muldc3) || defined(L_divdc3)
1671 # define MTYPE  DFtype
1672 # define CTYPE  DCtype
1673 # define MODE   dc
1674 # if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
1675 #  define CEXT  l
1676 #  define NOTRUNC 1
1677 # else
1678 #  define CEXT
1679 #  define NOTRUNC __FLT_EVAL_METHOD__ == 0 || __FLT_EVAL_METHOD__ == 1
1680 # endif
1681 #elif defined(L_mulxc3) || defined(L_divxc3)
1682 # define MTYPE  XFtype
1683 # define CTYPE  XCtype
1684 # define MODE   xc
1685 # define CEXT   l
1686 # define NOTRUNC 1
1687 #elif defined(L_multc3) || defined(L_divtc3)
1688 # define MTYPE  TFtype
1689 # define CTYPE  TCtype
1690 # define MODE   tc
1691 # define CEXT   l
1692 # define NOTRUNC 1
1693 #else
1694 # error
1695 #endif
1696
1697 #define CONCAT3(A,B,C)  _CONCAT3(A,B,C)
1698 #define _CONCAT3(A,B,C) A##B##C
1699
1700 #define CONCAT2(A,B)    _CONCAT2(A,B)
1701 #define _CONCAT2(A,B)   A##B
1702
1703 /* All of these would be present in a full C99 implementation of <math.h>
1704    and <complex.h>.  Our problem is that only a few systems have such full
1705    implementations.  Further, libgcc_s.so isn't currently linked against
1706    libm.so, and even for systems that do provide full C99, the extra overhead
1707    of all programs using libgcc having to link against libm.  So avoid it.  */
1708
1709 #define isnan(x)        __builtin_expect ((x) != (x), 0)
1710 #define isfinite(x)     __builtin_expect (!isnan((x) - (x)), 1)
1711 #define isinf(x)        __builtin_expect (!isnan(x) & !isfinite(x), 0)
1712
1713 #define INFINITY        CONCAT2(__builtin_inf, CEXT) ()
1714 #define I               1i
1715
1716 /* Helpers to make the following code slightly less gross.  */
1717 #define COPYSIGN        CONCAT2(__builtin_copysign, CEXT)
1718 #define FABS            CONCAT2(__builtin_fabs, CEXT)
1719
1720 /* Verify that MTYPE matches up with CEXT.  */
1721 extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
1722
1723 /* Ensure that we've lost any extra precision.  */
1724 #if NOTRUNC
1725 # define TRUNC(x)
1726 #else
1727 # define TRUNC(x)       __asm__ ("" : "=m"(x) : "m"(x))
1728 #endif
1729
1730 #if defined(L_mulsc3) || defined(L_muldc3) \
1731     || defined(L_mulxc3) || defined(L_multc3)
1732
1733 CTYPE
1734 CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
1735 {
1736   MTYPE ac, bd, ad, bc, x, y;
1737
1738   ac = a * c;
1739   bd = b * d;
1740   ad = a * d;
1741   bc = b * c;
1742
1743   TRUNC (ac);
1744   TRUNC (bd);
1745   TRUNC (ad);
1746   TRUNC (bc);
1747
1748   x = ac - bd;
1749   y = ad + bc;
1750
1751   if (isnan (x) && isnan (y))
1752     {
1753       /* Recover infinities that computed as NaN + iNaN.  */
1754       _Bool recalc = 0;
1755       if (isinf (a) || isinf (b))
1756         {
1757           /* z is infinite.  "Box" the infinity and change NaNs in
1758              the other factor to 0.  */
1759           a = COPYSIGN (isinf (a) ? 1 : 0, a);
1760           b = COPYSIGN (isinf (b) ? 1 : 0, b);
1761           if (isnan (c)) c = COPYSIGN (0, c);
1762           if (isnan (d)) d = COPYSIGN (0, d);
1763           recalc = 1;
1764         }
1765      if (isinf (c) || isinf (d))
1766         {
1767           /* w is infinite.  "Box" the infinity and change NaNs in
1768              the other factor to 0.  */
1769           c = COPYSIGN (isinf (c) ? 1 : 0, c);
1770           d = COPYSIGN (isinf (d) ? 1 : 0, d);
1771           if (isnan (a)) a = COPYSIGN (0, a);
1772           if (isnan (b)) b = COPYSIGN (0, b);
1773           recalc = 1;
1774         }
1775      if (!recalc
1776           && (isinf (ac) || isinf (bd)
1777               || isinf (ad) || isinf (bc)))
1778         {
1779           /* Recover infinities from overflow by changing NaNs to 0.  */
1780           if (isnan (a)) a = COPYSIGN (0, a);
1781           if (isnan (b)) b = COPYSIGN (0, b);
1782           if (isnan (c)) c = COPYSIGN (0, c);
1783           if (isnan (d)) d = COPYSIGN (0, d);
1784           recalc = 1;
1785         }
1786       if (recalc)
1787         {
1788           x = INFINITY * (a * c - b * d);
1789           y = INFINITY * (a * d + b * c);
1790         }
1791     }
1792
1793   return x + I * y;
1794 }
1795 #endif /* complex multiply */
1796
1797 #if defined(L_divsc3) || defined(L_divdc3) \
1798     || defined(L_divxc3) || defined(L_divtc3)
1799
1800 CTYPE
1801 CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
1802 {
1803   MTYPE denom, ratio, x, y;
1804
1805   /* ??? We can get better behavior from logarithmic scaling instead of 
1806      the division.  But that would mean starting to link libgcc against
1807      libm.  We could implement something akin to ldexp/frexp as gcc builtins
1808      fairly easily...  */
1809   if (FABS (c) < FABS (d))
1810     {
1811       ratio = c / d;
1812       denom = (c * ratio) + d;
1813       x = ((a * ratio) + b) / denom;
1814       y = ((b * ratio) - a) / denom;
1815     }
1816   else
1817     {
1818       ratio = d / c;
1819       denom = (d * ratio) + c;
1820       x = ((b * ratio) + a) / denom;
1821       y = (b - (a * ratio)) / denom;
1822     }
1823
1824   /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
1825      are nonzero/zero, infinite/finite, and finite/infinite.  */
1826   if (isnan (x) && isnan (y))
1827     {
1828       if (denom == 0.0 && (!isnan (a) || !isnan (b)))
1829         {
1830           x = COPYSIGN (INFINITY, c) * a;
1831           y = COPYSIGN (INFINITY, c) * b;
1832         }
1833       else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
1834         {
1835           a = COPYSIGN (isinf (a) ? 1 : 0, a);
1836           b = COPYSIGN (isinf (b) ? 1 : 0, b);
1837           x = INFINITY * (a * c + b * d);
1838           y = INFINITY * (b * c - a * d);
1839         }
1840       else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
1841         {
1842           c = COPYSIGN (isinf (c) ? 1 : 0, c);
1843           d = COPYSIGN (isinf (d) ? 1 : 0, d);
1844           x = 0.0 * (a * c + b * d);
1845           y = 0.0 * (b * c - a * d);
1846         }
1847     }
1848
1849   return x + I * y;
1850 }
1851 #endif /* complex divide */
1852
1853 #endif /* all complex float routines */
1854 \f
1855 /* From here on down, the routines use normal data types.  */
1856
1857 #define SItype bogus_type
1858 #define USItype bogus_type
1859 #define DItype bogus_type
1860 #define UDItype bogus_type
1861 #define SFtype bogus_type
1862 #define DFtype bogus_type
1863 #undef Wtype
1864 #undef UWtype
1865 #undef HWtype
1866 #undef UHWtype
1867 #undef DWtype
1868 #undef UDWtype
1869
1870 #undef char
1871 #undef short
1872 #undef int
1873 #undef long
1874 #undef unsigned
1875 #undef float
1876 #undef double
1877 \f
1878 #ifdef L__gcc_bcmp
1879
1880 /* Like bcmp except the sign is meaningful.
1881    Result is negative if S1 is less than S2,
1882    positive if S1 is greater, 0 if S1 and S2 are equal.  */
1883
1884 int
1885 __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
1886 {
1887   while (size > 0)
1888     {
1889       const unsigned char c1 = *s1++, c2 = *s2++;
1890       if (c1 != c2)
1891         return c1 - c2;
1892       size--;
1893     }
1894   return 0;
1895 }
1896
1897 #endif
1898 \f
1899 /* __eprintf used to be used by GCC's private version of <assert.h>.
1900    We no longer provide that header, but this routine remains in libgcc.a
1901    for binary backward compatibility.  Note that it is not included in
1902    the shared version of libgcc.  */
1903 #ifdef L_eprintf
1904 #ifndef inhibit_libc
1905
1906 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch.  */
1907 #include <stdio.h>
1908
1909 void
1910 __eprintf (const char *string, const char *expression,
1911            unsigned int line, const char *filename)
1912 {
1913   fprintf (stderr, string, expression, line, filename);
1914   fflush (stderr);
1915   abort ();
1916 }
1917
1918 #endif
1919 #endif
1920
1921 \f
1922 #ifdef L_clear_cache
1923 /* Clear part of an instruction cache.  */
1924
1925 void
1926 __clear_cache (char *beg __attribute__((__unused__)),
1927                char *end __attribute__((__unused__)))
1928 {
1929 #ifdef CLEAR_INSN_CACHE
1930   CLEAR_INSN_CACHE (beg, end);
1931 #endif /* CLEAR_INSN_CACHE */
1932 }
1933
1934 #endif /* L_clear_cache */
1935 \f
1936 #ifdef L_enable_execute_stack
1937 /* Attempt to turn on execute permission for the stack.  */
1938
1939 #ifdef ENABLE_EXECUTE_STACK
1940   ENABLE_EXECUTE_STACK
1941 #else
1942 void
1943 __enable_execute_stack (void *addr __attribute__((__unused__)))
1944 {}
1945 #endif /* ENABLE_EXECUTE_STACK */
1946
1947 #endif /* L_enable_execute_stack */
1948 \f
1949 #ifdef L_trampoline
1950
1951 /* Jump to a trampoline, loading the static chain address.  */
1952
1953 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1954
1955 int
1956 getpagesize (void)
1957 {
1958 #ifdef _ALPHA_
1959   return 8192;
1960 #else
1961   return 4096;
1962 #endif
1963 }
1964
1965 #ifdef __i386__
1966 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1967 #endif
1968
1969 int
1970 mprotect (char *addr, int len, int prot)
1971 {
1972   int np, op;
1973
1974   if (prot == 7)
1975     np = 0x40;
1976   else if (prot == 5)
1977     np = 0x20;
1978   else if (prot == 4)
1979     np = 0x10;
1980   else if (prot == 3)
1981     np = 0x04;
1982   else if (prot == 1)
1983     np = 0x02;
1984   else if (prot == 0)
1985     np = 0x01;
1986
1987   if (VirtualProtect (addr, len, np, &op))
1988     return 0;
1989   else
1990     return -1;
1991 }
1992
1993 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1994
1995 #ifdef TRANSFER_FROM_TRAMPOLINE
1996 TRANSFER_FROM_TRAMPOLINE
1997 #endif
1998 #endif /* L_trampoline */
1999 \f
2000 #ifndef __CYGWIN__
2001 #ifdef L__main
2002
2003 #include "gbl-ctors.h"
2004
2005 /* Some systems use __main in a way incompatible with its use in gcc, in these
2006    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2007    give the same symbol without quotes for an alternative entry point.  You
2008    must define both, or neither.  */
2009 #ifndef NAME__MAIN
2010 #define NAME__MAIN "__main"
2011 #define SYMBOL__MAIN __main
2012 #endif
2013
2014 #if defined (INIT_SECTION_ASM_OP) || defined (INIT_ARRAY_SECTION_ASM_OP)
2015 #undef HAS_INIT_SECTION
2016 #define HAS_INIT_SECTION
2017 #endif
2018
2019 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
2020
2021 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
2022    code to run constructors.  In that case, we need to handle EH here, too.  */
2023
2024 #ifdef EH_FRAME_SECTION_NAME
2025 #include "unwind-dw2-fde.h"
2026 extern unsigned char __EH_FRAME_BEGIN__[];
2027 #endif
2028
2029 /* Run all the global destructors on exit from the program.  */
2030
2031 void
2032 __do_global_dtors (void)
2033 {
2034 #ifdef DO_GLOBAL_DTORS_BODY
2035   DO_GLOBAL_DTORS_BODY;
2036 #else
2037   static func_ptr *p = __DTOR_LIST__ + 1;
2038   while (*p)
2039     {
2040       p++;
2041       (*(p-1)) ();
2042     }
2043 #endif
2044 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
2045   {
2046     static int completed = 0;
2047     if (! completed)
2048       {
2049         completed = 1;
2050         __deregister_frame_info (__EH_FRAME_BEGIN__);
2051       }
2052   }
2053 #endif
2054 }
2055 #endif
2056
2057 #ifndef HAS_INIT_SECTION
2058 /* Run all the global constructors on entry to the program.  */
2059
2060 void
2061 __do_global_ctors (void)
2062 {
2063 #ifdef EH_FRAME_SECTION_NAME
2064   {
2065     static struct object object;
2066     __register_frame_info (__EH_FRAME_BEGIN__, &object);
2067   }
2068 #endif
2069   DO_GLOBAL_CTORS_BODY;
2070   atexit (__do_global_dtors);
2071 }
2072 #endif /* no HAS_INIT_SECTION */
2073
2074 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
2075 /* Subroutine called automatically by `main'.
2076    Compiling a global function named `main'
2077    produces an automatic call to this function at the beginning.
2078
2079    For many systems, this routine calls __do_global_ctors.
2080    For systems which support a .init section we use the .init section
2081    to run __do_global_ctors, so we need not do anything here.  */
2082
2083 extern void SYMBOL__MAIN (void);
2084 void
2085 SYMBOL__MAIN (void)
2086 {
2087   /* Support recursive calls to `main': run initializers just once.  */
2088   static int initialized;
2089   if (! initialized)
2090     {
2091       initialized = 1;
2092       __do_global_ctors ();
2093     }
2094 }
2095 #endif /* no HAS_INIT_SECTION or INVOKE__main */
2096
2097 #endif /* L__main */
2098 #endif /* __CYGWIN__ */
2099 \f
2100 #ifdef L_ctors
2101
2102 #include "gbl-ctors.h"
2103
2104 /* Provide default definitions for the lists of constructors and
2105    destructors, so that we don't get linker errors.  These symbols are
2106    intentionally bss symbols, so that gld and/or collect will provide
2107    the right values.  */
2108
2109 /* We declare the lists here with two elements each,
2110    so that they are valid empty lists if no other definition is loaded.
2111
2112    If we are using the old "set" extensions to have the gnu linker
2113    collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
2114    must be in the bss/common section.
2115
2116    Long term no port should use those extensions.  But many still do.  */
2117 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2118 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
2119 func_ptr __CTOR_LIST__[2] = {0, 0};
2120 func_ptr __DTOR_LIST__[2] = {0, 0};
2121 #else
2122 func_ptr __CTOR_LIST__[2];
2123 func_ptr __DTOR_LIST__[2];
2124 #endif
2125 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
2126 #endif /* L_ctors */