aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-cppbuiltin.c10
-rw-r--r--gcc/real.c4
3 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 148e55d..071f579 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-03-04 Alan Modra <amodra@bigpond.net.au>
+
+ * real.c (encode_ibm_extended): Don't bother rounding low double.
+ * c-cppbuiltin.c (builtin_define_float_constants): Tweak MAX
+ when fmt->pnan < fmt->p.
+
2004-03-04 Eric Christopher <echristo@redhat.com>
* config/mips/mips.h (FUNCTION_ARG_REGNO_P): Fix to check
diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c
index 4e671d6..8573b8c 100644
--- a/gcc/c-cppbuiltin.c
+++ b/gcc/c-cppbuiltin.c
@@ -193,6 +193,16 @@ builtin_define_float_constants (const char *name_prefix, const char *fp_suffix,
if (i < n)
*p++ = "08ce"[n - i];
sprintf (p, "p%d", fmt->emax * fmt->log2_b);
+ if (fmt->pnan < fmt->p)
+ {
+ /* This is an IBM extended double format made up of two IEEE
+ doubles. The value of the long double is the sum of the
+ values of the two parts. The most significant part is
+ required to be the value of the long double rounded to the
+ nearest double. Rounding means we need a slightly smaller
+ value for LDBL_MAX. */
+ buf[4 + fmt->pnan / 4] = "7bde"[fmt->pnan % 4];
+ }
}
sprintf (name, "__%s_MAX__", name_prefix);
builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix);
diff --git a/gcc/real.c b/gcc/real.c
index ed671db..d578ace 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -3248,7 +3248,9 @@ encode_ibm_extended (const struct real_format *fmt, long *buf,
if (u.class == rvc_normal)
{
do_add (&v, &normr, &u, 1);
- round_for_format (base_fmt, &v);
+ /* The low double won't need rounding, since we round to a 106 bit
+ mantissa before calling this function, and we've just
+ subtracted off the top 54 bits. (53+1 because u is rounded.) */
encode_ieee_double (base_fmt, &buf[2], &v);
}
else