* doublest.c (convert_floatformat_to_doublest): Use fmt->split_half

for IBM long double nan and inf.
	(floatformat_is_negative, floatformat_classify,
	floatformat_mantissa): Similarly.
	(floatformat_ieee_single, floatformat_ieee_double,
	floatformat_ieee_quad, floatformat_arm_ext,
	floatformat_ia64_spill): Delete unused vars.
	(_initialize_doublest): Delete unused function.
	* gdbtypes.c (floatformats_ibm_long_double): Use new big- and
	little-endian variants of floatformat_ibm_long_double.
This commit is contained in:
Alan Modra 2013-08-20 06:42:19 +00:00
parent 21290977cb
commit f5aee5eeb8
3 changed files with 47 additions and 35 deletions

View File

@ -1,3 +1,16 @@
2013-08-20 Alan Modra <amodra@gmail.com>
* doublest.c (convert_floatformat_to_doublest): Use fmt->split_half
for IBM long double nan and inf.
(floatformat_is_negative, floatformat_classify,
floatformat_mantissa): Similarly.
(floatformat_ieee_single, floatformat_ieee_double,
floatformat_ieee_quad, floatformat_arm_ext,
floatformat_ia64_spill): Delete unused vars.
(_initialize_doublest): Delete unused function.
* gdbtypes.c (floatformats_ibm_long_double): Use new big- and
little-endian variants of floatformat_ibm_long_double.
2013-08-19 Luis Machado <lgustavo@codesourcery.com>
* Makefile.in (SFILES): Remove common/target-common.c and

View File

@ -190,7 +190,8 @@ convert_floatformat_to_doublest (const struct floatformat *fmt,
{
double dto;
floatformat_to_double (fmt, from, &dto);
floatformat_to_double (fmt->split_half ? fmt->split_half : fmt,
from, &dto);
*to = (DOUBLEST) dto;
return;
}
@ -514,6 +515,11 @@ floatformat_is_negative (const struct floatformat *fmt,
gdb_assert (fmt->totalsize
<= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
/* An IBM long double (a two element array of double) always takes the
sign of the first double. */
if (fmt->split_half)
fmt = fmt->split_half;
order = floatformat_normalize_byteorder (fmt, uval, newfrom);
if (order != fmt->byteorder)
@ -540,6 +546,13 @@ floatformat_classify (const struct floatformat *fmt,
gdb_assert (fmt->totalsize
<= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
/* An IBM long double (a two element array of double) can be classified
by looking at the first double. inf and nan are specified as
ignoring the second double. zero and subnormal will always have
the second double 0.0 if the long double is correctly rounded. */
if (fmt->split_half)
fmt = fmt->split_half;
order = floatformat_normalize_byteorder (fmt, uval, newfrom);
if (order != fmt->byteorder)
@ -622,6 +635,16 @@ floatformat_mantissa (const struct floatformat *fmt,
gdb_assert (fmt->totalsize
<= FLOATFORMAT_LARGEST_BYTES * FLOATFORMAT_CHAR_BIT);
/* For IBM long double (a two element array of double), return the
mantissa of the first double. The problem with returning the
actual mantissa from both doubles is that there can be an
arbitrary number of implied 0's or 1's between the mantissas
of the first and second double. In any case, this function
is only used for dumping out nans, and a nan is specified to
ignore the value in the second double. */
if (fmt->split_half)
fmt = fmt->split_half;
order = floatformat_normalize_byteorder (fmt, uval, newfrom);
if (order != fmt->byteorder)
@ -879,27 +902,3 @@ convert_typed_floating (const void *from, const struct type *from_type,
floatformat_from_doublest (to_fmt, &d, to);
}
}
const struct floatformat *floatformat_ieee_single[BFD_ENDIAN_UNKNOWN];
const struct floatformat *floatformat_ieee_double[BFD_ENDIAN_UNKNOWN];
const struct floatformat *floatformat_ieee_quad[BFD_ENDIAN_UNKNOWN];
const struct floatformat *floatformat_arm_ext[BFD_ENDIAN_UNKNOWN];
const struct floatformat *floatformat_ia64_spill[BFD_ENDIAN_UNKNOWN];
extern void _initialize_doublest (void);
extern void
_initialize_doublest (void)
{
floatformat_ieee_single[BFD_ENDIAN_LITTLE] = &floatformat_ieee_single_little;
floatformat_ieee_single[BFD_ENDIAN_BIG] = &floatformat_ieee_single_big;
floatformat_ieee_double[BFD_ENDIAN_LITTLE] = &floatformat_ieee_double_little;
floatformat_ieee_double[BFD_ENDIAN_BIG] = &floatformat_ieee_double_big;
floatformat_arm_ext[BFD_ENDIAN_LITTLE]
= &floatformat_arm_ext_littlebyte_bigword;
floatformat_arm_ext[BFD_ENDIAN_BIG] = &floatformat_arm_ext_big;
floatformat_ia64_spill[BFD_ENDIAN_LITTLE] = &floatformat_ia64_spill_little;
floatformat_ia64_spill[BFD_ENDIAN_BIG] = &floatformat_ia64_spill_big;
floatformat_ieee_quad[BFD_ENDIAN_LITTLE] = &floatformat_ia64_quad_little;
floatformat_ieee_quad[BFD_ENDIAN_BIG] = &floatformat_ia64_quad_big;
}

View File

@ -108,8 +108,8 @@ const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN] = {
&floatformat_vax_d
};
const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN] = {
&floatformat_ibm_long_double,
&floatformat_ibm_long_double
&floatformat_ibm_long_double_big,
&floatformat_ibm_long_double_little
};
/* Should opaque types be resolved? */