1 /* More subroutines needed by GCC output code on some machines. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* As a special exception, if you link this library with other files,
22 some of which are compiled with GCC, to produce an executable,
23 this library does not by itself cause the resulting executable
24 to be covered by the GNU General Public License.
25 This exception does not however invalidate any other reasons why
26 the executable file might be covered by the GNU General Public License. */
28 /* It is incorrect to include config.h here, because this file is being
29 compiled for the target, and hence definitions concerning only the host
38 /* Don't use `fancy_abort' here even if config.h says to use it. */
43 /* In the first part of this file, we are interfacing to calls generated
44 by the compiler itself. These calls pass values into these routines
45 which have very specific modes (rather than very specific types), and
46 these compiler-generated calls also expect any return values to have
47 very specific modes (rather than very specific types). Thus, we need
48 to avoid using regular C language type names in this part of the file
49 because the sizes for those types can be configured to be anything.
50 Instead we use the following special type names. */
52 typedef unsigned int UQItype __attribute__ ((mode ("QI")));
53 typedef int SItype __attribute__ ((mode ("SI")));
54 typedef unsigned int USItype __attribute__ ((mode ("SI")));
55 typedef int DItype __attribute__ ((mode ("DI")));
56 typedef unsigned int UDItype __attribute__ ((mode ("DI")));
57 typedef float SFtype __attribute__ ((mode ("SF")));
58 typedef float DFtype __attribute__ ((mode ("DF")));
59 #if LONG_DOUBLE_TYPE_SIZE == 96
60 typedef float XFtype __attribute__ ((mode ("XF")));
62 #if LONG_DOUBLE_TYPE_SIZE == 128
63 typedef float TFtype __attribute__ ((mode ("TF")));
67 typedef int word_type __attribute__ ((mode ("HI")));
70 typedef int word_type __attribute__ ((mode ("SI")));
73 typedef int word_type __attribute__ ((mode ("DI")));
76 /* Make sure that we don't accidentally use any normal C language built-in
77 type names in the first part of this file. Instead we want to use *only*
78 the type names defined above. The following macro definitions insure
79 that if we *do* accidentally use some normal C language built-in type name,
80 we will get a syntax error. */
82 #define char bogus_type
83 #define short bogus_type
84 #define int bogus_type
85 #define long bogus_type
86 #define unsigned bogus_type
87 #define float bogus_type
88 #define double bogus_type
90 #define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
92 /* DIstructs are pairs of SItype values in the order determined by
96 struct DIstruct {SItype high, low;};
98 struct DIstruct {SItype low, high;};
101 /* We need this union to unpack/pack DImode values, since we don't have
102 any arithmetic yet. Incoming DImode parameters are stored into the
103 `ll' field, and the unpacked result is read from the struct `s'. */
111 #if defined (L_udivmoddi4) || defined (L_muldi3) || defined (L_udiv_w_sdiv)
113 #include "longlong.h"
115 #endif /* udiv or mul */
117 extern DItype __fixunssfdi (SFtype a);
118 extern DItype __fixunsdfdi (DFtype a);
119 #if LONG_DOUBLE_TYPE_SIZE == 96
120 extern DItype __fixunsxfdi (XFtype a);
122 #if LONG_DOUBLE_TYPE_SIZE == 128
123 extern DItype __fixunstfdi (TFtype a);
126 #if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3)
127 #if defined (L_divdi3) || defined (L_moddi3)
140 w.s.high = -uu.s.high - ((USItype) w.s.low > 0);
161 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
165 w.s.high = (USItype)uu.s.low << -bm;
169 USItype carries = (USItype)uu.s.low >> bm;
170 w.s.low = (USItype)uu.s.low << b;
171 w.s.high = ((USItype)uu.s.high << b) | carries;
193 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
197 w.s.low = (USItype)uu.s.high >> -bm;
201 USItype carries = (USItype)uu.s.high << bm;
202 w.s.high = (USItype)uu.s.high >> b;
203 w.s.low = ((USItype)uu.s.low >> b) | carries;
225 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
229 w.s.high = (USItype)uu.s.low << -bm;
233 USItype carries = (USItype)uu.s.low >> bm;
234 w.s.low = (USItype)uu.s.low << b;
235 w.s.high = ((USItype)uu.s.high << b) | carries;
257 bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
260 /* w.s.high = 1..1 or 0..0 */
261 w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
262 w.s.low = uu.s.high >> -bm;
266 USItype carries = (USItype)uu.s.high << bm;
267 w.s.high = uu.s.high >> b;
268 w.s.low = ((USItype)uu.s.low >> b) | carries;
283 w.s.low = ffs (uu.s.low);
286 w.s.low = ffs (uu.s.high);
289 w.s.low += BITS_PER_UNIT * sizeof (SItype);
307 w.ll = __umulsidi3 (uu.s.low, vv.s.low);
308 w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
309 + (USItype) uu.s.high * (USItype) vv.s.low);
317 __udiv_w_sdiv (rp, a1, a0, d)
318 USItype *rp, a1, a0, d;
325 if (a1 < d - a1 - (a0 >> (SI_TYPE_SIZE - 1)))
327 /* dividend, divisor, and quotient are nonnegative */
328 sdiv_qrnnd (q, r, a1, a0, d);
332 /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
333 sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (SI_TYPE_SIZE - 1));
334 /* Divide (c1*2^32 + c0) by d */
335 sdiv_qrnnd (q, r, c1, c0, d);
336 /* Add 2^31 to quotient */
337 q += (USItype) 1 << (SI_TYPE_SIZE - 1);
342 b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
343 c1 = a1 >> 1; /* A/2 */
344 c0 = (a1 << (SI_TYPE_SIZE - 1)) + (a0 >> 1);
346 if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
348 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
350 r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
367 else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
370 c0 = ~c0; /* logical NOT */
372 sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
374 q = ~q; /* (A/2)/b1 */
377 r = 2*r + (a0 & 1); /* A/(2*b1) */
395 else /* Implies c1 = b1 */
396 { /* Hence a1 = d - 1 = 2*b1 - 1 */
416 static const UQItype __clz_tab[] =
418 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,
419 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,
420 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,
421 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,
422 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,
423 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,
424 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,
425 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,
429 __udivmoddi4 (n, d, rp)
436 USItype d0, d1, n0, n1, n2;
448 #if !UDIV_NEEDS_NORMALIZATION
455 udiv_qrnnd (q0, n0, n1, n0, d0);
458 /* Remainder in n0. */
465 d0 = 1 / d0; /* Divide intentionally by zero. */
467 udiv_qrnnd (q1, n1, 0, n1, d0);
468 udiv_qrnnd (q0, n0, n1, n0, d0);
470 /* Remainder in n0. */
481 #else /* UDIV_NEEDS_NORMALIZATION */
489 count_leading_zeros (bm, d0);
493 /* Normalize, i.e. make the most significant bit of the
497 n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
501 udiv_qrnnd (q0, n0, n1, n0, d0);
504 /* Remainder in n0 >> bm. */
511 d0 = 1 / d0; /* Divide intentionally by zero. */
513 count_leading_zeros (bm, d0);
517 /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
518 conclude (the most significant bit of n1 is set) /\ (the
519 leading quotient digit q1 = 1).
521 This special case is necessary, not an optimization.
522 (Shifts counts of SI_TYPE_SIZE are undefined.) */
531 b = SI_TYPE_SIZE - bm;
535 n1 = (n1 << bm) | (n0 >> b);
538 udiv_qrnnd (q1, n1, n2, n1, d0);
543 udiv_qrnnd (q0, n0, n1, n0, d0);
545 /* Remainder in n0 >> bm. */
555 #endif /* UDIV_NEEDS_NORMALIZATION */
566 /* Remainder in n1n0. */
578 count_leading_zeros (bm, d1);
581 /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
582 conclude (the most significant bit of n1 is set) /\ (the
583 quotient digit q0 = 0 or 1).
585 This special case is necessary, not an optimization. */
587 /* The condition on the next line takes advantage of that
588 n1 >= d1 (true due to program flow). */
589 if (n1 > d1 || n0 >= d0)
592 sub_ddmmss (n1, n0, n1, n0, d1, d0);
611 b = SI_TYPE_SIZE - bm;
613 d1 = (d1 << bm) | (d0 >> b);
616 n1 = (n1 << bm) | (n0 >> b);
619 udiv_qrnnd (q0, n1, n2, n1, d1);
620 umul_ppmm (m1, m0, q0, d0);
622 if (m1 > n1 || (m1 == n1 && m0 > n0))
625 sub_ddmmss (m1, m0, m1, m0, d1, d0);
630 /* Remainder in (n1n0 - m1m0) >> bm. */
633 sub_ddmmss (n1, n0, n1, n0, m1, m0);
634 rr.s.low = (n1 << b) | (n0 >> bm);
635 rr.s.high = n1 >> bm;
649 UDItype __udivmoddi4 ();
664 uu.ll = __negdi2 (uu.ll);
667 vv.ll = __negdi2 (vv.ll);
669 w = __udivmoddi4 (uu.ll, vv.ll, (UDItype *) 0);
678 UDItype __udivmoddi4 ();
692 uu.ll = __negdi2 (uu.ll);
694 vv.ll = __negdi2 (vv.ll);
696 (void) __udivmoddi4 (uu.ll, vv.ll, &w);
705 UDItype __udivmoddi4 ();
712 (void) __udivmoddi4 (u, v, &w);
719 UDItype __udivmoddi4 ();
724 return __udivmoddi4 (n, d, (UDItype *) 0);
735 au.ll = a, bu.ll = b;
737 if (au.s.high < bu.s.high)
739 else if (au.s.high > bu.s.high)
741 if ((USItype) au.s.low < (USItype) bu.s.low)
743 else if ((USItype) au.s.low > (USItype) bu.s.low)
756 au.ll = a, bu.ll = b;
758 if ((USItype) au.s.high < (USItype) bu.s.high)
760 else if ((USItype) au.s.high > (USItype) bu.s.high)
762 if ((USItype) au.s.low < (USItype) bu.s.low)
764 else if ((USItype) au.s.low > (USItype) bu.s.low)
770 #if defined(L_fixunstfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
771 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
772 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
784 /* Compute high word of result, as a flonum. */
785 b = (a / HIGH_WORD_COEFF);
786 /* Convert that to fixed (but not to DItype!),
787 and shift it into the high word. */
790 /* Remove high part from the TFtype, leaving the low part as flonum. */
792 /* Convert that to fixed (but not to DItype!) and add it in.
793 Sometimes A comes out negative. This is significant, since
794 A has more bits than a long int does. */
796 v -= (USItype) (- a);
803 #if defined(L_fixtfdi) && (LONG_DOUBLE_TYPE_SIZE == 128)
809 return - __fixunstfdi (-a);
810 return __fixunstfdi (a);
814 #if defined(L_fixunsxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
815 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
816 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
828 /* Compute high word of result, as a flonum. */
829 b = (a / HIGH_WORD_COEFF);
830 /* Convert that to fixed (but not to DItype!),
831 and shift it into the high word. */
834 /* Remove high part from the XFtype, leaving the low part as flonum. */
836 /* Convert that to fixed (but not to DItype!) and add it in.
837 Sometimes A comes out negative. This is significant, since
838 A has more bits than a long int does. */
840 v -= (USItype) (- a);
847 #if defined(L_fixxfdi) && (LONG_DOUBLE_TYPE_SIZE == 96)
853 return - __fixunsxfdi (-a);
854 return __fixunsxfdi (a);
859 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
860 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
872 /* Compute high word of result, as a flonum. */
873 b = (a / HIGH_WORD_COEFF);
874 /* Convert that to fixed (but not to DItype!),
875 and shift it into the high word. */
878 /* Remove high part from the DFtype, leaving the low part as flonum. */
880 /* Convert that to fixed (but not to DItype!) and add it in.
881 Sometimes A comes out negative. This is significant, since
882 A has more bits than a long int does. */
884 v -= (USItype) (- a);
897 return - __fixunsdfdi (-a);
898 return __fixunsdfdi (a);
903 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
904 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
907 __fixunssfdi (SFtype original_a)
909 /* Convert the SFtype to a DFtype, because that is surely not going
910 to lose any bits. Some day someone else can write a faster version
911 that avoids converting to DFtype, and verify it really works right. */
912 DFtype a = original_a;
919 /* Compute high word of result, as a flonum. */
920 b = (a / HIGH_WORD_COEFF);
921 /* Convert that to fixed (but not to DItype!),
922 and shift it into the high word. */
925 /* Remove high part from the DFtype, leaving the low part as flonum. */
927 /* Convert that to fixed (but not to DItype!) and add it in.
928 Sometimes A comes out negative. This is significant, since
929 A has more bits than a long int does. */
931 v -= (USItype) (- a);
943 return - __fixunssfdi (-a);
944 return __fixunssfdi (a);
948 #if defined(L_floatdixf) && (LONG_DOUBLE_TYPE_SIZE == 96)
949 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
950 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
951 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
963 d = (USItype) (u >> WORD_SIZE);
964 d *= HIGH_HALFWORD_COEFF;
965 d *= HIGH_HALFWORD_COEFF;
966 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
968 return (negate ? -d : d);
972 #if defined(L_floatditf) && (LONG_DOUBLE_TYPE_SIZE == 128)
973 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
974 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
975 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
987 d = (USItype) (u >> WORD_SIZE);
988 d *= HIGH_HALFWORD_COEFF;
989 d *= HIGH_HALFWORD_COEFF;
990 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
992 return (negate ? -d : d);
997 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
998 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
999 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
1011 d = (USItype) (u >> WORD_SIZE);
1012 d *= HIGH_HALFWORD_COEFF;
1013 d *= HIGH_HALFWORD_COEFF;
1014 d += (USItype) (u & (HIGH_WORD_COEFF - 1));
1016 return (negate ? -d : d);
1021 #define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT)
1022 #define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2))
1023 #define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE)
1029 /* Do the calculation in DFmode
1030 so that we don't lose any of the precision of the high word
1031 while multiplying it. */
1038 f = (USItype) (u >> WORD_SIZE);
1039 f *= HIGH_HALFWORD_COEFF;
1040 f *= HIGH_HALFWORD_COEFF;
1041 f += (USItype) (u & (HIGH_WORD_COEFF - 1));
1043 return (SFtype) (negate ? -f : f);
1047 #if defined(L_fixunsxfsi) && LONG_DOUBLE_TYPE_SIZE == 96
1048 #include "glimits.h"
1054 if (a >= - (DFtype) LONG_MIN)
1055 return (SItype) (a + LONG_MIN) - LONG_MIN;
1061 #include "glimits.h"
1067 if (a >= - (DFtype) LONG_MIN)
1068 return (SItype) (a + LONG_MIN) - LONG_MIN;
1074 #include "glimits.h"
1077 __fixunssfsi (SFtype a)
1079 if (a >= - (SFtype) LONG_MIN)
1080 return (SItype) (a + LONG_MIN) - LONG_MIN;
1085 /* From here on down, the routines use normal data types. */
1087 #define SItype bogus_type
1088 #define USItype bogus_type
1089 #define DItype bogus_type
1090 #define UDItype bogus_type
1091 #define SFtype bogus_type
1092 #define DFtype bogus_type
1104 /* Like bcmp except the sign is meaningful.
1105 Reult is negative if S1 is less than S2,
1106 positive if S1 is greater, 0 if S1 and S2 are equal. */
1109 __gcc_bcmp (s1, s2, size)
1110 unsigned char *s1, *s2;
1115 unsigned char c1 = *s1++, c2 = *s2++;
1127 #if defined(__svr4__) || defined(__alliant__)
1131 /* The Alliant needs the added underscore. */
1132 asm (".globl __builtin_saveregs");
1133 asm ("__builtin_saveregs:");
1134 asm (".globl ___builtin_saveregs");
1135 asm ("___builtin_saveregs:");
1137 asm (" andnot 0x0f,%sp,%sp"); /* round down to 16-byte boundary */
1138 asm (" adds -96,%sp,%sp"); /* allocate stack space for reg save
1139 area and also for a new va_list
1141 /* Save all argument registers in the arg reg save area. The
1142 arg reg save area must have the following layout (according
1154 asm (" fst.q %f8, 0(%sp)"); /* save floating regs (f8-f15) */
1155 asm (" fst.q %f12,16(%sp)");
1157 asm (" st.l %r16,32(%sp)"); /* save integer regs (r16-r27) */
1158 asm (" st.l %r17,36(%sp)");
1159 asm (" st.l %r18,40(%sp)");
1160 asm (" st.l %r19,44(%sp)");
1161 asm (" st.l %r20,48(%sp)");
1162 asm (" st.l %r21,52(%sp)");
1163 asm (" st.l %r22,56(%sp)");
1164 asm (" st.l %r23,60(%sp)");
1165 asm (" st.l %r24,64(%sp)");
1166 asm (" st.l %r25,68(%sp)");
1167 asm (" st.l %r26,72(%sp)");
1168 asm (" st.l %r27,76(%sp)");
1170 asm (" adds 80,%sp,%r16"); /* compute the address of the new
1171 va_list structure. Put in into
1172 r16 so that it will be returned
1175 /* Initialize all fields of the new va_list structure. This
1176 structure looks like:
1179 unsigned long ireg_used;
1180 unsigned long freg_used;
1186 asm (" st.l %r0, 0(%r16)"); /* nfixed */
1187 asm (" st.l %r0, 4(%r16)"); /* nfloating */
1188 asm (" st.l %sp, 8(%r16)"); /* __va_ctl points to __va_struct. */
1189 asm (" bri %r1"); /* delayed return */
1190 asm (" st.l %r28,12(%r16)"); /* pointer to overflow args */
1192 #else /* not __svr4__ */
1193 #if defined(__PARAGON__)
1195 * we'll use SVR4-ish varargs but need SVR3.2 assembler syntax,
1196 * and we stand a better chance of hooking into libraries
1197 * compiled by PGI. [andyp@ssd.intel.com]
1201 asm (".globl __builtin_saveregs");
1202 asm ("__builtin_saveregs:");
1203 asm (".globl ___builtin_saveregs");
1204 asm ("___builtin_saveregs:");
1206 asm (" andnot 0x0f,sp,sp"); /* round down to 16-byte boundary */
1207 asm (" adds -96,sp,sp"); /* allocate stack space for reg save
1208 area and also for a new va_list
1210 /* Save all argument registers in the arg reg save area. The
1211 arg reg save area must have the following layout (according
1223 asm (" fst.q f8, 0(sp)");
1224 asm (" fst.q f12,16(sp)");
1225 asm (" st.l r16,32(sp)");
1226 asm (" st.l r17,36(sp)");
1227 asm (" st.l r18,40(sp)");
1228 asm (" st.l r19,44(sp)");
1229 asm (" st.l r20,48(sp)");
1230 asm (" st.l r21,52(sp)");
1231 asm (" st.l r22,56(sp)");
1232 asm (" st.l r23,60(sp)");
1233 asm (" st.l r24,64(sp)");
1234 asm (" st.l r25,68(sp)");
1235 asm (" st.l r26,72(sp)");
1236 asm (" st.l r27,76(sp)");
1238 asm (" adds 80,sp,r16"); /* compute the address of the new
1239 va_list structure. Put in into
1240 r16 so that it will be returned
1243 /* Initialize all fields of the new va_list structure. This
1244 structure looks like:
1247 unsigned long ireg_used;
1248 unsigned long freg_used;
1254 asm (" st.l r0, 0(r16)"); /* nfixed */
1255 asm (" st.l r0, 4(r16)"); /* nfloating */
1256 asm (" st.l sp, 8(r16)"); /* __va_ctl points to __va_struct. */
1257 asm (" bri r1"); /* delayed return */
1258 asm (" st.l r28,12(r16)"); /* pointer to overflow args */
1259 #else /* not __PARAGON__ */
1263 asm (".globl ___builtin_saveregs");
1264 asm ("___builtin_saveregs:");
1265 asm (" mov sp,r30");
1266 asm (" andnot 0x0f,sp,sp");
1267 asm (" adds -96,sp,sp"); /* allocate sufficient space on the stack */
1269 /* Fill in the __va_struct. */
1270 asm (" st.l r16, 0(sp)"); /* save integer regs (r16-r27) */
1271 asm (" st.l r17, 4(sp)"); /* int fixed[12] */
1272 asm (" st.l r18, 8(sp)");
1273 asm (" st.l r19,12(sp)");
1274 asm (" st.l r20,16(sp)");
1275 asm (" st.l r21,20(sp)");
1276 asm (" st.l r22,24(sp)");
1277 asm (" st.l r23,28(sp)");
1278 asm (" st.l r24,32(sp)");
1279 asm (" st.l r25,36(sp)");
1280 asm (" st.l r26,40(sp)");
1281 asm (" st.l r27,44(sp)");
1283 asm (" fst.q f8, 48(sp)"); /* save floating regs (f8-f15) */
1284 asm (" fst.q f12,64(sp)"); /* int floating[8] */
1286 /* Fill in the __va_ctl. */
1287 asm (" st.l sp, 80(sp)"); /* __va_ctl points to __va_struct. */
1288 asm (" st.l r28,84(sp)"); /* pointer to more args */
1289 asm (" st.l r0, 88(sp)"); /* nfixed */
1290 asm (" st.l r0, 92(sp)"); /* nfloating */
1292 asm (" adds 80,sp,r16"); /* return address of the __va_ctl. */
1294 asm (" mov r30,sp");
1295 /* recover stack and pass address to start
1297 #endif /* not __PARAGON__ */
1298 #endif /* not __svr4__ */
1299 #else /* not __i860__ */
1301 asm (".global __builtin_saveregs");
1302 asm ("__builtin_saveregs:");
1303 asm (".global ___builtin_saveregs");
1304 asm ("___builtin_saveregs:");
1305 #ifdef NEED_PROC_COMMAND
1308 asm ("st %i0,[%fp+68]");
1309 asm ("st %i1,[%fp+72]");
1310 asm ("st %i2,[%fp+76]");
1311 asm ("st %i3,[%fp+80]");
1312 asm ("st %i4,[%fp+84]");
1314 asm ("st %i5,[%fp+88]");
1315 #ifdef NEED_TYPE_COMMAND
1316 asm (".type __builtin_saveregs,#function");
1317 asm (".size __builtin_saveregs,.-__builtin_saveregs");
1319 #else /* not __sparc__ */
1320 #if defined(__MIPSEL__) | defined(__R3000__) | defined(__R2000__) | defined(__mips__)
1323 asm (" .ent __builtin_saveregs");
1324 asm (" .globl __builtin_saveregs");
1325 asm ("__builtin_saveregs:");
1326 asm (" sw $4,0($30)");
1327 asm (" sw $5,4($30)");
1328 asm (" sw $6,8($30)");
1329 asm (" sw $7,12($30)");
1331 asm (" .end __builtin_saveregs");
1332 #else /* not __mips__, etc. */
1335 __builtin_saveregs ()
1340 #endif /* not __mips__ */
1341 #endif /* not __sparc__ */
1342 #endif /* not __i860__ */
1346 #ifndef inhibit_libc
1348 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1350 /* This is used by the `assert' macro. */
1352 __eprintf (string, expression, line, filename)
1354 const char *expression;
1356 const char *filename;
1358 fprintf (stderr, string, expression, line, filename);
1368 /* Structure emitted by -a */
1372 const char *filename;
1376 const unsigned long *addresses;
1378 /* Older GCC's did not emit these fields. */
1380 const char **functions;
1381 const long *line_nums;
1382 const char **filenames;
1385 #ifdef BLOCK_PROFILER_CODE
1388 #ifndef inhibit_libc
1390 /* Simple minded basic block profiling output dumper for
1391 systems that don't provde tcov support. At present,
1392 it requires atexit and stdio. */
1394 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1398 extern void atexit (void (*) (void));
1399 #define ON_EXIT(FUNC,ARG) atexit ((FUNC))
1402 extern void on_exit (void*, void*);
1403 #define ON_EXIT(FUNC,ARG) on_exit ((FUNC), (ARG))
1407 static struct bb *bb_head = (struct bb *)0;
1409 /* Return the number of digits needed to print a value */
1410 /* __inline__ */ static int num_digits (long value, int base)
1412 int minus = (value < 0 && base != 16);
1413 unsigned long v = (minus) ? -value : value;
1427 __bb_exit_func (void)
1429 FILE *file = fopen ("bb.out", "a");
1439 /* This is somewhat type incorrect, but it avoids worrying about
1440 exactly where time.h is included from. It should be ok unless
1441 a void * differs from other pointer formats, or if sizeof(long)
1442 is < sizeof (time_t). It would be nice if we could assume the
1443 use of rationale standards here. */
1445 time((void *) &time_value);
1446 fprintf (file, "Basic block profiling finished on %s\n", ctime ((void *) &time_value));
1448 /* We check the length field explicitly in order to allow compatibility
1449 with older GCC's which did not provide it. */
1451 for (ptr = bb_head; ptr != (struct bb *)0; ptr = ptr->next)
1454 int func_p = (ptr->nwords >= sizeof (struct bb) && ptr->nwords <= 1000);
1455 int line_p = (func_p && ptr->line_nums);
1456 int file_p = (func_p && ptr->filenames);
1457 long ncounts = ptr->ncounts;
1463 int blk_len = num_digits (ncounts, 10);
1468 fprintf (file, "File %s, %ld basic blocks \n\n",
1469 ptr->filename, ncounts);
1471 /* Get max values for each field. */
1472 for (i = 0; i < ncounts; i++)
1477 if (cnt_max < ptr->counts[i])
1478 cnt_max = ptr->counts[i];
1480 if (addr_max < ptr->addresses[i])
1481 addr_max = ptr->addresses[i];
1483 if (line_p && line_max < ptr->line_nums[i])
1484 line_max = ptr->line_nums[i];
1488 p = (ptr->functions[i]) ? (ptr->functions[i]) : "<none>";
1496 p = (ptr->filenames[i]) ? (ptr->filenames[i]) : "<none>";
1503 addr_len = num_digits (addr_max, 16);
1504 cnt_len = num_digits (cnt_max, 10);
1505 line_len = num_digits (line_max, 10);
1507 /* Now print out the basic block information. */
1508 for (i = 0; i < ncounts; i++)
1511 " Block #%*d: executed %*ld time(s) address= 0x%.*lx",
1513 cnt_len, ptr->counts[i],
1514 addr_len, ptr->addresses[i]);
1517 fprintf (file, " function= %-*s", func_len,
1518 (ptr->functions[i]) ? ptr->functions[i] : "<none>");
1521 fprintf (file, " line= %*ld", line_len, ptr->line_nums[i]);
1524 fprintf (file, " file= %s",
1525 (ptr->filenames[i]) ? ptr->filenames[i] : "<none>");
1527 fprintf (file, "\n");
1530 fprintf (file, "\n");
1534 fprintf (file, "\n\n");
1540 __bb_init_func (struct bb *blocks)
1542 /* User is supposed to check whether the first word is non-0,
1543 but just in case.... */
1545 if (blocks->zero_word)
1549 /* Initialize destructor. */
1551 ON_EXIT (__bb_exit_func, 0);
1554 /* Set up linked list. */
1555 blocks->zero_word = 1;
1556 blocks->next = bb_head;
1560 #endif /* not inhibit_libc */
1561 #endif /* not BLOCK_PROFILER_CODE */
1564 /* Default free-store management functions for C++, per sections 12.5 and
1565 17.3.3 of the Working Paper. */
1568 /* operator new (size_t), described in 17.3.3.5. This function is used by
1569 C++ programs to allocate a block of memory to hold a single object. */
1571 typedef void (*vfp)(void);
1572 extern vfp __new_handler;
1575 __builtin_new (size_t sz)
1579 /* malloc (0) is unpredictable; avoid it. */
1582 p = (void *) malloc (sz);
1585 (*__new_handler) ();
1586 p = (void *) malloc (sz);
1591 #endif /* L_op_new */
1594 /* void * operator new [] (size_t), described in 17.3.3.6. This function
1595 is used by C++ programs to allocate a block of memory for an array. */
1597 extern void * __builtin_new (size_t);
1600 __builtin_vec_new (size_t sz)
1602 return __builtin_new (sz);
1604 #endif /* L_op_vnew */
1606 #ifdef L_new_handler
1607 /* set_new_handler (fvoid_t *) and the default new handler, described in
1608 17.3.3.2 and 17.3.3.5. These functions define the result of a failure
1609 to allocate the amount of memory requested from operator new or new []. */
1611 #ifndef inhibit_libc
1612 /* This gets us __GNU_LIBRARY__. */
1613 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1616 #ifdef __GNU_LIBRARY__
1617 /* Avoid forcing the library's meaning of `write' on the user program
1618 by using the "internal" name (for use within the library) */
1619 #define write(fd, buf, n) __write((fd), (buf), (n))
1621 #endif /* inhibit_libc */
1623 typedef void (*vfp)(void);
1624 void __default_new_handler (void);
1626 vfp __new_handler = __default_new_handler;
1629 set_new_handler (vfp handler)
1633 prev_handler = __new_handler;
1634 if (handler == 0) handler = __default_new_handler;
1635 __new_handler = handler;
1636 return prev_handler;
1639 #define MESSAGE "Virtual memory exceeded in `new'\n"
1642 __default_new_handler ()
1644 /* don't use fprintf (stderr, ...) because it may need to call malloc. */
1645 /* This should really print the name of the program, but that is hard to
1646 do. We need a standard, clean way to get at the name. */
1647 write (2, MESSAGE, sizeof (MESSAGE));
1648 /* don't call exit () because that may call global destructors which
1649 may cause a loop. */
1655 /* operator delete (void *), described in 17.3.3.3. This function is used
1656 by C++ programs to return to the free store a block of memory allocated
1657 as a single object. */
1660 __builtin_delete (void *ptr)
1668 /* operator delete [] (void *), described in 17.3.3.4. This function is
1669 used by C++ programs to return to the free store a block of memory
1670 allocated as an array. */
1672 extern void __builtin_delete (void *);
1675 __builtin_vec_delete (void *ptr)
1677 __builtin_delete (ptr);
1681 /* End of C++ free-store management functions */
1684 unsigned int __shtab[] = {
1685 0x00000001, 0x00000002, 0x00000004, 0x00000008,
1686 0x00000010, 0x00000020, 0x00000040, 0x00000080,
1687 0x00000100, 0x00000200, 0x00000400, 0x00000800,
1688 0x00001000, 0x00002000, 0x00004000, 0x00008000,
1689 0x00010000, 0x00020000, 0x00040000, 0x00080000,
1690 0x00100000, 0x00200000, 0x00400000, 0x00800000,
1691 0x01000000, 0x02000000, 0x04000000, 0x08000000,
1692 0x10000000, 0x20000000, 0x40000000, 0x80000000
1696 #ifdef L_clear_cache
1697 /* Clear part of an instruction cache. */
1699 #define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH)
1702 __clear_cache (beg, end)
1705 #ifdef CLEAR_INSN_CACHE
1706 CLEAR_INSN_CACHE (beg, end);
1708 #ifdef INSN_CACHE_SIZE
1709 static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH];
1710 static int initialized = 0;
1714 typedef (*function_ptr) ();
1716 #if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16
1717 /* It's cheaper to clear the whole cache.
1718 Put in a series of jump instructions so that calling the beginning
1719 of the cache will clear the whole thing. */
1723 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1724 & -INSN_CACHE_LINE_WIDTH);
1725 int end_ptr = ptr + INSN_CACHE_SIZE;
1727 while (ptr < end_ptr)
1729 *(INSTRUCTION_TYPE *)ptr
1730 = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH;
1731 ptr += INSN_CACHE_LINE_WIDTH;
1733 *(INSTRUCTION_TYPE *)(ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION;
1738 /* Call the beginning of the sequence. */
1739 (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1740 & -INSN_CACHE_LINE_WIDTH))
1743 #else /* Cache is large. */
1747 int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1)
1748 & -INSN_CACHE_LINE_WIDTH);
1750 while (ptr < (int) array + sizeof array)
1752 *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION;
1753 ptr += INSN_CACHE_LINE_WIDTH;
1759 /* Find the location in array that occupies the same cache line as BEG. */
1761 offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1);
1762 start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1)
1763 & -INSN_CACHE_PLANE_SIZE)
1766 /* Compute the cache alignment of the place to stop clearing. */
1767 #if 0 /* This is not needed for gcc's purposes. */
1768 /* If the block to clear is bigger than a cache plane,
1769 we clear the entire cache, and OFFSET is already correct. */
1770 if (end < beg + INSN_CACHE_PLANE_SIZE)
1772 offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1)
1773 & -INSN_CACHE_LINE_WIDTH)
1774 & (INSN_CACHE_PLANE_SIZE - 1));
1776 #if INSN_CACHE_DEPTH > 1
1777 end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset;
1778 if (end_addr <= start_addr)
1779 end_addr += INSN_CACHE_PLANE_SIZE;
1781 for (plane = 0; plane < INSN_CACHE_DEPTH; plane++)
1783 int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE;
1784 int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE;
1786 while (addr != stop)
1788 /* Call the return instruction at ADDR. */
1789 ((function_ptr) addr) ();
1791 addr += INSN_CACHE_LINE_WIDTH;
1794 #else /* just one plane */
1797 /* Call the return instruction at START_ADDR. */
1798 ((function_ptr) start_addr) ();
1800 start_addr += INSN_CACHE_LINE_WIDTH;
1802 while ((start_addr % INSN_CACHE_SIZE) != offset);
1803 #endif /* just one plane */
1804 #endif /* Cache is large */
1805 #endif /* Cache exists */
1806 #endif /* CLEAR_INSN_CACHE */
1809 #endif /* L_clear_cache */
1813 /* Jump to a trampoline, loading the static chain address. */
1815 #ifdef TRANSFER_FROM_TRAMPOLINE
1816 TRANSFER_FROM_TRAMPOLINE
1819 #if defined (NeXT) && defined (__MACH__)
1821 /* Make stack executable so we can call trampolines on stack.
1822 This is called from INITIALIZE_TRAMPOLINE in next.h. */
1826 #include <mach/mach.h>
1830 __enable_execute_stack (addr)
1834 char *eaddr = addr + TRAMPOLINE_SIZE;
1835 vm_address_t a = (vm_address_t) addr;
1837 /* turn on execute access on stack */
1838 r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL);
1839 if (r != KERN_SUCCESS)
1841 mach_error("vm_protect VM_PROT_ALL", r);
1845 /* We inline the i-cache invalidation for speed */
1847 #ifdef CLEAR_INSN_CACHE
1848 CLEAR_INSN_CACHE (addr, eaddr);
1850 __clear_cache ((int) addr, (int) eaddr);
1854 #endif /* defined (NeXT) && defined (__MACH__) */
1858 /* Make stack executable so we can call trampolines on stack.
1859 This is called from INITIALIZE_TRAMPOLINE in convex.h. */
1861 #include <sys/mman.h>
1862 #include <sys/vmparam.h>
1863 #include <machine/machparam.h>
1866 __enable_execute_stack ()
1869 static unsigned lowest = USRSTACK;
1870 unsigned current = (unsigned) &fp & -NBPG;
1872 if (lowest > current)
1874 unsigned len = lowest - current;
1875 mremap (current, &len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE);
1879 /* Clear instruction cache in case an old trampoline is in it. */
1882 #endif /* __convex__ */
1886 /* Modified from the convex -code above. */
1888 #include <sys/param.h>
1890 #include <sys/m88kbcs.h>
1893 __enable_execute_stack ()
1896 static unsigned long lowest = USRSTACK;
1897 unsigned long current = (unsigned long) &save_errno & -NBPC;
1899 /* Ignore errno being set. memctl sets errno to EINVAL whenever the
1900 address is seen as 'negative'. That is the case with the stack. */
1903 if (lowest > current)
1905 unsigned len=lowest-current;
1906 memctl(current,len,MCT_TEXT);
1910 memctl(current,NBPC,MCT_TEXT);
1914 #endif /* __DOLPHIN__ */
1918 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
1920 #include <sys/mman.h>
1921 #include <sys/types.h>
1922 #include <sys/param.h>
1923 #include <sys/vmmac.h>
1925 /* Modified from the convex -code above.
1926 mremap promises to clear the i-cache. */
1929 __enable_execute_stack ()
1932 if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ,
1933 PROT_READ|PROT_WRITE|PROT_EXEC))
1935 perror ("mprotect in __enable_execute_stack");
1940 #endif /* __pyr__ */
1941 #endif /* L_trampoline */
1945 #include "gbl-ctors.h"
1946 /* Some systems use __main in a way incompatible with its use in gcc, in these
1947 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
1948 give the same symbol without quotes for an alternative entry point. You
1949 must define both, or niether. */
1951 #define NAME__MAIN "__main"
1952 #define SYMBOL__MAIN __main
1955 /* Run all the global destructors on exit from the program. */
1958 __do_global_dtors ()
1960 #ifdef DO_GLOBAL_DTORS_BODY
1961 DO_GLOBAL_DTORS_BODY;
1963 unsigned nptrs = (unsigned HOST_WIDE_INT) __DTOR_LIST__[0];
1966 /* Some systems place the number of pointers
1967 in the first word of the table.
1968 On other systems, that word is -1.
1969 In all cases, the table is null-terminated. */
1971 /* If the length is not recorded, count up to the null. */
1973 for (nptrs = 0; __DTOR_LIST__[nptrs + 1] != 0; nptrs++);
1975 /* GNU LD format. */
1976 for (i = nptrs; i >= 1; i--)
1977 __DTOR_LIST__[i] ();
1981 #ifndef INIT_SECTION_ASM_OP
1982 /* Run all the global constructors on entry to the program. */
1985 #define ON_EXIT(a, b)
1987 /* Make sure the exit routine is pulled in to define the globals as
1988 bss symbols, just in case the linker does not automatically pull
1989 bss definitions from the library. */
1991 extern int _exit_dummy_decl;
1992 int *_exit_dummy_ref = &_exit_dummy_decl;
1993 #endif /* ON_EXIT */
1996 __do_global_ctors ()
1998 DO_GLOBAL_CTORS_BODY;
1999 ON_EXIT (__do_global_dtors, 0);
2001 #endif /* no INIT_SECTION_ASM_OP */
2003 #if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
2004 /* Subroutine called automatically by `main'.
2005 Compiling a global function named `main'
2006 produces an automatic call to this function at the beginning.
2008 For many systems, this routine calls __do_global_ctors.
2009 For systems which support a .init section we use the .init section
2010 to run __do_global_ctors, so we need not do anything here. */
2015 /* Support recursive calls to `main': run initializers just once. */
2016 static int initialized = 0;
2020 __do_global_ctors ();
2023 #endif /* no INIT_SECTION_ASM_OP or INVOKE__main */
2025 #endif /* L__main */
2029 #include "gbl-ctors.h"
2031 /* Provide default definitions for the lists of constructors and
2032 destructors, so that we don't get linker errors. These symbols are
2033 intentionally bss symbols, so that gld and/or collect will provide
2034 the right values. */
2036 /* We declare the lists here with two elements each,
2037 so that they are valid empty lists if no other definition is loaded. */
2038 #if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2040 /* After 2.3, try this definition on all systems. */
2041 func_ptr __CTOR_LIST__[2] = {0, 0};
2042 func_ptr __DTOR_LIST__[2] = {0, 0};
2044 func_ptr __CTOR_LIST__[2];
2045 func_ptr __DTOR_LIST__[2];
2047 #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
2048 #endif /* L_ctors */
2052 #include "gbl-ctors.h"
2056 /* If we have no known way of registering our own __do_global_dtors
2057 routine so that it will be invoked at program exit time, then we
2058 have to define our own exit routine which will get this to happen. */
2060 extern void __do_global_dtors ();
2061 extern void _cleanup ();
2062 extern void _exit () __attribute__ ((noreturn));
2068 __do_global_dtors ();
2078 int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */
2083 /* In a.out systems, we need to have these dummy constructor and destructor
2084 lists in the library.
2086 When using `collect', the first link will resolve __CTOR_LIST__
2087 and __DTOR_LIST__ to these symbols. We will then run "nm" on the
2088 result, build the correct __CTOR_LIST__ and __DTOR_LIST__, and relink.
2089 Since we don't do the second link if no constructors existed, these
2090 dummies must be fully functional empty lists.
2092 When using `gnu ld', these symbols will be used if there are no
2093 constructors. If there are constructors, the N_SETV symbol defined
2094 by the linker from the N_SETT's in input files will define __CTOR_LIST__
2095 and __DTOR_LIST__ rather than its being allocated as common storage
2096 by the definitions below.
2098 When using a linker that supports constructor and destructor segments,
2099 these definitions will not be used, since crtbegin.o and crtend.o
2100 (from crtstuff.c) will have already defined __CTOR_LIST__ and
2101 __DTOR_LIST__. The crt*.o files are passed directly to the linker
2102 on its command line, by gcc. */
2104 /* The list needs two elements: one is ignored (the old count); the
2105 second is the terminating zero. Since both values are zero, this
2106 declaration is not initialized, and it becomes `common'. */
2109 #include "gbl-ctors.h"
2110 func_ptr __CTOR_LIST__[2];
2114 #include "gbl-ctors.h"
2115 func_ptr __DTOR_LIST__[2];