]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/29302 (isfinite returns wrong result at -O1)
authorRoger Sayle <roger@eyesopen.com>
Tue, 19 Dec 2006 04:17:11 +0000 (04:17 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Tue, 19 Dec 2006 04:17:11 +0000 (04:17 +0000)
2006-12-18  Roger Sayle  <roger@eyesopen.com>
    Eric Christopher  <echristo@apple.com>

PR target/29302
* real.c (real_maxval): Correctly handle IBM extended double format.

Co-Authored-By: Eric Christopher <echristo@apple.com>
From-SVN: r120040

gcc/ChangeLog
gcc/real.c

index 5e7bd5ce94b5b89d025414b16303734f8507070e..a76a75a470d86e3590c5d414e390699c77658234 100644 (file)
@@ -1,3 +1,9 @@
+2006-12-18  Roger Sayle  <roger@eyesopen.com>
+           Eric Christopher  <echristo@apple.com>
+
+       PR target/29302
+       * real.c (real_maxval): Correctly handle IBM extended double format.
+
 2006-12-19  Jan Hubicka  <jh@suse.cz>
 
        * expmed.c (expand_mult_const): Force operand to constant.
index 0d239b3379d02adaa6c602a6b7cc54d05ee31ddc..b6e5ed6ee3e9a5a3f79bc1223b47c5925667f21b 100644 (file)
@@ -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);
     }
 }