1 /* More subroutines needed by GCC output code on some machines. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989-2016 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
28 #include "coretypes.h"
30 #include "libgcc_tm.h"
32 #ifdef HAVE_GAS_HIDDEN
33 #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
35 #define ATTRIBUTE_HIDDEN
38 /* Work out the largest "word" size that we can deal with on this target. */
39 #if MIN_UNITS_PER_WORD > 4
40 # define LIBGCC2_MAX_UNITS_PER_WORD 8
41 #elif (MIN_UNITS_PER_WORD > 2 \
42 || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4))
43 # define LIBGCC2_MAX_UNITS_PER_WORD 4
45 # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD
48 /* Work out what word size we are using for this compilation.
49 The value can be set on the command line. */
50 #ifndef LIBGCC2_UNITS_PER_WORD
51 #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD
54 #if LIBGCC2_UNITS_PER_WORD <= LIBGCC2_MAX_UNITS_PER_WORD
58 #ifdef DECLARE_LIBRARY_RENAMES
59 DECLARE_LIBRARY_RENAMES
62 #if defined (L_negdi2)
66 const DWunion uu
= {.ll
= u
};
67 const DWunion w
= { {.low
= -uu
.s
.low
,
68 .high
= -uu
.s
.high
- ((UWtype
) -uu
.s
.low
> 0) } };
76 __addvSI3 (Wtype a
, Wtype b
)
78 const Wtype w
= (UWtype
) a
+ (UWtype
) b
;
80 if (b
>= 0 ? w
< a
: w
> a
)
85 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
87 __addvsi3 (SItype a
, SItype b
)
89 const SItype w
= (USItype
) a
+ (USItype
) b
;
91 if (b
>= 0 ? w
< a
: w
> a
)
96 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
101 __addvDI3 (DWtype a
, DWtype b
)
103 const DWtype w
= (UDWtype
) a
+ (UDWtype
) b
;
105 if (b
>= 0 ? w
< a
: w
> a
)
114 __subvSI3 (Wtype a
, Wtype b
)
116 const Wtype w
= (UWtype
) a
- (UWtype
) b
;
118 if (b
>= 0 ? w
> a
: w
< a
)
123 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
125 __subvsi3 (SItype a
, SItype b
)
127 const SItype w
= (USItype
) a
- (USItype
) b
;
129 if (b
>= 0 ? w
> a
: w
< a
)
134 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
139 __subvDI3 (DWtype a
, DWtype b
)
141 const DWtype w
= (UDWtype
) a
- (UDWtype
) b
;
143 if (b
>= 0 ? w
> a
: w
< a
)
152 __mulvSI3 (Wtype a
, Wtype b
)
154 const DWtype w
= (DWtype
) a
* (DWtype
) b
;
156 if ((Wtype
) (w
>> W_TYPE_SIZE
) != (Wtype
) w
>> (W_TYPE_SIZE
- 1))
161 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
163 #define WORD_SIZE (sizeof (SItype) * __CHAR_BIT__)
165 __mulvsi3 (SItype a
, SItype b
)
167 const DItype w
= (DItype
) a
* (DItype
) b
;
169 if ((SItype
) (w
>> WORD_SIZE
) != (SItype
) w
>> (WORD_SIZE
-1))
174 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
181 const Wtype w
= -(UWtype
) a
;
183 if (a
>= 0 ? w
> 0 : w
< 0)
188 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
192 const SItype w
= -(USItype
) a
;
194 if (a
>= 0 ? w
> 0 : w
< 0)
199 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
206 const DWtype w
= -(UDWtype
) a
;
208 if (a
>= 0 ? w
> 0 : w
< 0)
233 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
251 #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
276 __mulvDI3 (DWtype u
, DWtype v
)
278 /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
279 but the checked multiplication needs only two. */
280 const DWunion uu
= {.ll
= u
};
281 const DWunion vv
= {.ll
= v
};
283 if (__builtin_expect (uu
.s
.high
== uu
.s
.low
>> (W_TYPE_SIZE
- 1), 1))
285 /* u fits in a single Wtype. */
286 if (__builtin_expect (vv
.s
.high
== vv
.s
.low
>> (W_TYPE_SIZE
- 1), 1))
288 /* v fits in a single Wtype as well. */
289 /* A single multiplication. No overflow risk. */
290 return (DWtype
) uu
.s
.low
* (DWtype
) vv
.s
.low
;
294 /* Two multiplications. */
295 DWunion w0
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
296 * (UDWtype
) (UWtype
) vv
.s
.low
};
297 DWunion w1
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
298 * (UDWtype
) (UWtype
) vv
.s
.high
};
301 w1
.s
.high
-= uu
.s
.low
;
304 w1
.ll
+= (UWtype
) w0
.s
.high
;
305 if (__builtin_expect (w1
.s
.high
== w1
.s
.low
>> (W_TYPE_SIZE
- 1), 1))
307 w0
.s
.high
= w1
.s
.low
;
314 if (__builtin_expect (vv
.s
.high
== vv
.s
.low
>> (W_TYPE_SIZE
- 1), 1))
316 /* v fits into a single Wtype. */
317 /* Two multiplications. */
318 DWunion w0
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
319 * (UDWtype
) (UWtype
) vv
.s
.low
};
320 DWunion w1
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.high
321 * (UDWtype
) (UWtype
) vv
.s
.low
};
324 w1
.s
.high
-= vv
.s
.low
;
327 w1
.ll
+= (UWtype
) w0
.s
.high
;
328 if (__builtin_expect (w1
.s
.high
== w1
.s
.low
>> (W_TYPE_SIZE
- 1), 1))
330 w0
.s
.high
= w1
.s
.low
;
336 /* A few sign checks and a single multiplication. */
341 if (uu
.s
.high
== 0 && vv
.s
.high
== 0)
343 const DWtype w
= (UDWtype
) (UWtype
) uu
.s
.low
344 * (UDWtype
) (UWtype
) vv
.s
.low
;
345 if (__builtin_expect (w
>= 0, 1))
351 if (uu
.s
.high
== 0 && vv
.s
.high
== (Wtype
) -1)
353 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
354 * (UDWtype
) (UWtype
) vv
.s
.low
};
356 ww
.s
.high
-= uu
.s
.low
;
357 if (__builtin_expect (ww
.s
.high
< 0, 1))
366 if (uu
.s
.high
== (Wtype
) -1 && vv
.s
.high
== 0)
368 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
369 * (UDWtype
) (UWtype
) vv
.s
.low
};
371 ww
.s
.high
-= vv
.s
.low
;
372 if (__builtin_expect (ww
.s
.high
< 0, 1))
378 if (uu
.s
.high
== (Wtype
) -1 && vv
.s
.high
== (Wtype
) - 1)
380 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
381 * (UDWtype
) (UWtype
) vv
.s
.low
};
383 ww
.s
.high
-= uu
.s
.low
;
384 ww
.s
.high
-= vv
.s
.low
;
385 if (__builtin_expect (ww
.s
.high
>= 0, 1))
399 /* Unless shift functions are defined with full ANSI prototypes,
400 parameter b will be promoted to int if shift_count_type is smaller than an int. */
403 __lshrdi3 (DWtype u
, shift_count_type b
)
408 const DWunion uu
= {.ll
= u
};
409 const shift_count_type bm
= W_TYPE_SIZE
- b
;
415 w
.s
.low
= (UWtype
) uu
.s
.high
>> -bm
;
419 const UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
421 w
.s
.high
= (UWtype
) uu
.s
.high
>> b
;
422 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
431 __ashldi3 (DWtype u
, shift_count_type b
)
436 const DWunion uu
= {.ll
= u
};
437 const shift_count_type bm
= W_TYPE_SIZE
- b
;
443 w
.s
.high
= (UWtype
) uu
.s
.low
<< -bm
;
447 const UWtype carries
= (UWtype
) uu
.s
.low
>> bm
;
449 w
.s
.low
= (UWtype
) uu
.s
.low
<< b
;
450 w
.s
.high
= ((UWtype
) uu
.s
.high
<< b
) | carries
;
459 __ashrdi3 (DWtype u
, shift_count_type b
)
464 const DWunion uu
= {.ll
= u
};
465 const shift_count_type bm
= W_TYPE_SIZE
- b
;
470 /* w.s.high = 1..1 or 0..0 */
471 w
.s
.high
= uu
.s
.high
>> (W_TYPE_SIZE
- 1);
472 w
.s
.low
= uu
.s
.high
>> -bm
;
476 const UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
478 w
.s
.high
= uu
.s
.high
>> b
;
479 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
488 __bswapsi2 (SItype u
)
490 return ((((u
) & 0xff000000) >> 24)
491 | (((u
) & 0x00ff0000) >> 8)
492 | (((u
) & 0x0000ff00) << 8)
493 | (((u
) & 0x000000ff) << 24));
498 __bswapdi2 (DItype u
)
500 return ((((u
) & 0xff00000000000000ull
) >> 56)
501 | (((u
) & 0x00ff000000000000ull
) >> 40)
502 | (((u
) & 0x0000ff0000000000ull
) >> 24)
503 | (((u
) & 0x000000ff00000000ull
) >> 8)
504 | (((u
) & 0x00000000ff000000ull
) << 8)
505 | (((u
) & 0x0000000000ff0000ull
) << 24)
506 | (((u
) & 0x000000000000ff00ull
) << 40)
507 | (((u
) & 0x00000000000000ffull
) << 56));
520 count_trailing_zeros (count
, u
);
530 const DWunion uu
= {.ll
= u
};
531 UWtype word
, count
, add
;
534 word
= uu
.s
.low
, add
= 0;
535 else if (uu
.s
.high
!= 0)
536 word
= uu
.s
.high
, add
= W_TYPE_SIZE
;
540 count_trailing_zeros (count
, word
);
541 return count
+ add
+ 1;
547 __muldi3 (DWtype u
, DWtype v
)
549 const DWunion uu
= {.ll
= u
};
550 const DWunion vv
= {.ll
= v
};
551 DWunion w
= {.ll
= __umulsidi3 (uu
.s
.low
, vv
.s
.low
)};
553 w
.s
.high
+= ((UWtype
) uu
.s
.low
* (UWtype
) vv
.s
.high
554 + (UWtype
) uu
.s
.high
* (UWtype
) vv
.s
.low
);
560 #if (defined (L_udivdi3) || defined (L_divdi3) || \
561 defined (L_umoddi3) || defined (L_moddi3))
562 #if defined (sdiv_qrnnd)
563 #define L_udiv_w_sdiv
568 #if defined (sdiv_qrnnd)
569 #if (defined (L_udivdi3) || defined (L_divdi3) || \
570 defined (L_umoddi3) || defined (L_moddi3))
571 static inline __attribute__ ((__always_inline__
))
574 __udiv_w_sdiv (UWtype
*rp
, UWtype a1
, UWtype a0
, UWtype d
)
581 if (a1
< d
- a1
- (a0
>> (W_TYPE_SIZE
- 1)))
583 /* Dividend, divisor, and quotient are nonnegative. */
584 sdiv_qrnnd (q
, r
, a1
, a0
, d
);
588 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d. */
589 sub_ddmmss (c1
, c0
, a1
, a0
, d
>> 1, d
<< (W_TYPE_SIZE
- 1));
590 /* Divide (c1*2^32 + c0) by d. */
591 sdiv_qrnnd (q
, r
, c1
, c0
, d
);
592 /* Add 2^31 to quotient. */
593 q
+= (UWtype
) 1 << (W_TYPE_SIZE
- 1);
598 b1
= d
>> 1; /* d/2, between 2^30 and 2^31 - 1 */
599 c1
= a1
>> 1; /* A/2 */
600 c0
= (a1
<< (W_TYPE_SIZE
- 1)) + (a0
>> 1);
602 if (a1
< b1
) /* A < 2^32*b1, so A/2 < 2^31*b1 */
604 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
606 r
= 2*r
+ (a0
& 1); /* Remainder from A/(2*b1) */
623 else if (c1
< b1
) /* So 2^31 <= (A/2)/b1 < 2^32 */
626 c0
= ~c0
; /* logical NOT */
628 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
630 q
= ~q
; /* (A/2)/b1 */
633 r
= 2*r
+ (a0
& 1); /* A/(2*b1) */
651 else /* Implies c1 = b1 */
652 { /* Hence a1 = d - 1 = 2*b1 - 1 */
670 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
672 __udiv_w_sdiv (UWtype
*rp
__attribute__ ((__unused__
)),
673 UWtype a1
__attribute__ ((__unused__
)),
674 UWtype a0
__attribute__ ((__unused__
)),
675 UWtype d
__attribute__ ((__unused__
)))
682 #if (defined (L_udivdi3) || defined (L_divdi3) || \
683 defined (L_umoddi3) || defined (L_moddi3))
688 const UQItype __clz_tab
[256] =
690 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,
691 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,
692 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,
693 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,
694 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,
695 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,
696 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,
697 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
708 count_leading_zeros (ret
, x
);
719 const DWunion uu
= {.ll
= x
};
724 word
= uu
.s
.high
, add
= 0;
726 word
= uu
.s
.low
, add
= W_TYPE_SIZE
;
728 count_leading_zeros (ret
, word
);
740 count_trailing_zeros (ret
, x
);
751 const DWunion uu
= {.ll
= x
};
756 word
= uu
.s
.low
, add
= 0;
758 word
= uu
.s
.high
, add
= W_TYPE_SIZE
;
760 count_trailing_zeros (ret
, word
);
775 return W_TYPE_SIZE
- 1;
776 count_leading_zeros (ret
, x
);
784 __clrsbDI2 (DWtype x
)
786 const DWunion uu
= {.ll
= x
};
791 word
= uu
.s
.low
, add
= W_TYPE_SIZE
;
792 else if (uu
.s
.high
== -1)
793 word
= ~uu
.s
.low
, add
= W_TYPE_SIZE
;
794 else if (uu
.s
.high
>= 0)
795 word
= uu
.s
.high
, add
= 0;
797 word
= ~uu
.s
.high
, add
= 0;
802 count_leading_zeros (ret
, word
);
804 return ret
+ add
- 1;
808 #ifdef L_popcount_tab
809 const UQItype __popcount_tab
[256] =
811 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,
812 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,
813 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,
814 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,
815 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,
816 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,
817 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,
818 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
822 #if defined(L_popcountsi2) || defined(L_popcountdi2)
823 #define POPCOUNTCST2(x) (((UWtype) x << __CHAR_BIT__) | x)
824 #define POPCOUNTCST4(x) (((UWtype) x << (2 * __CHAR_BIT__)) | x)
825 #define POPCOUNTCST8(x) (((UWtype) x << (4 * __CHAR_BIT__)) | x)
826 #if W_TYPE_SIZE == __CHAR_BIT__
827 #define POPCOUNTCST(x) x
828 #elif W_TYPE_SIZE == 2 * __CHAR_BIT__
829 #define POPCOUNTCST(x) POPCOUNTCST2 (x)
830 #elif W_TYPE_SIZE == 4 * __CHAR_BIT__
831 #define POPCOUNTCST(x) POPCOUNTCST4 (POPCOUNTCST2 (x))
832 #elif W_TYPE_SIZE == 8 * __CHAR_BIT__
833 #define POPCOUNTCST(x) POPCOUNTCST8 (POPCOUNTCST4 (POPCOUNTCST2 (x)))
840 __popcountSI2 (UWtype x
)
842 /* Force table lookup on targets like AVR and RL78 which only
843 pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
844 have 1, and other small word targets. */
845 #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
846 x
= x
- ((x
>> 1) & POPCOUNTCST (0x55));
847 x
= (x
& POPCOUNTCST (0x33)) + ((x
>> 2) & POPCOUNTCST (0x33));
848 x
= (x
+ (x
>> 4)) & POPCOUNTCST (0x0F);
849 return (x
* POPCOUNTCST (0x01)) >> (W_TYPE_SIZE
- __CHAR_BIT__
);
853 for (i
= 0; i
< W_TYPE_SIZE
; i
+= 8)
854 ret
+= __popcount_tab
[(x
>> i
) & 0xff];
864 __popcountDI2 (UDWtype x
)
866 /* Force table lookup on targets like AVR and RL78 which only
867 pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
868 have 1, and other small word targets. */
869 #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
870 const DWunion uu
= {.ll
= x
};
871 UWtype x1
= uu
.s
.low
, x2
= uu
.s
.high
;
872 x1
= x1
- ((x1
>> 1) & POPCOUNTCST (0x55));
873 x2
= x2
- ((x2
>> 1) & POPCOUNTCST (0x55));
874 x1
= (x1
& POPCOUNTCST (0x33)) + ((x1
>> 2) & POPCOUNTCST (0x33));
875 x2
= (x2
& POPCOUNTCST (0x33)) + ((x2
>> 2) & POPCOUNTCST (0x33));
876 x1
= (x1
+ (x1
>> 4)) & POPCOUNTCST (0x0F);
877 x2
= (x2
+ (x2
>> 4)) & POPCOUNTCST (0x0F);
879 return (x1
* POPCOUNTCST (0x01)) >> (W_TYPE_SIZE
- __CHAR_BIT__
);
883 for (i
= 0; i
< 2*W_TYPE_SIZE
; i
+= 8)
884 ret
+= __popcount_tab
[(x
>> i
) & 0xff];
894 __paritySI2 (UWtype x
)
897 # error "fill out the table"
908 return (0x6996 >> x
) & 1;
915 __parityDI2 (UDWtype x
)
917 const DWunion uu
= {.ll
= x
};
918 UWtype nx
= uu
.s
.low
^ uu
.s
.high
;
921 # error "fill out the table"
932 return (0x6996 >> nx
) & 1;
937 #ifdef TARGET_HAS_NO_HW_DIVIDE
939 #if (defined (L_udivdi3) || defined (L_divdi3) || \
940 defined (L_umoddi3) || defined (L_moddi3))
941 static inline __attribute__ ((__always_inline__
))
944 __udivmoddi4 (UDWtype n
, UDWtype d
, UDWtype
*rp
)
946 UDWtype q
= 0, r
= n
, y
= d
;
947 UWtype lz1
, lz2
, i
, k
;
949 /* Implements align divisor shift dividend method. This algorithm
950 aligns the divisor under the dividend and then perform number of
951 test-subtract iterations which shift the dividend left. Number of
952 iterations is k + 1 where k is the number of bit positions the
953 divisor must be shifted left to align it under the dividend.
954 quotient bits can be saved in the rightmost positions of the dividend
955 as it shifts left on each test-subtract iteration. */
959 lz1
= __builtin_clzll (d
);
960 lz2
= __builtin_clzll (n
);
965 /* Dividend can exceed 2 ^ (width − 1) − 1 but still be less than the
966 aligned divisor. Normal iteration can drops the high order bit
967 of the dividend. Therefore, first test-subtract iteration is a
968 special case, saving its quotient bit in a separate location and
969 not shifting the dividend. */
980 /* k additional iterations where k regular test subtract shift
981 dividend iterations are done. */
986 r
= ((r
- y
) << 1) + 1;
992 /* First quotient bit is combined with the quotient bits resulting
993 from the k regular iterations. */
1006 #if (defined (L_udivdi3) || defined (L_divdi3) || \
1007 defined (L_umoddi3) || defined (L_moddi3))
1008 static inline __attribute__ ((__always_inline__
))
1011 __udivmoddi4 (UDWtype n
, UDWtype d
, UDWtype
*rp
)
1013 const DWunion nn
= {.ll
= n
};
1014 const DWunion dd
= {.ll
= d
};
1016 UWtype d0
, d1
, n0
, n1
, n2
;
1025 #if !UDIV_NEEDS_NORMALIZATION
1032 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
1035 /* Remainder in n0. */
1042 d0
= 1 / d0
; /* Divide intentionally by zero. */
1044 udiv_qrnnd (q1
, n1
, 0, n1
, d0
);
1045 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
1047 /* Remainder in n0. */
1058 #else /* UDIV_NEEDS_NORMALIZATION */
1066 count_leading_zeros (bm
, d0
);
1070 /* Normalize, i.e. make the most significant bit of the
1074 n1
= (n1
<< bm
) | (n0
>> (W_TYPE_SIZE
- bm
));
1078 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
1081 /* Remainder in n0 >> bm. */
1088 d0
= 1 / d0
; /* Divide intentionally by zero. */
1090 count_leading_zeros (bm
, d0
);
1094 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
1095 conclude (the most significant bit of n1 is set) /\ (the
1096 leading quotient digit q1 = 1).
1098 This special case is necessary, not an optimization.
1099 (Shifts counts of W_TYPE_SIZE are undefined.) */
1108 b
= W_TYPE_SIZE
- bm
;
1112 n1
= (n1
<< bm
) | (n0
>> b
);
1115 udiv_qrnnd (q1
, n1
, n2
, n1
, d0
);
1120 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
1122 /* Remainder in n0 >> bm. */
1127 rr
.s
.low
= n0
>> bm
;
1132 #endif /* UDIV_NEEDS_NORMALIZATION */
1143 /* Remainder in n1n0. */
1155 count_leading_zeros (bm
, d1
);
1158 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
1159 conclude (the most significant bit of n1 is set) /\ (the
1160 quotient digit q0 = 0 or 1).
1162 This special case is necessary, not an optimization. */
1164 /* The condition on the next line takes advantage of that
1165 n1 >= d1 (true due to program flow). */
1166 if (n1
> d1
|| n0
>= d0
)
1169 sub_ddmmss (n1
, n0
, n1
, n0
, d1
, d0
);
1188 b
= W_TYPE_SIZE
- bm
;
1190 d1
= (d1
<< bm
) | (d0
>> b
);
1193 n1
= (n1
<< bm
) | (n0
>> b
);
1196 udiv_qrnnd (q0
, n1
, n2
, n1
, d1
);
1197 umul_ppmm (m1
, m0
, q0
, d0
);
1199 if (m1
> n1
|| (m1
== n1
&& m0
> n0
))
1202 sub_ddmmss (m1
, m0
, m1
, m0
, d1
, d0
);
1207 /* Remainder in (n1n0 - m1m0) >> bm. */
1210 sub_ddmmss (n1
, n0
, n1
, n0
, m1
, m0
);
1211 rr
.s
.low
= (n1
<< b
) | (n0
>> bm
);
1212 rr
.s
.high
= n1
>> bm
;
1219 const DWunion ww
= {{.low
= q0
, .high
= q1
}};
1227 __divdi3 (DWtype u
, DWtype v
)
1230 DWunion uu
= {.ll
= u
};
1231 DWunion vv
= {.ll
= v
};
1241 w
= __udivmoddi4 (uu
.ll
, vv
.ll
, (UDWtype
*) 0);
1251 __moddi3 (DWtype u
, DWtype v
)
1254 DWunion uu
= {.ll
= u
};
1255 DWunion vv
= {.ll
= v
};
1264 (void) __udivmoddi4 (uu
.ll
, vv
.ll
, (UDWtype
*)&w
);
1274 __umoddi3 (UDWtype u
, UDWtype v
)
1278 (void) __udivmoddi4 (u
, v
, &w
);
1286 __udivdi3 (UDWtype n
, UDWtype d
)
1288 return __udivmoddi4 (n
, d
, (UDWtype
*) 0);
1294 __cmpdi2 (DWtype a
, DWtype b
)
1296 const DWunion au
= {.ll
= a
};
1297 const DWunion bu
= {.ll
= b
};
1299 if (au
.s
.high
< bu
.s
.high
)
1301 else if (au
.s
.high
> bu
.s
.high
)
1303 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
1305 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
1313 __ucmpdi2 (DWtype a
, DWtype b
)
1315 const DWunion au
= {.ll
= a
};
1316 const DWunion bu
= {.ll
= b
};
1318 if ((UWtype
) au
.s
.high
< (UWtype
) bu
.s
.high
)
1320 else if ((UWtype
) au
.s
.high
> (UWtype
) bu
.s
.high
)
1322 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
1324 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
1330 #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
1332 __fixunstfDI (TFtype a
)
1337 /* Compute high word of result, as a flonum. */
1338 const TFtype b
= (a
/ Wtype_MAXp1_F
);
1339 /* Convert that to fixed (but not to DWtype!),
1340 and shift it into the high word. */
1341 UDWtype v
= (UWtype
) b
;
1343 /* Remove high part from the TFtype, leaving the low part as flonum. */
1345 /* Convert that to fixed (but not to DWtype!) and add it in.
1346 Sometimes A comes out negative. This is significant, since
1347 A has more bits than a long int does. */
1349 v
-= (UWtype
) (- a
);
1356 #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
1358 __fixtfdi (TFtype a
)
1361 return - __fixunstfDI (-a
);
1362 return __fixunstfDI (a
);
1366 #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
1368 __fixunsxfDI (XFtype a
)
1373 /* Compute high word of result, as a flonum. */
1374 const XFtype b
= (a
/ Wtype_MAXp1_F
);
1375 /* Convert that to fixed (but not to DWtype!),
1376 and shift it into the high word. */
1377 UDWtype v
= (UWtype
) b
;
1379 /* Remove high part from the XFtype, leaving the low part as flonum. */
1381 /* Convert that to fixed (but not to DWtype!) and add it in.
1382 Sometimes A comes out negative. This is significant, since
1383 A has more bits than a long int does. */
1385 v
-= (UWtype
) (- a
);
1392 #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
1394 __fixxfdi (XFtype a
)
1397 return - __fixunsxfDI (-a
);
1398 return __fixunsxfDI (a
);
1402 #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
1404 __fixunsdfDI (DFtype a
)
1406 /* Get high part of result. The division here will just moves the radix
1407 point and will not cause any rounding. Then the conversion to integral
1408 type chops result as desired. */
1409 const UWtype hi
= a
/ Wtype_MAXp1_F
;
1411 /* Get low part of result. Convert `hi' to floating type and scale it back,
1412 then subtract this from the number being converted. This leaves the low
1413 part. Convert that to integral type. */
1414 const UWtype lo
= a
- (DFtype
) hi
* Wtype_MAXp1_F
;
1416 /* Assemble result from the two parts. */
1417 return ((UDWtype
) hi
<< W_TYPE_SIZE
) | lo
;
1421 #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
1423 __fixdfdi (DFtype a
)
1426 return - __fixunsdfDI (-a
);
1427 return __fixunsdfDI (a
);
1431 #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE
1433 __fixunssfDI (SFtype a
)
1435 #if LIBGCC2_HAS_DF_MODE
1436 /* Convert the SFtype to a DFtype, because that is surely not going
1437 to lose any bits. Some day someone else can write a faster version
1438 that avoids converting to DFtype, and verify it really works right. */
1439 const DFtype dfa
= a
;
1441 /* Get high part of result. The division here will just moves the radix
1442 point and will not cause any rounding. Then the conversion to integral
1443 type chops result as desired. */
1444 const UWtype hi
= dfa
/ Wtype_MAXp1_F
;
1446 /* Get low part of result. Convert `hi' to floating type and scale it back,
1447 then subtract this from the number being converted. This leaves the low
1448 part. Convert that to integral type. */
1449 const UWtype lo
= dfa
- (DFtype
) hi
* Wtype_MAXp1_F
;
1451 /* Assemble result from the two parts. */
1452 return ((UDWtype
) hi
<< W_TYPE_SIZE
) | lo
;
1453 #elif FLT_MANT_DIG < W_TYPE_SIZE
1456 if (a
< Wtype_MAXp1_F
)
1458 if (a
< Wtype_MAXp1_F
* Wtype_MAXp1_F
)
1460 /* Since we know that there are fewer significant bits in the SFmode
1461 quantity than in a word, we know that we can convert out all the
1462 significant bits in one step, and thus avoid losing bits. */
1464 /* ??? This following loop essentially performs frexpf. If we could
1465 use the real libm function, or poke at the actual bits of the fp
1466 format, it would be significantly faster. */
1468 UWtype shift
= 0, counter
;
1472 for (counter
= W_TYPE_SIZE
/ 2; counter
!= 0; counter
>>= 1)
1474 SFtype counterf
= (UWtype
)1 << counter
;
1482 /* Rescale into the range of one word, extract the bits of that
1483 one word, and shift the result into position. */
1486 return (DWtype
)counter
<< shift
;
1495 #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE
1497 __fixsfdi (SFtype a
)
1500 return - __fixunssfDI (-a
);
1501 return __fixunssfDI (a
);
1505 #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
1507 __floatdixf (DWtype u
)
1509 #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
1512 XFtype d
= (Wtype
) (u
>> W_TYPE_SIZE
);
1519 #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE
1521 __floatundixf (UDWtype u
)
1523 #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
1526 XFtype d
= (UWtype
) (u
>> W_TYPE_SIZE
);
1533 #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
1535 __floatditf (DWtype u
)
1537 #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
1540 TFtype d
= (Wtype
) (u
>> W_TYPE_SIZE
);
1547 #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE
1549 __floatunditf (UDWtype u
)
1551 #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
1554 TFtype d
= (UWtype
) (u
>> W_TYPE_SIZE
);
1561 #if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE) \
1562 || (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE)
1563 #define DI_SIZE (W_TYPE_SIZE * 2)
1564 #define F_MODE_OK(SIZE) \
1566 && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1567 && !AVOID_FP_TYPE_CONVERSION(SIZE))
1568 #if defined(L_floatdisf)
1569 #define FUNC __floatdisf
1570 #define FSTYPE SFtype
1571 #define FSSIZE __LIBGCC_SF_MANT_DIG__
1573 #define FUNC __floatdidf
1574 #define FSTYPE DFtype
1575 #define FSSIZE __LIBGCC_DF_MANT_DIG__
1581 #if FSSIZE >= W_TYPE_SIZE
1582 /* When the word size is small, we never get any rounding error. */
1583 FSTYPE f
= (Wtype
) (u
>> W_TYPE_SIZE
);
1587 #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \
1588 || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \
1589 || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1591 #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
1592 # define FSIZE __LIBGCC_DF_MANT_DIG__
1593 # define FTYPE DFtype
1594 #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
1595 # define FSIZE __LIBGCC_XF_MANT_DIG__
1596 # define FTYPE XFtype
1597 #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1598 # define FSIZE __LIBGCC_TF_MANT_DIG__
1599 # define FTYPE TFtype
1604 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1606 /* Protect against double-rounding error.
1607 Represent any low-order bits, that might be truncated by a bit that
1608 won't be lost. The bit can go in anywhere below the rounding position
1609 of the FSTYPE. A fixed mask and bit position handles all usual
1611 if (! (- ((DWtype
) 1 << FSIZE
) < u
1612 && u
< ((DWtype
) 1 << FSIZE
)))
1614 if ((UDWtype
) u
& (REP_BIT
- 1))
1616 u
&= ~ (REP_BIT
- 1);
1621 /* Do the calculation in a wider type so that we don't lose any of
1622 the precision of the high word while multiplying it. */
1623 FTYPE f
= (Wtype
) (u
>> W_TYPE_SIZE
);
1628 #if FSSIZE >= W_TYPE_SIZE - 2
1631 /* Finally, the word size is larger than the number of bits in the
1632 required FSTYPE, and we've got no suitable wider type. The only
1633 way to avoid double rounding is to special case the
1636 /* If there are no high bits set, fall back to one conversion. */
1638 return (FSTYPE
)(Wtype
)u
;
1640 /* Otherwise, find the power of two. */
1641 Wtype hi
= u
>> W_TYPE_SIZE
;
1645 UWtype count
, shift
;
1646 count_leading_zeros (count
, hi
);
1648 /* No leading bits means u == minimum. */
1650 return -(Wtype_MAXp1_F
* (Wtype_MAXp1_F
/ 2));
1652 shift
= 1 + W_TYPE_SIZE
- count
;
1654 /* Shift down the most significant bits. */
1657 /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1658 if ((UWtype
)u
<< (W_TYPE_SIZE
- shift
))
1661 /* Convert the one word of data, and rescale. */
1663 if (shift
== W_TYPE_SIZE
)
1665 /* The following two cases could be merged if we knew that the target
1666 supported a native unsigned->float conversion. More often, we only
1667 have a signed conversion, and have to add extra fixup code. */
1668 else if (shift
== W_TYPE_SIZE
- 1)
1669 e
= Wtype_MAXp1_F
/ 2;
1671 e
= (Wtype
)1 << shift
;
1677 #if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE) \
1678 || (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE)
1679 #define DI_SIZE (W_TYPE_SIZE * 2)
1680 #define F_MODE_OK(SIZE) \
1682 && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1683 && !AVOID_FP_TYPE_CONVERSION(SIZE))
1684 #if defined(L_floatundisf)
1685 #define FUNC __floatundisf
1686 #define FSTYPE SFtype
1687 #define FSSIZE __LIBGCC_SF_MANT_DIG__
1689 #define FUNC __floatundidf
1690 #define FSTYPE DFtype
1691 #define FSSIZE __LIBGCC_DF_MANT_DIG__
1697 #if FSSIZE >= W_TYPE_SIZE
1698 /* When the word size is small, we never get any rounding error. */
1699 FSTYPE f
= (UWtype
) (u
>> W_TYPE_SIZE
);
1703 #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \
1704 || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \
1705 || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1707 #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
1708 # define FSIZE __LIBGCC_DF_MANT_DIG__
1709 # define FTYPE DFtype
1710 #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
1711 # define FSIZE __LIBGCC_XF_MANT_DIG__
1712 # define FTYPE XFtype
1713 #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1714 # define FSIZE __LIBGCC_TF_MANT_DIG__
1715 # define FTYPE TFtype
1720 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1722 /* Protect against double-rounding error.
1723 Represent any low-order bits, that might be truncated by a bit that
1724 won't be lost. The bit can go in anywhere below the rounding position
1725 of the FSTYPE. A fixed mask and bit position handles all usual
1727 if (u
>= ((UDWtype
) 1 << FSIZE
))
1729 if ((UDWtype
) u
& (REP_BIT
- 1))
1731 u
&= ~ (REP_BIT
- 1);
1736 /* Do the calculation in a wider type so that we don't lose any of
1737 the precision of the high word while multiplying it. */
1738 FTYPE f
= (UWtype
) (u
>> W_TYPE_SIZE
);
1743 #if FSSIZE == W_TYPE_SIZE - 1
1746 /* Finally, the word size is larger than the number of bits in the
1747 required FSTYPE, and we've got no suitable wider type. The only
1748 way to avoid double rounding is to special case the
1751 /* If there are no high bits set, fall back to one conversion. */
1753 return (FSTYPE
)(UWtype
)u
;
1755 /* Otherwise, find the power of two. */
1756 UWtype hi
= u
>> W_TYPE_SIZE
;
1758 UWtype count
, shift
;
1759 count_leading_zeros (count
, hi
);
1761 shift
= W_TYPE_SIZE
- count
;
1763 /* Shift down the most significant bits. */
1766 /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1767 if ((UWtype
)u
<< (W_TYPE_SIZE
- shift
))
1770 /* Convert the one word of data, and rescale. */
1772 if (shift
== W_TYPE_SIZE
)
1774 /* The following two cases could be merged if we knew that the target
1775 supported a native unsigned->float conversion. More often, we only
1776 have a signed conversion, and have to add extra fixup code. */
1777 else if (shift
== W_TYPE_SIZE
- 1)
1778 e
= Wtype_MAXp1_F
/ 2;
1780 e
= (Wtype
)1 << shift
;
1786 #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
1788 __fixunsxfSI (XFtype a
)
1790 if (a
>= - (DFtype
) Wtype_MIN
)
1791 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1796 #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
1798 __fixunsdfSI (DFtype a
)
1800 if (a
>= - (DFtype
) Wtype_MIN
)
1801 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1806 #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE
1808 __fixunssfSI (SFtype a
)
1810 if (a
>= - (SFtype
) Wtype_MIN
)
1811 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1816 /* Integer power helper used from __builtin_powi for non-constant
1819 #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \
1820 || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
1821 || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
1822 || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
1823 # if defined(L_powisf2)
1824 # define TYPE SFtype
1825 # define NAME __powisf2
1826 # elif defined(L_powidf2)
1827 # define TYPE DFtype
1828 # define NAME __powidf2
1829 # elif defined(L_powixf2)
1830 # define TYPE XFtype
1831 # define NAME __powixf2
1832 # elif defined(L_powitf2)
1833 # define TYPE TFtype
1834 # define NAME __powitf2
1840 NAME (TYPE x
, int m
)
1842 unsigned int n
= m
< 0 ? -m
: m
;
1843 TYPE y
= n
% 2 ? x
: 1;
1850 return m
< 0 ? 1/y
: y
;
1855 #if((defined(L_mulhc3) || defined(L_divhc3)) && LIBGCC2_HAS_HF_MODE) \
1856 || ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
1857 || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
1858 || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
1859 || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
1865 #if defined(L_mulhc3) || defined(L_divhc3)
1866 # define MTYPE HFtype
1867 # define CTYPE HCtype
1869 # define CEXT __LIBGCC_HF_FUNC_EXT__
1870 # define NOTRUNC (!__LIBGCC_HF_EXCESS_PRECISION__)
1871 #elif defined(L_mulsc3) || defined(L_divsc3)
1872 # define MTYPE SFtype
1873 # define CTYPE SCtype
1875 # define CEXT __LIBGCC_SF_FUNC_EXT__
1876 # define NOTRUNC (!__LIBGCC_SF_EXCESS_PRECISION__)
1877 #elif defined(L_muldc3) || defined(L_divdc3)
1878 # define MTYPE DFtype
1879 # define CTYPE DCtype
1881 # define CEXT __LIBGCC_DF_FUNC_EXT__
1882 # define NOTRUNC (!__LIBGCC_DF_EXCESS_PRECISION__)
1883 #elif defined(L_mulxc3) || defined(L_divxc3)
1884 # define MTYPE XFtype
1885 # define CTYPE XCtype
1887 # define CEXT __LIBGCC_XF_FUNC_EXT__
1888 # define NOTRUNC (!__LIBGCC_XF_EXCESS_PRECISION__)
1889 #elif defined(L_multc3) || defined(L_divtc3)
1890 # define MTYPE TFtype
1891 # define CTYPE TCtype
1893 # define CEXT __LIBGCC_TF_FUNC_EXT__
1894 # define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__)
1899 #define CONCAT3(A,B,C) _CONCAT3(A,B,C)
1900 #define _CONCAT3(A,B,C) A##B##C
1902 #define CONCAT2(A,B) _CONCAT2(A,B)
1903 #define _CONCAT2(A,B) A##B
1905 /* All of these would be present in a full C99 implementation of <math.h>
1906 and <complex.h>. Our problem is that only a few systems have such full
1907 implementations. Further, libgcc_s.so isn't currently linked against
1908 libm.so, and even for systems that do provide full C99, the extra overhead
1909 of all programs using libgcc having to link against libm. So avoid it. */
1911 #define isnan(x) __builtin_expect ((x) != (x), 0)
1912 #define isfinite(x) __builtin_expect (!isnan((x) - (x)), 1)
1913 #define isinf(x) __builtin_expect (!isnan(x) & !isfinite(x), 0)
1915 #define INFINITY CONCAT2(__builtin_huge_val, CEXT) ()
1918 /* Helpers to make the following code slightly less gross. */
1919 #define COPYSIGN CONCAT2(__builtin_copysign, CEXT)
1920 #define FABS CONCAT2(__builtin_fabs, CEXT)
1922 /* Verify that MTYPE matches up with CEXT. */
1923 extern void *compile_type_assert
[sizeof(INFINITY
) == sizeof(MTYPE
) ? 1 : -1];
1925 /* Ensure that we've lost any extra precision. */
1929 # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x))
1932 #if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \
1933 || defined(L_mulxc3) || defined(L_multc3)
1936 CONCAT3(__mul
,MODE
,3) (MTYPE a
, MTYPE b
, MTYPE c
, MTYPE d
)
1938 MTYPE ac
, bd
, ad
, bc
, x
, y
;
1954 if (isnan (x
) && isnan (y
))
1956 /* Recover infinities that computed as NaN + iNaN. */
1958 if (isinf (a
) || isinf (b
))
1960 /* z is infinite. "Box" the infinity and change NaNs in
1961 the other factor to 0. */
1962 a
= COPYSIGN (isinf (a
) ? 1 : 0, a
);
1963 b
= COPYSIGN (isinf (b
) ? 1 : 0, b
);
1964 if (isnan (c
)) c
= COPYSIGN (0, c
);
1965 if (isnan (d
)) d
= COPYSIGN (0, d
);
1968 if (isinf (c
) || isinf (d
))
1970 /* w is infinite. "Box" the infinity and change NaNs in
1971 the other factor to 0. */
1972 c
= COPYSIGN (isinf (c
) ? 1 : 0, c
);
1973 d
= COPYSIGN (isinf (d
) ? 1 : 0, d
);
1974 if (isnan (a
)) a
= COPYSIGN (0, a
);
1975 if (isnan (b
)) b
= COPYSIGN (0, b
);
1979 && (isinf (ac
) || isinf (bd
)
1980 || isinf (ad
) || isinf (bc
)))
1982 /* Recover infinities from overflow by changing NaNs to 0. */
1983 if (isnan (a
)) a
= COPYSIGN (0, a
);
1984 if (isnan (b
)) b
= COPYSIGN (0, b
);
1985 if (isnan (c
)) c
= COPYSIGN (0, c
);
1986 if (isnan (d
)) d
= COPYSIGN (0, d
);
1991 x
= INFINITY
* (a
* c
- b
* d
);
1992 y
= INFINITY
* (a
* d
+ b
* c
);
2000 #endif /* complex multiply */
2002 #if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \
2003 || defined(L_divxc3) || defined(L_divtc3)
2006 CONCAT3(__div
,MODE
,3) (MTYPE a
, MTYPE b
, MTYPE c
, MTYPE d
)
2008 MTYPE denom
, ratio
, x
, y
;
2011 /* ??? We can get better behavior from logarithmic scaling instead of
2012 the division. But that would mean starting to link libgcc against
2013 libm. We could implement something akin to ldexp/frexp as gcc builtins
2015 if (FABS (c
) < FABS (d
))
2018 denom
= (c
* ratio
) + d
;
2019 x
= ((a
* ratio
) + b
) / denom
;
2020 y
= ((b
* ratio
) - a
) / denom
;
2025 denom
= (d
* ratio
) + c
;
2026 x
= ((b
* ratio
) + a
) / denom
;
2027 y
= (b
- (a
* ratio
)) / denom
;
2030 /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
2031 are nonzero/zero, infinite/finite, and finite/infinite. */
2032 if (isnan (x
) && isnan (y
))
2034 if (c
== 0.0 && d
== 0.0 && (!isnan (a
) || !isnan (b
)))
2036 x
= COPYSIGN (INFINITY
, c
) * a
;
2037 y
= COPYSIGN (INFINITY
, c
) * b
;
2039 else if ((isinf (a
) || isinf (b
)) && isfinite (c
) && isfinite (d
))
2041 a
= COPYSIGN (isinf (a
) ? 1 : 0, a
);
2042 b
= COPYSIGN (isinf (b
) ? 1 : 0, b
);
2043 x
= INFINITY
* (a
* c
+ b
* d
);
2044 y
= INFINITY
* (b
* c
- a
* d
);
2046 else if ((isinf (c
) || isinf (d
)) && isfinite (a
) && isfinite (b
))
2048 c
= COPYSIGN (isinf (c
) ? 1 : 0, c
);
2049 d
= COPYSIGN (isinf (d
) ? 1 : 0, d
);
2050 x
= 0.0 * (a
* c
+ b
* d
);
2051 y
= 0.0 * (b
* c
- a
* d
);
2059 #endif /* complex divide */
2061 #endif /* all complex float routines */
2063 /* From here on down, the routines use normal data types. */
2065 #define SItype bogus_type
2066 #define USItype bogus_type
2067 #define DItype bogus_type
2068 #define UDItype bogus_type
2069 #define SFtype bogus_type
2070 #define DFtype bogus_type
2088 /* Like bcmp except the sign is meaningful.
2089 Result is negative if S1 is less than S2,
2090 positive if S1 is greater, 0 if S1 and S2 are equal. */
2093 __gcc_bcmp (const unsigned char *s1
, const unsigned char *s2
, size_t size
)
2097 const unsigned char c1
= *s1
++, c2
= *s2
++;
2107 /* __eprintf used to be used by GCC's private version of <assert.h>.
2108 We no longer provide that header, but this routine remains in libgcc.a
2109 for binary backward compatibility. Note that it is not included in
2110 the shared version of libgcc. */
2112 #ifndef inhibit_libc
2114 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
2118 __eprintf (const char *string
, const char *expression
,
2119 unsigned int line
, const char *filename
)
2121 fprintf (stderr
, string
, expression
, line
, filename
);
2130 #ifdef L_clear_cache
2131 /* Clear part of an instruction cache. */
2134 __clear_cache (char *beg
__attribute__((__unused__
)),
2135 char *end
__attribute__((__unused__
)))
2137 #ifdef CLEAR_INSN_CACHE
2138 CLEAR_INSN_CACHE (beg
, end
);
2139 #endif /* CLEAR_INSN_CACHE */
2142 #endif /* L_clear_cache */
2146 /* Jump to a trampoline, loading the static chain address. */
2148 #if defined(WINNT) && ! defined(__CYGWIN__)
2149 #include <windows.h>
2150 int getpagesize (void);
2151 int mprotect (char *,int, int);
2164 mprotect (char *addr
, int len
, int prot
)
2183 if (VirtualProtect (addr
, len
, np
, &op
))
2189 #endif /* WINNT && ! __CYGWIN__ */
2191 #ifdef TRANSFER_FROM_TRAMPOLINE
2192 TRANSFER_FROM_TRAMPOLINE
2194 #endif /* L_trampoline */
2199 #include "gbl-ctors.h"
2201 /* Some systems use __main in a way incompatible with its use in gcc, in these
2202 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2203 give the same symbol without quotes for an alternative entry point. You
2204 must define both, or neither. */
2206 #define NAME__MAIN "__main"
2207 #define SYMBOL__MAIN __main
2210 #if defined (__LIBGCC_INIT_SECTION_ASM_OP__) \
2211 || defined (__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__)
2212 #undef HAS_INIT_SECTION
2213 #define HAS_INIT_SECTION
2216 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
2218 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
2219 code to run constructors. In that case, we need to handle EH here, too.
2220 But MINGW32 is special because it handles CRTSTUFF and EH on its own. */
2223 #undef __LIBGCC_EH_FRAME_SECTION_NAME__
2226 #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
2227 #include "unwind-dw2-fde.h"
2228 extern unsigned char __EH_FRAME_BEGIN__
[];
2231 /* Run all the global destructors on exit from the program. */
2234 __do_global_dtors (void)
2236 #ifdef DO_GLOBAL_DTORS_BODY
2237 DO_GLOBAL_DTORS_BODY
;
2239 static func_ptr
*p
= __DTOR_LIST__
+ 1;
2246 #if defined (__LIBGCC_EH_FRAME_SECTION_NAME__) && !defined (HAS_INIT_SECTION)
2248 static int completed
= 0;
2252 __deregister_frame_info (__EH_FRAME_BEGIN__
);
2259 #ifndef HAS_INIT_SECTION
2260 /* Run all the global constructors on entry to the program. */
2263 __do_global_ctors (void)
2265 #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
2267 static struct object object
;
2268 __register_frame_info (__EH_FRAME_BEGIN__
, &object
);
2271 DO_GLOBAL_CTORS_BODY
;
2272 atexit (__do_global_dtors
);
2274 #endif /* no HAS_INIT_SECTION */
2276 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
2277 /* Subroutine called automatically by `main'.
2278 Compiling a global function named `main'
2279 produces an automatic call to this function at the beginning.
2281 For many systems, this routine calls __do_global_ctors.
2282 For systems which support a .init section we use the .init section
2283 to run __do_global_ctors, so we need not do anything here. */
2285 extern void SYMBOL__MAIN (void);
2289 /* Support recursive calls to `main': run initializers just once. */
2290 static int initialized
;
2294 __do_global_ctors ();
2297 #endif /* no HAS_INIT_SECTION or INVOKE__main */
2299 #endif /* L__main */
2300 #endif /* __CYGWIN__ */
2304 #include "gbl-ctors.h"
2306 /* Provide default definitions for the lists of constructors and
2307 destructors, so that we don't get linker errors. These symbols are
2308 intentionally bss symbols, so that gld and/or collect will provide
2309 the right values. */
2311 /* We declare the lists here with two elements each,
2312 so that they are valid empty lists if no other definition is loaded.
2314 If we are using the old "set" extensions to have the gnu linker
2315 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
2316 must be in the bss/common section.
2318 Long term no port should use those extensions. But many still do. */
2319 #if !defined(__LIBGCC_INIT_SECTION_ASM_OP__)
2320 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
2321 func_ptr __CTOR_LIST__
[2] = {0, 0};
2322 func_ptr __DTOR_LIST__
[2] = {0, 0};
2324 func_ptr __CTOR_LIST__
[2];
2325 func_ptr __DTOR_LIST__
[2];
2327 #endif /* no __LIBGCC_INIT_SECTION_ASM_OP__ */
2328 #endif /* L_ctors */
2329 #endif /* LIBGCC2_UNITS_PER_WORD <= MIN_UNITS_PER_WORD */