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 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
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
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
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, 59 Temple Place - Suite 330, Boston, MA
33 /* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is
34 supposedly valid even though this is a "target" file. */
35 #include "auto-host.h"
37 /* It is incorrect to include config.h here, because this file is being
38 compiled for the target, and hence definitions concerning only the host
42 #include "coretypes.h"
45 /* Don't use `fancy_abort' here even if config.h says to use it. */
50 #ifdef HAVE_GAS_HIDDEN
51 #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
53 #define ATTRIBUTE_HIDDEN
58 #ifdef DECLARE_LIBRARY_RENAMES
59 DECLARE_LIBRARY_RENAMES
62 #if defined (L_negdi2)
72 w.s.high = -uu.s.high - ((UWtype) w.s.low > 0);
80 __addvsi3 (Wtype a, Wtype b)
86 if (b >= 0 ? w < a : w > a)
95 __addvdi3 (DWtype a, DWtype b)
101 if (b >= 0 ? w < a : w > a)
110 __subvsi3 (Wtype a, Wtype b)
113 return __addvsi3 (a, (-b));
119 if (b >= 0 ? w > a : w < a)
129 __subvdi3 (DWtype a, DWtype b)
132 return __addvdi3 (a, (-b));
138 if (b >= 0 ? w > a : w < a)
148 __mulvsi3 (Wtype a, Wtype b)
154 if (((a >= 0) == (b >= 0)) ? w < 0 : w > 0)
169 if (a >= 0 ? w > 0 : w < 0)
184 if (a >= 0 ? w > 0 : w < 0)
233 __mulvdi3 (DWtype u, DWtype v)
239 if (((u >= 0) == (v >= 0)) ? w < 0 : w > 0)
247 /* Unless shift functions are defined with full ANSI prototypes,
248 parameter b will be promoted to int if word_type is smaller than an int. */
251 __lshrdi3 (DWtype u, word_type b)
262 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
266 w.s.low = (UWtype) uu.s.high >> -bm;
270 UWtype carries = (UWtype) uu.s.high << bm;
272 w.s.high = (UWtype) uu.s.high >> b;
273 w.s.low = ((UWtype) uu.s.low >> b) | carries;
282 __ashldi3 (DWtype u, word_type b)
293 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
297 w.s.high = (UWtype) uu.s.low << -bm;
301 UWtype carries = (UWtype) uu.s.low >> bm;
303 w.s.low = (UWtype) uu.s.low << b;
304 w.s.high = ((UWtype) uu.s.high << b) | carries;
313 __ashrdi3 (DWtype u, word_type b)
324 bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
327 /* w.s.high = 1..1 or 0..0 */
328 w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
329 w.s.low = uu.s.high >> -bm;
333 UWtype carries = (UWtype) uu.s.high << bm;
335 w.s.high = uu.s.high >> b;
336 w.s.low = ((UWtype) uu.s.low >> b) | carries;
345 extern int __ffsdi2 (DWtype u);
350 UWtype word, count, add;
354 word = uu.s.low, add = 0;
355 else if (uu.s.high != 0)
356 word = uu.s.high, add = BITS_PER_UNIT * sizeof (Wtype);
360 count_trailing_zeros (count, word);
361 return count + add + 1;
367 __muldi3 (DWtype u, DWtype v)
375 w.ll = __umulsidi3 (uu.s.low, vv.s.low);
376 w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
377 + (UWtype) uu.s.high * (UWtype) vv.s.low);
383 #if (defined (L_udivdi3) || defined (L_divdi3) || \
384 defined (L_umoddi3) || defined (L_moddi3))
385 #if defined (sdiv_qrnnd)
386 #define L_udiv_w_sdiv
391 #if defined (sdiv_qrnnd)
392 #if (defined (L_udivdi3) || defined (L_divdi3) || \
393 defined (L_umoddi3) || defined (L_moddi3))
394 static inline __attribute__ ((__always_inline__))
397 __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
404 if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
406 /* dividend, divisor, and quotient are nonnegative */
407 sdiv_qrnnd (q, r, a1, a0, d);
411 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
412 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
413 /* Divide (c1*2^32 + c0) by d */
414 sdiv_qrnnd (q, r, c1, c0, d);
415 /* Add 2^31 to quotient */
416 q += (UWtype) 1 << (W_TYPE_SIZE - 1);
421 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
422 c1 = a1 >> 1; /* A/2 */
423 c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
425 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
427 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
429 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
446 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
449 c0 = ~c0; /* logical NOT */
451 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
453 q = ~q; /* (A/2)/b1 */
456 r = 2*r + (a0 & 1); /* A/(2*b1) */
474 else /* Implies c1 = b1 */
475 { /* Hence a1 = d - 1 = 2*b1 - 1 */
493 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
495 __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
496 UWtype a1 __attribute__ ((__unused__)),
497 UWtype a0 __attribute__ ((__unused__)),
498 UWtype d __attribute__ ((__unused__)))
505 #if (defined (L_udivdi3) || defined (L_divdi3) || \
506 defined (L_umoddi3) || defined (L_moddi3))
511 const UQItype __clz_tab[] =
513 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,
514 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,
515 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,
516 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,
517 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,
518 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,
519 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,
520 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,
526 extern int __clzsi2 (USItype x);
533 count_leading_zeros (ret, w);
534 ret -= (sizeof(w) - sizeof(x)) * BITS_PER_UNIT;
542 extern int __clzdi2 (UDItype x);
549 if (sizeof(x) > sizeof(word))
555 word = uu.s.high, add = 0;
557 word = uu.s.low, add = W_TYPE_SIZE;
560 word = x, add = (Wtype)(sizeof(x) - sizeof(word)) * BITS_PER_UNIT;
562 count_leading_zeros (ret, word);
569 extern int __ctzsi2 (USItype x);
575 count_trailing_zeros (ret, x);
583 extern int __ctzdi2 (UDItype x);
590 if (sizeof(x) > sizeof(word))
596 word = uu.s.low, add = 0;
598 word = uu.s.high, add = W_TYPE_SIZE;
603 count_trailing_zeros (ret, word);
608 #if (defined (L_popcountsi2) || defined (L_popcountdi2) \
609 || defined (L_popcount_tab))
610 extern const UQItype __popcount_tab[] ATTRIBUTE_HIDDEN;
613 #ifdef L_popcount_tab
614 const UQItype __popcount_tab[] =
616 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,
617 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,
618 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,
619 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,
620 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,
621 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,
622 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,
623 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,
629 extern int __popcountsi2 (USItype x);
631 __popcountsi2 (USItype x)
633 return __popcount_tab[(x >> 0) & 0xff]
634 + __popcount_tab[(x >> 8) & 0xff]
635 + __popcount_tab[(x >> 16) & 0xff]
636 + __popcount_tab[(x >> 24) & 0xff];
642 extern int __popcountdi2 (UDItype x);
644 __popcountdi2 (UDItype x)
646 return __popcount_tab[(x >> 0) & 0xff]
647 + __popcount_tab[(x >> 8) & 0xff]
648 + __popcount_tab[(x >> 16) & 0xff]
649 + __popcount_tab[(x >> 24) & 0xff]
650 + __popcount_tab[(x >> 32) & 0xff]
651 + __popcount_tab[(x >> 40) & 0xff]
652 + __popcount_tab[(x >> 48) & 0xff]
653 + __popcount_tab[(x >> 56) & 0xff];
659 extern int __paritysi2 (USItype x);
661 __paritysi2 (USItype x)
668 return (0x6996 >> nx) & 1;
674 extern int __paritydi2 (UDItype x);
676 __paritydi2 (UDItype x)
678 UWtype nx = x ^ (x >> 32);
683 return (0x6996 >> nx) & 1;
689 #if (defined (L_udivdi3) || defined (L_divdi3) || \
690 defined (L_umoddi3) || defined (L_moddi3))
691 static inline __attribute__ ((__always_inline__))
694 __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
699 UWtype d0, d1, n0, n1, n2;
711 #if !UDIV_NEEDS_NORMALIZATION
718 udiv_qrnnd (q0, n0, n1, n0, d0);
721 /* Remainder in n0. */
728 d0 = 1 / d0; /* Divide intentionally by zero. */
730 udiv_qrnnd (q1, n1, 0, n1, d0);
731 udiv_qrnnd (q0, n0, n1, n0, d0);
733 /* Remainder in n0. */
744 #else /* UDIV_NEEDS_NORMALIZATION */
752 count_leading_zeros (bm, d0);
756 /* Normalize, i.e. make the most significant bit of the
760 n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
764 udiv_qrnnd (q0, n0, n1, n0, d0);
767 /* Remainder in n0 >> bm. */
774 d0 = 1 / d0; /* Divide intentionally by zero. */
776 count_leading_zeros (bm, d0);
780 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
781 conclude (the most significant bit of n1 is set) /\ (the
782 leading quotient digit q1 = 1).
784 This special case is necessary, not an optimization.
785 (Shifts counts of W_TYPE_SIZE are undefined.) */
794 b = W_TYPE_SIZE - bm;
798 n1 = (n1 << bm) | (n0 >> b);
801 udiv_qrnnd (q1, n1, n2, n1, d0);
806 udiv_qrnnd (q0, n0, n1, n0, d0);
808 /* Remainder in n0 >> bm. */
818 #endif /* UDIV_NEEDS_NORMALIZATION */
829 /* Remainder in n1n0. */
841 count_leading_zeros (bm, d1);
844 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
845 conclude (the most significant bit of n1 is set) /\ (the
846 quotient digit q0 = 0 or 1).
848 This special case is necessary, not an optimization. */
850 /* The condition on the next line takes advantage of that
851 n1 >= d1 (true due to program flow). */
852 if (n1 > d1 || n0 >= d0)
855 sub_ddmmss (n1, n0, n1, n0, d1, d0);
874 b = W_TYPE_SIZE - bm;
876 d1 = (d1 << bm) | (d0 >> b);
879 n1 = (n1 << bm) | (n0 >> b);
882 udiv_qrnnd (q0, n1, n2, n1, d1);
883 umul_ppmm (m1, m0, q0, d0);
885 if (m1 > n1 || (m1 == n1 && m0 > n0))
888 sub_ddmmss (m1, m0, m1, m0, d1, d0);
893 /* Remainder in (n1n0 - m1m0) >> bm. */
896 sub_ddmmss (n1, n0, n1, n0, m1, m0);
897 rr.s.low = (n1 << b) | (n0 >> bm);
898 rr.s.high = n1 >> bm;
913 __divdi3 (DWtype u, DWtype v)
929 w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
939 __moddi3 (DWtype u, DWtype v)
954 (void) __udivmoddi4 (uu.ll, vv.ll, &w);
964 __umoddi3 (UDWtype u, UDWtype v)
968 (void) __udivmoddi4 (u, v, &w);
976 __udivdi3 (UDWtype n, UDWtype d)
978 return __udivmoddi4 (n, d, (UDWtype *) 0);
984 __cmpdi2 (DWtype a, DWtype b)
988 au.ll = a, bu.ll = b;
990 if (au.s.high < bu.s.high)
992 else if (au.s.high > bu.s.high)
994 if ((UWtype) au.s.low < (UWtype) bu.s.low)
996 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1004 __ucmpdi2 (DWtype a, DWtype b)
1008 au.ll = a, bu.ll = b;
1010 if ((UWtype) au.s.high < (UWtype) bu.s.high)
1012 else if ((UWtype) au.s.high > (UWtype) bu.s.high)
1014 if ((UWtype) au.s.low < (UWtype) bu.s.low)
1016 else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1022 #if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1023 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1024 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1027 __fixunstfDI (TFtype a)
1035 /* Compute high word of result, as a flonum. */
1036 b = (a / HIGH_WORD_COEFF);
1037 /* Convert that to fixed (but not to DWtype!),
1038 and shift it into the high word. */
1041 /* Remove high part from the TFtype, leaving the low part as flonum. */
1043 /* Convert that to fixed (but not to DWtype!) and add it in.
1044 Sometimes A comes out negative. This is significant, since
1045 A has more bits than a long int does. */
1047 v -= (UWtype) (- a);
1054 #if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1056 __fixtfdi (TFtype a)
1059 return - __fixunstfDI (-a);
1060 return __fixunstfDI (a);
1064 #if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1065 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1066 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1069 __fixunsxfDI (XFtype a)
1077 /* Compute high word of result, as a flonum. */
1078 b = (a / HIGH_WORD_COEFF);
1079 /* Convert that to fixed (but not to DWtype!),
1080 and shift it into the high word. */
1083 /* Remove high part from the XFtype, leaving the low part as flonum. */
1085 /* Convert that to fixed (but not to DWtype!) and add it in.
1086 Sometimes A comes out negative. This is significant, since
1087 A has more bits than a long int does. */
1089 v -= (UWtype) (- a);
1096 #if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1098 __fixxfdi (XFtype a)
1101 return - __fixunsxfDI (-a);
1102 return __fixunsxfDI (a);
1107 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1108 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1111 __fixunsdfDI (DFtype a)
1115 /* Get high part of result. The division here will just moves the radix
1116 point and will not cause any rounding. Then the conversion to integral
1117 type chops result as desired. */
1118 hi = a / HIGH_WORD_COEFF;
1120 /* Get low part of result. Convert `hi' to floating type and scale it back,
1121 then subtract this from the number being converted. This leaves the low
1122 part. Convert that to integral type. */
1123 lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
1125 /* Assemble result from the two parts. */
1126 return ((UDWtype) hi << WORD_SIZE) | lo;
1132 __fixdfdi (DFtype a)
1135 return - __fixunsdfDI (-a);
1136 return __fixunsdfDI (a);
1141 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1142 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1145 __fixunssfDI (SFtype original_a)
1147 /* Convert the SFtype to a DFtype, because that is surely not going
1148 to lose any bits. Some day someone else can write a faster version
1149 that avoids converting to DFtype, and verify it really works right. */
1150 DFtype a = original_a;
1153 /* Get high part of result. The division here will just moves the radix
1154 point and will not cause any rounding. Then the conversion to integral
1155 type chops result as desired. */
1156 hi = a / HIGH_WORD_COEFF;
1158 /* Get low part of result. Convert `hi' to floating type and scale it back,
1159 then subtract this from the number being converted. This leaves the low
1160 part. Convert that to integral type. */
1161 lo = (a - ((DFtype) hi) * HIGH_WORD_COEFF);
1163 /* Assemble result from the two parts. */
1164 return ((UDWtype) hi << WORD_SIZE) | lo;
1170 __fixsfdi (SFtype a)
1173 return - __fixunssfDI (-a);
1174 return __fixunssfDI (a);
1178 #if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96)
1179 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1180 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1181 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1184 __floatdixf (DWtype u)
1188 d = (Wtype) (u >> WORD_SIZE);
1189 d *= HIGH_HALFWORD_COEFF;
1190 d *= HIGH_HALFWORD_COEFF;
1191 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1197 #if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1198 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1199 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1200 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1203 __floatditf (DWtype u)
1207 d = (Wtype) (u >> WORD_SIZE);
1208 d *= HIGH_HALFWORD_COEFF;
1209 d *= HIGH_HALFWORD_COEFF;
1210 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1217 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1218 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1219 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1222 __floatdidf (DWtype u)
1226 d = (Wtype) (u >> WORD_SIZE);
1227 d *= HIGH_HALFWORD_COEFF;
1228 d *= HIGH_HALFWORD_COEFF;
1229 d += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1236 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1237 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1238 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1240 #define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
1241 #define DF_SIZE DBL_MANT_DIG
1242 #define SF_SIZE FLT_MANT_DIG
1245 __floatdisf (DWtype u)
1247 /* Do the calculation in DFmode
1248 so that we don't lose any of the precision of the high word
1249 while multiplying it. */
1252 /* Protect against double-rounding error.
1253 Represent any low-order bits, that might be truncated in DFmode,
1254 by a bit that won't be lost. The bit can go in anywhere below the
1255 rounding position of the SFmode. A fixed mask and bit position
1256 handles all usual configurations. It doesn't handle the case
1257 of 128-bit DImode, however. */
1258 if (DF_SIZE < DI_SIZE
1259 && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE))
1261 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1262 if (! (- ((DWtype) 1 << DF_SIZE) < u
1263 && u < ((DWtype) 1 << DF_SIZE)))
1265 if ((UDWtype) u & (REP_BIT - 1))
1267 u &= ~ (REP_BIT - 1);
1272 f = (Wtype) (u >> WORD_SIZE);
1273 f *= HIGH_HALFWORD_COEFF;
1274 f *= HIGH_HALFWORD_COEFF;
1275 f += (UWtype) (u & (HIGH_WORD_COEFF - 1));
1281 #if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96
1282 /* Reenable the normal types, in case limits.h needs them. */
1295 __fixunsxfSI (XFtype a)
1297 if (a >= - (DFtype) Wtype_MIN)
1298 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1304 /* Reenable the normal types, in case limits.h needs them. */
1317 __fixunsdfSI (DFtype a)
1319 if (a >= - (DFtype) Wtype_MIN)
1320 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1326 /* Reenable the normal types, in case limits.h needs them. */
1339 __fixunssfSI (SFtype a)
1341 if (a >= - (SFtype) Wtype_MIN)
1342 return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1347 /* From here on down, the routines use normal data types. */
1349 #define SItype bogus_type
1350 #define USItype bogus_type
1351 #define DItype bogus_type
1352 #define UDItype bogus_type
1353 #define SFtype bogus_type
1354 #define DFtype bogus_type
1372 /* Like bcmp except the sign is meaningful.
1373 Result is negative if S1 is less than S2,
1374 positive if S1 is greater, 0 if S1 and S2 are equal. */
1377 __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
1381 unsigned char c1 = *s1++, c2 = *s2++;
1391 /* __eprintf used to be used by GCC's private version of <assert.h>.
1392 We no longer provide that header, but this routine remains in libgcc.a
1393 for binary backward compatibility. Note that it is not included in
1394 the shared version of libgcc. */
1396 #ifndef inhibit_libc
1398 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1402 __eprintf (const char *string, const char *expression,
1403 unsigned int line, const char *filename)
1405 fprintf (stderr, string, expression, line, filename);
1414 #ifdef L_clear_cache
1415 /* Clear part of an instruction cache. */
1417 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
1420 __clear_cache (char *beg __attribute__((__unused__)),
1421 char *end __attribute__((__unused__)))
1423 #ifdef CLEAR_INSN_CACHE
1424 CLEAR_INSN_CACHE (beg, end);
1426 #ifdef INSN_CACHE_SIZE
1427 static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH];
1428 static int initialized;
1432 typedef (*function_ptr) (void);
1434 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
1435 /* It's cheaper to clear the whole cache.
1436 Put in a series of jump instructions so that calling the beginning
1437 of the cache will clear the whole thing. */
1441 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1442 & -INSN_CACHE_LINE_WIDTH);
1443 int end_ptr = ptr + INSN_CACHE_SIZE;
1445 while (ptr < end_ptr)
1447 *(INSTRUCTION_TYPE *)ptr
1448 = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH;
1449 ptr += INSN_CACHE_LINE_WIDTH;
1451 *(INSTRUCTION_TYPE *) (ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION;
1456 /* Call the beginning of the sequence. */
1457 (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1458 & -INSN_CACHE_LINE_WIDTH))
1461 #else /* Cache is large. */
1465 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1466 & -INSN_CACHE_LINE_WIDTH);
1468 while (ptr < (int) array + sizeof array)
1470 *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION;
1471 ptr += INSN_CACHE_LINE_WIDTH;
1477 /* Find the location in array that occupies the same cache line as BEG. */
1479 offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1);
1480 start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1)
1481 & -INSN_CACHE_PLANE_SIZE)
1484 /* Compute the cache alignment of the place to stop clearing. */
1485 #if 0 /* This is not needed for gcc's purposes. */
1486 /* If the block to clear is bigger than a cache plane,
1487 we clear the entire cache, and OFFSET is already correct. */
1488 if (end < beg + INSN_CACHE_PLANE_SIZE)
1490 offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
1491 & -INSN_CACHE_LINE_WIDTH)
1492 & (INSN_CACHE_PLANE_SIZE - 1));
1494 #if INSN_CACHE_DEPTH > 1
1495 end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset;
1496 if (end_addr <= start_addr)
1497 end_addr += INSN_CACHE_PLANE_SIZE;
1499 for (plane = 0; plane < INSN_CACHE_DEPTH; plane++)
1501 int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE;
1502 int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE;
1504 while (addr != stop)
1506 /* Call the return instruction at ADDR. */
1507 ((function_ptr) addr) ();
1509 addr += INSN_CACHE_LINE_WIDTH;
1512 #else /* just one plane */
1515 /* Call the return instruction at START_ADDR. */
1516 ((function_ptr) start_addr) ();
1518 start_addr += INSN_CACHE_LINE_WIDTH;
1520 while ((start_addr % INSN_CACHE_SIZE) != offset);
1521 #endif /* just one plane */
1522 #endif /* Cache is large */
1523 #endif /* Cache exists */
1524 #endif /* CLEAR_INSN_CACHE */
1527 #endif /* L_clear_cache */
1531 /* Jump to a trampoline, loading the static chain address. */
1533 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1546 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1550 mprotect (char *addr, int len, int prot)
1567 if (VirtualProtect (addr, len, np, &op))
1573 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1575 #ifdef TRANSFER_FROM_TRAMPOLINE
1576 TRANSFER_FROM_TRAMPOLINE
1581 #include <sys/signal.h>
1584 /* Motorola forgot to put memctl.o in the libp version of libc881.a,
1585 so define it here, because we need it in __clear_insn_cache below */
1586 /* On older versions of this OS, no memctl or MCT_TEXT are defined;
1587 hence we enable this stuff only if MCT_TEXT is #define'd. */
1602 /* Clear instruction cache so we can call trampolines on stack.
1603 This is called from FINALIZE_TRAMPOLINE in mot3300.h. */
1606 __clear_insn_cache (void)
1611 /* Preserve errno, because users would be surprised to have
1612 errno changing without explicitly calling any system-call. */
1615 /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache.
1616 No need to use an address derived from _start or %sp, as 0 works also. */
1617 memctl(0, 4096, MCT_TEXT);
1622 #endif /* __sysV68__ */
1623 #endif /* L_trampoline */
1628 #include "gbl-ctors.h"
1629 /* Some systems use __main in a way incompatible with its use in gcc, in these
1630 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1631 give the same symbol without quotes for an alternative entry point. You
1632 must define both, or neither. */
1634 #define NAME__MAIN "__main"
1635 #define SYMBOL__MAIN __main
1638 #ifdef INIT_SECTION_ASM_OP
1639 #undef HAS_INIT_SECTION
1640 #define HAS_INIT_SECTION
1643 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
1645 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
1646 code to run constructors. In that case, we need to handle EH here, too. */
1648 #ifdef EH_FRAME_SECTION_NAME
1649 #include "unwind-dw2-fde.h"
1650 extern unsigned char __EH_FRAME_BEGIN__[];
1653 /* Run all the global destructors on exit from the program. */
1656 __do_global_dtors (void)
1658 #ifdef DO_GLOBAL_DTORS_BODY
1659 DO_GLOBAL_DTORS_BODY;
1661 static func_ptr *p = __DTOR_LIST__ + 1;
1668 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
1670 static int completed = 0;
1674 __deregister_frame_info (__EH_FRAME_BEGIN__);
1681 #ifndef HAS_INIT_SECTION
1682 /* Run all the global constructors on entry to the program. */
1685 __do_global_ctors (void)
1687 #ifdef EH_FRAME_SECTION_NAME
1689 static struct object object;
1690 __register_frame_info (__EH_FRAME_BEGIN__, &object);
1693 DO_GLOBAL_CTORS_BODY;
1694 atexit (__do_global_dtors);
1696 #endif /* no HAS_INIT_SECTION */
1698 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
1699 /* Subroutine called automatically by `main'.
1700 Compiling a global function named `main'
1701 produces an automatic call to this function at the beginning.
1703 For many systems, this routine calls __do_global_ctors.
1704 For systems which support a .init section we use the .init section
1705 to run __do_global_ctors, so we need not do anything here. */
1710 /* Support recursive calls to `main': run initializers just once. */
1711 static int initialized;
1715 __do_global_ctors ();
1718 #endif /* no HAS_INIT_SECTION or INVOKE__main */
1720 #endif /* L__main */
1721 #endif /* __CYGWIN__ */
1725 #include "gbl-ctors.h"
1727 /* Provide default definitions for the lists of constructors and
1728 destructors, so that we don't get linker errors. These symbols are
1729 intentionally bss symbols, so that gld and/or collect will provide
1730 the right values. */
1732 /* We declare the lists here with two elements each,
1733 so that they are valid empty lists if no other definition is loaded.
1735 If we are using the old "set" extensions to have the gnu linker
1736 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
1737 must be in the bss/common section.
1739 Long term no port should use those extensions. But many still do. */
1740 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
1741 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
1742 func_ptr __CTOR_LIST__[2] = {0, 0};
1743 func_ptr __DTOR_LIST__[2] = {0, 0};
1745 func_ptr __CTOR_LIST__[2];
1746 func_ptr __DTOR_LIST__[2];
1748 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
1749 #endif /* L_ctors */
1753 #include "gbl-ctors.h"
1761 static func_ptr *atexit_chain = 0;
1762 static long atexit_chain_length = 0;
1763 static volatile long last_atexit_chain_slot = -1;
1766 atexit (func_ptr func)
1768 if (++last_atexit_chain_slot == atexit_chain_length)
1770 atexit_chain_length += 32;
1772 atexit_chain = (func_ptr *) realloc (atexit_chain, atexit_chain_length
1773 * sizeof (func_ptr));
1775 atexit_chain = (func_ptr *) malloc (atexit_chain_length
1776 * sizeof (func_ptr));
1779 atexit_chain_length = 0;
1780 last_atexit_chain_slot = -1;
1785 atexit_chain[last_atexit_chain_slot] = func;
1789 extern void _cleanup (void);
1790 extern void _exit (int) __attribute__ ((__noreturn__));
1797 for ( ; last_atexit_chain_slot-- >= 0; )
1799 (*atexit_chain[last_atexit_chain_slot + 1]) ();
1800 atexit_chain[last_atexit_chain_slot + 1] = 0;
1802 free (atexit_chain);
1815 /* Simple; we just need a wrapper for ON_EXIT. */
1817 atexit (func_ptr func)
1819 return ON_EXIT (func);
1822 #endif /* ON_EXIT */
1823 #endif /* NEED_ATEXIT */