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 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)
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
= a
+ b
;
80 if (b
>= 0 ? w
< a
: w
> a
)
89 __addvdi3 (DWtype a
, DWtype b
)
91 const DWtype w
= a
+ b
;
93 if (b
>= 0 ? w
< a
: w
> a
)
102 __subvsi3 (Wtype a
, Wtype b
)
104 const DWtype w
= a
- b
;
106 if (b
>= 0 ? w
> a
: w
< a
)
115 __subvdi3 (DWtype a
, DWtype b
)
117 const DWtype w
= a
- b
;
119 if (b
>= 0 ? w
> a
: w
< a
)
127 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
129 __mulvsi3 (Wtype a
, Wtype b
)
131 const DWtype w
= (DWtype
) a
* (DWtype
) b
;
133 if ((Wtype
) (w
>> WORD_SIZE
) != (Wtype
) w
>> (WORD_SIZE
- 1))
146 if (a
>= 0 ? w
> 0 : w
< 0)
159 if (a
>= 0 ? w
> 0 : w
< 0)
207 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
209 __mulvdi3 (DWtype u
, DWtype v
)
211 /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
212 but the checked multiplication needs only two. */
213 const DWunion uu
= {.ll
= u
};
214 const DWunion vv
= {.ll
= v
};
216 if (__builtin_expect (uu
.s
.high
== uu
.s
.low
>> (WORD_SIZE
- 1), 1))
218 /* u fits in a single Wtype. */
219 if (__builtin_expect (vv
.s
.high
== vv
.s
.low
>> (WORD_SIZE
- 1), 1))
221 /* v fits in a single Wtype as well. */
222 /* A single multiplication. No overflow risk. */
223 return (DWtype
) uu
.s
.low
* (DWtype
) vv
.s
.low
;
227 /* Two multiplications. */
228 DWunion w0
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
229 * (UDWtype
) (UWtype
) vv
.s
.low
};
230 DWunion w1
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
231 * (UDWtype
) (UWtype
) vv
.s
.high
};
234 w1
.s
.high
-= uu
.s
.low
;
237 w1
.ll
+= (UWtype
) w0
.s
.high
;
238 if (__builtin_expect (w1
.s
.high
== w1
.s
.low
>> (WORD_SIZE
- 1), 1))
240 w0
.s
.high
= w1
.s
.low
;
247 if (__builtin_expect (vv
.s
.high
== vv
.s
.low
>> (WORD_SIZE
- 1), 1))
249 /* v fits into a single Wtype. */
250 /* Two multiplications. */
251 DWunion w0
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
252 * (UDWtype
) (UWtype
) vv
.s
.low
};
253 DWunion w1
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.high
254 * (UDWtype
) (UWtype
) vv
.s
.low
};
257 w1
.s
.high
-= vv
.s
.low
;
260 w1
.ll
+= (UWtype
) w0
.s
.high
;
261 if (__builtin_expect (w1
.s
.high
== w1
.s
.low
>> (WORD_SIZE
- 1), 1))
263 w0
.s
.high
= w1
.s
.low
;
269 /* A few sign checks and a single multiplication. */
274 if (uu
.s
.high
== 0 && vv
.s
.high
== 0)
276 const DWtype w
= (UDWtype
) (UWtype
) uu
.s
.low
277 * (UDWtype
) (UWtype
) vv
.s
.low
;
278 if (__builtin_expect (w
>= 0, 1))
284 if (uu
.s
.high
== 0 && vv
.s
.high
== (Wtype
) -1)
286 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
287 * (UDWtype
) (UWtype
) vv
.s
.low
};
289 ww
.s
.high
-= uu
.s
.low
;
290 if (__builtin_expect (ww
.s
.high
< 0, 1))
299 if (uu
.s
.high
== (Wtype
) -1 && vv
.s
.high
== 0)
301 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
302 * (UDWtype
) (UWtype
) vv
.s
.low
};
304 ww
.s
.high
-= vv
.s
.low
;
305 if (__builtin_expect (ww
.s
.high
< 0, 1))
311 if (uu
.s
.high
== (Wtype
) -1 && vv
.s
.high
== (Wtype
) - 1)
313 DWunion ww
= {.ll
= (UDWtype
) (UWtype
) uu
.s
.low
314 * (UDWtype
) (UWtype
) vv
.s
.low
};
316 ww
.s
.high
-= uu
.s
.low
;
317 ww
.s
.high
-= vv
.s
.low
;
318 if (__builtin_expect (ww
.s
.high
>= 0, 1))
332 /* Unless shift functions are defined with full ANSI prototypes,
333 parameter b will be promoted to int if word_type is smaller than an int. */
336 __lshrdi3 (DWtype u
, word_type b
)
341 const DWunion uu
= {.ll
= u
};
342 const word_type bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
348 w
.s
.low
= (UWtype
) uu
.s
.high
>> -bm
;
352 const UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
354 w
.s
.high
= (UWtype
) uu
.s
.high
>> b
;
355 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
364 __ashldi3 (DWtype u
, word_type b
)
369 const DWunion uu
= {.ll
= u
};
370 const word_type bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
376 w
.s
.high
= (UWtype
) uu
.s
.low
<< -bm
;
380 const UWtype carries
= (UWtype
) uu
.s
.low
>> bm
;
382 w
.s
.low
= (UWtype
) uu
.s
.low
<< b
;
383 w
.s
.high
= ((UWtype
) uu
.s
.high
<< b
) | carries
;
392 __ashrdi3 (DWtype u
, word_type b
)
397 const DWunion uu
= {.ll
= u
};
398 const word_type bm
= (sizeof (Wtype
) * BITS_PER_UNIT
) - b
;
403 /* w.s.high = 1..1 or 0..0 */
404 w
.s
.high
= uu
.s
.high
>> (sizeof (Wtype
) * BITS_PER_UNIT
- 1);
405 w
.s
.low
= uu
.s
.high
>> -bm
;
409 const UWtype carries
= (UWtype
) uu
.s
.high
<< bm
;
411 w
.s
.high
= uu
.s
.high
>> b
;
412 w
.s
.low
= ((UWtype
) uu
.s
.low
>> b
) | carries
;
429 count_trailing_zeros (count
, u
);
439 const DWunion uu
= {.ll
= u
};
440 UWtype word
, count
, add
;
443 word
= uu
.s
.low
, add
= 0;
444 else if (uu
.s
.high
!= 0)
445 word
= uu
.s
.high
, add
= BITS_PER_UNIT
* sizeof (Wtype
);
449 count_trailing_zeros (count
, word
);
450 return count
+ add
+ 1;
456 __muldi3 (DWtype u
, DWtype v
)
458 const DWunion uu
= {.ll
= u
};
459 const DWunion vv
= {.ll
= v
};
460 DWunion w
= {.ll
= __umulsidi3 (uu
.s
.low
, vv
.s
.low
)};
462 w
.s
.high
+= ((UWtype
) uu
.s
.low
* (UWtype
) vv
.s
.high
463 + (UWtype
) uu
.s
.high
* (UWtype
) vv
.s
.low
);
469 #if (defined (L_udivdi3) || defined (L_divdi3) || \
470 defined (L_umoddi3) || defined (L_moddi3))
471 #if defined (sdiv_qrnnd)
472 #define L_udiv_w_sdiv
477 #if defined (sdiv_qrnnd)
478 #if (defined (L_udivdi3) || defined (L_divdi3) || \
479 defined (L_umoddi3) || defined (L_moddi3))
480 static inline __attribute__ ((__always_inline__
))
483 __udiv_w_sdiv (UWtype
*rp
, UWtype a1
, UWtype a0
, UWtype d
)
490 if (a1
< d
- a1
- (a0
>> (W_TYPE_SIZE
- 1)))
492 /* Dividend, divisor, and quotient are nonnegative. */
493 sdiv_qrnnd (q
, r
, a1
, a0
, d
);
497 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d. */
498 sub_ddmmss (c1
, c0
, a1
, a0
, d
>> 1, d
<< (W_TYPE_SIZE
- 1));
499 /* Divide (c1*2^32 + c0) by d. */
500 sdiv_qrnnd (q
, r
, c1
, c0
, d
);
501 /* Add 2^31 to quotient. */
502 q
+= (UWtype
) 1 << (W_TYPE_SIZE
- 1);
507 b1
= d
>> 1; /* d/2, between 2^30 and 2^31 - 1 */
508 c1
= a1
>> 1; /* A/2 */
509 c0
= (a1
<< (W_TYPE_SIZE
- 1)) + (a0
>> 1);
511 if (a1
< b1
) /* A < 2^32*b1, so A/2 < 2^31*b1 */
513 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
515 r
= 2*r
+ (a0
& 1); /* Remainder from A/(2*b1) */
532 else if (c1
< b1
) /* So 2^31 <= (A/2)/b1 < 2^32 */
535 c0
= ~c0
; /* logical NOT */
537 sdiv_qrnnd (q
, r
, c1
, c0
, b1
); /* (A/2) / (d/2) */
539 q
= ~q
; /* (A/2)/b1 */
542 r
= 2*r
+ (a0
& 1); /* A/(2*b1) */
560 else /* Implies c1 = b1 */
561 { /* Hence a1 = d - 1 = 2*b1 - 1 */
579 /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
581 __udiv_w_sdiv (UWtype
*rp
__attribute__ ((__unused__
)),
582 UWtype a1
__attribute__ ((__unused__
)),
583 UWtype a0
__attribute__ ((__unused__
)),
584 UWtype d
__attribute__ ((__unused__
)))
591 #if (defined (L_udivdi3) || defined (L_divdi3) || \
592 defined (L_umoddi3) || defined (L_moddi3))
597 const UQItype __clz_tab
[] =
599 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,
600 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,
601 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,
602 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,
603 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,
604 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,
605 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,
606 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,
617 count_leading_zeros (ret
, x
);
628 const DWunion uu
= {.ll
= x
};
633 word
= uu
.s
.high
, add
= 0;
635 word
= uu
.s
.low
, add
= W_TYPE_SIZE
;
637 count_leading_zeros (ret
, word
);
649 count_trailing_zeros (ret
, x
);
660 const DWunion uu
= {.ll
= x
};
665 word
= uu
.s
.low
, add
= 0;
667 word
= uu
.s
.high
, add
= W_TYPE_SIZE
;
669 count_trailing_zeros (ret
, word
);
674 #if (defined (L_popcountsi2) || defined (L_popcountdi2) \
675 || defined (L_popcount_tab))
676 extern const UQItype __popcount_tab
[] ATTRIBUTE_HIDDEN
;
679 #ifdef L_popcount_tab
680 const UQItype __popcount_tab
[] =
682 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,
683 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,
684 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,
685 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,
686 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,
687 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,
688 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,
689 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,
696 __popcountSI2 (UWtype x
)
700 for (i
= 0; i
< W_TYPE_SIZE
; i
+= 8)
701 ret
+= __popcount_tab
[(x
>> i
) & 0xff];
710 __popcountDI2 (UDWtype x
)
714 for (i
= 0; i
< 2*W_TYPE_SIZE
; i
+= 8)
715 ret
+= __popcount_tab
[(x
>> i
) & 0xff];
724 __paritySI2 (UWtype x
)
727 # error "fill out the table"
738 return (0x6996 >> x
) & 1;
745 __parityDI2 (UDWtype x
)
747 const DWunion uu
= {.ll
= x
};
748 UWtype nx
= uu
.s
.low
^ uu
.s
.high
;
751 # error "fill out the table"
762 return (0x6996 >> nx
) & 1;
768 #if (defined (L_udivdi3) || defined (L_divdi3) || \
769 defined (L_umoddi3) || defined (L_moddi3))
770 static inline __attribute__ ((__always_inline__
))
773 __udivmoddi4 (UDWtype n
, UDWtype d
, UDWtype
*rp
)
775 const DWunion nn
= {.ll
= n
};
776 const DWunion dd
= {.ll
= d
};
778 UWtype d0
, d1
, n0
, n1
, n2
;
787 #if !UDIV_NEEDS_NORMALIZATION
794 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
797 /* Remainder in n0. */
804 d0
= 1 / d0
; /* Divide intentionally by zero. */
806 udiv_qrnnd (q1
, n1
, 0, n1
, d0
);
807 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
809 /* Remainder in n0. */
820 #else /* UDIV_NEEDS_NORMALIZATION */
828 count_leading_zeros (bm
, d0
);
832 /* Normalize, i.e. make the most significant bit of the
836 n1
= (n1
<< bm
) | (n0
>> (W_TYPE_SIZE
- bm
));
840 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
843 /* Remainder in n0 >> bm. */
850 d0
= 1 / d0
; /* Divide intentionally by zero. */
852 count_leading_zeros (bm
, d0
);
856 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
857 conclude (the most significant bit of n1 is set) /\ (the
858 leading quotient digit q1 = 1).
860 This special case is necessary, not an optimization.
861 (Shifts counts of W_TYPE_SIZE are undefined.) */
870 b
= W_TYPE_SIZE
- bm
;
874 n1
= (n1
<< bm
) | (n0
>> b
);
877 udiv_qrnnd (q1
, n1
, n2
, n1
, d0
);
882 udiv_qrnnd (q0
, n0
, n1
, n0
, d0
);
884 /* Remainder in n0 >> bm. */
894 #endif /* UDIV_NEEDS_NORMALIZATION */
905 /* Remainder in n1n0. */
917 count_leading_zeros (bm
, d1
);
920 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
921 conclude (the most significant bit of n1 is set) /\ (the
922 quotient digit q0 = 0 or 1).
924 This special case is necessary, not an optimization. */
926 /* The condition on the next line takes advantage of that
927 n1 >= d1 (true due to program flow). */
928 if (n1
> d1
|| n0
>= d0
)
931 sub_ddmmss (n1
, n0
, n1
, n0
, d1
, d0
);
950 b
= W_TYPE_SIZE
- bm
;
952 d1
= (d1
<< bm
) | (d0
>> b
);
955 n1
= (n1
<< bm
) | (n0
>> b
);
958 udiv_qrnnd (q0
, n1
, n2
, n1
, d1
);
959 umul_ppmm (m1
, m0
, q0
, d0
);
961 if (m1
> n1
|| (m1
== n1
&& m0
> n0
))
964 sub_ddmmss (m1
, m0
, m1
, m0
, d1
, d0
);
969 /* Remainder in (n1n0 - m1m0) >> bm. */
972 sub_ddmmss (n1
, n0
, n1
, n0
, m1
, m0
);
973 rr
.s
.low
= (n1
<< b
) | (n0
>> bm
);
974 rr
.s
.high
= n1
>> bm
;
981 const DWunion ww
= {{.low
= q0
, .high
= q1
}};
988 __divdi3 (DWtype u
, DWtype v
)
991 DWunion uu
= {.ll
= u
};
992 DWunion vv
= {.ll
= v
};
1002 w
= __udivmoddi4 (uu
.ll
, vv
.ll
, (UDWtype
*) 0);
1012 __moddi3 (DWtype u
, DWtype v
)
1015 DWunion uu
= {.ll
= u
};
1016 DWunion vv
= {.ll
= v
};
1025 (void) __udivmoddi4 (uu
.ll
, vv
.ll
, (UDWtype
*)&w
);
1035 __umoddi3 (UDWtype u
, UDWtype v
)
1039 (void) __udivmoddi4 (u
, v
, &w
);
1047 __udivdi3 (UDWtype n
, UDWtype d
)
1049 return __udivmoddi4 (n
, d
, (UDWtype
*) 0);
1055 __cmpdi2 (DWtype a
, DWtype b
)
1057 const DWunion au
= {.ll
= a
};
1058 const DWunion bu
= {.ll
= b
};
1060 if (au
.s
.high
< bu
.s
.high
)
1062 else if (au
.s
.high
> bu
.s
.high
)
1064 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
1066 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
1074 __ucmpdi2 (DWtype a
, DWtype b
)
1076 const DWunion au
= {.ll
= a
};
1077 const DWunion bu
= {.ll
= b
};
1079 if ((UWtype
) au
.s
.high
< (UWtype
) bu
.s
.high
)
1081 else if ((UWtype
) au
.s
.high
> (UWtype
) bu
.s
.high
)
1083 if ((UWtype
) au
.s
.low
< (UWtype
) bu
.s
.low
)
1085 else if ((UWtype
) au
.s
.low
> (UWtype
) bu
.s
.low
)
1091 #if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1092 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1093 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1096 __fixunstfDI (TFtype a
)
1101 /* Compute high word of result, as a flonum. */
1102 const TFtype b
= (a
/ HIGH_WORD_COEFF
);
1103 /* Convert that to fixed (but not to DWtype!),
1104 and shift it into the high word. */
1105 UDWtype v
= (UWtype
) b
;
1107 /* Remove high part from the TFtype, leaving the low part as flonum. */
1109 /* Convert that to fixed (but not to DWtype!) and add it in.
1110 Sometimes A comes out negative. This is significant, since
1111 A has more bits than a long int does. */
1113 v
-= (UWtype
) (- a
);
1120 #if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1122 __fixtfdi (TFtype a
)
1125 return - __fixunstfDI (-a
);
1126 return __fixunstfDI (a
);
1130 #if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
1131 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1132 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1135 __fixunsxfDI (XFtype a
)
1140 /* Compute high word of result, as a flonum. */
1141 const XFtype b
= (a
/ HIGH_WORD_COEFF
);
1142 /* Convert that to fixed (but not to DWtype!),
1143 and shift it into the high word. */
1144 UDWtype v
= (UWtype
) b
;
1146 /* Remove high part from the XFtype, leaving the low part as flonum. */
1148 /* Convert that to fixed (but not to DWtype!) and add it in.
1149 Sometimes A comes out negative. This is significant, since
1150 A has more bits than a long int does. */
1152 v
-= (UWtype
) (- a
);
1159 #if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
1161 __fixxfdi (XFtype a
)
1164 return - __fixunsxfDI (-a
);
1165 return __fixunsxfDI (a
);
1170 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1171 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1174 __fixunsdfDI (DFtype a
)
1176 /* Get high part of result. The division here will just moves the radix
1177 point and will not cause any rounding. Then the conversion to integral
1178 type chops result as desired. */
1179 const UWtype hi
= a
/ HIGH_WORD_COEFF
;
1181 /* Get low part of result. Convert `hi' to floating type and scale it back,
1182 then subtract this from the number being converted. This leaves the low
1183 part. Convert that to integral type. */
1184 const UWtype lo
= (a
- ((DFtype
) hi
) * HIGH_WORD_COEFF
);
1186 /* Assemble result from the two parts. */
1187 return ((UDWtype
) hi
<< WORD_SIZE
) | lo
;
1193 __fixdfdi (DFtype a
)
1196 return - __fixunsdfDI (-a
);
1197 return __fixunsdfDI (a
);
1202 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1203 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1206 __fixunssfDI (SFtype original_a
)
1208 /* Convert the SFtype to a DFtype, because that is surely not going
1209 to lose any bits. Some day someone else can write a faster version
1210 that avoids converting to DFtype, and verify it really works right. */
1211 const DFtype a
= original_a
;
1213 /* Get high part of result. The division here will just moves the radix
1214 point and will not cause any rounding. Then the conversion to integral
1215 type chops result as desired. */
1216 const UWtype hi
= a
/ HIGH_WORD_COEFF
;
1218 /* Get low part of result. Convert `hi' to floating type and scale it back,
1219 then subtract this from the number being converted. This leaves the low
1220 part. Convert that to integral type. */
1221 const UWtype lo
= (a
- ((DFtype
) hi
) * HIGH_WORD_COEFF
);
1223 /* Assemble result from the two parts. */
1224 return ((UDWtype
) hi
<< WORD_SIZE
) | lo
;
1230 __fixsfdi (SFtype a
)
1233 return - __fixunssfDI (-a
);
1234 return __fixunssfDI (a
);
1238 #if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
1239 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1240 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1241 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1244 __floatdixf (DWtype u
)
1246 XFtype d
= (Wtype
) (u
>> WORD_SIZE
);
1247 d
*= HIGH_HALFWORD_COEFF
;
1248 d
*= HIGH_HALFWORD_COEFF
;
1249 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1255 #if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
1256 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1257 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1258 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1261 __floatditf (DWtype u
)
1263 TFtype d
= (Wtype
) (u
>> WORD_SIZE
);
1264 d
*= HIGH_HALFWORD_COEFF
;
1265 d
*= HIGH_HALFWORD_COEFF
;
1266 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1273 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1274 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1275 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1278 __floatdidf (DWtype u
)
1280 DFtype d
= (Wtype
) (u
>> WORD_SIZE
);
1281 d
*= HIGH_HALFWORD_COEFF
;
1282 d
*= HIGH_HALFWORD_COEFF
;
1283 d
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1290 #define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)
1291 #define HIGH_HALFWORD_COEFF (((UDWtype) 1) << (WORD_SIZE / 2))
1292 #define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)
1294 #define DI_SIZE (sizeof (DWtype) * BITS_PER_UNIT)
1295 #define DF_SIZE DBL_MANT_DIG
1296 #define SF_SIZE FLT_MANT_DIG
1299 __floatdisf (DWtype u
)
1301 /* Protect against double-rounding error.
1302 Represent any low-order bits, that might be truncated in DFmode,
1303 by a bit that won't be lost. The bit can go in anywhere below the
1304 rounding position of the SFmode. A fixed mask and bit position
1305 handles all usual configurations. It doesn't handle the case
1306 of 128-bit DImode, however. */
1307 if (DF_SIZE
< DI_SIZE
1308 && DF_SIZE
> (DI_SIZE
- DF_SIZE
+ SF_SIZE
))
1310 #define REP_BIT ((UDWtype) 1 << (DI_SIZE - DF_SIZE))
1311 if (! (- ((DWtype
) 1 << DF_SIZE
) < u
1312 && u
< ((DWtype
) 1 << DF_SIZE
)))
1314 if ((UDWtype
) u
& (REP_BIT
- 1))
1316 u
&= ~ (REP_BIT
- 1);
1321 /* Do the calculation in DFmode
1322 so that we don't lose any of the precision of the high word
1323 while multiplying it. */
1324 DFtype f
= (Wtype
) (u
>> WORD_SIZE
);
1325 f
*= HIGH_HALFWORD_COEFF
;
1326 f
*= HIGH_HALFWORD_COEFF
;
1327 f
+= (UWtype
) (u
& (HIGH_WORD_COEFF
- 1));
1333 #if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80
1334 /* Reenable the normal types, in case limits.h needs them. */
1347 __fixunsxfSI (XFtype a
)
1349 if (a
>= - (DFtype
) Wtype_MIN
)
1350 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1356 /* Reenable the normal types, in case limits.h needs them. */
1369 __fixunsdfSI (DFtype a
)
1371 if (a
>= - (DFtype
) Wtype_MIN
)
1372 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1378 /* Reenable the normal types, in case limits.h needs them. */
1391 __fixunssfSI (SFtype a
)
1393 if (a
>= - (SFtype
) Wtype_MIN
)
1394 return (Wtype
) (a
+ Wtype_MIN
) - Wtype_MIN
;
1399 /* From here on down, the routines use normal data types. */
1401 #define SItype bogus_type
1402 #define USItype bogus_type
1403 #define DItype bogus_type
1404 #define UDItype bogus_type
1405 #define SFtype bogus_type
1406 #define DFtype bogus_type
1424 /* Like bcmp except the sign is meaningful.
1425 Result is negative if S1 is less than S2,
1426 positive if S1 is greater, 0 if S1 and S2 are equal. */
1429 __gcc_bcmp (const unsigned char *s1
, const unsigned char *s2
, size_t size
)
1433 const unsigned char c1
= *s1
++, c2
= *s2
++;
1443 /* __eprintf used to be used by GCC's private version of <assert.h>.
1444 We no longer provide that header, but this routine remains in libgcc.a
1445 for binary backward compatibility. Note that it is not included in
1446 the shared version of libgcc. */
1448 #ifndef inhibit_libc
1450 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1454 __eprintf (const char *string
, const char *expression
,
1455 unsigned int line
, const char *filename
)
1457 fprintf (stderr
, string
, expression
, line
, filename
);
1466 #ifdef L_clear_cache
1467 /* Clear part of an instruction cache. */
1470 __clear_cache (char *beg
__attribute__((__unused__
)),
1471 char *end
__attribute__((__unused__
)))
1473 #ifdef CLEAR_INSN_CACHE
1474 CLEAR_INSN_CACHE (beg
, end
);
1475 #endif /* CLEAR_INSN_CACHE */
1478 #endif /* L_clear_cache */
1480 #ifdef L_enable_execute_stack
1481 /* Attempt to turn on execute permission for the stack. */
1483 #ifdef ENABLE_EXECUTE_STACK
1484 ENABLE_EXECUTE_STACK
1487 __enable_execute_stack (void *addr
__attribute__((__unused__
)))
1489 #endif /* ENABLE_EXECUTE_STACK */
1491 #endif /* L_enable_execute_stack */
1495 /* Jump to a trampoline, loading the static chain address. */
1497 #if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN)
1510 extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall));
1514 mprotect (char *addr
, int len
, int prot
)
1531 if (VirtualProtect (addr
, len
, np
, &op
))
1537 #endif /* WINNT && ! __CYGWIN__ && ! _UWIN */
1539 #ifdef TRANSFER_FROM_TRAMPOLINE
1540 TRANSFER_FROM_TRAMPOLINE
1542 #endif /* L_trampoline */
1547 #include "gbl-ctors.h"
1548 /* Some systems use __main in a way incompatible with its use in gcc, in these
1549 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1550 give the same symbol without quotes for an alternative entry point. You
1551 must define both, or neither. */
1553 #define NAME__MAIN "__main"
1554 #define SYMBOL__MAIN __main
1557 #ifdef INIT_SECTION_ASM_OP
1558 #undef HAS_INIT_SECTION
1559 #define HAS_INIT_SECTION
1562 #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
1564 /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
1565 code to run constructors. In that case, we need to handle EH here, too. */
1567 #ifdef EH_FRAME_SECTION_NAME
1568 #include "unwind-dw2-fde.h"
1569 extern unsigned char __EH_FRAME_BEGIN__
[];
1572 /* Run all the global destructors on exit from the program. */
1575 __do_global_dtors (void)
1577 #ifdef DO_GLOBAL_DTORS_BODY
1578 DO_GLOBAL_DTORS_BODY
;
1580 static func_ptr
*p
= __DTOR_LIST__
+ 1;
1587 #if defined (EH_FRAME_SECTION_NAME) && !defined (HAS_INIT_SECTION)
1589 static int completed
= 0;
1593 __deregister_frame_info (__EH_FRAME_BEGIN__
);
1600 #ifndef HAS_INIT_SECTION
1601 /* Run all the global constructors on entry to the program. */
1604 __do_global_ctors (void)
1606 #ifdef EH_FRAME_SECTION_NAME
1608 static struct object object
;
1609 __register_frame_info (__EH_FRAME_BEGIN__
, &object
);
1612 DO_GLOBAL_CTORS_BODY
;
1613 atexit (__do_global_dtors
);
1615 #endif /* no HAS_INIT_SECTION */
1617 #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
1618 /* Subroutine called automatically by `main'.
1619 Compiling a global function named `main'
1620 produces an automatic call to this function at the beginning.
1622 For many systems, this routine calls __do_global_ctors.
1623 For systems which support a .init section we use the .init section
1624 to run __do_global_ctors, so we need not do anything here. */
1626 extern void SYMBOL__MAIN (void);
1630 /* Support recursive calls to `main': run initializers just once. */
1631 static int initialized
;
1635 __do_global_ctors ();
1638 #endif /* no HAS_INIT_SECTION or INVOKE__main */
1640 #endif /* L__main */
1641 #endif /* __CYGWIN__ */
1645 #include "gbl-ctors.h"
1647 /* Provide default definitions for the lists of constructors and
1648 destructors, so that we don't get linker errors. These symbols are
1649 intentionally bss symbols, so that gld and/or collect will provide
1650 the right values. */
1652 /* We declare the lists here with two elements each,
1653 so that they are valid empty lists if no other definition is loaded.
1655 If we are using the old "set" extensions to have the gnu linker
1656 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
1657 must be in the bss/common section.
1659 Long term no port should use those extensions. But many still do. */
1660 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
1661 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
1662 func_ptr __CTOR_LIST__
[2] = {0, 0};
1663 func_ptr __DTOR_LIST__
[2] = {0, 0};
1665 func_ptr __CTOR_LIST__
[2];
1666 func_ptr __DTOR_LIST__
[2];
1668 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
1669 #endif /* L_ctors */