aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/atof-ieee.c25
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. */