libgcc2.c (__popcountSI2): Don't use wide type for iterator and result.
[gcc.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 int 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 int 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 */