coreboot/util/crossgcc/patches/mpfr-3.0.0_allpatches_20101216.patch
<<
>>
Prefs
   1diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
   2--- mpfr-3.0.0.orig/PATCHES     2010-06-23 11:02:49.000000000 +0000
   3+++ mpfr-3.0.0/PATCHES  2010-06-23 11:03:36.000000000 +0000
   4@@ -0,0 +1 @@
   5+mpfr_out_str
   6diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
   7--- mpfr-3.0.0.orig/VERSION     2010-06-10 11:00:14.000000000 +0000
   8+++ mpfr-3.0.0/VERSION  2010-06-23 11:03:20.000000000 +0000
   9@@ -1 +1 @@
  10-3.0.0
  11+3.0.0-p1
  12diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
  13--- mpfr-3.0.0.orig/mpfr.h      2010-06-10 11:00:14.000000000 +0000
  14+++ mpfr-3.0.0/mpfr.h   2010-06-23 11:03:20.000000000 +0000
  15@@ -27,7 +27,7 @@
  16 #define MPFR_VERSION_MAJOR 3
  17 #define MPFR_VERSION_MINOR 0
  18 #define MPFR_VERSION_PATCHLEVEL 0
  19-#define MPFR_VERSION_STRING "3.0.0"
  20+#define MPFR_VERSION_STRING "3.0.0-p1"
  21 
  22 /* Macros dealing with MPFR VERSION */
  23 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
  24diff -Naurd mpfr-3.0.0.orig/mpfr.texi mpfr-3.0.0/mpfr.texi
  25--- mpfr-3.0.0.orig/mpfr.texi   2010-06-10 11:00:14.000000000 +0000
  26+++ mpfr-3.0.0/mpfr.texi        2010-06-23 11:03:12.000000000 +0000
  27@@ -2050,7 +2050,7 @@
  28 are printed. If @var{base} is greater than 10, @samp{@@} will be used
  29 instead of @samp{e} as exponent delimiter.
  30 
  31-Return the number of bytes written, or if an error occurred, return 0.
  32+Return the number of characters written, or if an error occurred, return 0.
  33 @end deftypefun
  34 
  35 @deftypefun size_t mpfr_inp_str (mpfr_t @var{rop}, FILE *@var{stream}, int @var{base}, mpfr_rnd_t @var{rnd})
  36diff -Naurd mpfr-3.0.0.orig/out_str.c mpfr-3.0.0/out_str.c
  37--- mpfr-3.0.0.orig/out_str.c   2010-06-10 11:00:14.000000000 +0000
  38+++ mpfr-3.0.0/out_str.c        2010-06-23 11:03:12.000000000 +0000
  39@@ -22,6 +22,16 @@
  40 
  41 #include "mpfr-impl.h"
  42 
  43+/* Warning! S should not contain "%". */
  44+#define OUT_STR_RET(S)                          \
  45+  do                                            \
  46+    {                                           \
  47+      int r;                                    \
  48+      r = fprintf (stream, (S));                \
  49+      return r < 0 ? 0 : r;                     \
  50+    }                                           \
  51+  while (0)
  52+
  53 size_t
  54 mpfr_out_str (FILE *stream, int base, size_t n_digits, mpfr_srcptr op,
  55               mpfr_rnd_t rnd_mode)
  56@@ -29,6 +39,7 @@
  57   char *s, *s0;
  58   size_t l;
  59   mpfr_exp_t e;
  60+  int err;
  61 
  62   MPFR_ASSERTN (base >= 2 && base <= 62);
  63 
  64@@ -36,37 +47,16 @@
  65   if (stream == NULL)
  66     stream = stdout;
  67 
  68-  if (MPFR_IS_NAN(op))
  69-    {
  70-      fprintf (stream, "@NaN@");
  71-      return 3;
  72-    }
  73-
  74-  if (MPFR_IS_INF(op))
  75-    {
  76-      if (MPFR_SIGN(op) > 0)
  77-        {
  78-          fprintf (stream, "@Inf@");
  79-          return 3;
  80-        }
  81-      else
  82-        {
  83-          fprintf (stream, "-@Inf@");
  84-          return 4;
  85-        }
  86-    }
  87-
  88-  if (MPFR_IS_ZERO(op))
  89+  if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (op)))
  90     {
  91-      if (MPFR_SIGN(op) > 0)
  92-        {
  93-          fprintf(stream, "0");
  94-          return 1;
  95-        }
  96+      if (MPFR_IS_NAN (op))
  97+        OUT_STR_RET ("@NaN@");
  98+      else if (MPFR_IS_INF (op))
  99+        OUT_STR_RET (MPFR_IS_POS (op) ? "@Inf@" : "-@Inf@");
 100       else
 101         {
 102-          fprintf(stream, "-0");
 103-          return 2;
 104+          MPFR_ASSERTD (MPFR_IS_ZERO (op));
 105+          OUT_STR_RET (MPFR_IS_POS (op) ? "0" : "-0");
 106         }
 107     }
 108 
 109@@ -77,21 +67,31 @@
 110 
 111   l = strlen (s) + 1; /* size of allocated block returned by mpfr_get_str
 112                          - may be incorrect, as only an upper bound? */
 113-  if (*s == '-')
 114-    fputc (*s++, stream);
 115 
 116-  /* outputs mantissa */
 117-  fputc (*s++, stream); e--; /* leading digit */
 118-  fputc ((unsigned char) MPFR_DECIMAL_POINT, stream);
 119-  fputs (s, stream);         /* rest of mantissa */
 120+  /* outputs possible sign and significand */
 121+  err = (*s == '-' && fputc (*s++, stream) == EOF)
 122+    || fputc (*s++, stream) == EOF  /* leading digit */
 123+    || fputc ((unsigned char) MPFR_DECIMAL_POINT, stream) == EOF
 124+    || fputs (s, stream) == EOF;     /* trailing significand */
 125   (*__gmp_free_func) (s0, l);
 126+  if (MPFR_UNLIKELY (err))
 127+    return 0;
 128+
 129+  e--;  /* due to the leading digit */
 130 
 131   /* outputs exponent */
 132   if (e)
 133     {
 134+      int r;
 135+
 136       MPFR_ASSERTN(e >= LONG_MIN);
 137       MPFR_ASSERTN(e <= LONG_MAX);
 138-      l += fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e);
 139+
 140+      r = fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e);
 141+      if (MPFR_UNLIKELY (r < 0))
 142+        return 0;
 143+
 144+      l += r;
 145     }
 146 
 147   return l;
 148diff -Naurd mpfr-3.0.0.orig/tests/tout_str.c mpfr-3.0.0/tests/tout_str.c
 149--- mpfr-3.0.0.orig/tests/tout_str.c    2010-06-10 11:00:13.000000000 +0000
 150+++ mpfr-3.0.0/tests/tout_str.c 2010-06-23 11:03:12.000000000 +0000
 151@@ -46,22 +46,54 @@
 152 special (void)
 153 {
 154   mpfr_t x;
 155+  unsigned int n;
 156 
 157   mpfr_init (x);
 158 
 159   mpfr_set_nan (x);
 160-  mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 161+  n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 162+  if (n != 5)
 163+    {
 164+      printf ("Error: mpfr_out_str (file, 10, 0, NaN, MPFR_RNDN) wrote %u "
 165+              "characters instead of 5.\n", n);
 166+      exit (1);
 167+    }
 168 
 169   mpfr_set_inf (x, 1);
 170-  mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 171+  n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 172+  if (n != 5)
 173+    {
 174+      printf ("Error: mpfr_out_str (file, 10, 0, +Inf, MPFR_RNDN) wrote %u "
 175+               "characters instead of 5.\n", n);
 176+      exit (1);
 177+    }
 178 
 179   mpfr_set_inf (x, -1);
 180-  mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 181+  n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 182+  if (n != 6)
 183+    {
 184+      printf ("Error: mpfr_out_str (file, 10, 0, -Inf, MPFR_RNDN) wrote %u "
 185+               "characters instead of 6.\n", n);
 186+      exit (1);
 187+    }
 188 
 189   mpfr_set_ui (x, 0, MPFR_RNDN);
 190-  mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 191+  n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 192+  if (n != 1)
 193+    {
 194+      printf ("Error: mpfr_out_str (file, 10, 0, +0, MPFR_RNDN) wrote %u "
 195+               "characters instead of 1.\n", n);
 196+      exit (1);
 197+    }
 198+
 199   mpfr_neg (x, x, MPFR_RNDN);
 200-  mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 201+  n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN);
 202+  if (n != 2)
 203+    {
 204+      printf ("Error: mpfr_out_str (file, 10, 0, -0, MPFR_RNDN) wrote %u "
 205+               "characters instead of 2.\n", n);
 206+      exit (1);
 207+    }
 208 
 209   mpfr_clear (x);
 210 }
 211diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
 212--- mpfr-3.0.0.orig/version.c   2010-06-10 11:00:14.000000000 +0000
 213+++ mpfr-3.0.0/version.c        2010-06-23 11:03:20.000000000 +0000
 214@@ -25,5 +25,5 @@
 215 const char *
 216 mpfr_get_version (void)
 217 {
 218-  return "3.0.0";
 219+  return "3.0.0-p1";
 220 }
 221diff -Naurd mpfr-3.0.0.orig/Makefile.in mpfr-3.0.0/Makefile.in
 222--- mpfr-3.0.0.orig/Makefile.in 2010-06-10 11:00:52.000000000 +0000
 223+++ mpfr-3.0.0/Makefile.in      2010-06-10 11:00:52.000000000 +0000
 224@@ -239,6 +239,7 @@
 225 distuninstallcheck_listfiles = find . -type f -print
 226 distcleancheck_listfiles = find . -type f -print
 227 ACLOCAL = @ACLOCAL@
 228+ALLOCA = @ALLOCA@
 229 AMTAR = @AMTAR@
 230 AR = @AR@
 231 AS = @AS@
 232diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
 233--- mpfr-3.0.0.orig/PATCHES     2010-06-23 11:03:36.000000000 +0000
 234+++ mpfr-3.0.0/PATCHES  2010-06-25 13:23:13.000000000 +0000
 235@@ -0,0 +1 @@
 236+alloca
 237diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
 238--- mpfr-3.0.0.orig/VERSION     2010-06-23 11:03:20.000000000 +0000
 239+++ mpfr-3.0.0/VERSION  2010-06-25 13:23:13.000000000 +0000
 240@@ -1 +1 @@
 241-3.0.0-p1
 242+3.0.0-p2
 243diff -Naurd mpfr-3.0.0.orig/acinclude.m4 mpfr-3.0.0/acinclude.m4
 244--- mpfr-3.0.0.orig/acinclude.m4        2010-06-10 11:00:14.000000000 +0000
 245+++ mpfr-3.0.0/acinclude.m4     2010-06-10 11:00:14.000000000 +0000
 246@@ -59,6 +59,9 @@
 247 dnl sys/fpu.h - MIPS specific
 248 AC_CHECK_HEADERS([sys/time.h sys/fpu.h])
 249 
 250+dnl Check how to get `alloca'
 251+AC_FUNC_ALLOCA
 252+
 253 dnl SIZE_MAX macro
 254 gl_SIZE_MAX
 255 
 256diff -Naurd mpfr-3.0.0.orig/configure mpfr-3.0.0/configure
 257--- mpfr-3.0.0.orig/configure   2010-06-10 11:00:51.000000000 +0000
 258+++ mpfr-3.0.0/configure        2010-06-25 13:23:05.000000000 +0000
 259@@ -783,6 +783,7 @@
 260 OBJDUMP
 261 DLLTOOL
 262 AS
 263+ALLOCA
 264 MPFR_LIBM
 265 ANSI2KNR
 266 U
 267@@ -5622,6 +5623,197 @@
 268 done
 269 
 270 
 271+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 272+# for constant arguments.  Useless!
 273+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
 274+$as_echo_n "checking for working alloca.h... " >&6; }
 275+if test "${ac_cv_working_alloca_h+set}" = set; then :
 276+  $as_echo_n "(cached) " >&6
 277+else
 278+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 279+/* end confdefs.h.  */
 280+#include <alloca.h>
 281+int
 282+main ()
 283+{
 284+char *p = (char *) alloca (2 * sizeof (int));
 285+                         if (p) return 0;
 286+  ;
 287+  return 0;
 288+}
 289+_ACEOF
 290+if ac_fn_c_try_link "$LINENO"; then :
 291+  ac_cv_working_alloca_h=yes
 292+else
 293+  ac_cv_working_alloca_h=no
 294+fi
 295+rm -f core conftest.err conftest.$ac_objext \
 296+    conftest$ac_exeext conftest.$ac_ext
 297+fi
 298+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
 299+$as_echo "$ac_cv_working_alloca_h" >&6; }
 300+if test $ac_cv_working_alloca_h = yes; then
 301+
 302+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
 303+
 304+fi
 305+
 306+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
 307+$as_echo_n "checking for alloca... " >&6; }
 308+if test "${ac_cv_func_alloca_works+set}" = set; then :
 309+  $as_echo_n "(cached) " >&6
 310+else
 311+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 312+/* end confdefs.h.  */
 313+#ifdef __GNUC__
 314+# define alloca __builtin_alloca
 315+#else
 316+# ifdef _MSC_VER
 317+#  include <malloc.h>
 318+#  define alloca _alloca
 319+# else
 320+#  ifdef HAVE_ALLOCA_H
 321+#   include <alloca.h>
 322+#  else
 323+#   ifdef _AIX
 324+ #pragma alloca
 325+#   else
 326+#    ifndef alloca /* predefined by HP cc +Olibcalls */
 327+char *alloca ();
 328+#    endif
 329+#   endif
 330+#  endif
 331+# endif
 332+#endif
 333+
 334+int
 335+main ()
 336+{
 337+char *p = (char *) alloca (1);
 338+                                   if (p) return 0;
 339+  ;
 340+  return 0;
 341+}
 342+_ACEOF
 343+if ac_fn_c_try_link "$LINENO"; then :
 344+  ac_cv_func_alloca_works=yes
 345+else
 346+  ac_cv_func_alloca_works=no
 347+fi
 348+rm -f core conftest.err conftest.$ac_objext \
 349+    conftest$ac_exeext conftest.$ac_ext
 350+fi
 351+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
 352+$as_echo "$ac_cv_func_alloca_works" >&6; }
 353+
 354+if test $ac_cv_func_alloca_works = yes; then
 355+
 356+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
 357+
 358+else
 359+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
 360+# that cause trouble.  Some versions do not even contain alloca or
 361+# contain a buggy version.  If you still want to use their alloca,
 362+# use ar to extract alloca.o from them instead of compiling alloca.c.
 363+
 364+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
 365+
 366+$as_echo "#define C_ALLOCA 1" >>confdefs.h
 367+
 368+
 369+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
 370+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
 371+if test "${ac_cv_os_cray+set}" = set; then :
 372+  $as_echo_n "(cached) " >&6
 373+else
 374+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 375+/* end confdefs.h.  */
 376+#if defined CRAY && ! defined CRAY2
 377+webecray
 378+#else
 379+wenotbecray
 380+#endif
 381+
 382+_ACEOF
 383+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 384+  $EGREP "webecray" >/dev/null 2>&1; then :
 385+  ac_cv_os_cray=yes
 386+else
 387+  ac_cv_os_cray=no
 388+fi
 389+rm -f conftest*
 390+
 391+fi
 392+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
 393+$as_echo "$ac_cv_os_cray" >&6; }
 394+if test $ac_cv_os_cray = yes; then
 395+  for ac_func in _getb67 GETB67 getb67; do
 396+    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 397+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
 398+eval as_val=\$$as_ac_var
 399+   if test "x$as_val" = x""yes; then :
 400+
 401+cat >>confdefs.h <<_ACEOF
 402+#define CRAY_STACKSEG_END $ac_func
 403+_ACEOF
 404+
 405+    break
 406+fi
 407+
 408+  done
 409+fi
 410+
 411+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
 412+$as_echo_n "checking stack direction for C alloca... " >&6; }
 413+if test "${ac_cv_c_stack_direction+set}" = set; then :
 414+  $as_echo_n "(cached) " >&6
 415+else
 416+  if test "$cross_compiling" = yes; then :
 417+  ac_cv_c_stack_direction=0
 418+else
 419+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 420+/* end confdefs.h.  */
 421+$ac_includes_default
 422+int
 423+find_stack_direction ()
 424+{
 425+  static char *addr = 0;
 426+  auto char dummy;
 427+  if (addr == 0)
 428+    {
 429+      addr = &dummy;
 430+      return find_stack_direction ();
 431+    }
 432+  else
 433+    return (&dummy > addr) ? 1 : -1;
 434+}
 435+
 436+int
 437+main ()
 438+{
 439+  return find_stack_direction () < 0;
 440+}
 441+_ACEOF
 442+if ac_fn_c_try_run "$LINENO"; then :
 443+  ac_cv_c_stack_direction=1
 444+else
 445+  ac_cv_c_stack_direction=-1
 446+fi
 447+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
 448+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 449+fi
 450+
 451+fi
 452+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
 453+$as_echo "$ac_cv_c_stack_direction" >&6; }
 454+cat >>confdefs.h <<_ACEOF
 455+#define STACK_DIRECTION $ac_cv_c_stack_direction
 456+_ACEOF
 457+
 458+
 459+fi
 460+
 461+
 462 
 463   for ac_header in stdint.h
 464 do :
 465@@ -7564,13 +7756,13 @@
 466 else
 467   lt_cv_nm_interface="BSD nm"
 468   echo "int some_variable = 0;" > conftest.$ac_ext
 469-  (eval echo "\"\$as_me:7567: $ac_compile\"" >&5)
 470+  (eval echo "\"\$as_me:7759: $ac_compile\"" >&5)
 471   (eval "$ac_compile" 2>conftest.err)
 472   cat conftest.err >&5
 473-  (eval echo "\"\$as_me:7570: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
 474+  (eval echo "\"\$as_me:7762: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
 475   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
 476   cat conftest.err >&5
 477-  (eval echo "\"\$as_me:7573: output\"" >&5)
 478+  (eval echo "\"\$as_me:7765: output\"" >&5)
 479   cat conftest.out >&5
 480   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
 481     lt_cv_nm_interface="MS dumpbin"
 482@@ -8772,7 +8964,7 @@
 483   ;;
 484 *-*-irix6*)
 485   # Find out which ABI we are using.
 486-  echo '#line 8775 "configure"' > conftest.$ac_ext
 487+  echo '#line 8967 "configure"' > conftest.$ac_ext
 488   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 489   (eval $ac_compile) 2>&5
 490   ac_status=$?
 491@@ -10032,11 +10224,11 @@
 492    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
 493    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
 494    -e 's:$: $lt_compiler_flag:'`
 495-   (eval echo "\"\$as_me:10035: $lt_compile\"" >&5)
 496+   (eval echo "\"\$as_me:10227: $lt_compile\"" >&5)
 497    (eval "$lt_compile" 2>conftest.err)
 498    ac_status=$?
 499    cat conftest.err >&5
 500-   echo "$as_me:10039: \$? = $ac_status" >&5
 501+   echo "$as_me:10231: \$? = $ac_status" >&5
 502    if (exit $ac_status) && test -s "$ac_outfile"; then
 503      # The compiler can only warn and ignore the option if not recognized
 504      # So say no if there are warnings other than the usual output.
 505@@ -10371,11 +10563,11 @@
 506    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
 507    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
 508    -e 's:$: $lt_compiler_flag:'`
 509-   (eval echo "\"\$as_me:10374: $lt_compile\"" >&5)
 510+   (eval echo "\"\$as_me:10566: $lt_compile\"" >&5)
 511    (eval "$lt_compile" 2>conftest.err)
 512    ac_status=$?
 513    cat conftest.err >&5
 514-   echo "$as_me:10378: \$? = $ac_status" >&5
 515+   echo "$as_me:10570: \$? = $ac_status" >&5
 516    if (exit $ac_status) && test -s "$ac_outfile"; then
 517      # The compiler can only warn and ignore the option if not recognized
 518      # So say no if there are warnings other than the usual output.
 519@@ -10476,11 +10668,11 @@
 520    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
 521    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
 522    -e 's:$: $lt_compiler_flag:'`
 523-   (eval echo "\"\$as_me:10479: $lt_compile\"" >&5)
 524+   (eval echo "\"\$as_me:10671: $lt_compile\"" >&5)
 525    (eval "$lt_compile" 2>out/conftest.err)
 526    ac_status=$?
 527    cat out/conftest.err >&5
 528-   echo "$as_me:10483: \$? = $ac_status" >&5
 529+   echo "$as_me:10675: \$? = $ac_status" >&5
 530    if (exit $ac_status) && test -s out/conftest2.$ac_objext
 531    then
 532      # The compiler can only warn and ignore the option if not recognized
 533@@ -10531,11 +10723,11 @@
 534    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
 535    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
 536    -e 's:$: $lt_compiler_flag:'`
 537-   (eval echo "\"\$as_me:10534: $lt_compile\"" >&5)
 538+   (eval echo "\"\$as_me:10726: $lt_compile\"" >&5)
 539    (eval "$lt_compile" 2>out/conftest.err)
 540    ac_status=$?
 541    cat out/conftest.err >&5
 542-   echo "$as_me:10538: \$? = $ac_status" >&5
 543+   echo "$as_me:10730: \$? = $ac_status" >&5
 544    if (exit $ac_status) && test -s out/conftest2.$ac_objext
 545    then
 546      # The compiler can only warn and ignore the option if not recognized
 547@@ -12915,7 +13107,7 @@
 548   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
 549   lt_status=$lt_dlunknown
 550   cat > conftest.$ac_ext <<_LT_EOF
 551-#line 12918 "configure"
 552+#line 13110 "configure"
 553 #include "confdefs.h"
 554 
 555 #if HAVE_DLFCN_H
 556@@ -13011,7 +13203,7 @@
 557   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
 558   lt_status=$lt_dlunknown
 559   cat > conftest.$ac_ext <<_LT_EOF
 560-#line 13014 "configure"
 561+#line 13206 "configure"
 562 #include "confdefs.h"
 563 
 564 #if HAVE_DLFCN_H
 565diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
 566--- mpfr-3.0.0.orig/mpfr.h      2010-06-23 11:03:20.000000000 +0000
 567+++ mpfr-3.0.0/mpfr.h   2010-06-25 13:23:13.000000000 +0000
 568@@ -27,7 +27,7 @@
 569 #define MPFR_VERSION_MAJOR 3
 570 #define MPFR_VERSION_MINOR 0
 571 #define MPFR_VERSION_PATCHLEVEL 0
 572-#define MPFR_VERSION_STRING "3.0.0-p1"
 573+#define MPFR_VERSION_STRING "3.0.0-p2"
 574 
 575 /* Macros dealing with MPFR VERSION */
 576 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
 577diff -Naurd mpfr-3.0.0.orig/tests/Makefile.in mpfr-3.0.0/tests/Makefile.in
 578--- mpfr-3.0.0.orig/tests/Makefile.in   2010-06-10 11:00:52.000000000 +0000
 579+++ mpfr-3.0.0/tests/Makefile.in        2010-06-10 11:00:52.000000000 +0000
 580@@ -960,6 +960,7 @@
 581 red=; grn=; lgn=; blu=; std=
 582 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 583 ACLOCAL = @ACLOCAL@
 584+ALLOCA = @ALLOCA@
 585 AMTAR = @AMTAR@
 586 AR = @AR@
 587 AS = @AS@
 588diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
 589--- mpfr-3.0.0.orig/version.c   2010-06-23 11:03:20.000000000 +0000
 590+++ mpfr-3.0.0/version.c        2010-06-25 13:23:13.000000000 +0000
 591@@ -25,5 +25,5 @@
 592 const char *
 593 mpfr_get_version (void)
 594 {
 595-  return "3.0.0-p1";
 596+  return "3.0.0-p2";
 597 }
 598diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
 599--- mpfr-3.0.0.orig/PATCHES     2010-07-10 00:11:19.000000000 +0000
 600+++ mpfr-3.0.0/PATCHES  2010-07-10 00:12:50.000000000 +0000
 601@@ -0,0 +1 @@
 602+gamma_underflow
 603diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
 604--- mpfr-3.0.0.orig/VERSION     2010-06-25 13:23:13.000000000 +0000
 605+++ mpfr-3.0.0/VERSION  2010-07-10 00:11:53.000000000 +0000
 606@@ -1 +1 @@
 607-3.0.0-p2
 608+3.0.0-p3
 609diff -Naurd mpfr-3.0.0.orig/gamma.c mpfr-3.0.0/gamma.c
 610--- mpfr-3.0.0.orig/gamma.c     2010-06-10 11:00:14.000000000 +0000
 611+++ mpfr-3.0.0/gamma.c  2010-07-10 00:11:46.000000000 +0000
 612@@ -274,7 +274,7 @@
 613       /* we want an upper bound for x * [log(2-x)-1].
 614          since x < 0, we need a lower bound on log(2-x) */
 615       mpfr_ui_sub (xp, 2, x, MPFR_RNDD);
 616-      mpfr_log (xp, xp, MPFR_RNDD);
 617+      mpfr_log2 (xp, xp, MPFR_RNDD);
 618       mpfr_sub_ui (xp, xp, 1, MPFR_RNDD);
 619       mpfr_mul (xp, xp, x, MPFR_RNDU);
 620 
 621@@ -303,8 +303,8 @@
 622         {
 623           mpfr_sub (tmp, tmp, tmp2, MPFR_RNDZ); /* low bnd on |sin(Pi*(2-x))| */
 624           mpfr_ui_div (tmp, 12, tmp, MPFR_RNDU); /* upper bound */
 625-          mpfr_log (tmp, tmp, MPFR_RNDU);
 626-          mpfr_add (tmp, tmp, xp, MPFR_RNDU);
 627+          mpfr_log2 (tmp, tmp, MPFR_RNDU);
 628+          mpfr_add (xp, tmp, xp, MPFR_RNDU);
 629           underflow = mpfr_cmp_si (xp, expo.saved_emin - 2) <= 0;
 630         }
 631 
 632diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
 633--- mpfr-3.0.0.orig/mpfr.h      2010-06-25 13:23:13.000000000 +0000
 634+++ mpfr-3.0.0/mpfr.h   2010-07-10 00:11:53.000000000 +0000
 635@@ -27,7 +27,7 @@
 636 #define MPFR_VERSION_MAJOR 3
 637 #define MPFR_VERSION_MINOR 0
 638 #define MPFR_VERSION_PATCHLEVEL 0
 639-#define MPFR_VERSION_STRING "3.0.0-p2"
 640+#define MPFR_VERSION_STRING "3.0.0-p3"
 641 
 642 /* Macros dealing with MPFR VERSION */
 643 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
 644diff -Naurd mpfr-3.0.0.orig/tests/tgamma.c mpfr-3.0.0/tests/tgamma.c
 645--- mpfr-3.0.0.orig/tests/tgamma.c      2010-06-10 11:00:13.000000000 +0000
 646+++ mpfr-3.0.0/tests/tgamma.c   2010-07-10 00:11:46.000000000 +0000
 647@@ -461,6 +461,20 @@
 648   mpfr_clear (x);
 649 }
 650 
 651+/* bug found by Stathis, only occurs on 32-bit machines */
 652+static void
 653+test20100709 (void)
 654+{
 655+  mpfr_t x;
 656+  int inex;
 657+
 658+  mpfr_init2 (x, 100);
 659+  mpfr_set_str (x, "-4.6308260837372266e+07", 10, MPFR_RNDN);
 660+  inex = mpfr_gamma (x, x, MPFR_RNDN);
 661+  MPFR_ASSERTN(MPFR_IS_ZERO(x) && MPFR_IS_NEG(x) && inex > 0);
 662+  mpfr_clear (x);
 663+}
 664+
 665 int
 666 main (int argc, char *argv[])
 667 {
 668@@ -471,6 +485,7 @@
 669   test_generic (2, 100, 2);
 670   gamma_integer ();
 671   test20071231 ();
 672+  test20100709 ();
 673 
 674   data_check ("data/gamma", mpfr_gamma, "mpfr_gamma");
 675 
 676diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
 677--- mpfr-3.0.0.orig/version.c   2010-06-25 13:23:13.000000000 +0000
 678+++ mpfr-3.0.0/version.c        2010-07-10 00:11:53.000000000 +0000
 679@@ -25,5 +25,5 @@
 680 const char *
 681 mpfr_get_version (void)
 682 {
 683-  return "3.0.0-p2";
 684+  return "3.0.0-p3";
 685 }
 686diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
 687--- mpfr-3.0.0.orig/PATCHES     2010-09-07 08:44:01.000000000 +0000
 688+++ mpfr-3.0.0/PATCHES  2010-09-07 08:48:46.000000000 +0000
 689@@ -0,0 +1 @@
 690+mpfr_cmp/set_ui/si
 691diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
 692--- mpfr-3.0.0.orig/VERSION     2010-07-10 00:11:53.000000000 +0000
 693+++ mpfr-3.0.0/VERSION  2010-09-07 08:46:06.000000000 +0000
 694@@ -1 +1 @@
 695-3.0.0-p3
 696+3.0.0-p4
 697diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
 698--- mpfr-3.0.0.orig/mpfr.h      2010-07-10 00:11:53.000000000 +0000
 699+++ mpfr-3.0.0/mpfr.h   2010-09-07 08:46:06.000000000 +0000
 700@@ -27,7 +27,7 @@
 701 #define MPFR_VERSION_MAJOR 3
 702 #define MPFR_VERSION_MINOR 0
 703 #define MPFR_VERSION_PATCHLEVEL 0
 704-#define MPFR_VERSION_STRING "3.0.0-p3"
 705+#define MPFR_VERSION_STRING "3.0.0-p4"
 706 
 707 /* Macros dealing with MPFR VERSION */
 708 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
 709@@ -798,35 +798,45 @@
 710      anyway. Checking with other ICC versions is needed. Possibly detect
 711      whether warnings are produced or not with a configure test.
 712    + Remove C++ too, since it complains too much. */
 713+/* Added casts to improve robustness in case of undefined behavior and
 714+   compiler extensions based on UB (in particular -fwrapv). MPFR doesn't
 715+   use such extensions, but these macros will be used by 3rd-party code,
 716+   where such extensions may be required.
 717+   Moreover casts to unsigned long have been added to avoid warnings in
 718+   programs that use MPFR and are compiled with -Wconversion; such casts
 719+   are OK since if X is a constant expression, then (unsigned long) X is
 720+   also a constant expression, so that the optimizations still work. */
 721 #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus)
 722 #if (__GNUC__ >= 2)
 723 #undef mpfr_cmp_ui
 724-/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. */
 725-#define mpfr_cmp_ui(_f,_u)                 \
 726- (__builtin_constant_p (_u) && (_u) == 0 ? \
 727-   mpfr_sgn (_f) :                         \
 728-   mpfr_cmp_ui_2exp ((_f),(_u),0))
 729+/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0.
 730+   But warning! mpfr_sgn is specified as a macro in the API, thus the macro
 731+   mustn't be used if side effects are possible, like here. */
 732+#define mpfr_cmp_ui(_f,_u)                                      \
 733+  (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ?     \
 734+   (mpfr_sgn) (_f) :                                            \
 735+   mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0))
 736 #undef mpfr_cmp_si
 737-#define mpfr_cmp_si(_f,_s)                 \
 738- (__builtin_constant_p (_s) && (_s) >= 0 ? \
 739-   mpfr_cmp_ui ((_f), (_s)) :              \
 740-   mpfr_cmp_si_2exp ((_f), (_s), 0))
 741+#define mpfr_cmp_si(_f,_s)                              \
 742+  (__builtin_constant_p (_s) && (long) (_s) >= 0 ?      \
 743+   mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) :    \
 744+   mpfr_cmp_si_2exp ((_f), (long) (_s), 0))
 745 #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95
 746 #undef mpfr_set_ui
 747-#define mpfr_set_ui(_f,_u,_r)              \
 748- (__builtin_constant_p (_u) && (_u) == 0 ? \
 749-   __extension__ ({                        \
 750-     mpfr_ptr _p = (_f);                   \
 751-     _p->_mpfr_sign = 1;                   \
 752-     _p->_mpfr_exp = __MPFR_EXP_ZERO;      \
 753-     (void) (_r); 0; }) :                  \
 754-   mpfr_set_ui_2exp ((_f), (_u), 0, (_r)))
 755+#define mpfr_set_ui(_f,_u,_r)                                   \
 756+  (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ?     \
 757+   __extension__ ({                                             \
 758+       mpfr_ptr _p = (_f);                                      \
 759+       _p->_mpfr_sign = 1;                                      \
 760+       _p->_mpfr_exp = __MPFR_EXP_ZERO;                         \
 761+       (void) (_r); 0; }) :                                     \
 762+   mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r)))
 763 #endif
 764 #undef mpfr_set_si
 765-#define mpfr_set_si(_f,_s,_r)              \
 766- (__builtin_constant_p (_s) && (_s) >= 0 ? \
 767-   mpfr_set_ui ((_f), (_s), (_r)) :        \
 768-   mpfr_set_si_2exp ((_f), (_s), 0, (_r)))
 769+#define mpfr_set_si(_f,_s,_r)                                   \
 770+  (__builtin_constant_p (_s) && (long) (_s) >= 0 ?              \
 771+   mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) :      \
 772+   mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r)))
 773 #endif
 774 #endif
 775 
 776diff -Naurd mpfr-3.0.0.orig/tests/tcmp_ui.c mpfr-3.0.0/tests/tcmp_ui.c
 777--- mpfr-3.0.0.orig/tests/tcmp_ui.c     2010-06-10 11:00:13.000000000 +0000
 778+++ mpfr-3.0.0/tests/tcmp_ui.c  2010-09-07 08:45:12.000000000 +0000
 779@@ -88,6 +88,126 @@
 780   mpfr_clear (x);
 781 }
 782 
 783+/* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro
 784+   with __builtin_constant_p for GCC, check that side effects are
 785+   handled correctly. */
 786+static void
 787+check_macros (void)
 788+{
 789+  mpfr_t x;
 790+  int c;
 791+
 792+  mpfr_init2 (x, 32);
 793+
 794+  c = 0;
 795+  mpfr_set_ui (x, 17, MPFR_RNDN);
 796+  if (mpfr_cmp_ui (x, 17) != 0)
 797+    {
 798+      printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n");
 799+      exit (1);
 800+    }
 801+  if (mpfr_cmp_ui (x, (c++, 17)) != 0)
 802+    {
 803+      printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n");
 804+      exit (1);
 805+    }
 806+  if (c != 1)
 807+    {
 808+      printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n"
 809+              "(c = %d instead of 1)\n", c);
 810+      exit (1);
 811+    }
 812+  if (mpfr_cmp_si (x, 17) != 0)
 813+    {
 814+      printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n");
 815+      exit (1);
 816+    }
 817+  if (mpfr_cmp_si (x, (c++, 17)) != 0)
 818+    {
 819+      printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n");
 820+      exit (1);
 821+    }
 822+  if (c != 2)
 823+    {
 824+      printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n"
 825+              "(c = %d instead of 2)\n", c);
 826+      exit (1);
 827+    }
 828+
 829+  c = 0;
 830+  mpfr_set_ui (x, 0, MPFR_RNDN);
 831+  if (mpfr_cmp_ui (x, 0) != 0)
 832+    {
 833+      printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n");
 834+      exit (1);
 835+    }
 836+  if (mpfr_cmp_ui (x, (c++, 0)) != 0)
 837+    {
 838+      printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n");
 839+      exit (1);
 840+    }
 841+  if (c != 1)
 842+    {
 843+      printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n"
 844+              "(c = %d instead of 1)\n", c);
 845+      exit (1);
 846+    }
 847+  if (mpfr_cmp_si (x, 0) != 0)
 848+    {
 849+      printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n");
 850+      exit (1);
 851+    }
 852+  if (mpfr_cmp_si (x, (c++, 0)) != 0)
 853+    {
 854+      printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n");
 855+      exit (1);
 856+    }
 857+  if (c != 2)
 858+    {
 859+      printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n"
 860+              "(c = %d instead of 2)\n", c);
 861+      exit (1);
 862+    }
 863+
 864+  mpfr_clear (x);
 865+}
 866+
 867+/* Bug in r7114 */
 868+static void
 869+test_macros (void)
 870+{
 871+  mpfr_t x[3];
 872+  mpfr_ptr p;
 873+
 874+  mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
 875+  mpfr_set_ui (x[0], 0, MPFR_RNDN);
 876+  p = x[0];
 877+  if (mpfr_cmp_ui (p++, 0) != 0)
 878+    {
 879+      printf ("Error in mpfr_cmp_ui macro: result should be 0.\n");
 880+      exit (1);
 881+    }
 882+  if (p != x[1])
 883+    {
 884+      printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n",
 885+              (int) (p - x[0]));
 886+      exit (1);
 887+    }
 888+  p = x[0];
 889+  if (mpfr_cmp_si (p++, 0) != 0)
 890+    {
 891+      printf ("Error in mpfr_cmp_si macro: result should be 0.\n");
 892+      exit (1);
 893+    }
 894+  if (p != x[1])
 895+    {
 896+      printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n",
 897+              (int) (p - x[0]));
 898+      exit (1);
 899+    }
 900+  mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
 901+}
 902+
 903 int
 904 main (void)
 905 {
 906@@ -216,6 +336,8 @@
 907   mpfr_clear (x);
 908 
 909   check_nan ();
 910+  check_macros ();
 911+  test_macros ();
 912 
 913   tests_end_mpfr ();
 914   return 0;
 915diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
 916--- mpfr-3.0.0.orig/version.c   2010-07-10 00:11:53.000000000 +0000
 917+++ mpfr-3.0.0/version.c        2010-09-07 08:46:06.000000000 +0000
 918@@ -25,5 +25,5 @@
 919 const char *
 920 mpfr_get_version (void)
 921 {
 922-  return "3.0.0-p3";
 923+  return "3.0.0-p4";
 924 }
 925diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
 926--- mpfr-3.0.0.orig/PATCHES     2010-10-21 20:28:38.000000000 +0000
 927+++ mpfr-3.0.0/PATCHES  2010-10-21 20:28:38.000000000 +0000
 928@@ -0,0 +1 @@
 929+tcan_round
 930diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
 931--- mpfr-3.0.0.orig/VERSION     2010-09-07 08:46:06.000000000 +0000
 932+++ mpfr-3.0.0/VERSION  2010-10-21 20:28:38.000000000 +0000
 933@@ -1 +1 @@
 934-3.0.0-p4
 935+3.0.0-p5
 936diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
 937--- mpfr-3.0.0.orig/mpfr.h      2010-09-07 08:46:06.000000000 +0000
 938+++ mpfr-3.0.0/mpfr.h   2010-10-21 20:28:38.000000000 +0000
 939@@ -27,7 +27,7 @@
 940 #define MPFR_VERSION_MAJOR 3
 941 #define MPFR_VERSION_MINOR 0
 942 #define MPFR_VERSION_PATCHLEVEL 0
 943-#define MPFR_VERSION_STRING "3.0.0-p4"
 944+#define MPFR_VERSION_STRING "3.0.0-p5"
 945 
 946 /* Macros dealing with MPFR VERSION */
 947 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
 948diff -Naurd mpfr-3.0.0.orig/tests/tcan_round.c mpfr-3.0.0/tests/tcan_round.c
 949--- mpfr-3.0.0.orig/tests/tcan_round.c  2010-06-10 11:00:13.000000000 +0000
 950+++ mpfr-3.0.0/tests/tcan_round.c       2010-10-21 20:28:38.000000000 +0000
 951@@ -41,7 +41,7 @@
 952       /* avoid mpn_random which leaks memory */
 953       for (i = 0; i < n; i++)
 954         buf[i] = randlimb ();
 955-      p = (mpfr_prec_t) randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN;
 956+      p = randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN;
 957       err = p + randlimb () % GMP_NUMB_BITS;
 958       r1 = mpfr_round_p (buf, n, err, p);
 959       r2 = mpfr_can_round_raw (buf, n, MPFR_SIGN_POS, err,
 960diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
 961--- mpfr-3.0.0.orig/version.c   2010-09-07 08:46:06.000000000 +0000
 962+++ mpfr-3.0.0/version.c        2010-10-21 20:28:38.000000000 +0000
 963@@ -25,5 +25,5 @@
 964 const char *
 965 mpfr_get_version (void)
 966 {
 967-  return "3.0.0-p4";
 968+  return "3.0.0-p5";
 969 }
 970diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
 971--- mpfr-3.0.0.orig/PATCHES     2010-10-21 20:59:32.000000000 +0000
 972+++ mpfr-3.0.0/PATCHES  2010-10-21 20:59:32.000000000 +0000
 973@@ -0,0 +1 @@
 974+mpfr_sub1
 975diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
 976--- mpfr-3.0.0.orig/VERSION     2010-10-21 20:28:38.000000000 +0000
 977+++ mpfr-3.0.0/VERSION  2010-10-21 20:59:32.000000000 +0000
 978@@ -1 +1 @@
 979-3.0.0-p5
 980+3.0.0-p6
 981diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
 982--- mpfr-3.0.0.orig/mpfr.h      2010-10-21 20:28:38.000000000 +0000
 983+++ mpfr-3.0.0/mpfr.h   2010-10-21 20:59:32.000000000 +0000
 984@@ -27,7 +27,7 @@
 985 #define MPFR_VERSION_MAJOR 3
 986 #define MPFR_VERSION_MINOR 0
 987 #define MPFR_VERSION_PATCHLEVEL 0
 988-#define MPFR_VERSION_STRING "3.0.0-p5"
 989+#define MPFR_VERSION_STRING "3.0.0-p6"
 990 
 991 /* Macros dealing with MPFR VERSION */
 992 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
 993diff -Naurd mpfr-3.0.0.orig/sub1.c mpfr-3.0.0/sub1.c
 994--- mpfr-3.0.0.orig/sub1.c      2010-06-10 11:00:14.000000000 +0000
 995+++ mpfr-3.0.0/sub1.c   2010-10-21 20:59:32.000000000 +0000
 996@@ -37,7 +37,9 @@
 997   mp_size_t cancel2, an, bn, cn, cn0;
 998   mp_limb_t *ap, *bp, *cp;
 999   mp_limb_t carry, bb, cc, borrow = 0;
1000-  int inexact, shift_b, shift_c, is_exact = 1, down = 0, add_exp = 0;
1001+  int inexact, shift_b, shift_c, add_exp = 0;
1002+  int cmp_low = 0; /* used for rounding to nearest: 0 if low(b) = low(c),
1003+                      negative if low(b) < low(c), positive if low(b)>low(c) */
1004   int sh, k;
1005   MPFR_TMP_DECL(marker);
1006 
1007@@ -196,7 +198,8 @@
1008     }
1009 
1010 #ifdef DEBUG
1011-  printf ("shift_b=%d shift_c=%d diffexp=%lu\n", shift_b, shift_c,
1012+  printf ("rnd=%s shift_b=%d shift_c=%d diffexp=%lu\n",
1013+          mpfr_print_rnd_mode (rnd_mode), shift_b, shift_c,
1014           (unsigned long) diff_exp);
1015 #endif
1016 
1017@@ -307,17 +310,18 @@
1018     {
1019       if (MPFR_LIKELY(sh))
1020         {
1021-          is_exact = (carry == 0);
1022           /* can decide except when carry = 2^(sh-1) [middle]
1023              or carry = 0 [truncate, but cannot decide inexact flag] */
1024-          down = (carry < (MPFR_LIMB_ONE << (sh - 1)));
1025           if (carry > (MPFR_LIMB_ONE << (sh - 1)))
1026             goto add_one_ulp;
1027-          else if ((0 < carry) && down)
1028+          else if ((0 < carry) && (carry < (MPFR_LIMB_ONE << (sh - 1))))
1029             {
1030               inexact = -1; /* result if smaller than exact value */
1031               goto truncate;
1032             }
1033+          /* now carry = 2^(sh-1), in which case cmp_low=2,
1034+             or carry = 0, in which case cmp_low=0 */
1035+          cmp_low = (carry == 0) ? 0 : 2;
1036         }
1037     }
1038   else /* directed rounding: set rnd_mode to RNDZ iff toward zero */
1039@@ -344,12 +348,32 @@
1040   cn -= (long int) an + cancel2;
1041 
1042 #ifdef DEBUG
1043-  printf ("last %d bits from a are %lu, bn=%ld, cn=%ld\n",
1044+  printf ("last sh=%d bits from a are %lu, bn=%ld, cn=%ld\n",
1045           sh, (unsigned long) carry, (long) bn, (long) cn);
1046 #endif
1047 
1048+  /* for rounding to nearest, we couldn't conclude up to here in the following
1049+     cases:
1050+     1. sh = 0, then cmp_low=0: we can either truncate, subtract one ulp
1051+        or add one ulp: -1 ulp < low(b)-low(c) < 1 ulp
1052+     2. sh > 0 but the low sh bits from high(b)-high(c) equal 2^(sh-1):
1053+        -0.5 ulp <= -1/2^sh < low(b)-low(c)-0.5 < 1/2^sh <= 0.5 ulp
1054+        we can't decide the rounding, in that case cmp_low=2:
1055+        either we truncate and flag=-1, or we add one ulp and flag=1
1056+     3. the low sh>0 bits from high(b)-high(c) equal 0: we know we have to
1057+        truncate but we can't decide the ternary value, here cmp_low=0:
1058+        -0.5 ulp <= -1/2^sh < low(b)-low(c) < 1/2^sh <= 0.5 ulp
1059+        we always truncate and inexact can be any of -1,0,1
1060+  */
1061+
1062+  /* note: here cn might exceed cn0, in which case we consider a zero limb */
1063   for (k = 0; (bn > 0) || (cn > 0); k = 1)
1064     {
1065+      /* if cmp_low < 0, we know low(b) - low(c) < 0
1066+         if cmp_low > 0, we know low(b) - low(c) > 0
1067+            (more precisely if cmp_low = 2, low(b) - low(c) = 0.5 ulp so far)
1068+         if cmp_low = 0, so far low(b) - low(c) = 0 */
1069+
1070       /* get next limbs */
1071       bb = (bn > 0) ? bp[--bn] : 0;
1072       if ((cn > 0) && (cn-- <= cn0))
1073@@ -357,76 +381,115 @@
1074       else
1075         cc = 0;
1076 
1077-      /* down is set when low(b) < low(c) */
1078-      if (down == 0)
1079-        down = (bb < cc);
1080+      /* cmp_low compares low(b) and low(c) */
1081+      if (cmp_low == 0) /* case 1 or 3 */
1082+        cmp_low = (bb < cc) ? -2+k : (bb > cc) ? 1 : 0;
1083+
1084+      /* Case 1 for k=0 splits into 7 subcases:
1085+         1a: bb > cc + half
1086+         1b: bb = cc + half
1087+         1c: 0 < bb - cc < half
1088+         1d: bb = cc
1089+         1e: -half < bb - cc < 0
1090+         1f: bb - cc = -half
1091+         1g: bb - cc < -half
1092+
1093+         Case 2 splits into 3 subcases:
1094+         2a: bb > cc
1095+         2b: bb = cc
1096+         2c: bb < cc
1097+
1098+         Case 3 splits into 3 subcases:
1099+         3a: bb > cc
1100+         3b: bb = cc
1101+         3c: bb < cc
1102+      */
1103 
1104       /* the case rounding to nearest with sh=0 is special since one couldn't
1105          subtract above 1/2 ulp in the trailing limb of the result */
1106-      if ((rnd_mode == MPFR_RNDN) && sh == 0 && k == 0)
1107+      if (rnd_mode == MPFR_RNDN && sh == 0 && k == 0) /* case 1 for k=0 */
1108         {
1109           mp_limb_t half = MPFR_LIMB_HIGHBIT;
1110 
1111-          is_exact = (bb == cc);
1112-
1113           /* add one ulp if bb > cc + half
1114              truncate if cc - half < bb < cc + half
1115              sub one ulp if bb < cc - half
1116           */
1117 
1118-          if (down)
1119+          if (cmp_low < 0) /* bb < cc: -1 ulp < low(b) - low(c) < 0,
1120+                              cases 1e, 1f and 1g */
1121             {
1122               if (cc >= half)
1123                 cc -= half;
1124-              else
1125+              else /* since bb < cc < half, bb+half < 2*half */
1126                 bb += half;
1127+              /* now we have bb < cc + half:
1128+                 we have to subtract one ulp if bb < cc,
1129+                 and truncate if bb > cc */
1130             }
1131-          else /* bb >= cc */
1132+          else if (cmp_low >= 0) /* bb >= cc, cases 1a to 1d */
1133             {
1134               if (cc < half)
1135                 cc += half;
1136-              else
1137+              else /* since bb >= cc >= half, bb - half >= 0 */
1138                 bb -= half;
1139+              /* now we have bb > cc - half: we have to add one ulp if bb > cc,
1140+                 and truncate if bb < cc */
1141+              if (cmp_low > 0)
1142+                cmp_low = 2;
1143             }
1144         }
1145 
1146 #ifdef DEBUG
1147-      printf ("    bb=%lu cc=%lu down=%d is_exact=%d\n",
1148-              (unsigned long) bb, (unsigned long) cc, down, is_exact);
1149+      printf ("k=%u bb=%lu cc=%lu cmp_low=%d\n", k,
1150+              (unsigned long) bb, (unsigned long) cc, cmp_low);
1151 #endif
1152-      if (bb < cc)
1153+      if (cmp_low < 0) /* low(b) - low(c) < 0: either truncate or subtract
1154+                          one ulp */
1155         {
1156           if (rnd_mode == MPFR_RNDZ)
1157-            goto sub_one_ulp;
1158+            goto sub_one_ulp; /* set inexact=-1 */
1159           else if (rnd_mode != MPFR_RNDN) /* round away */
1160             {
1161               inexact = 1;
1162               goto truncate;
1163             }
1164-          else /* round to nearest: special case here since for sh=k=0
1165-                  bb = bb0 - MPFR_LIMB_HIGHBIT */
1166+          else /* round to nearest */
1167             {
1168-              if (is_exact && sh == 0)
1169-                {
1170-                  /* For k=0 we can't decide exactness since it may depend
1171-                     from low order bits.
1172-                     For k=1, the first low limbs matched: low(b)-low(c)<0. */
1173-                  if (k)
1174-                    {
1175-                      inexact = 1;
1176-                      goto truncate;
1177-                    }
1178-                }
1179-              else if (down && sh == 0)
1180-                goto sub_one_ulp;
1181-              else
1182-                {
1183-                  inexact = (is_exact) ? 1 : -1;
1184+              /* If cmp_low < 0 and bb > cc, then -0.5 ulp < low(b)-low(c) < 0,
1185+                 whatever the value of sh.
1186+                 If sh>0, then cmp_low < 0 implies that the initial neglected
1187+                 sh bits were 0 (otherwise cmp_low=2 initially), thus the
1188+                 weight of the new bits is less than 0.5 ulp too.
1189+                 If k > 0 (and sh=0) this means that either the first neglected
1190+                 limbs bb and cc were equal (thus cmp_low was 0 for k=0),
1191+                 or we had bb - cc = -0.5 ulp or 0.5 ulp.
1192+                 The last case is not possible here since we would have
1193+                 cmp_low > 0 which is sticky.
1194+                 In the first case (where we have cmp_low = -1), we truncate,
1195+                 whereas in the 2nd case we have cmp_low = -2 and we subtract
1196+                 one ulp.
1197+              */
1198+              if (bb > cc || sh > 0 || cmp_low == -1)
1199+                {  /* -0.5 ulp < low(b)-low(c) < 0,
1200+                      bb > cc corresponds to cases 1e and 1f1
1201+                      sh > 0 corresponds to cases 3c and 3b3
1202+                      cmp_low = -1 corresponds to case 1d3 (also 3b3) */
1203+                  inexact = 1;
1204                   goto truncate;
1205                 }
1206+              else if (bb < cc) /* here sh = 0 and low(b)-low(c) < -0.5 ulp,
1207+                                   this corresponds to cases 1g and 1f3 */
1208+                goto sub_one_ulp;
1209+              /* the only case where we can't conclude is sh=0 and bb=cc,
1210+                 i.e., we have low(b) - low(c) = -0.5 ulp (up to now), thus
1211+                 we don't know if we must truncate or subtract one ulp.
1212+                 Note: for sh=0 we can't have low(b) - low(c) = -0.5 ulp up to
1213+                 now, since low(b) - low(c) > 1/2^sh */
1214             }
1215         }
1216-      else if (bb > cc)
1217+      else if (cmp_low > 0) /* 0 < low(b) - low(c): either truncate or
1218+                               add one ulp */
1219         {
1220           if (rnd_mode == MPFR_RNDZ)
1221             {
1222@@ -437,34 +500,70 @@
1223             goto add_one_ulp;
1224           else /* round to nearest */
1225             {
1226-              if (is_exact)
1227+              if (bb > cc)
1228                 {
1229-                  inexact = -1;
1230-                  goto truncate;
1231+                  /* if sh=0, then bb>cc means that low(b)-low(c) > 0.5 ulp,
1232+                     and similarly when cmp_low=2 */
1233+                  if (cmp_low == 2) /* cases 1a, 1b1, 2a and 2b1 */
1234+                    goto add_one_ulp;
1235+                  /* sh > 0 and cmp_low > 0: this implies that the sh initial
1236+                     neglected bits were 0, and the remaining low(b)-low(c)>0,
1237+                     but its weight is less than 0.5 ulp */
1238+                  else /* 0 < low(b) - low(c) < 0.5 ulp, this corresponds to
1239+                          cases 3a, 1d1 and 3b1 */
1240+                    {
1241+                      inexact = -1;
1242+                      goto truncate;
1243+                    }
1244                 }
1245-              else if (down)
1246+              else if (bb < cc) /* 0 < low(b) - low(c) < 0.5 ulp, cases 1c,
1247+                                   1b3, 2b3 and 2c */
1248                 {
1249-                  inexact = 1;
1250+                  inexact = -1;
1251                   goto truncate;
1252                 }
1253-              else
1254-                goto add_one_ulp;
1255+              /* the only case where we can't conclude is bb=cc, i.e.,
1256+                 low(b) - low(c) = 0.5 ulp (up to now), thus we don't know
1257+                 if we must truncate or add one ulp. */
1258             }
1259         }
1260+      /* after k=0, we cannot conclude in the following cases, we split them
1261+         according to the values of bb and cc for k=1:
1262+         1b. sh=0 and cmp_low = 1 and bb-cc = half [around 0.5 ulp]
1263+             1b1. bb > cc: add one ulp, inex = 1
1264+             1b2: bb = cc: cannot conclude
1265+             1b3: bb < cc: truncate, inex = -1
1266+         1d. sh=0 and cmp_low = 0 and bb-cc = 0 [around 0]
1267+             1d1: bb > cc: truncate, inex = -1
1268+             1d2: bb = cc: cannot conclude
1269+             1d3: bb < cc: truncate, inex = +1
1270+         1f. sh=0 and cmp_low = -1 and bb-cc = -half [around -0.5 ulp]
1271+             1f1: bb > cc: truncate, inex = +1
1272+             1f2: bb = cc: cannot conclude
1273+             1f3: bb < cc: sub one ulp, inex = -1
1274+         2b. sh > 0 and cmp_low = 2 and bb=cc [around 0.5 ulp]
1275+             2b1. bb > cc: add one ulp, inex = 1
1276+             2b2: bb = cc: cannot conclude
1277+             2b3: bb < cc: truncate, inex = -1
1278+         3b. sh > 0 and cmp_low = 0 [around 0]
1279+             3b1. bb > cc: truncate, inex = -1
1280+             3b2: bb = cc: cannot conclude
1281+             3b3: bb < cc: truncate, inex = +1
1282+      */
1283     }
1284 
1285-  if ((rnd_mode == MPFR_RNDN) && !is_exact)
1286+  if ((rnd_mode == MPFR_RNDN) && cmp_low != 0)
1287     {
1288       /* even rounding rule */
1289       if ((ap[0] >> sh) & 1)
1290         {
1291-          if (down)
1292+          if (cmp_low < 0)
1293             goto sub_one_ulp;
1294           else
1295             goto add_one_ulp;
1296         }
1297       else
1298-        inexact = (down) ? 1 : -1;
1299+        inexact = (cmp_low > 0) ? -1 : 1;
1300     }
1301   else
1302     inexact = 0;
1303diff -Naurd mpfr-3.0.0.orig/tests/tfma.c mpfr-3.0.0/tests/tfma.c
1304--- mpfr-3.0.0.orig/tests/tfma.c        2010-06-10 11:00:13.000000000 +0000
1305+++ mpfr-3.0.0/tests/tfma.c     2010-10-21 20:59:32.000000000 +0000
1306@@ -337,6 +337,94 @@
1307   mpfr_clears (x, y, z, r, (mpfr_ptr) 0);
1308 }
1309 
1310+static void
1311+bug20101018 (void)
1312+{
1313+  mpfr_t x, y, z, t, u;
1314+  int i;
1315+
1316+  mpfr_init2 (x, 64);
1317+  mpfr_init2 (y, 64);
1318+  mpfr_init2 (z, 64);
1319+  mpfr_init2 (t, 64);
1320+  mpfr_init2 (u, 64);
1321+
1322+  mpfr_set_str (x, "0xf.fffffffffffffffp-14766", 16, MPFR_RNDN);
1323+  mpfr_set_str (y, "-0xf.fffffffffffffffp+317", 16, MPFR_RNDN);
1324+  mpfr_set_str (z, "0x8.3ffffffffffe3ffp-14443", 16, MPFR_RNDN);
1325+  mpfr_set_str (t, "0x8.7ffffffffffc7ffp-14444", 16, MPFR_RNDN);
1326+  i = mpfr_fma (u, x, y, z, MPFR_RNDN);
1327+  if (mpfr_cmp (u, t) != 0)
1328+    {
1329+      printf ("Wrong result in bug20101018 (a)\n");
1330+      printf ("Expected ");
1331+      mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN);
1332+      printf ("\nGot      ");
1333+      mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN);
1334+      printf ("\n");
1335+      exit (1);
1336+    }
1337+  if (i <= 0)
1338+    {
1339+      printf ("Wrong ternary value in bug20101018 (a)\n");
1340+      printf ("Expected > 0\n");
1341+      printf ("Got      %d\n", i);
1342+      exit (1);
1343+    }
1344+
1345+  mpfr_set_str (x, "-0xf.fffffffffffffffp-11420", 16, MPFR_RNDN);
1346+  mpfr_set_str (y, "0xf.fffffffffffffffp+9863", 16, MPFR_RNDN);
1347+  mpfr_set_str (z, "0x8.fffff80ffffffffp-1551", 16, MPFR_RNDN);
1348+  mpfr_set_str (t, "0x9.fffff01ffffffffp-1552", 16, MPFR_RNDN);
1349+  i = mpfr_fma (u, x, y, z, MPFR_RNDN);
1350+  if (mpfr_cmp (u, t) != 0)
1351+    {
1352+      printf ("Wrong result in bug20101018 (b)\n");
1353+      printf ("Expected ");
1354+      mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN);
1355+      printf ("\nGot      ");
1356+      mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN);
1357+      printf ("\n");
1358+      exit (1);
1359+    }
1360+  if (i <= 0)
1361+    {
1362+      printf ("Wrong ternary value in bug20101018 (b)\n");
1363+      printf ("Expected > 0\n");
1364+      printf ("Got      %d\n", i);
1365+      exit (1);
1366+    }
1367+
1368+  mpfr_set_str (x, "0xf.fffffffffffffffp-2125", 16, MPFR_RNDN);
1369+  mpfr_set_str (y, "-0xf.fffffffffffffffp-6000", 16, MPFR_RNDN);
1370+  mpfr_set_str (z, "0x8p-8119", 16, MPFR_RNDN);
1371+  mpfr_set_str (t, "0x8.000000000000001p-8120", 16, MPFR_RNDN);
1372+  i = mpfr_fma (u, x, y, z, MPFR_RNDN);
1373+  if (mpfr_cmp (u, t) != 0)
1374+    {
1375+      printf ("Wrong result in bug20101018 (c)\n");
1376+      printf ("Expected ");
1377+      mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN);
1378+      printf ("\nGot      ");
1379+      mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN);
1380+      printf ("\n");
1381+      exit (1);
1382+    }
1383+  if (i <= 0)
1384+    {
1385+      printf ("Wrong ternary value in bug20101018 (c)\n");
1386+      printf ("Expected > 0\n");
1387+      printf ("Got      %d\n", i);
1388+      exit (1);
1389+    }
1390+
1391+  mpfr_clear (x);
1392+  mpfr_clear (y);
1393+  mpfr_clear (z);
1394+  mpfr_clear (t);
1395+  mpfr_clear (u);
1396+}
1397+
1398 int
1399 main (int argc, char *argv[])
1400 {
1401@@ -345,6 +433,8 @@
1402 
1403   tests_start_mpfr ();
1404 
1405+  bug20101018 ();
1406+
1407   mpfr_init (x);
1408   mpfr_init (s);
1409   mpfr_init (y);
1410diff -Naurd mpfr-3.0.0.orig/tests/tsub.c mpfr-3.0.0/tests/tsub.c
1411--- mpfr-3.0.0.orig/tests/tsub.c        2010-06-10 11:00:13.000000000 +0000
1412+++ mpfr-3.0.0/tests/tsub.c     2010-10-21 20:59:32.000000000 +0000
1413@@ -201,6 +201,8 @@
1414   if (mpfr_cmp (z, x))
1415     {
1416       printf ("Error in mpfr_sub (2)\n");
1417+      printf ("Expected "); mpfr_print_binary (x); puts ("");
1418+      printf ("Got      "); mpfr_print_binary (z); puts ("");
1419       exit (1);
1420     }
1421   mpfr_set_str_binary (x, "1.1110111011110001110111011111111111101000011001011100101100101101");
1422@@ -478,6 +480,156 @@
1423   mpfr_clear (u);
1424 }
1425 
1426+/* Bug found by Jakub Jelinek
1427+ * http://bugzilla.redhat.com/643657
1428+ * https://gforge.inria.fr/tracker/index.php?func=detail&aid=11301
1429+ * The consequence can be either an assertion failure (i = 2 in the
1430+ * testcase below, in debug mode) or an incorrectly rounded value.
1431+ */
1432+static void
1433+bug20101017 (void)
1434+{
1435+  mpfr_t a, b, c;
1436+  int inex;
1437+  int i;
1438+
1439+  mpfr_init2 (a, GMP_NUMB_BITS * 2);
1440+  mpfr_init2 (b, GMP_NUMB_BITS);
1441+  mpfr_init2 (c, GMP_NUMB_BITS);
1442+
1443+  /* a = 2^(2N) + k.2^(2N-1) + 2^N and b = 1
1444+     with N = GMP_NUMB_BITS and k = 0 or 1.
1445+     c = a - b should round to the same value as a. */
1446+
1447+  for (i = 2; i <= 3; i++)
1448+    {
1449+      mpfr_set_ui_2exp (a, i, GMP_NUMB_BITS - 1, MPFR_RNDN);
1450+      mpfr_add_ui (a, a, 1, MPFR_RNDN);
1451+      mpfr_mul_2ui (a, a, GMP_NUMB_BITS, MPFR_RNDN);
1452+      mpfr_set_ui (b, 1, MPFR_RNDN);
1453+      inex = mpfr_sub (c, a, b, MPFR_RNDN);
1454+      mpfr_set (b, a, MPFR_RNDN);
1455+      if (! mpfr_equal_p (c, b))
1456+        {
1457+          printf ("Error in bug20101017 for i = %d.\n", i);
1458+          printf ("Expected ");
1459+          mpfr_out_str (stdout, 16, 0, b, MPFR_RNDN);
1460+          putchar ('\n');
1461+          printf ("Got      ");
1462+          mpfr_out_str (stdout, 16, 0, c, MPFR_RNDN);
1463+          putchar ('\n');
1464+          exit (1);
1465+        }
1466+      if (inex >= 0)
1467+        {
1468+          printf ("Error in bug20101017 for i = %d: bad inex value.\n", i);
1469+          printf ("Expected negative, got %d.\n", inex);
1470+          exit (1);
1471+        }
1472+    }
1473+
1474+  mpfr_set_prec (a, 64);
1475+  mpfr_set_prec (b, 129);
1476+  mpfr_set_prec (c, 2);
1477+  mpfr_set_str_binary (b, "0.100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001E65");
1478+  mpfr_set_str_binary (c, "0.10E1");
1479+  inex = mpfr_sub (a, b, c, MPFR_RNDN);
1480+  if (mpfr_cmp_ui_2exp (a, 1, 64) != 0 || inex >= 0)
1481+    {
1482+      printf ("Error in mpfr_sub for b-c for b=2^64+1+2^(-64), c=1\n");
1483+      printf ("Expected result 2^64 with inex < 0\n");
1484+      printf ("Got "); mpfr_print_binary (a);
1485+      printf (" with inex=%d\n", inex);
1486+      exit (1);
1487+    }
1488+
1489+  mpfr_clears (a, b, c, (mpfr_ptr) 0);
1490+}
1491+
1492+/* hard test of rounding */
1493+static void
1494+check_rounding (void)
1495+{
1496+  mpfr_t a, b, c, res;
1497+  mpfr_prec_t p;
1498+  long k, l;
1499+  int i;
1500+
1501+#define MAXKL (2 * GMP_NUMB_BITS)
1502+  for (p = MPFR_PREC_MIN; p <= GMP_NUMB_BITS; p++)
1503+    {
1504+      mpfr_init2 (a, p);
1505+      mpfr_init2 (res, p);
1506+      mpfr_init2 (b, p + 1 + MAXKL);
1507+      mpfr_init2 (c, MPFR_PREC_MIN);
1508+
1509+      /* b = 2^p + 1 + 2^(-k), c = 2^(-l) */
1510+      for (k = 0; k <= MAXKL; k++)
1511+        for (l = 0; l <= MAXKL; l++)
1512+          {
1513+            mpfr_set_ui_2exp (b, 1, p, MPFR_RNDN);
1514+            mpfr_add_ui (b, b, 1, MPFR_RNDN);
1515+            mpfr_mul_2ui (b, b, k, MPFR_RNDN);
1516+            mpfr_add_ui (b, b, 1, MPFR_RNDN);
1517+            mpfr_div_2ui (b, b, k, MPFR_RNDN);
1518+            mpfr_set_ui_2exp (c, 1, -l, MPFR_RNDN);
1519+            i = mpfr_sub (a, b, c, MPFR_RNDN);
1520+            /* b - c = 2^p + 1 + 2^(-k) - 2^(-l), should be rounded to
1521+               2^p for l <= k, and 2^p+2 for l < k */
1522+            if (l <= k)
1523+              {
1524+                if (mpfr_cmp_ui_2exp (a, 1, p) != 0)
1525+                  {
1526+                    printf ("Wrong result in check_rounding\n");
1527+                    printf ("p=%lu k=%ld l=%ld\n", p, k, l);
1528+                    printf ("b="); mpfr_print_binary (b); puts ("");
1529+                    printf ("c="); mpfr_print_binary (c); puts ("");
1530+                    printf ("Expected 2^%lu\n", p);
1531+                    printf ("Got      "); mpfr_print_binary (a); puts ("");
1532+                    exit (1);
1533+                  }
1534+                if (i >= 0)
1535+                  {
1536+                    printf ("Wrong ternary value in check_rounding\n");
1537+                    printf ("p=%lu k=%ld l=%ld\n", p, k, l);
1538+                    printf ("b="); mpfr_print_binary (b); puts ("");
1539+                    printf ("c="); mpfr_print_binary (c); puts ("");
1540+                    printf ("a="); mpfr_print_binary (a); puts ("");
1541+                    printf ("Expected < 0, got %d\n", i);
1542+                    exit (1);
1543+                  }
1544+              }
1545+            else /* l < k */
1546+              {
1547+                mpfr_set_ui_2exp (res, 1, p, MPFR_RNDN);
1548+                mpfr_add_ui (res, res, 2, MPFR_RNDN);
1549+                if (mpfr_cmp (a, res) != 0)
1550+                  {
1551+                    printf ("Wrong result in check_rounding\n");
1552+                    printf ("b="); mpfr_print_binary (b); puts ("");
1553+                    printf ("c="); mpfr_print_binary (c); puts ("");
1554+                    printf ("Expected "); mpfr_print_binary (res); puts ("");
1555+                    printf ("Got      "); mpfr_print_binary (a); puts ("");
1556+                    exit (1);
1557+                  }
1558+                if (i <= 0)
1559+                  {
1560+                    printf ("Wrong ternary value in check_rounding\n");
1561+                    printf ("b="); mpfr_print_binary (b); puts ("");
1562+                    printf ("c="); mpfr_print_binary (c); puts ("");
1563+                    printf ("Expected > 0, got %d\n", i);
1564+                    exit (1);
1565+                  }
1566+              }
1567+          }
1568+
1569+      mpfr_clear (a);
1570+      mpfr_clear (res);
1571+      mpfr_clear (b);
1572+      mpfr_clear (c);
1573+    }
1574+}
1575+
1576 #define TEST_FUNCTION test_sub
1577 #define TWO_ARGS
1578 #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
1579@@ -491,6 +643,8 @@
1580 
1581   tests_start_mpfr ();
1582 
1583+  bug20101017 ();
1584+  check_rounding ();
1585   check_diverse ();
1586   check_inexact ();
1587   bug_ddefour ();
1588diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
1589--- mpfr-3.0.0.orig/version.c   2010-10-21 20:28:38.000000000 +0000
1590+++ mpfr-3.0.0/version.c        2010-10-21 20:59:32.000000000 +0000
1591@@ -25,5 +25,5 @@
1592 const char *
1593 mpfr_get_version (void)
1594 {
1595-  return "3.0.0-p5";
1596+  return "3.0.0-p6";
1597 }
1598diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
1599--- mpfr-3.0.0.orig/PATCHES     2010-10-21 21:18:26.000000000 +0000
1600+++ mpfr-3.0.0/PATCHES  2010-10-21 21:18:26.000000000 +0000
1601@@ -0,0 +1 @@
1602+mpfr_set_ld
1603diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
1604--- mpfr-3.0.0.orig/VERSION     2010-10-21 20:59:32.000000000 +0000
1605+++ mpfr-3.0.0/VERSION  2010-10-21 21:18:26.000000000 +0000
1606@@ -1 +1 @@
1607-3.0.0-p6
1608+3.0.0-p7
1609diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
1610--- mpfr-3.0.0.orig/mpfr.h      2010-10-21 20:59:32.000000000 +0000
1611+++ mpfr-3.0.0/mpfr.h   2010-10-21 21:18:26.000000000 +0000
1612@@ -27,7 +27,7 @@
1613 #define MPFR_VERSION_MAJOR 3
1614 #define MPFR_VERSION_MINOR 0
1615 #define MPFR_VERSION_PATCHLEVEL 0
1616-#define MPFR_VERSION_STRING "3.0.0-p6"
1617+#define MPFR_VERSION_STRING "3.0.0-p7"
1618 
1619 /* Macros dealing with MPFR VERSION */
1620 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
1621diff -Naurd mpfr-3.0.0.orig/set_ld.c mpfr-3.0.0/set_ld.c
1622--- mpfr-3.0.0.orig/set_ld.c    2010-06-10 11:00:14.000000000 +0000
1623+++ mpfr-3.0.0/set_ld.c 2010-10-21 21:18:26.000000000 +0000
1624@@ -102,21 +102,25 @@
1625             {
1626               x /= div13; /* exact */
1627               shift_exp += 8192;
1628+              mpfr_div_2si (t, t, 8192, MPFR_RNDZ);
1629             }
1630           if (ABS (x) >= div12)
1631             {
1632               x /= div12; /* exact */
1633               shift_exp += 4096;
1634+              mpfr_div_2si (t, t, 4096, MPFR_RNDZ);
1635             }
1636           if (ABS (x) >= div11)
1637             {
1638               x /= div11; /* exact */
1639               shift_exp += 2048;
1640+              mpfr_div_2si (t, t, 2048, MPFR_RNDZ);
1641             }
1642           if (ABS (x) >= div10)
1643             {
1644               x /= div10; /* exact */
1645               shift_exp += 1024;
1646+              mpfr_div_2si (t, t, 1024, MPFR_RNDZ);
1647             }
1648           /* warning: we may have DBL_MAX=2^1024*(1-2^(-53)) < x < 2^1024,
1649              therefore we have one extra exponent reduction step */
1650@@ -124,9 +128,10 @@
1651             {
1652               x /= div9; /* exact */
1653               shift_exp += 512;
1654+              mpfr_div_2si (t, t, 512, MPFR_RNDZ);
1655             }
1656         } /* Check overflow of double */
1657-      else
1658+      else /* no overflow on double */
1659         {
1660           long double div9, div10, div11;
1661 
1662@@ -149,29 +154,34 @@
1663                 {
1664                   x /= div13; /* exact */
1665                   shift_exp -= 8192;
1666+                  mpfr_mul_2si (t, t, 8192, MPFR_RNDZ);
1667                 }
1668               if (ABS (x) <= div12)
1669                 {
1670                   x /= div12; /* exact */
1671                   shift_exp -= 4096;
1672+                  mpfr_mul_2si (t, t, 4096, MPFR_RNDZ);
1673                 }
1674               if (ABS (x) <= div11)
1675                 {
1676                   x /= div11; /* exact */
1677                   shift_exp -= 2048;
1678+                  mpfr_mul_2si (t, t, 2048, MPFR_RNDZ);
1679                 }
1680               if (ABS (x) <= div10)
1681                 {
1682                   x /= div10; /* exact */
1683                   shift_exp -= 1024;
1684+                  mpfr_mul_2si (t, t, 1024, MPFR_RNDZ);
1685                 }
1686               if (ABS(x) <= div9)
1687                 {
1688                   x /= div9;  /* exact */
1689                   shift_exp -= 512;
1690+                  mpfr_mul_2si (t, t, 512, MPFR_RNDZ);
1691                 }
1692             }
1693-          else
1694+          else /* no underflow */
1695             {
1696               inexact = mpfr_set_d (u, (double) x, MPFR_RNDZ);
1697               MPFR_ASSERTD (inexact == 0);
1698diff -Naurd mpfr-3.0.0.orig/tests/tset_ld.c mpfr-3.0.0/tests/tset_ld.c
1699--- mpfr-3.0.0.orig/tests/tset_ld.c     2010-06-10 11:00:13.000000000 +0000
1700+++ mpfr-3.0.0/tests/tset_ld.c  2010-10-21 21:18:26.000000000 +0000
1701@@ -147,12 +147,39 @@
1702 test_fixed_bugs (void)
1703 {
1704   mpfr_t x;
1705-  long double d;
1706+  long double l, m;
1707 
1708   /* bug found by Steve Kargl (2009-03-14) */
1709   mpfr_init2 (x, 64);
1710   mpfr_set_ui_2exp (x, 1, -16447, MPFR_RNDN);
1711-  d = mpfr_get_ld (x, MPFR_RNDN);  /* an assertion failed in init2.c:50 */
1712+  mpfr_get_ld (x, MPFR_RNDN);  /* an assertion failed in init2.c:50 */
1713+
1714+  /* bug reported by Jakub Jelinek (2010-10-17)
1715+     https://gforge.inria.fr/tracker/?func=detail&aid=11300 */
1716+  mpfr_set_prec (x, MPFR_LDBL_MANT_DIG);
1717+  /* l = 0x1.23456789abcdef0123456789abcdp-914L; */
1718+  l = 8.215640181713713164092636634579e-276;
1719+  mpfr_set_ld (x, l, MPFR_RNDN);
1720+  m = mpfr_get_ld (x, MPFR_RNDN);
1721+  if (m != l)
1722+    {
1723+      printf ("Error in get_ld o set_ld for l=%Le\n", l);
1724+      printf ("Got m=%Le instead of l\n", m);
1725+      exit (1);
1726+    }
1727+
1728+  /* another similar test which failed with extended double precision and the
1729+     generic code for mpfr_set_ld */
1730+  /* l = 0x1.23456789abcdef0123456789abcdp-968L; */
1731+  l = 4.560596445887084662336528403703e-292;
1732+  mpfr_set_ld (x, l, MPFR_RNDN);
1733+  m = mpfr_get_ld (x, MPFR_RNDN);
1734+  if (m != l)
1735+    {
1736+      printf ("Error in get_ld o set_ld for l=%Le\n", l);
1737+      printf ("Got m=%Le instead of l\n", m);
1738+      exit (1);
1739+    }
1740 
1741   mpfr_clear (x);
1742 }
1743diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
1744--- mpfr-3.0.0.orig/version.c   2010-10-21 20:59:32.000000000 +0000
1745+++ mpfr-3.0.0/version.c        2010-10-21 21:18:26.000000000 +0000
1746@@ -25,5 +25,5 @@
1747 const char *
1748 mpfr_get_version (void)
1749 {
1750-  return "3.0.0-p6";
1751+  return "3.0.0-p7";
1752 }
1753diff -Naurd mpfr-3.0.0.orig/PATCHES mpfr-3.0.0/PATCHES
1754--- mpfr-3.0.0.orig/PATCHES     2010-11-09 15:15:07.000000000 +0000
1755+++ mpfr-3.0.0/PATCHES  2010-11-09 15:15:07.000000000 +0000
1756@@ -0,0 +1 @@
1757+macros
1758diff -Naurd mpfr-3.0.0.orig/VERSION mpfr-3.0.0/VERSION
1759--- mpfr-3.0.0.orig/VERSION     2010-10-21 21:18:26.000000000 +0000
1760+++ mpfr-3.0.0/VERSION  2010-11-09 15:15:07.000000000 +0000
1761@@ -1 +1 @@
1762-3.0.0-p7
1763+3.0.0-p8
1764diff -Naurd mpfr-3.0.0.orig/mpfr.h mpfr-3.0.0/mpfr.h
1765--- mpfr-3.0.0.orig/mpfr.h      2010-10-21 21:18:26.000000000 +0000
1766+++ mpfr-3.0.0/mpfr.h   2010-11-09 15:15:07.000000000 +0000
1767@@ -27,7 +27,7 @@
1768 #define MPFR_VERSION_MAJOR 3
1769 #define MPFR_VERSION_MINOR 0
1770 #define MPFR_VERSION_PATCHLEVEL 0
1771-#define MPFR_VERSION_STRING "3.0.0-p7"
1772+#define MPFR_VERSION_STRING "3.0.0-p8"
1773 
1774 /* Macros dealing with MPFR VERSION */
1775 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
1776@@ -67,6 +67,16 @@
1777 # define _MPFR_H_HAVE_INTMAX_T 1
1778 #endif
1779 
1780+/* Avoid some problems with macro expansion if the user defines macros
1781+   with the same name as keywords. By convention, identifiers and macro
1782+   names starting with mpfr_ are reserved by MPFR. */
1783+typedef void            mpfr_void;
1784+typedef int             mpfr_int;
1785+typedef unsigned int    mpfr_uint;
1786+typedef long            mpfr_long;
1787+typedef unsigned long   mpfr_ulong;
1788+typedef size_t          mpfr_size_t;
1789+
1790 /* Definition of rounding modes (DON'T USE MPFR_RNDNA!).
1791    Warning! Changing the contents of this enum should be seen as an
1792    interface change since the old and the new types are not compatible
1793@@ -136,7 +146,7 @@
1794 typedef mp_exp_t     mpfr_exp_t;
1795 
1796 /* Definition of the standard exponent limits */
1797-#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((unsigned long) 1 << 30) - 1))
1798+#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((mpfr_ulong) 1 << 30) - 1))
1799 #define MPFR_EMIN_DEFAULT (-(MPFR_EMAX_DEFAULT))
1800 
1801 /* Definition of the main structure */
1802@@ -725,13 +735,13 @@
1803    unexpected results with future compilers and aggressive optimisations.
1804    Why not working only with signed types, using INT_MIN and LONG_MIN? */
1805 #if __GMP_MP_SIZE_T_INT
1806-#define __MPFR_EXP_NAN  ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+2))
1807-#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+1))
1808-#define __MPFR_EXP_INF  ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+3))
1809+#define __MPFR_EXP_NAN  ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+2))
1810+#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+1))
1811+#define __MPFR_EXP_INF  ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+3))
1812 #else
1813-#define __MPFR_EXP_NAN  ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+2))
1814-#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+1))
1815-#define __MPFR_EXP_INF  ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+3))
1816+#define __MPFR_EXP_NAN  ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+2))
1817+#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+1))
1818+#define __MPFR_EXP_INF  ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+3))
1819 #endif
1820 
1821 /* Define MPFR_USE_EXTENSION to avoid "gcc -pedantic" warnings. */
1822@@ -760,9 +770,9 @@
1823 #define mpfr_inf_p(_x)      ((_x)->_mpfr_exp == __MPFR_EXP_INF)
1824 #define mpfr_zero_p(_x)     ((_x)->_mpfr_exp == __MPFR_EXP_ZERO)
1825 #define mpfr_regular_p(_x)  ((_x)->_mpfr_exp >  __MPFR_EXP_INF)
1826-#define mpfr_sgn(_x)                                          \
1827-  ((_x)->_mpfr_exp < __MPFR_EXP_INF ?                         \
1828-   (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (void) 0), 0 : \
1829+#define mpfr_sgn(_x)                                               \
1830+  ((_x)->_mpfr_exp < __MPFR_EXP_INF ?                              \
1831+   (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (mpfr_void) 0), 0 : \
1832    MPFR_SIGN (_x))
1833 
1834 /* Prevent them from using as lvalues */
1835@@ -805,7 +815,19 @@
1836    Moreover casts to unsigned long have been added to avoid warnings in
1837    programs that use MPFR and are compiled with -Wconversion; such casts
1838    are OK since if X is a constant expression, then (unsigned long) X is
1839-   also a constant expression, so that the optimizations still work. */
1840+   also a constant expression, so that the optimizations still work. The
1841+   warnings are probably related to the following two bugs:
1842+     http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4210
1843+     http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38470 (possibly a variant)
1844+   and the casts could be removed once these bugs are fixed.
1845+   Casts shouldn't be used on the generic calls (to the ..._2exp functions),
1846+   where implicit conversions are performed. Indeed, having at least one
1847+   implicit conversion in the macro allows the compiler to emit diagnostics
1848+   when normally expected, for instance in the following call:
1849+     mpfr_set_ui (x, "foo", MPFR_RNDN);
1850+   If this is not possible (for future macros), one of the tricks described
1851+   on http://groups.google.com/group/comp.std.c/msg/e92abd24bf9eaf7b could
1852+   be used. */
1853 #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus)
1854 #if (__GNUC__ >= 2)
1855 #undef mpfr_cmp_ui
1856@@ -813,45 +835,45 @@
1857    But warning! mpfr_sgn is specified as a macro in the API, thus the macro
1858    mustn't be used if side effects are possible, like here. */
1859 #define mpfr_cmp_ui(_f,_u)                                      \
1860-  (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ?     \
1861+  (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ?        \
1862    (mpfr_sgn) (_f) :                                            \
1863-   mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0))
1864+   mpfr_cmp_ui_2exp ((_f), (_u), 0))
1865 #undef mpfr_cmp_si
1866-#define mpfr_cmp_si(_f,_s)                              \
1867-  (__builtin_constant_p (_s) && (long) (_s) >= 0 ?      \
1868-   mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) :    \
1869-   mpfr_cmp_si_2exp ((_f), (long) (_s), 0))
1870+#define mpfr_cmp_si(_f,_s)                                      \
1871+  (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ?         \
1872+   mpfr_cmp_ui ((_f), (mpfr_ulong) (mpfr_long) (_s)) :          \
1873+   mpfr_cmp_si_2exp ((_f), (_s), 0))
1874 #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95
1875 #undef mpfr_set_ui
1876 #define mpfr_set_ui(_f,_u,_r)                                   \
1877-  (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ?     \
1878+  (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ?        \
1879    __extension__ ({                                             \
1880        mpfr_ptr _p = (_f);                                      \
1881        _p->_mpfr_sign = 1;                                      \
1882        _p->_mpfr_exp = __MPFR_EXP_ZERO;                         \
1883-       (void) (_r); 0; }) :                                     \
1884-   mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r)))
1885+       (mpfr_void) (_r); 0; }) :                                \
1886+   mpfr_set_ui_2exp ((_f), (_u), 0, (_r)))
1887 #endif
1888 #undef mpfr_set_si
1889 #define mpfr_set_si(_f,_s,_r)                                   \
1890-  (__builtin_constant_p (_s) && (long) (_s) >= 0 ?              \
1891-   mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) :      \
1892-   mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r)))
1893+  (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ?         \
1894+   mpfr_set_ui ((_f), (mpfr_ulong) (mpfr_long) (_s), (_r)) :    \
1895+   mpfr_set_si_2exp ((_f), (_s), 0, (_r)))
1896 #endif
1897 #endif
1898 
1899 /* Macro version of mpfr_stack interface for fast access */
1900-#define mpfr_custom_get_size(p) ((size_t)                            \
1901+#define mpfr_custom_get_size(p) ((mpfr_size_t)                          \
1902        (((p)+GMP_NUMB_BITS-1)/GMP_NUMB_BITS*sizeof (mp_limb_t)))
1903 #define mpfr_custom_init(m,p) do {} while (0)
1904-#define mpfr_custom_get_significand(x) ((void*)((x)->_mpfr_d))
1905+#define mpfr_custom_get_significand(x) ((mpfr_void*)((x)->_mpfr_d))
1906 #define mpfr_custom_get_exp(x) ((x)->_mpfr_exp)
1907 #define mpfr_custom_move(x,m) do { ((x)->_mpfr_d = (mp_limb_t*)(m)); } while (0)
1908 #define mpfr_custom_init_set(x,k,e,p,m) do {                   \
1909   mpfr_ptr _x = (x);                                           \
1910   mpfr_exp_t _e;                                               \
1911   mpfr_kind_t _t;                                              \
1912-  int _s, _k;                                                  \
1913+  mpfr_int _s, _k;                                             \
1914   _k = (k);                                                    \
1915   if (_k >= 0)  {                                              \
1916     _t = (mpfr_kind_t) _k;                                     \
1917@@ -868,11 +890,13 @@
1918   _x->_mpfr_exp  = _e;                                         \
1919   _x->_mpfr_d    = (mp_limb_t*) (m);                           \
1920  } while (0)
1921-#define mpfr_custom_get_kind(x)                                              \
1922-  ( (x)->_mpfr_exp >  __MPFR_EXP_INF ? (int)MPFR_REGULAR_KIND*MPFR_SIGN (x) \
1923-  : (x)->_mpfr_exp == __MPFR_EXP_INF ? (int)MPFR_INF_KIND*MPFR_SIGN (x)     \
1924-  : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (int)MPFR_NAN_KIND                   \
1925-  : (int) MPFR_ZERO_KIND * MPFR_SIGN (x) )
1926+#define mpfr_custom_get_kind(x)                                         \
1927+  ( (x)->_mpfr_exp >  __MPFR_EXP_INF ?                                  \
1928+    (mpfr_int) MPFR_REGULAR_KIND * MPFR_SIGN (x)                        \
1929+  : (x)->_mpfr_exp == __MPFR_EXP_INF ?                                  \
1930+    (mpfr_int) MPFR_INF_KIND * MPFR_SIGN (x)                            \
1931+  : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (mpfr_int) MPFR_NAN_KIND         \
1932+  : (mpfr_int) MPFR_ZERO_KIND * MPFR_SIGN (x) )
1933 
1934 
1935 #endif /* MPFR_USE_NO_MACRO */
1936diff -Naurd mpfr-3.0.0.orig/version.c mpfr-3.0.0/version.c
1937--- mpfr-3.0.0.orig/version.c   2010-10-21 21:18:26.000000000 +0000
1938+++ mpfr-3.0.0/version.c        2010-11-09 15:15:07.000000000 +0000
1939@@ -25,5 +25,5 @@
1940 const char *
1941 mpfr_get_version (void)
1942 {
1943-  return "3.0.0-p7";
1944+  return "3.0.0-p8";
1945 }
1946
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.