libgcc2.c revision 1.5 1 1.1 mrg /* More subroutines needed by GCC output code on some machines. */
2 1.1 mrg /* Compile this one with gcc. */
3 1.5 mrg /* Copyright (C) 1989-2016 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
18 1.1 mrg permissions described in the GCC Runtime Library Exception, version
19 1.1 mrg 3.1, as published by the Free Software Foundation.
20 1.1 mrg
21 1.1 mrg You should have received a copy of the GNU General Public License and
22 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
23 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 1.1 mrg <http://www.gnu.org/licenses/>. */
25 1.1 mrg
26 1.1 mrg #include "tconfig.h"
27 1.1 mrg #include "tsystem.h"
28 1.1 mrg #include "coretypes.h"
29 1.1 mrg #include "tm.h"
30 1.1 mrg #include "libgcc_tm.h"
31 1.1 mrg
32 1.1 mrg #ifdef HAVE_GAS_HIDDEN
33 1.1 mrg #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden")))
34 1.1 mrg #else
35 1.1 mrg #define ATTRIBUTE_HIDDEN
36 1.1 mrg #endif
37 1.1 mrg
38 1.1 mrg /* Work out the largest "word" size that we can deal with on this target. */
39 1.1 mrg #if MIN_UNITS_PER_WORD > 4
40 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD 8
41 1.1 mrg #elif (MIN_UNITS_PER_WORD > 2 \
42 1.1 mrg || (MIN_UNITS_PER_WORD > 1 && __SIZEOF_LONG_LONG__ > 4))
43 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD 4
44 1.1 mrg #else
45 1.1 mrg # define LIBGCC2_MAX_UNITS_PER_WORD MIN_UNITS_PER_WORD
46 1.1 mrg #endif
47 1.1 mrg
48 1.1 mrg /* Work out what word size we are using for this compilation.
49 1.1 mrg The value can be set on the command line. */
50 1.1 mrg #ifndef LIBGCC2_UNITS_PER_WORD
51 1.1 mrg #define LIBGCC2_UNITS_PER_WORD LIBGCC2_MAX_UNITS_PER_WORD
52 1.1 mrg #endif
53 1.1 mrg
54 1.1 mrg #if LIBGCC2_UNITS_PER_WORD <= LIBGCC2_MAX_UNITS_PER_WORD
55 1.1 mrg
56 1.1 mrg #include "libgcc2.h"
57 1.1 mrg
58 1.1 mrg #ifdef DECLARE_LIBRARY_RENAMES
60 1.1 mrg DECLARE_LIBRARY_RENAMES
61 1.1 mrg #endif
62 1.1 mrg
63 1.1 mrg #if defined (L_negdi2)
64 1.1 mrg DWtype
65 1.1 mrg __negdi2 (DWtype u)
66 1.1 mrg {
67 1.1 mrg const DWunion uu = {.ll = u};
68 1.1 mrg const DWunion w = { {.low = -uu.s.low,
69 1.1 mrg .high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
70 1.1 mrg
71 1.1 mrg return w.ll;
72 1.1 mrg }
73 1.1 mrg #endif
74 1.1 mrg
75 1.1 mrg #ifdef L_addvsi3
76 1.1 mrg Wtype
77 1.1 mrg __addvSI3 (Wtype a, Wtype b)
78 1.1 mrg {
79 1.1 mrg const Wtype w = (UWtype) a + (UWtype) b;
80 1.1 mrg
81 1.1 mrg if (b >= 0 ? w < a : w > a)
82 1.1 mrg abort ();
83 1.1 mrg
84 1.1 mrg return w;
85 1.1 mrg }
86 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
87 1.1 mrg SItype
88 1.1 mrg __addvsi3 (SItype a, SItype b)
89 1.1 mrg {
90 1.1 mrg const SItype w = (USItype) a + (USItype) b;
91 1.1 mrg
92 1.1 mrg if (b >= 0 ? w < a : w > a)
93 1.1 mrg abort ();
94 1.1 mrg
95 1.1 mrg return w;
96 1.1 mrg }
97 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
98 1.1 mrg #endif
99 1.1 mrg
100 1.1 mrg #ifdef L_addvdi3
102 1.1 mrg DWtype
103 1.1 mrg __addvDI3 (DWtype a, DWtype b)
104 1.1 mrg {
105 1.1 mrg const DWtype w = (UDWtype) a + (UDWtype) b;
106 1.1 mrg
107 1.1 mrg if (b >= 0 ? w < a : w > a)
108 1.1 mrg abort ();
109 1.1 mrg
110 1.1 mrg return w;
111 1.1 mrg }
112 1.1 mrg #endif
113 1.1 mrg
114 1.1 mrg #ifdef L_subvsi3
116 1.1 mrg Wtype
117 1.1 mrg __subvSI3 (Wtype a, Wtype b)
118 1.1 mrg {
119 1.1 mrg const Wtype w = (UWtype) a - (UWtype) b;
120 1.1 mrg
121 1.1 mrg if (b >= 0 ? w > a : w < a)
122 1.1 mrg abort ();
123 1.1 mrg
124 1.1 mrg return w;
125 1.1 mrg }
126 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
127 1.1 mrg SItype
128 1.1 mrg __subvsi3 (SItype a, SItype b)
129 1.1 mrg {
130 1.1 mrg const SItype w = (USItype) a - (USItype) b;
131 1.1 mrg
132 1.1 mrg if (b >= 0 ? w > a : w < a)
133 1.1 mrg abort ();
134 1.1 mrg
135 1.1 mrg return w;
136 1.1 mrg }
137 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
138 1.1 mrg #endif
139 1.1 mrg
140 1.1 mrg #ifdef L_subvdi3
142 1.1 mrg DWtype
143 1.1 mrg __subvDI3 (DWtype a, DWtype b)
144 1.1 mrg {
145 1.1 mrg const DWtype w = (UDWtype) a - (UDWtype) b;
146 1.1 mrg
147 1.1 mrg if (b >= 0 ? w > a : w < a)
148 1.1 mrg abort ();
149 1.1 mrg
150 1.1 mrg return w;
151 1.1 mrg }
152 1.1 mrg #endif
153 1.1 mrg
154 1.1 mrg #ifdef L_mulvsi3
156 1.1 mrg Wtype
157 1.1 mrg __mulvSI3 (Wtype a, Wtype b)
158 1.1 mrg {
159 1.1 mrg const DWtype w = (DWtype) a * (DWtype) b;
160 1.1 mrg
161 1.1 mrg if ((Wtype) (w >> W_TYPE_SIZE) != (Wtype) w >> (W_TYPE_SIZE - 1))
162 1.1 mrg abort ();
163 1.5 mrg
164 1.1 mrg return w;
165 1.1 mrg }
166 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
167 1.1 mrg #undef WORD_SIZE
168 1.1 mrg #define WORD_SIZE (sizeof (SItype) * __CHAR_BIT__)
169 1.1 mrg SItype
170 1.1 mrg __mulvsi3 (SItype a, SItype b)
171 1.1 mrg {
172 1.1 mrg const DItype w = (DItype) a * (DItype) b;
173 1.1 mrg
174 1.1 mrg if ((SItype) (w >> WORD_SIZE) != (SItype) w >> (WORD_SIZE-1))
175 1.1 mrg abort ();
176 1.1 mrg
177 1.1 mrg return w;
178 1.1 mrg }
179 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
180 1.1 mrg #endif
181 1.1 mrg
182 1.1 mrg #ifdef L_negvsi2
184 1.1 mrg Wtype
185 1.1 mrg __negvSI2 (Wtype a)
186 1.1 mrg {
187 1.1 mrg const Wtype w = -(UWtype) a;
188 1.1 mrg
189 1.1 mrg if (a >= 0 ? w > 0 : w < 0)
190 1.1 mrg abort ();
191 1.1 mrg
192 1.1 mrg return w;
193 1.1 mrg }
194 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
195 1.1 mrg SItype
196 1.1 mrg __negvsi2 (SItype a)
197 1.1 mrg {
198 1.1 mrg const SItype w = -(USItype) a;
199 1.1 mrg
200 1.1 mrg if (a >= 0 ? w > 0 : w < 0)
201 1.1 mrg abort ();
202 1.1 mrg
203 1.1 mrg return w;
204 1.1 mrg }
205 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
206 1.1 mrg #endif
207 1.1 mrg
208 1.1 mrg #ifdef L_negvdi2
210 1.1 mrg DWtype
211 1.1 mrg __negvDI2 (DWtype a)
212 1.1 mrg {
213 1.1 mrg const DWtype w = -(UDWtype) a;
214 1.1 mrg
215 1.1 mrg if (a >= 0 ? w > 0 : w < 0)
216 1.1 mrg abort ();
217 1.1 mrg
218 1.1 mrg return w;
219 1.1 mrg }
220 1.1 mrg #endif
221 1.1 mrg
222 1.1 mrg #ifdef L_absvsi2
224 1.1 mrg Wtype
225 1.1 mrg __absvSI2 (Wtype a)
226 1.1 mrg {
227 1.1 mrg Wtype w = a;
228 1.1 mrg
229 1.1 mrg if (a < 0)
230 1.1 mrg #ifdef L_negvsi2
231 1.1 mrg w = __negvSI2 (a);
232 1.1 mrg #else
233 1.1 mrg w = -(UWtype) a;
234 1.1 mrg
235 1.1 mrg if (w < 0)
236 1.1 mrg abort ();
237 1.1 mrg #endif
238 1.1 mrg
239 1.1 mrg return w;
240 1.1 mrg }
241 1.1 mrg #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
242 1.1 mrg SItype
243 1.1 mrg __absvsi2 (SItype a)
244 1.1 mrg {
245 1.1 mrg SItype w = a;
246 1.1 mrg
247 1.1 mrg if (a < 0)
248 1.1 mrg #ifdef L_negvsi2
249 1.1 mrg w = __negvsi2 (a);
250 1.1 mrg #else
251 1.1 mrg w = -(USItype) a;
252 1.1 mrg
253 1.1 mrg if (w < 0)
254 1.1 mrg abort ();
255 1.1 mrg #endif
256 1.1 mrg
257 1.1 mrg return w;
258 1.1 mrg }
259 1.1 mrg #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
260 1.1 mrg #endif
261 1.1 mrg
262 1.1 mrg #ifdef L_absvdi2
264 1.1 mrg DWtype
265 1.1 mrg __absvDI2 (DWtype a)
266 1.1 mrg {
267 1.1 mrg DWtype w = a;
268 1.1 mrg
269 1.1 mrg if (a < 0)
270 1.1 mrg #ifdef L_negvdi2
271 1.1 mrg w = __negvDI2 (a);
272 1.1 mrg #else
273 1.1 mrg w = -(UDWtype) a;
274 1.1 mrg
275 1.1 mrg if (w < 0)
276 1.1 mrg abort ();
277 1.1 mrg #endif
278 1.1 mrg
279 1.1 mrg return w;
280 1.1 mrg }
281 1.1 mrg #endif
282 1.1 mrg
283 1.1 mrg #ifdef L_mulvdi3
285 1.1 mrg DWtype
286 1.1 mrg __mulvDI3 (DWtype u, DWtype v)
287 1.1 mrg {
288 1.1 mrg /* The unchecked multiplication needs 3 Wtype x Wtype multiplications,
289 1.1 mrg but the checked multiplication needs only two. */
290 1.1 mrg const DWunion uu = {.ll = u};
291 1.1 mrg const DWunion vv = {.ll = v};
292 1.1 mrg
293 1.1 mrg if (__builtin_expect (uu.s.high == uu.s.low >> (W_TYPE_SIZE - 1), 1))
294 1.1 mrg {
295 1.1 mrg /* u fits in a single Wtype. */
296 1.1 mrg if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
297 1.1 mrg {
298 1.1 mrg /* v fits in a single Wtype as well. */
299 1.1 mrg /* A single multiplication. No overflow risk. */
300 1.1 mrg return (DWtype) uu.s.low * (DWtype) vv.s.low;
301 1.1 mrg }
302 1.1 mrg else
303 1.1 mrg {
304 1.1 mrg /* Two multiplications. */
305 1.1 mrg DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
306 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
307 1.1 mrg DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.low
308 1.1 mrg * (UDWtype) (UWtype) vv.s.high};
309 1.1 mrg
310 1.1 mrg if (vv.s.high < 0)
311 1.1 mrg w1.s.high -= uu.s.low;
312 1.1 mrg if (uu.s.low < 0)
313 1.1 mrg w1.ll -= vv.ll;
314 1.1 mrg w1.ll += (UWtype) w0.s.high;
315 1.1 mrg if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
316 1.1 mrg {
317 1.1 mrg w0.s.high = w1.s.low;
318 1.1 mrg return w0.ll;
319 1.1 mrg }
320 1.1 mrg }
321 1.1 mrg }
322 1.1 mrg else
323 1.1 mrg {
324 1.1 mrg if (__builtin_expect (vv.s.high == vv.s.low >> (W_TYPE_SIZE - 1), 1))
325 1.1 mrg {
326 1.1 mrg /* v fits into a single Wtype. */
327 1.1 mrg /* Two multiplications. */
328 1.1 mrg DWunion w0 = {.ll = (UDWtype) (UWtype) uu.s.low
329 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
330 1.1 mrg DWunion w1 = {.ll = (UDWtype) (UWtype) uu.s.high
331 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
332 1.1 mrg
333 1.1 mrg if (uu.s.high < 0)
334 1.1 mrg w1.s.high -= vv.s.low;
335 1.1 mrg if (vv.s.low < 0)
336 1.1 mrg w1.ll -= uu.ll;
337 1.1 mrg w1.ll += (UWtype) w0.s.high;
338 1.1 mrg if (__builtin_expect (w1.s.high == w1.s.low >> (W_TYPE_SIZE - 1), 1))
339 1.1 mrg {
340 1.1 mrg w0.s.high = w1.s.low;
341 1.1 mrg return w0.ll;
342 1.1 mrg }
343 1.1 mrg }
344 1.1 mrg else
345 1.1 mrg {
346 1.1 mrg /* A few sign checks and a single multiplication. */
347 1.1 mrg if (uu.s.high >= 0)
348 1.1 mrg {
349 1.1 mrg if (vv.s.high >= 0)
350 1.1 mrg {
351 1.1 mrg if (uu.s.high == 0 && vv.s.high == 0)
352 1.1 mrg {
353 1.1 mrg const DWtype w = (UDWtype) (UWtype) uu.s.low
354 1.1 mrg * (UDWtype) (UWtype) vv.s.low;
355 1.1 mrg if (__builtin_expect (w >= 0, 1))
356 1.1 mrg return w;
357 1.1 mrg }
358 1.1 mrg }
359 1.1 mrg else
360 1.1 mrg {
361 1.1 mrg if (uu.s.high == 0 && vv.s.high == (Wtype) -1)
362 1.1 mrg {
363 1.1 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
364 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
365 1.1 mrg
366 1.1 mrg ww.s.high -= uu.s.low;
367 1.1 mrg if (__builtin_expect (ww.s.high < 0, 1))
368 1.1 mrg return ww.ll;
369 1.1 mrg }
370 1.1 mrg }
371 1.1 mrg }
372 1.1 mrg else
373 1.1 mrg {
374 1.1 mrg if (vv.s.high >= 0)
375 1.1 mrg {
376 1.1 mrg if (uu.s.high == (Wtype) -1 && vv.s.high == 0)
377 1.1 mrg {
378 1.1 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
379 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
380 1.1 mrg
381 1.1 mrg ww.s.high -= vv.s.low;
382 1.1 mrg if (__builtin_expect (ww.s.high < 0, 1))
383 1.1 mrg return ww.ll;
384 1.1 mrg }
385 1.1 mrg }
386 1.1 mrg else
387 1.1 mrg {
388 1.1 mrg if (uu.s.high == (Wtype) -1 && vv.s.high == (Wtype) - 1)
389 1.1 mrg {
390 1.1 mrg DWunion ww = {.ll = (UDWtype) (UWtype) uu.s.low
391 1.1 mrg * (UDWtype) (UWtype) vv.s.low};
392 1.1 mrg
393 1.1 mrg ww.s.high -= uu.s.low;
394 1.1 mrg ww.s.high -= vv.s.low;
395 1.1 mrg if (__builtin_expect (ww.s.high >= 0, 1))
396 1.1 mrg return ww.ll;
397 1.1 mrg }
398 1.1 mrg }
399 1.1 mrg }
400 1.1 mrg }
401 1.1 mrg }
402 1.1 mrg
403 1.1 mrg /* Overflow. */
404 1.1 mrg abort ();
405 1.1 mrg }
406 1.1 mrg #endif
407 1.1 mrg
408 1.1 mrg
410 1.1 mrg /* Unless shift functions are defined with full ANSI prototypes,
411 1.1 mrg parameter b will be promoted to int if shift_count_type is smaller than an int. */
412 1.1 mrg #ifdef L_lshrdi3
413 1.1 mrg DWtype
414 1.1 mrg __lshrdi3 (DWtype u, shift_count_type b)
415 1.1 mrg {
416 1.1 mrg if (b == 0)
417 1.1 mrg return u;
418 1.1 mrg
419 1.1 mrg const DWunion uu = {.ll = u};
420 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b;
421 1.1 mrg DWunion w;
422 1.1 mrg
423 1.1 mrg if (bm <= 0)
424 1.1 mrg {
425 1.1 mrg w.s.high = 0;
426 1.1 mrg w.s.low = (UWtype) uu.s.high >> -bm;
427 1.1 mrg }
428 1.1 mrg else
429 1.1 mrg {
430 1.1 mrg const UWtype carries = (UWtype) uu.s.high << bm;
431 1.1 mrg
432 1.1 mrg w.s.high = (UWtype) uu.s.high >> b;
433 1.1 mrg w.s.low = ((UWtype) uu.s.low >> b) | carries;
434 1.1 mrg }
435 1.1 mrg
436 1.1 mrg return w.ll;
437 1.1 mrg }
438 1.1 mrg #endif
439 1.1 mrg
440 1.1 mrg #ifdef L_ashldi3
441 1.1 mrg DWtype
442 1.1 mrg __ashldi3 (DWtype u, shift_count_type b)
443 1.1 mrg {
444 1.1 mrg if (b == 0)
445 1.1 mrg return u;
446 1.1 mrg
447 1.1 mrg const DWunion uu = {.ll = u};
448 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b;
449 1.1 mrg DWunion w;
450 1.1 mrg
451 1.1 mrg if (bm <= 0)
452 1.1 mrg {
453 1.1 mrg w.s.low = 0;
454 1.1 mrg w.s.high = (UWtype) uu.s.low << -bm;
455 1.1 mrg }
456 1.1 mrg else
457 1.1 mrg {
458 1.1 mrg const UWtype carries = (UWtype) uu.s.low >> bm;
459 1.1 mrg
460 1.1 mrg w.s.low = (UWtype) uu.s.low << b;
461 1.1 mrg w.s.high = ((UWtype) uu.s.high << b) | carries;
462 1.1 mrg }
463 1.1 mrg
464 1.1 mrg return w.ll;
465 1.1 mrg }
466 1.1 mrg #endif
467 1.1 mrg
468 1.1 mrg #ifdef L_ashrdi3
469 1.1 mrg DWtype
470 1.1 mrg __ashrdi3 (DWtype u, shift_count_type b)
471 1.1 mrg {
472 1.1 mrg if (b == 0)
473 1.1 mrg return u;
474 1.1 mrg
475 1.1 mrg const DWunion uu = {.ll = u};
476 1.1 mrg const shift_count_type bm = W_TYPE_SIZE - b;
477 1.1 mrg DWunion w;
478 1.1 mrg
479 1.1 mrg if (bm <= 0)
480 1.1 mrg {
481 1.1 mrg /* w.s.high = 1..1 or 0..0 */
482 1.1 mrg w.s.high = uu.s.high >> (W_TYPE_SIZE - 1);
483 1.1 mrg w.s.low = uu.s.high >> -bm;
484 1.1 mrg }
485 1.1 mrg else
486 1.1 mrg {
487 1.1 mrg const UWtype carries = (UWtype) uu.s.high << bm;
488 1.1 mrg
489 1.1 mrg w.s.high = uu.s.high >> b;
490 1.1 mrg w.s.low = ((UWtype) uu.s.low >> b) | carries;
491 1.1 mrg }
492 1.1 mrg
493 1.1 mrg return w.ll;
494 1.1 mrg }
495 1.1 mrg #endif
496 1.1 mrg
497 1.1 mrg #ifdef L_bswapsi2
499 1.1 mrg SItype
500 1.1 mrg __bswapsi2 (SItype u)
501 1.1 mrg {
502 1.1 mrg return ((((u) & 0xff000000) >> 24)
503 1.1 mrg | (((u) & 0x00ff0000) >> 8)
504 1.1 mrg | (((u) & 0x0000ff00) << 8)
505 1.1 mrg | (((u) & 0x000000ff) << 24));
506 1.1 mrg }
507 1.1 mrg #endif
508 1.1 mrg #ifdef L_bswapdi2
509 1.1 mrg DItype
510 1.1 mrg __bswapdi2 (DItype u)
511 1.1 mrg {
512 1.1 mrg return ((((u) & 0xff00000000000000ull) >> 56)
513 1.1 mrg | (((u) & 0x00ff000000000000ull) >> 40)
514 1.1 mrg | (((u) & 0x0000ff0000000000ull) >> 24)
515 1.1 mrg | (((u) & 0x000000ff00000000ull) >> 8)
516 1.1 mrg | (((u) & 0x00000000ff000000ull) << 8)
517 1.1 mrg | (((u) & 0x0000000000ff0000ull) << 24)
518 1.1 mrg | (((u) & 0x000000000000ff00ull) << 40)
519 1.1 mrg | (((u) & 0x00000000000000ffull) << 56));
520 1.1 mrg }
521 1.1 mrg #endif
522 1.1 mrg #ifdef L_ffssi2
523 1.1 mrg #undef int
524 1.1 mrg int
525 1.1 mrg __ffsSI2 (UWtype u)
526 1.1 mrg {
527 1.1 mrg UWtype count;
528 1.1 mrg
529 1.1 mrg if (u == 0)
530 1.1 mrg return 0;
531 1.1 mrg
532 1.1 mrg count_trailing_zeros (count, u);
533 1.1 mrg return count + 1;
534 1.1 mrg }
535 1.1 mrg #endif
536 1.1 mrg
537 1.1 mrg #ifdef L_ffsdi2
539 1.1 mrg #undef int
540 1.1 mrg int
541 1.1 mrg __ffsDI2 (DWtype u)
542 1.1 mrg {
543 1.1 mrg const DWunion uu = {.ll = u};
544 1.1 mrg UWtype word, count, add;
545 1.1 mrg
546 1.1 mrg if (uu.s.low != 0)
547 1.1 mrg word = uu.s.low, add = 0;
548 1.1 mrg else if (uu.s.high != 0)
549 1.1 mrg word = uu.s.high, add = W_TYPE_SIZE;
550 1.1 mrg else
551 1.1 mrg return 0;
552 1.1 mrg
553 1.1 mrg count_trailing_zeros (count, word);
554 1.1 mrg return count + add + 1;
555 1.1 mrg }
556 1.1 mrg #endif
557 1.1 mrg
558 1.1 mrg #ifdef L_muldi3
560 1.1 mrg DWtype
561 1.1 mrg __muldi3 (DWtype u, DWtype v)
562 1.1 mrg {
563 1.1 mrg const DWunion uu = {.ll = u};
564 1.1 mrg const DWunion vv = {.ll = v};
565 1.1 mrg DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
566 1.1 mrg
567 1.1 mrg w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
568 1.1 mrg + (UWtype) uu.s.high * (UWtype) vv.s.low);
569 1.1 mrg
570 1.1 mrg return w.ll;
571 1.1 mrg }
572 1.1 mrg #endif
573 1.1 mrg
574 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
576 1.1 mrg defined (L_umoddi3) || defined (L_moddi3))
577 1.1 mrg #if defined (sdiv_qrnnd)
578 1.1 mrg #define L_udiv_w_sdiv
579 1.1 mrg #endif
580 1.1 mrg #endif
581 1.1 mrg
582 1.1 mrg #ifdef L_udiv_w_sdiv
583 1.1 mrg #if defined (sdiv_qrnnd)
584 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
585 1.1 mrg defined (L_umoddi3) || defined (L_moddi3))
586 1.1 mrg static inline __attribute__ ((__always_inline__))
587 1.1 mrg #endif
588 1.1 mrg UWtype
589 1.1 mrg __udiv_w_sdiv (UWtype *rp, UWtype a1, UWtype a0, UWtype d)
590 1.1 mrg {
591 1.1 mrg UWtype q, r;
592 1.1 mrg UWtype c0, c1, b1;
593 1.1 mrg
594 1.1 mrg if ((Wtype) d >= 0)
595 1.1 mrg {
596 1.1 mrg if (a1 < d - a1 - (a0 >> (W_TYPE_SIZE - 1)))
597 1.1 mrg {
598 1.1 mrg /* Dividend, divisor, and quotient are nonnegative. */
599 1.1 mrg sdiv_qrnnd (q, r, a1, a0, d);
600 1.1 mrg }
601 1.1 mrg else
602 1.1 mrg {
603 1.1 mrg /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d. */
604 1.1 mrg sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (W_TYPE_SIZE - 1));
605 1.1 mrg /* Divide (c1*2^32 + c0) by d. */
606 1.1 mrg sdiv_qrnnd (q, r, c1, c0, d);
607 1.1 mrg /* Add 2^31 to quotient. */
608 1.1 mrg q += (UWtype) 1 << (W_TYPE_SIZE - 1);
609 1.1 mrg }
610 1.1 mrg }
611 1.1 mrg else
612 1.1 mrg {
613 1.1 mrg b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
614 1.1 mrg c1 = a1 >> 1; /* A/2 */
615 1.1 mrg c0 = (a1 << (W_TYPE_SIZE - 1)) + (a0 >> 1);
616 1.1 mrg
617 1.1 mrg if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
618 1.1 mrg {
619 1.1 mrg sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
620 1.1 mrg
621 1.1 mrg r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
622 1.1 mrg if ((d & 1) != 0)
623 1.1 mrg {
624 1.1 mrg if (r >= q)
625 1.1 mrg r = r - q;
626 1.1 mrg else if (q - r <= d)
627 1.1 mrg {
628 1.1 mrg r = r - q + d;
629 1.1 mrg q--;
630 1.1 mrg }
631 1.1 mrg else
632 1.1 mrg {
633 1.1 mrg r = r - q + 2*d;
634 1.1 mrg q -= 2;
635 1.1 mrg }
636 1.1 mrg }
637 1.1 mrg }
638 1.1 mrg else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
639 1.1 mrg {
640 1.1 mrg c1 = (b1 - 1) - c1;
641 1.1 mrg c0 = ~c0; /* logical NOT */
642 1.1 mrg
643 1.1 mrg sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
644 1.1 mrg
645 1.1 mrg q = ~q; /* (A/2)/b1 */
646 1.1 mrg r = (b1 - 1) - r;
647 1.1 mrg
648 1.1 mrg r = 2*r + (a0 & 1); /* A/(2*b1) */
649 1.1 mrg
650 1.1 mrg if ((d & 1) != 0)
651 1.1 mrg {
652 1.1 mrg if (r >= q)
653 1.1 mrg r = r - q;
654 1.1 mrg else if (q - r <= d)
655 1.1 mrg {
656 1.1 mrg r = r - q + d;
657 1.1 mrg q--;
658 1.1 mrg }
659 1.1 mrg else
660 1.1 mrg {
661 1.1 mrg r = r - q + 2*d;
662 1.1 mrg q -= 2;
663 1.1 mrg }
664 1.1 mrg }
665 1.1 mrg }
666 1.1 mrg else /* Implies c1 = b1 */
667 1.1 mrg { /* Hence a1 = d - 1 = 2*b1 - 1 */
668 1.1 mrg if (a0 >= -d)
669 1.1 mrg {
670 1.1 mrg q = -1;
671 1.1 mrg r = a0 + d;
672 1.1 mrg }
673 1.1 mrg else
674 1.1 mrg {
675 1.1 mrg q = -2;
676 1.1 mrg r = a0 + 2*d;
677 1.1 mrg }
678 1.1 mrg }
679 1.1 mrg }
680 1.1 mrg
681 1.1 mrg *rp = r;
682 1.1 mrg return q;
683 1.1 mrg }
684 1.1 mrg #else
685 1.1 mrg /* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */
686 1.1 mrg UWtype
687 1.1 mrg __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)),
688 1.1 mrg UWtype a1 __attribute__ ((__unused__)),
689 1.1 mrg UWtype a0 __attribute__ ((__unused__)),
690 1.1 mrg UWtype d __attribute__ ((__unused__)))
691 1.1 mrg {
692 1.1 mrg return 0;
693 1.1 mrg }
694 1.1 mrg #endif
695 1.1 mrg #endif
696 1.1 mrg
697 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
699 1.1 mrg defined (L_umoddi3) || defined (L_moddi3))
700 1.1 mrg #define L_udivmoddi4
701 1.1 mrg #endif
702 1.1 mrg
703 1.1 mrg #ifdef L_clz
704 1.1 mrg const UQItype __clz_tab[256] =
705 1.1 mrg {
706 1.1 mrg 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,
707 1.1 mrg 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,
708 1.1 mrg 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,
709 1.1 mrg 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,
710 1.1 mrg 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,
711 1.1 mrg 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,
712 1.1 mrg 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,
713 1.1 mrg 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
714 1.1 mrg };
715 1.1 mrg #endif
716 1.1 mrg
717 1.1 mrg #ifdef L_clzsi2
719 1.1 mrg #undef int
720 1.1 mrg int
721 1.1 mrg __clzSI2 (UWtype x)
722 1.1 mrg {
723 1.1 mrg Wtype ret;
724 1.1 mrg
725 1.1 mrg count_leading_zeros (ret, x);
726 1.1 mrg
727 1.1 mrg return ret;
728 1.1 mrg }
729 1.1 mrg #endif
730 1.1 mrg
731 1.1 mrg #ifdef L_clzdi2
733 1.1 mrg #undef int
734 1.1 mrg int
735 1.1 mrg __clzDI2 (UDWtype x)
736 1.1 mrg {
737 1.1 mrg const DWunion uu = {.ll = x};
738 1.1 mrg UWtype word;
739 1.1 mrg Wtype ret, add;
740 1.1 mrg
741 1.1 mrg if (uu.s.high)
742 1.1 mrg word = uu.s.high, add = 0;
743 1.1 mrg else
744 1.1 mrg word = uu.s.low, add = W_TYPE_SIZE;
745 1.1 mrg
746 1.1 mrg count_leading_zeros (ret, word);
747 1.1 mrg return ret + add;
748 1.1 mrg }
749 1.1 mrg #endif
750 1.1 mrg
751 1.1 mrg #ifdef L_ctzsi2
753 1.1 mrg #undef int
754 1.1 mrg int
755 1.1 mrg __ctzSI2 (UWtype x)
756 1.1 mrg {
757 1.1 mrg Wtype ret;
758 1.1 mrg
759 1.1 mrg count_trailing_zeros (ret, x);
760 1.1 mrg
761 1.1 mrg return ret;
762 1.1 mrg }
763 1.1 mrg #endif
764 1.1 mrg
765 1.1 mrg #ifdef L_ctzdi2
767 1.1 mrg #undef int
768 1.1 mrg int
769 1.1 mrg __ctzDI2 (UDWtype x)
770 1.1 mrg {
771 1.1 mrg const DWunion uu = {.ll = x};
772 1.1 mrg UWtype word;
773 1.1 mrg Wtype ret, add;
774 1.1 mrg
775 1.1 mrg if (uu.s.low)
776 1.1 mrg word = uu.s.low, add = 0;
777 1.1 mrg else
778 1.1 mrg word = uu.s.high, add = W_TYPE_SIZE;
779 1.1 mrg
780 1.1 mrg count_trailing_zeros (ret, word);
781 1.1 mrg return ret + add;
782 1.1 mrg }
783 1.1 mrg #endif
784 1.1 mrg
785 1.1 mrg #ifdef L_clrsbsi2
787 1.1 mrg #undef int
788 1.1 mrg int
789 1.1 mrg __clrsbSI2 (Wtype x)
790 1.1 mrg {
791 1.1 mrg Wtype ret;
792 1.1 mrg
793 1.1 mrg if (x < 0)
794 1.1 mrg x = ~x;
795 1.1 mrg if (x == 0)
796 1.1 mrg return W_TYPE_SIZE - 1;
797 1.1 mrg count_leading_zeros (ret, x);
798 1.1 mrg return ret - 1;
799 1.1 mrg }
800 1.1 mrg #endif
801 1.1 mrg
802 1.1 mrg #ifdef L_clrsbdi2
804 1.1 mrg #undef int
805 1.1 mrg int
806 1.1 mrg __clrsbDI2 (DWtype x)
807 1.1 mrg {
808 1.1 mrg const DWunion uu = {.ll = x};
809 1.1 mrg UWtype word;
810 1.1 mrg Wtype ret, add;
811 1.1 mrg
812 1.1 mrg if (uu.s.high == 0)
813 1.1 mrg word = uu.s.low, add = W_TYPE_SIZE;
814 1.1 mrg else if (uu.s.high == -1)
815 1.1 mrg word = ~uu.s.low, add = W_TYPE_SIZE;
816 1.1 mrg else if (uu.s.high >= 0)
817 1.1 mrg word = uu.s.high, add = 0;
818 1.1 mrg else
819 1.1 mrg word = ~uu.s.high, add = 0;
820 1.1 mrg
821 1.1 mrg if (word == 0)
822 1.3 mrg ret = W_TYPE_SIZE;
823 1.5 mrg else
824 1.5 mrg count_leading_zeros (ret, word);
825 1.5 mrg
826 1.5 mrg return ret + add - 1;
827 1.3 mrg }
828 1.5 mrg #endif
829 1.3 mrg
830 1.5 mrg #ifdef L_popcount_tab
832 1.5 mrg const UQItype __popcount_tab[256] =
833 1.3 mrg {
834 1.3 mrg 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,
835 1.3 mrg 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,
836 1.3 mrg 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,
837 1.1 mrg 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,
838 1.1 mrg 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,
839 1.1 mrg 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,
840 1.1 mrg 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,
841 1.1 mrg 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
842 1.3 mrg };
843 1.3 mrg #endif
844 1.3 mrg
845 1.5 mrg #if defined(L_popcountsi2) || defined(L_popcountdi2)
847 1.3 mrg #define POPCOUNTCST2(x) (((UWtype) x << __CHAR_BIT__) | x)
848 1.3 mrg #define POPCOUNTCST4(x) (((UWtype) x << (2 * __CHAR_BIT__)) | x)
849 1.5 mrg #define POPCOUNTCST8(x) (((UWtype) x << (4 * __CHAR_BIT__)) | x)
850 1.3 mrg #if W_TYPE_SIZE == __CHAR_BIT__
851 1.1 mrg #define POPCOUNTCST(x) x
852 1.1 mrg #elif W_TYPE_SIZE == 2 * __CHAR_BIT__
853 1.1 mrg #define POPCOUNTCST(x) POPCOUNTCST2 (x)
854 1.1 mrg #elif W_TYPE_SIZE == 4 * __CHAR_BIT__
855 1.1 mrg #define POPCOUNTCST(x) POPCOUNTCST4 (POPCOUNTCST2 (x))
856 1.1 mrg #elif W_TYPE_SIZE == 8 * __CHAR_BIT__
857 1.3 mrg #define POPCOUNTCST(x) POPCOUNTCST8 (POPCOUNTCST4 (POPCOUNTCST2 (x)))
858 1.1 mrg #endif
859 1.1 mrg #endif
860 1.1 mrg
861 1.1 mrg #ifdef L_popcountsi2
863 1.1 mrg #undef int
864 1.1 mrg int
865 1.1 mrg __popcountSI2 (UWtype x)
866 1.3 mrg {
867 1.3 mrg /* Force table lookup on targets like AVR and RL78 which only
868 1.3 mrg pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
869 1.5 mrg have 1, and other small word targets. */
870 1.3 mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
871 1.3 mrg x = x - ((x >> 1) & POPCOUNTCST (0x55));
872 1.3 mrg x = (x & POPCOUNTCST (0x33)) + ((x >> 2) & POPCOUNTCST (0x33));
873 1.3 mrg x = (x + (x >> 4)) & POPCOUNTCST (0x0F);
874 1.3 mrg return (x * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__);
875 1.3 mrg #else
876 1.3 mrg int i, ret = 0;
877 1.3 mrg
878 1.3 mrg for (i = 0; i < W_TYPE_SIZE; i += 8)
879 1.5 mrg ret += __popcount_tab[(x >> i) & 0xff];
880 1.3 mrg
881 1.1 mrg return ret;
882 1.1 mrg #endif
883 1.1 mrg }
884 1.1 mrg #endif
885 1.1 mrg
886 1.1 mrg #ifdef L_popcountdi2
888 1.1 mrg #undef int
889 1.1 mrg int
890 1.1 mrg __popcountDI2 (UDWtype x)
891 1.1 mrg {
892 1.1 mrg /* Force table lookup on targets like AVR and RL78 which only
893 1.1 mrg pretend they have LIBGCC2_UNITS_PER_WORD 4, but actually
894 1.1 mrg have 1, and other small word targets. */
895 1.1 mrg #if __SIZEOF_INT__ > 2 && defined (POPCOUNTCST) && __CHAR_BIT__ == 8
896 1.1 mrg const DWunion uu = {.ll = x};
897 1.1 mrg UWtype x1 = uu.s.low, x2 = uu.s.high;
898 1.1 mrg x1 = x1 - ((x1 >> 1) & POPCOUNTCST (0x55));
899 1.1 mrg x2 = x2 - ((x2 >> 1) & POPCOUNTCST (0x55));
900 1.1 mrg x1 = (x1 & POPCOUNTCST (0x33)) + ((x1 >> 2) & POPCOUNTCST (0x33));
901 1.1 mrg x2 = (x2 & POPCOUNTCST (0x33)) + ((x2 >> 2) & POPCOUNTCST (0x33));
902 1.1 mrg x1 = (x1 + (x1 >> 4)) & POPCOUNTCST (0x0F);
903 1.1 mrg x2 = (x2 + (x2 >> 4)) & POPCOUNTCST (0x0F);
904 1.1 mrg x1 += x2;
905 1.1 mrg return (x1 * POPCOUNTCST (0x01)) >> (W_TYPE_SIZE - __CHAR_BIT__);
906 1.1 mrg #else
907 1.1 mrg int i, ret = 0;
908 1.1 mrg
909 1.1 mrg for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
910 1.1 mrg ret += __popcount_tab[(x >> i) & 0xff];
911 1.1 mrg
912 1.1 mrg return ret;
913 1.1 mrg #endif
914 1.1 mrg }
915 1.1 mrg #endif
916 1.1 mrg
917 1.1 mrg #ifdef L_paritysi2
919 1.1 mrg #undef int
920 1.1 mrg int
921 1.1 mrg __paritySI2 (UWtype x)
922 1.1 mrg {
923 1.1 mrg #if W_TYPE_SIZE > 64
924 1.1 mrg # error "fill out the table"
925 1.1 mrg #endif
926 1.1 mrg #if W_TYPE_SIZE > 32
927 1.1 mrg x ^= x >> 32;
928 1.1 mrg #endif
929 1.1 mrg #if W_TYPE_SIZE > 16
930 1.1 mrg x ^= x >> 16;
931 1.1 mrg #endif
932 1.1 mrg x ^= x >> 8;
933 1.1 mrg x ^= x >> 4;
934 1.1 mrg x &= 0xf;
935 1.1 mrg return (0x6996 >> x) & 1;
936 1.1 mrg }
937 1.3 mrg #endif
938 1.3 mrg
939 1.3 mrg #ifdef L_paritydi2
941 1.3 mrg #undef int
942 1.3 mrg int
943 1.3 mrg __parityDI2 (UDWtype x)
944 1.3 mrg {
945 1.3 mrg const DWunion uu = {.ll = x};
946 1.3 mrg UWtype nx = uu.s.low ^ uu.s.high;
947 1.3 mrg
948 1.3 mrg #if W_TYPE_SIZE > 64
949 1.3 mrg # error "fill out the table"
950 1.3 mrg #endif
951 1.3 mrg #if W_TYPE_SIZE > 32
952 1.3 mrg nx ^= nx >> 32;
953 1.3 mrg #endif
954 1.3 mrg #if W_TYPE_SIZE > 16
955 1.3 mrg nx ^= nx >> 16;
956 1.3 mrg #endif
957 1.3 mrg nx ^= nx >> 8;
958 1.3 mrg nx ^= nx >> 4;
959 1.3 mrg nx &= 0xf;
960 1.3 mrg return (0x6996 >> nx) & 1;
961 1.3 mrg }
962 1.3 mrg #endif
963 1.3 mrg
964 1.3 mrg #ifdef L_udivmoddi4
965 1.3 mrg #ifdef TARGET_HAS_NO_HW_DIVIDE
966 1.3 mrg
967 1.3 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
968 1.3 mrg defined (L_umoddi3) || defined (L_moddi3))
969 1.3 mrg static inline __attribute__ ((__always_inline__))
970 1.3 mrg #endif
971 1.3 mrg UDWtype
972 1.3 mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
973 1.3 mrg {
974 1.3 mrg UDWtype q = 0, r = n, y = d;
975 1.3 mrg UWtype lz1, lz2, i, k;
976 1.3 mrg
977 1.3 mrg /* Implements align divisor shift dividend method. This algorithm
978 1.3 mrg aligns the divisor under the dividend and then perform number of
979 1.3 mrg test-subtract iterations which shift the dividend left. Number of
980 1.3 mrg iterations is k + 1 where k is the number of bit positions the
981 1.3 mrg divisor must be shifted left to align it under the dividend.
982 1.3 mrg quotient bits can be saved in the rightmost positions of the dividend
983 1.3 mrg as it shifts left on each test-subtract iteration. */
984 1.3 mrg
985 1.3 mrg if (y <= r)
986 1.3 mrg {
987 1.3 mrg lz1 = __builtin_clzll (d);
988 1.3 mrg lz2 = __builtin_clzll (n);
989 1.3 mrg
990 1.3 mrg k = lz1 - lz2;
991 1.3 mrg y = (y << k);
992 1.3 mrg
993 1.3 mrg /* Dividend can exceed 2 ^ (width 1) 1 but still be less than the
994 1.3 mrg aligned divisor. Normal iteration can drops the high order bit
995 1.3 mrg of the dividend. Therefore, first test-subtract iteration is a
996 1.3 mrg special case, saving its quotient bit in a separate location and
997 1.3 mrg not shifting the dividend. */
998 1.3 mrg if (r >= y)
999 1.3 mrg {
1000 1.3 mrg r = r - y;
1001 1.3 mrg q = (1ULL << k);
1002 1.3 mrg }
1003 1.3 mrg
1004 1.3 mrg if (k > 0)
1005 1.1 mrg {
1006 1.1 mrg y = y >> 1;
1007 1.1 mrg
1008 1.1 mrg /* k additional iterations where k regular test subtract shift
1009 1.1 mrg dividend iterations are done. */
1010 1.1 mrg i = k;
1011 1.1 mrg do
1012 1.1 mrg {
1013 1.1 mrg if (r >= y)
1014 1.1 mrg r = ((r - y) << 1) + 1;
1015 1.1 mrg else
1016 1.1 mrg r = (r << 1);
1017 1.1 mrg i = i - 1;
1018 1.1 mrg } while (i != 0);
1019 1.1 mrg
1020 1.1 mrg /* First quotient bit is combined with the quotient bits resulting
1021 1.1 mrg from the k regular iterations. */
1022 1.1 mrg q = q + r;
1023 1.1 mrg r = r >> k;
1024 1.1 mrg q = q - (r << k);
1025 1.1 mrg }
1026 1.1 mrg }
1027 1.1 mrg
1028 1.1 mrg if (rp)
1029 1.1 mrg *rp = r;
1030 1.1 mrg return q;
1031 1.1 mrg }
1032 1.1 mrg #else
1033 1.1 mrg
1034 1.1 mrg #if (defined (L_udivdi3) || defined (L_divdi3) || \
1035 1.1 mrg defined (L_umoddi3) || defined (L_moddi3))
1036 1.1 mrg static inline __attribute__ ((__always_inline__))
1037 1.1 mrg #endif
1038 1.1 mrg UDWtype
1039 1.1 mrg __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
1040 1.1 mrg {
1041 1.1 mrg const DWunion nn = {.ll = n};
1042 1.1 mrg const DWunion dd = {.ll = d};
1043 1.1 mrg DWunion rr;
1044 1.1 mrg UWtype d0, d1, n0, n1, n2;
1045 1.1 mrg UWtype q0, q1;
1046 1.1 mrg UWtype b, bm;
1047 1.1 mrg
1048 1.1 mrg d0 = dd.s.low;
1049 1.1 mrg d1 = dd.s.high;
1050 1.1 mrg n0 = nn.s.low;
1051 1.1 mrg n1 = nn.s.high;
1052 1.1 mrg
1053 1.1 mrg #if !UDIV_NEEDS_NORMALIZATION
1054 1.1 mrg if (d1 == 0)
1055 1.1 mrg {
1056 1.1 mrg if (d0 > n1)
1057 1.1 mrg {
1058 1.1 mrg /* 0q = nn / 0D */
1059 1.1 mrg
1060 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0);
1061 1.1 mrg q1 = 0;
1062 1.1 mrg
1063 1.1 mrg /* Remainder in n0. */
1064 1.1 mrg }
1065 1.1 mrg else
1066 1.1 mrg {
1067 1.1 mrg /* qq = NN / 0d */
1068 1.1 mrg
1069 1.1 mrg if (d0 == 0)
1070 1.1 mrg d0 = 1 / d0; /* Divide intentionally by zero. */
1071 1.1 mrg
1072 1.1 mrg udiv_qrnnd (q1, n1, 0, n1, d0);
1073 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0);
1074 1.1 mrg
1075 1.1 mrg /* Remainder in n0. */
1076 1.1 mrg }
1077 1.1 mrg
1078 1.1 mrg if (rp != 0)
1079 1.1 mrg {
1080 1.1 mrg rr.s.low = n0;
1081 1.1 mrg rr.s.high = 0;
1082 1.1 mrg *rp = rr.ll;
1083 1.1 mrg }
1084 1.1 mrg }
1085 1.1 mrg
1086 1.1 mrg #else /* UDIV_NEEDS_NORMALIZATION */
1087 1.1 mrg
1088 1.1 mrg if (d1 == 0)
1089 1.1 mrg {
1090 1.1 mrg if (d0 > n1)
1091 1.1 mrg {
1092 1.1 mrg /* 0q = nn / 0D */
1093 1.1 mrg
1094 1.1 mrg count_leading_zeros (bm, d0);
1095 1.1 mrg
1096 1.1 mrg if (bm != 0)
1097 1.1 mrg {
1098 1.1 mrg /* Normalize, i.e. make the most significant bit of the
1099 1.1 mrg denominator set. */
1100 1.1 mrg
1101 1.1 mrg d0 = d0 << bm;
1102 1.1 mrg n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
1103 1.1 mrg n0 = n0 << bm;
1104 1.1 mrg }
1105 1.1 mrg
1106 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0);
1107 1.1 mrg q1 = 0;
1108 1.1 mrg
1109 1.1 mrg /* Remainder in n0 >> bm. */
1110 1.1 mrg }
1111 1.1 mrg else
1112 1.1 mrg {
1113 1.1 mrg /* qq = NN / 0d */
1114 1.1 mrg
1115 1.1 mrg if (d0 == 0)
1116 1.1 mrg d0 = 1 / d0; /* Divide intentionally by zero. */
1117 1.1 mrg
1118 1.1 mrg count_leading_zeros (bm, d0);
1119 1.1 mrg
1120 1.1 mrg if (bm == 0)
1121 1.1 mrg {
1122 1.1 mrg /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
1123 1.1 mrg conclude (the most significant bit of n1 is set) /\ (the
1124 1.1 mrg leading quotient digit q1 = 1).
1125 1.1 mrg
1126 1.1 mrg This special case is necessary, not an optimization.
1127 1.1 mrg (Shifts counts of W_TYPE_SIZE are undefined.) */
1128 1.1 mrg
1129 1.1 mrg n1 -= d0;
1130 1.1 mrg q1 = 1;
1131 1.1 mrg }
1132 1.1 mrg else
1133 1.1 mrg {
1134 1.1 mrg /* Normalize. */
1135 1.1 mrg
1136 1.1 mrg b = W_TYPE_SIZE - bm;
1137 1.1 mrg
1138 1.1 mrg d0 = d0 << bm;
1139 1.1 mrg n2 = n1 >> b;
1140 1.1 mrg n1 = (n1 << bm) | (n0 >> b);
1141 1.1 mrg n0 = n0 << bm;
1142 1.1 mrg
1143 1.1 mrg udiv_qrnnd (q1, n1, n2, n1, d0);
1144 1.1 mrg }
1145 1.1 mrg
1146 1.1 mrg /* n1 != d0... */
1147 1.1 mrg
1148 1.1 mrg udiv_qrnnd (q0, n0, n1, n0, d0);
1149 1.1 mrg
1150 1.1 mrg /* Remainder in n0 >> bm. */
1151 1.1 mrg }
1152 1.1 mrg
1153 1.1 mrg if (rp != 0)
1154 1.1 mrg {
1155 1.1 mrg rr.s.low = n0 >> bm;
1156 1.1 mrg rr.s.high = 0;
1157 1.1 mrg *rp = rr.ll;
1158 1.1 mrg }
1159 1.1 mrg }
1160 1.1 mrg #endif /* UDIV_NEEDS_NORMALIZATION */
1161 1.1 mrg
1162 1.1 mrg else
1163 1.1 mrg {
1164 1.1 mrg if (d1 > n1)
1165 1.1 mrg {
1166 1.1 mrg /* 00 = nn / DD */
1167 1.1 mrg
1168 1.1 mrg q0 = 0;
1169 1.1 mrg q1 = 0;
1170 1.1 mrg
1171 1.1 mrg /* Remainder in n1n0. */
1172 1.1 mrg if (rp != 0)
1173 1.1 mrg {
1174 1.1 mrg rr.s.low = n0;
1175 1.1 mrg rr.s.high = n1;
1176 1.1 mrg *rp = rr.ll;
1177 1.1 mrg }
1178 1.1 mrg }
1179 1.1 mrg else
1180 1.1 mrg {
1181 1.1 mrg /* 0q = NN / dd */
1182 1.1 mrg
1183 1.1 mrg count_leading_zeros (bm, d1);
1184 1.1 mrg if (bm == 0)
1185 1.1 mrg {
1186 1.1 mrg /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
1187 1.1 mrg conclude (the most significant bit of n1 is set) /\ (the
1188 1.1 mrg quotient digit q0 = 0 or 1).
1189 1.1 mrg
1190 1.1 mrg This special case is necessary, not an optimization. */
1191 1.1 mrg
1192 1.1 mrg /* The condition on the next line takes advantage of that
1193 1.1 mrg n1 >= d1 (true due to program flow). */
1194 1.1 mrg if (n1 > d1 || n0 >= d0)
1195 1.1 mrg {
1196 1.1 mrg q0 = 1;
1197 1.1 mrg sub_ddmmss (n1, n0, n1, n0, d1, d0);
1198 1.1 mrg }
1199 1.1 mrg else
1200 1.1 mrg q0 = 0;
1201 1.1 mrg
1202 1.1 mrg q1 = 0;
1203 1.1 mrg
1204 1.1 mrg if (rp != 0)
1205 1.1 mrg {
1206 1.1 mrg rr.s.low = n0;
1207 1.1 mrg rr.s.high = n1;
1208 1.1 mrg *rp = rr.ll;
1209 1.1 mrg }
1210 1.1 mrg }
1211 1.1 mrg else
1212 1.1 mrg {
1213 1.1 mrg UWtype m1, m0;
1214 1.1 mrg /* Normalize. */
1215 1.1 mrg
1216 1.1 mrg b = W_TYPE_SIZE - bm;
1217 1.1 mrg
1218 1.1 mrg d1 = (d1 << bm) | (d0 >> b);
1219 1.1 mrg d0 = d0 << bm;
1220 1.1 mrg n2 = n1 >> b;
1221 1.1 mrg n1 = (n1 << bm) | (n0 >> b);
1222 1.1 mrg n0 = n0 << bm;
1223 1.3 mrg
1224 1.1 mrg udiv_qrnnd (q0, n1, n2, n1, d1);
1225 1.1 mrg umul_ppmm (m1, m0, q0, d0);
1226 1.1 mrg
1227 1.1 mrg if (m1 > n1 || (m1 == n1 && m0 > n0))
1228 1.1 mrg {
1229 1.1 mrg q0--;
1230 1.1 mrg sub_ddmmss (m1, m0, m1, m0, d1, d0);
1231 1.1 mrg }
1232 1.1 mrg
1233 1.1 mrg q1 = 0;
1234 1.1 mrg
1235 1.1 mrg /* Remainder in (n1n0 - m1m0) >> bm. */
1236 1.1 mrg if (rp != 0)
1237 1.1 mrg {
1238 1.1 mrg sub_ddmmss (n1, n0, n1, n0, m1, m0);
1239 1.1 mrg rr.s.low = (n1 << b) | (n0 >> bm);
1240 1.1 mrg rr.s.high = n1 >> bm;
1241 1.1 mrg *rp = rr.ll;
1242 1.1 mrg }
1243 1.1 mrg }
1244 1.1 mrg }
1245 1.1 mrg }
1246 1.1 mrg
1247 1.1 mrg const DWunion ww = {{.low = q0, .high = q1}};
1248 1.1 mrg return ww.ll;
1249 1.1 mrg }
1250 1.1 mrg #endif
1251 1.1 mrg #endif
1252 1.1 mrg
1253 1.1 mrg #ifdef L_divdi3
1254 1.1 mrg DWtype
1255 1.1 mrg __divdi3 (DWtype u, DWtype v)
1256 1.1 mrg {
1257 1.1 mrg Wtype c = 0;
1258 1.1 mrg DWunion uu = {.ll = u};
1259 1.1 mrg DWunion vv = {.ll = v};
1260 1.1 mrg DWtype w;
1261 1.1 mrg
1262 1.1 mrg if (uu.s.high < 0)
1263 1.1 mrg c = ~c,
1264 1.1 mrg uu.ll = -uu.ll;
1265 1.1 mrg if (vv.s.high < 0)
1266 1.1 mrg c = ~c,
1267 1.1 mrg vv.ll = -vv.ll;
1268 1.1 mrg
1269 1.1 mrg w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
1270 1.1 mrg if (c)
1271 1.1 mrg w = -w;
1272 1.1 mrg
1273 1.1 mrg return w;
1274 1.1 mrg }
1275 1.1 mrg #endif
1276 1.1 mrg
1277 1.1 mrg #ifdef L_moddi3
1278 1.1 mrg DWtype
1279 1.1 mrg __moddi3 (DWtype u, DWtype v)
1280 1.1 mrg {
1281 1.1 mrg Wtype c = 0;
1282 1.1 mrg DWunion uu = {.ll = u};
1283 1.1 mrg DWunion vv = {.ll = v};
1284 1.1 mrg DWtype w;
1285 1.1 mrg
1286 1.1 mrg if (uu.s.high < 0)
1287 1.1 mrg c = ~c,
1288 1.1 mrg uu.ll = -uu.ll;
1289 1.1 mrg if (vv.s.high < 0)
1290 1.1 mrg vv.ll = -vv.ll;
1291 1.1 mrg
1292 1.1 mrg (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w);
1293 1.1 mrg if (c)
1294 1.1 mrg w = -w;
1295 1.1 mrg
1296 1.1 mrg return w;
1297 1.1 mrg }
1298 1.1 mrg #endif
1299 1.1 mrg
1300 1.1 mrg #ifdef L_umoddi3
1301 1.1 mrg UDWtype
1302 1.1 mrg __umoddi3 (UDWtype u, UDWtype v)
1303 1.1 mrg {
1304 1.1 mrg UDWtype w;
1305 1.1 mrg
1306 1.1 mrg (void) __udivmoddi4 (u, v, &w);
1307 1.1 mrg
1308 1.1 mrg return w;
1309 1.1 mrg }
1310 1.1 mrg #endif
1311 1.1 mrg
1312 1.1 mrg #ifdef L_udivdi3
1313 1.1 mrg UDWtype
1314 1.1 mrg __udivdi3 (UDWtype n, UDWtype d)
1315 1.1 mrg {
1316 1.1 mrg return __udivmoddi4 (n, d, (UDWtype *) 0);
1317 1.1 mrg }
1318 1.1 mrg #endif
1319 1.1 mrg
1320 1.1 mrg #ifdef L_cmpdi2
1322 1.1 mrg cmp_return_type
1323 1.1 mrg __cmpdi2 (DWtype a, DWtype b)
1324 1.1 mrg {
1325 1.1 mrg const DWunion au = {.ll = a};
1326 1.1 mrg const DWunion bu = {.ll = b};
1327 1.1 mrg
1328 1.1 mrg if (au.s.high < bu.s.high)
1329 1.1 mrg return 0;
1330 1.1 mrg else if (au.s.high > bu.s.high)
1331 1.1 mrg return 2;
1332 1.1 mrg if ((UWtype) au.s.low < (UWtype) bu.s.low)
1333 1.1 mrg return 0;
1334 1.1 mrg else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1335 1.1 mrg return 2;
1336 1.1 mrg return 1;
1337 1.1 mrg }
1338 1.1 mrg #endif
1339 1.1 mrg
1340 1.1 mrg #ifdef L_ucmpdi2
1341 1.1 mrg cmp_return_type
1342 1.1 mrg __ucmpdi2 (DWtype a, DWtype b)
1343 1.1 mrg {
1344 1.1 mrg const DWunion au = {.ll = a};
1345 1.1 mrg const DWunion bu = {.ll = b};
1346 1.1 mrg
1347 1.1 mrg if ((UWtype) au.s.high < (UWtype) bu.s.high)
1348 1.1 mrg return 0;
1349 1.1 mrg else if ((UWtype) au.s.high > (UWtype) bu.s.high)
1350 1.1 mrg return 2;
1351 1.1 mrg if ((UWtype) au.s.low < (UWtype) bu.s.low)
1352 1.1 mrg return 0;
1353 1.1 mrg else if ((UWtype) au.s.low > (UWtype) bu.s.low)
1354 1.1 mrg return 2;
1355 1.1 mrg return 1;
1356 1.1 mrg }
1357 1.1 mrg #endif
1358 1.1 mrg
1359 1.1 mrg #if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
1361 1.1 mrg UDWtype
1362 1.1 mrg __fixunstfDI (TFtype a)
1363 1.1 mrg {
1364 1.1 mrg if (a < 0)
1365 1.1 mrg return 0;
1366 1.1 mrg
1367 1.1 mrg /* Compute high word of result, as a flonum. */
1368 1.1 mrg const TFtype b = (a / Wtype_MAXp1_F);
1369 1.1 mrg /* Convert that to fixed (but not to DWtype!),
1370 1.1 mrg and shift it into the high word. */
1371 1.1 mrg UDWtype v = (UWtype) b;
1372 1.1 mrg v <<= W_TYPE_SIZE;
1373 1.1 mrg /* Remove high part from the TFtype, leaving the low part as flonum. */
1374 1.1 mrg a -= (TFtype)v;
1375 1.1 mrg /* Convert that to fixed (but not to DWtype!) and add it in.
1376 1.1 mrg Sometimes A comes out negative. This is significant, since
1377 1.1 mrg A has more bits than a long int does. */
1378 1.1 mrg if (a < 0)
1379 1.1 mrg v -= (UWtype) (- a);
1380 1.1 mrg else
1381 1.1 mrg v += (UWtype) a;
1382 1.1 mrg return v;
1383 1.1 mrg }
1384 1.1 mrg #endif
1385 1.1 mrg
1386 1.1 mrg #if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
1387 1.1 mrg DWtype
1388 1.1 mrg __fixtfdi (TFtype a)
1389 1.1 mrg {
1390 1.1 mrg if (a < 0)
1391 1.1 mrg return - __fixunstfDI (-a);
1392 1.1 mrg return __fixunstfDI (a);
1393 1.1 mrg }
1394 1.1 mrg #endif
1395 1.1 mrg
1396 1.1 mrg #if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
1397 1.1 mrg UDWtype
1398 1.1 mrg __fixunsxfDI (XFtype a)
1399 1.1 mrg {
1400 1.1 mrg if (a < 0)
1401 1.1 mrg return 0;
1402 1.1 mrg
1403 1.1 mrg /* Compute high word of result, as a flonum. */
1404 1.1 mrg const XFtype b = (a / Wtype_MAXp1_F);
1405 1.1 mrg /* Convert that to fixed (but not to DWtype!),
1406 1.1 mrg and shift it into the high word. */
1407 1.1 mrg UDWtype v = (UWtype) b;
1408 1.1 mrg v <<= W_TYPE_SIZE;
1409 1.1 mrg /* Remove high part from the XFtype, leaving the low part as flonum. */
1410 1.1 mrg a -= (XFtype)v;
1411 1.1 mrg /* Convert that to fixed (but not to DWtype!) and add it in.
1412 1.1 mrg Sometimes A comes out negative. This is significant, since
1413 1.1 mrg A has more bits than a long int does. */
1414 1.1 mrg if (a < 0)
1415 1.1 mrg v -= (UWtype) (- a);
1416 1.1 mrg else
1417 1.1 mrg v += (UWtype) a;
1418 1.1 mrg return v;
1419 1.1 mrg }
1420 1.1 mrg #endif
1421 1.1 mrg
1422 1.1 mrg #if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
1423 1.1 mrg DWtype
1424 1.1 mrg __fixxfdi (XFtype a)
1425 1.1 mrg {
1426 1.1 mrg if (a < 0)
1427 1.1 mrg return - __fixunsxfDI (-a);
1428 1.1 mrg return __fixunsxfDI (a);
1429 1.1 mrg }
1430 1.1 mrg #endif
1431 1.1 mrg
1432 1.1 mrg #if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
1433 1.1 mrg UDWtype
1434 1.1 mrg __fixunsdfDI (DFtype a)
1435 1.1 mrg {
1436 1.1 mrg /* Get high part of result. The division here will just moves the radix
1437 1.1 mrg point and will not cause any rounding. Then the conversion to integral
1438 1.1 mrg type chops result as desired. */
1439 1.1 mrg const UWtype hi = a / Wtype_MAXp1_F;
1440 1.1 mrg
1441 1.1 mrg /* Get low part of result. Convert `hi' to floating type and scale it back,
1442 1.1 mrg then subtract this from the number being converted. This leaves the low
1443 1.1 mrg part. Convert that to integral type. */
1444 1.1 mrg const UWtype lo = a - (DFtype) hi * Wtype_MAXp1_F;
1445 1.1 mrg
1446 1.1 mrg /* Assemble result from the two parts. */
1447 1.1 mrg return ((UDWtype) hi << W_TYPE_SIZE) | lo;
1448 1.1 mrg }
1449 1.1 mrg #endif
1450 1.1 mrg
1451 1.1 mrg #if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
1452 1.1 mrg DWtype
1453 1.1 mrg __fixdfdi (DFtype a)
1454 1.1 mrg {
1455 1.1 mrg if (a < 0)
1456 1.1 mrg return - __fixunsdfDI (-a);
1457 1.1 mrg return __fixunsdfDI (a);
1458 1.1 mrg }
1459 1.1 mrg #endif
1460 1.1 mrg
1461 1.1 mrg #if defined(L_fixunssfdi) && LIBGCC2_HAS_SF_MODE
1462 1.1 mrg UDWtype
1463 1.1 mrg __fixunssfDI (SFtype a)
1464 1.1 mrg {
1465 1.1 mrg #if LIBGCC2_HAS_DF_MODE
1466 1.1 mrg /* Convert the SFtype to a DFtype, because that is surely not going
1467 1.1 mrg to lose any bits. Some day someone else can write a faster version
1468 1.1 mrg that avoids converting to DFtype, and verify it really works right. */
1469 1.1 mrg const DFtype dfa = a;
1470 1.1 mrg
1471 1.1 mrg /* Get high part of result. The division here will just moves the radix
1472 1.1 mrg point and will not cause any rounding. Then the conversion to integral
1473 1.1 mrg type chops result as desired. */
1474 1.1 mrg const UWtype hi = dfa / Wtype_MAXp1_F;
1475 1.1 mrg
1476 1.1 mrg /* Get low part of result. Convert `hi' to floating type and scale it back,
1477 1.1 mrg then subtract this from the number being converted. This leaves the low
1478 1.1 mrg part. Convert that to integral type. */
1479 1.1 mrg const UWtype lo = dfa - (DFtype) hi * Wtype_MAXp1_F;
1480 1.1 mrg
1481 1.1 mrg /* Assemble result from the two parts. */
1482 1.1 mrg return ((UDWtype) hi << W_TYPE_SIZE) | lo;
1483 1.1 mrg #elif FLT_MANT_DIG < W_TYPE_SIZE
1484 1.1 mrg if (a < 1)
1485 1.1 mrg return 0;
1486 1.1 mrg if (a < Wtype_MAXp1_F)
1487 1.1 mrg return (UWtype)a;
1488 1.1 mrg if (a < Wtype_MAXp1_F * Wtype_MAXp1_F)
1489 1.1 mrg {
1490 1.1 mrg /* Since we know that there are fewer significant bits in the SFmode
1491 1.1 mrg quantity than in a word, we know that we can convert out all the
1492 1.1 mrg significant bits in one step, and thus avoid losing bits. */
1493 1.1 mrg
1494 1.1 mrg /* ??? This following loop essentially performs frexpf. If we could
1495 1.1 mrg use the real libm function, or poke at the actual bits of the fp
1496 1.1 mrg format, it would be significantly faster. */
1497 1.1 mrg
1498 1.1 mrg UWtype shift = 0, counter;
1499 1.1 mrg SFtype msb;
1500 1.1 mrg
1501 1.1 mrg a /= Wtype_MAXp1_F;
1502 1.1 mrg for (counter = W_TYPE_SIZE / 2; counter != 0; counter >>= 1)
1503 1.1 mrg {
1504 1.1 mrg SFtype counterf = (UWtype)1 << counter;
1505 1.1 mrg if (a >= counterf)
1506 1.1 mrg {
1507 1.1 mrg shift |= counter;
1508 1.1 mrg a /= counterf;
1509 1.3 mrg }
1510 1.1 mrg }
1511 1.1 mrg
1512 1.1 mrg /* Rescale into the range of one word, extract the bits of that
1513 1.1 mrg one word, and shift the result into position. */
1514 1.1 mrg a *= Wtype_MAXp1_F;
1515 1.1 mrg counter = a;
1516 1.1 mrg return (DWtype)counter << shift;
1517 1.1 mrg }
1518 1.1 mrg return -1;
1519 1.1 mrg #else
1520 1.1 mrg # error
1521 1.1 mrg #endif
1522 1.1 mrg }
1523 1.3 mrg #endif
1524 1.1 mrg
1525 1.1 mrg #if defined(L_fixsfdi) && LIBGCC2_HAS_SF_MODE
1526 1.1 mrg DWtype
1527 1.1 mrg __fixsfdi (SFtype a)
1528 1.1 mrg {
1529 1.1 mrg if (a < 0)
1530 1.1 mrg return - __fixunssfDI (-a);
1531 1.1 mrg return __fixunssfDI (a);
1532 1.1 mrg }
1533 1.1 mrg #endif
1534 1.1 mrg
1535 1.1 mrg #if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
1536 1.1 mrg XFtype
1537 1.3 mrg __floatdixf (DWtype u)
1538 1.1 mrg {
1539 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
1540 1.1 mrg # error
1541 1.1 mrg #endif
1542 1.1 mrg XFtype d = (Wtype) (u >> W_TYPE_SIZE);
1543 1.1 mrg d *= Wtype_MAXp1_F;
1544 1.1 mrg d += (UWtype)u;
1545 1.1 mrg return d;
1546 1.1 mrg }
1547 1.1 mrg #endif
1548 1.1 mrg
1549 1.1 mrg #if defined(L_floatundixf) && LIBGCC2_HAS_XF_MODE
1550 1.1 mrg XFtype
1551 1.3 mrg __floatundixf (UDWtype u)
1552 1.1 mrg {
1553 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_XF_MANT_DIG__
1554 1.1 mrg # error
1555 1.1 mrg #endif
1556 1.1 mrg XFtype d = (UWtype) (u >> W_TYPE_SIZE);
1557 1.1 mrg d *= Wtype_MAXp1_F;
1558 1.1 mrg d += (UWtype)u;
1559 1.1 mrg return d;
1560 1.1 mrg }
1561 1.1 mrg #endif
1562 1.1 mrg
1563 1.1 mrg #if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
1564 1.1 mrg TFtype
1565 1.1 mrg __floatditf (DWtype u)
1566 1.1 mrg {
1567 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
1568 1.1 mrg # error
1569 1.1 mrg #endif
1570 1.1 mrg TFtype d = (Wtype) (u >> W_TYPE_SIZE);
1571 1.3 mrg d *= Wtype_MAXp1_F;
1572 1.1 mrg d += (UWtype)u;
1573 1.1 mrg return d;
1574 1.1 mrg }
1575 1.3 mrg #endif
1576 1.1 mrg
1577 1.1 mrg #if defined(L_floatunditf) && LIBGCC2_HAS_TF_MODE
1578 1.1 mrg TFtype
1579 1.1 mrg __floatunditf (UDWtype u)
1580 1.1 mrg {
1581 1.1 mrg #if W_TYPE_SIZE > __LIBGCC_TF_MANT_DIG__
1582 1.1 mrg # error
1583 1.1 mrg #endif
1584 1.1 mrg TFtype d = (UWtype) (u >> W_TYPE_SIZE);
1585 1.1 mrg d *= Wtype_MAXp1_F;
1586 1.1 mrg d += (UWtype)u;
1587 1.3 mrg return d;
1588 1.3 mrg }
1589 1.3 mrg #endif
1590 1.1 mrg
1591 1.3 mrg #if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE) \
1592 1.3 mrg || (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE)
1593 1.1 mrg #define DI_SIZE (W_TYPE_SIZE * 2)
1594 1.3 mrg #define F_MODE_OK(SIZE) \
1595 1.3 mrg (SIZE < DI_SIZE \
1596 1.1 mrg && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1597 1.3 mrg && !AVOID_FP_TYPE_CONVERSION(SIZE))
1598 1.3 mrg #if defined(L_floatdisf)
1599 1.1 mrg #define FUNC __floatdisf
1600 1.1 mrg #define FSTYPE SFtype
1601 1.1 mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__
1602 1.1 mrg #else
1603 1.1 mrg #define FUNC __floatdidf
1604 1.1 mrg #define FSTYPE DFtype
1605 1.1 mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__
1606 1.1 mrg #endif
1607 1.1 mrg
1608 1.1 mrg FSTYPE
1609 1.1 mrg FUNC (DWtype u)
1610 1.1 mrg {
1611 1.1 mrg #if FSSIZE >= W_TYPE_SIZE
1612 1.1 mrg /* When the word size is small, we never get any rounding error. */
1613 1.1 mrg FSTYPE f = (Wtype) (u >> W_TYPE_SIZE);
1614 1.1 mrg f *= Wtype_MAXp1_F;
1615 1.1 mrg f += (UWtype)u;
1616 1.1 mrg return f;
1617 1.1 mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \
1618 1.1 mrg || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \
1619 1.1 mrg || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1620 1.1 mrg
1621 1.1 mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
1622 1.1 mrg # define FSIZE __LIBGCC_DF_MANT_DIG__
1623 1.1 mrg # define FTYPE DFtype
1624 1.1 mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
1625 1.1 mrg # define FSIZE __LIBGCC_XF_MANT_DIG__
1626 1.1 mrg # define FTYPE XFtype
1627 1.1 mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1628 1.1 mrg # define FSIZE __LIBGCC_TF_MANT_DIG__
1629 1.1 mrg # define FTYPE TFtype
1630 1.1 mrg #else
1631 1.1 mrg # error
1632 1.1 mrg #endif
1633 1.1 mrg
1634 1.1 mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1635 1.1 mrg
1636 1.1 mrg /* Protect against double-rounding error.
1637 1.1 mrg Represent any low-order bits, that might be truncated by a bit that
1638 1.1 mrg won't be lost. The bit can go in anywhere below the rounding position
1639 1.1 mrg of the FSTYPE. A fixed mask and bit position handles all usual
1640 1.1 mrg configurations. */
1641 1.1 mrg if (! (- ((DWtype) 1 << FSIZE) < u
1642 1.1 mrg && u < ((DWtype) 1 << FSIZE)))
1643 1.3 mrg {
1644 1.1 mrg if ((UDWtype) u & (REP_BIT - 1))
1645 1.1 mrg {
1646 1.1 mrg u &= ~ (REP_BIT - 1);
1647 1.1 mrg u |= REP_BIT;
1648 1.1 mrg }
1649 1.1 mrg }
1650 1.1 mrg
1651 1.1 mrg /* Do the calculation in a wider type so that we don't lose any of
1652 1.1 mrg the precision of the high word while multiplying it. */
1653 1.1 mrg FTYPE f = (Wtype) (u >> W_TYPE_SIZE);
1654 1.1 mrg f *= Wtype_MAXp1_F;
1655 1.1 mrg f += (UWtype)u;
1656 1.1 mrg return (FSTYPE) f;
1657 1.1 mrg #else
1658 1.1 mrg #if FSSIZE >= W_TYPE_SIZE - 2
1659 1.1 mrg # error
1660 1.1 mrg #endif
1661 1.1 mrg /* Finally, the word size is larger than the number of bits in the
1662 1.1 mrg required FSTYPE, and we've got no suitable wider type. The only
1663 1.1 mrg way to avoid double rounding is to special case the
1664 1.1 mrg extraction. */
1665 1.1 mrg
1666 1.1 mrg /* If there are no high bits set, fall back to one conversion. */
1667 1.1 mrg if ((Wtype)u == u)
1668 1.1 mrg return (FSTYPE)(Wtype)u;
1669 1.1 mrg
1670 1.1 mrg /* Otherwise, find the power of two. */
1671 1.1 mrg Wtype hi = u >> W_TYPE_SIZE;
1672 1.1 mrg if (hi < 0)
1673 1.1 mrg hi = -(UWtype) hi;
1674 1.1 mrg
1675 1.1 mrg UWtype count, shift;
1676 1.1 mrg count_leading_zeros (count, hi);
1677 1.1 mrg
1678 1.1 mrg /* No leading bits means u == minimum. */
1679 1.1 mrg if (count == 0)
1680 1.1 mrg return -(Wtype_MAXp1_F * (Wtype_MAXp1_F / 2));
1681 1.1 mrg
1682 1.1 mrg shift = 1 + W_TYPE_SIZE - count;
1683 1.1 mrg
1684 1.1 mrg /* Shift down the most significant bits. */
1685 1.1 mrg hi = u >> shift;
1686 1.1 mrg
1687 1.3 mrg /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1688 1.1 mrg if ((UWtype)u << (W_TYPE_SIZE - shift))
1689 1.1 mrg hi |= 1;
1690 1.1 mrg
1691 1.3 mrg /* Convert the one word of data, and rescale. */
1692 1.1 mrg FSTYPE f = hi, e;
1693 1.1 mrg if (shift == W_TYPE_SIZE)
1694 1.1 mrg e = Wtype_MAXp1_F;
1695 1.1 mrg /* The following two cases could be merged if we knew that the target
1696 1.1 mrg supported a native unsigned->float conversion. More often, we only
1697 1.1 mrg have a signed conversion, and have to add extra fixup code. */
1698 1.1 mrg else if (shift == W_TYPE_SIZE - 1)
1699 1.1 mrg e = Wtype_MAXp1_F / 2;
1700 1.1 mrg else
1701 1.1 mrg e = (Wtype)1 << shift;
1702 1.1 mrg return f * e;
1703 1.3 mrg #endif
1704 1.3 mrg }
1705 1.3 mrg #endif
1706 1.1 mrg
1707 1.3 mrg #if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE) \
1708 1.3 mrg || (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE)
1709 1.1 mrg #define DI_SIZE (W_TYPE_SIZE * 2)
1710 1.3 mrg #define F_MODE_OK(SIZE) \
1711 1.3 mrg (SIZE < DI_SIZE \
1712 1.1 mrg && SIZE > (DI_SIZE - SIZE + FSSIZE) \
1713 1.3 mrg && !AVOID_FP_TYPE_CONVERSION(SIZE))
1714 1.3 mrg #if defined(L_floatundisf)
1715 1.1 mrg #define FUNC __floatundisf
1716 1.1 mrg #define FSTYPE SFtype
1717 1.1 mrg #define FSSIZE __LIBGCC_SF_MANT_DIG__
1718 1.1 mrg #else
1719 1.1 mrg #define FUNC __floatundidf
1720 1.1 mrg #define FSTYPE DFtype
1721 1.1 mrg #define FSSIZE __LIBGCC_DF_MANT_DIG__
1722 1.1 mrg #endif
1723 1.1 mrg
1724 1.1 mrg FSTYPE
1725 1.1 mrg FUNC (UDWtype u)
1726 1.1 mrg {
1727 1.1 mrg #if FSSIZE >= W_TYPE_SIZE
1728 1.1 mrg /* When the word size is small, we never get any rounding error. */
1729 1.1 mrg FSTYPE f = (UWtype) (u >> W_TYPE_SIZE);
1730 1.1 mrg f *= Wtype_MAXp1_F;
1731 1.1 mrg f += (UWtype)u;
1732 1.1 mrg return f;
1733 1.1 mrg #elif (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__)) \
1734 1.1 mrg || (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__)) \
1735 1.1 mrg || (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1736 1.1 mrg
1737 1.1 mrg #if (LIBGCC2_HAS_DF_MODE && F_MODE_OK (__LIBGCC_DF_MANT_DIG__))
1738 1.1 mrg # define FSIZE __LIBGCC_DF_MANT_DIG__
1739 1.1 mrg # define FTYPE DFtype
1740 1.1 mrg #elif (LIBGCC2_HAS_XF_MODE && F_MODE_OK (__LIBGCC_XF_MANT_DIG__))
1741 1.1 mrg # define FSIZE __LIBGCC_XF_MANT_DIG__
1742 1.1 mrg # define FTYPE XFtype
1743 1.1 mrg #elif (LIBGCC2_HAS_TF_MODE && F_MODE_OK (__LIBGCC_TF_MANT_DIG__))
1744 1.1 mrg # define FSIZE __LIBGCC_TF_MANT_DIG__
1745 1.1 mrg # define FTYPE TFtype
1746 1.1 mrg #else
1747 1.1 mrg # error
1748 1.1 mrg #endif
1749 1.1 mrg
1750 1.1 mrg #define REP_BIT ((UDWtype) 1 << (DI_SIZE - FSIZE))
1751 1.1 mrg
1752 1.1 mrg /* Protect against double-rounding error.
1753 1.1 mrg Represent any low-order bits, that might be truncated by a bit that
1754 1.1 mrg won't be lost. The bit can go in anywhere below the rounding position
1755 1.1 mrg of the FSTYPE. A fixed mask and bit position handles all usual
1756 1.1 mrg configurations. */
1757 1.1 mrg if (u >= ((UDWtype) 1 << FSIZE))
1758 1.1 mrg {
1759 1.1 mrg if ((UDWtype) u & (REP_BIT - 1))
1760 1.1 mrg {
1761 1.1 mrg u &= ~ (REP_BIT - 1);
1762 1.1 mrg u |= REP_BIT;
1763 1.1 mrg }
1764 1.1 mrg }
1765 1.1 mrg
1766 1.1 mrg /* Do the calculation in a wider type so that we don't lose any of
1767 1.1 mrg the precision of the high word while multiplying it. */
1768 1.1 mrg FTYPE f = (UWtype) (u >> W_TYPE_SIZE);
1769 1.1 mrg f *= Wtype_MAXp1_F;
1770 1.1 mrg f += (UWtype)u;
1771 1.1 mrg return (FSTYPE) f;
1772 1.1 mrg #else
1773 1.1 mrg #if FSSIZE == W_TYPE_SIZE - 1
1774 1.1 mrg # error
1775 1.1 mrg #endif
1776 1.1 mrg /* Finally, the word size is larger than the number of bits in the
1777 1.1 mrg required FSTYPE, and we've got no suitable wider type. The only
1778 1.1 mrg way to avoid double rounding is to special case the
1779 1.1 mrg extraction. */
1780 1.1 mrg
1781 1.1 mrg /* If there are no high bits set, fall back to one conversion. */
1782 1.1 mrg if ((UWtype)u == u)
1783 1.1 mrg return (FSTYPE)(UWtype)u;
1784 1.1 mrg
1785 1.1 mrg /* Otherwise, find the power of two. */
1786 1.1 mrg UWtype hi = u >> W_TYPE_SIZE;
1787 1.1 mrg
1788 1.1 mrg UWtype count, shift;
1789 1.1 mrg count_leading_zeros (count, hi);
1790 1.1 mrg
1791 1.1 mrg shift = W_TYPE_SIZE - count;
1792 1.1 mrg
1793 1.1 mrg /* Shift down the most significant bits. */
1794 1.1 mrg hi = u >> shift;
1795 1.1 mrg
1796 1.1 mrg /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */
1797 1.1 mrg if ((UWtype)u << (W_TYPE_SIZE - shift))
1798 1.1 mrg hi |= 1;
1799 1.1 mrg
1800 1.1 mrg /* Convert the one word of data, and rescale. */
1801 1.1 mrg FSTYPE f = hi, e;
1802 1.1 mrg if (shift == W_TYPE_SIZE)
1803 1.1 mrg e = Wtype_MAXp1_F;
1804 1.1 mrg /* The following two cases could be merged if we knew that the target
1805 1.1 mrg supported a native unsigned->float conversion. More often, we only
1806 1.1 mrg have a signed conversion, and have to add extra fixup code. */
1807 1.1 mrg else if (shift == W_TYPE_SIZE - 1)
1808 1.1 mrg e = Wtype_MAXp1_F / 2;
1809 1.1 mrg else
1810 1.1 mrg e = (Wtype)1 << shift;
1811 1.1 mrg return f * e;
1812 1.1 mrg #endif
1813 1.1 mrg }
1814 1.1 mrg #endif
1815 1.1 mrg
1816 1.1 mrg #if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
1817 1.1 mrg UWtype
1818 1.1 mrg __fixunsxfSI (XFtype a)
1819 1.1 mrg {
1820 1.1 mrg if (a >= - (DFtype) Wtype_MIN)
1821 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1822 1.1 mrg return (Wtype) a;
1823 1.1 mrg }
1824 1.1 mrg #endif
1825 1.1 mrg
1826 1.1 mrg #if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
1827 1.1 mrg UWtype
1828 1.1 mrg __fixunsdfSI (DFtype a)
1829 1.1 mrg {
1830 1.1 mrg if (a >= - (DFtype) Wtype_MIN)
1831 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1832 1.1 mrg return (Wtype) a;
1833 1.1 mrg }
1834 1.1 mrg #endif
1835 1.1 mrg
1836 1.1 mrg #if defined(L_fixunssfsi) && LIBGCC2_HAS_SF_MODE
1837 1.1 mrg UWtype
1838 1.1 mrg __fixunssfSI (SFtype a)
1839 1.1 mrg {
1840 1.1 mrg if (a >= - (SFtype) Wtype_MIN)
1841 1.1 mrg return (Wtype) (a + Wtype_MIN) - Wtype_MIN;
1842 1.1 mrg return (Wtype) a;
1843 1.1 mrg }
1844 1.1 mrg #endif
1845 1.1 mrg
1846 1.1 mrg /* Integer power helper used from __builtin_powi for non-constant
1848 1.1 mrg exponents. */
1849 1.1 mrg
1850 1.1 mrg #if (defined(L_powisf2) && LIBGCC2_HAS_SF_MODE) \
1851 1.1 mrg || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
1852 1.1 mrg || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
1853 1.1 mrg || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
1854 1.1 mrg # if defined(L_powisf2)
1855 1.1 mrg # define TYPE SFtype
1856 1.1 mrg # define NAME __powisf2
1857 1.1 mrg # elif defined(L_powidf2)
1858 1.1 mrg # define TYPE DFtype
1859 1.1 mrg # define NAME __powidf2
1860 1.1 mrg # elif defined(L_powixf2)
1861 1.1 mrg # define TYPE XFtype
1862 1.1 mrg # define NAME __powixf2
1863 1.1 mrg # elif defined(L_powitf2)
1864 1.1 mrg # define TYPE TFtype
1865 1.1 mrg # define NAME __powitf2
1866 1.1 mrg # endif
1867 1.1 mrg
1868 1.3 mrg #undef int
1869 1.4 mrg #undef unsigned
1870 1.1 mrg TYPE
1871 1.1 mrg NAME (TYPE x, int m)
1872 1.1 mrg {
1873 1.1 mrg unsigned int n = m < 0 ? -m : m;
1874 1.3 mrg TYPE y = n % 2 ? x : 1;
1875 1.4 mrg while (n >>= 1)
1876 1.1 mrg {
1877 1.1 mrg x = x * x;
1878 1.1 mrg if (n % 2)
1879 1.1 mrg y = y * x;
1880 1.3 mrg }
1881 1.4 mrg return m < 0 ? 1/y : y;
1882 1.1 mrg }
1883 1.1 mrg
1884 1.1 mrg #endif
1885 1.1 mrg
1886 1.3 mrg #if ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
1888 1.1 mrg || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
1889 1.1 mrg || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
1890 1.1 mrg || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
1891 1.1 mrg
1892 1.1 mrg #undef float
1893 1.1 mrg #undef double
1894 1.1 mrg #undef long
1895 1.1 mrg
1896 1.1 mrg #if defined(L_mulsc3) || defined(L_divsc3)
1897 1.1 mrg # define MTYPE SFtype
1898 1.1 mrg # define CTYPE SCtype
1899 1.1 mrg # define MODE sc
1900 1.1 mrg # define CEXT __LIBGCC_SF_FUNC_EXT__
1901 1.1 mrg # define NOTRUNC (!__LIBGCC_SF_EXCESS_PRECISION__)
1902 1.1 mrg #elif defined(L_muldc3) || defined(L_divdc3)
1903 1.1 mrg # define MTYPE DFtype
1904 1.1 mrg # define CTYPE DCtype
1905 1.1 mrg # define MODE dc
1906 1.1 mrg # define CEXT __LIBGCC_DF_FUNC_EXT__
1907 1.1 mrg # define NOTRUNC (!__LIBGCC_DF_EXCESS_PRECISION__)
1908 1.1 mrg #elif defined(L_mulxc3) || defined(L_divxc3)
1909 1.1 mrg # define MTYPE XFtype
1910 1.1 mrg # define CTYPE XCtype
1911 1.1 mrg # define MODE xc
1912 1.1 mrg # define CEXT __LIBGCC_XF_FUNC_EXT__
1913 1.1 mrg # define NOTRUNC (!__LIBGCC_XF_EXCESS_PRECISION__)
1914 1.1 mrg #elif defined(L_multc3) || defined(L_divtc3)
1915 1.1 mrg # define MTYPE TFtype
1916 1.1 mrg # define CTYPE TCtype
1917 1.1 mrg # define MODE tc
1918 1.1 mrg # define CEXT __LIBGCC_TF_FUNC_EXT__
1919 1.1 mrg # define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__)
1920 1.1 mrg #else
1921 1.1 mrg # error
1922 1.1 mrg #endif
1923 1.1 mrg
1924 1.1 mrg #define CONCAT3(A,B,C) _CONCAT3(A,B,C)
1925 1.1 mrg #define _CONCAT3(A,B,C) A##B##C
1926 1.1 mrg
1927 1.1 mrg #define CONCAT2(A,B) _CONCAT2(A,B)
1928 1.1 mrg #define _CONCAT2(A,B) A##B
1929 1.1 mrg
1930 1.1 mrg /* All of these would be present in a full C99 implementation of <math.h>
1931 1.1 mrg and <complex.h>. Our problem is that only a few systems have such full
1932 1.1 mrg implementations. Further, libgcc_s.so isn't currently linked against
1933 1.1 mrg libm.so, and even for systems that do provide full C99, the extra overhead
1934 1.1 mrg of all programs using libgcc having to link against libm. So avoid it. */
1935 1.1 mrg
1936 1.1 mrg #define isnan(x) __builtin_expect ((x) != (x), 0)
1937 1.1 mrg #define isfinite(x) __builtin_expect (!isnan((x) - (x)), 1)
1938 1.1 mrg #define isinf(x) __builtin_expect (!isnan(x) & !isfinite(x), 0)
1939 1.1 mrg
1940 1.1 mrg #define INFINITY CONCAT2(__builtin_huge_val, CEXT) ()
1941 1.1 mrg #define I 1i
1942 1.1 mrg
1943 1.1 mrg /* Helpers to make the following code slightly less gross. */
1944 1.1 mrg #define COPYSIGN CONCAT2(__builtin_copysign, CEXT)
1945 1.1 mrg #define FABS CONCAT2(__builtin_fabs, CEXT)
1946 1.1 mrg
1947 1.1 mrg /* Verify that MTYPE matches up with CEXT. */
1948 1.1 mrg extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
1949 1.1 mrg
1950 1.1 mrg /* Ensure that we've lost any extra precision. */
1951 1.1 mrg #if NOTRUNC
1952 1.1 mrg # define TRUNC(x)
1953 1.1 mrg #else
1954 1.1 mrg # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x))
1955 1.1 mrg #endif
1956 1.1 mrg
1957 1.1 mrg #if defined(L_mulsc3) || defined(L_muldc3) \
1958 1.1 mrg || defined(L_mulxc3) || defined(L_multc3)
1959 1.1 mrg
1960 1.1 mrg CTYPE
1961 1.1 mrg CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
1962 1.1 mrg {
1963 1.1 mrg MTYPE ac, bd, ad, bc, x, y;
1964 1.1 mrg CTYPE res;
1965 1.1 mrg
1966 1.1 mrg ac = a * c;
1967 1.1 mrg bd = b * d;
1968 1.1 mrg ad = a * d;
1969 1.1 mrg bc = b * c;
1970 1.1 mrg
1971 1.1 mrg TRUNC (ac);
1972 1.1 mrg TRUNC (bd);
1973 1.1 mrg TRUNC (ad);
1974 1.1 mrg TRUNC (bc);
1975 1.1 mrg
1976 1.1 mrg x = ac - bd;
1977 1.1 mrg y = ad + bc;
1978 1.1 mrg
1979 1.1 mrg if (isnan (x) && isnan (y))
1980 1.1 mrg {
1981 1.1 mrg /* Recover infinities that computed as NaN + iNaN. */
1982 1.1 mrg _Bool recalc = 0;
1983 1.1 mrg if (isinf (a) || isinf (b))
1984 1.1 mrg {
1985 1.1 mrg /* z is infinite. "Box" the infinity and change NaNs in
1986 1.1 mrg the other factor to 0. */
1987 1.1 mrg a = COPYSIGN (isinf (a) ? 1 : 0, a);
1988 1.1 mrg b = COPYSIGN (isinf (b) ? 1 : 0, b);
1989 1.1 mrg if (isnan (c)) c = COPYSIGN (0, c);
1990 1.1 mrg if (isnan (d)) d = COPYSIGN (0, d);
1991 1.1 mrg recalc = 1;
1992 1.1 mrg }
1993 1.1 mrg if (isinf (c) || isinf (d))
1994 1.1 mrg {
1995 1.1 mrg /* w is infinite. "Box" the infinity and change NaNs in
1996 1.1 mrg the other factor to 0. */
1997 1.1 mrg c = COPYSIGN (isinf (c) ? 1 : 0, c);
1998 1.1 mrg d = COPYSIGN (isinf (d) ? 1 : 0, d);
1999 1.1 mrg if (isnan (a)) a = COPYSIGN (0, a);
2000 1.1 mrg if (isnan (b)) b = COPYSIGN (0, b);
2001 1.1 mrg recalc = 1;
2002 1.1 mrg }
2003 1.1 mrg if (!recalc
2004 1.1 mrg && (isinf (ac) || isinf (bd)
2005 1.1 mrg || isinf (ad) || isinf (bc)))
2006 1.1 mrg {
2007 1.1 mrg /* Recover infinities from overflow by changing NaNs to 0. */
2008 1.1 mrg if (isnan (a)) a = COPYSIGN (0, a);
2009 1.1 mrg if (isnan (b)) b = COPYSIGN (0, b);
2010 1.1 mrg if (isnan (c)) c = COPYSIGN (0, c);
2011 1.1 mrg if (isnan (d)) d = COPYSIGN (0, d);
2012 1.1 mrg recalc = 1;
2013 1.1 mrg }
2014 1.1 mrg if (recalc)
2015 1.1 mrg {
2016 1.1 mrg x = INFINITY * (a * c - b * d);
2017 1.1 mrg y = INFINITY * (a * d + b * c);
2018 1.1 mrg }
2019 1.1 mrg }
2020 1.1 mrg
2021 1.1 mrg __real__ res = x;
2022 1.1 mrg __imag__ res = y;
2023 1.1 mrg return res;
2024 1.1 mrg }
2025 1.1 mrg #endif /* complex multiply */
2026 1.1 mrg
2027 1.1 mrg #if defined(L_divsc3) || defined(L_divdc3) \
2028 1.1 mrg || defined(L_divxc3) || defined(L_divtc3)
2029 1.1 mrg
2030 1.1 mrg CTYPE
2031 1.1 mrg CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
2032 1.1 mrg {
2033 1.1 mrg MTYPE denom, ratio, x, y;
2034 1.1 mrg CTYPE res;
2035 1.1 mrg
2036 1.1 mrg /* ??? We can get better behavior from logarithmic scaling instead of
2037 1.1 mrg the division. But that would mean starting to link libgcc against
2038 1.1 mrg libm. We could implement something akin to ldexp/frexp as gcc builtins
2039 1.1 mrg fairly easily... */
2040 1.1 mrg if (FABS (c) < FABS (d))
2041 1.1 mrg {
2042 1.1 mrg ratio = c / d;
2043 1.1 mrg denom = (c * ratio) + d;
2044 1.1 mrg x = ((a * ratio) + b) / denom;
2045 1.1 mrg y = ((b * ratio) - a) / denom;
2046 1.1 mrg }
2047 1.1 mrg else
2048 1.1 mrg {
2049 1.1 mrg ratio = d / c;
2050 1.1 mrg denom = (d * ratio) + c;
2051 1.1 mrg x = ((b * ratio) + a) / denom;
2052 1.1 mrg y = (b - (a * ratio)) / denom;
2053 1.1 mrg }
2054 1.1 mrg
2055 1.1 mrg /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
2056 1.1 mrg are nonzero/zero, infinite/finite, and finite/infinite. */
2057 1.1 mrg if (isnan (x) && isnan (y))
2058 1.1 mrg {
2059 1.1 mrg if (c == 0.0 && d == 0.0 && (!isnan (a) || !isnan (b)))
2060 1.1 mrg {
2061 1.1 mrg x = COPYSIGN (INFINITY, c) * a;
2062 1.1 mrg y = COPYSIGN (INFINITY, c) * b;
2063 1.1 mrg }
2064 1.1 mrg else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
2065 1.1 mrg {
2066 1.1 mrg a = COPYSIGN (isinf (a) ? 1 : 0, a);
2067 1.1 mrg b = COPYSIGN (isinf (b) ? 1 : 0, b);
2068 1.1 mrg x = INFINITY * (a * c + b * d);
2069 1.1 mrg y = INFINITY * (b * c - a * d);
2070 1.1 mrg }
2071 1.1 mrg else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
2072 1.1 mrg {
2073 1.1 mrg c = COPYSIGN (isinf (c) ? 1 : 0, c);
2074 1.1 mrg d = COPYSIGN (isinf (d) ? 1 : 0, d);
2075 1.1 mrg x = 0.0 * (a * c + b * d);
2076 1.1 mrg y = 0.0 * (b * c - a * d);
2077 1.1 mrg }
2078 1.1 mrg }
2079 1.1 mrg
2080 1.1 mrg __real__ res = x;
2081 1.1 mrg __imag__ res = y;
2082 1.1 mrg return res;
2083 1.1 mrg }
2084 1.1 mrg #endif /* complex divide */
2085 1.1 mrg
2086 1.1 mrg #endif /* all complex float routines */
2087 1.1 mrg
2088 1.1 mrg /* From here on down, the routines use normal data types. */
2090 1.1 mrg
2091 1.1 mrg #define SItype bogus_type
2092 1.1 mrg #define USItype bogus_type
2093 1.1 mrg #define DItype bogus_type
2094 1.1 mrg #define UDItype bogus_type
2095 1.1 mrg #define SFtype bogus_type
2096 1.1 mrg #define DFtype bogus_type
2097 1.1 mrg #undef Wtype
2098 1.1 mrg #undef UWtype
2099 1.1 mrg #undef HWtype
2100 1.1 mrg #undef UHWtype
2101 1.1 mrg #undef DWtype
2102 1.1 mrg #undef UDWtype
2103 1.1 mrg
2104 1.1 mrg #undef char
2105 1.1 mrg #undef short
2106 1.1 mrg #undef int
2107 1.1 mrg #undef long
2108 1.1 mrg #undef unsigned
2109 1.1 mrg #undef float
2110 1.1 mrg #undef double
2111 1.1 mrg
2112 1.1 mrg #ifdef L__gcc_bcmp
2114 1.1 mrg
2115 1.1 mrg /* Like bcmp except the sign is meaningful.
2116 1.1 mrg Result is negative if S1 is less than S2,
2117 1.1 mrg positive if S1 is greater, 0 if S1 and S2 are equal. */
2118 1.1 mrg
2119 1.1 mrg int
2120 1.1 mrg __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
2121 1.1 mrg {
2122 1.1 mrg while (size > 0)
2123 1.1 mrg {
2124 1.1 mrg const unsigned char c1 = *s1++, c2 = *s2++;
2125 1.1 mrg if (c1 != c2)
2126 1.1 mrg return c1 - c2;
2127 1.1 mrg size--;
2128 1.1 mrg }
2129 1.1 mrg return 0;
2130 1.1 mrg }
2131 1.1 mrg
2132 1.1 mrg #endif
2133 1.1 mrg
2134 1.1 mrg /* __eprintf used to be used by GCC's private version of <assert.h>.
2136 1.1 mrg We no longer provide that header, but this routine remains in libgcc.a
2137 1.1 mrg for binary backward compatibility. Note that it is not included in
2138 1.1 mrg the shared version of libgcc. */
2139 1.1 mrg #ifdef L_eprintf
2140 1.1 mrg #ifndef inhibit_libc
2141 1.1 mrg
2142 1.1 mrg #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
2143 1.1 mrg #include <stdio.h>
2144 1.1 mrg
2145 1.1 mrg void
2146 1.1 mrg __eprintf (const char *string, const char *expression,
2147 1.1 mrg unsigned int line, const char *filename)
2148 1.1 mrg {
2149 1.1 mrg fprintf (stderr, string, expression, line, filename);
2150 1.1 mrg fflush (stderr);
2151 1.1 mrg abort ();
2152 1.1 mrg }
2153 1.1 mrg
2154 1.1 mrg #endif
2155 1.1 mrg #endif
2156 1.1 mrg
2157 1.1 mrg
2158 1.1 mrg #ifdef L_clear_cache
2160 1.1 mrg /* Clear part of an instruction cache. */
2161 1.1 mrg
2162 1.1 mrg void
2163 1.1 mrg __clear_cache (char *beg __attribute__((__unused__)),
2164 1.1 mrg char *end __attribute__((__unused__)))
2165 1.1 mrg {
2166 1.1 mrg #ifdef CLEAR_INSN_CACHE
2167 1.1 mrg CLEAR_INSN_CACHE (beg, end);
2168 1.1 mrg #endif /* CLEAR_INSN_CACHE */
2169 1.1 mrg }
2170 1.1 mrg
2171 1.1 mrg #endif /* L_clear_cache */
2172 1.1 mrg
2173 1.1 mrg #ifdef L_trampoline
2175 1.1 mrg
2176 1.1 mrg /* Jump to a trampoline, loading the static chain address. */
2177 1.1 mrg
2178 1.1 mrg #if defined(WINNT) && ! defined(__CYGWIN__)
2179 1.1 mrg #include <windows.h>
2180 1.1 mrg int getpagesize (void);
2181 1.1 mrg int mprotect (char *,int, int);
2182 1.1 mrg
2183 1.1 mrg int
2184 1.1 mrg getpagesize (void)
2185 1.1 mrg {
2186 1.1 mrg #ifdef _ALPHA_
2187 1.1 mrg return 8192;
2188 1.1 mrg #else
2189 1.1 mrg return 4096;
2190 1.1 mrg #endif
2191 1.1 mrg }
2192 1.1 mrg
2193 1.1 mrg int
2194 1.1 mrg mprotect (char *addr, int len, int prot)
2195 1.1 mrg {
2196 1.1 mrg DWORD np, op;
2197 1.1 mrg
2198 1.1 mrg if (prot == 7)
2199 1.1 mrg np = 0x40;
2200 1.1 mrg else if (prot == 5)
2201 1.1 mrg np = 0x20;
2202 1.1 mrg else if (prot == 4)
2203 1.3 mrg np = 0x10;
2204 1.3 mrg else if (prot == 3)
2205 1.1 mrg np = 0x04;
2206 1.1 mrg else if (prot == 1)
2207 1.1 mrg np = 0x02;
2208 1.1 mrg else if (prot == 0)
2209 1.1 mrg np = 0x01;
2210 1.1 mrg else
2211 1.1 mrg return -1;
2212 1.3 mrg
2213 1.3 mrg if (VirtualProtect (addr, len, np, &op))
2214 1.3 mrg return 0;
2215 1.3 mrg else
2216 1.3 mrg return -1;
2217 1.3 mrg }
2218 1.1 mrg
2219 1.3 mrg #endif /* WINNT && ! __CYGWIN__ */
2220 1.1 mrg
2221 1.1 mrg #ifdef TRANSFER_FROM_TRAMPOLINE
2222 1.1 mrg TRANSFER_FROM_TRAMPOLINE
2223 1.1 mrg #endif
2224 1.1 mrg #endif /* L_trampoline */
2225 1.1 mrg
2226 1.1 mrg #ifndef __CYGWIN__
2228 1.1 mrg #ifdef L__main
2229 1.1 mrg
2230 1.1 mrg #include "gbl-ctors.h"
2231 1.1 mrg
2232 1.1 mrg /* Some systems use __main in a way incompatible with its use in gcc, in these
2233 1.1 mrg cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
2234 1.1 mrg give the same symbol without quotes for an alternative entry point. You
2235 1.1 mrg must define both, or neither. */
2236 1.1 mrg #ifndef NAME__MAIN
2237 1.1 mrg #define NAME__MAIN "__main"
2238 1.1 mrg #define SYMBOL__MAIN __main
2239 1.3 mrg #endif
2240 1.1 mrg
2241 1.1 mrg #if defined (__LIBGCC_INIT_SECTION_ASM_OP__) \
2242 1.1 mrg || defined (__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__)
2243 1.1 mrg #undef HAS_INIT_SECTION
2244 1.1 mrg #define HAS_INIT_SECTION
2245 1.1 mrg #endif
2246 1.1 mrg
2247 1.1 mrg #if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF)
2248 1.1 mrg
2249 1.1 mrg /* Some ELF crosses use crtstuff.c to provide __CTOR_LIST__, but use this
2250 1.1 mrg code to run constructors. In that case, we need to handle EH here, too.
2251 1.1 mrg But MINGW32 is special because it handles CRTSTUFF and EH on its own. */
2252 1.1 mrg
2253 1.1 mrg #ifdef __MINGW32__
2254 1.1 mrg #undef __LIBGCC_EH_FRAME_SECTION_NAME__
2255 1.1 mrg #endif
2256 1.1 mrg
2257 1.1 mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
2258 1.3 mrg #include "unwind-dw2-fde.h"
2259 1.1 mrg extern unsigned char __EH_FRAME_BEGIN__[];
2260 1.1 mrg #endif
2261 1.1 mrg
2262 1.1 mrg /* Run all the global destructors on exit from the program. */
2263 1.1 mrg
2264 1.1 mrg void
2265 1.1 mrg __do_global_dtors (void)
2266 1.1 mrg {
2267 1.1 mrg #ifdef DO_GLOBAL_DTORS_BODY
2268 1.1 mrg DO_GLOBAL_DTORS_BODY;
2269 1.1 mrg #else
2270 1.1 mrg static func_ptr *p = __DTOR_LIST__ + 1;
2271 1.1 mrg while (*p)
2272 1.1 mrg {
2273 1.1 mrg p++;
2274 1.1 mrg (*(p-1)) ();
2275 1.1 mrg }
2276 1.1 mrg #endif
2277 1.1 mrg #if defined (__LIBGCC_EH_FRAME_SECTION_NAME__) && !defined (HAS_INIT_SECTION)
2278 1.1 mrg {
2279 1.1 mrg static int completed = 0;
2280 1.1 mrg if (! completed)
2281 1.1 mrg {
2282 1.1 mrg completed = 1;
2283 1.1 mrg __deregister_frame_info (__EH_FRAME_BEGIN__);
2284 1.1 mrg }
2285 1.1 mrg }
2286 1.1 mrg #endif
2287 1.1 mrg }
2288 1.1 mrg #endif
2289 1.1 mrg
2290 1.1 mrg #ifndef HAS_INIT_SECTION
2291 1.1 mrg /* Run all the global constructors on entry to the program. */
2292 1.1 mrg
2293 1.1 mrg void
2294 1.1 mrg __do_global_ctors (void)
2295 1.1 mrg {
2296 1.1 mrg #ifdef __LIBGCC_EH_FRAME_SECTION_NAME__
2297 1.1 mrg {
2298 1.1 mrg static struct object object;
2299 1.1 mrg __register_frame_info (__EH_FRAME_BEGIN__, &object);
2300 1.1 mrg }
2301 1.1 mrg #endif
2302 1.1 mrg DO_GLOBAL_CTORS_BODY;
2303 1.1 mrg atexit (__do_global_dtors);
2304 1.1 mrg }
2305 1.1 mrg #endif /* no HAS_INIT_SECTION */
2306 1.1 mrg
2307 1.1 mrg #if !defined (HAS_INIT_SECTION) || defined (INVOKE__main)
2308 1.1 mrg /* Subroutine called automatically by `main'.
2309 1.1 mrg Compiling a global function named `main'
2310 1.1 mrg produces an automatic call to this function at the beginning.
2311 1.1 mrg
2312 1.3 mrg For many systems, this routine calls __do_global_ctors.
2313 1.3 mrg For systems which support a .init section we use the .init section
2314 1.1 mrg to run __do_global_ctors, so we need not do anything here. */
2315 1.1 mrg
2316 1.1 mrg extern void SYMBOL__MAIN (void);
2317 1.1 mrg void
2318 1.1 mrg SYMBOL__MAIN (void)
2319 1.1 mrg {
2320 1.1 mrg /* Support recursive calls to `main': run initializers just once. */
2321 1.3 mrg static int initialized;
2322 1.1 mrg if (! initialized)
2323 1.1 mrg {
2324 initialized = 1;
2325 __do_global_ctors ();
2326 }
2327 }
2328 #endif /* no HAS_INIT_SECTION or INVOKE__main */
2329
2330 #endif /* L__main */
2331 #endif /* __CYGWIN__ */
2332
2333 #ifdef L_ctors
2335
2336 #include "gbl-ctors.h"
2337
2338 /* Provide default definitions for the lists of constructors and
2339 destructors, so that we don't get linker errors. These symbols are
2340 intentionally bss symbols, so that gld and/or collect will provide
2341 the right values. */
2342
2343 /* We declare the lists here with two elements each,
2344 so that they are valid empty lists if no other definition is loaded.
2345
2346 If we are using the old "set" extensions to have the gnu linker
2347 collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__
2348 must be in the bss/common section.
2349
2350 Long term no port should use those extensions. But many still do. */
2351 #if !defined(__LIBGCC_INIT_SECTION_ASM_OP__) \
2352 && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
2353 #if defined (TARGET_ASM_CONSTRUCTOR) || defined (USE_COLLECT2)
2354 func_ptr __CTOR_LIST__[2] = {0, 0};
2355 func_ptr __DTOR_LIST__[2] = {0, 0};
2356 #else
2357 func_ptr __CTOR_LIST__[2];
2358 func_ptr __DTOR_LIST__[2];
2359 #endif
2360 #endif /* no __LIBGCC_INIT_SECTION_ASM_OP__ and not CTOR_LISTS_DEFINED_EXTERNALLY */
2361 #endif /* L_ctors */
2362 #endif /* LIBGCC2_UNITS_PER_WORD <= MIN_UNITS_PER_WORD */
2363