From 59d7d7678602bb8dcbeff337a44efc76a3451f01 Mon Sep 17 00:00:00 2001 From: Geoffrey Keating Date: Fri, 7 Jan 2005 00:19:23 +0000 Subject: [PATCH] c-cppbuiltin.c (builtin_define_float_constants): Set __*_EPSILON__ for IBM long double format correctly. * c-cppbuiltin.c (builtin_define_float_constants): Set __*_EPSILON__ for IBM long double format correctly. From-SVN: r93021 --- gcc/ChangeLog | 5 +++++ gcc/c-cppbuiltin.c | 7 ++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/rs6000-ldouble-2.c | 22 ++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/rs6000-ldouble-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bdadf4a9147..44ef9c7cb30 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-01-06 Geoffrey Keating + + * c-cppbuiltin.c (builtin_define_float_constants): Set __*_EPSILON__ + for IBM long double format correctly. + 2005-01-06 Daniel Berlin Fix PR tree-optimization/18792 diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c index cedf9e7a46e..2c9039ef45f 100644 --- a/gcc/c-cppbuiltin.c +++ b/gcc/c-cppbuiltin.c @@ -219,7 +219,12 @@ builtin_define_float_constants (const char *name_prefix, const char *fp_suffix, /* The difference between 1 and the least value greater than 1 that is representable in the given floating point type, b**(1-p). */ sprintf (name, "__%s_EPSILON__", name_prefix); - sprintf (buf, "0x1p%d", (1 - fmt->p) * fmt->log2_b); + if (fmt->pnan < fmt->p) + /* This is an IBM extended double format, so 1.0 + any double is + representable precisely. */ + sprintf (buf, "0x1p%d", (fmt->emin - fmt->p) * fmt->log2_b); + else + sprintf (buf, "0x1p%d", (1 - fmt->p) * fmt->log2_b); builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix); /* For C++ std::numeric_limits::denorm_min. The minimum denormalized diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5638925572..bb8bf45d914 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-01-06 Geoffrey Keating + + * gcc.dg/rs6000-ldouble-2.c: New. + 2005-01-06 Mark Mitchell PR c++/19244 diff --git a/gcc/testsuite/gcc.dg/rs6000-ldouble-2.c b/gcc/testsuite/gcc.dg/rs6000-ldouble-2.c new file mode 100644 index 00000000000..3ef5131b966 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rs6000-ldouble-2.c @@ -0,0 +1,22 @@ +/* { dg-do run { target powerpc*-*-darwin* powerpc*-*-aix* powerpc64-*-linux rs6000-*-* } } */ +/* { dg-options "-mlong-double-128" } */ + +/* Check that LDBL_EPSILON is right for 'long double'. */ + +#include + +extern void abort (void); + +int main(void) +{ + volatile long double ee = 1.0; + long double eps = ee; + while (ee + 1.0 != 1.0) + { + eps = ee; + ee = eps / 2; + } + if (eps != LDBL_EPSILON) + abort (); + return 0; +} -- 2.30.2