Author: matthew
Date: 2011-09-27 09:46:14 -0600 (Tue, 27 Sep 2011)
New Revision: 2316

Added:
   trunk/mpfr/
   trunk/mpfr/mpfr-3.0.1-fixes-1.patch
Log:
Add upstream patches for MPFR.

Added: trunk/mpfr/mpfr-3.0.1-fixes-1.patch
===================================================================
--- trunk/mpfr/mpfr-3.0.1-fixes-1.patch                         (rev 0)
+++ trunk/mpfr/mpfr-3.0.1-fixes-1.patch 2011-09-27 15:46:14 UTC (rev 2316)
@@ -0,0 +1,279 @@
+Submitted By:            Matt Burgess <matthew_at_linuxfromscratch_dot_org>
+Date:                    2011-09-27
+Initial Package Version: 3.0.1
+Upstream Status:         Already in upstream patch repo
+Origin:                  Upstream
+Description:             This patch contains upstream fixes for the 4 bugs
+                         detailed at http://www.mpfr.org/mpfr-current/#fixed
+
+diff -Naur mpfr-3.0.1.orig/PATCHES mpfr-3.0.1/PATCHES
+--- mpfr-3.0.1.orig/PATCHES    2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/PATCHES 2011-09-27 15:40:16.255732025 +0000
+@@ -0,0 +1,4 @@
++texp-zero
++atan-expo-range
++rec_sqrt-carry
++asin_exprange
+diff -Naur mpfr-3.0.1.orig/VERSION mpfr-3.0.1/VERSION
+--- mpfr-3.0.1.orig/VERSION    2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/VERSION 2011-09-27 15:40:16.255732025 +0000
+@@ -1 +1 @@
+-3.0.1
++3.0.1-p4
+diff -Naur mpfr-3.0.1.orig/asin.c mpfr-3.0.1/asin.c
+--- mpfr-3.0.1.orig/asin.c     2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/asin.c  2011-09-27 15:40:16.240990268 +0000
+@@ -63,11 +63,14 @@
+ 
+   compared = mpfr_cmp_ui (xp, 1);
+ 
++  MPFR_SAVE_EXPO_MARK (expo);
++
+   if (MPFR_UNLIKELY (compared >= 0))
+     {
+       mpfr_clear (xp);
+       if (compared > 0)                  /* asin(x) = NaN for |x| > 1 */
+         {
++          MPFR_SAVE_EXPO_FREE (expo);
+           MPFR_SET_NAN (asin);
+           MPFR_RET_NAN;
+         }
+@@ -80,13 +83,11 @@
+               inexact = -mpfr_const_pi (asin, MPFR_INVERT_RND(rnd_mode));
+               MPFR_CHANGE_SIGN (asin);
+             }
+-          mpfr_div_2ui (asin, asin, 1, rnd_mode); /* May underflow */
+-          return inexact;
++          mpfr_div_2ui (asin, asin, 1, rnd_mode);
+         }
+     }
+-
+-  MPFR_SAVE_EXPO_MARK (expo);
+-
++  else
++    {
+   /* Compute exponent of 1 - ABS(x) */
+   mpfr_ui_sub (xp, 1, xp, MPFR_RNDD);
+   MPFR_ASSERTD (MPFR_GET_EXP (xp) <= 0);
+@@ -115,6 +116,7 @@
+   inexact = mpfr_set (asin, xp, rnd_mode);
+ 
+   mpfr_clear (xp);
++    }
+ 
+   MPFR_SAVE_EXPO_FREE (expo);
+   return mpfr_check_range (asin, inexact, rnd_mode);
+diff -Naur mpfr-3.0.1.orig/atan.c mpfr-3.0.1/atan.c
+--- mpfr-3.0.1.orig/atan.c     2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/atan.c  2011-09-27 15:40:16.252769873 +0000
+@@ -431,5 +431,5 @@
+   MPFR_GROUP_CLEAR (group);
+ 
+   MPFR_SAVE_EXPO_FREE (expo);
+-  return mpfr_check_range (arctgt, inexact, rnd_mode);
++  return mpfr_check_range (atan, inexact, rnd_mode);
+ }
+diff -Naur mpfr-3.0.1.orig/mpfr.h mpfr-3.0.1/mpfr.h
+--- mpfr-3.0.1.orig/mpfr.h     2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/mpfr.h  2011-09-27 15:40:16.256733564 +0000
+@@ -27,7 +27,7 @@
+ #define MPFR_VERSION_MAJOR 3
+ #define MPFR_VERSION_MINOR 0
+ #define MPFR_VERSION_PATCHLEVEL 1
+-#define MPFR_VERSION_STRING "3.0.1"
++#define MPFR_VERSION_STRING "3.0.1-p4"
+ 
+ /* Macros dealing with MPFR VERSION */
+ #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
+diff -Naur mpfr-3.0.1.orig/rec_sqrt.c mpfr-3.0.1/rec_sqrt.c
+--- mpfr-3.0.1.orig/rec_sqrt.c 2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/rec_sqrt.c      2011-09-27 15:40:16.249747377 +0000
+@@ -375,20 +375,37 @@
+       MPFR_ASSERTD(un == ln + 1 || un == ln + 2);
+       /* the high un-ln limbs of u will overlap the low part of {x+ln,xn},
+          we need to add or subtract the overlapping part {u + ln, un - ln} */
++      /* Warning! th may be 0, in which case the mpn_add_1 and mpn_sub_1
++         below (with size = th) mustn't be used. In such a case, the limb
++         (carry) will be 0, so that this is semantically a no-op, but if
++         mpn_add_1 and mpn_sub_1 are used, GMP (currently) still does a
++         non-atomic read/write in a place that is not always allocated,
++         with the possible consequences: a crash if the corresponding
++         address is not mapped, or (rather unlikely) memory corruption
++         if another process/thread writes at the same place; things may
++         be worse with future GMP versions. Hence the tests carry != 0. */
+       if (neg == 0)
+         {
+           if (ln > 0)
+             MPN_COPY (x, u, ln);
+           cy = mpn_add (x + ln, x + ln, xn, u + ln, un - ln);
+           /* add cu at x+un */
+-          cy += mpn_add_1 (x + un, x + un, th, cu);
++          if (cu != 0)
++            {
++              MPFR_ASSERTD (th != 0);
++              cy += mpn_add_1 (x + un, x + un, th, cu);
++            }
+         }
+       else /* negative case */
+         {
+           /* subtract {u+ln, un-ln} from {x+ln,un} */
+           cy = mpn_sub (x + ln, x + ln, xn, u + ln, un - ln);
+           /* carry cy is at x+un, like cu */
+-          cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */
++          if (cy + cu != 0)
++            {
++              MPFR_ASSERTD (th != 0);
++              cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */
++            }
+           /* cy cannot be zero, since the most significant bit of Xh is 1,
+              and the correction is bounded by 2^{-h+3} */
+           MPFR_ASSERTD(cy == 0);
+diff -Naur mpfr-3.0.1.orig/tests/tasin.c mpfr-3.0.1/tests/tasin.c
+--- mpfr-3.0.1.orig/tests/tasin.c      2011-04-04 10:19:17.000000000 +0000
++++ mpfr-3.0.1/tests/tasin.c   2011-09-27 15:40:16.245002850 +0000
+@@ -219,6 +219,49 @@
+   mpfr_clear (y);
+ }
+ 
++static void
++reduced_expo_range (void)
++{
++  mpfr_exp_t emin, emax;
++  mpfr_t x, y, ex_y;
++  int inex, ex_inex;
++  unsigned int flags, ex_flags;
++
++  emin = mpfr_get_emin ();
++  emax = mpfr_get_emax ();
++
++  mpfr_inits2 (4, x, y, ex_y, (mpfr_ptr) 0);
++  mpfr_set_str (x, "-0.1e1", 2, MPFR_RNDN);
++
++  mpfr_set_emin (1);
++  mpfr_set_emax (1);
++  mpfr_clear_flags ();
++  inex = mpfr_asin (y, x, MPFR_RNDA);
++  flags = __gmpfr_flags;
++  mpfr_set_emin (emin);
++  mpfr_set_emax (emax);
++
++  mpfr_set_str (ex_y, "-0.1101e1", 2, MPFR_RNDN);
++  ex_inex = -1;
++  ex_flags = MPFR_FLAGS_INEXACT;
++
++  if (SIGN (inex) != ex_inex || flags != ex_flags ||
++      ! mpfr_equal_p (y, ex_y))
++    {
++      printf ("Error in reduced_expo_range\non x = ");
++      mpfr_dump (x);
++      printf ("Expected y = ");
++      mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN);
++      printf ("\n         inex = %d, flags = %u\n", ex_inex, ex_flags);
++      printf ("Got      y = ");
++      mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
++      printf ("\n         inex = %d, flags = %u\n", SIGN (inex), flags);
++      exit (1);
++    }
++
++  mpfr_clears (x, y, ex_y, (mpfr_ptr) 0);
++}
++
+ int
+ main (void)
+ {
+@@ -226,6 +269,7 @@
+ 
+   special ();
+   special_overflow ();
++  reduced_expo_range ();
+ 
+   test_generic (2, 100, 15);
+ 
+diff -Naur mpfr-3.0.1.orig/tests/tatan.c mpfr-3.0.1/tests/tatan.c
+--- mpfr-3.0.1.orig/tests/tatan.c      2011-04-04 10:19:17.000000000 +0000
++++ mpfr-3.0.1/tests/tatan.c   2011-09-27 15:40:16.254743337 +0000
+@@ -535,6 +535,52 @@
+   mpfr_clears (a, x, y, (mpfr_ptr) 0);
+ }
+ 
++/* http://websympa.loria.fr/wwsympa/arc/mpfr/2011-05/msg00008.html
++ * Incorrect flags (in debug mode on a 32-bit machine, assertion failure).
++ */
++static void
++reduced_expo_range (void)
++{
++  mpfr_exp_t emin, emax;
++  mpfr_t x, y, ex_y;
++  int inex, ex_inex;
++  unsigned int flags, ex_flags;
++
++  emin = mpfr_get_emin ();
++  emax = mpfr_get_emax ();
++
++  mpfr_inits2 (12, x, y, ex_y, (mpfr_ptr) 0);
++  mpfr_set_str (x, "0.1e-5", 2, MPFR_RNDN);
++
++  mpfr_set_emin (-5);
++  mpfr_set_emax (-5);
++  mpfr_clear_flags ();
++  inex = mpfr_atan (y, x, MPFR_RNDN);
++  flags = __gmpfr_flags;
++  mpfr_set_emin (emin);
++  mpfr_set_emax (emax);
++
++  mpfr_set_str (ex_y, "0.1e-5", 2, MPFR_RNDN);
++  ex_inex = 1;
++  ex_flags = MPFR_FLAGS_INEXACT;
++
++  if (SIGN (inex) != ex_inex || flags != ex_flags ||
++      ! mpfr_equal_p (y, ex_y))
++    {
++      printf ("Error in reduced_expo_range\non x = ");
++      mpfr_dump (x);
++      printf ("Expected y = ");
++      mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN);
++      printf ("\n         inex = %d, flags = %u\n", ex_inex, ex_flags);
++      printf ("Got      y = ");
++      mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
++      printf ("\n         inex = %d, flags = %u\n", SIGN (inex), flags);
++      exit (1);
++    }
++
++  mpfr_clears (x, y, ex_y, (mpfr_ptr) 0);
++}
++
+ int
+ main (int argc, char *argv[])
+ {
+@@ -546,6 +592,7 @@
+   smallvals_atan2 ();
+   atan2_bug_20071003 ();
+   atan2_different_prec ();
++  reduced_expo_range ();
+ 
+   test_generic_atan  (2, 200, 17);
+   test_generic_atan2 (2, 200, 17);
+diff -Naur mpfr-3.0.1.orig/tests/texp.c mpfr-3.0.1/tests/texp.c
+--- mpfr-3.0.1.orig/tests/texp.c       2011-04-04 10:19:17.000000000 +0000
++++ mpfr-3.0.1/tests/texp.c    2011-09-27 15:40:16.257750468 +0000
+@@ -170,7 +170,9 @@
+       mpfr_set_prec (x, prec);
+       mpfr_set_prec (y, prec);
+       mpfr_set_prec (z, prec);
+-      mpfr_urandomb (x, RANDS);
++      do
++        mpfr_urandomb (x, RANDS);
++      while (MPFR_IS_ZERO (x));  /* 0 is handled by mpfr_exp only */
+       rnd = RND_RAND ();
+       mpfr_exp_2 (y, x, rnd);
+       mpfr_exp_3 (z, x, rnd);
+diff -Naur mpfr-3.0.1.orig/version.c mpfr-3.0.1/version.c
+--- mpfr-3.0.1.orig/version.c  2011-04-04 10:19:18.000000000 +0000
++++ mpfr-3.0.1/version.c       2011-09-27 15:40:16.258740832 +0000
+@@ -25,5 +25,5 @@
+ const char *
+ mpfr_get_version (void)
+ {
+-  return "3.0.1";
++  return "3.0.1-p4";
+ }

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to