11 * Convert a string to a fixed-point 64-bit unsigned value.
13 * Ignores `locale' stuff.
16 _DEFUN (_strtoufix64_r
, (rptr
, nptr
, endptr
),
17 struct _reent
*rptr _AND
18 _CONST
char *nptr _AND
21 union long_double_union ldbl
;
22 int exp
, sign
, negexp
, ld_type
;
23 __uint64_t tmp
, tmp2
, result
= 0;
27 _simdstrtold ((char *)nptr
, endptr
, &ldbl
);
29 /* treat NAN as domain error, +/- infinity as saturation */
30 ld_type
= _simdldcheck (&ldbl
);
38 rptr
->_errno
= ERANGE
;
39 if (word0(ldbl
) & Sign_bit
)
41 return ULONG_LONG_MAX
;
44 /* strip off sign and exponent */
45 sign
= word0(ldbl
) & Sign_bit
;
46 exp
= ((word0(ldbl
) & Exp_mask
) >> Exp_shift
) - Bias
;
50 word0(ldbl
) &= ~(Exp_mask
| Sign_bit
);
51 /* add in implicit normalized bit */
52 word0(ldbl
) |= Exp_msk1
;
53 /* shift so result is contained in single word */
54 tmp
= word0(ldbl
) << Ebits
;
55 tmp
|= ((unsigned long)word1(ldbl
) >> (32 - Ebits
));
58 tmp
|= ((unsigned long)word1(ldbl
) << Ebits
);
59 tmp
|= ((unsigned long)word2(ldbl
) >> (32 - Ebits
));
61 /* check for saturation */
64 rptr
->_errno
= ERANGE
;
69 if (exp
> 0 || (exp
== 0 && tmp
>= 0x8000000000000000LL
))
71 rptr
->_errno
= ERANGE
;
72 return ULONG_LONG_MAX
;
76 /* otherwise we have normal number in range */
79 tmp2
= tmp
+ (1 << (negexp
- 2));
80 result
= (tmp2
>> (negexp
- 1));
81 /* if rounding causes carry, add carry bit in */
83 result
+= 1 << (64 - negexp
);
89 result
= tmp
+ ((word2(ldbl
) & (1 << (32 - Ebits
- 1))) != 0);
90 /* if rounding causes carry, then saturation has occurred */
93 rptr
->_errno
= ERANGE
;
94 return ULONG_LONG_MAX
;
107 _DEFUN (strtoufix64
, (s
, ptr
, base
),
111 return _strtoufix64_r (_REENT
, s
, ptr
);