OSDN Git Service

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