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