mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-12 03:43:33 +08:00
gdb/doublest.c: Use frexpl rather than ldfrexp.
Most modern systems have frexpl and gnulib provides an implementation for those that don't, so use it instead of the generic but inaccurate ldfrexp. gdb/ChangeLog: 2013-06-21 Will Newton <will.newton@linaro.org> * doublest.c (ldfrexp): Remove function. (convert_doublest_to_floatformat): Call frexpl instead of ldfrexp.
This commit is contained in:
parent
88b4890352
commit
85d3b769fc
@ -1,3 +1,9 @@
|
||||
2013-06-21 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* doublest.c (ldfrexp): Remove function.
|
||||
(convert_doublest_to_floatformat): Call frexpl instead of
|
||||
ldfrexp.
|
||||
|
||||
2013-06-21 Will Newton <will.newton@linaro.org>
|
||||
|
||||
* gnulib/update-gnulib.sh(IMPORTED_GNULIB_MODULES): Add frexpl.
|
||||
|
@ -336,53 +336,6 @@ put_field (unsigned char *data, enum floatformat_byteorders order,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_LONG_DOUBLE
|
||||
/* Return the fractional part of VALUE, and put the exponent of VALUE in *EPTR.
|
||||
The range of the returned value is >= 0.5 and < 1.0. This is equivalent to
|
||||
frexp, but operates on the long double data type. */
|
||||
|
||||
static long double ldfrexp (long double value, int *eptr);
|
||||
|
||||
static long double
|
||||
ldfrexp (long double value, int *eptr)
|
||||
{
|
||||
long double tmp;
|
||||
int exp;
|
||||
|
||||
/* Unfortunately, there are no portable functions for extracting the
|
||||
exponent of a long double, so we have to do it iteratively by
|
||||
multiplying or dividing by two until the fraction is between 0.5
|
||||
and 1.0. */
|
||||
|
||||
if (value < 0.0l)
|
||||
value = -value;
|
||||
|
||||
tmp = 1.0l;
|
||||
exp = 0;
|
||||
|
||||
if (value >= tmp) /* Value >= 1.0 */
|
||||
while (value >= tmp)
|
||||
{
|
||||
tmp *= 2.0l;
|
||||
exp++;
|
||||
}
|
||||
else if (value != 0.0l) /* Value < 1.0 and > 0.0 */
|
||||
{
|
||||
while (value < tmp)
|
||||
{
|
||||
tmp /= 2.0l;
|
||||
exp--;
|
||||
}
|
||||
tmp *= 2.0l;
|
||||
exp++;
|
||||
}
|
||||
|
||||
*eptr = exp;
|
||||
return value / tmp;
|
||||
}
|
||||
#endif /* HAVE_LONG_DOUBLE */
|
||||
|
||||
|
||||
/* The converse: convert the DOUBLEST *FROM to an extended float and
|
||||
store where TO points. Neither FROM nor TO have any alignment
|
||||
restrictions. */
|
||||
@ -466,7 +419,7 @@ convert_doublest_to_floatformat (CONST struct floatformat *fmt,
|
||||
}
|
||||
|
||||
#ifdef HAVE_LONG_DOUBLE
|
||||
mant = ldfrexp (dfrom, &exponent);
|
||||
mant = frexpl (dfrom, &exponent);
|
||||
#else
|
||||
mant = frexp (dfrom, &exponent);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user