From b044deec88e847736d4bf49f2ac1978518d81a68 Mon Sep 17 00:00:00 2001 From: sayle Date: Tue, 19 Dec 2006 04:17:11 +0000 Subject: [PATCH] 2006-12-18 Roger Sayle Eric Christopher PR target/29302 * real.c (real_maxval): Correctly handle IBM extended double format. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120040 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/real.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e7bd5c..a76a75a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-12-18 Roger Sayle + Eric Christopher + + PR target/29302 + * real.c (real_maxval): Correctly handle IBM extended double format. + 2006-12-19 Jan Hubicka * expmed.c (expand_mult_const): Force operand to constant. diff --git a/gcc/real.c b/gcc/real.c index 0d239b3..b6e5ed6 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -2282,6 +2282,15 @@ real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode) np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b; memset (r->sig, -1, SIGSZ * sizeof (unsigned long)); clear_significand_below (r, np2); + + 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. */ + clear_significand_bit (r, SIGNIFICAND_BITS - fmt->pnan); } } -- 2.7.4