diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/atof-ieee.c | 25 |
2 files changed, 30 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 879405e..bdb563f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2001-03-02 Richard Sandiford <rsandifo@redhat.com> + + * config/atof-ieee.c (TC_LARGEST_EXPONENT_IS_NORMAL): New macro. + (gen_to_words): Print warnings if NaNs are found and the target CPU + does not support them. Allow largest exponent to be used in normal + numbers if TC_LARGEST_EXPONENT_IS_NORMAL evaluates to true. + 2001-02-28 Andreas Jaeger <aj@suse.de>, Bo Thorsen <bo@suse.de> * config/tc-i386.c (tc_gen_reloc): Remove ugly hack which is not needed diff --git a/gas/config/atof-ieee.c b/gas/config/atof-ieee.c index 2a916cd..8eed2f7 100644 --- a/gas/config/atof-ieee.c +++ b/gas/config/atof-ieee.c @@ -1,5 +1,5 @@ /* atof_ieee.c - turn a Flonum into an IEEE floating point number - Copyright (C) 1987, 92, 93, 94, 95, 96, 97, 98, 99, 2000 + Copyright (C) 1987, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -19,6 +19,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* Some float formats are based on the IEEE standard, but use the + largest exponent for normal numbers instead of NaNs and infinites. + The macro TC_LARGEST_EXPONENT_IS_NORMAL should evaluate to true + if the target machine uses such a format. The macro can depend on + command line flags if necessary. There is no need to define the + macro if it would always be 0. */ + #include "as.h" /* Flonums returned here. */ @@ -40,6 +47,10 @@ extern const char EXP_CHARS[]; /* Length in LittleNums of guard bits. */ #define GUARD (2) +#ifndef TC_LARGEST_EXPONENT_IS_NORMAL +#define TC_LARGEST_EXPONENT_IS_NORMAL 0 +#endif + static const unsigned long mask[] = { 0x00000000, @@ -291,6 +302,8 @@ gen_to_words (words, precision, exponent_bits) /* NaN: Do the right thing. */ if (generic_floating_point_number.sign == 0) { + if (TC_LARGEST_EXPONENT_IS_NORMAL) + as_warn ("NaNs are not supported by this target\n"); if (precision == F_PRECISION) { words[0] = 0x7fff; @@ -328,6 +341,9 @@ gen_to_words (words, precision, exponent_bits) } else if (generic_floating_point_number.sign == 'P') { + if (TC_LARGEST_EXPONENT_IS_NORMAL) + as_warn ("Infinities are not supported by this target\n"); + /* +INF: Do the right thing. */ if (precision == F_PRECISION) { @@ -366,6 +382,9 @@ gen_to_words (words, precision, exponent_bits) } else if (generic_floating_point_number.sign == 'N') { + if (TC_LARGEST_EXPONENT_IS_NORMAL) + as_warn ("Infinities are not supported by this target\n"); + /* Negative INF. */ if (precision == F_PRECISION) { @@ -578,7 +597,9 @@ gen_to_words (words, precision, exponent_bits) return return_value; } - else if ((unsigned long) exponent_4 >= mask[exponent_bits]) + else if ((unsigned long) exponent_4 > mask[exponent_bits] + || (! TC_LARGEST_EXPONENT_IS_NORMAL + && (unsigned long) exponent_4 == mask[exponent_bits])) { /* Exponent overflow. Lose immediately. */ |