comparison libquadmath/strtod/strtod_l.c @ 68:561a7518be6b

update gcc-4.6
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sun, 21 Aug 2011 07:07:55 +0900
parents
children 04ced10e8804
comparison
equal deleted inserted replaced
67:f6334be47118 68:561a7518be6b
1 /* Convert string representing a number to float value, using given locale.
2 Copyright (C) 1997,1998,2002,2004,2005,2006,2007,2008,2009,2010
3 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library; if not, write to the Free
19 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 02111-1307 USA. */
21
22 #include <config.h>
23 #include <stdarg.h>
24 #include <string.h>
25 #include <float.h>
26 #include <math.h>
27 #define NDEBUG 1
28 #include <assert.h>
29 #ifdef HAVE_ERRNO_H
30 #include <errno.h>
31 #endif
32 #include "../printf/quadmath-printf.h"
33 #include "../printf/fpioconst.h"
34
35
36 #undef L_
37 #ifdef USE_WIDE_CHAR
38 # define STRING_TYPE wchar_t
39 # define CHAR_TYPE wint_t
40 # define L_(Ch) L##Ch
41 # define ISSPACE(Ch) __iswspace_l ((Ch), loc)
42 # define ISDIGIT(Ch) __iswdigit_l ((Ch), loc)
43 # define ISXDIGIT(Ch) __iswxdigit_l ((Ch), loc)
44 # define TOLOWER(Ch) __towlower_l ((Ch), loc)
45 # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr)
46 # define STRNCASECMP(S1, S2, N) \
47 __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
48 # define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc)
49 #else
50 # define STRING_TYPE char
51 # define CHAR_TYPE char
52 # define L_(Ch) Ch
53 # define ISSPACE(Ch) isspace (Ch)
54 # define ISDIGIT(Ch) isdigit (Ch)
55 # define ISXDIGIT(Ch) isxdigit (Ch)
56 # define TOLOWER(Ch) tolower (Ch)
57 # define TOLOWER_C(Ch) \
58 ({__typeof(Ch) __tlc = (Ch); \
59 (__tlc >= 'A' && __tlc <= 'Z') ? __tlc - 'A' + 'a' : __tlc; })
60 # define STRNCASECMP(S1, S2, N) \
61 __quadmath_strncasecmp_c (S1, S2, N)
62 # ifdef HAVE_STRTOULL
63 # define STRTOULL(S, E, B) strtoull (S, E, B)
64 # else
65 # define STRTOULL(S, E, B) strtoul (S, E, B)
66 # endif
67
68 static inline int
69 __quadmath_strncasecmp_c (const char *s1, const char *s2, size_t n)
70 {
71 const unsigned char *p1 = (const unsigned char *) s1;
72 const unsigned char *p2 = (const unsigned char *) s2;
73 int result;
74 if (p1 == p2 || n == 0)
75 return 0;
76 while ((result = TOLOWER_C (*p1) - TOLOWER_C (*p2++)) == 0)
77 if (*p1++ == '\0' || --n == 0)
78 break;
79
80 return result;
81 }
82 #endif
83
84
85 /* Constants we need from float.h; select the set for the FLOAT precision. */
86 #define MANT_DIG PASTE(FLT,_MANT_DIG)
87 #define DIG PASTE(FLT,_DIG)
88 #define MAX_EXP PASTE(FLT,_MAX_EXP)
89 #define MIN_EXP PASTE(FLT,_MIN_EXP)
90 #define MAX_10_EXP PASTE(FLT,_MAX_10_EXP)
91 #define MIN_10_EXP PASTE(FLT,_MIN_10_EXP)
92
93 /* Extra macros required to get FLT expanded before the pasting. */
94 #define PASTE(a,b) PASTE1(a,b)
95 #define PASTE1(a,b) a##b
96
97 /* Function to construct a floating point number from an MP integer
98 containing the fraction bits, a base 2 exponent, and a sign flag. */
99 extern FLOAT MPN2FLOAT (mp_srcptr mpn, int exponent, int negative);
100
101 /* Definitions according to limb size used. */
102 #if BITS_PER_MP_LIMB == 32
103 # define MAX_DIG_PER_LIMB 9
104 # define MAX_FAC_PER_LIMB 1000000000UL
105 #elif BITS_PER_MP_LIMB == 64
106 # define MAX_DIG_PER_LIMB 19
107 # define MAX_FAC_PER_LIMB 10000000000000000000ULL
108 #else
109 # error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for"
110 #endif
111
112 #define _tens_in_limb __quadmath_tens_in_limb
113 extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] attribute_hidden;
114
115 #ifndef howmany
116 #define howmany(x,y) (((x)+((y)-1))/(y))
117 #endif
118 #define SWAP(x, y) ({ typeof(x) _tmp = x; x = y; y = _tmp; })
119
120 #define NDIG (MAX_10_EXP - MIN_10_EXP + 2 * MANT_DIG)
121 #define HEXNDIG ((MAX_EXP - MIN_EXP + 7) / 8 + 2 * MANT_DIG)
122 #define RETURN_LIMB_SIZE howmany (MANT_DIG, BITS_PER_MP_LIMB)
123
124 #define RETURN(val,end) \
125 do { if (endptr != NULL) *endptr = (STRING_TYPE *) (end); \
126 return val; } while (0)
127
128 /* Maximum size necessary for mpn integers to hold floating point numbers. */
129 #define MPNSIZE (howmany (MAX_EXP + 2 * MANT_DIG, BITS_PER_MP_LIMB) \
130 + 2)
131 /* Declare an mpn integer variable that big. */
132 #define MPN_VAR(name) mp_limb_t name[MPNSIZE]; mp_size_t name##size
133 /* Copy an mpn integer value. */
134 #define MPN_ASSIGN(dst, src) \
135 memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t))
136
137
138 /* Return a floating point number of the needed type according to the given
139 multi-precision number after possible rounding. */
140 static FLOAT
141 round_and_return (mp_limb_t *retval, int exponent, int negative,
142 mp_limb_t round_limb, mp_size_t round_bit, int more_bits)
143 {
144 if (exponent < MIN_EXP - 1)
145 {
146 mp_size_t shift = MIN_EXP - 1 - exponent;
147
148 if (shift > MANT_DIG)
149 {
150 #if defined HAVE_ERRNO_H && defined EDOM
151 errno = EDOM;
152 #endif
153 return 0.0;
154 }
155
156 more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0;
157 if (shift == MANT_DIG)
158 /* This is a special case to handle the very seldom case where
159 the mantissa will be empty after the shift. */
160 {
161 int i;
162
163 round_limb = retval[RETURN_LIMB_SIZE - 1];
164 round_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
165 for (i = 0; i < RETURN_LIMB_SIZE; ++i)
166 more_bits |= retval[i] != 0;
167 MPN_ZERO (retval, RETURN_LIMB_SIZE);
168 }
169 else if (shift >= BITS_PER_MP_LIMB)
170 {
171 int i;
172
173 round_limb = retval[(shift - 1) / BITS_PER_MP_LIMB];
174 round_bit = (shift - 1) % BITS_PER_MP_LIMB;
175 for (i = 0; i < (shift - 1) / BITS_PER_MP_LIMB; ++i)
176 more_bits |= retval[i] != 0;
177 more_bits |= ((round_limb & ((((mp_limb_t) 1) << round_bit) - 1))
178 != 0);
179
180 (void) mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB],
181 RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB),
182 shift % BITS_PER_MP_LIMB);
183 MPN_ZERO (&retval[RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB)],
184 shift / BITS_PER_MP_LIMB);
185 }
186 else if (shift > 0)
187 {
188 round_limb = retval[0];
189 round_bit = shift - 1;
190 (void) mpn_rshift (retval, retval, RETURN_LIMB_SIZE, shift);
191 }
192 /* This is a hook for the m68k long double format, where the
193 exponent bias is the same for normalized and denormalized
194 numbers. */
195 #ifndef DENORM_EXP
196 # define DENORM_EXP (MIN_EXP - 2)
197 #endif
198 exponent = DENORM_EXP;
199 #if defined HAVE_ERRNO_H && defined ERANGE
200 errno = ERANGE;
201 #endif
202 }
203
204 if ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0
205 && (more_bits || (retval[0] & 1) != 0
206 || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0))
207 {
208 mp_limb_t cy = mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1);
209
210 if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) ||
211 ((MANT_DIG % BITS_PER_MP_LIMB) != 0 &&
212 (retval[RETURN_LIMB_SIZE - 1]
213 & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) != 0))
214 {
215 ++exponent;
216 (void) mpn_rshift (retval, retval, RETURN_LIMB_SIZE, 1);
217 retval[RETURN_LIMB_SIZE - 1]
218 |= ((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB);
219 }
220 else if (exponent == DENORM_EXP
221 && (retval[RETURN_LIMB_SIZE - 1]
222 & (((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB)))
223 != 0)
224 /* The number was denormalized but now normalized. */
225 exponent = MIN_EXP - 1;
226 }
227
228 if (exponent > MAX_EXP)
229 return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
230
231 return MPN2FLOAT (retval, exponent, negative);
232 }
233
234
235 /* Read a multi-precision integer starting at STR with exactly DIGCNT digits
236 into N. Return the size of the number limbs in NSIZE at the first
237 character od the string that is not part of the integer as the function
238 value. If the EXPONENT is small enough to be taken as an additional
239 factor for the resulting number (see code) multiply by it. */
240 static const STRING_TYPE *
241 str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
242 int *exponent
243 #ifndef USE_WIDE_CHAR
244 , const char *decimal, size_t decimal_len, const char *thousands
245 #endif
246
247 )
248 {
249 /* Number of digits for actual limb. */
250 int cnt = 0;
251 mp_limb_t low = 0;
252 mp_limb_t start;
253
254 *nsize = 0;
255 assert (digcnt > 0);
256 do
257 {
258 if (cnt == MAX_DIG_PER_LIMB)
259 {
260 if (*nsize == 0)
261 {
262 n[0] = low;
263 *nsize = 1;
264 }
265 else
266 {
267 mp_limb_t cy;
268 cy = mpn_mul_1 (n, n, *nsize, MAX_FAC_PER_LIMB);
269 cy += mpn_add_1 (n, n, *nsize, low);
270 if (cy != 0)
271 {
272 n[*nsize] = cy;
273 ++(*nsize);
274 }
275 }
276 cnt = 0;
277 low = 0;
278 }
279
280 /* There might be thousands separators or radix characters in
281 the string. But these all can be ignored because we know the
282 format of the number is correct and we have an exact number
283 of characters to read. */
284 #ifdef USE_WIDE_CHAR
285 if (*str < L'0' || *str > L'9')
286 ++str;
287 #else
288 if (*str < '0' || *str > '9')
289 {
290 int inner = 0;
291 if (thousands != NULL && *str == *thousands
292 && ({ for (inner = 1; thousands[inner] != '\0'; ++inner)
293 if (thousands[inner] != str[inner])
294 break;
295 thousands[inner] == '\0'; }))
296 str += inner;
297 else
298 str += decimal_len;
299 }
300 #endif
301 low = low * 10 + *str++ - L_('0');
302 ++cnt;
303 }
304 while (--digcnt > 0);
305
306 if (*exponent > 0 && cnt + *exponent <= MAX_DIG_PER_LIMB)
307 {
308 low *= _tens_in_limb[*exponent];
309 start = _tens_in_limb[cnt + *exponent];
310 *exponent = 0;
311 }
312 else
313 start = _tens_in_limb[cnt];
314
315 if (*nsize == 0)
316 {
317 n[0] = low;
318 *nsize = 1;
319 }
320 else
321 {
322 mp_limb_t cy;
323 cy = mpn_mul_1 (n, n, *nsize, start);
324 cy += mpn_add_1 (n, n, *nsize, low);
325 if (cy != 0)
326 n[(*nsize)++] = cy;
327 }
328
329 return str;
330 }
331
332
333 /* Shift {PTR, SIZE} COUNT bits to the left, and fill the vacated bits
334 with the COUNT most significant bits of LIMB.
335
336 Tege doesn't like this function so I have to write it here myself. :)
337 --drepper */
338 static inline void
339 __attribute ((always_inline))
340 mpn_lshift_1 (mp_limb_t *ptr, mp_size_t size, unsigned int count,
341 mp_limb_t limb)
342 {
343 if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB)
344 {
345 /* Optimize the case of shifting by exactly a word:
346 just copy words, with no actual bit-shifting. */
347 mp_size_t i;
348 for (i = size - 1; i > 0; --i)
349 ptr[i] = ptr[i - 1];
350 ptr[0] = limb;
351 }
352 else
353 {
354 (void) mpn_lshift (ptr, ptr, size, count);
355 ptr[0] |= limb >> (BITS_PER_MP_LIMB - count);
356 }
357 }
358
359
360 #define INTERNAL(x) INTERNAL1(x)
361 #define INTERNAL1(x) __##x##_internal
362 #ifndef ____STRTOF_INTERNAL
363 # define ____STRTOF_INTERNAL INTERNAL (__STRTOF)
364 #endif
365
366 /* This file defines a function to check for correct grouping. */
367 #include "grouping.h"
368
369
370 /* Return a floating point number with the value of the given string NPTR.
371 Set *ENDPTR to the character after the last used one. If the number is
372 smaller than the smallest representable number, set `errno' to ERANGE and
373 return 0.0. If the number is too big to be represented, set `errno' to
374 ERANGE and return HUGE_VAL with the appropriate sign. */
375 FLOAT
376 ____STRTOF_INTERNAL (nptr, endptr, group)
377 const STRING_TYPE *nptr;
378 STRING_TYPE **endptr;
379 int group;
380 {
381 int negative; /* The sign of the number. */
382 MPN_VAR (num); /* MP representation of the number. */
383 int exponent; /* Exponent of the number. */
384
385 /* Numbers starting `0X' or `0x' have to be processed with base 16. */
386 int base = 10;
387
388 /* When we have to compute fractional digits we form a fraction with a
389 second multi-precision number (and we sometimes need a second for
390 temporary results). */
391 MPN_VAR (den);
392
393 /* Representation for the return value. */
394 mp_limb_t retval[RETURN_LIMB_SIZE];
395 /* Number of bits currently in result value. */
396 int bits;
397
398 /* Running pointer after the last character processed in the string. */
399 const STRING_TYPE *cp, *tp;
400 /* Start of significant part of the number. */
401 const STRING_TYPE *startp, *start_of_digits;
402 /* Points at the character following the integer and fractional digits. */
403 const STRING_TYPE *expp;
404 /* Total number of digit and number of digits in integer part. */
405 int dig_no, int_no, lead_zero;
406 /* Contains the last character read. */
407 CHAR_TYPE c;
408
409 /* The radix character of the current locale. */
410 #ifdef USE_WIDE_CHAR
411 wchar_t decimal;
412 #else
413 const char *decimal;
414 size_t decimal_len;
415 #endif
416 /* The thousands character of the current locale. */
417 #ifdef USE_WIDE_CHAR
418 wchar_t thousands = L'\0';
419 #else
420 const char *thousands = NULL;
421 #endif
422 /* The numeric grouping specification of the current locale,
423 in the format described in <locale.h>. */
424 const char *grouping;
425 /* Used in several places. */
426 int cnt;
427
428 #if defined USE_LOCALECONV && !defined USE_NL_LANGINFO
429 const struct lconv *lc = localeconv ();
430 #endif
431
432 if (__builtin_expect (group, 0))
433 {
434 #ifdef USE_NL_LANGINFO
435 grouping = nl_langinfo (GROUPING);
436 if (*grouping <= 0 || *grouping == CHAR_MAX)
437 grouping = NULL;
438 else
439 {
440 /* Figure out the thousands separator character. */
441 #ifdef USE_WIDE_CHAR
442 thousands = nl_langinfo_wc (_NL_NUMERIC_THOUSANDS_SEP_WC);
443 if (thousands == L'\0')
444 grouping = NULL;
445 #else
446 thousands = nl_langinfo (THOUSANDS_SEP);
447 if (*thousands == '\0')
448 {
449 thousands = NULL;
450 grouping = NULL;
451 }
452 #endif
453 }
454 #elif defined USE_LOCALECONV
455 grouping = lc->grouping;
456 if (grouping == NULL || *grouping <= 0 || *grouping == CHAR_MAX)
457 grouping = NULL;
458 else
459 {
460 /* Figure out the thousands separator character. */
461 thousands = lc->thousands_sep;
462 if (thousands == NULL || *thousands == '\0')
463 {
464 thousands = NULL;
465 grouping = NULL;
466 }
467 }
468 #else
469 grouping = NULL;
470 #endif
471 }
472 else
473 grouping = NULL;
474
475 /* Find the locale's decimal point character. */
476 #ifdef USE_WIDE_CHAR
477 decimal = nl_langinfo_wc (_NL_NUMERIC_DECIMAL_POINT_WC);
478 assert (decimal != L'\0');
479 # define decimal_len 1
480 #else
481 #ifdef USE_NL_LANGINFO
482 decimal = nl_langinfo (DECIMAL_POINT);
483 decimal_len = strlen (decimal);
484 assert (decimal_len > 0);
485 #elif defined USE_LOCALECONV
486 decimal = lc->decimal_point;
487 if (decimal == NULL || *decimal == '\0')
488 decimal = ".";
489 decimal_len = strlen (decimal);
490 #else
491 decimal = ".";
492 decimal_len = 1;
493 #endif
494 #endif
495
496 /* Prepare number representation. */
497 exponent = 0;
498 negative = 0;
499 bits = 0;
500
501 /* Parse string to get maximal legal prefix. We need the number of
502 characters of the integer part, the fractional part and the exponent. */
503 cp = nptr - 1;
504 /* Ignore leading white space. */
505 do
506 c = *++cp;
507 while (ISSPACE (c));
508
509 /* Get sign of the result. */
510 if (c == L_('-'))
511 {
512 negative = 1;
513 c = *++cp;
514 }
515 else if (c == L_('+'))
516 c = *++cp;
517
518 /* Return 0.0 if no legal string is found.
519 No character is used even if a sign was found. */
520 #ifdef USE_WIDE_CHAR
521 if (c == (wint_t) decimal
522 && (wint_t) cp[1] >= L'0' && (wint_t) cp[1] <= L'9')
523 {
524 /* We accept it. This funny construct is here only to indent
525 the code correctly. */
526 }
527 #else
528 for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
529 if (cp[cnt] != decimal[cnt])
530 break;
531 if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9')
532 {
533 /* We accept it. This funny construct is here only to indent
534 the code correctly. */
535 }
536 #endif
537 else if (c < L_('0') || c > L_('9'))
538 {
539 /* Check for `INF' or `INFINITY'. */
540 CHAR_TYPE lowc = TOLOWER_C (c);
541
542 if (lowc == L_('i') && STRNCASECMP (cp, L_("inf"), 3) == 0)
543 {
544 /* Return +/- infinity. */
545 if (endptr != NULL)
546 *endptr = (STRING_TYPE *)
547 (cp + (STRNCASECMP (cp + 3, L_("inity"), 5) == 0
548 ? 8 : 3));
549
550 return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
551 }
552
553 if (lowc == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0)
554 {
555 /* Return NaN. */
556 FLOAT retval = NAN;
557
558 cp += 3;
559
560 /* Match `(n-char-sequence-digit)'. */
561 if (*cp == L_('('))
562 {
563 const STRING_TYPE *startp = cp;
564 do
565 ++cp;
566 while ((*cp >= L_('0') && *cp <= L_('9'))
567 || ({ CHAR_TYPE lo = TOLOWER (*cp);
568 lo >= L_('a') && lo <= L_('z'); })
569 || *cp == L_('_'));
570
571 if (*cp != L_(')'))
572 /* The closing brace is missing. Only match the NAN
573 part. */
574 cp = startp;
575 else
576 {
577 /* This is a system-dependent way to specify the
578 bitmask used for the NaN. We expect it to be
579 a number which is put in the mantissa of the
580 number. */
581 STRING_TYPE *endp;
582 unsigned long long int mant;
583
584 mant = STRTOULL (startp + 1, &endp, 0);
585 if (endp == cp)
586 SET_MANTISSA (retval, mant);
587
588 /* Consume the closing brace. */
589 ++cp;
590 }
591 }
592
593 if (endptr != NULL)
594 *endptr = (STRING_TYPE *) cp;
595
596 return retval;
597 }
598
599 /* It is really a text we do not recognize. */
600 RETURN (0.0, nptr);
601 }
602
603 /* First look whether we are faced with a hexadecimal number. */
604 if (c == L_('0') && TOLOWER (cp[1]) == L_('x'))
605 {
606 /* Okay, it is a hexa-decimal number. Remember this and skip
607 the characters. BTW: hexadecimal numbers must not be
608 grouped. */
609 base = 16;
610 cp += 2;
611 c = *cp;
612 grouping = NULL;
613 }
614
615 /* Record the start of the digits, in case we will check their grouping. */
616 start_of_digits = startp = cp;
617
618 /* Ignore leading zeroes. This helps us to avoid useless computations. */
619 #ifdef USE_WIDE_CHAR
620 while (c == L'0' || ((wint_t) thousands != L'\0' && c == (wint_t) thousands))
621 c = *++cp;
622 #else
623 if (__builtin_expect (thousands == NULL, 1))
624 while (c == '0')
625 c = *++cp;
626 else
627 {
628 /* We also have the multibyte thousands string. */
629 while (1)
630 {
631 if (c != '0')
632 {
633 for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
634 if (thousands[cnt] != cp[cnt])
635 break;
636 if (thousands[cnt] != '\0')
637 break;
638 cp += cnt - 1;
639 }
640 c = *++cp;
641 }
642 }
643 #endif
644
645 /* If no other digit but a '0' is found the result is 0.0.
646 Return current read pointer. */
647 CHAR_TYPE lowc = TOLOWER (c);
648 if (!((c >= L_('0') && c <= L_('9'))
649 || (base == 16 && lowc >= L_('a') && lowc <= L_('f'))
650 || (
651 #ifdef USE_WIDE_CHAR
652 c == (wint_t) decimal
653 #else
654 ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
655 if (decimal[cnt] != cp[cnt])
656 break;
657 decimal[cnt] == '\0'; })
658 #endif
659 /* '0x.' alone is not a valid hexadecimal number.
660 '.' alone is not valid either, but that has been checked
661 already earlier. */
662 && (base != 16
663 || cp != start_of_digits
664 || (cp[decimal_len] >= L_('0') && cp[decimal_len] <= L_('9'))
665 || ({ CHAR_TYPE lo = TOLOWER (cp[decimal_len]);
666 lo >= L_('a') && lo <= L_('f'); })))
667 || (base == 16 && (cp != start_of_digits
668 && lowc == L_('p')))
669 || (base != 16 && lowc == L_('e'))))
670 {
671 #ifdef USE_WIDE_CHAR
672 tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
673 grouping);
674 #else
675 tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
676 grouping);
677 #endif
678 /* If TP is at the start of the digits, there was no correctly
679 grouped prefix of the string; so no number found. */
680 RETURN (negative ? -0.0 : 0.0,
681 tp == start_of_digits ? (base == 16 ? cp - 1 : nptr) : tp);
682 }
683
684 /* Remember first significant digit and read following characters until the
685 decimal point, exponent character or any non-FP number character. */
686 startp = cp;
687 dig_no = 0;
688 while (1)
689 {
690 if ((c >= L_('0') && c <= L_('9'))
691 || (base == 16
692 && ({ CHAR_TYPE lo = TOLOWER (c);
693 lo >= L_('a') && lo <= L_('f'); })))
694 ++dig_no;
695 else
696 {
697 #ifdef USE_WIDE_CHAR
698 if (__builtin_expect ((wint_t) thousands == L'\0', 1)
699 || c != (wint_t) thousands)
700 /* Not a digit or separator: end of the integer part. */
701 break;
702 #else
703 if (__builtin_expect (thousands == NULL, 1))
704 break;
705 else
706 {
707 for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
708 if (thousands[cnt] != cp[cnt])
709 break;
710 if (thousands[cnt] != '\0')
711 break;
712 cp += cnt - 1;
713 }
714 #endif
715 }
716 c = *++cp;
717 }
718
719 if (__builtin_expect (grouping != NULL, 0) && cp > start_of_digits)
720 {
721 /* Check the grouping of the digits. */
722 #ifdef USE_WIDE_CHAR
723 tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
724 grouping);
725 #else
726 tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
727 grouping);
728 #endif
729 if (cp != tp)
730 {
731 /* Less than the entire string was correctly grouped. */
732
733 if (tp == start_of_digits)
734 /* No valid group of numbers at all: no valid number. */
735 RETURN (0.0, nptr);
736
737 if (tp < startp)
738 /* The number is validly grouped, but consists
739 only of zeroes. The whole value is zero. */
740 RETURN (negative ? -0.0 : 0.0, tp);
741
742 /* Recompute DIG_NO so we won't read more digits than
743 are properly grouped. */
744 cp = tp;
745 dig_no = 0;
746 for (tp = startp; tp < cp; ++tp)
747 if (*tp >= L_('0') && *tp <= L_('9'))
748 ++dig_no;
749
750 int_no = dig_no;
751 lead_zero = 0;
752
753 goto number_parsed;
754 }
755 }
756
757 /* We have the number of digits in the integer part. Whether these
758 are all or any is really a fractional digit will be decided
759 later. */
760 int_no = dig_no;
761 lead_zero = int_no == 0 ? -1 : 0;
762
763 /* Read the fractional digits. A special case are the 'american
764 style' numbers like `16.' i.e. with decimal point but without
765 trailing digits. */
766 if (
767 #ifdef USE_WIDE_CHAR
768 c == (wint_t) decimal
769 #else
770 ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
771 if (decimal[cnt] != cp[cnt])
772 break;
773 decimal[cnt] == '\0'; })
774 #endif
775 )
776 {
777 cp += decimal_len;
778 c = *cp;
779 while ((c >= L_('0') && c <= L_('9')) ||
780 (base == 16 && ({ CHAR_TYPE lo = TOLOWER (c);
781 lo >= L_('a') && lo <= L_('f'); })))
782 {
783 if (c != L_('0') && lead_zero == -1)
784 lead_zero = dig_no - int_no;
785 ++dig_no;
786 c = *++cp;
787 }
788 }
789
790 /* Remember start of exponent (if any). */
791 expp = cp;
792
793 /* Read exponent. */
794 lowc = TOLOWER (c);
795 if ((base == 16 && lowc == L_('p'))
796 || (base != 16 && lowc == L_('e')))
797 {
798 int exp_negative = 0;
799
800 c = *++cp;
801 if (c == L_('-'))
802 {
803 exp_negative = 1;
804 c = *++cp;
805 }
806 else if (c == L_('+'))
807 c = *++cp;
808
809 if (c >= L_('0') && c <= L_('9'))
810 {
811 int exp_limit;
812
813 /* Get the exponent limit. */
814 if (base == 16)
815 exp_limit = (exp_negative ?
816 -MIN_EXP + MANT_DIG + 4 * int_no :
817 MAX_EXP - 4 * int_no + 4 * lead_zero + 3);
818 else
819 exp_limit = (exp_negative ?
820 -MIN_10_EXP + MANT_DIG + int_no :
821 MAX_10_EXP - int_no + lead_zero + 1);
822
823 do
824 {
825 exponent *= 10;
826 exponent += c - L_('0');
827
828 if (__builtin_expect (exponent > exp_limit, 0))
829 /* The exponent is too large/small to represent a valid
830 number. */
831 {
832 FLOAT result;
833
834 /* We have to take care for special situation: a joker
835 might have written "0.0e100000" which is in fact
836 zero. */
837 if (lead_zero == -1)
838 result = negative ? -0.0 : 0.0;
839 else
840 {
841 /* Overflow or underflow. */
842 #if defined HAVE_ERRNO_H && defined ERANGE
843 errno = ERANGE;
844 #endif
845 result = (exp_negative ? (negative ? -0.0 : 0.0) :
846 negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL);
847 }
848
849 /* Accept all following digits as part of the exponent. */
850 do
851 ++cp;
852 while (*cp >= L_('0') && *cp <= L_('9'));
853
854 RETURN (result, cp);
855 /* NOTREACHED */
856 }
857
858 c = *++cp;
859 }
860 while (c >= L_('0') && c <= L_('9'));
861
862 if (exp_negative)
863 exponent = -exponent;
864 }
865 else
866 cp = expp;
867 }
868
869 /* We don't want to have to work with trailing zeroes after the radix. */
870 if (dig_no > int_no)
871 {
872 while (expp[-1] == L_('0'))
873 {
874 --expp;
875 --dig_no;
876 }
877 assert (dig_no >= int_no);
878 }
879
880 if (dig_no == int_no && dig_no > 0 && exponent < 0)
881 do
882 {
883 while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1])))
884 --expp;
885
886 if (expp[-1] != L_('0'))
887 break;
888
889 --expp;
890 --dig_no;
891 --int_no;
892 exponent += base == 16 ? 4 : 1;
893 }
894 while (dig_no > 0 && exponent < 0);
895
896 number_parsed:
897
898 /* The whole string is parsed. Store the address of the next character. */
899 if (endptr)
900 *endptr = (STRING_TYPE *) cp;
901
902 if (dig_no == 0)
903 return negative ? -0.0 : 0.0;
904
905 if (lead_zero)
906 {
907 /* Find the decimal point */
908 #ifdef USE_WIDE_CHAR
909 while (*startp != decimal)
910 ++startp;
911 #else
912 while (1)
913 {
914 if (*startp == decimal[0])
915 {
916 for (cnt = 1; decimal[cnt] != '\0'; ++cnt)
917 if (decimal[cnt] != startp[cnt])
918 break;
919 if (decimal[cnt] == '\0')
920 break;
921 }
922 ++startp;
923 }
924 #endif
925 startp += lead_zero + decimal_len;
926 exponent -= base == 16 ? 4 * lead_zero : lead_zero;
927 dig_no -= lead_zero;
928 }
929
930 /* If the BASE is 16 we can use a simpler algorithm. */
931 if (base == 16)
932 {
933 static const int nbits[16] = { 0, 1, 2, 2, 3, 3, 3, 3,
934 4, 4, 4, 4, 4, 4, 4, 4 };
935 int idx = (MANT_DIG - 1) / BITS_PER_MP_LIMB;
936 int pos = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
937 mp_limb_t val;
938
939 while (!ISXDIGIT (*startp))
940 ++startp;
941 while (*startp == L_('0'))
942 ++startp;
943 if (ISDIGIT (*startp))
944 val = *startp++ - L_('0');
945 else
946 val = 10 + TOLOWER (*startp++) - L_('a');
947 bits = nbits[val];
948 /* We cannot have a leading zero. */
949 assert (bits != 0);
950
951 if (pos + 1 >= 4 || pos + 1 >= bits)
952 {
953 /* We don't have to care for wrapping. This is the normal
954 case so we add the first clause in the `if' expression as
955 an optimization. It is a compile-time constant and so does
956 not cost anything. */
957 retval[idx] = val << (pos - bits + 1);
958 pos -= bits;
959 }
960 else
961 {
962 retval[idx--] = val >> (bits - pos - 1);
963 retval[idx] = val << (BITS_PER_MP_LIMB - (bits - pos - 1));
964 pos = BITS_PER_MP_LIMB - 1 - (bits - pos - 1);
965 }
966
967 /* Adjust the exponent for the bits we are shifting in. */
968 exponent += bits - 1 + (int_no - 1) * 4;
969
970 while (--dig_no > 0 && idx >= 0)
971 {
972 if (!ISXDIGIT (*startp))
973 startp += decimal_len;
974 if (ISDIGIT (*startp))
975 val = *startp++ - L_('0');
976 else
977 val = 10 + TOLOWER (*startp++) - L_('a');
978
979 if (pos + 1 >= 4)
980 {
981 retval[idx] |= val << (pos - 4 + 1);
982 pos -= 4;
983 }
984 else
985 {
986 retval[idx--] |= val >> (4 - pos - 1);
987 val <<= BITS_PER_MP_LIMB - (4 - pos - 1);
988 if (idx < 0)
989 return round_and_return (retval, exponent, negative, val,
990 BITS_PER_MP_LIMB - 1, dig_no > 0);
991
992 retval[idx] = val;
993 pos = BITS_PER_MP_LIMB - 1 - (4 - pos - 1);
994 }
995 }
996
997 /* We ran out of digits. */
998 MPN_ZERO (retval, idx);
999
1000 return round_and_return (retval, exponent, negative, 0, 0, 0);
1001 }
1002
1003 /* Now we have the number of digits in total and the integer digits as well
1004 as the exponent and its sign. We can decide whether the read digits are
1005 really integer digits or belong to the fractional part; i.e. we normalize
1006 123e-2 to 1.23. */
1007 {
1008 register int incr = (exponent < 0 ? MAX (-int_no, exponent)
1009 : MIN (dig_no - int_no, exponent));
1010 int_no += incr;
1011 exponent -= incr;
1012 }
1013
1014 if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0))
1015 {
1016 #if defined HAVE_ERRNO_H && defined ERANGE
1017 errno = ERANGE;
1018 #endif
1019 return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
1020 }
1021
1022 if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 1), 0))
1023 {
1024 #if defined HAVE_ERRNO_H && defined ERANGE
1025 errno = ERANGE;
1026 #endif
1027 return negative ? -0.0 : 0.0;
1028 }
1029
1030 if (int_no > 0)
1031 {
1032 /* Read the integer part as a multi-precision number to NUM. */
1033 startp = str_to_mpn (startp, int_no, num, &numsize, &exponent
1034 #ifndef USE_WIDE_CHAR
1035 , decimal, decimal_len, thousands
1036 #endif
1037 );
1038
1039 if (exponent > 0)
1040 {
1041 /* We now multiply the gained number by the given power of ten. */
1042 mp_limb_t *psrc = num;
1043 mp_limb_t *pdest = den;
1044 int expbit = 1;
1045 const struct mp_power *ttab = &_fpioconst_pow10[0];
1046
1047 do
1048 {
1049 if ((exponent & expbit) != 0)
1050 {
1051 size_t size = ttab->arraysize - _FPIO_CONST_OFFSET;
1052 mp_limb_t cy;
1053 exponent ^= expbit;
1054
1055 /* FIXME: not the whole multiplication has to be
1056 done. If we have the needed number of bits we
1057 only need the information whether more non-zero
1058 bits follow. */
1059 if (numsize >= ttab->arraysize - _FPIO_CONST_OFFSET)
1060 cy = mpn_mul (pdest, psrc, numsize,
1061 &__tens[ttab->arrayoff
1062 + _FPIO_CONST_OFFSET],
1063 size);
1064 else
1065 cy = mpn_mul (pdest, &__tens[ttab->arrayoff
1066 + _FPIO_CONST_OFFSET],
1067 size, psrc, numsize);
1068 numsize += size;
1069 if (cy == 0)
1070 --numsize;
1071 (void) SWAP (psrc, pdest);
1072 }
1073 expbit <<= 1;
1074 ++ttab;
1075 }
1076 while (exponent != 0);
1077
1078 if (psrc == den)
1079 memcpy (num, den, numsize * sizeof (mp_limb_t));
1080 }
1081
1082 /* Determine how many bits of the result we already have. */
1083 count_leading_zeros (bits, num[numsize - 1]);
1084 bits = numsize * BITS_PER_MP_LIMB - bits;
1085
1086 /* Now we know the exponent of the number in base two.
1087 Check it against the maximum possible exponent. */
1088 if (__builtin_expect (bits > MAX_EXP, 0))
1089 {
1090 #if defined HAVE_ERRNO_H && defined ERANGE
1091 errno = ERANGE;
1092 #endif
1093 return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
1094 }
1095
1096 /* We have already the first BITS bits of the result. Together with
1097 the information whether more non-zero bits follow this is enough
1098 to determine the result. */
1099 if (bits > MANT_DIG)
1100 {
1101 int i;
1102 const mp_size_t least_idx = (bits - MANT_DIG) / BITS_PER_MP_LIMB;
1103 const mp_size_t least_bit = (bits - MANT_DIG) % BITS_PER_MP_LIMB;
1104 const mp_size_t round_idx = least_bit == 0 ? least_idx - 1
1105 : least_idx;
1106 const mp_size_t round_bit = least_bit == 0 ? BITS_PER_MP_LIMB - 1
1107 : least_bit - 1;
1108
1109 if (least_bit == 0)
1110 memcpy (retval, &num[least_idx],
1111 RETURN_LIMB_SIZE * sizeof (mp_limb_t));
1112 else
1113 {
1114 for (i = least_idx; i < numsize - 1; ++i)
1115 retval[i - least_idx] = (num[i] >> least_bit)
1116 | (num[i + 1]
1117 << (BITS_PER_MP_LIMB - least_bit));
1118 if (i - least_idx < RETURN_LIMB_SIZE)
1119 retval[RETURN_LIMB_SIZE - 1] = num[i] >> least_bit;
1120 }
1121
1122 /* Check whether any limb beside the ones in RETVAL are non-zero. */
1123 for (i = 0; num[i] == 0; ++i)
1124 ;
1125
1126 return round_and_return (retval, bits - 1, negative,
1127 num[round_idx], round_bit,
1128 int_no < dig_no || i < round_idx);
1129 /* NOTREACHED */
1130 }
1131 else if (dig_no == int_no)
1132 {
1133 const mp_size_t target_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
1134 const mp_size_t is_bit = (bits - 1) % BITS_PER_MP_LIMB;
1135
1136 if (target_bit == is_bit)
1137 {
1138 memcpy (&retval[RETURN_LIMB_SIZE - numsize], num,
1139 numsize * sizeof (mp_limb_t));
1140 /* FIXME: the following loop can be avoided if we assume a
1141 maximal MANT_DIG value. */
1142 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize);
1143 }
1144 else if (target_bit > is_bit)
1145 {
1146 (void) mpn_lshift (&retval[RETURN_LIMB_SIZE - numsize],
1147 num, numsize, target_bit - is_bit);
1148 /* FIXME: the following loop can be avoided if we assume a
1149 maximal MANT_DIG value. */
1150 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize);
1151 }
1152 else
1153 {
1154 mp_limb_t cy;
1155 assert (numsize < RETURN_LIMB_SIZE);
1156
1157 cy = mpn_rshift (&retval[RETURN_LIMB_SIZE - numsize],
1158 num, numsize, is_bit - target_bit);
1159 retval[RETURN_LIMB_SIZE - numsize - 1] = cy;
1160 /* FIXME: the following loop can be avoided if we assume a
1161 maximal MANT_DIG value. */
1162 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize - 1);
1163 }
1164
1165 return round_and_return (retval, bits - 1, negative, 0, 0, 0);
1166 /* NOTREACHED */
1167 }
1168
1169 /* Store the bits we already have. */
1170 memcpy (retval, num, numsize * sizeof (mp_limb_t));
1171 #if RETURN_LIMB_SIZE > 1
1172 if (numsize < RETURN_LIMB_SIZE)
1173 # if RETURN_LIMB_SIZE == 2
1174 retval[numsize] = 0;
1175 # else
1176 MPN_ZERO (retval + numsize, RETURN_LIMB_SIZE - numsize);
1177 # endif
1178 #endif
1179 }
1180
1181 /* We have to compute at least some of the fractional digits. */
1182 {
1183 /* We construct a fraction and the result of the division gives us
1184 the needed digits. The denominator is 1.0 multiplied by the
1185 exponent of the lowest digit; i.e. 0.123 gives 123 / 1000 and
1186 123e-6 gives 123 / 1000000. */
1187
1188 int expbit;
1189 int neg_exp;
1190 int more_bits;
1191 mp_limb_t cy;
1192 mp_limb_t *psrc = den;
1193 mp_limb_t *pdest = num;
1194 const struct mp_power *ttab = &_fpioconst_pow10[0];
1195
1196 assert (dig_no > int_no && exponent <= 0);
1197
1198
1199 /* For the fractional part we need not process too many digits. One
1200 decimal digits gives us log_2(10) ~ 3.32 bits. If we now compute
1201 ceil(BITS / 3) =: N
1202 digits we should have enough bits for the result. The remaining
1203 decimal digits give us the information that more bits are following.
1204 This can be used while rounding. (Two added as a safety margin.) */
1205 if (dig_no - int_no > (MANT_DIG - bits + 2) / 3 + 2)
1206 {
1207 dig_no = int_no + (MANT_DIG - bits + 2) / 3 + 2;
1208 more_bits = 1;
1209 }
1210 else
1211 more_bits = 0;
1212
1213 neg_exp = dig_no - int_no - exponent;
1214
1215 /* Construct the denominator. */
1216 densize = 0;
1217 expbit = 1;
1218 do
1219 {
1220 if ((neg_exp & expbit) != 0)
1221 {
1222 mp_limb_t cy;
1223 neg_exp ^= expbit;
1224
1225 if (densize == 0)
1226 {
1227 densize = ttab->arraysize - _FPIO_CONST_OFFSET;
1228 memcpy (psrc, &__tens[ttab->arrayoff + _FPIO_CONST_OFFSET],
1229 densize * sizeof (mp_limb_t));
1230 }
1231 else
1232 {
1233 cy = mpn_mul (pdest, &__tens[ttab->arrayoff
1234 + _FPIO_CONST_OFFSET],
1235 ttab->arraysize - _FPIO_CONST_OFFSET,
1236 psrc, densize);
1237 densize += ttab->arraysize - _FPIO_CONST_OFFSET;
1238 if (cy == 0)
1239 --densize;
1240 (void) SWAP (psrc, pdest);
1241 }
1242 }
1243 expbit <<= 1;
1244 ++ttab;
1245 }
1246 while (neg_exp != 0);
1247
1248 if (psrc == num)
1249 memcpy (den, num, densize * sizeof (mp_limb_t));
1250
1251 /* Read the fractional digits from the string. */
1252 (void) str_to_mpn (startp, dig_no - int_no, num, &numsize, &exponent
1253 #ifndef USE_WIDE_CHAR
1254 , decimal, decimal_len, thousands
1255 #endif
1256 );
1257
1258 /* We now have to shift both numbers so that the highest bit in the
1259 denominator is set. In the same process we copy the numerator to
1260 a high place in the array so that the division constructs the wanted
1261 digits. This is done by a "quasi fix point" number representation.
1262
1263 num: ddddddddddd . 0000000000000000000000
1264 |--- m ---|
1265 den: ddddddddddd n >= m
1266 |--- n ---|
1267 */
1268
1269 count_leading_zeros (cnt, den[densize - 1]);
1270
1271 if (cnt > 0)
1272 {
1273 /* Don't call `mpn_shift' with a count of zero since the specification
1274 does not allow this. */
1275 (void) mpn_lshift (den, den, densize, cnt);
1276 cy = mpn_lshift (num, num, numsize, cnt);
1277 if (cy != 0)
1278 num[numsize++] = cy;
1279 }
1280
1281 /* Now we are ready for the division. But it is not necessary to
1282 do a full multi-precision division because we only need a small
1283 number of bits for the result. So we do not use mpn_divmod
1284 here but instead do the division here by hand and stop whenever
1285 the needed number of bits is reached. The code itself comes
1286 from the GNU MP Library by Torbj\"orn Granlund. */
1287
1288 exponent = bits;
1289
1290 switch (densize)
1291 {
1292 case 1:
1293 {
1294 mp_limb_t d, n, quot;
1295 int used = 0;
1296
1297 n = num[0];
1298 d = den[0];
1299 assert (numsize == 1 && n < d);
1300
1301 do
1302 {
1303 udiv_qrnnd (quot, n, n, 0, d);
1304
1305 #define got_limb \
1306 if (bits == 0) \
1307 { \
1308 register int cnt; \
1309 if (quot == 0) \
1310 cnt = BITS_PER_MP_LIMB; \
1311 else \
1312 count_leading_zeros (cnt, quot); \
1313 exponent -= cnt; \
1314 if (BITS_PER_MP_LIMB - cnt > MANT_DIG) \
1315 { \
1316 used = MANT_DIG + cnt; \
1317 retval[0] = quot >> (BITS_PER_MP_LIMB - used); \
1318 bits = MANT_DIG + 1; \
1319 } \
1320 else \
1321 { \
1322 /* Note that we only clear the second element. */ \
1323 /* The conditional is determined at compile time. */ \
1324 if (RETURN_LIMB_SIZE > 1) \
1325 retval[1] = 0; \
1326 retval[0] = quot; \
1327 bits = -cnt; \
1328 } \
1329 } \
1330 else if (bits + BITS_PER_MP_LIMB <= MANT_DIG) \
1331 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, BITS_PER_MP_LIMB, \
1332 quot); \
1333 else \
1334 { \
1335 used = MANT_DIG - bits; \
1336 if (used > 0) \
1337 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, quot); \
1338 } \
1339 bits += BITS_PER_MP_LIMB
1340
1341 got_limb;
1342 }
1343 while (bits <= MANT_DIG);
1344
1345 return round_and_return (retval, exponent - 1, negative,
1346 quot, BITS_PER_MP_LIMB - 1 - used,
1347 more_bits || n != 0);
1348 }
1349 case 2:
1350 {
1351 mp_limb_t d0, d1, n0, n1;
1352 mp_limb_t quot = 0;
1353 int used = 0;
1354
1355 d0 = den[0];
1356 d1 = den[1];
1357
1358 if (numsize < densize)
1359 {
1360 if (num[0] >= d1)
1361 {
1362 /* The numerator of the number occupies fewer bits than
1363 the denominator but the one limb is bigger than the
1364 high limb of the numerator. */
1365 n1 = 0;
1366 n0 = num[0];
1367 }
1368 else
1369 {
1370 if (bits <= 0)
1371 exponent -= BITS_PER_MP_LIMB;
1372 else
1373 {
1374 if (bits + BITS_PER_MP_LIMB <= MANT_DIG)
1375 mpn_lshift_1 (retval, RETURN_LIMB_SIZE,
1376 BITS_PER_MP_LIMB, 0);
1377 else
1378 {
1379 used = MANT_DIG - bits;
1380 if (used > 0)
1381 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0);
1382 }
1383 bits += BITS_PER_MP_LIMB;
1384 }
1385 n1 = num[0];
1386 n0 = 0;
1387 }
1388 }
1389 else
1390 {
1391 n1 = num[1];
1392 n0 = num[0];
1393 }
1394
1395 while (bits <= MANT_DIG)
1396 {
1397 mp_limb_t r;
1398
1399 if (n1 == d1)
1400 {
1401 /* QUOT should be either 111..111 or 111..110. We need
1402 special treatment of this rare case as normal division
1403 would give overflow. */
1404 quot = ~(mp_limb_t) 0;
1405
1406 r = n0 + d1;
1407 if (r < d1) /* Carry in the addition? */
1408 {
1409 add_ssaaaa (n1, n0, r - d0, 0, 0, d0);
1410 goto have_quot;
1411 }
1412 n1 = d0 - (d0 != 0);
1413 n0 = -d0;
1414 }
1415 else
1416 {
1417 udiv_qrnnd (quot, r, n1, n0, d1);
1418 umul_ppmm (n1, n0, d0, quot);
1419 }
1420
1421 q_test:
1422 if (n1 > r || (n1 == r && n0 > 0))
1423 {
1424 /* The estimated QUOT was too large. */
1425 --quot;
1426
1427 sub_ddmmss (n1, n0, n1, n0, 0, d0);
1428 r += d1;
1429 if (r >= d1) /* If not carry, test QUOT again. */
1430 goto q_test;
1431 }
1432 sub_ddmmss (n1, n0, r, 0, n1, n0);
1433
1434 have_quot:
1435 got_limb;
1436 }
1437
1438 return round_and_return (retval, exponent - 1, negative,
1439 quot, BITS_PER_MP_LIMB - 1 - used,
1440 more_bits || n1 != 0 || n0 != 0);
1441 }
1442 default:
1443 {
1444 int i;
1445 mp_limb_t cy, dX, d1, n0, n1;
1446 mp_limb_t quot = 0;
1447 int used = 0;
1448
1449 dX = den[densize - 1];
1450 d1 = den[densize - 2];
1451
1452 /* The division does not work if the upper limb of the two-limb
1453 numerator is greater than the denominator. */
1454 if (mpn_cmp (num, &den[densize - numsize], numsize) > 0)
1455 num[numsize++] = 0;
1456
1457 if (numsize < densize)
1458 {
1459 mp_size_t empty = densize - numsize;
1460 register int i;
1461
1462 if (bits <= 0)
1463 exponent -= empty * BITS_PER_MP_LIMB;
1464 else
1465 {
1466 if (bits + empty * BITS_PER_MP_LIMB <= MANT_DIG)
1467 {
1468 /* We make a difference here because the compiler
1469 cannot optimize the `else' case that good and
1470 this reflects all currently used FLOAT types
1471 and GMP implementations. */
1472 #if RETURN_LIMB_SIZE <= 2
1473 assert (empty == 1);
1474 mpn_lshift_1 (retval, RETURN_LIMB_SIZE,
1475 BITS_PER_MP_LIMB, 0);
1476 #else
1477 for (i = RETURN_LIMB_SIZE - 1; i >= empty; --i)
1478 retval[i] = retval[i - empty];
1479 while (i >= 0)
1480 retval[i--] = 0;
1481 #endif
1482 }
1483 else
1484 {
1485 used = MANT_DIG - bits;
1486 if (used >= BITS_PER_MP_LIMB)
1487 {
1488 register int i;
1489 (void) mpn_lshift (&retval[used
1490 / BITS_PER_MP_LIMB],
1491 retval,
1492 (RETURN_LIMB_SIZE
1493 - used / BITS_PER_MP_LIMB),
1494 used % BITS_PER_MP_LIMB);
1495 for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i)
1496 retval[i] = 0;
1497 }
1498 else if (used > 0)
1499 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0);
1500 }
1501 bits += empty * BITS_PER_MP_LIMB;
1502 }
1503 for (i = numsize; i > 0; --i)
1504 num[i + empty] = num[i - 1];
1505 MPN_ZERO (num, empty + 1);
1506 }
1507 else
1508 {
1509 int i;
1510 assert (numsize == densize);
1511 for (i = numsize; i > 0; --i)
1512 num[i] = num[i - 1];
1513 }
1514
1515 den[densize] = 0;
1516 n0 = num[densize];
1517
1518 while (bits <= MANT_DIG)
1519 {
1520 if (n0 == dX)
1521 /* This might over-estimate QUOT, but it's probably not
1522 worth the extra code here to find out. */
1523 quot = ~(mp_limb_t) 0;
1524 else
1525 {
1526 mp_limb_t r;
1527
1528 udiv_qrnnd (quot, r, n0, num[densize - 1], dX);
1529 umul_ppmm (n1, n0, d1, quot);
1530
1531 while (n1 > r || (n1 == r && n0 > num[densize - 2]))
1532 {
1533 --quot;
1534 r += dX;
1535 if (r < dX) /* I.e. "carry in previous addition?" */
1536 break;
1537 n1 -= n0 < d1;
1538 n0 -= d1;
1539 }
1540 }
1541
1542 /* Possible optimization: We already have (q * n0) and (1 * n1)
1543 after the calculation of QUOT. Taking advantage of this, we
1544 could make this loop make two iterations less. */
1545
1546 cy = mpn_submul_1 (num, den, densize + 1, quot);
1547
1548 if (num[densize] != cy)
1549 {
1550 cy = mpn_add_n (num, num, den, densize);
1551 assert (cy != 0);
1552 --quot;
1553 }
1554 n0 = num[densize] = num[densize - 1];
1555 for (i = densize - 1; i > 0; --i)
1556 num[i] = num[i - 1];
1557
1558 got_limb;
1559 }
1560
1561 for (i = densize; num[i] == 0 && i >= 0; --i)
1562 ;
1563 return round_and_return (retval, exponent - 1, negative,
1564 quot, BITS_PER_MP_LIMB - 1 - used,
1565 more_bits || i >= 0);
1566 }
1567 }
1568 }
1569
1570 /* NOTREACHED */
1571 }