wok rev 9750
mpfr: add upstream patches
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Wed May 11 00:48:49 2011 +0200 (2011-05-11) |
parents | cd5b5a4ce7a1 |
children | 37c3bd7f4b0b |
files | mpfr/receipt mpfr/stuff/mpfr-3.0.0-p8.patch mpfr/stuff/mpfr-3.0.0.patch mpfr/stuff/mpfr-3.0.1.patch |
line diff
1.1 --- a/mpfr/receipt Tue May 10 23:41:05 2011 +0200 1.2 +++ b/mpfr/receipt Wed May 11 00:48:49 2011 +0200 1.3 @@ -10,13 +10,13 @@ 1.4 WGET_URL="http://www.mpfr.org/mpfr-current/$TARBALL" 1.5 1.6 DEPENDS="gmp" 1.7 -BUILD_DEPENDS="$DEPENDS gmp-dev" 1.8 +BUILD_DEPENDS="gmp-dev" 1.9 1.10 # Rules to configure and make the package. 1.11 compile_rules() 1.12 { 1.13 cd $src 1.14 - patch -Np1 -i $stuff/$PACKAGE-$VERSION-$EXTRAVERSION.patch 1.15 + patch -Np1 -i $stuff/$PACKAGE-$VERSION.patch 1.16 ./configure && make && make install 1.17 } 1.18 1.19 @@ -26,4 +26,3 @@ 1.20 mkdir -p $fs/usr/lib 1.21 cp -a $_pkg/usr/lib/*.so* $fs/usr/lib 1.22 } 1.23 -
2.1 --- a/mpfr/stuff/mpfr-3.0.0-p8.patch Tue May 10 23:41:05 2011 +0200 2.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 2.3 @@ -1,1945 +0,0 @@ 2.4 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.5 ---- mpfr-3.0.0-a/PATCHES 2010-06-23 11:02:49.000000000 +0000 2.6 -+++ mpfr-3.0.0-b/PATCHES 2010-06-23 11:03:36.000000000 +0000 2.7 -@@ -0,0 +1 @@ 2.8 -+mpfr_out_str 2.9 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.10 ---- mpfr-3.0.0-a/VERSION 2010-06-10 11:00:14.000000000 +0000 2.11 -+++ mpfr-3.0.0-b/VERSION 2010-06-23 11:03:20.000000000 +0000 2.12 -@@ -1 +1 @@ 2.13 --3.0.0 2.14 -+3.0.0-p1 2.15 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.16 ---- mpfr-3.0.0-a/mpfr.h 2010-06-10 11:00:14.000000000 +0000 2.17 -+++ mpfr-3.0.0-b/mpfr.h 2010-06-23 11:03:20.000000000 +0000 2.18 -@@ -27,7 +27,7 @@ 2.19 - #define MPFR_VERSION_MAJOR 3 2.20 - #define MPFR_VERSION_MINOR 0 2.21 - #define MPFR_VERSION_PATCHLEVEL 0 2.22 --#define MPFR_VERSION_STRING "3.0.0" 2.23 -+#define MPFR_VERSION_STRING "3.0.0-p1" 2.24 - 2.25 - /* Macros dealing with MPFR VERSION */ 2.26 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.27 -diff -Naurd mpfr-3.0.0-a/mpfr.texi mpfr-3.0.0-b/mpfr.texi 2.28 ---- mpfr-3.0.0-a/mpfr.texi 2010-06-10 11:00:14.000000000 +0000 2.29 -+++ mpfr-3.0.0-b/mpfr.texi 2010-06-23 11:03:12.000000000 +0000 2.30 -@@ -2050,7 +2050,7 @@ 2.31 - are printed. If @var{base} is greater than 10, @samp{@@} will be used 2.32 - instead of @samp{e} as exponent delimiter. 2.33 - 2.34 --Return the number of bytes written, or if an error occurred, return 0. 2.35 -+Return the number of characters written, or if an error occurred, return 0. 2.36 - @end deftypefun 2.37 - 2.38 - @deftypefun size_t mpfr_inp_str (mpfr_t @var{rop}, FILE *@var{stream}, int @var{base}, mpfr_rnd_t @var{rnd}) 2.39 -diff -Naurd mpfr-3.0.0-a/out_str.c mpfr-3.0.0-b/out_str.c 2.40 ---- mpfr-3.0.0-a/out_str.c 2010-06-10 11:00:14.000000000 +0000 2.41 -+++ mpfr-3.0.0-b/out_str.c 2010-06-23 11:03:12.000000000 +0000 2.42 -@@ -22,6 +22,16 @@ 2.43 - 2.44 - #include "mpfr-impl.h" 2.45 - 2.46 -+/* Warning! S should not contain "%". */ 2.47 -+#define OUT_STR_RET(S) \ 2.48 -+ do \ 2.49 -+ { \ 2.50 -+ int r; \ 2.51 -+ r = fprintf (stream, (S)); \ 2.52 -+ return r < 0 ? 0 : r; \ 2.53 -+ } \ 2.54 -+ while (0) 2.55 -+ 2.56 - size_t 2.57 - mpfr_out_str (FILE *stream, int base, size_t n_digits, mpfr_srcptr op, 2.58 - mpfr_rnd_t rnd_mode) 2.59 -@@ -29,6 +39,7 @@ 2.60 - char *s, *s0; 2.61 - size_t l; 2.62 - mpfr_exp_t e; 2.63 -+ int err; 2.64 - 2.65 - MPFR_ASSERTN (base >= 2 && base <= 62); 2.66 - 2.67 -@@ -36,37 +47,16 @@ 2.68 - if (stream == NULL) 2.69 - stream = stdout; 2.70 - 2.71 -- if (MPFR_IS_NAN(op)) 2.72 -- { 2.73 -- fprintf (stream, "@NaN@"); 2.74 -- return 3; 2.75 -- } 2.76 -- 2.77 -- if (MPFR_IS_INF(op)) 2.78 -- { 2.79 -- if (MPFR_SIGN(op) > 0) 2.80 -- { 2.81 -- fprintf (stream, "@Inf@"); 2.82 -- return 3; 2.83 -- } 2.84 -- else 2.85 -- { 2.86 -- fprintf (stream, "-@Inf@"); 2.87 -- return 4; 2.88 -- } 2.89 -- } 2.90 -- 2.91 -- if (MPFR_IS_ZERO(op)) 2.92 -+ if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (op))) 2.93 - { 2.94 -- if (MPFR_SIGN(op) > 0) 2.95 -- { 2.96 -- fprintf(stream, "0"); 2.97 -- return 1; 2.98 -- } 2.99 -+ if (MPFR_IS_NAN (op)) 2.100 -+ OUT_STR_RET ("@NaN@"); 2.101 -+ else if (MPFR_IS_INF (op)) 2.102 -+ OUT_STR_RET (MPFR_IS_POS (op) ? "@Inf@" : "-@Inf@"); 2.103 - else 2.104 - { 2.105 -- fprintf(stream, "-0"); 2.106 -- return 2; 2.107 -+ MPFR_ASSERTD (MPFR_IS_ZERO (op)); 2.108 -+ OUT_STR_RET (MPFR_IS_POS (op) ? "0" : "-0"); 2.109 - } 2.110 - } 2.111 - 2.112 -@@ -77,21 +67,31 @@ 2.113 - 2.114 - l = strlen (s) + 1; /* size of allocated block returned by mpfr_get_str 2.115 - - may be incorrect, as only an upper bound? */ 2.116 -- if (*s == '-') 2.117 -- fputc (*s++, stream); 2.118 - 2.119 -- /* outputs mantissa */ 2.120 -- fputc (*s++, stream); e--; /* leading digit */ 2.121 -- fputc ((unsigned char) MPFR_DECIMAL_POINT, stream); 2.122 -- fputs (s, stream); /* rest of mantissa */ 2.123 -+ /* outputs possible sign and significand */ 2.124 -+ err = (*s == '-' && fputc (*s++, stream) == EOF) 2.125 -+ || fputc (*s++, stream) == EOF /* leading digit */ 2.126 -+ || fputc ((unsigned char) MPFR_DECIMAL_POINT, stream) == EOF 2.127 -+ || fputs (s, stream) == EOF; /* trailing significand */ 2.128 - (*__gmp_free_func) (s0, l); 2.129 -+ if (MPFR_UNLIKELY (err)) 2.130 -+ return 0; 2.131 -+ 2.132 -+ e--; /* due to the leading digit */ 2.133 - 2.134 - /* outputs exponent */ 2.135 - if (e) 2.136 - { 2.137 -+ int r; 2.138 -+ 2.139 - MPFR_ASSERTN(e >= LONG_MIN); 2.140 - MPFR_ASSERTN(e <= LONG_MAX); 2.141 -- l += fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e); 2.142 -+ 2.143 -+ r = fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e); 2.144 -+ if (MPFR_UNLIKELY (r < 0)) 2.145 -+ return 0; 2.146 -+ 2.147 -+ l += r; 2.148 - } 2.149 - 2.150 - return l; 2.151 -diff -Naurd mpfr-3.0.0-a/tests/tout_str.c mpfr-3.0.0-b/tests/tout_str.c 2.152 ---- mpfr-3.0.0-a/tests/tout_str.c 2010-06-10 11:00:13.000000000 +0000 2.153 -+++ mpfr-3.0.0-b/tests/tout_str.c 2010-06-23 11:03:12.000000000 +0000 2.154 -@@ -46,22 +46,54 @@ 2.155 - special (void) 2.156 - { 2.157 - mpfr_t x; 2.158 -+ unsigned int n; 2.159 - 2.160 - mpfr_init (x); 2.161 - 2.162 - mpfr_set_nan (x); 2.163 -- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.164 -+ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.165 -+ if (n != 5) 2.166 -+ { 2.167 -+ printf ("Error: mpfr_out_str (file, 10, 0, NaN, MPFR_RNDN) wrote %u " 2.168 -+ "characters instead of 5.\n", n); 2.169 -+ exit (1); 2.170 -+ } 2.171 - 2.172 - mpfr_set_inf (x, 1); 2.173 -- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.174 -+ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.175 -+ if (n != 5) 2.176 -+ { 2.177 -+ printf ("Error: mpfr_out_str (file, 10, 0, +Inf, MPFR_RNDN) wrote %u " 2.178 -+ "characters instead of 5.\n", n); 2.179 -+ exit (1); 2.180 -+ } 2.181 - 2.182 - mpfr_set_inf (x, -1); 2.183 -- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.184 -+ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.185 -+ if (n != 6) 2.186 -+ { 2.187 -+ printf ("Error: mpfr_out_str (file, 10, 0, -Inf, MPFR_RNDN) wrote %u " 2.188 -+ "characters instead of 6.\n", n); 2.189 -+ exit (1); 2.190 -+ } 2.191 - 2.192 - mpfr_set_ui (x, 0, MPFR_RNDN); 2.193 -- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.194 -+ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.195 -+ if (n != 1) 2.196 -+ { 2.197 -+ printf ("Error: mpfr_out_str (file, 10, 0, +0, MPFR_RNDN) wrote %u " 2.198 -+ "characters instead of 1.\n", n); 2.199 -+ exit (1); 2.200 -+ } 2.201 -+ 2.202 - mpfr_neg (x, x, MPFR_RNDN); 2.203 -- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.204 -+ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 2.205 -+ if (n != 2) 2.206 -+ { 2.207 -+ printf ("Error: mpfr_out_str (file, 10, 0, -0, MPFR_RNDN) wrote %u " 2.208 -+ "characters instead of 2.\n", n); 2.209 -+ exit (1); 2.210 -+ } 2.211 - 2.212 - mpfr_clear (x); 2.213 - } 2.214 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.215 ---- mpfr-3.0.0-a/version.c 2010-06-10 11:00:14.000000000 +0000 2.216 -+++ mpfr-3.0.0-b/version.c 2010-06-23 11:03:20.000000000 +0000 2.217 -@@ -25,5 +25,5 @@ 2.218 - const char * 2.219 - mpfr_get_version (void) 2.220 - { 2.221 -- return "3.0.0"; 2.222 -+ return "3.0.0-p1"; 2.223 - } 2.224 -diff -Naurd mpfr-3.0.0-a/Makefile.in mpfr-3.0.0-b/Makefile.in 2.225 ---- mpfr-3.0.0-a/Makefile.in 2010-06-10 11:00:52.000000000 +0000 2.226 -+++ mpfr-3.0.0-b/Makefile.in 2010-06-10 11:00:52.000000000 +0000 2.227 -@@ -239,6 +239,7 @@ 2.228 - distuninstallcheck_listfiles = find . -type f -print 2.229 - distcleancheck_listfiles = find . -type f -print 2.230 - ACLOCAL = @ACLOCAL@ 2.231 -+ALLOCA = @ALLOCA@ 2.232 - AMTAR = @AMTAR@ 2.233 - AR = @AR@ 2.234 - AS = @AS@ 2.235 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.236 ---- mpfr-3.0.0-a/PATCHES 2010-06-23 11:03:36.000000000 +0000 2.237 -+++ mpfr-3.0.0-b/PATCHES 2010-06-25 13:23:13.000000000 +0000 2.238 -@@ -0,0 +1 @@ 2.239 -+alloca 2.240 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.241 ---- mpfr-3.0.0-a/VERSION 2010-06-23 11:03:20.000000000 +0000 2.242 -+++ mpfr-3.0.0-b/VERSION 2010-06-25 13:23:13.000000000 +0000 2.243 -@@ -1 +1 @@ 2.244 --3.0.0-p1 2.245 -+3.0.0-p2 2.246 -diff -Naurd mpfr-3.0.0-a/acinclude.m4 mpfr-3.0.0-b/acinclude.m4 2.247 ---- mpfr-3.0.0-a/acinclude.m4 2010-06-10 11:00:14.000000000 +0000 2.248 -+++ mpfr-3.0.0-b/acinclude.m4 2010-06-10 11:00:14.000000000 +0000 2.249 -@@ -59,6 +59,9 @@ 2.250 - dnl sys/fpu.h - MIPS specific 2.251 - AC_CHECK_HEADERS([sys/time.h sys/fpu.h]) 2.252 - 2.253 -+dnl Check how to get `alloca' 2.254 -+AC_FUNC_ALLOCA 2.255 -+ 2.256 - dnl SIZE_MAX macro 2.257 - gl_SIZE_MAX 2.258 - 2.259 -diff -Naurd mpfr-3.0.0-a/configure mpfr-3.0.0-b/configure 2.260 ---- mpfr-3.0.0-a/configure 2010-06-10 11:00:51.000000000 +0000 2.261 -+++ mpfr-3.0.0-b/configure 2010-06-25 13:23:05.000000000 +0000 2.262 -@@ -783,6 +783,7 @@ 2.263 - OBJDUMP 2.264 - DLLTOOL 2.265 - AS 2.266 -+ALLOCA 2.267 - MPFR_LIBM 2.268 - ANSI2KNR 2.269 - U 2.270 -@@ -5622,6 +5623,197 @@ 2.271 - done 2.272 - 2.273 - 2.274 -+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works 2.275 -+# for constant arguments. Useless! 2.276 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 2.277 -+$as_echo_n "checking for working alloca.h... " >&6; } 2.278 -+if test "${ac_cv_working_alloca_h+set}" = set; then : 2.279 -+ $as_echo_n "(cached) " >&6 2.280 -+else 2.281 -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 2.282 -+/* end confdefs.h. */ 2.283 -+#include <alloca.h> 2.284 -+int 2.285 -+main () 2.286 -+{ 2.287 -+char *p = (char *) alloca (2 * sizeof (int)); 2.288 -+ if (p) return 0; 2.289 -+ ; 2.290 -+ return 0; 2.291 -+} 2.292 -+_ACEOF 2.293 -+if ac_fn_c_try_link "$LINENO"; then : 2.294 -+ ac_cv_working_alloca_h=yes 2.295 -+else 2.296 -+ ac_cv_working_alloca_h=no 2.297 -+fi 2.298 -+rm -f core conftest.err conftest.$ac_objext \ 2.299 -+ conftest$ac_exeext conftest.$ac_ext 2.300 -+fi 2.301 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 2.302 -+$as_echo "$ac_cv_working_alloca_h" >&6; } 2.303 -+if test $ac_cv_working_alloca_h = yes; then 2.304 -+ 2.305 -+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h 2.306 -+ 2.307 -+fi 2.308 -+ 2.309 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 2.310 -+$as_echo_n "checking for alloca... " >&6; } 2.311 -+if test "${ac_cv_func_alloca_works+set}" = set; then : 2.312 -+ $as_echo_n "(cached) " >&6 2.313 -+else 2.314 -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 2.315 -+/* end confdefs.h. */ 2.316 -+#ifdef __GNUC__ 2.317 -+# define alloca __builtin_alloca 2.318 -+#else 2.319 -+# ifdef _MSC_VER 2.320 -+# include <malloc.h> 2.321 -+# define alloca _alloca 2.322 -+# else 2.323 -+# ifdef HAVE_ALLOCA_H 2.324 -+# include <alloca.h> 2.325 -+# else 2.326 -+# ifdef _AIX 2.327 -+ #pragma alloca 2.328 -+# else 2.329 -+# ifndef alloca /* predefined by HP cc +Olibcalls */ 2.330 -+char *alloca (); 2.331 -+# endif 2.332 -+# endif 2.333 -+# endif 2.334 -+# endif 2.335 -+#endif 2.336 -+ 2.337 -+int 2.338 -+main () 2.339 -+{ 2.340 -+char *p = (char *) alloca (1); 2.341 -+ if (p) return 0; 2.342 -+ ; 2.343 -+ return 0; 2.344 -+} 2.345 -+_ACEOF 2.346 -+if ac_fn_c_try_link "$LINENO"; then : 2.347 -+ ac_cv_func_alloca_works=yes 2.348 -+else 2.349 -+ ac_cv_func_alloca_works=no 2.350 -+fi 2.351 -+rm -f core conftest.err conftest.$ac_objext \ 2.352 -+ conftest$ac_exeext conftest.$ac_ext 2.353 -+fi 2.354 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 2.355 -+$as_echo "$ac_cv_func_alloca_works" >&6; } 2.356 -+ 2.357 -+if test $ac_cv_func_alloca_works = yes; then 2.358 -+ 2.359 -+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h 2.360 -+ 2.361 -+else 2.362 -+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions 2.363 -+# that cause trouble. Some versions do not even contain alloca or 2.364 -+# contain a buggy version. If you still want to use their alloca, 2.365 -+# use ar to extract alloca.o from them instead of compiling alloca.c. 2.366 -+ 2.367 -+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext 2.368 -+ 2.369 -+$as_echo "#define C_ALLOCA 1" >>confdefs.h 2.370 -+ 2.371 -+ 2.372 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 2.373 -+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } 2.374 -+if test "${ac_cv_os_cray+set}" = set; then : 2.375 -+ $as_echo_n "(cached) " >&6 2.376 -+else 2.377 -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 2.378 -+/* end confdefs.h. */ 2.379 -+#if defined CRAY && ! defined CRAY2 2.380 -+webecray 2.381 -+#else 2.382 -+wenotbecray 2.383 -+#endif 2.384 -+ 2.385 -+_ACEOF 2.386 -+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | 2.387 -+ $EGREP "webecray" >/dev/null 2>&1; then : 2.388 -+ ac_cv_os_cray=yes 2.389 -+else 2.390 -+ ac_cv_os_cray=no 2.391 -+fi 2.392 -+rm -f conftest* 2.393 -+ 2.394 -+fi 2.395 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 2.396 -+$as_echo "$ac_cv_os_cray" >&6; } 2.397 -+if test $ac_cv_os_cray = yes; then 2.398 -+ for ac_func in _getb67 GETB67 getb67; do 2.399 -+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` 2.400 -+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" 2.401 -+eval as_val=\$$as_ac_var 2.402 -+ if test "x$as_val" = x""yes; then : 2.403 -+ 2.404 -+cat >>confdefs.h <<_ACEOF 2.405 -+#define CRAY_STACKSEG_END $ac_func 2.406 -+_ACEOF 2.407 -+ 2.408 -+ break 2.409 -+fi 2.410 -+ 2.411 -+ done 2.412 -+fi 2.413 -+ 2.414 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 2.415 -+$as_echo_n "checking stack direction for C alloca... " >&6; } 2.416 -+if test "${ac_cv_c_stack_direction+set}" = set; then : 2.417 -+ $as_echo_n "(cached) " >&6 2.418 -+else 2.419 -+ if test "$cross_compiling" = yes; then : 2.420 -+ ac_cv_c_stack_direction=0 2.421 -+else 2.422 -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 2.423 -+/* end confdefs.h. */ 2.424 -+$ac_includes_default 2.425 -+int 2.426 -+find_stack_direction () 2.427 -+{ 2.428 -+ static char *addr = 0; 2.429 -+ auto char dummy; 2.430 -+ if (addr == 0) 2.431 -+ { 2.432 -+ addr = &dummy; 2.433 -+ return find_stack_direction (); 2.434 -+ } 2.435 -+ else 2.436 -+ return (&dummy > addr) ? 1 : -1; 2.437 -+} 2.438 -+ 2.439 -+int 2.440 -+main () 2.441 -+{ 2.442 -+ return find_stack_direction () < 0; 2.443 -+} 2.444 -+_ACEOF 2.445 -+if ac_fn_c_try_run "$LINENO"; then : 2.446 -+ ac_cv_c_stack_direction=1 2.447 -+else 2.448 -+ ac_cv_c_stack_direction=-1 2.449 -+fi 2.450 -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ 2.451 -+ conftest.$ac_objext conftest.beam conftest.$ac_ext 2.452 -+fi 2.453 -+ 2.454 -+fi 2.455 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 2.456 -+$as_echo "$ac_cv_c_stack_direction" >&6; } 2.457 -+cat >>confdefs.h <<_ACEOF 2.458 -+#define STACK_DIRECTION $ac_cv_c_stack_direction 2.459 -+_ACEOF 2.460 -+ 2.461 -+ 2.462 -+fi 2.463 -+ 2.464 -+ 2.465 - 2.466 - for ac_header in stdint.h 2.467 - do : 2.468 -@@ -7564,13 +7756,13 @@ 2.469 - else 2.470 - lt_cv_nm_interface="BSD nm" 2.471 - echo "int some_variable = 0;" > conftest.$ac_ext 2.472 -- (eval echo "\"\$as_me:7567: $ac_compile\"" >&5) 2.473 -+ (eval echo "\"\$as_me:7759: $ac_compile\"" >&5) 2.474 - (eval "$ac_compile" 2>conftest.err) 2.475 - cat conftest.err >&5 2.476 -- (eval echo "\"\$as_me:7570: $NM \\\"conftest.$ac_objext\\\"\"" >&5) 2.477 -+ (eval echo "\"\$as_me:7762: $NM \\\"conftest.$ac_objext\\\"\"" >&5) 2.478 - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) 2.479 - cat conftest.err >&5 2.480 -- (eval echo "\"\$as_me:7573: output\"" >&5) 2.481 -+ (eval echo "\"\$as_me:7765: output\"" >&5) 2.482 - cat conftest.out >&5 2.483 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then 2.484 - lt_cv_nm_interface="MS dumpbin" 2.485 -@@ -8772,7 +8964,7 @@ 2.486 - ;; 2.487 - *-*-irix6*) 2.488 - # Find out which ABI we are using. 2.489 -- echo '#line 8775 "configure"' > conftest.$ac_ext 2.490 -+ echo '#line 8967 "configure"' > conftest.$ac_ext 2.491 - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 2.492 - (eval $ac_compile) 2>&5 2.493 - ac_status=$? 2.494 -@@ -10032,11 +10224,11 @@ 2.495 - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 2.496 - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 2.497 - -e 's:$: $lt_compiler_flag:'` 2.498 -- (eval echo "\"\$as_me:10035: $lt_compile\"" >&5) 2.499 -+ (eval echo "\"\$as_me:10227: $lt_compile\"" >&5) 2.500 - (eval "$lt_compile" 2>conftest.err) 2.501 - ac_status=$? 2.502 - cat conftest.err >&5 2.503 -- echo "$as_me:10039: \$? = $ac_status" >&5 2.504 -+ echo "$as_me:10231: \$? = $ac_status" >&5 2.505 - if (exit $ac_status) && test -s "$ac_outfile"; then 2.506 - # The compiler can only warn and ignore the option if not recognized 2.507 - # So say no if there are warnings other than the usual output. 2.508 -@@ -10371,11 +10563,11 @@ 2.509 - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 2.510 - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 2.511 - -e 's:$: $lt_compiler_flag:'` 2.512 -- (eval echo "\"\$as_me:10374: $lt_compile\"" >&5) 2.513 -+ (eval echo "\"\$as_me:10566: $lt_compile\"" >&5) 2.514 - (eval "$lt_compile" 2>conftest.err) 2.515 - ac_status=$? 2.516 - cat conftest.err >&5 2.517 -- echo "$as_me:10378: \$? = $ac_status" >&5 2.518 -+ echo "$as_me:10570: \$? = $ac_status" >&5 2.519 - if (exit $ac_status) && test -s "$ac_outfile"; then 2.520 - # The compiler can only warn and ignore the option if not recognized 2.521 - # So say no if there are warnings other than the usual output. 2.522 -@@ -10476,11 +10668,11 @@ 2.523 - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 2.524 - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 2.525 - -e 's:$: $lt_compiler_flag:'` 2.526 -- (eval echo "\"\$as_me:10479: $lt_compile\"" >&5) 2.527 -+ (eval echo "\"\$as_me:10671: $lt_compile\"" >&5) 2.528 - (eval "$lt_compile" 2>out/conftest.err) 2.529 - ac_status=$? 2.530 - cat out/conftest.err >&5 2.531 -- echo "$as_me:10483: \$? = $ac_status" >&5 2.532 -+ echo "$as_me:10675: \$? = $ac_status" >&5 2.533 - if (exit $ac_status) && test -s out/conftest2.$ac_objext 2.534 - then 2.535 - # The compiler can only warn and ignore the option if not recognized 2.536 -@@ -10531,11 +10723,11 @@ 2.537 - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 2.538 - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 2.539 - -e 's:$: $lt_compiler_flag:'` 2.540 -- (eval echo "\"\$as_me:10534: $lt_compile\"" >&5) 2.541 -+ (eval echo "\"\$as_me:10726: $lt_compile\"" >&5) 2.542 - (eval "$lt_compile" 2>out/conftest.err) 2.543 - ac_status=$? 2.544 - cat out/conftest.err >&5 2.545 -- echo "$as_me:10538: \$? = $ac_status" >&5 2.546 -+ echo "$as_me:10730: \$? = $ac_status" >&5 2.547 - if (exit $ac_status) && test -s out/conftest2.$ac_objext 2.548 - then 2.549 - # The compiler can only warn and ignore the option if not recognized 2.550 -@@ -12915,7 +13107,7 @@ 2.551 - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 2.552 - lt_status=$lt_dlunknown 2.553 - cat > conftest.$ac_ext <<_LT_EOF 2.554 --#line 12918 "configure" 2.555 -+#line 13110 "configure" 2.556 - #include "confdefs.h" 2.557 - 2.558 - #if HAVE_DLFCN_H 2.559 -@@ -13011,7 +13203,7 @@ 2.560 - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 2.561 - lt_status=$lt_dlunknown 2.562 - cat > conftest.$ac_ext <<_LT_EOF 2.563 --#line 13014 "configure" 2.564 -+#line 13206 "configure" 2.565 - #include "confdefs.h" 2.566 - 2.567 - #if HAVE_DLFCN_H 2.568 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.569 ---- mpfr-3.0.0-a/mpfr.h 2010-06-23 11:03:20.000000000 +0000 2.570 -+++ mpfr-3.0.0-b/mpfr.h 2010-06-25 13:23:13.000000000 +0000 2.571 -@@ -27,7 +27,7 @@ 2.572 - #define MPFR_VERSION_MAJOR 3 2.573 - #define MPFR_VERSION_MINOR 0 2.574 - #define MPFR_VERSION_PATCHLEVEL 0 2.575 --#define MPFR_VERSION_STRING "3.0.0-p1" 2.576 -+#define MPFR_VERSION_STRING "3.0.0-p2" 2.577 - 2.578 - /* Macros dealing with MPFR VERSION */ 2.579 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.580 -diff -Naurd mpfr-3.0.0-a/tests/Makefile.in mpfr-3.0.0-b/tests/Makefile.in 2.581 ---- mpfr-3.0.0-a/tests/Makefile.in 2010-06-10 11:00:52.000000000 +0000 2.582 -+++ mpfr-3.0.0-b/tests/Makefile.in 2010-06-10 11:00:52.000000000 +0000 2.583 -@@ -960,6 +960,7 @@ 2.584 - red=; grn=; lgn=; blu=; std= 2.585 - DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 2.586 - ACLOCAL = @ACLOCAL@ 2.587 -+ALLOCA = @ALLOCA@ 2.588 - AMTAR = @AMTAR@ 2.589 - AR = @AR@ 2.590 - AS = @AS@ 2.591 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.592 ---- mpfr-3.0.0-a/version.c 2010-06-23 11:03:20.000000000 +0000 2.593 -+++ mpfr-3.0.0-b/version.c 2010-06-25 13:23:13.000000000 +0000 2.594 -@@ -25,5 +25,5 @@ 2.595 - const char * 2.596 - mpfr_get_version (void) 2.597 - { 2.598 -- return "3.0.0-p1"; 2.599 -+ return "3.0.0-p2"; 2.600 - } 2.601 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.602 ---- mpfr-3.0.0-a/PATCHES 2010-07-10 00:11:19.000000000 +0000 2.603 -+++ mpfr-3.0.0-b/PATCHES 2010-07-10 00:12:50.000000000 +0000 2.604 -@@ -0,0 +1 @@ 2.605 -+gamma_underflow 2.606 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.607 ---- mpfr-3.0.0-a/VERSION 2010-06-25 13:23:13.000000000 +0000 2.608 -+++ mpfr-3.0.0-b/VERSION 2010-07-10 00:11:53.000000000 +0000 2.609 -@@ -1 +1 @@ 2.610 --3.0.0-p2 2.611 -+3.0.0-p3 2.612 -diff -Naurd mpfr-3.0.0-a/gamma.c mpfr-3.0.0-b/gamma.c 2.613 ---- mpfr-3.0.0-a/gamma.c 2010-06-10 11:00:14.000000000 +0000 2.614 -+++ mpfr-3.0.0-b/gamma.c 2010-07-10 00:11:46.000000000 +0000 2.615 -@@ -274,7 +274,7 @@ 2.616 - /* we want an upper bound for x * [log(2-x)-1]. 2.617 - since x < 0, we need a lower bound on log(2-x) */ 2.618 - mpfr_ui_sub (xp, 2, x, MPFR_RNDD); 2.619 -- mpfr_log (xp, xp, MPFR_RNDD); 2.620 -+ mpfr_log2 (xp, xp, MPFR_RNDD); 2.621 - mpfr_sub_ui (xp, xp, 1, MPFR_RNDD); 2.622 - mpfr_mul (xp, xp, x, MPFR_RNDU); 2.623 - 2.624 -@@ -303,8 +303,8 @@ 2.625 - { 2.626 - mpfr_sub (tmp, tmp, tmp2, MPFR_RNDZ); /* low bnd on |sin(Pi*(2-x))| */ 2.627 - mpfr_ui_div (tmp, 12, tmp, MPFR_RNDU); /* upper bound */ 2.628 -- mpfr_log (tmp, tmp, MPFR_RNDU); 2.629 -- mpfr_add (tmp, tmp, xp, MPFR_RNDU); 2.630 -+ mpfr_log2 (tmp, tmp, MPFR_RNDU); 2.631 -+ mpfr_add (xp, tmp, xp, MPFR_RNDU); 2.632 - underflow = mpfr_cmp_si (xp, expo.saved_emin - 2) <= 0; 2.633 - } 2.634 - 2.635 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.636 ---- mpfr-3.0.0-a/mpfr.h 2010-06-25 13:23:13.000000000 +0000 2.637 -+++ mpfr-3.0.0-b/mpfr.h 2010-07-10 00:11:53.000000000 +0000 2.638 -@@ -27,7 +27,7 @@ 2.639 - #define MPFR_VERSION_MAJOR 3 2.640 - #define MPFR_VERSION_MINOR 0 2.641 - #define MPFR_VERSION_PATCHLEVEL 0 2.642 --#define MPFR_VERSION_STRING "3.0.0-p2" 2.643 -+#define MPFR_VERSION_STRING "3.0.0-p3" 2.644 - 2.645 - /* Macros dealing with MPFR VERSION */ 2.646 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.647 -diff -Naurd mpfr-3.0.0-a/tests/tgamma.c mpfr-3.0.0-b/tests/tgamma.c 2.648 ---- mpfr-3.0.0-a/tests/tgamma.c 2010-06-10 11:00:13.000000000 +0000 2.649 -+++ mpfr-3.0.0-b/tests/tgamma.c 2010-07-10 00:11:46.000000000 +0000 2.650 -@@ -461,6 +461,20 @@ 2.651 - mpfr_clear (x); 2.652 - } 2.653 - 2.654 -+/* bug found by Stathis, only occurs on 32-bit machines */ 2.655 -+static void 2.656 -+test20100709 (void) 2.657 -+{ 2.658 -+ mpfr_t x; 2.659 -+ int inex; 2.660 -+ 2.661 -+ mpfr_init2 (x, 100); 2.662 -+ mpfr_set_str (x, "-4.6308260837372266e+07", 10, MPFR_RNDN); 2.663 -+ inex = mpfr_gamma (x, x, MPFR_RNDN); 2.664 -+ MPFR_ASSERTN(MPFR_IS_ZERO(x) && MPFR_IS_NEG(x) && inex > 0); 2.665 -+ mpfr_clear (x); 2.666 -+} 2.667 -+ 2.668 - int 2.669 - main (int argc, char *argv[]) 2.670 - { 2.671 -@@ -471,6 +485,7 @@ 2.672 - test_generic (2, 100, 2); 2.673 - gamma_integer (); 2.674 - test20071231 (); 2.675 -+ test20100709 (); 2.676 - 2.677 - data_check ("data/gamma", mpfr_gamma, "mpfr_gamma"); 2.678 - 2.679 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.680 ---- mpfr-3.0.0-a/version.c 2010-06-25 13:23:13.000000000 +0000 2.681 -+++ mpfr-3.0.0-b/version.c 2010-07-10 00:11:53.000000000 +0000 2.682 -@@ -25,5 +25,5 @@ 2.683 - const char * 2.684 - mpfr_get_version (void) 2.685 - { 2.686 -- return "3.0.0-p2"; 2.687 -+ return "3.0.0-p3"; 2.688 - } 2.689 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.690 ---- mpfr-3.0.0-a/PATCHES 2010-09-07 08:44:01.000000000 +0000 2.691 -+++ mpfr-3.0.0-b/PATCHES 2010-09-07 08:48:46.000000000 +0000 2.692 -@@ -0,0 +1 @@ 2.693 -+mpfr_cmp/set_ui/si 2.694 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.695 ---- mpfr-3.0.0-a/VERSION 2010-07-10 00:11:53.000000000 +0000 2.696 -+++ mpfr-3.0.0-b/VERSION 2010-09-07 08:46:06.000000000 +0000 2.697 -@@ -1 +1 @@ 2.698 --3.0.0-p3 2.699 -+3.0.0-p4 2.700 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.701 ---- mpfr-3.0.0-a/mpfr.h 2010-07-10 00:11:53.000000000 +0000 2.702 -+++ mpfr-3.0.0-b/mpfr.h 2010-09-07 08:46:06.000000000 +0000 2.703 -@@ -27,7 +27,7 @@ 2.704 - #define MPFR_VERSION_MAJOR 3 2.705 - #define MPFR_VERSION_MINOR 0 2.706 - #define MPFR_VERSION_PATCHLEVEL 0 2.707 --#define MPFR_VERSION_STRING "3.0.0-p3" 2.708 -+#define MPFR_VERSION_STRING "3.0.0-p4" 2.709 - 2.710 - /* Macros dealing with MPFR VERSION */ 2.711 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.712 -@@ -798,35 +798,45 @@ 2.713 - anyway. Checking with other ICC versions is needed. Possibly detect 2.714 - whether warnings are produced or not with a configure test. 2.715 - + Remove C++ too, since it complains too much. */ 2.716 -+/* Added casts to improve robustness in case of undefined behavior and 2.717 -+ compiler extensions based on UB (in particular -fwrapv). MPFR doesn't 2.718 -+ use such extensions, but these macros will be used by 3rd-party code, 2.719 -+ where such extensions may be required. 2.720 -+ Moreover casts to unsigned long have been added to avoid warnings in 2.721 -+ programs that use MPFR and are compiled with -Wconversion; such casts 2.722 -+ are OK since if X is a constant expression, then (unsigned long) X is 2.723 -+ also a constant expression, so that the optimizations still work. */ 2.724 - #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus) 2.725 - #if (__GNUC__ >= 2) 2.726 - #undef mpfr_cmp_ui 2.727 --/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. */ 2.728 --#define mpfr_cmp_ui(_f,_u) \ 2.729 -- (__builtin_constant_p (_u) && (_u) == 0 ? \ 2.730 -- mpfr_sgn (_f) : \ 2.731 -- mpfr_cmp_ui_2exp ((_f),(_u),0)) 2.732 -+/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. 2.733 -+ But warning! mpfr_sgn is specified as a macro in the API, thus the macro 2.734 -+ mustn't be used if side effects are possible, like here. */ 2.735 -+#define mpfr_cmp_ui(_f,_u) \ 2.736 -+ (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 2.737 -+ (mpfr_sgn) (_f) : \ 2.738 -+ mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0)) 2.739 - #undef mpfr_cmp_si 2.740 --#define mpfr_cmp_si(_f,_s) \ 2.741 -- (__builtin_constant_p (_s) && (_s) >= 0 ? \ 2.742 -- mpfr_cmp_ui ((_f), (_s)) : \ 2.743 -- mpfr_cmp_si_2exp ((_f), (_s), 0)) 2.744 -+#define mpfr_cmp_si(_f,_s) \ 2.745 -+ (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 2.746 -+ mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) : \ 2.747 -+ mpfr_cmp_si_2exp ((_f), (long) (_s), 0)) 2.748 - #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 2.749 - #undef mpfr_set_ui 2.750 --#define mpfr_set_ui(_f,_u,_r) \ 2.751 -- (__builtin_constant_p (_u) && (_u) == 0 ? \ 2.752 -- __extension__ ({ \ 2.753 -- mpfr_ptr _p = (_f); \ 2.754 -- _p->_mpfr_sign = 1; \ 2.755 -- _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 2.756 -- (void) (_r); 0; }) : \ 2.757 -- mpfr_set_ui_2exp ((_f), (_u), 0, (_r))) 2.758 -+#define mpfr_set_ui(_f,_u,_r) \ 2.759 -+ (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 2.760 -+ __extension__ ({ \ 2.761 -+ mpfr_ptr _p = (_f); \ 2.762 -+ _p->_mpfr_sign = 1; \ 2.763 -+ _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 2.764 -+ (void) (_r); 0; }) : \ 2.765 -+ mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r))) 2.766 - #endif 2.767 - #undef mpfr_set_si 2.768 --#define mpfr_set_si(_f,_s,_r) \ 2.769 -- (__builtin_constant_p (_s) && (_s) >= 0 ? \ 2.770 -- mpfr_set_ui ((_f), (_s), (_r)) : \ 2.771 -- mpfr_set_si_2exp ((_f), (_s), 0, (_r))) 2.772 -+#define mpfr_set_si(_f,_s,_r) \ 2.773 -+ (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 2.774 -+ mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) : \ 2.775 -+ mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r))) 2.776 - #endif 2.777 - #endif 2.778 - 2.779 -diff -Naurd mpfr-3.0.0-a/tests/tcmp_ui.c mpfr-3.0.0-b/tests/tcmp_ui.c 2.780 ---- mpfr-3.0.0-a/tests/tcmp_ui.c 2010-06-10 11:00:13.000000000 +0000 2.781 -+++ mpfr-3.0.0-b/tests/tcmp_ui.c 2010-09-07 08:45:12.000000000 +0000 2.782 -@@ -88,6 +88,126 @@ 2.783 - mpfr_clear (x); 2.784 - } 2.785 - 2.786 -+/* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro 2.787 -+ with __builtin_constant_p for GCC, check that side effects are 2.788 -+ handled correctly. */ 2.789 -+static void 2.790 -+check_macros (void) 2.791 -+{ 2.792 -+ mpfr_t x; 2.793 -+ int c; 2.794 -+ 2.795 -+ mpfr_init2 (x, 32); 2.796 -+ 2.797 -+ c = 0; 2.798 -+ mpfr_set_ui (x, 17, MPFR_RNDN); 2.799 -+ if (mpfr_cmp_ui (x, 17) != 0) 2.800 -+ { 2.801 -+ printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n"); 2.802 -+ exit (1); 2.803 -+ } 2.804 -+ if (mpfr_cmp_ui (x, (c++, 17)) != 0) 2.805 -+ { 2.806 -+ printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n"); 2.807 -+ exit (1); 2.808 -+ } 2.809 -+ if (c != 1) 2.810 -+ { 2.811 -+ printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n" 2.812 -+ "(c = %d instead of 1)\n", c); 2.813 -+ exit (1); 2.814 -+ } 2.815 -+ if (mpfr_cmp_si (x, 17) != 0) 2.816 -+ { 2.817 -+ printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n"); 2.818 -+ exit (1); 2.819 -+ } 2.820 -+ if (mpfr_cmp_si (x, (c++, 17)) != 0) 2.821 -+ { 2.822 -+ printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n"); 2.823 -+ exit (1); 2.824 -+ } 2.825 -+ if (c != 2) 2.826 -+ { 2.827 -+ printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n" 2.828 -+ "(c = %d instead of 2)\n", c); 2.829 -+ exit (1); 2.830 -+ } 2.831 -+ 2.832 -+ c = 0; 2.833 -+ mpfr_set_ui (x, 0, MPFR_RNDN); 2.834 -+ if (mpfr_cmp_ui (x, 0) != 0) 2.835 -+ { 2.836 -+ printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n"); 2.837 -+ exit (1); 2.838 -+ } 2.839 -+ if (mpfr_cmp_ui (x, (c++, 0)) != 0) 2.840 -+ { 2.841 -+ printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n"); 2.842 -+ exit (1); 2.843 -+ } 2.844 -+ if (c != 1) 2.845 -+ { 2.846 -+ printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n" 2.847 -+ "(c = %d instead of 1)\n", c); 2.848 -+ exit (1); 2.849 -+ } 2.850 -+ if (mpfr_cmp_si (x, 0) != 0) 2.851 -+ { 2.852 -+ printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n"); 2.853 -+ exit (1); 2.854 -+ } 2.855 -+ if (mpfr_cmp_si (x, (c++, 0)) != 0) 2.856 -+ { 2.857 -+ printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n"); 2.858 -+ exit (1); 2.859 -+ } 2.860 -+ if (c != 2) 2.861 -+ { 2.862 -+ printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n" 2.863 -+ "(c = %d instead of 2)\n", c); 2.864 -+ exit (1); 2.865 -+ } 2.866 -+ 2.867 -+ mpfr_clear (x); 2.868 -+} 2.869 -+ 2.870 -+/* Bug in r7114 */ 2.871 -+static void 2.872 -+test_macros (void) 2.873 -+{ 2.874 -+ mpfr_t x[3]; 2.875 -+ mpfr_ptr p; 2.876 -+ 2.877 -+ mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0); 2.878 -+ mpfr_set_ui (x[0], 0, MPFR_RNDN); 2.879 -+ p = x[0]; 2.880 -+ if (mpfr_cmp_ui (p++, 0) != 0) 2.881 -+ { 2.882 -+ printf ("Error in mpfr_cmp_ui macro: result should be 0.\n"); 2.883 -+ exit (1); 2.884 -+ } 2.885 -+ if (p != x[1]) 2.886 -+ { 2.887 -+ printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n", 2.888 -+ (int) (p - x[0])); 2.889 -+ exit (1); 2.890 -+ } 2.891 -+ p = x[0]; 2.892 -+ if (mpfr_cmp_si (p++, 0) != 0) 2.893 -+ { 2.894 -+ printf ("Error in mpfr_cmp_si macro: result should be 0.\n"); 2.895 -+ exit (1); 2.896 -+ } 2.897 -+ if (p != x[1]) 2.898 -+ { 2.899 -+ printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n", 2.900 -+ (int) (p - x[0])); 2.901 -+ exit (1); 2.902 -+ } 2.903 -+ mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0); 2.904 -+} 2.905 -+ 2.906 - int 2.907 - main (void) 2.908 - { 2.909 -@@ -216,6 +336,8 @@ 2.910 - mpfr_clear (x); 2.911 - 2.912 - check_nan (); 2.913 -+ check_macros (); 2.914 -+ test_macros (); 2.915 - 2.916 - tests_end_mpfr (); 2.917 - return 0; 2.918 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.919 ---- mpfr-3.0.0-a/version.c 2010-07-10 00:11:53.000000000 +0000 2.920 -+++ mpfr-3.0.0-b/version.c 2010-09-07 08:46:06.000000000 +0000 2.921 -@@ -25,5 +25,5 @@ 2.922 - const char * 2.923 - mpfr_get_version (void) 2.924 - { 2.925 -- return "3.0.0-p3"; 2.926 -+ return "3.0.0-p4"; 2.927 - } 2.928 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.929 ---- mpfr-3.0.0-a/PATCHES 2010-10-21 20:28:38.000000000 +0000 2.930 -+++ mpfr-3.0.0-b/PATCHES 2010-10-21 20:28:38.000000000 +0000 2.931 -@@ -0,0 +1 @@ 2.932 -+tcan_round 2.933 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.934 ---- mpfr-3.0.0-a/VERSION 2010-09-07 08:46:06.000000000 +0000 2.935 -+++ mpfr-3.0.0-b/VERSION 2010-10-21 20:28:38.000000000 +0000 2.936 -@@ -1 +1 @@ 2.937 --3.0.0-p4 2.938 -+3.0.0-p5 2.939 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.940 ---- mpfr-3.0.0-a/mpfr.h 2010-09-07 08:46:06.000000000 +0000 2.941 -+++ mpfr-3.0.0-b/mpfr.h 2010-10-21 20:28:38.000000000 +0000 2.942 -@@ -27,7 +27,7 @@ 2.943 - #define MPFR_VERSION_MAJOR 3 2.944 - #define MPFR_VERSION_MINOR 0 2.945 - #define MPFR_VERSION_PATCHLEVEL 0 2.946 --#define MPFR_VERSION_STRING "3.0.0-p4" 2.947 -+#define MPFR_VERSION_STRING "3.0.0-p5" 2.948 - 2.949 - /* Macros dealing with MPFR VERSION */ 2.950 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.951 -diff -Naurd mpfr-3.0.0-a/tests/tcan_round.c mpfr-3.0.0-b/tests/tcan_round.c 2.952 ---- mpfr-3.0.0-a/tests/tcan_round.c 2010-06-10 11:00:13.000000000 +0000 2.953 -+++ mpfr-3.0.0-b/tests/tcan_round.c 2010-10-21 20:28:38.000000000 +0000 2.954 -@@ -41,7 +41,7 @@ 2.955 - /* avoid mpn_random which leaks memory */ 2.956 - for (i = 0; i < n; i++) 2.957 - buf[i] = randlimb (); 2.958 -- p = (mpfr_prec_t) randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN; 2.959 -+ p = randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN; 2.960 - err = p + randlimb () % GMP_NUMB_BITS; 2.961 - r1 = mpfr_round_p (buf, n, err, p); 2.962 - r2 = mpfr_can_round_raw (buf, n, MPFR_SIGN_POS, err, 2.963 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.964 ---- mpfr-3.0.0-a/version.c 2010-09-07 08:46:06.000000000 +0000 2.965 -+++ mpfr-3.0.0-b/version.c 2010-10-21 20:28:38.000000000 +0000 2.966 -@@ -25,5 +25,5 @@ 2.967 - const char * 2.968 - mpfr_get_version (void) 2.969 - { 2.970 -- return "3.0.0-p4"; 2.971 -+ return "3.0.0-p5"; 2.972 - } 2.973 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.974 ---- mpfr-3.0.0-a/PATCHES 2010-10-21 20:59:32.000000000 +0000 2.975 -+++ mpfr-3.0.0-b/PATCHES 2010-10-21 20:59:32.000000000 +0000 2.976 -@@ -0,0 +1 @@ 2.977 -+mpfr_sub1 2.978 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.979 ---- mpfr-3.0.0-a/VERSION 2010-10-21 20:28:38.000000000 +0000 2.980 -+++ mpfr-3.0.0-b/VERSION 2010-10-21 20:59:32.000000000 +0000 2.981 -@@ -1 +1 @@ 2.982 --3.0.0-p5 2.983 -+3.0.0-p6 2.984 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.985 ---- mpfr-3.0.0-a/mpfr.h 2010-10-21 20:28:38.000000000 +0000 2.986 -+++ mpfr-3.0.0-b/mpfr.h 2010-10-21 20:59:32.000000000 +0000 2.987 -@@ -27,7 +27,7 @@ 2.988 - #define MPFR_VERSION_MAJOR 3 2.989 - #define MPFR_VERSION_MINOR 0 2.990 - #define MPFR_VERSION_PATCHLEVEL 0 2.991 --#define MPFR_VERSION_STRING "3.0.0-p5" 2.992 -+#define MPFR_VERSION_STRING "3.0.0-p6" 2.993 - 2.994 - /* Macros dealing with MPFR VERSION */ 2.995 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.996 -diff -Naurd mpfr-3.0.0-a/sub1.c mpfr-3.0.0-b/sub1.c 2.997 ---- mpfr-3.0.0-a/sub1.c 2010-06-10 11:00:14.000000000 +0000 2.998 -+++ mpfr-3.0.0-b/sub1.c 2010-10-21 20:59:32.000000000 +0000 2.999 -@@ -37,7 +37,9 @@ 2.1000 - mp_size_t cancel2, an, bn, cn, cn0; 2.1001 - mp_limb_t *ap, *bp, *cp; 2.1002 - mp_limb_t carry, bb, cc, borrow = 0; 2.1003 -- int inexact, shift_b, shift_c, is_exact = 1, down = 0, add_exp = 0; 2.1004 -+ int inexact, shift_b, shift_c, add_exp = 0; 2.1005 -+ int cmp_low = 0; /* used for rounding to nearest: 0 if low(b) = low(c), 2.1006 -+ negative if low(b) < low(c), positive if low(b)>low(c) */ 2.1007 - int sh, k; 2.1008 - MPFR_TMP_DECL(marker); 2.1009 - 2.1010 -@@ -196,7 +198,8 @@ 2.1011 - } 2.1012 - 2.1013 - #ifdef DEBUG 2.1014 -- printf ("shift_b=%d shift_c=%d diffexp=%lu\n", shift_b, shift_c, 2.1015 -+ printf ("rnd=%s shift_b=%d shift_c=%d diffexp=%lu\n", 2.1016 -+ mpfr_print_rnd_mode (rnd_mode), shift_b, shift_c, 2.1017 - (unsigned long) diff_exp); 2.1018 - #endif 2.1019 - 2.1020 -@@ -307,17 +310,18 @@ 2.1021 - { 2.1022 - if (MPFR_LIKELY(sh)) 2.1023 - { 2.1024 -- is_exact = (carry == 0); 2.1025 - /* can decide except when carry = 2^(sh-1) [middle] 2.1026 - or carry = 0 [truncate, but cannot decide inexact flag] */ 2.1027 -- down = (carry < (MPFR_LIMB_ONE << (sh - 1))); 2.1028 - if (carry > (MPFR_LIMB_ONE << (sh - 1))) 2.1029 - goto add_one_ulp; 2.1030 -- else if ((0 < carry) && down) 2.1031 -+ else if ((0 < carry) && (carry < (MPFR_LIMB_ONE << (sh - 1)))) 2.1032 - { 2.1033 - inexact = -1; /* result if smaller than exact value */ 2.1034 - goto truncate; 2.1035 - } 2.1036 -+ /* now carry = 2^(sh-1), in which case cmp_low=2, 2.1037 -+ or carry = 0, in which case cmp_low=0 */ 2.1038 -+ cmp_low = (carry == 0) ? 0 : 2; 2.1039 - } 2.1040 - } 2.1041 - else /* directed rounding: set rnd_mode to RNDZ iff toward zero */ 2.1042 -@@ -344,12 +348,32 @@ 2.1043 - cn -= (long int) an + cancel2; 2.1044 - 2.1045 - #ifdef DEBUG 2.1046 -- printf ("last %d bits from a are %lu, bn=%ld, cn=%ld\n", 2.1047 -+ printf ("last sh=%d bits from a are %lu, bn=%ld, cn=%ld\n", 2.1048 - sh, (unsigned long) carry, (long) bn, (long) cn); 2.1049 - #endif 2.1050 - 2.1051 -+ /* for rounding to nearest, we couldn't conclude up to here in the following 2.1052 -+ cases: 2.1053 -+ 1. sh = 0, then cmp_low=0: we can either truncate, subtract one ulp 2.1054 -+ or add one ulp: -1 ulp < low(b)-low(c) < 1 ulp 2.1055 -+ 2. sh > 0 but the low sh bits from high(b)-high(c) equal 2^(sh-1): 2.1056 -+ -0.5 ulp <= -1/2^sh < low(b)-low(c)-0.5 < 1/2^sh <= 0.5 ulp 2.1057 -+ we can't decide the rounding, in that case cmp_low=2: 2.1058 -+ either we truncate and flag=-1, or we add one ulp and flag=1 2.1059 -+ 3. the low sh>0 bits from high(b)-high(c) equal 0: we know we have to 2.1060 -+ truncate but we can't decide the ternary value, here cmp_low=0: 2.1061 -+ -0.5 ulp <= -1/2^sh < low(b)-low(c) < 1/2^sh <= 0.5 ulp 2.1062 -+ we always truncate and inexact can be any of -1,0,1 2.1063 -+ */ 2.1064 -+ 2.1065 -+ /* note: here cn might exceed cn0, in which case we consider a zero limb */ 2.1066 - for (k = 0; (bn > 0) || (cn > 0); k = 1) 2.1067 - { 2.1068 -+ /* if cmp_low < 0, we know low(b) - low(c) < 0 2.1069 -+ if cmp_low > 0, we know low(b) - low(c) > 0 2.1070 -+ (more precisely if cmp_low = 2, low(b) - low(c) = 0.5 ulp so far) 2.1071 -+ if cmp_low = 0, so far low(b) - low(c) = 0 */ 2.1072 -+ 2.1073 - /* get next limbs */ 2.1074 - bb = (bn > 0) ? bp[--bn] : 0; 2.1075 - if ((cn > 0) && (cn-- <= cn0)) 2.1076 -@@ -357,76 +381,115 @@ 2.1077 - else 2.1078 - cc = 0; 2.1079 - 2.1080 -- /* down is set when low(b) < low(c) */ 2.1081 -- if (down == 0) 2.1082 -- down = (bb < cc); 2.1083 -+ /* cmp_low compares low(b) and low(c) */ 2.1084 -+ if (cmp_low == 0) /* case 1 or 3 */ 2.1085 -+ cmp_low = (bb < cc) ? -2+k : (bb > cc) ? 1 : 0; 2.1086 -+ 2.1087 -+ /* Case 1 for k=0 splits into 7 subcases: 2.1088 -+ 1a: bb > cc + half 2.1089 -+ 1b: bb = cc + half 2.1090 -+ 1c: 0 < bb - cc < half 2.1091 -+ 1d: bb = cc 2.1092 -+ 1e: -half < bb - cc < 0 2.1093 -+ 1f: bb - cc = -half 2.1094 -+ 1g: bb - cc < -half 2.1095 -+ 2.1096 -+ Case 2 splits into 3 subcases: 2.1097 -+ 2a: bb > cc 2.1098 -+ 2b: bb = cc 2.1099 -+ 2c: bb < cc 2.1100 -+ 2.1101 -+ Case 3 splits into 3 subcases: 2.1102 -+ 3a: bb > cc 2.1103 -+ 3b: bb = cc 2.1104 -+ 3c: bb < cc 2.1105 -+ */ 2.1106 - 2.1107 - /* the case rounding to nearest with sh=0 is special since one couldn't 2.1108 - subtract above 1/2 ulp in the trailing limb of the result */ 2.1109 -- if ((rnd_mode == MPFR_RNDN) && sh == 0 && k == 0) 2.1110 -+ if (rnd_mode == MPFR_RNDN && sh == 0 && k == 0) /* case 1 for k=0 */ 2.1111 - { 2.1112 - mp_limb_t half = MPFR_LIMB_HIGHBIT; 2.1113 - 2.1114 -- is_exact = (bb == cc); 2.1115 -- 2.1116 - /* add one ulp if bb > cc + half 2.1117 - truncate if cc - half < bb < cc + half 2.1118 - sub one ulp if bb < cc - half 2.1119 - */ 2.1120 - 2.1121 -- if (down) 2.1122 -+ if (cmp_low < 0) /* bb < cc: -1 ulp < low(b) - low(c) < 0, 2.1123 -+ cases 1e, 1f and 1g */ 2.1124 - { 2.1125 - if (cc >= half) 2.1126 - cc -= half; 2.1127 -- else 2.1128 -+ else /* since bb < cc < half, bb+half < 2*half */ 2.1129 - bb += half; 2.1130 -+ /* now we have bb < cc + half: 2.1131 -+ we have to subtract one ulp if bb < cc, 2.1132 -+ and truncate if bb > cc */ 2.1133 - } 2.1134 -- else /* bb >= cc */ 2.1135 -+ else if (cmp_low >= 0) /* bb >= cc, cases 1a to 1d */ 2.1136 - { 2.1137 - if (cc < half) 2.1138 - cc += half; 2.1139 -- else 2.1140 -+ else /* since bb >= cc >= half, bb - half >= 0 */ 2.1141 - bb -= half; 2.1142 -+ /* now we have bb > cc - half: we have to add one ulp if bb > cc, 2.1143 -+ and truncate if bb < cc */ 2.1144 -+ if (cmp_low > 0) 2.1145 -+ cmp_low = 2; 2.1146 - } 2.1147 - } 2.1148 - 2.1149 - #ifdef DEBUG 2.1150 -- printf (" bb=%lu cc=%lu down=%d is_exact=%d\n", 2.1151 -- (unsigned long) bb, (unsigned long) cc, down, is_exact); 2.1152 -+ printf ("k=%u bb=%lu cc=%lu cmp_low=%d\n", k, 2.1153 -+ (unsigned long) bb, (unsigned long) cc, cmp_low); 2.1154 - #endif 2.1155 -- if (bb < cc) 2.1156 -+ if (cmp_low < 0) /* low(b) - low(c) < 0: either truncate or subtract 2.1157 -+ one ulp */ 2.1158 - { 2.1159 - if (rnd_mode == MPFR_RNDZ) 2.1160 -- goto sub_one_ulp; 2.1161 -+ goto sub_one_ulp; /* set inexact=-1 */ 2.1162 - else if (rnd_mode != MPFR_RNDN) /* round away */ 2.1163 - { 2.1164 - inexact = 1; 2.1165 - goto truncate; 2.1166 - } 2.1167 -- else /* round to nearest: special case here since for sh=k=0 2.1168 -- bb = bb0 - MPFR_LIMB_HIGHBIT */ 2.1169 -+ else /* round to nearest */ 2.1170 - { 2.1171 -- if (is_exact && sh == 0) 2.1172 -- { 2.1173 -- /* For k=0 we can't decide exactness since it may depend 2.1174 -- from low order bits. 2.1175 -- For k=1, the first low limbs matched: low(b)-low(c)<0. */ 2.1176 -- if (k) 2.1177 -- { 2.1178 -- inexact = 1; 2.1179 -- goto truncate; 2.1180 -- } 2.1181 -- } 2.1182 -- else if (down && sh == 0) 2.1183 -- goto sub_one_ulp; 2.1184 -- else 2.1185 -- { 2.1186 -- inexact = (is_exact) ? 1 : -1; 2.1187 -+ /* If cmp_low < 0 and bb > cc, then -0.5 ulp < low(b)-low(c) < 0, 2.1188 -+ whatever the value of sh. 2.1189 -+ If sh>0, then cmp_low < 0 implies that the initial neglected 2.1190 -+ sh bits were 0 (otherwise cmp_low=2 initially), thus the 2.1191 -+ weight of the new bits is less than 0.5 ulp too. 2.1192 -+ If k > 0 (and sh=0) this means that either the first neglected 2.1193 -+ limbs bb and cc were equal (thus cmp_low was 0 for k=0), 2.1194 -+ or we had bb - cc = -0.5 ulp or 0.5 ulp. 2.1195 -+ The last case is not possible here since we would have 2.1196 -+ cmp_low > 0 which is sticky. 2.1197 -+ In the first case (where we have cmp_low = -1), we truncate, 2.1198 -+ whereas in the 2nd case we have cmp_low = -2 and we subtract 2.1199 -+ one ulp. 2.1200 -+ */ 2.1201 -+ if (bb > cc || sh > 0 || cmp_low == -1) 2.1202 -+ { /* -0.5 ulp < low(b)-low(c) < 0, 2.1203 -+ bb > cc corresponds to cases 1e and 1f1 2.1204 -+ sh > 0 corresponds to cases 3c and 3b3 2.1205 -+ cmp_low = -1 corresponds to case 1d3 (also 3b3) */ 2.1206 -+ inexact = 1; 2.1207 - goto truncate; 2.1208 - } 2.1209 -+ else if (bb < cc) /* here sh = 0 and low(b)-low(c) < -0.5 ulp, 2.1210 -+ this corresponds to cases 1g and 1f3 */ 2.1211 -+ goto sub_one_ulp; 2.1212 -+ /* the only case where we can't conclude is sh=0 and bb=cc, 2.1213 -+ i.e., we have low(b) - low(c) = -0.5 ulp (up to now), thus 2.1214 -+ we don't know if we must truncate or subtract one ulp. 2.1215 -+ Note: for sh=0 we can't have low(b) - low(c) = -0.5 ulp up to 2.1216 -+ now, since low(b) - low(c) > 1/2^sh */ 2.1217 - } 2.1218 - } 2.1219 -- else if (bb > cc) 2.1220 -+ else if (cmp_low > 0) /* 0 < low(b) - low(c): either truncate or 2.1221 -+ add one ulp */ 2.1222 - { 2.1223 - if (rnd_mode == MPFR_RNDZ) 2.1224 - { 2.1225 -@@ -437,34 +500,70 @@ 2.1226 - goto add_one_ulp; 2.1227 - else /* round to nearest */ 2.1228 - { 2.1229 -- if (is_exact) 2.1230 -+ if (bb > cc) 2.1231 - { 2.1232 -- inexact = -1; 2.1233 -- goto truncate; 2.1234 -+ /* if sh=0, then bb>cc means that low(b)-low(c) > 0.5 ulp, 2.1235 -+ and similarly when cmp_low=2 */ 2.1236 -+ if (cmp_low == 2) /* cases 1a, 1b1, 2a and 2b1 */ 2.1237 -+ goto add_one_ulp; 2.1238 -+ /* sh > 0 and cmp_low > 0: this implies that the sh initial 2.1239 -+ neglected bits were 0, and the remaining low(b)-low(c)>0, 2.1240 -+ but its weight is less than 0.5 ulp */ 2.1241 -+ else /* 0 < low(b) - low(c) < 0.5 ulp, this corresponds to 2.1242 -+ cases 3a, 1d1 and 3b1 */ 2.1243 -+ { 2.1244 -+ inexact = -1; 2.1245 -+ goto truncate; 2.1246 -+ } 2.1247 - } 2.1248 -- else if (down) 2.1249 -+ else if (bb < cc) /* 0 < low(b) - low(c) < 0.5 ulp, cases 1c, 2.1250 -+ 1b3, 2b3 and 2c */ 2.1251 - { 2.1252 -- inexact = 1; 2.1253 -+ inexact = -1; 2.1254 - goto truncate; 2.1255 - } 2.1256 -- else 2.1257 -- goto add_one_ulp; 2.1258 -+ /* the only case where we can't conclude is bb=cc, i.e., 2.1259 -+ low(b) - low(c) = 0.5 ulp (up to now), thus we don't know 2.1260 -+ if we must truncate or add one ulp. */ 2.1261 - } 2.1262 - } 2.1263 -+ /* after k=0, we cannot conclude in the following cases, we split them 2.1264 -+ according to the values of bb and cc for k=1: 2.1265 -+ 1b. sh=0 and cmp_low = 1 and bb-cc = half [around 0.5 ulp] 2.1266 -+ 1b1. bb > cc: add one ulp, inex = 1 2.1267 -+ 1b2: bb = cc: cannot conclude 2.1268 -+ 1b3: bb < cc: truncate, inex = -1 2.1269 -+ 1d. sh=0 and cmp_low = 0 and bb-cc = 0 [around 0] 2.1270 -+ 1d1: bb > cc: truncate, inex = -1 2.1271 -+ 1d2: bb = cc: cannot conclude 2.1272 -+ 1d3: bb < cc: truncate, inex = +1 2.1273 -+ 1f. sh=0 and cmp_low = -1 and bb-cc = -half [around -0.5 ulp] 2.1274 -+ 1f1: bb > cc: truncate, inex = +1 2.1275 -+ 1f2: bb = cc: cannot conclude 2.1276 -+ 1f3: bb < cc: sub one ulp, inex = -1 2.1277 -+ 2b. sh > 0 and cmp_low = 2 and bb=cc [around 0.5 ulp] 2.1278 -+ 2b1. bb > cc: add one ulp, inex = 1 2.1279 -+ 2b2: bb = cc: cannot conclude 2.1280 -+ 2b3: bb < cc: truncate, inex = -1 2.1281 -+ 3b. sh > 0 and cmp_low = 0 [around 0] 2.1282 -+ 3b1. bb > cc: truncate, inex = -1 2.1283 -+ 3b2: bb = cc: cannot conclude 2.1284 -+ 3b3: bb < cc: truncate, inex = +1 2.1285 -+ */ 2.1286 - } 2.1287 - 2.1288 -- if ((rnd_mode == MPFR_RNDN) && !is_exact) 2.1289 -+ if ((rnd_mode == MPFR_RNDN) && cmp_low != 0) 2.1290 - { 2.1291 - /* even rounding rule */ 2.1292 - if ((ap[0] >> sh) & 1) 2.1293 - { 2.1294 -- if (down) 2.1295 -+ if (cmp_low < 0) 2.1296 - goto sub_one_ulp; 2.1297 - else 2.1298 - goto add_one_ulp; 2.1299 - } 2.1300 - else 2.1301 -- inexact = (down) ? 1 : -1; 2.1302 -+ inexact = (cmp_low > 0) ? -1 : 1; 2.1303 - } 2.1304 - else 2.1305 - inexact = 0; 2.1306 -diff -Naurd mpfr-3.0.0-a/tests/tfma.c mpfr-3.0.0-b/tests/tfma.c 2.1307 ---- mpfr-3.0.0-a/tests/tfma.c 2010-06-10 11:00:13.000000000 +0000 2.1308 -+++ mpfr-3.0.0-b/tests/tfma.c 2010-10-21 20:59:32.000000000 +0000 2.1309 -@@ -337,6 +337,94 @@ 2.1310 - mpfr_clears (x, y, z, r, (mpfr_ptr) 0); 2.1311 - } 2.1312 - 2.1313 -+static void 2.1314 -+bug20101018 (void) 2.1315 -+{ 2.1316 -+ mpfr_t x, y, z, t, u; 2.1317 -+ int i; 2.1318 -+ 2.1319 -+ mpfr_init2 (x, 64); 2.1320 -+ mpfr_init2 (y, 64); 2.1321 -+ mpfr_init2 (z, 64); 2.1322 -+ mpfr_init2 (t, 64); 2.1323 -+ mpfr_init2 (u, 64); 2.1324 -+ 2.1325 -+ mpfr_set_str (x, "0xf.fffffffffffffffp-14766", 16, MPFR_RNDN); 2.1326 -+ mpfr_set_str (y, "-0xf.fffffffffffffffp+317", 16, MPFR_RNDN); 2.1327 -+ mpfr_set_str (z, "0x8.3ffffffffffe3ffp-14443", 16, MPFR_RNDN); 2.1328 -+ mpfr_set_str (t, "0x8.7ffffffffffc7ffp-14444", 16, MPFR_RNDN); 2.1329 -+ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 2.1330 -+ if (mpfr_cmp (u, t) != 0) 2.1331 -+ { 2.1332 -+ printf ("Wrong result in bug20101018 (a)\n"); 2.1333 -+ printf ("Expected "); 2.1334 -+ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 2.1335 -+ printf ("\nGot "); 2.1336 -+ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 2.1337 -+ printf ("\n"); 2.1338 -+ exit (1); 2.1339 -+ } 2.1340 -+ if (i <= 0) 2.1341 -+ { 2.1342 -+ printf ("Wrong ternary value in bug20101018 (a)\n"); 2.1343 -+ printf ("Expected > 0\n"); 2.1344 -+ printf ("Got %d\n", i); 2.1345 -+ exit (1); 2.1346 -+ } 2.1347 -+ 2.1348 -+ mpfr_set_str (x, "-0xf.fffffffffffffffp-11420", 16, MPFR_RNDN); 2.1349 -+ mpfr_set_str (y, "0xf.fffffffffffffffp+9863", 16, MPFR_RNDN); 2.1350 -+ mpfr_set_str (z, "0x8.fffff80ffffffffp-1551", 16, MPFR_RNDN); 2.1351 -+ mpfr_set_str (t, "0x9.fffff01ffffffffp-1552", 16, MPFR_RNDN); 2.1352 -+ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 2.1353 -+ if (mpfr_cmp (u, t) != 0) 2.1354 -+ { 2.1355 -+ printf ("Wrong result in bug20101018 (b)\n"); 2.1356 -+ printf ("Expected "); 2.1357 -+ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 2.1358 -+ printf ("\nGot "); 2.1359 -+ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 2.1360 -+ printf ("\n"); 2.1361 -+ exit (1); 2.1362 -+ } 2.1363 -+ if (i <= 0) 2.1364 -+ { 2.1365 -+ printf ("Wrong ternary value in bug20101018 (b)\n"); 2.1366 -+ printf ("Expected > 0\n"); 2.1367 -+ printf ("Got %d\n", i); 2.1368 -+ exit (1); 2.1369 -+ } 2.1370 -+ 2.1371 -+ mpfr_set_str (x, "0xf.fffffffffffffffp-2125", 16, MPFR_RNDN); 2.1372 -+ mpfr_set_str (y, "-0xf.fffffffffffffffp-6000", 16, MPFR_RNDN); 2.1373 -+ mpfr_set_str (z, "0x8p-8119", 16, MPFR_RNDN); 2.1374 -+ mpfr_set_str (t, "0x8.000000000000001p-8120", 16, MPFR_RNDN); 2.1375 -+ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 2.1376 -+ if (mpfr_cmp (u, t) != 0) 2.1377 -+ { 2.1378 -+ printf ("Wrong result in bug20101018 (c)\n"); 2.1379 -+ printf ("Expected "); 2.1380 -+ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 2.1381 -+ printf ("\nGot "); 2.1382 -+ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 2.1383 -+ printf ("\n"); 2.1384 -+ exit (1); 2.1385 -+ } 2.1386 -+ if (i <= 0) 2.1387 -+ { 2.1388 -+ printf ("Wrong ternary value in bug20101018 (c)\n"); 2.1389 -+ printf ("Expected > 0\n"); 2.1390 -+ printf ("Got %d\n", i); 2.1391 -+ exit (1); 2.1392 -+ } 2.1393 -+ 2.1394 -+ mpfr_clear (x); 2.1395 -+ mpfr_clear (y); 2.1396 -+ mpfr_clear (z); 2.1397 -+ mpfr_clear (t); 2.1398 -+ mpfr_clear (u); 2.1399 -+} 2.1400 -+ 2.1401 - int 2.1402 - main (int argc, char *argv[]) 2.1403 - { 2.1404 -@@ -345,6 +433,8 @@ 2.1405 - 2.1406 - tests_start_mpfr (); 2.1407 - 2.1408 -+ bug20101018 (); 2.1409 -+ 2.1410 - mpfr_init (x); 2.1411 - mpfr_init (s); 2.1412 - mpfr_init (y); 2.1413 -diff -Naurd mpfr-3.0.0-a/tests/tsub.c mpfr-3.0.0-b/tests/tsub.c 2.1414 ---- mpfr-3.0.0-a/tests/tsub.c 2010-06-10 11:00:13.000000000 +0000 2.1415 -+++ mpfr-3.0.0-b/tests/tsub.c 2010-10-21 20:59:32.000000000 +0000 2.1416 -@@ -201,6 +201,8 @@ 2.1417 - if (mpfr_cmp (z, x)) 2.1418 - { 2.1419 - printf ("Error in mpfr_sub (2)\n"); 2.1420 -+ printf ("Expected "); mpfr_print_binary (x); puts (""); 2.1421 -+ printf ("Got "); mpfr_print_binary (z); puts (""); 2.1422 - exit (1); 2.1423 - } 2.1424 - mpfr_set_str_binary (x, "1.1110111011110001110111011111111111101000011001011100101100101101"); 2.1425 -@@ -478,6 +480,156 @@ 2.1426 - mpfr_clear (u); 2.1427 - } 2.1428 - 2.1429 -+/* Bug found by Jakub Jelinek 2.1430 -+ * http://bugzilla.redhat.com/643657 2.1431 -+ * https://gforge.inria.fr/tracker/index.php?func=detail&aid=11301 2.1432 -+ * The consequence can be either an assertion failure (i = 2 in the 2.1433 -+ * testcase below, in debug mode) or an incorrectly rounded value. 2.1434 -+ */ 2.1435 -+static void 2.1436 -+bug20101017 (void) 2.1437 -+{ 2.1438 -+ mpfr_t a, b, c; 2.1439 -+ int inex; 2.1440 -+ int i; 2.1441 -+ 2.1442 -+ mpfr_init2 (a, GMP_NUMB_BITS * 2); 2.1443 -+ mpfr_init2 (b, GMP_NUMB_BITS); 2.1444 -+ mpfr_init2 (c, GMP_NUMB_BITS); 2.1445 -+ 2.1446 -+ /* a = 2^(2N) + k.2^(2N-1) + 2^N and b = 1 2.1447 -+ with N = GMP_NUMB_BITS and k = 0 or 1. 2.1448 -+ c = a - b should round to the same value as a. */ 2.1449 -+ 2.1450 -+ for (i = 2; i <= 3; i++) 2.1451 -+ { 2.1452 -+ mpfr_set_ui_2exp (a, i, GMP_NUMB_BITS - 1, MPFR_RNDN); 2.1453 -+ mpfr_add_ui (a, a, 1, MPFR_RNDN); 2.1454 -+ mpfr_mul_2ui (a, a, GMP_NUMB_BITS, MPFR_RNDN); 2.1455 -+ mpfr_set_ui (b, 1, MPFR_RNDN); 2.1456 -+ inex = mpfr_sub (c, a, b, MPFR_RNDN); 2.1457 -+ mpfr_set (b, a, MPFR_RNDN); 2.1458 -+ if (! mpfr_equal_p (c, b)) 2.1459 -+ { 2.1460 -+ printf ("Error in bug20101017 for i = %d.\n", i); 2.1461 -+ printf ("Expected "); 2.1462 -+ mpfr_out_str (stdout, 16, 0, b, MPFR_RNDN); 2.1463 -+ putchar ('\n'); 2.1464 -+ printf ("Got "); 2.1465 -+ mpfr_out_str (stdout, 16, 0, c, MPFR_RNDN); 2.1466 -+ putchar ('\n'); 2.1467 -+ exit (1); 2.1468 -+ } 2.1469 -+ if (inex >= 0) 2.1470 -+ { 2.1471 -+ printf ("Error in bug20101017 for i = %d: bad inex value.\n", i); 2.1472 -+ printf ("Expected negative, got %d.\n", inex); 2.1473 -+ exit (1); 2.1474 -+ } 2.1475 -+ } 2.1476 -+ 2.1477 -+ mpfr_set_prec (a, 64); 2.1478 -+ mpfr_set_prec (b, 129); 2.1479 -+ mpfr_set_prec (c, 2); 2.1480 -+ mpfr_set_str_binary (b, "0.100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001E65"); 2.1481 -+ mpfr_set_str_binary (c, "0.10E1"); 2.1482 -+ inex = mpfr_sub (a, b, c, MPFR_RNDN); 2.1483 -+ if (mpfr_cmp_ui_2exp (a, 1, 64) != 0 || inex >= 0) 2.1484 -+ { 2.1485 -+ printf ("Error in mpfr_sub for b-c for b=2^64+1+2^(-64), c=1\n"); 2.1486 -+ printf ("Expected result 2^64 with inex < 0\n"); 2.1487 -+ printf ("Got "); mpfr_print_binary (a); 2.1488 -+ printf (" with inex=%d\n", inex); 2.1489 -+ exit (1); 2.1490 -+ } 2.1491 -+ 2.1492 -+ mpfr_clears (a, b, c, (mpfr_ptr) 0); 2.1493 -+} 2.1494 -+ 2.1495 -+/* hard test of rounding */ 2.1496 -+static void 2.1497 -+check_rounding (void) 2.1498 -+{ 2.1499 -+ mpfr_t a, b, c, res; 2.1500 -+ mpfr_prec_t p; 2.1501 -+ long k, l; 2.1502 -+ int i; 2.1503 -+ 2.1504 -+#define MAXKL (2 * GMP_NUMB_BITS) 2.1505 -+ for (p = MPFR_PREC_MIN; p <= GMP_NUMB_BITS; p++) 2.1506 -+ { 2.1507 -+ mpfr_init2 (a, p); 2.1508 -+ mpfr_init2 (res, p); 2.1509 -+ mpfr_init2 (b, p + 1 + MAXKL); 2.1510 -+ mpfr_init2 (c, MPFR_PREC_MIN); 2.1511 -+ 2.1512 -+ /* b = 2^p + 1 + 2^(-k), c = 2^(-l) */ 2.1513 -+ for (k = 0; k <= MAXKL; k++) 2.1514 -+ for (l = 0; l <= MAXKL; l++) 2.1515 -+ { 2.1516 -+ mpfr_set_ui_2exp (b, 1, p, MPFR_RNDN); 2.1517 -+ mpfr_add_ui (b, b, 1, MPFR_RNDN); 2.1518 -+ mpfr_mul_2ui (b, b, k, MPFR_RNDN); 2.1519 -+ mpfr_add_ui (b, b, 1, MPFR_RNDN); 2.1520 -+ mpfr_div_2ui (b, b, k, MPFR_RNDN); 2.1521 -+ mpfr_set_ui_2exp (c, 1, -l, MPFR_RNDN); 2.1522 -+ i = mpfr_sub (a, b, c, MPFR_RNDN); 2.1523 -+ /* b - c = 2^p + 1 + 2^(-k) - 2^(-l), should be rounded to 2.1524 -+ 2^p for l <= k, and 2^p+2 for l < k */ 2.1525 -+ if (l <= k) 2.1526 -+ { 2.1527 -+ if (mpfr_cmp_ui_2exp (a, 1, p) != 0) 2.1528 -+ { 2.1529 -+ printf ("Wrong result in check_rounding\n"); 2.1530 -+ printf ("p=%lu k=%ld l=%ld\n", p, k, l); 2.1531 -+ printf ("b="); mpfr_print_binary (b); puts (""); 2.1532 -+ printf ("c="); mpfr_print_binary (c); puts (""); 2.1533 -+ printf ("Expected 2^%lu\n", p); 2.1534 -+ printf ("Got "); mpfr_print_binary (a); puts (""); 2.1535 -+ exit (1); 2.1536 -+ } 2.1537 -+ if (i >= 0) 2.1538 -+ { 2.1539 -+ printf ("Wrong ternary value in check_rounding\n"); 2.1540 -+ printf ("p=%lu k=%ld l=%ld\n", p, k, l); 2.1541 -+ printf ("b="); mpfr_print_binary (b); puts (""); 2.1542 -+ printf ("c="); mpfr_print_binary (c); puts (""); 2.1543 -+ printf ("a="); mpfr_print_binary (a); puts (""); 2.1544 -+ printf ("Expected < 0, got %d\n", i); 2.1545 -+ exit (1); 2.1546 -+ } 2.1547 -+ } 2.1548 -+ else /* l < k */ 2.1549 -+ { 2.1550 -+ mpfr_set_ui_2exp (res, 1, p, MPFR_RNDN); 2.1551 -+ mpfr_add_ui (res, res, 2, MPFR_RNDN); 2.1552 -+ if (mpfr_cmp (a, res) != 0) 2.1553 -+ { 2.1554 -+ printf ("Wrong result in check_rounding\n"); 2.1555 -+ printf ("b="); mpfr_print_binary (b); puts (""); 2.1556 -+ printf ("c="); mpfr_print_binary (c); puts (""); 2.1557 -+ printf ("Expected "); mpfr_print_binary (res); puts (""); 2.1558 -+ printf ("Got "); mpfr_print_binary (a); puts (""); 2.1559 -+ exit (1); 2.1560 -+ } 2.1561 -+ if (i <= 0) 2.1562 -+ { 2.1563 -+ printf ("Wrong ternary value in check_rounding\n"); 2.1564 -+ printf ("b="); mpfr_print_binary (b); puts (""); 2.1565 -+ printf ("c="); mpfr_print_binary (c); puts (""); 2.1566 -+ printf ("Expected > 0, got %d\n", i); 2.1567 -+ exit (1); 2.1568 -+ } 2.1569 -+ } 2.1570 -+ } 2.1571 -+ 2.1572 -+ mpfr_clear (a); 2.1573 -+ mpfr_clear (res); 2.1574 -+ mpfr_clear (b); 2.1575 -+ mpfr_clear (c); 2.1576 -+ } 2.1577 -+} 2.1578 -+ 2.1579 - #define TEST_FUNCTION test_sub 2.1580 - #define TWO_ARGS 2.1581 - #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS) 2.1582 -@@ -491,6 +643,8 @@ 2.1583 - 2.1584 - tests_start_mpfr (); 2.1585 - 2.1586 -+ bug20101017 (); 2.1587 -+ check_rounding (); 2.1588 - check_diverse (); 2.1589 - check_inexact (); 2.1590 - bug_ddefour (); 2.1591 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.1592 ---- mpfr-3.0.0-a/version.c 2010-10-21 20:28:38.000000000 +0000 2.1593 -+++ mpfr-3.0.0-b/version.c 2010-10-21 20:59:32.000000000 +0000 2.1594 -@@ -25,5 +25,5 @@ 2.1595 - const char * 2.1596 - mpfr_get_version (void) 2.1597 - { 2.1598 -- return "3.0.0-p5"; 2.1599 -+ return "3.0.0-p6"; 2.1600 - } 2.1601 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.1602 ---- mpfr-3.0.0-a/PATCHES 2010-10-21 21:18:26.000000000 +0000 2.1603 -+++ mpfr-3.0.0-b/PATCHES 2010-10-21 21:18:26.000000000 +0000 2.1604 -@@ -0,0 +1 @@ 2.1605 -+mpfr_set_ld 2.1606 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.1607 ---- mpfr-3.0.0-a/VERSION 2010-10-21 20:59:32.000000000 +0000 2.1608 -+++ mpfr-3.0.0-b/VERSION 2010-10-21 21:18:26.000000000 +0000 2.1609 -@@ -1 +1 @@ 2.1610 --3.0.0-p6 2.1611 -+3.0.0-p7 2.1612 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.1613 ---- mpfr-3.0.0-a/mpfr.h 2010-10-21 20:59:32.000000000 +0000 2.1614 -+++ mpfr-3.0.0-b/mpfr.h 2010-10-21 21:18:26.000000000 +0000 2.1615 -@@ -27,7 +27,7 @@ 2.1616 - #define MPFR_VERSION_MAJOR 3 2.1617 - #define MPFR_VERSION_MINOR 0 2.1618 - #define MPFR_VERSION_PATCHLEVEL 0 2.1619 --#define MPFR_VERSION_STRING "3.0.0-p6" 2.1620 -+#define MPFR_VERSION_STRING "3.0.0-p7" 2.1621 - 2.1622 - /* Macros dealing with MPFR VERSION */ 2.1623 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.1624 -diff -Naurd mpfr-3.0.0-a/set_ld.c mpfr-3.0.0-b/set_ld.c 2.1625 ---- mpfr-3.0.0-a/set_ld.c 2010-06-10 11:00:14.000000000 +0000 2.1626 -+++ mpfr-3.0.0-b/set_ld.c 2010-10-21 21:18:26.000000000 +0000 2.1627 -@@ -102,21 +102,25 @@ 2.1628 - { 2.1629 - x /= div13; /* exact */ 2.1630 - shift_exp += 8192; 2.1631 -+ mpfr_div_2si (t, t, 8192, MPFR_RNDZ); 2.1632 - } 2.1633 - if (ABS (x) >= div12) 2.1634 - { 2.1635 - x /= div12; /* exact */ 2.1636 - shift_exp += 4096; 2.1637 -+ mpfr_div_2si (t, t, 4096, MPFR_RNDZ); 2.1638 - } 2.1639 - if (ABS (x) >= div11) 2.1640 - { 2.1641 - x /= div11; /* exact */ 2.1642 - shift_exp += 2048; 2.1643 -+ mpfr_div_2si (t, t, 2048, MPFR_RNDZ); 2.1644 - } 2.1645 - if (ABS (x) >= div10) 2.1646 - { 2.1647 - x /= div10; /* exact */ 2.1648 - shift_exp += 1024; 2.1649 -+ mpfr_div_2si (t, t, 1024, MPFR_RNDZ); 2.1650 - } 2.1651 - /* warning: we may have DBL_MAX=2^1024*(1-2^(-53)) < x < 2^1024, 2.1652 - therefore we have one extra exponent reduction step */ 2.1653 -@@ -124,9 +128,10 @@ 2.1654 - { 2.1655 - x /= div9; /* exact */ 2.1656 - shift_exp += 512; 2.1657 -+ mpfr_div_2si (t, t, 512, MPFR_RNDZ); 2.1658 - } 2.1659 - } /* Check overflow of double */ 2.1660 -- else 2.1661 -+ else /* no overflow on double */ 2.1662 - { 2.1663 - long double div9, div10, div11; 2.1664 - 2.1665 -@@ -149,29 +154,34 @@ 2.1666 - { 2.1667 - x /= div13; /* exact */ 2.1668 - shift_exp -= 8192; 2.1669 -+ mpfr_mul_2si (t, t, 8192, MPFR_RNDZ); 2.1670 - } 2.1671 - if (ABS (x) <= div12) 2.1672 - { 2.1673 - x /= div12; /* exact */ 2.1674 - shift_exp -= 4096; 2.1675 -+ mpfr_mul_2si (t, t, 4096, MPFR_RNDZ); 2.1676 - } 2.1677 - if (ABS (x) <= div11) 2.1678 - { 2.1679 - x /= div11; /* exact */ 2.1680 - shift_exp -= 2048; 2.1681 -+ mpfr_mul_2si (t, t, 2048, MPFR_RNDZ); 2.1682 - } 2.1683 - if (ABS (x) <= div10) 2.1684 - { 2.1685 - x /= div10; /* exact */ 2.1686 - shift_exp -= 1024; 2.1687 -+ mpfr_mul_2si (t, t, 1024, MPFR_RNDZ); 2.1688 - } 2.1689 - if (ABS(x) <= div9) 2.1690 - { 2.1691 - x /= div9; /* exact */ 2.1692 - shift_exp -= 512; 2.1693 -+ mpfr_mul_2si (t, t, 512, MPFR_RNDZ); 2.1694 - } 2.1695 - } 2.1696 -- else 2.1697 -+ else /* no underflow */ 2.1698 - { 2.1699 - inexact = mpfr_set_d (u, (double) x, MPFR_RNDZ); 2.1700 - MPFR_ASSERTD (inexact == 0); 2.1701 -diff -Naurd mpfr-3.0.0-a/tests/tset_ld.c mpfr-3.0.0-b/tests/tset_ld.c 2.1702 ---- mpfr-3.0.0-a/tests/tset_ld.c 2010-06-10 11:00:13.000000000 +0000 2.1703 -+++ mpfr-3.0.0-b/tests/tset_ld.c 2010-10-21 21:18:26.000000000 +0000 2.1704 -@@ -147,12 +147,39 @@ 2.1705 - test_fixed_bugs (void) 2.1706 - { 2.1707 - mpfr_t x; 2.1708 -- long double d; 2.1709 -+ long double l, m; 2.1710 - 2.1711 - /* bug found by Steve Kargl (2009-03-14) */ 2.1712 - mpfr_init2 (x, 64); 2.1713 - mpfr_set_ui_2exp (x, 1, -16447, MPFR_RNDN); 2.1714 -- d = mpfr_get_ld (x, MPFR_RNDN); /* an assertion failed in init2.c:50 */ 2.1715 -+ mpfr_get_ld (x, MPFR_RNDN); /* an assertion failed in init2.c:50 */ 2.1716 -+ 2.1717 -+ /* bug reported by Jakub Jelinek (2010-10-17) 2.1718 -+ https://gforge.inria.fr/tracker/?func=detail&aid=11300 */ 2.1719 -+ mpfr_set_prec (x, MPFR_LDBL_MANT_DIG); 2.1720 -+ /* l = 0x1.23456789abcdef0123456789abcdp-914L; */ 2.1721 -+ l = 8.215640181713713164092636634579e-276; 2.1722 -+ mpfr_set_ld (x, l, MPFR_RNDN); 2.1723 -+ m = mpfr_get_ld (x, MPFR_RNDN); 2.1724 -+ if (m != l) 2.1725 -+ { 2.1726 -+ printf ("Error in get_ld o set_ld for l=%Le\n", l); 2.1727 -+ printf ("Got m=%Le instead of l\n", m); 2.1728 -+ exit (1); 2.1729 -+ } 2.1730 -+ 2.1731 -+ /* another similar test which failed with extended double precision and the 2.1732 -+ generic code for mpfr_set_ld */ 2.1733 -+ /* l = 0x1.23456789abcdef0123456789abcdp-968L; */ 2.1734 -+ l = 4.560596445887084662336528403703e-292; 2.1735 -+ mpfr_set_ld (x, l, MPFR_RNDN); 2.1736 -+ m = mpfr_get_ld (x, MPFR_RNDN); 2.1737 -+ if (m != l) 2.1738 -+ { 2.1739 -+ printf ("Error in get_ld o set_ld for l=%Le\n", l); 2.1740 -+ printf ("Got m=%Le instead of l\n", m); 2.1741 -+ exit (1); 2.1742 -+ } 2.1743 - 2.1744 - mpfr_clear (x); 2.1745 - } 2.1746 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.1747 ---- mpfr-3.0.0-a/version.c 2010-10-21 20:59:32.000000000 +0000 2.1748 -+++ mpfr-3.0.0-b/version.c 2010-10-21 21:18:26.000000000 +0000 2.1749 -@@ -25,5 +25,5 @@ 2.1750 - const char * 2.1751 - mpfr_get_version (void) 2.1752 - { 2.1753 -- return "3.0.0-p6"; 2.1754 -+ return "3.0.0-p7"; 2.1755 - } 2.1756 -diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 2.1757 ---- mpfr-3.0.0-a/PATCHES 2010-11-09 15:15:07.000000000 +0000 2.1758 -+++ mpfr-3.0.0-b/PATCHES 2010-11-09 15:15:07.000000000 +0000 2.1759 -@@ -0,0 +1 @@ 2.1760 -+macros 2.1761 -diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 2.1762 ---- mpfr-3.0.0-a/VERSION 2010-10-21 21:18:26.000000000 +0000 2.1763 -+++ mpfr-3.0.0-b/VERSION 2010-11-09 15:15:07.000000000 +0000 2.1764 -@@ -1 +1 @@ 2.1765 --3.0.0-p7 2.1766 -+3.0.0-p8 2.1767 -diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 2.1768 ---- mpfr-3.0.0-a/mpfr.h 2010-10-21 21:18:26.000000000 +0000 2.1769 -+++ mpfr-3.0.0-b/mpfr.h 2010-11-09 15:15:07.000000000 +0000 2.1770 -@@ -27,7 +27,7 @@ 2.1771 - #define MPFR_VERSION_MAJOR 3 2.1772 - #define MPFR_VERSION_MINOR 0 2.1773 - #define MPFR_VERSION_PATCHLEVEL 0 2.1774 --#define MPFR_VERSION_STRING "3.0.0-p7" 2.1775 -+#define MPFR_VERSION_STRING "3.0.0-p8" 2.1776 - 2.1777 - /* Macros dealing with MPFR VERSION */ 2.1778 - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 2.1779 -@@ -67,6 +67,16 @@ 2.1780 - # define _MPFR_H_HAVE_INTMAX_T 1 2.1781 - #endif 2.1782 - 2.1783 -+/* Avoid some problems with macro expansion if the user defines macros 2.1784 -+ with the same name as keywords. By convention, identifiers and macro 2.1785 -+ names starting with mpfr_ are reserved by MPFR. */ 2.1786 -+typedef void mpfr_void; 2.1787 -+typedef int mpfr_int; 2.1788 -+typedef unsigned int mpfr_uint; 2.1789 -+typedef long mpfr_long; 2.1790 -+typedef unsigned long mpfr_ulong; 2.1791 -+typedef size_t mpfr_size_t; 2.1792 -+ 2.1793 - /* Definition of rounding modes (DON'T USE MPFR_RNDNA!). 2.1794 - Warning! Changing the contents of this enum should be seen as an 2.1795 - interface change since the old and the new types are not compatible 2.1796 -@@ -136,7 +146,7 @@ 2.1797 - typedef mp_exp_t mpfr_exp_t; 2.1798 - 2.1799 - /* Definition of the standard exponent limits */ 2.1800 --#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((unsigned long) 1 << 30) - 1)) 2.1801 -+#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((mpfr_ulong) 1 << 30) - 1)) 2.1802 - #define MPFR_EMIN_DEFAULT (-(MPFR_EMAX_DEFAULT)) 2.1803 - 2.1804 - /* Definition of the main structure */ 2.1805 -@@ -725,13 +735,13 @@ 2.1806 - unexpected results with future compilers and aggressive optimisations. 2.1807 - Why not working only with signed types, using INT_MIN and LONG_MIN? */ 2.1808 - #if __GMP_MP_SIZE_T_INT 2.1809 --#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+2)) 2.1810 --#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+1)) 2.1811 --#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+3)) 2.1812 -+#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+2)) 2.1813 -+#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+1)) 2.1814 -+#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+3)) 2.1815 - #else 2.1816 --#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+2)) 2.1817 --#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+1)) 2.1818 --#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+3)) 2.1819 -+#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+2)) 2.1820 -+#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+1)) 2.1821 -+#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+3)) 2.1822 - #endif 2.1823 - 2.1824 - /* Define MPFR_USE_EXTENSION to avoid "gcc -pedantic" warnings. */ 2.1825 -@@ -760,9 +770,9 @@ 2.1826 - #define mpfr_inf_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_INF) 2.1827 - #define mpfr_zero_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_ZERO) 2.1828 - #define mpfr_regular_p(_x) ((_x)->_mpfr_exp > __MPFR_EXP_INF) 2.1829 --#define mpfr_sgn(_x) \ 2.1830 -- ((_x)->_mpfr_exp < __MPFR_EXP_INF ? \ 2.1831 -- (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (void) 0), 0 : \ 2.1832 -+#define mpfr_sgn(_x) \ 2.1833 -+ ((_x)->_mpfr_exp < __MPFR_EXP_INF ? \ 2.1834 -+ (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (mpfr_void) 0), 0 : \ 2.1835 - MPFR_SIGN (_x)) 2.1836 - 2.1837 - /* Prevent them from using as lvalues */ 2.1838 -@@ -805,7 +815,19 @@ 2.1839 - Moreover casts to unsigned long have been added to avoid warnings in 2.1840 - programs that use MPFR and are compiled with -Wconversion; such casts 2.1841 - are OK since if X is a constant expression, then (unsigned long) X is 2.1842 -- also a constant expression, so that the optimizations still work. */ 2.1843 -+ also a constant expression, so that the optimizations still work. The 2.1844 -+ warnings are probably related to the following two bugs: 2.1845 -+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4210 2.1846 -+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38470 (possibly a variant) 2.1847 -+ and the casts could be removed once these bugs are fixed. 2.1848 -+ Casts shouldn't be used on the generic calls (to the ..._2exp functions), 2.1849 -+ where implicit conversions are performed. Indeed, having at least one 2.1850 -+ implicit conversion in the macro allows the compiler to emit diagnostics 2.1851 -+ when normally expected, for instance in the following call: 2.1852 -+ mpfr_set_ui (x, "foo", MPFR_RNDN); 2.1853 -+ If this is not possible (for future macros), one of the tricks described 2.1854 -+ on http://groups.google.com/group/comp.std.c/msg/e92abd24bf9eaf7b could 2.1855 -+ be used. */ 2.1856 - #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus) 2.1857 - #if (__GNUC__ >= 2) 2.1858 - #undef mpfr_cmp_ui 2.1859 -@@ -813,45 +835,45 @@ 2.1860 - But warning! mpfr_sgn is specified as a macro in the API, thus the macro 2.1861 - mustn't be used if side effects are possible, like here. */ 2.1862 - #define mpfr_cmp_ui(_f,_u) \ 2.1863 -- (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 2.1864 -+ (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ? \ 2.1865 - (mpfr_sgn) (_f) : \ 2.1866 -- mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0)) 2.1867 -+ mpfr_cmp_ui_2exp ((_f), (_u), 0)) 2.1868 - #undef mpfr_cmp_si 2.1869 --#define mpfr_cmp_si(_f,_s) \ 2.1870 -- (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 2.1871 -- mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) : \ 2.1872 -- mpfr_cmp_si_2exp ((_f), (long) (_s), 0)) 2.1873 -+#define mpfr_cmp_si(_f,_s) \ 2.1874 -+ (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ? \ 2.1875 -+ mpfr_cmp_ui ((_f), (mpfr_ulong) (mpfr_long) (_s)) : \ 2.1876 -+ mpfr_cmp_si_2exp ((_f), (_s), 0)) 2.1877 - #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 2.1878 - #undef mpfr_set_ui 2.1879 - #define mpfr_set_ui(_f,_u,_r) \ 2.1880 -- (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 2.1881 -+ (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ? \ 2.1882 - __extension__ ({ \ 2.1883 - mpfr_ptr _p = (_f); \ 2.1884 - _p->_mpfr_sign = 1; \ 2.1885 - _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 2.1886 -- (void) (_r); 0; }) : \ 2.1887 -- mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r))) 2.1888 -+ (mpfr_void) (_r); 0; }) : \ 2.1889 -+ mpfr_set_ui_2exp ((_f), (_u), 0, (_r))) 2.1890 - #endif 2.1891 - #undef mpfr_set_si 2.1892 - #define mpfr_set_si(_f,_s,_r) \ 2.1893 -- (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 2.1894 -- mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) : \ 2.1895 -- mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r))) 2.1896 -+ (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ? \ 2.1897 -+ mpfr_set_ui ((_f), (mpfr_ulong) (mpfr_long) (_s), (_r)) : \ 2.1898 -+ mpfr_set_si_2exp ((_f), (_s), 0, (_r))) 2.1899 - #endif 2.1900 - #endif 2.1901 - 2.1902 - /* Macro version of mpfr_stack interface for fast access */ 2.1903 --#define mpfr_custom_get_size(p) ((size_t) \ 2.1904 -+#define mpfr_custom_get_size(p) ((mpfr_size_t) \ 2.1905 - (((p)+GMP_NUMB_BITS-1)/GMP_NUMB_BITS*sizeof (mp_limb_t))) 2.1906 - #define mpfr_custom_init(m,p) do {} while (0) 2.1907 --#define mpfr_custom_get_significand(x) ((void*)((x)->_mpfr_d)) 2.1908 -+#define mpfr_custom_get_significand(x) ((mpfr_void*)((x)->_mpfr_d)) 2.1909 - #define mpfr_custom_get_exp(x) ((x)->_mpfr_exp) 2.1910 - #define mpfr_custom_move(x,m) do { ((x)->_mpfr_d = (mp_limb_t*)(m)); } while (0) 2.1911 - #define mpfr_custom_init_set(x,k,e,p,m) do { \ 2.1912 - mpfr_ptr _x = (x); \ 2.1913 - mpfr_exp_t _e; \ 2.1914 - mpfr_kind_t _t; \ 2.1915 -- int _s, _k; \ 2.1916 -+ mpfr_int _s, _k; \ 2.1917 - _k = (k); \ 2.1918 - if (_k >= 0) { \ 2.1919 - _t = (mpfr_kind_t) _k; \ 2.1920 -@@ -868,11 +890,13 @@ 2.1921 - _x->_mpfr_exp = _e; \ 2.1922 - _x->_mpfr_d = (mp_limb_t*) (m); \ 2.1923 - } while (0) 2.1924 --#define mpfr_custom_get_kind(x) \ 2.1925 -- ( (x)->_mpfr_exp > __MPFR_EXP_INF ? (int)MPFR_REGULAR_KIND*MPFR_SIGN (x) \ 2.1926 -- : (x)->_mpfr_exp == __MPFR_EXP_INF ? (int)MPFR_INF_KIND*MPFR_SIGN (x) \ 2.1927 -- : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (int)MPFR_NAN_KIND \ 2.1928 -- : (int) MPFR_ZERO_KIND * MPFR_SIGN (x) ) 2.1929 -+#define mpfr_custom_get_kind(x) \ 2.1930 -+ ( (x)->_mpfr_exp > __MPFR_EXP_INF ? \ 2.1931 -+ (mpfr_int) MPFR_REGULAR_KIND * MPFR_SIGN (x) \ 2.1932 -+ : (x)->_mpfr_exp == __MPFR_EXP_INF ? \ 2.1933 -+ (mpfr_int) MPFR_INF_KIND * MPFR_SIGN (x) \ 2.1934 -+ : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (mpfr_int) MPFR_NAN_KIND \ 2.1935 -+ : (mpfr_int) MPFR_ZERO_KIND * MPFR_SIGN (x) ) 2.1936 - 2.1937 - 2.1938 - #endif /* MPFR_USE_NO_MACRO */ 2.1939 -diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 2.1940 ---- mpfr-3.0.0-a/version.c 2010-10-21 21:18:26.000000000 +0000 2.1941 -+++ mpfr-3.0.0-b/version.c 2010-11-09 15:15:07.000000000 +0000 2.1942 -@@ -25,5 +25,5 @@ 2.1943 - const char * 2.1944 - mpfr_get_version (void) 2.1945 - { 2.1946 -- return "3.0.0-p7"; 2.1947 -+ return "3.0.0-p8"; 2.1948 - }
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/mpfr/stuff/mpfr-3.0.0.patch Wed May 11 00:48:49 2011 +0200 3.3 @@ -0,0 +1,1945 @@ 3.4 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.5 +--- mpfr-3.0.0-a/PATCHES 2010-06-23 11:02:49.000000000 +0000 3.6 ++++ mpfr-3.0.0-b/PATCHES 2010-06-23 11:03:36.000000000 +0000 3.7 +@@ -0,0 +1 @@ 3.8 ++mpfr_out_str 3.9 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.10 +--- mpfr-3.0.0-a/VERSION 2010-06-10 11:00:14.000000000 +0000 3.11 ++++ mpfr-3.0.0-b/VERSION 2010-06-23 11:03:20.000000000 +0000 3.12 +@@ -1 +1 @@ 3.13 +-3.0.0 3.14 ++3.0.0-p1 3.15 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.16 +--- mpfr-3.0.0-a/mpfr.h 2010-06-10 11:00:14.000000000 +0000 3.17 ++++ mpfr-3.0.0-b/mpfr.h 2010-06-23 11:03:20.000000000 +0000 3.18 +@@ -27,7 +27,7 @@ 3.19 + #define MPFR_VERSION_MAJOR 3 3.20 + #define MPFR_VERSION_MINOR 0 3.21 + #define MPFR_VERSION_PATCHLEVEL 0 3.22 +-#define MPFR_VERSION_STRING "3.0.0" 3.23 ++#define MPFR_VERSION_STRING "3.0.0-p1" 3.24 + 3.25 + /* Macros dealing with MPFR VERSION */ 3.26 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.27 +diff -Naurd mpfr-3.0.0-a/mpfr.texi mpfr-3.0.0-b/mpfr.texi 3.28 +--- mpfr-3.0.0-a/mpfr.texi 2010-06-10 11:00:14.000000000 +0000 3.29 ++++ mpfr-3.0.0-b/mpfr.texi 2010-06-23 11:03:12.000000000 +0000 3.30 +@@ -2050,7 +2050,7 @@ 3.31 + are printed. If @var{base} is greater than 10, @samp{@@} will be used 3.32 + instead of @samp{e} as exponent delimiter. 3.33 + 3.34 +-Return the number of bytes written, or if an error occurred, return 0. 3.35 ++Return the number of characters written, or if an error occurred, return 0. 3.36 + @end deftypefun 3.37 + 3.38 + @deftypefun size_t mpfr_inp_str (mpfr_t @var{rop}, FILE *@var{stream}, int @var{base}, mpfr_rnd_t @var{rnd}) 3.39 +diff -Naurd mpfr-3.0.0-a/out_str.c mpfr-3.0.0-b/out_str.c 3.40 +--- mpfr-3.0.0-a/out_str.c 2010-06-10 11:00:14.000000000 +0000 3.41 ++++ mpfr-3.0.0-b/out_str.c 2010-06-23 11:03:12.000000000 +0000 3.42 +@@ -22,6 +22,16 @@ 3.43 + 3.44 + #include "mpfr-impl.h" 3.45 + 3.46 ++/* Warning! S should not contain "%". */ 3.47 ++#define OUT_STR_RET(S) \ 3.48 ++ do \ 3.49 ++ { \ 3.50 ++ int r; \ 3.51 ++ r = fprintf (stream, (S)); \ 3.52 ++ return r < 0 ? 0 : r; \ 3.53 ++ } \ 3.54 ++ while (0) 3.55 ++ 3.56 + size_t 3.57 + mpfr_out_str (FILE *stream, int base, size_t n_digits, mpfr_srcptr op, 3.58 + mpfr_rnd_t rnd_mode) 3.59 +@@ -29,6 +39,7 @@ 3.60 + char *s, *s0; 3.61 + size_t l; 3.62 + mpfr_exp_t e; 3.63 ++ int err; 3.64 + 3.65 + MPFR_ASSERTN (base >= 2 && base <= 62); 3.66 + 3.67 +@@ -36,37 +47,16 @@ 3.68 + if (stream == NULL) 3.69 + stream = stdout; 3.70 + 3.71 +- if (MPFR_IS_NAN(op)) 3.72 +- { 3.73 +- fprintf (stream, "@NaN@"); 3.74 +- return 3; 3.75 +- } 3.76 +- 3.77 +- if (MPFR_IS_INF(op)) 3.78 +- { 3.79 +- if (MPFR_SIGN(op) > 0) 3.80 +- { 3.81 +- fprintf (stream, "@Inf@"); 3.82 +- return 3; 3.83 +- } 3.84 +- else 3.85 +- { 3.86 +- fprintf (stream, "-@Inf@"); 3.87 +- return 4; 3.88 +- } 3.89 +- } 3.90 +- 3.91 +- if (MPFR_IS_ZERO(op)) 3.92 ++ if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (op))) 3.93 + { 3.94 +- if (MPFR_SIGN(op) > 0) 3.95 +- { 3.96 +- fprintf(stream, "0"); 3.97 +- return 1; 3.98 +- } 3.99 ++ if (MPFR_IS_NAN (op)) 3.100 ++ OUT_STR_RET ("@NaN@"); 3.101 ++ else if (MPFR_IS_INF (op)) 3.102 ++ OUT_STR_RET (MPFR_IS_POS (op) ? "@Inf@" : "-@Inf@"); 3.103 + else 3.104 + { 3.105 +- fprintf(stream, "-0"); 3.106 +- return 2; 3.107 ++ MPFR_ASSERTD (MPFR_IS_ZERO (op)); 3.108 ++ OUT_STR_RET (MPFR_IS_POS (op) ? "0" : "-0"); 3.109 + } 3.110 + } 3.111 + 3.112 +@@ -77,21 +67,31 @@ 3.113 + 3.114 + l = strlen (s) + 1; /* size of allocated block returned by mpfr_get_str 3.115 + - may be incorrect, as only an upper bound? */ 3.116 +- if (*s == '-') 3.117 +- fputc (*s++, stream); 3.118 + 3.119 +- /* outputs mantissa */ 3.120 +- fputc (*s++, stream); e--; /* leading digit */ 3.121 +- fputc ((unsigned char) MPFR_DECIMAL_POINT, stream); 3.122 +- fputs (s, stream); /* rest of mantissa */ 3.123 ++ /* outputs possible sign and significand */ 3.124 ++ err = (*s == '-' && fputc (*s++, stream) == EOF) 3.125 ++ || fputc (*s++, stream) == EOF /* leading digit */ 3.126 ++ || fputc ((unsigned char) MPFR_DECIMAL_POINT, stream) == EOF 3.127 ++ || fputs (s, stream) == EOF; /* trailing significand */ 3.128 + (*__gmp_free_func) (s0, l); 3.129 ++ if (MPFR_UNLIKELY (err)) 3.130 ++ return 0; 3.131 ++ 3.132 ++ e--; /* due to the leading digit */ 3.133 + 3.134 + /* outputs exponent */ 3.135 + if (e) 3.136 + { 3.137 ++ int r; 3.138 ++ 3.139 + MPFR_ASSERTN(e >= LONG_MIN); 3.140 + MPFR_ASSERTN(e <= LONG_MAX); 3.141 +- l += fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e); 3.142 ++ 3.143 ++ r = fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), (long) e); 3.144 ++ if (MPFR_UNLIKELY (r < 0)) 3.145 ++ return 0; 3.146 ++ 3.147 ++ l += r; 3.148 + } 3.149 + 3.150 + return l; 3.151 +diff -Naurd mpfr-3.0.0-a/tests/tout_str.c mpfr-3.0.0-b/tests/tout_str.c 3.152 +--- mpfr-3.0.0-a/tests/tout_str.c 2010-06-10 11:00:13.000000000 +0000 3.153 ++++ mpfr-3.0.0-b/tests/tout_str.c 2010-06-23 11:03:12.000000000 +0000 3.154 +@@ -46,22 +46,54 @@ 3.155 + special (void) 3.156 + { 3.157 + mpfr_t x; 3.158 ++ unsigned int n; 3.159 + 3.160 + mpfr_init (x); 3.161 + 3.162 + mpfr_set_nan (x); 3.163 +- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.164 ++ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.165 ++ if (n != 5) 3.166 ++ { 3.167 ++ printf ("Error: mpfr_out_str (file, 10, 0, NaN, MPFR_RNDN) wrote %u " 3.168 ++ "characters instead of 5.\n", n); 3.169 ++ exit (1); 3.170 ++ } 3.171 + 3.172 + mpfr_set_inf (x, 1); 3.173 +- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.174 ++ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.175 ++ if (n != 5) 3.176 ++ { 3.177 ++ printf ("Error: mpfr_out_str (file, 10, 0, +Inf, MPFR_RNDN) wrote %u " 3.178 ++ "characters instead of 5.\n", n); 3.179 ++ exit (1); 3.180 ++ } 3.181 + 3.182 + mpfr_set_inf (x, -1); 3.183 +- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.184 ++ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.185 ++ if (n != 6) 3.186 ++ { 3.187 ++ printf ("Error: mpfr_out_str (file, 10, 0, -Inf, MPFR_RNDN) wrote %u " 3.188 ++ "characters instead of 6.\n", n); 3.189 ++ exit (1); 3.190 ++ } 3.191 + 3.192 + mpfr_set_ui (x, 0, MPFR_RNDN); 3.193 +- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.194 ++ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.195 ++ if (n != 1) 3.196 ++ { 3.197 ++ printf ("Error: mpfr_out_str (file, 10, 0, +0, MPFR_RNDN) wrote %u " 3.198 ++ "characters instead of 1.\n", n); 3.199 ++ exit (1); 3.200 ++ } 3.201 ++ 3.202 + mpfr_neg (x, x, MPFR_RNDN); 3.203 +- mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.204 ++ n = mpfr_out_str (fout, 10, 0, x, MPFR_RNDN); 3.205 ++ if (n != 2) 3.206 ++ { 3.207 ++ printf ("Error: mpfr_out_str (file, 10, 0, -0, MPFR_RNDN) wrote %u " 3.208 ++ "characters instead of 2.\n", n); 3.209 ++ exit (1); 3.210 ++ } 3.211 + 3.212 + mpfr_clear (x); 3.213 + } 3.214 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.215 +--- mpfr-3.0.0-a/version.c 2010-06-10 11:00:14.000000000 +0000 3.216 ++++ mpfr-3.0.0-b/version.c 2010-06-23 11:03:20.000000000 +0000 3.217 +@@ -25,5 +25,5 @@ 3.218 + const char * 3.219 + mpfr_get_version (void) 3.220 + { 3.221 +- return "3.0.0"; 3.222 ++ return "3.0.0-p1"; 3.223 + } 3.224 +diff -Naurd mpfr-3.0.0-a/Makefile.in mpfr-3.0.0-b/Makefile.in 3.225 +--- mpfr-3.0.0-a/Makefile.in 2010-06-10 11:00:52.000000000 +0000 3.226 ++++ mpfr-3.0.0-b/Makefile.in 2010-06-10 11:00:52.000000000 +0000 3.227 +@@ -239,6 +239,7 @@ 3.228 + distuninstallcheck_listfiles = find . -type f -print 3.229 + distcleancheck_listfiles = find . -type f -print 3.230 + ACLOCAL = @ACLOCAL@ 3.231 ++ALLOCA = @ALLOCA@ 3.232 + AMTAR = @AMTAR@ 3.233 + AR = @AR@ 3.234 + AS = @AS@ 3.235 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.236 +--- mpfr-3.0.0-a/PATCHES 2010-06-23 11:03:36.000000000 +0000 3.237 ++++ mpfr-3.0.0-b/PATCHES 2010-06-25 13:23:13.000000000 +0000 3.238 +@@ -0,0 +1 @@ 3.239 ++alloca 3.240 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.241 +--- mpfr-3.0.0-a/VERSION 2010-06-23 11:03:20.000000000 +0000 3.242 ++++ mpfr-3.0.0-b/VERSION 2010-06-25 13:23:13.000000000 +0000 3.243 +@@ -1 +1 @@ 3.244 +-3.0.0-p1 3.245 ++3.0.0-p2 3.246 +diff -Naurd mpfr-3.0.0-a/acinclude.m4 mpfr-3.0.0-b/acinclude.m4 3.247 +--- mpfr-3.0.0-a/acinclude.m4 2010-06-10 11:00:14.000000000 +0000 3.248 ++++ mpfr-3.0.0-b/acinclude.m4 2010-06-10 11:00:14.000000000 +0000 3.249 +@@ -59,6 +59,9 @@ 3.250 + dnl sys/fpu.h - MIPS specific 3.251 + AC_CHECK_HEADERS([sys/time.h sys/fpu.h]) 3.252 + 3.253 ++dnl Check how to get `alloca' 3.254 ++AC_FUNC_ALLOCA 3.255 ++ 3.256 + dnl SIZE_MAX macro 3.257 + gl_SIZE_MAX 3.258 + 3.259 +diff -Naurd mpfr-3.0.0-a/configure mpfr-3.0.0-b/configure 3.260 +--- mpfr-3.0.0-a/configure 2010-06-10 11:00:51.000000000 +0000 3.261 ++++ mpfr-3.0.0-b/configure 2010-06-25 13:23:05.000000000 +0000 3.262 +@@ -783,6 +783,7 @@ 3.263 + OBJDUMP 3.264 + DLLTOOL 3.265 + AS 3.266 ++ALLOCA 3.267 + MPFR_LIBM 3.268 + ANSI2KNR 3.269 + U 3.270 +@@ -5622,6 +5623,197 @@ 3.271 + done 3.272 + 3.273 + 3.274 ++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works 3.275 ++# for constant arguments. Useless! 3.276 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 3.277 ++$as_echo_n "checking for working alloca.h... " >&6; } 3.278 ++if test "${ac_cv_working_alloca_h+set}" = set; then : 3.279 ++ $as_echo_n "(cached) " >&6 3.280 ++else 3.281 ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 3.282 ++/* end confdefs.h. */ 3.283 ++#include <alloca.h> 3.284 ++int 3.285 ++main () 3.286 ++{ 3.287 ++char *p = (char *) alloca (2 * sizeof (int)); 3.288 ++ if (p) return 0; 3.289 ++ ; 3.290 ++ return 0; 3.291 ++} 3.292 ++_ACEOF 3.293 ++if ac_fn_c_try_link "$LINENO"; then : 3.294 ++ ac_cv_working_alloca_h=yes 3.295 ++else 3.296 ++ ac_cv_working_alloca_h=no 3.297 ++fi 3.298 ++rm -f core conftest.err conftest.$ac_objext \ 3.299 ++ conftest$ac_exeext conftest.$ac_ext 3.300 ++fi 3.301 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 3.302 ++$as_echo "$ac_cv_working_alloca_h" >&6; } 3.303 ++if test $ac_cv_working_alloca_h = yes; then 3.304 ++ 3.305 ++$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h 3.306 ++ 3.307 ++fi 3.308 ++ 3.309 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 3.310 ++$as_echo_n "checking for alloca... " >&6; } 3.311 ++if test "${ac_cv_func_alloca_works+set}" = set; then : 3.312 ++ $as_echo_n "(cached) " >&6 3.313 ++else 3.314 ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 3.315 ++/* end confdefs.h. */ 3.316 ++#ifdef __GNUC__ 3.317 ++# define alloca __builtin_alloca 3.318 ++#else 3.319 ++# ifdef _MSC_VER 3.320 ++# include <malloc.h> 3.321 ++# define alloca _alloca 3.322 ++# else 3.323 ++# ifdef HAVE_ALLOCA_H 3.324 ++# include <alloca.h> 3.325 ++# else 3.326 ++# ifdef _AIX 3.327 ++ #pragma alloca 3.328 ++# else 3.329 ++# ifndef alloca /* predefined by HP cc +Olibcalls */ 3.330 ++char *alloca (); 3.331 ++# endif 3.332 ++# endif 3.333 ++# endif 3.334 ++# endif 3.335 ++#endif 3.336 ++ 3.337 ++int 3.338 ++main () 3.339 ++{ 3.340 ++char *p = (char *) alloca (1); 3.341 ++ if (p) return 0; 3.342 ++ ; 3.343 ++ return 0; 3.344 ++} 3.345 ++_ACEOF 3.346 ++if ac_fn_c_try_link "$LINENO"; then : 3.347 ++ ac_cv_func_alloca_works=yes 3.348 ++else 3.349 ++ ac_cv_func_alloca_works=no 3.350 ++fi 3.351 ++rm -f core conftest.err conftest.$ac_objext \ 3.352 ++ conftest$ac_exeext conftest.$ac_ext 3.353 ++fi 3.354 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 3.355 ++$as_echo "$ac_cv_func_alloca_works" >&6; } 3.356 ++ 3.357 ++if test $ac_cv_func_alloca_works = yes; then 3.358 ++ 3.359 ++$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h 3.360 ++ 3.361 ++else 3.362 ++ # The SVR3 libPW and SVR4 libucb both contain incompatible functions 3.363 ++# that cause trouble. Some versions do not even contain alloca or 3.364 ++# contain a buggy version. If you still want to use their alloca, 3.365 ++# use ar to extract alloca.o from them instead of compiling alloca.c. 3.366 ++ 3.367 ++ALLOCA=\${LIBOBJDIR}alloca.$ac_objext 3.368 ++ 3.369 ++$as_echo "#define C_ALLOCA 1" >>confdefs.h 3.370 ++ 3.371 ++ 3.372 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 3.373 ++$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } 3.374 ++if test "${ac_cv_os_cray+set}" = set; then : 3.375 ++ $as_echo_n "(cached) " >&6 3.376 ++else 3.377 ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 3.378 ++/* end confdefs.h. */ 3.379 ++#if defined CRAY && ! defined CRAY2 3.380 ++webecray 3.381 ++#else 3.382 ++wenotbecray 3.383 ++#endif 3.384 ++ 3.385 ++_ACEOF 3.386 ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | 3.387 ++ $EGREP "webecray" >/dev/null 2>&1; then : 3.388 ++ ac_cv_os_cray=yes 3.389 ++else 3.390 ++ ac_cv_os_cray=no 3.391 ++fi 3.392 ++rm -f conftest* 3.393 ++ 3.394 ++fi 3.395 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 3.396 ++$as_echo "$ac_cv_os_cray" >&6; } 3.397 ++if test $ac_cv_os_cray = yes; then 3.398 ++ for ac_func in _getb67 GETB67 getb67; do 3.399 ++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` 3.400 ++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" 3.401 ++eval as_val=\$$as_ac_var 3.402 ++ if test "x$as_val" = x""yes; then : 3.403 ++ 3.404 ++cat >>confdefs.h <<_ACEOF 3.405 ++#define CRAY_STACKSEG_END $ac_func 3.406 ++_ACEOF 3.407 ++ 3.408 ++ break 3.409 ++fi 3.410 ++ 3.411 ++ done 3.412 ++fi 3.413 ++ 3.414 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 3.415 ++$as_echo_n "checking stack direction for C alloca... " >&6; } 3.416 ++if test "${ac_cv_c_stack_direction+set}" = set; then : 3.417 ++ $as_echo_n "(cached) " >&6 3.418 ++else 3.419 ++ if test "$cross_compiling" = yes; then : 3.420 ++ ac_cv_c_stack_direction=0 3.421 ++else 3.422 ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext 3.423 ++/* end confdefs.h. */ 3.424 ++$ac_includes_default 3.425 ++int 3.426 ++find_stack_direction () 3.427 ++{ 3.428 ++ static char *addr = 0; 3.429 ++ auto char dummy; 3.430 ++ if (addr == 0) 3.431 ++ { 3.432 ++ addr = &dummy; 3.433 ++ return find_stack_direction (); 3.434 ++ } 3.435 ++ else 3.436 ++ return (&dummy > addr) ? 1 : -1; 3.437 ++} 3.438 ++ 3.439 ++int 3.440 ++main () 3.441 ++{ 3.442 ++ return find_stack_direction () < 0; 3.443 ++} 3.444 ++_ACEOF 3.445 ++if ac_fn_c_try_run "$LINENO"; then : 3.446 ++ ac_cv_c_stack_direction=1 3.447 ++else 3.448 ++ ac_cv_c_stack_direction=-1 3.449 ++fi 3.450 ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ 3.451 ++ conftest.$ac_objext conftest.beam conftest.$ac_ext 3.452 ++fi 3.453 ++ 3.454 ++fi 3.455 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 3.456 ++$as_echo "$ac_cv_c_stack_direction" >&6; } 3.457 ++cat >>confdefs.h <<_ACEOF 3.458 ++#define STACK_DIRECTION $ac_cv_c_stack_direction 3.459 ++_ACEOF 3.460 ++ 3.461 ++ 3.462 ++fi 3.463 ++ 3.464 ++ 3.465 + 3.466 + for ac_header in stdint.h 3.467 + do : 3.468 +@@ -7564,13 +7756,13 @@ 3.469 + else 3.470 + lt_cv_nm_interface="BSD nm" 3.471 + echo "int some_variable = 0;" > conftest.$ac_ext 3.472 +- (eval echo "\"\$as_me:7567: $ac_compile\"" >&5) 3.473 ++ (eval echo "\"\$as_me:7759: $ac_compile\"" >&5) 3.474 + (eval "$ac_compile" 2>conftest.err) 3.475 + cat conftest.err >&5 3.476 +- (eval echo "\"\$as_me:7570: $NM \\\"conftest.$ac_objext\\\"\"" >&5) 3.477 ++ (eval echo "\"\$as_me:7762: $NM \\\"conftest.$ac_objext\\\"\"" >&5) 3.478 + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) 3.479 + cat conftest.err >&5 3.480 +- (eval echo "\"\$as_me:7573: output\"" >&5) 3.481 ++ (eval echo "\"\$as_me:7765: output\"" >&5) 3.482 + cat conftest.out >&5 3.483 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then 3.484 + lt_cv_nm_interface="MS dumpbin" 3.485 +@@ -8772,7 +8964,7 @@ 3.486 + ;; 3.487 + *-*-irix6*) 3.488 + # Find out which ABI we are using. 3.489 +- echo '#line 8775 "configure"' > conftest.$ac_ext 3.490 ++ echo '#line 8967 "configure"' > conftest.$ac_ext 3.491 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 3.492 + (eval $ac_compile) 2>&5 3.493 + ac_status=$? 3.494 +@@ -10032,11 +10224,11 @@ 3.495 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 3.496 + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 3.497 + -e 's:$: $lt_compiler_flag:'` 3.498 +- (eval echo "\"\$as_me:10035: $lt_compile\"" >&5) 3.499 ++ (eval echo "\"\$as_me:10227: $lt_compile\"" >&5) 3.500 + (eval "$lt_compile" 2>conftest.err) 3.501 + ac_status=$? 3.502 + cat conftest.err >&5 3.503 +- echo "$as_me:10039: \$? = $ac_status" >&5 3.504 ++ echo "$as_me:10231: \$? = $ac_status" >&5 3.505 + if (exit $ac_status) && test -s "$ac_outfile"; then 3.506 + # The compiler can only warn and ignore the option if not recognized 3.507 + # So say no if there are warnings other than the usual output. 3.508 +@@ -10371,11 +10563,11 @@ 3.509 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 3.510 + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 3.511 + -e 's:$: $lt_compiler_flag:'` 3.512 +- (eval echo "\"\$as_me:10374: $lt_compile\"" >&5) 3.513 ++ (eval echo "\"\$as_me:10566: $lt_compile\"" >&5) 3.514 + (eval "$lt_compile" 2>conftest.err) 3.515 + ac_status=$? 3.516 + cat conftest.err >&5 3.517 +- echo "$as_me:10378: \$? = $ac_status" >&5 3.518 ++ echo "$as_me:10570: \$? = $ac_status" >&5 3.519 + if (exit $ac_status) && test -s "$ac_outfile"; then 3.520 + # The compiler can only warn and ignore the option if not recognized 3.521 + # So say no if there are warnings other than the usual output. 3.522 +@@ -10476,11 +10668,11 @@ 3.523 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 3.524 + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 3.525 + -e 's:$: $lt_compiler_flag:'` 3.526 +- (eval echo "\"\$as_me:10479: $lt_compile\"" >&5) 3.527 ++ (eval echo "\"\$as_me:10671: $lt_compile\"" >&5) 3.528 + (eval "$lt_compile" 2>out/conftest.err) 3.529 + ac_status=$? 3.530 + cat out/conftest.err >&5 3.531 +- echo "$as_me:10483: \$? = $ac_status" >&5 3.532 ++ echo "$as_me:10675: \$? = $ac_status" >&5 3.533 + if (exit $ac_status) && test -s out/conftest2.$ac_objext 3.534 + then 3.535 + # The compiler can only warn and ignore the option if not recognized 3.536 +@@ -10531,11 +10723,11 @@ 3.537 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 3.538 + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ 3.539 + -e 's:$: $lt_compiler_flag:'` 3.540 +- (eval echo "\"\$as_me:10534: $lt_compile\"" >&5) 3.541 ++ (eval echo "\"\$as_me:10726: $lt_compile\"" >&5) 3.542 + (eval "$lt_compile" 2>out/conftest.err) 3.543 + ac_status=$? 3.544 + cat out/conftest.err >&5 3.545 +- echo "$as_me:10538: \$? = $ac_status" >&5 3.546 ++ echo "$as_me:10730: \$? = $ac_status" >&5 3.547 + if (exit $ac_status) && test -s out/conftest2.$ac_objext 3.548 + then 3.549 + # The compiler can only warn and ignore the option if not recognized 3.550 +@@ -12915,7 +13107,7 @@ 3.551 + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 3.552 + lt_status=$lt_dlunknown 3.553 + cat > conftest.$ac_ext <<_LT_EOF 3.554 +-#line 12918 "configure" 3.555 ++#line 13110 "configure" 3.556 + #include "confdefs.h" 3.557 + 3.558 + #if HAVE_DLFCN_H 3.559 +@@ -13011,7 +13203,7 @@ 3.560 + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 3.561 + lt_status=$lt_dlunknown 3.562 + cat > conftest.$ac_ext <<_LT_EOF 3.563 +-#line 13014 "configure" 3.564 ++#line 13206 "configure" 3.565 + #include "confdefs.h" 3.566 + 3.567 + #if HAVE_DLFCN_H 3.568 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.569 +--- mpfr-3.0.0-a/mpfr.h 2010-06-23 11:03:20.000000000 +0000 3.570 ++++ mpfr-3.0.0-b/mpfr.h 2010-06-25 13:23:13.000000000 +0000 3.571 +@@ -27,7 +27,7 @@ 3.572 + #define MPFR_VERSION_MAJOR 3 3.573 + #define MPFR_VERSION_MINOR 0 3.574 + #define MPFR_VERSION_PATCHLEVEL 0 3.575 +-#define MPFR_VERSION_STRING "3.0.0-p1" 3.576 ++#define MPFR_VERSION_STRING "3.0.0-p2" 3.577 + 3.578 + /* Macros dealing with MPFR VERSION */ 3.579 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.580 +diff -Naurd mpfr-3.0.0-a/tests/Makefile.in mpfr-3.0.0-b/tests/Makefile.in 3.581 +--- mpfr-3.0.0-a/tests/Makefile.in 2010-06-10 11:00:52.000000000 +0000 3.582 ++++ mpfr-3.0.0-b/tests/Makefile.in 2010-06-10 11:00:52.000000000 +0000 3.583 +@@ -960,6 +960,7 @@ 3.584 + red=; grn=; lgn=; blu=; std= 3.585 + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 3.586 + ACLOCAL = @ACLOCAL@ 3.587 ++ALLOCA = @ALLOCA@ 3.588 + AMTAR = @AMTAR@ 3.589 + AR = @AR@ 3.590 + AS = @AS@ 3.591 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.592 +--- mpfr-3.0.0-a/version.c 2010-06-23 11:03:20.000000000 +0000 3.593 ++++ mpfr-3.0.0-b/version.c 2010-06-25 13:23:13.000000000 +0000 3.594 +@@ -25,5 +25,5 @@ 3.595 + const char * 3.596 + mpfr_get_version (void) 3.597 + { 3.598 +- return "3.0.0-p1"; 3.599 ++ return "3.0.0-p2"; 3.600 + } 3.601 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.602 +--- mpfr-3.0.0-a/PATCHES 2010-07-10 00:11:19.000000000 +0000 3.603 ++++ mpfr-3.0.0-b/PATCHES 2010-07-10 00:12:50.000000000 +0000 3.604 +@@ -0,0 +1 @@ 3.605 ++gamma_underflow 3.606 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.607 +--- mpfr-3.0.0-a/VERSION 2010-06-25 13:23:13.000000000 +0000 3.608 ++++ mpfr-3.0.0-b/VERSION 2010-07-10 00:11:53.000000000 +0000 3.609 +@@ -1 +1 @@ 3.610 +-3.0.0-p2 3.611 ++3.0.0-p3 3.612 +diff -Naurd mpfr-3.0.0-a/gamma.c mpfr-3.0.0-b/gamma.c 3.613 +--- mpfr-3.0.0-a/gamma.c 2010-06-10 11:00:14.000000000 +0000 3.614 ++++ mpfr-3.0.0-b/gamma.c 2010-07-10 00:11:46.000000000 +0000 3.615 +@@ -274,7 +274,7 @@ 3.616 + /* we want an upper bound for x * [log(2-x)-1]. 3.617 + since x < 0, we need a lower bound on log(2-x) */ 3.618 + mpfr_ui_sub (xp, 2, x, MPFR_RNDD); 3.619 +- mpfr_log (xp, xp, MPFR_RNDD); 3.620 ++ mpfr_log2 (xp, xp, MPFR_RNDD); 3.621 + mpfr_sub_ui (xp, xp, 1, MPFR_RNDD); 3.622 + mpfr_mul (xp, xp, x, MPFR_RNDU); 3.623 + 3.624 +@@ -303,8 +303,8 @@ 3.625 + { 3.626 + mpfr_sub (tmp, tmp, tmp2, MPFR_RNDZ); /* low bnd on |sin(Pi*(2-x))| */ 3.627 + mpfr_ui_div (tmp, 12, tmp, MPFR_RNDU); /* upper bound */ 3.628 +- mpfr_log (tmp, tmp, MPFR_RNDU); 3.629 +- mpfr_add (tmp, tmp, xp, MPFR_RNDU); 3.630 ++ mpfr_log2 (tmp, tmp, MPFR_RNDU); 3.631 ++ mpfr_add (xp, tmp, xp, MPFR_RNDU); 3.632 + underflow = mpfr_cmp_si (xp, expo.saved_emin - 2) <= 0; 3.633 + } 3.634 + 3.635 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.636 +--- mpfr-3.0.0-a/mpfr.h 2010-06-25 13:23:13.000000000 +0000 3.637 ++++ mpfr-3.0.0-b/mpfr.h 2010-07-10 00:11:53.000000000 +0000 3.638 +@@ -27,7 +27,7 @@ 3.639 + #define MPFR_VERSION_MAJOR 3 3.640 + #define MPFR_VERSION_MINOR 0 3.641 + #define MPFR_VERSION_PATCHLEVEL 0 3.642 +-#define MPFR_VERSION_STRING "3.0.0-p2" 3.643 ++#define MPFR_VERSION_STRING "3.0.0-p3" 3.644 + 3.645 + /* Macros dealing with MPFR VERSION */ 3.646 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.647 +diff -Naurd mpfr-3.0.0-a/tests/tgamma.c mpfr-3.0.0-b/tests/tgamma.c 3.648 +--- mpfr-3.0.0-a/tests/tgamma.c 2010-06-10 11:00:13.000000000 +0000 3.649 ++++ mpfr-3.0.0-b/tests/tgamma.c 2010-07-10 00:11:46.000000000 +0000 3.650 +@@ -461,6 +461,20 @@ 3.651 + mpfr_clear (x); 3.652 + } 3.653 + 3.654 ++/* bug found by Stathis, only occurs on 32-bit machines */ 3.655 ++static void 3.656 ++test20100709 (void) 3.657 ++{ 3.658 ++ mpfr_t x; 3.659 ++ int inex; 3.660 ++ 3.661 ++ mpfr_init2 (x, 100); 3.662 ++ mpfr_set_str (x, "-4.6308260837372266e+07", 10, MPFR_RNDN); 3.663 ++ inex = mpfr_gamma (x, x, MPFR_RNDN); 3.664 ++ MPFR_ASSERTN(MPFR_IS_ZERO(x) && MPFR_IS_NEG(x) && inex > 0); 3.665 ++ mpfr_clear (x); 3.666 ++} 3.667 ++ 3.668 + int 3.669 + main (int argc, char *argv[]) 3.670 + { 3.671 +@@ -471,6 +485,7 @@ 3.672 + test_generic (2, 100, 2); 3.673 + gamma_integer (); 3.674 + test20071231 (); 3.675 ++ test20100709 (); 3.676 + 3.677 + data_check ("data/gamma", mpfr_gamma, "mpfr_gamma"); 3.678 + 3.679 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.680 +--- mpfr-3.0.0-a/version.c 2010-06-25 13:23:13.000000000 +0000 3.681 ++++ mpfr-3.0.0-b/version.c 2010-07-10 00:11:53.000000000 +0000 3.682 +@@ -25,5 +25,5 @@ 3.683 + const char * 3.684 + mpfr_get_version (void) 3.685 + { 3.686 +- return "3.0.0-p2"; 3.687 ++ return "3.0.0-p3"; 3.688 + } 3.689 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.690 +--- mpfr-3.0.0-a/PATCHES 2010-09-07 08:44:01.000000000 +0000 3.691 ++++ mpfr-3.0.0-b/PATCHES 2010-09-07 08:48:46.000000000 +0000 3.692 +@@ -0,0 +1 @@ 3.693 ++mpfr_cmp/set_ui/si 3.694 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.695 +--- mpfr-3.0.0-a/VERSION 2010-07-10 00:11:53.000000000 +0000 3.696 ++++ mpfr-3.0.0-b/VERSION 2010-09-07 08:46:06.000000000 +0000 3.697 +@@ -1 +1 @@ 3.698 +-3.0.0-p3 3.699 ++3.0.0-p4 3.700 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.701 +--- mpfr-3.0.0-a/mpfr.h 2010-07-10 00:11:53.000000000 +0000 3.702 ++++ mpfr-3.0.0-b/mpfr.h 2010-09-07 08:46:06.000000000 +0000 3.703 +@@ -27,7 +27,7 @@ 3.704 + #define MPFR_VERSION_MAJOR 3 3.705 + #define MPFR_VERSION_MINOR 0 3.706 + #define MPFR_VERSION_PATCHLEVEL 0 3.707 +-#define MPFR_VERSION_STRING "3.0.0-p3" 3.708 ++#define MPFR_VERSION_STRING "3.0.0-p4" 3.709 + 3.710 + /* Macros dealing with MPFR VERSION */ 3.711 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.712 +@@ -798,35 +798,45 @@ 3.713 + anyway. Checking with other ICC versions is needed. Possibly detect 3.714 + whether warnings are produced or not with a configure test. 3.715 + + Remove C++ too, since it complains too much. */ 3.716 ++/* Added casts to improve robustness in case of undefined behavior and 3.717 ++ compiler extensions based on UB (in particular -fwrapv). MPFR doesn't 3.718 ++ use such extensions, but these macros will be used by 3rd-party code, 3.719 ++ where such extensions may be required. 3.720 ++ Moreover casts to unsigned long have been added to avoid warnings in 3.721 ++ programs that use MPFR and are compiled with -Wconversion; such casts 3.722 ++ are OK since if X is a constant expression, then (unsigned long) X is 3.723 ++ also a constant expression, so that the optimizations still work. */ 3.724 + #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus) 3.725 + #if (__GNUC__ >= 2) 3.726 + #undef mpfr_cmp_ui 3.727 +-/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. */ 3.728 +-#define mpfr_cmp_ui(_f,_u) \ 3.729 +- (__builtin_constant_p (_u) && (_u) == 0 ? \ 3.730 +- mpfr_sgn (_f) : \ 3.731 +- mpfr_cmp_ui_2exp ((_f),(_u),0)) 3.732 ++/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. 3.733 ++ But warning! mpfr_sgn is specified as a macro in the API, thus the macro 3.734 ++ mustn't be used if side effects are possible, like here. */ 3.735 ++#define mpfr_cmp_ui(_f,_u) \ 3.736 ++ (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 3.737 ++ (mpfr_sgn) (_f) : \ 3.738 ++ mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0)) 3.739 + #undef mpfr_cmp_si 3.740 +-#define mpfr_cmp_si(_f,_s) \ 3.741 +- (__builtin_constant_p (_s) && (_s) >= 0 ? \ 3.742 +- mpfr_cmp_ui ((_f), (_s)) : \ 3.743 +- mpfr_cmp_si_2exp ((_f), (_s), 0)) 3.744 ++#define mpfr_cmp_si(_f,_s) \ 3.745 ++ (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 3.746 ++ mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) : \ 3.747 ++ mpfr_cmp_si_2exp ((_f), (long) (_s), 0)) 3.748 + #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 3.749 + #undef mpfr_set_ui 3.750 +-#define mpfr_set_ui(_f,_u,_r) \ 3.751 +- (__builtin_constant_p (_u) && (_u) == 0 ? \ 3.752 +- __extension__ ({ \ 3.753 +- mpfr_ptr _p = (_f); \ 3.754 +- _p->_mpfr_sign = 1; \ 3.755 +- _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 3.756 +- (void) (_r); 0; }) : \ 3.757 +- mpfr_set_ui_2exp ((_f), (_u), 0, (_r))) 3.758 ++#define mpfr_set_ui(_f,_u,_r) \ 3.759 ++ (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 3.760 ++ __extension__ ({ \ 3.761 ++ mpfr_ptr _p = (_f); \ 3.762 ++ _p->_mpfr_sign = 1; \ 3.763 ++ _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 3.764 ++ (void) (_r); 0; }) : \ 3.765 ++ mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r))) 3.766 + #endif 3.767 + #undef mpfr_set_si 3.768 +-#define mpfr_set_si(_f,_s,_r) \ 3.769 +- (__builtin_constant_p (_s) && (_s) >= 0 ? \ 3.770 +- mpfr_set_ui ((_f), (_s), (_r)) : \ 3.771 +- mpfr_set_si_2exp ((_f), (_s), 0, (_r))) 3.772 ++#define mpfr_set_si(_f,_s,_r) \ 3.773 ++ (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 3.774 ++ mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) : \ 3.775 ++ mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r))) 3.776 + #endif 3.777 + #endif 3.778 + 3.779 +diff -Naurd mpfr-3.0.0-a/tests/tcmp_ui.c mpfr-3.0.0-b/tests/tcmp_ui.c 3.780 +--- mpfr-3.0.0-a/tests/tcmp_ui.c 2010-06-10 11:00:13.000000000 +0000 3.781 ++++ mpfr-3.0.0-b/tests/tcmp_ui.c 2010-09-07 08:45:12.000000000 +0000 3.782 +@@ -88,6 +88,126 @@ 3.783 + mpfr_clear (x); 3.784 + } 3.785 + 3.786 ++/* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro 3.787 ++ with __builtin_constant_p for GCC, check that side effects are 3.788 ++ handled correctly. */ 3.789 ++static void 3.790 ++check_macros (void) 3.791 ++{ 3.792 ++ mpfr_t x; 3.793 ++ int c; 3.794 ++ 3.795 ++ mpfr_init2 (x, 32); 3.796 ++ 3.797 ++ c = 0; 3.798 ++ mpfr_set_ui (x, 17, MPFR_RNDN); 3.799 ++ if (mpfr_cmp_ui (x, 17) != 0) 3.800 ++ { 3.801 ++ printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n"); 3.802 ++ exit (1); 3.803 ++ } 3.804 ++ if (mpfr_cmp_ui (x, (c++, 17)) != 0) 3.805 ++ { 3.806 ++ printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n"); 3.807 ++ exit (1); 3.808 ++ } 3.809 ++ if (c != 1) 3.810 ++ { 3.811 ++ printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n" 3.812 ++ "(c = %d instead of 1)\n", c); 3.813 ++ exit (1); 3.814 ++ } 3.815 ++ if (mpfr_cmp_si (x, 17) != 0) 3.816 ++ { 3.817 ++ printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n"); 3.818 ++ exit (1); 3.819 ++ } 3.820 ++ if (mpfr_cmp_si (x, (c++, 17)) != 0) 3.821 ++ { 3.822 ++ printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n"); 3.823 ++ exit (1); 3.824 ++ } 3.825 ++ if (c != 2) 3.826 ++ { 3.827 ++ printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n" 3.828 ++ "(c = %d instead of 2)\n", c); 3.829 ++ exit (1); 3.830 ++ } 3.831 ++ 3.832 ++ c = 0; 3.833 ++ mpfr_set_ui (x, 0, MPFR_RNDN); 3.834 ++ if (mpfr_cmp_ui (x, 0) != 0) 3.835 ++ { 3.836 ++ printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n"); 3.837 ++ exit (1); 3.838 ++ } 3.839 ++ if (mpfr_cmp_ui (x, (c++, 0)) != 0) 3.840 ++ { 3.841 ++ printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n"); 3.842 ++ exit (1); 3.843 ++ } 3.844 ++ if (c != 1) 3.845 ++ { 3.846 ++ printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n" 3.847 ++ "(c = %d instead of 1)\n", c); 3.848 ++ exit (1); 3.849 ++ } 3.850 ++ if (mpfr_cmp_si (x, 0) != 0) 3.851 ++ { 3.852 ++ printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n"); 3.853 ++ exit (1); 3.854 ++ } 3.855 ++ if (mpfr_cmp_si (x, (c++, 0)) != 0) 3.856 ++ { 3.857 ++ printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n"); 3.858 ++ exit (1); 3.859 ++ } 3.860 ++ if (c != 2) 3.861 ++ { 3.862 ++ printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n" 3.863 ++ "(c = %d instead of 2)\n", c); 3.864 ++ exit (1); 3.865 ++ } 3.866 ++ 3.867 ++ mpfr_clear (x); 3.868 ++} 3.869 ++ 3.870 ++/* Bug in r7114 */ 3.871 ++static void 3.872 ++test_macros (void) 3.873 ++{ 3.874 ++ mpfr_t x[3]; 3.875 ++ mpfr_ptr p; 3.876 ++ 3.877 ++ mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0); 3.878 ++ mpfr_set_ui (x[0], 0, MPFR_RNDN); 3.879 ++ p = x[0]; 3.880 ++ if (mpfr_cmp_ui (p++, 0) != 0) 3.881 ++ { 3.882 ++ printf ("Error in mpfr_cmp_ui macro: result should be 0.\n"); 3.883 ++ exit (1); 3.884 ++ } 3.885 ++ if (p != x[1]) 3.886 ++ { 3.887 ++ printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n", 3.888 ++ (int) (p - x[0])); 3.889 ++ exit (1); 3.890 ++ } 3.891 ++ p = x[0]; 3.892 ++ if (mpfr_cmp_si (p++, 0) != 0) 3.893 ++ { 3.894 ++ printf ("Error in mpfr_cmp_si macro: result should be 0.\n"); 3.895 ++ exit (1); 3.896 ++ } 3.897 ++ if (p != x[1]) 3.898 ++ { 3.899 ++ printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n", 3.900 ++ (int) (p - x[0])); 3.901 ++ exit (1); 3.902 ++ } 3.903 ++ mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0); 3.904 ++} 3.905 ++ 3.906 + int 3.907 + main (void) 3.908 + { 3.909 +@@ -216,6 +336,8 @@ 3.910 + mpfr_clear (x); 3.911 + 3.912 + check_nan (); 3.913 ++ check_macros (); 3.914 ++ test_macros (); 3.915 + 3.916 + tests_end_mpfr (); 3.917 + return 0; 3.918 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.919 +--- mpfr-3.0.0-a/version.c 2010-07-10 00:11:53.000000000 +0000 3.920 ++++ mpfr-3.0.0-b/version.c 2010-09-07 08:46:06.000000000 +0000 3.921 +@@ -25,5 +25,5 @@ 3.922 + const char * 3.923 + mpfr_get_version (void) 3.924 + { 3.925 +- return "3.0.0-p3"; 3.926 ++ return "3.0.0-p4"; 3.927 + } 3.928 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.929 +--- mpfr-3.0.0-a/PATCHES 2010-10-21 20:28:38.000000000 +0000 3.930 ++++ mpfr-3.0.0-b/PATCHES 2010-10-21 20:28:38.000000000 +0000 3.931 +@@ -0,0 +1 @@ 3.932 ++tcan_round 3.933 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.934 +--- mpfr-3.0.0-a/VERSION 2010-09-07 08:46:06.000000000 +0000 3.935 ++++ mpfr-3.0.0-b/VERSION 2010-10-21 20:28:38.000000000 +0000 3.936 +@@ -1 +1 @@ 3.937 +-3.0.0-p4 3.938 ++3.0.0-p5 3.939 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.940 +--- mpfr-3.0.0-a/mpfr.h 2010-09-07 08:46:06.000000000 +0000 3.941 ++++ mpfr-3.0.0-b/mpfr.h 2010-10-21 20:28:38.000000000 +0000 3.942 +@@ -27,7 +27,7 @@ 3.943 + #define MPFR_VERSION_MAJOR 3 3.944 + #define MPFR_VERSION_MINOR 0 3.945 + #define MPFR_VERSION_PATCHLEVEL 0 3.946 +-#define MPFR_VERSION_STRING "3.0.0-p4" 3.947 ++#define MPFR_VERSION_STRING "3.0.0-p5" 3.948 + 3.949 + /* Macros dealing with MPFR VERSION */ 3.950 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.951 +diff -Naurd mpfr-3.0.0-a/tests/tcan_round.c mpfr-3.0.0-b/tests/tcan_round.c 3.952 +--- mpfr-3.0.0-a/tests/tcan_round.c 2010-06-10 11:00:13.000000000 +0000 3.953 ++++ mpfr-3.0.0-b/tests/tcan_round.c 2010-10-21 20:28:38.000000000 +0000 3.954 +@@ -41,7 +41,7 @@ 3.955 + /* avoid mpn_random which leaks memory */ 3.956 + for (i = 0; i < n; i++) 3.957 + buf[i] = randlimb (); 3.958 +- p = (mpfr_prec_t) randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN; 3.959 ++ p = randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN; 3.960 + err = p + randlimb () % GMP_NUMB_BITS; 3.961 + r1 = mpfr_round_p (buf, n, err, p); 3.962 + r2 = mpfr_can_round_raw (buf, n, MPFR_SIGN_POS, err, 3.963 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.964 +--- mpfr-3.0.0-a/version.c 2010-09-07 08:46:06.000000000 +0000 3.965 ++++ mpfr-3.0.0-b/version.c 2010-10-21 20:28:38.000000000 +0000 3.966 +@@ -25,5 +25,5 @@ 3.967 + const char * 3.968 + mpfr_get_version (void) 3.969 + { 3.970 +- return "3.0.0-p4"; 3.971 ++ return "3.0.0-p5"; 3.972 + } 3.973 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.974 +--- mpfr-3.0.0-a/PATCHES 2010-10-21 20:59:32.000000000 +0000 3.975 ++++ mpfr-3.0.0-b/PATCHES 2010-10-21 20:59:32.000000000 +0000 3.976 +@@ -0,0 +1 @@ 3.977 ++mpfr_sub1 3.978 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.979 +--- mpfr-3.0.0-a/VERSION 2010-10-21 20:28:38.000000000 +0000 3.980 ++++ mpfr-3.0.0-b/VERSION 2010-10-21 20:59:32.000000000 +0000 3.981 +@@ -1 +1 @@ 3.982 +-3.0.0-p5 3.983 ++3.0.0-p6 3.984 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.985 +--- mpfr-3.0.0-a/mpfr.h 2010-10-21 20:28:38.000000000 +0000 3.986 ++++ mpfr-3.0.0-b/mpfr.h 2010-10-21 20:59:32.000000000 +0000 3.987 +@@ -27,7 +27,7 @@ 3.988 + #define MPFR_VERSION_MAJOR 3 3.989 + #define MPFR_VERSION_MINOR 0 3.990 + #define MPFR_VERSION_PATCHLEVEL 0 3.991 +-#define MPFR_VERSION_STRING "3.0.0-p5" 3.992 ++#define MPFR_VERSION_STRING "3.0.0-p6" 3.993 + 3.994 + /* Macros dealing with MPFR VERSION */ 3.995 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.996 +diff -Naurd mpfr-3.0.0-a/sub1.c mpfr-3.0.0-b/sub1.c 3.997 +--- mpfr-3.0.0-a/sub1.c 2010-06-10 11:00:14.000000000 +0000 3.998 ++++ mpfr-3.0.0-b/sub1.c 2010-10-21 20:59:32.000000000 +0000 3.999 +@@ -37,7 +37,9 @@ 3.1000 + mp_size_t cancel2, an, bn, cn, cn0; 3.1001 + mp_limb_t *ap, *bp, *cp; 3.1002 + mp_limb_t carry, bb, cc, borrow = 0; 3.1003 +- int inexact, shift_b, shift_c, is_exact = 1, down = 0, add_exp = 0; 3.1004 ++ int inexact, shift_b, shift_c, add_exp = 0; 3.1005 ++ int cmp_low = 0; /* used for rounding to nearest: 0 if low(b) = low(c), 3.1006 ++ negative if low(b) < low(c), positive if low(b)>low(c) */ 3.1007 + int sh, k; 3.1008 + MPFR_TMP_DECL(marker); 3.1009 + 3.1010 +@@ -196,7 +198,8 @@ 3.1011 + } 3.1012 + 3.1013 + #ifdef DEBUG 3.1014 +- printf ("shift_b=%d shift_c=%d diffexp=%lu\n", shift_b, shift_c, 3.1015 ++ printf ("rnd=%s shift_b=%d shift_c=%d diffexp=%lu\n", 3.1016 ++ mpfr_print_rnd_mode (rnd_mode), shift_b, shift_c, 3.1017 + (unsigned long) diff_exp); 3.1018 + #endif 3.1019 + 3.1020 +@@ -307,17 +310,18 @@ 3.1021 + { 3.1022 + if (MPFR_LIKELY(sh)) 3.1023 + { 3.1024 +- is_exact = (carry == 0); 3.1025 + /* can decide except when carry = 2^(sh-1) [middle] 3.1026 + or carry = 0 [truncate, but cannot decide inexact flag] */ 3.1027 +- down = (carry < (MPFR_LIMB_ONE << (sh - 1))); 3.1028 + if (carry > (MPFR_LIMB_ONE << (sh - 1))) 3.1029 + goto add_one_ulp; 3.1030 +- else if ((0 < carry) && down) 3.1031 ++ else if ((0 < carry) && (carry < (MPFR_LIMB_ONE << (sh - 1)))) 3.1032 + { 3.1033 + inexact = -1; /* result if smaller than exact value */ 3.1034 + goto truncate; 3.1035 + } 3.1036 ++ /* now carry = 2^(sh-1), in which case cmp_low=2, 3.1037 ++ or carry = 0, in which case cmp_low=0 */ 3.1038 ++ cmp_low = (carry == 0) ? 0 : 2; 3.1039 + } 3.1040 + } 3.1041 + else /* directed rounding: set rnd_mode to RNDZ iff toward zero */ 3.1042 +@@ -344,12 +348,32 @@ 3.1043 + cn -= (long int) an + cancel2; 3.1044 + 3.1045 + #ifdef DEBUG 3.1046 +- printf ("last %d bits from a are %lu, bn=%ld, cn=%ld\n", 3.1047 ++ printf ("last sh=%d bits from a are %lu, bn=%ld, cn=%ld\n", 3.1048 + sh, (unsigned long) carry, (long) bn, (long) cn); 3.1049 + #endif 3.1050 + 3.1051 ++ /* for rounding to nearest, we couldn't conclude up to here in the following 3.1052 ++ cases: 3.1053 ++ 1. sh = 0, then cmp_low=0: we can either truncate, subtract one ulp 3.1054 ++ or add one ulp: -1 ulp < low(b)-low(c) < 1 ulp 3.1055 ++ 2. sh > 0 but the low sh bits from high(b)-high(c) equal 2^(sh-1): 3.1056 ++ -0.5 ulp <= -1/2^sh < low(b)-low(c)-0.5 < 1/2^sh <= 0.5 ulp 3.1057 ++ we can't decide the rounding, in that case cmp_low=2: 3.1058 ++ either we truncate and flag=-1, or we add one ulp and flag=1 3.1059 ++ 3. the low sh>0 bits from high(b)-high(c) equal 0: we know we have to 3.1060 ++ truncate but we can't decide the ternary value, here cmp_low=0: 3.1061 ++ -0.5 ulp <= -1/2^sh < low(b)-low(c) < 1/2^sh <= 0.5 ulp 3.1062 ++ we always truncate and inexact can be any of -1,0,1 3.1063 ++ */ 3.1064 ++ 3.1065 ++ /* note: here cn might exceed cn0, in which case we consider a zero limb */ 3.1066 + for (k = 0; (bn > 0) || (cn > 0); k = 1) 3.1067 + { 3.1068 ++ /* if cmp_low < 0, we know low(b) - low(c) < 0 3.1069 ++ if cmp_low > 0, we know low(b) - low(c) > 0 3.1070 ++ (more precisely if cmp_low = 2, low(b) - low(c) = 0.5 ulp so far) 3.1071 ++ if cmp_low = 0, so far low(b) - low(c) = 0 */ 3.1072 ++ 3.1073 + /* get next limbs */ 3.1074 + bb = (bn > 0) ? bp[--bn] : 0; 3.1075 + if ((cn > 0) && (cn-- <= cn0)) 3.1076 +@@ -357,76 +381,115 @@ 3.1077 + else 3.1078 + cc = 0; 3.1079 + 3.1080 +- /* down is set when low(b) < low(c) */ 3.1081 +- if (down == 0) 3.1082 +- down = (bb < cc); 3.1083 ++ /* cmp_low compares low(b) and low(c) */ 3.1084 ++ if (cmp_low == 0) /* case 1 or 3 */ 3.1085 ++ cmp_low = (bb < cc) ? -2+k : (bb > cc) ? 1 : 0; 3.1086 ++ 3.1087 ++ /* Case 1 for k=0 splits into 7 subcases: 3.1088 ++ 1a: bb > cc + half 3.1089 ++ 1b: bb = cc + half 3.1090 ++ 1c: 0 < bb - cc < half 3.1091 ++ 1d: bb = cc 3.1092 ++ 1e: -half < bb - cc < 0 3.1093 ++ 1f: bb - cc = -half 3.1094 ++ 1g: bb - cc < -half 3.1095 ++ 3.1096 ++ Case 2 splits into 3 subcases: 3.1097 ++ 2a: bb > cc 3.1098 ++ 2b: bb = cc 3.1099 ++ 2c: bb < cc 3.1100 ++ 3.1101 ++ Case 3 splits into 3 subcases: 3.1102 ++ 3a: bb > cc 3.1103 ++ 3b: bb = cc 3.1104 ++ 3c: bb < cc 3.1105 ++ */ 3.1106 + 3.1107 + /* the case rounding to nearest with sh=0 is special since one couldn't 3.1108 + subtract above 1/2 ulp in the trailing limb of the result */ 3.1109 +- if ((rnd_mode == MPFR_RNDN) && sh == 0 && k == 0) 3.1110 ++ if (rnd_mode == MPFR_RNDN && sh == 0 && k == 0) /* case 1 for k=0 */ 3.1111 + { 3.1112 + mp_limb_t half = MPFR_LIMB_HIGHBIT; 3.1113 + 3.1114 +- is_exact = (bb == cc); 3.1115 +- 3.1116 + /* add one ulp if bb > cc + half 3.1117 + truncate if cc - half < bb < cc + half 3.1118 + sub one ulp if bb < cc - half 3.1119 + */ 3.1120 + 3.1121 +- if (down) 3.1122 ++ if (cmp_low < 0) /* bb < cc: -1 ulp < low(b) - low(c) < 0, 3.1123 ++ cases 1e, 1f and 1g */ 3.1124 + { 3.1125 + if (cc >= half) 3.1126 + cc -= half; 3.1127 +- else 3.1128 ++ else /* since bb < cc < half, bb+half < 2*half */ 3.1129 + bb += half; 3.1130 ++ /* now we have bb < cc + half: 3.1131 ++ we have to subtract one ulp if bb < cc, 3.1132 ++ and truncate if bb > cc */ 3.1133 + } 3.1134 +- else /* bb >= cc */ 3.1135 ++ else if (cmp_low >= 0) /* bb >= cc, cases 1a to 1d */ 3.1136 + { 3.1137 + if (cc < half) 3.1138 + cc += half; 3.1139 +- else 3.1140 ++ else /* since bb >= cc >= half, bb - half >= 0 */ 3.1141 + bb -= half; 3.1142 ++ /* now we have bb > cc - half: we have to add one ulp if bb > cc, 3.1143 ++ and truncate if bb < cc */ 3.1144 ++ if (cmp_low > 0) 3.1145 ++ cmp_low = 2; 3.1146 + } 3.1147 + } 3.1148 + 3.1149 + #ifdef DEBUG 3.1150 +- printf (" bb=%lu cc=%lu down=%d is_exact=%d\n", 3.1151 +- (unsigned long) bb, (unsigned long) cc, down, is_exact); 3.1152 ++ printf ("k=%u bb=%lu cc=%lu cmp_low=%d\n", k, 3.1153 ++ (unsigned long) bb, (unsigned long) cc, cmp_low); 3.1154 + #endif 3.1155 +- if (bb < cc) 3.1156 ++ if (cmp_low < 0) /* low(b) - low(c) < 0: either truncate or subtract 3.1157 ++ one ulp */ 3.1158 + { 3.1159 + if (rnd_mode == MPFR_RNDZ) 3.1160 +- goto sub_one_ulp; 3.1161 ++ goto sub_one_ulp; /* set inexact=-1 */ 3.1162 + else if (rnd_mode != MPFR_RNDN) /* round away */ 3.1163 + { 3.1164 + inexact = 1; 3.1165 + goto truncate; 3.1166 + } 3.1167 +- else /* round to nearest: special case here since for sh=k=0 3.1168 +- bb = bb0 - MPFR_LIMB_HIGHBIT */ 3.1169 ++ else /* round to nearest */ 3.1170 + { 3.1171 +- if (is_exact && sh == 0) 3.1172 +- { 3.1173 +- /* For k=0 we can't decide exactness since it may depend 3.1174 +- from low order bits. 3.1175 +- For k=1, the first low limbs matched: low(b)-low(c)<0. */ 3.1176 +- if (k) 3.1177 +- { 3.1178 +- inexact = 1; 3.1179 +- goto truncate; 3.1180 +- } 3.1181 +- } 3.1182 +- else if (down && sh == 0) 3.1183 +- goto sub_one_ulp; 3.1184 +- else 3.1185 +- { 3.1186 +- inexact = (is_exact) ? 1 : -1; 3.1187 ++ /* If cmp_low < 0 and bb > cc, then -0.5 ulp < low(b)-low(c) < 0, 3.1188 ++ whatever the value of sh. 3.1189 ++ If sh>0, then cmp_low < 0 implies that the initial neglected 3.1190 ++ sh bits were 0 (otherwise cmp_low=2 initially), thus the 3.1191 ++ weight of the new bits is less than 0.5 ulp too. 3.1192 ++ If k > 0 (and sh=0) this means that either the first neglected 3.1193 ++ limbs bb and cc were equal (thus cmp_low was 0 for k=0), 3.1194 ++ or we had bb - cc = -0.5 ulp or 0.5 ulp. 3.1195 ++ The last case is not possible here since we would have 3.1196 ++ cmp_low > 0 which is sticky. 3.1197 ++ In the first case (where we have cmp_low = -1), we truncate, 3.1198 ++ whereas in the 2nd case we have cmp_low = -2 and we subtract 3.1199 ++ one ulp. 3.1200 ++ */ 3.1201 ++ if (bb > cc || sh > 0 || cmp_low == -1) 3.1202 ++ { /* -0.5 ulp < low(b)-low(c) < 0, 3.1203 ++ bb > cc corresponds to cases 1e and 1f1 3.1204 ++ sh > 0 corresponds to cases 3c and 3b3 3.1205 ++ cmp_low = -1 corresponds to case 1d3 (also 3b3) */ 3.1206 ++ inexact = 1; 3.1207 + goto truncate; 3.1208 + } 3.1209 ++ else if (bb < cc) /* here sh = 0 and low(b)-low(c) < -0.5 ulp, 3.1210 ++ this corresponds to cases 1g and 1f3 */ 3.1211 ++ goto sub_one_ulp; 3.1212 ++ /* the only case where we can't conclude is sh=0 and bb=cc, 3.1213 ++ i.e., we have low(b) - low(c) = -0.5 ulp (up to now), thus 3.1214 ++ we don't know if we must truncate or subtract one ulp. 3.1215 ++ Note: for sh=0 we can't have low(b) - low(c) = -0.5 ulp up to 3.1216 ++ now, since low(b) - low(c) > 1/2^sh */ 3.1217 + } 3.1218 + } 3.1219 +- else if (bb > cc) 3.1220 ++ else if (cmp_low > 0) /* 0 < low(b) - low(c): either truncate or 3.1221 ++ add one ulp */ 3.1222 + { 3.1223 + if (rnd_mode == MPFR_RNDZ) 3.1224 + { 3.1225 +@@ -437,34 +500,70 @@ 3.1226 + goto add_one_ulp; 3.1227 + else /* round to nearest */ 3.1228 + { 3.1229 +- if (is_exact) 3.1230 ++ if (bb > cc) 3.1231 + { 3.1232 +- inexact = -1; 3.1233 +- goto truncate; 3.1234 ++ /* if sh=0, then bb>cc means that low(b)-low(c) > 0.5 ulp, 3.1235 ++ and similarly when cmp_low=2 */ 3.1236 ++ if (cmp_low == 2) /* cases 1a, 1b1, 2a and 2b1 */ 3.1237 ++ goto add_one_ulp; 3.1238 ++ /* sh > 0 and cmp_low > 0: this implies that the sh initial 3.1239 ++ neglected bits were 0, and the remaining low(b)-low(c)>0, 3.1240 ++ but its weight is less than 0.5 ulp */ 3.1241 ++ else /* 0 < low(b) - low(c) < 0.5 ulp, this corresponds to 3.1242 ++ cases 3a, 1d1 and 3b1 */ 3.1243 ++ { 3.1244 ++ inexact = -1; 3.1245 ++ goto truncate; 3.1246 ++ } 3.1247 + } 3.1248 +- else if (down) 3.1249 ++ else if (bb < cc) /* 0 < low(b) - low(c) < 0.5 ulp, cases 1c, 3.1250 ++ 1b3, 2b3 and 2c */ 3.1251 + { 3.1252 +- inexact = 1; 3.1253 ++ inexact = -1; 3.1254 + goto truncate; 3.1255 + } 3.1256 +- else 3.1257 +- goto add_one_ulp; 3.1258 ++ /* the only case where we can't conclude is bb=cc, i.e., 3.1259 ++ low(b) - low(c) = 0.5 ulp (up to now), thus we don't know 3.1260 ++ if we must truncate or add one ulp. */ 3.1261 + } 3.1262 + } 3.1263 ++ /* after k=0, we cannot conclude in the following cases, we split them 3.1264 ++ according to the values of bb and cc for k=1: 3.1265 ++ 1b. sh=0 and cmp_low = 1 and bb-cc = half [around 0.5 ulp] 3.1266 ++ 1b1. bb > cc: add one ulp, inex = 1 3.1267 ++ 1b2: bb = cc: cannot conclude 3.1268 ++ 1b3: bb < cc: truncate, inex = -1 3.1269 ++ 1d. sh=0 and cmp_low = 0 and bb-cc = 0 [around 0] 3.1270 ++ 1d1: bb > cc: truncate, inex = -1 3.1271 ++ 1d2: bb = cc: cannot conclude 3.1272 ++ 1d3: bb < cc: truncate, inex = +1 3.1273 ++ 1f. sh=0 and cmp_low = -1 and bb-cc = -half [around -0.5 ulp] 3.1274 ++ 1f1: bb > cc: truncate, inex = +1 3.1275 ++ 1f2: bb = cc: cannot conclude 3.1276 ++ 1f3: bb < cc: sub one ulp, inex = -1 3.1277 ++ 2b. sh > 0 and cmp_low = 2 and bb=cc [around 0.5 ulp] 3.1278 ++ 2b1. bb > cc: add one ulp, inex = 1 3.1279 ++ 2b2: bb = cc: cannot conclude 3.1280 ++ 2b3: bb < cc: truncate, inex = -1 3.1281 ++ 3b. sh > 0 and cmp_low = 0 [around 0] 3.1282 ++ 3b1. bb > cc: truncate, inex = -1 3.1283 ++ 3b2: bb = cc: cannot conclude 3.1284 ++ 3b3: bb < cc: truncate, inex = +1 3.1285 ++ */ 3.1286 + } 3.1287 + 3.1288 +- if ((rnd_mode == MPFR_RNDN) && !is_exact) 3.1289 ++ if ((rnd_mode == MPFR_RNDN) && cmp_low != 0) 3.1290 + { 3.1291 + /* even rounding rule */ 3.1292 + if ((ap[0] >> sh) & 1) 3.1293 + { 3.1294 +- if (down) 3.1295 ++ if (cmp_low < 0) 3.1296 + goto sub_one_ulp; 3.1297 + else 3.1298 + goto add_one_ulp; 3.1299 + } 3.1300 + else 3.1301 +- inexact = (down) ? 1 : -1; 3.1302 ++ inexact = (cmp_low > 0) ? -1 : 1; 3.1303 + } 3.1304 + else 3.1305 + inexact = 0; 3.1306 +diff -Naurd mpfr-3.0.0-a/tests/tfma.c mpfr-3.0.0-b/tests/tfma.c 3.1307 +--- mpfr-3.0.0-a/tests/tfma.c 2010-06-10 11:00:13.000000000 +0000 3.1308 ++++ mpfr-3.0.0-b/tests/tfma.c 2010-10-21 20:59:32.000000000 +0000 3.1309 +@@ -337,6 +337,94 @@ 3.1310 + mpfr_clears (x, y, z, r, (mpfr_ptr) 0); 3.1311 + } 3.1312 + 3.1313 ++static void 3.1314 ++bug20101018 (void) 3.1315 ++{ 3.1316 ++ mpfr_t x, y, z, t, u; 3.1317 ++ int i; 3.1318 ++ 3.1319 ++ mpfr_init2 (x, 64); 3.1320 ++ mpfr_init2 (y, 64); 3.1321 ++ mpfr_init2 (z, 64); 3.1322 ++ mpfr_init2 (t, 64); 3.1323 ++ mpfr_init2 (u, 64); 3.1324 ++ 3.1325 ++ mpfr_set_str (x, "0xf.fffffffffffffffp-14766", 16, MPFR_RNDN); 3.1326 ++ mpfr_set_str (y, "-0xf.fffffffffffffffp+317", 16, MPFR_RNDN); 3.1327 ++ mpfr_set_str (z, "0x8.3ffffffffffe3ffp-14443", 16, MPFR_RNDN); 3.1328 ++ mpfr_set_str (t, "0x8.7ffffffffffc7ffp-14444", 16, MPFR_RNDN); 3.1329 ++ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 3.1330 ++ if (mpfr_cmp (u, t) != 0) 3.1331 ++ { 3.1332 ++ printf ("Wrong result in bug20101018 (a)\n"); 3.1333 ++ printf ("Expected "); 3.1334 ++ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 3.1335 ++ printf ("\nGot "); 3.1336 ++ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 3.1337 ++ printf ("\n"); 3.1338 ++ exit (1); 3.1339 ++ } 3.1340 ++ if (i <= 0) 3.1341 ++ { 3.1342 ++ printf ("Wrong ternary value in bug20101018 (a)\n"); 3.1343 ++ printf ("Expected > 0\n"); 3.1344 ++ printf ("Got %d\n", i); 3.1345 ++ exit (1); 3.1346 ++ } 3.1347 ++ 3.1348 ++ mpfr_set_str (x, "-0xf.fffffffffffffffp-11420", 16, MPFR_RNDN); 3.1349 ++ mpfr_set_str (y, "0xf.fffffffffffffffp+9863", 16, MPFR_RNDN); 3.1350 ++ mpfr_set_str (z, "0x8.fffff80ffffffffp-1551", 16, MPFR_RNDN); 3.1351 ++ mpfr_set_str (t, "0x9.fffff01ffffffffp-1552", 16, MPFR_RNDN); 3.1352 ++ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 3.1353 ++ if (mpfr_cmp (u, t) != 0) 3.1354 ++ { 3.1355 ++ printf ("Wrong result in bug20101018 (b)\n"); 3.1356 ++ printf ("Expected "); 3.1357 ++ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 3.1358 ++ printf ("\nGot "); 3.1359 ++ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 3.1360 ++ printf ("\n"); 3.1361 ++ exit (1); 3.1362 ++ } 3.1363 ++ if (i <= 0) 3.1364 ++ { 3.1365 ++ printf ("Wrong ternary value in bug20101018 (b)\n"); 3.1366 ++ printf ("Expected > 0\n"); 3.1367 ++ printf ("Got %d\n", i); 3.1368 ++ exit (1); 3.1369 ++ } 3.1370 ++ 3.1371 ++ mpfr_set_str (x, "0xf.fffffffffffffffp-2125", 16, MPFR_RNDN); 3.1372 ++ mpfr_set_str (y, "-0xf.fffffffffffffffp-6000", 16, MPFR_RNDN); 3.1373 ++ mpfr_set_str (z, "0x8p-8119", 16, MPFR_RNDN); 3.1374 ++ mpfr_set_str (t, "0x8.000000000000001p-8120", 16, MPFR_RNDN); 3.1375 ++ i = mpfr_fma (u, x, y, z, MPFR_RNDN); 3.1376 ++ if (mpfr_cmp (u, t) != 0) 3.1377 ++ { 3.1378 ++ printf ("Wrong result in bug20101018 (c)\n"); 3.1379 ++ printf ("Expected "); 3.1380 ++ mpfr_out_str (stdout, 16, 0, t, MPFR_RNDN); 3.1381 ++ printf ("\nGot "); 3.1382 ++ mpfr_out_str (stdout, 16, 0, u, MPFR_RNDN); 3.1383 ++ printf ("\n"); 3.1384 ++ exit (1); 3.1385 ++ } 3.1386 ++ if (i <= 0) 3.1387 ++ { 3.1388 ++ printf ("Wrong ternary value in bug20101018 (c)\n"); 3.1389 ++ printf ("Expected > 0\n"); 3.1390 ++ printf ("Got %d\n", i); 3.1391 ++ exit (1); 3.1392 ++ } 3.1393 ++ 3.1394 ++ mpfr_clear (x); 3.1395 ++ mpfr_clear (y); 3.1396 ++ mpfr_clear (z); 3.1397 ++ mpfr_clear (t); 3.1398 ++ mpfr_clear (u); 3.1399 ++} 3.1400 ++ 3.1401 + int 3.1402 + main (int argc, char *argv[]) 3.1403 + { 3.1404 +@@ -345,6 +433,8 @@ 3.1405 + 3.1406 + tests_start_mpfr (); 3.1407 + 3.1408 ++ bug20101018 (); 3.1409 ++ 3.1410 + mpfr_init (x); 3.1411 + mpfr_init (s); 3.1412 + mpfr_init (y); 3.1413 +diff -Naurd mpfr-3.0.0-a/tests/tsub.c mpfr-3.0.0-b/tests/tsub.c 3.1414 +--- mpfr-3.0.0-a/tests/tsub.c 2010-06-10 11:00:13.000000000 +0000 3.1415 ++++ mpfr-3.0.0-b/tests/tsub.c 2010-10-21 20:59:32.000000000 +0000 3.1416 +@@ -201,6 +201,8 @@ 3.1417 + if (mpfr_cmp (z, x)) 3.1418 + { 3.1419 + printf ("Error in mpfr_sub (2)\n"); 3.1420 ++ printf ("Expected "); mpfr_print_binary (x); puts (""); 3.1421 ++ printf ("Got "); mpfr_print_binary (z); puts (""); 3.1422 + exit (1); 3.1423 + } 3.1424 + mpfr_set_str_binary (x, "1.1110111011110001110111011111111111101000011001011100101100101101"); 3.1425 +@@ -478,6 +480,156 @@ 3.1426 + mpfr_clear (u); 3.1427 + } 3.1428 + 3.1429 ++/* Bug found by Jakub Jelinek 3.1430 ++ * http://bugzilla.redhat.com/643657 3.1431 ++ * https://gforge.inria.fr/tracker/index.php?func=detail&aid=11301 3.1432 ++ * The consequence can be either an assertion failure (i = 2 in the 3.1433 ++ * testcase below, in debug mode) or an incorrectly rounded value. 3.1434 ++ */ 3.1435 ++static void 3.1436 ++bug20101017 (void) 3.1437 ++{ 3.1438 ++ mpfr_t a, b, c; 3.1439 ++ int inex; 3.1440 ++ int i; 3.1441 ++ 3.1442 ++ mpfr_init2 (a, GMP_NUMB_BITS * 2); 3.1443 ++ mpfr_init2 (b, GMP_NUMB_BITS); 3.1444 ++ mpfr_init2 (c, GMP_NUMB_BITS); 3.1445 ++ 3.1446 ++ /* a = 2^(2N) + k.2^(2N-1) + 2^N and b = 1 3.1447 ++ with N = GMP_NUMB_BITS and k = 0 or 1. 3.1448 ++ c = a - b should round to the same value as a. */ 3.1449 ++ 3.1450 ++ for (i = 2; i <= 3; i++) 3.1451 ++ { 3.1452 ++ mpfr_set_ui_2exp (a, i, GMP_NUMB_BITS - 1, MPFR_RNDN); 3.1453 ++ mpfr_add_ui (a, a, 1, MPFR_RNDN); 3.1454 ++ mpfr_mul_2ui (a, a, GMP_NUMB_BITS, MPFR_RNDN); 3.1455 ++ mpfr_set_ui (b, 1, MPFR_RNDN); 3.1456 ++ inex = mpfr_sub (c, a, b, MPFR_RNDN); 3.1457 ++ mpfr_set (b, a, MPFR_RNDN); 3.1458 ++ if (! mpfr_equal_p (c, b)) 3.1459 ++ { 3.1460 ++ printf ("Error in bug20101017 for i = %d.\n", i); 3.1461 ++ printf ("Expected "); 3.1462 ++ mpfr_out_str (stdout, 16, 0, b, MPFR_RNDN); 3.1463 ++ putchar ('\n'); 3.1464 ++ printf ("Got "); 3.1465 ++ mpfr_out_str (stdout, 16, 0, c, MPFR_RNDN); 3.1466 ++ putchar ('\n'); 3.1467 ++ exit (1); 3.1468 ++ } 3.1469 ++ if (inex >= 0) 3.1470 ++ { 3.1471 ++ printf ("Error in bug20101017 for i = %d: bad inex value.\n", i); 3.1472 ++ printf ("Expected negative, got %d.\n", inex); 3.1473 ++ exit (1); 3.1474 ++ } 3.1475 ++ } 3.1476 ++ 3.1477 ++ mpfr_set_prec (a, 64); 3.1478 ++ mpfr_set_prec (b, 129); 3.1479 ++ mpfr_set_prec (c, 2); 3.1480 ++ mpfr_set_str_binary (b, "0.100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001E65"); 3.1481 ++ mpfr_set_str_binary (c, "0.10E1"); 3.1482 ++ inex = mpfr_sub (a, b, c, MPFR_RNDN); 3.1483 ++ if (mpfr_cmp_ui_2exp (a, 1, 64) != 0 || inex >= 0) 3.1484 ++ { 3.1485 ++ printf ("Error in mpfr_sub for b-c for b=2^64+1+2^(-64), c=1\n"); 3.1486 ++ printf ("Expected result 2^64 with inex < 0\n"); 3.1487 ++ printf ("Got "); mpfr_print_binary (a); 3.1488 ++ printf (" with inex=%d\n", inex); 3.1489 ++ exit (1); 3.1490 ++ } 3.1491 ++ 3.1492 ++ mpfr_clears (a, b, c, (mpfr_ptr) 0); 3.1493 ++} 3.1494 ++ 3.1495 ++/* hard test of rounding */ 3.1496 ++static void 3.1497 ++check_rounding (void) 3.1498 ++{ 3.1499 ++ mpfr_t a, b, c, res; 3.1500 ++ mpfr_prec_t p; 3.1501 ++ long k, l; 3.1502 ++ int i; 3.1503 ++ 3.1504 ++#define MAXKL (2 * GMP_NUMB_BITS) 3.1505 ++ for (p = MPFR_PREC_MIN; p <= GMP_NUMB_BITS; p++) 3.1506 ++ { 3.1507 ++ mpfr_init2 (a, p); 3.1508 ++ mpfr_init2 (res, p); 3.1509 ++ mpfr_init2 (b, p + 1 + MAXKL); 3.1510 ++ mpfr_init2 (c, MPFR_PREC_MIN); 3.1511 ++ 3.1512 ++ /* b = 2^p + 1 + 2^(-k), c = 2^(-l) */ 3.1513 ++ for (k = 0; k <= MAXKL; k++) 3.1514 ++ for (l = 0; l <= MAXKL; l++) 3.1515 ++ { 3.1516 ++ mpfr_set_ui_2exp (b, 1, p, MPFR_RNDN); 3.1517 ++ mpfr_add_ui (b, b, 1, MPFR_RNDN); 3.1518 ++ mpfr_mul_2ui (b, b, k, MPFR_RNDN); 3.1519 ++ mpfr_add_ui (b, b, 1, MPFR_RNDN); 3.1520 ++ mpfr_div_2ui (b, b, k, MPFR_RNDN); 3.1521 ++ mpfr_set_ui_2exp (c, 1, -l, MPFR_RNDN); 3.1522 ++ i = mpfr_sub (a, b, c, MPFR_RNDN); 3.1523 ++ /* b - c = 2^p + 1 + 2^(-k) - 2^(-l), should be rounded to 3.1524 ++ 2^p for l <= k, and 2^p+2 for l < k */ 3.1525 ++ if (l <= k) 3.1526 ++ { 3.1527 ++ if (mpfr_cmp_ui_2exp (a, 1, p) != 0) 3.1528 ++ { 3.1529 ++ printf ("Wrong result in check_rounding\n"); 3.1530 ++ printf ("p=%lu k=%ld l=%ld\n", p, k, l); 3.1531 ++ printf ("b="); mpfr_print_binary (b); puts (""); 3.1532 ++ printf ("c="); mpfr_print_binary (c); puts (""); 3.1533 ++ printf ("Expected 2^%lu\n", p); 3.1534 ++ printf ("Got "); mpfr_print_binary (a); puts (""); 3.1535 ++ exit (1); 3.1536 ++ } 3.1537 ++ if (i >= 0) 3.1538 ++ { 3.1539 ++ printf ("Wrong ternary value in check_rounding\n"); 3.1540 ++ printf ("p=%lu k=%ld l=%ld\n", p, k, l); 3.1541 ++ printf ("b="); mpfr_print_binary (b); puts (""); 3.1542 ++ printf ("c="); mpfr_print_binary (c); puts (""); 3.1543 ++ printf ("a="); mpfr_print_binary (a); puts (""); 3.1544 ++ printf ("Expected < 0, got %d\n", i); 3.1545 ++ exit (1); 3.1546 ++ } 3.1547 ++ } 3.1548 ++ else /* l < k */ 3.1549 ++ { 3.1550 ++ mpfr_set_ui_2exp (res, 1, p, MPFR_RNDN); 3.1551 ++ mpfr_add_ui (res, res, 2, MPFR_RNDN); 3.1552 ++ if (mpfr_cmp (a, res) != 0) 3.1553 ++ { 3.1554 ++ printf ("Wrong result in check_rounding\n"); 3.1555 ++ printf ("b="); mpfr_print_binary (b); puts (""); 3.1556 ++ printf ("c="); mpfr_print_binary (c); puts (""); 3.1557 ++ printf ("Expected "); mpfr_print_binary (res); puts (""); 3.1558 ++ printf ("Got "); mpfr_print_binary (a); puts (""); 3.1559 ++ exit (1); 3.1560 ++ } 3.1561 ++ if (i <= 0) 3.1562 ++ { 3.1563 ++ printf ("Wrong ternary value in check_rounding\n"); 3.1564 ++ printf ("b="); mpfr_print_binary (b); puts (""); 3.1565 ++ printf ("c="); mpfr_print_binary (c); puts (""); 3.1566 ++ printf ("Expected > 0, got %d\n", i); 3.1567 ++ exit (1); 3.1568 ++ } 3.1569 ++ } 3.1570 ++ } 3.1571 ++ 3.1572 ++ mpfr_clear (a); 3.1573 ++ mpfr_clear (res); 3.1574 ++ mpfr_clear (b); 3.1575 ++ mpfr_clear (c); 3.1576 ++ } 3.1577 ++} 3.1578 ++ 3.1579 + #define TEST_FUNCTION test_sub 3.1580 + #define TWO_ARGS 3.1581 + #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS) 3.1582 +@@ -491,6 +643,8 @@ 3.1583 + 3.1584 + tests_start_mpfr (); 3.1585 + 3.1586 ++ bug20101017 (); 3.1587 ++ check_rounding (); 3.1588 + check_diverse (); 3.1589 + check_inexact (); 3.1590 + bug_ddefour (); 3.1591 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.1592 +--- mpfr-3.0.0-a/version.c 2010-10-21 20:28:38.000000000 +0000 3.1593 ++++ mpfr-3.0.0-b/version.c 2010-10-21 20:59:32.000000000 +0000 3.1594 +@@ -25,5 +25,5 @@ 3.1595 + const char * 3.1596 + mpfr_get_version (void) 3.1597 + { 3.1598 +- return "3.0.0-p5"; 3.1599 ++ return "3.0.0-p6"; 3.1600 + } 3.1601 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.1602 +--- mpfr-3.0.0-a/PATCHES 2010-10-21 21:18:26.000000000 +0000 3.1603 ++++ mpfr-3.0.0-b/PATCHES 2010-10-21 21:18:26.000000000 +0000 3.1604 +@@ -0,0 +1 @@ 3.1605 ++mpfr_set_ld 3.1606 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.1607 +--- mpfr-3.0.0-a/VERSION 2010-10-21 20:59:32.000000000 +0000 3.1608 ++++ mpfr-3.0.0-b/VERSION 2010-10-21 21:18:26.000000000 +0000 3.1609 +@@ -1 +1 @@ 3.1610 +-3.0.0-p6 3.1611 ++3.0.0-p7 3.1612 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.1613 +--- mpfr-3.0.0-a/mpfr.h 2010-10-21 20:59:32.000000000 +0000 3.1614 ++++ mpfr-3.0.0-b/mpfr.h 2010-10-21 21:18:26.000000000 +0000 3.1615 +@@ -27,7 +27,7 @@ 3.1616 + #define MPFR_VERSION_MAJOR 3 3.1617 + #define MPFR_VERSION_MINOR 0 3.1618 + #define MPFR_VERSION_PATCHLEVEL 0 3.1619 +-#define MPFR_VERSION_STRING "3.0.0-p6" 3.1620 ++#define MPFR_VERSION_STRING "3.0.0-p7" 3.1621 + 3.1622 + /* Macros dealing with MPFR VERSION */ 3.1623 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.1624 +diff -Naurd mpfr-3.0.0-a/set_ld.c mpfr-3.0.0-b/set_ld.c 3.1625 +--- mpfr-3.0.0-a/set_ld.c 2010-06-10 11:00:14.000000000 +0000 3.1626 ++++ mpfr-3.0.0-b/set_ld.c 2010-10-21 21:18:26.000000000 +0000 3.1627 +@@ -102,21 +102,25 @@ 3.1628 + { 3.1629 + x /= div13; /* exact */ 3.1630 + shift_exp += 8192; 3.1631 ++ mpfr_div_2si (t, t, 8192, MPFR_RNDZ); 3.1632 + } 3.1633 + if (ABS (x) >= div12) 3.1634 + { 3.1635 + x /= div12; /* exact */ 3.1636 + shift_exp += 4096; 3.1637 ++ mpfr_div_2si (t, t, 4096, MPFR_RNDZ); 3.1638 + } 3.1639 + if (ABS (x) >= div11) 3.1640 + { 3.1641 + x /= div11; /* exact */ 3.1642 + shift_exp += 2048; 3.1643 ++ mpfr_div_2si (t, t, 2048, MPFR_RNDZ); 3.1644 + } 3.1645 + if (ABS (x) >= div10) 3.1646 + { 3.1647 + x /= div10; /* exact */ 3.1648 + shift_exp += 1024; 3.1649 ++ mpfr_div_2si (t, t, 1024, MPFR_RNDZ); 3.1650 + } 3.1651 + /* warning: we may have DBL_MAX=2^1024*(1-2^(-53)) < x < 2^1024, 3.1652 + therefore we have one extra exponent reduction step */ 3.1653 +@@ -124,9 +128,10 @@ 3.1654 + { 3.1655 + x /= div9; /* exact */ 3.1656 + shift_exp += 512; 3.1657 ++ mpfr_div_2si (t, t, 512, MPFR_RNDZ); 3.1658 + } 3.1659 + } /* Check overflow of double */ 3.1660 +- else 3.1661 ++ else /* no overflow on double */ 3.1662 + { 3.1663 + long double div9, div10, div11; 3.1664 + 3.1665 +@@ -149,29 +154,34 @@ 3.1666 + { 3.1667 + x /= div13; /* exact */ 3.1668 + shift_exp -= 8192; 3.1669 ++ mpfr_mul_2si (t, t, 8192, MPFR_RNDZ); 3.1670 + } 3.1671 + if (ABS (x) <= div12) 3.1672 + { 3.1673 + x /= div12; /* exact */ 3.1674 + shift_exp -= 4096; 3.1675 ++ mpfr_mul_2si (t, t, 4096, MPFR_RNDZ); 3.1676 + } 3.1677 + if (ABS (x) <= div11) 3.1678 + { 3.1679 + x /= div11; /* exact */ 3.1680 + shift_exp -= 2048; 3.1681 ++ mpfr_mul_2si (t, t, 2048, MPFR_RNDZ); 3.1682 + } 3.1683 + if (ABS (x) <= div10) 3.1684 + { 3.1685 + x /= div10; /* exact */ 3.1686 + shift_exp -= 1024; 3.1687 ++ mpfr_mul_2si (t, t, 1024, MPFR_RNDZ); 3.1688 + } 3.1689 + if (ABS(x) <= div9) 3.1690 + { 3.1691 + x /= div9; /* exact */ 3.1692 + shift_exp -= 512; 3.1693 ++ mpfr_mul_2si (t, t, 512, MPFR_RNDZ); 3.1694 + } 3.1695 + } 3.1696 +- else 3.1697 ++ else /* no underflow */ 3.1698 + { 3.1699 + inexact = mpfr_set_d (u, (double) x, MPFR_RNDZ); 3.1700 + MPFR_ASSERTD (inexact == 0); 3.1701 +diff -Naurd mpfr-3.0.0-a/tests/tset_ld.c mpfr-3.0.0-b/tests/tset_ld.c 3.1702 +--- mpfr-3.0.0-a/tests/tset_ld.c 2010-06-10 11:00:13.000000000 +0000 3.1703 ++++ mpfr-3.0.0-b/tests/tset_ld.c 2010-10-21 21:18:26.000000000 +0000 3.1704 +@@ -147,12 +147,39 @@ 3.1705 + test_fixed_bugs (void) 3.1706 + { 3.1707 + mpfr_t x; 3.1708 +- long double d; 3.1709 ++ long double l, m; 3.1710 + 3.1711 + /* bug found by Steve Kargl (2009-03-14) */ 3.1712 + mpfr_init2 (x, 64); 3.1713 + mpfr_set_ui_2exp (x, 1, -16447, MPFR_RNDN); 3.1714 +- d = mpfr_get_ld (x, MPFR_RNDN); /* an assertion failed in init2.c:50 */ 3.1715 ++ mpfr_get_ld (x, MPFR_RNDN); /* an assertion failed in init2.c:50 */ 3.1716 ++ 3.1717 ++ /* bug reported by Jakub Jelinek (2010-10-17) 3.1718 ++ https://gforge.inria.fr/tracker/?func=detail&aid=11300 */ 3.1719 ++ mpfr_set_prec (x, MPFR_LDBL_MANT_DIG); 3.1720 ++ /* l = 0x1.23456789abcdef0123456789abcdp-914L; */ 3.1721 ++ l = 8.215640181713713164092636634579e-276; 3.1722 ++ mpfr_set_ld (x, l, MPFR_RNDN); 3.1723 ++ m = mpfr_get_ld (x, MPFR_RNDN); 3.1724 ++ if (m != l) 3.1725 ++ { 3.1726 ++ printf ("Error in get_ld o set_ld for l=%Le\n", l); 3.1727 ++ printf ("Got m=%Le instead of l\n", m); 3.1728 ++ exit (1); 3.1729 ++ } 3.1730 ++ 3.1731 ++ /* another similar test which failed with extended double precision and the 3.1732 ++ generic code for mpfr_set_ld */ 3.1733 ++ /* l = 0x1.23456789abcdef0123456789abcdp-968L; */ 3.1734 ++ l = 4.560596445887084662336528403703e-292; 3.1735 ++ mpfr_set_ld (x, l, MPFR_RNDN); 3.1736 ++ m = mpfr_get_ld (x, MPFR_RNDN); 3.1737 ++ if (m != l) 3.1738 ++ { 3.1739 ++ printf ("Error in get_ld o set_ld for l=%Le\n", l); 3.1740 ++ printf ("Got m=%Le instead of l\n", m); 3.1741 ++ exit (1); 3.1742 ++ } 3.1743 + 3.1744 + mpfr_clear (x); 3.1745 + } 3.1746 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.1747 +--- mpfr-3.0.0-a/version.c 2010-10-21 20:59:32.000000000 +0000 3.1748 ++++ mpfr-3.0.0-b/version.c 2010-10-21 21:18:26.000000000 +0000 3.1749 +@@ -25,5 +25,5 @@ 3.1750 + const char * 3.1751 + mpfr_get_version (void) 3.1752 + { 3.1753 +- return "3.0.0-p6"; 3.1754 ++ return "3.0.0-p7"; 3.1755 + } 3.1756 +diff -Naurd mpfr-3.0.0-a/PATCHES mpfr-3.0.0-b/PATCHES 3.1757 +--- mpfr-3.0.0-a/PATCHES 2010-11-09 15:15:07.000000000 +0000 3.1758 ++++ mpfr-3.0.0-b/PATCHES 2010-11-09 15:15:07.000000000 +0000 3.1759 +@@ -0,0 +1 @@ 3.1760 ++macros 3.1761 +diff -Naurd mpfr-3.0.0-a/VERSION mpfr-3.0.0-b/VERSION 3.1762 +--- mpfr-3.0.0-a/VERSION 2010-10-21 21:18:26.000000000 +0000 3.1763 ++++ mpfr-3.0.0-b/VERSION 2010-11-09 15:15:07.000000000 +0000 3.1764 +@@ -1 +1 @@ 3.1765 +-3.0.0-p7 3.1766 ++3.0.0-p8 3.1767 +diff -Naurd mpfr-3.0.0-a/mpfr.h mpfr-3.0.0-b/mpfr.h 3.1768 +--- mpfr-3.0.0-a/mpfr.h 2010-10-21 21:18:26.000000000 +0000 3.1769 ++++ mpfr-3.0.0-b/mpfr.h 2010-11-09 15:15:07.000000000 +0000 3.1770 +@@ -27,7 +27,7 @@ 3.1771 + #define MPFR_VERSION_MAJOR 3 3.1772 + #define MPFR_VERSION_MINOR 0 3.1773 + #define MPFR_VERSION_PATCHLEVEL 0 3.1774 +-#define MPFR_VERSION_STRING "3.0.0-p7" 3.1775 ++#define MPFR_VERSION_STRING "3.0.0-p8" 3.1776 + 3.1777 + /* Macros dealing with MPFR VERSION */ 3.1778 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 3.1779 +@@ -67,6 +67,16 @@ 3.1780 + # define _MPFR_H_HAVE_INTMAX_T 1 3.1781 + #endif 3.1782 + 3.1783 ++/* Avoid some problems with macro expansion if the user defines macros 3.1784 ++ with the same name as keywords. By convention, identifiers and macro 3.1785 ++ names starting with mpfr_ are reserved by MPFR. */ 3.1786 ++typedef void mpfr_void; 3.1787 ++typedef int mpfr_int; 3.1788 ++typedef unsigned int mpfr_uint; 3.1789 ++typedef long mpfr_long; 3.1790 ++typedef unsigned long mpfr_ulong; 3.1791 ++typedef size_t mpfr_size_t; 3.1792 ++ 3.1793 + /* Definition of rounding modes (DON'T USE MPFR_RNDNA!). 3.1794 + Warning! Changing the contents of this enum should be seen as an 3.1795 + interface change since the old and the new types are not compatible 3.1796 +@@ -136,7 +146,7 @@ 3.1797 + typedef mp_exp_t mpfr_exp_t; 3.1798 + 3.1799 + /* Definition of the standard exponent limits */ 3.1800 +-#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((unsigned long) 1 << 30) - 1)) 3.1801 ++#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((mpfr_ulong) 1 << 30) - 1)) 3.1802 + #define MPFR_EMIN_DEFAULT (-(MPFR_EMAX_DEFAULT)) 3.1803 + 3.1804 + /* Definition of the main structure */ 3.1805 +@@ -725,13 +735,13 @@ 3.1806 + unexpected results with future compilers and aggressive optimisations. 3.1807 + Why not working only with signed types, using INT_MIN and LONG_MIN? */ 3.1808 + #if __GMP_MP_SIZE_T_INT 3.1809 +-#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+2)) 3.1810 +-#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+1)) 3.1811 +-#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+3)) 3.1812 ++#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+2)) 3.1813 ++#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+1)) 3.1814 ++#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(mpfr_uint)0)>>1))+3)) 3.1815 + #else 3.1816 +-#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+2)) 3.1817 +-#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+1)) 3.1818 +-#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+3)) 3.1819 ++#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+2)) 3.1820 ++#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+1)) 3.1821 ++#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(mpfr_ulong)0)>>1))+3)) 3.1822 + #endif 3.1823 + 3.1824 + /* Define MPFR_USE_EXTENSION to avoid "gcc -pedantic" warnings. */ 3.1825 +@@ -760,9 +770,9 @@ 3.1826 + #define mpfr_inf_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_INF) 3.1827 + #define mpfr_zero_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_ZERO) 3.1828 + #define mpfr_regular_p(_x) ((_x)->_mpfr_exp > __MPFR_EXP_INF) 3.1829 +-#define mpfr_sgn(_x) \ 3.1830 +- ((_x)->_mpfr_exp < __MPFR_EXP_INF ? \ 3.1831 +- (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (void) 0), 0 : \ 3.1832 ++#define mpfr_sgn(_x) \ 3.1833 ++ ((_x)->_mpfr_exp < __MPFR_EXP_INF ? \ 3.1834 ++ (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (mpfr_void) 0), 0 : \ 3.1835 + MPFR_SIGN (_x)) 3.1836 + 3.1837 + /* Prevent them from using as lvalues */ 3.1838 +@@ -805,7 +815,19 @@ 3.1839 + Moreover casts to unsigned long have been added to avoid warnings in 3.1840 + programs that use MPFR and are compiled with -Wconversion; such casts 3.1841 + are OK since if X is a constant expression, then (unsigned long) X is 3.1842 +- also a constant expression, so that the optimizations still work. */ 3.1843 ++ also a constant expression, so that the optimizations still work. The 3.1844 ++ warnings are probably related to the following two bugs: 3.1845 ++ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4210 3.1846 ++ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38470 (possibly a variant) 3.1847 ++ and the casts could be removed once these bugs are fixed. 3.1848 ++ Casts shouldn't be used on the generic calls (to the ..._2exp functions), 3.1849 ++ where implicit conversions are performed. Indeed, having at least one 3.1850 ++ implicit conversion in the macro allows the compiler to emit diagnostics 3.1851 ++ when normally expected, for instance in the following call: 3.1852 ++ mpfr_set_ui (x, "foo", MPFR_RNDN); 3.1853 ++ If this is not possible (for future macros), one of the tricks described 3.1854 ++ on http://groups.google.com/group/comp.std.c/msg/e92abd24bf9eaf7b could 3.1855 ++ be used. */ 3.1856 + #if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus) 3.1857 + #if (__GNUC__ >= 2) 3.1858 + #undef mpfr_cmp_ui 3.1859 +@@ -813,45 +835,45 @@ 3.1860 + But warning! mpfr_sgn is specified as a macro in the API, thus the macro 3.1861 + mustn't be used if side effects are possible, like here. */ 3.1862 + #define mpfr_cmp_ui(_f,_u) \ 3.1863 +- (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 3.1864 ++ (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ? \ 3.1865 + (mpfr_sgn) (_f) : \ 3.1866 +- mpfr_cmp_ui_2exp ((_f), (unsigned long) (_u), 0)) 3.1867 ++ mpfr_cmp_ui_2exp ((_f), (_u), 0)) 3.1868 + #undef mpfr_cmp_si 3.1869 +-#define mpfr_cmp_si(_f,_s) \ 3.1870 +- (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 3.1871 +- mpfr_cmp_ui ((_f), (unsigned long) (long) (_s)) : \ 3.1872 +- mpfr_cmp_si_2exp ((_f), (long) (_s), 0)) 3.1873 ++#define mpfr_cmp_si(_f,_s) \ 3.1874 ++ (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ? \ 3.1875 ++ mpfr_cmp_ui ((_f), (mpfr_ulong) (mpfr_long) (_s)) : \ 3.1876 ++ mpfr_cmp_si_2exp ((_f), (_s), 0)) 3.1877 + #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 3.1878 + #undef mpfr_set_ui 3.1879 + #define mpfr_set_ui(_f,_u,_r) \ 3.1880 +- (__builtin_constant_p (_u) && (unsigned long) (_u) == 0 ? \ 3.1881 ++ (__builtin_constant_p (_u) && (mpfr_ulong) (_u) == 0 ? \ 3.1882 + __extension__ ({ \ 3.1883 + mpfr_ptr _p = (_f); \ 3.1884 + _p->_mpfr_sign = 1; \ 3.1885 + _p->_mpfr_exp = __MPFR_EXP_ZERO; \ 3.1886 +- (void) (_r); 0; }) : \ 3.1887 +- mpfr_set_ui_2exp ((_f), (unsigned long) (_u), 0, (_r))) 3.1888 ++ (mpfr_void) (_r); 0; }) : \ 3.1889 ++ mpfr_set_ui_2exp ((_f), (_u), 0, (_r))) 3.1890 + #endif 3.1891 + #undef mpfr_set_si 3.1892 + #define mpfr_set_si(_f,_s,_r) \ 3.1893 +- (__builtin_constant_p (_s) && (long) (_s) >= 0 ? \ 3.1894 +- mpfr_set_ui ((_f), (unsigned long) (long) (_s), (_r)) : \ 3.1895 +- mpfr_set_si_2exp ((_f), (long) (_s), 0, (_r))) 3.1896 ++ (__builtin_constant_p (_s) && (mpfr_long) (_s) >= 0 ? \ 3.1897 ++ mpfr_set_ui ((_f), (mpfr_ulong) (mpfr_long) (_s), (_r)) : \ 3.1898 ++ mpfr_set_si_2exp ((_f), (_s), 0, (_r))) 3.1899 + #endif 3.1900 + #endif 3.1901 + 3.1902 + /* Macro version of mpfr_stack interface for fast access */ 3.1903 +-#define mpfr_custom_get_size(p) ((size_t) \ 3.1904 ++#define mpfr_custom_get_size(p) ((mpfr_size_t) \ 3.1905 + (((p)+GMP_NUMB_BITS-1)/GMP_NUMB_BITS*sizeof (mp_limb_t))) 3.1906 + #define mpfr_custom_init(m,p) do {} while (0) 3.1907 +-#define mpfr_custom_get_significand(x) ((void*)((x)->_mpfr_d)) 3.1908 ++#define mpfr_custom_get_significand(x) ((mpfr_void*)((x)->_mpfr_d)) 3.1909 + #define mpfr_custom_get_exp(x) ((x)->_mpfr_exp) 3.1910 + #define mpfr_custom_move(x,m) do { ((x)->_mpfr_d = (mp_limb_t*)(m)); } while (0) 3.1911 + #define mpfr_custom_init_set(x,k,e,p,m) do { \ 3.1912 + mpfr_ptr _x = (x); \ 3.1913 + mpfr_exp_t _e; \ 3.1914 + mpfr_kind_t _t; \ 3.1915 +- int _s, _k; \ 3.1916 ++ mpfr_int _s, _k; \ 3.1917 + _k = (k); \ 3.1918 + if (_k >= 0) { \ 3.1919 + _t = (mpfr_kind_t) _k; \ 3.1920 +@@ -868,11 +890,13 @@ 3.1921 + _x->_mpfr_exp = _e; \ 3.1922 + _x->_mpfr_d = (mp_limb_t*) (m); \ 3.1923 + } while (0) 3.1924 +-#define mpfr_custom_get_kind(x) \ 3.1925 +- ( (x)->_mpfr_exp > __MPFR_EXP_INF ? (int)MPFR_REGULAR_KIND*MPFR_SIGN (x) \ 3.1926 +- : (x)->_mpfr_exp == __MPFR_EXP_INF ? (int)MPFR_INF_KIND*MPFR_SIGN (x) \ 3.1927 +- : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (int)MPFR_NAN_KIND \ 3.1928 +- : (int) MPFR_ZERO_KIND * MPFR_SIGN (x) ) 3.1929 ++#define mpfr_custom_get_kind(x) \ 3.1930 ++ ( (x)->_mpfr_exp > __MPFR_EXP_INF ? \ 3.1931 ++ (mpfr_int) MPFR_REGULAR_KIND * MPFR_SIGN (x) \ 3.1932 ++ : (x)->_mpfr_exp == __MPFR_EXP_INF ? \ 3.1933 ++ (mpfr_int) MPFR_INF_KIND * MPFR_SIGN (x) \ 3.1934 ++ : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (mpfr_int) MPFR_NAN_KIND \ 3.1935 ++ : (mpfr_int) MPFR_ZERO_KIND * MPFR_SIGN (x) ) 3.1936 + 3.1937 + 3.1938 + #endif /* MPFR_USE_NO_MACRO */ 3.1939 +diff -Naurd mpfr-3.0.0-a/version.c mpfr-3.0.0-b/version.c 3.1940 +--- mpfr-3.0.0-a/version.c 2010-10-21 21:18:26.000000000 +0000 3.1941 ++++ mpfr-3.0.0-b/version.c 2010-11-09 15:15:07.000000000 +0000 3.1942 +@@ -25,5 +25,5 @@ 3.1943 + const char * 3.1944 + mpfr_get_version (void) 3.1945 + { 3.1946 +- return "3.0.0-p7"; 3.1947 ++ return "3.0.0-p8"; 3.1948 + }
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/mpfr/stuff/mpfr-3.0.1.patch Wed May 11 00:48:49 2011 +0200 4.3 @@ -0,0 +1,367 @@ 4.4 +diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES 4.5 +--- mpfr-3.0.1-a/PATCHES 2011-04-12 10:50:02.000000000 +0000 4.6 ++++ mpfr-3.0.1-b/PATCHES 2011-04-12 10:50:02.000000000 +0000 4.7 +@@ -0,0 +1 @@ 4.8 ++asin_exprange 4.9 +diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION 4.10 +--- mpfr-3.0.1-a/VERSION 2011-04-04 10:19:18.000000000 +0000 4.11 ++++ mpfr-3.0.1-b/VERSION 2011-04-12 10:50:02.000000000 +0000 4.12 +@@ -1 +1 @@ 4.13 +-3.0.1 4.14 ++3.0.1-p1 4.15 +diff -Naurd mpfr-3.0.1-a/asin.c mpfr-3.0.1-b/asin.c 4.16 +--- mpfr-3.0.1-a/asin.c 2011-04-04 10:19:18.000000000 +0000 4.17 ++++ mpfr-3.0.1-b/asin.c 2011-04-12 10:50:02.000000000 +0000 4.18 +@@ -63,11 +63,14 @@ 4.19 + 4.20 + compared = mpfr_cmp_ui (xp, 1); 4.21 + 4.22 ++ MPFR_SAVE_EXPO_MARK (expo); 4.23 ++ 4.24 + if (MPFR_UNLIKELY (compared >= 0)) 4.25 + { 4.26 + mpfr_clear (xp); 4.27 + if (compared > 0) /* asin(x) = NaN for |x| > 1 */ 4.28 + { 4.29 ++ MPFR_SAVE_EXPO_FREE (expo); 4.30 + MPFR_SET_NAN (asin); 4.31 + MPFR_RET_NAN; 4.32 + } 4.33 +@@ -80,13 +83,11 @@ 4.34 + inexact = -mpfr_const_pi (asin, MPFR_INVERT_RND(rnd_mode)); 4.35 + MPFR_CHANGE_SIGN (asin); 4.36 + } 4.37 +- mpfr_div_2ui (asin, asin, 1, rnd_mode); /* May underflow */ 4.38 +- return inexact; 4.39 ++ mpfr_div_2ui (asin, asin, 1, rnd_mode); 4.40 + } 4.41 + } 4.42 +- 4.43 +- MPFR_SAVE_EXPO_MARK (expo); 4.44 +- 4.45 ++ else 4.46 ++ { 4.47 + /* Compute exponent of 1 - ABS(x) */ 4.48 + mpfr_ui_sub (xp, 1, xp, MPFR_RNDD); 4.49 + MPFR_ASSERTD (MPFR_GET_EXP (xp) <= 0); 4.50 +@@ -115,6 +116,7 @@ 4.51 + inexact = mpfr_set (asin, xp, rnd_mode); 4.52 + 4.53 + mpfr_clear (xp); 4.54 ++ } 4.55 + 4.56 + MPFR_SAVE_EXPO_FREE (expo); 4.57 + return mpfr_check_range (asin, inexact, rnd_mode); 4.58 +diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h 4.59 +--- mpfr-3.0.1-a/mpfr.h 2011-04-04 10:19:18.000000000 +0000 4.60 ++++ mpfr-3.0.1-b/mpfr.h 2011-04-12 10:50:02.000000000 +0000 4.61 +@@ -27,7 +27,7 @@ 4.62 + #define MPFR_VERSION_MAJOR 3 4.63 + #define MPFR_VERSION_MINOR 0 4.64 + #define MPFR_VERSION_PATCHLEVEL 1 4.65 +-#define MPFR_VERSION_STRING "3.0.1" 4.66 ++#define MPFR_VERSION_STRING "3.0.1-p1" 4.67 + 4.68 + /* Macros dealing with MPFR VERSION */ 4.69 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 4.70 +diff -Naurd mpfr-3.0.1-a/tests/tasin.c mpfr-3.0.1-b/tests/tasin.c 4.71 +--- mpfr-3.0.1-a/tests/tasin.c 2011-04-04 10:19:17.000000000 +0000 4.72 ++++ mpfr-3.0.1-b/tests/tasin.c 2011-04-12 10:50:02.000000000 +0000 4.73 +@@ -219,6 +219,49 @@ 4.74 + mpfr_clear (y); 4.75 + } 4.76 + 4.77 ++static void 4.78 ++reduced_expo_range (void) 4.79 ++{ 4.80 ++ mpfr_exp_t emin, emax; 4.81 ++ mpfr_t x, y, ex_y; 4.82 ++ int inex, ex_inex; 4.83 ++ unsigned int flags, ex_flags; 4.84 ++ 4.85 ++ emin = mpfr_get_emin (); 4.86 ++ emax = mpfr_get_emax (); 4.87 ++ 4.88 ++ mpfr_inits2 (4, x, y, ex_y, (mpfr_ptr) 0); 4.89 ++ mpfr_set_str (x, "-0.1e1", 2, MPFR_RNDN); 4.90 ++ 4.91 ++ mpfr_set_emin (1); 4.92 ++ mpfr_set_emax (1); 4.93 ++ mpfr_clear_flags (); 4.94 ++ inex = mpfr_asin (y, x, MPFR_RNDA); 4.95 ++ flags = __gmpfr_flags; 4.96 ++ mpfr_set_emin (emin); 4.97 ++ mpfr_set_emax (emax); 4.98 ++ 4.99 ++ mpfr_set_str (ex_y, "-0.1101e1", 2, MPFR_RNDN); 4.100 ++ ex_inex = -1; 4.101 ++ ex_flags = MPFR_FLAGS_INEXACT; 4.102 ++ 4.103 ++ if (SIGN (inex) != ex_inex || flags != ex_flags || 4.104 ++ ! mpfr_equal_p (y, ex_y)) 4.105 ++ { 4.106 ++ printf ("Error in reduced_expo_range\non x = "); 4.107 ++ mpfr_dump (x); 4.108 ++ printf ("Expected y = "); 4.109 ++ mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN); 4.110 ++ printf ("\n inex = %d, flags = %u\n", ex_inex, ex_flags); 4.111 ++ printf ("Got y = "); 4.112 ++ mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN); 4.113 ++ printf ("\n inex = %d, flags = %u\n", SIGN (inex), flags); 4.114 ++ exit (1); 4.115 ++ } 4.116 ++ 4.117 ++ mpfr_clears (x, y, ex_y, (mpfr_ptr) 0); 4.118 ++} 4.119 ++ 4.120 + int 4.121 + main (void) 4.122 + { 4.123 +@@ -226,6 +269,7 @@ 4.124 + 4.125 + special (); 4.126 + special_overflow (); 4.127 ++ reduced_expo_range (); 4.128 + 4.129 + test_generic (2, 100, 15); 4.130 + 4.131 +diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c 4.132 +--- mpfr-3.0.1-a/version.c 2011-04-04 10:19:18.000000000 +0000 4.133 ++++ mpfr-3.0.1-b/version.c 2011-04-12 10:50:02.000000000 +0000 4.134 +@@ -25,5 +25,5 @@ 4.135 + const char * 4.136 + mpfr_get_version (void) 4.137 + { 4.138 +- return "3.0.1"; 4.139 ++ return "3.0.1-p1"; 4.140 + } 4.141 +diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES 4.142 +--- mpfr-3.0.1-a/PATCHES 2011-05-04 11:18:33.000000000 +0000 4.143 ++++ mpfr-3.0.1-b/PATCHES 2011-05-04 11:18:33.000000000 +0000 4.144 +@@ -0,0 +1 @@ 4.145 ++rec_sqrt-carry 4.146 +diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION 4.147 +--- mpfr-3.0.1-a/VERSION 2011-04-12 10:50:02.000000000 +0000 4.148 ++++ mpfr-3.0.1-b/VERSION 2011-05-04 11:18:33.000000000 +0000 4.149 +@@ -1 +1 @@ 4.150 +-3.0.1-p1 4.151 ++3.0.1-p2 4.152 +diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h 4.153 +--- mpfr-3.0.1-a/mpfr.h 2011-04-12 10:50:02.000000000 +0000 4.154 ++++ mpfr-3.0.1-b/mpfr.h 2011-05-04 11:18:33.000000000 +0000 4.155 +@@ -27,7 +27,7 @@ 4.156 + #define MPFR_VERSION_MAJOR 3 4.157 + #define MPFR_VERSION_MINOR 0 4.158 + #define MPFR_VERSION_PATCHLEVEL 1 4.159 +-#define MPFR_VERSION_STRING "3.0.1-p1" 4.160 ++#define MPFR_VERSION_STRING "3.0.1-p2" 4.161 + 4.162 + /* Macros dealing with MPFR VERSION */ 4.163 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 4.164 +diff -Naurd mpfr-3.0.1-a/rec_sqrt.c mpfr-3.0.1-b/rec_sqrt.c 4.165 +--- mpfr-3.0.1-a/rec_sqrt.c 2011-04-04 10:19:18.000000000 +0000 4.166 ++++ mpfr-3.0.1-b/rec_sqrt.c 2011-05-04 11:18:33.000000000 +0000 4.167 +@@ -375,20 +375,37 @@ 4.168 + MPFR_ASSERTD(un == ln + 1 || un == ln + 2); 4.169 + /* the high un-ln limbs of u will overlap the low part of {x+ln,xn}, 4.170 + we need to add or subtract the overlapping part {u + ln, un - ln} */ 4.171 ++ /* Warning! th may be 0, in which case the mpn_add_1 and mpn_sub_1 4.172 ++ below (with size = th) mustn't be used. In such a case, the limb 4.173 ++ (carry) will be 0, so that this is semantically a no-op, but if 4.174 ++ mpn_add_1 and mpn_sub_1 are used, GMP (currently) still does a 4.175 ++ non-atomic read/write in a place that is not always allocated, 4.176 ++ with the possible consequences: a crash if the corresponding 4.177 ++ address is not mapped, or (rather unlikely) memory corruption 4.178 ++ if another process/thread writes at the same place; things may 4.179 ++ be worse with future GMP versions. Hence the tests carry != 0. */ 4.180 + if (neg == 0) 4.181 + { 4.182 + if (ln > 0) 4.183 + MPN_COPY (x, u, ln); 4.184 + cy = mpn_add (x + ln, x + ln, xn, u + ln, un - ln); 4.185 + /* add cu at x+un */ 4.186 +- cy += mpn_add_1 (x + un, x + un, th, cu); 4.187 ++ if (cu != 0) 4.188 ++ { 4.189 ++ MPFR_ASSERTD (th != 0); 4.190 ++ cy += mpn_add_1 (x + un, x + un, th, cu); 4.191 ++ } 4.192 + } 4.193 + else /* negative case */ 4.194 + { 4.195 + /* subtract {u+ln, un-ln} from {x+ln,un} */ 4.196 + cy = mpn_sub (x + ln, x + ln, xn, u + ln, un - ln); 4.197 + /* carry cy is at x+un, like cu */ 4.198 +- cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */ 4.199 ++ if (cy + cu != 0) 4.200 ++ { 4.201 ++ MPFR_ASSERTD (th != 0); 4.202 ++ cy = mpn_sub_1 (x + un, x + un, th, cy + cu); /* n - un = th */ 4.203 ++ } 4.204 + /* cy cannot be zero, since the most significant bit of Xh is 1, 4.205 + and the correction is bounded by 2^{-h+3} */ 4.206 + MPFR_ASSERTD(cy == 0); 4.207 +diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c 4.208 +--- mpfr-3.0.1-a/version.c 2011-04-12 10:50:02.000000000 +0000 4.209 ++++ mpfr-3.0.1-b/version.c 2011-05-04 11:18:33.000000000 +0000 4.210 +@@ -25,5 +25,5 @@ 4.211 + const char * 4.212 + mpfr_get_version (void) 4.213 + { 4.214 +- return "3.0.1-p1"; 4.215 ++ return "3.0.1-p2"; 4.216 + } 4.217 +diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES 4.218 +--- mpfr-3.0.1-a/PATCHES 2011-05-05 00:00:35.000000000 +0000 4.219 ++++ mpfr-3.0.1-b/PATCHES 2011-05-05 00:00:35.000000000 +0000 4.220 +@@ -0,0 +1 @@ 4.221 ++atan-expo-range 4.222 +diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION 4.223 +--- mpfr-3.0.1-a/VERSION 2011-05-04 11:18:33.000000000 +0000 4.224 ++++ mpfr-3.0.1-b/VERSION 2011-05-05 00:00:35.000000000 +0000 4.225 +@@ -1 +1 @@ 4.226 +-3.0.1-p2 4.227 ++3.0.1-p3 4.228 +diff -Naurd mpfr-3.0.1-a/atan.c mpfr-3.0.1-b/atan.c 4.229 +--- mpfr-3.0.1-a/atan.c 2011-04-04 10:19:18.000000000 +0000 4.230 ++++ mpfr-3.0.1-b/atan.c 2011-05-05 00:00:35.000000000 +0000 4.231 +@@ -431,5 +431,5 @@ 4.232 + MPFR_GROUP_CLEAR (group); 4.233 + 4.234 + MPFR_SAVE_EXPO_FREE (expo); 4.235 +- return mpfr_check_range (arctgt, inexact, rnd_mode); 4.236 ++ return mpfr_check_range (atan, inexact, rnd_mode); 4.237 + } 4.238 +diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h 4.239 +--- mpfr-3.0.1-a/mpfr.h 2011-05-04 11:18:33.000000000 +0000 4.240 ++++ mpfr-3.0.1-b/mpfr.h 2011-05-05 00:00:35.000000000 +0000 4.241 +@@ -27,7 +27,7 @@ 4.242 + #define MPFR_VERSION_MAJOR 3 4.243 + #define MPFR_VERSION_MINOR 0 4.244 + #define MPFR_VERSION_PATCHLEVEL 1 4.245 +-#define MPFR_VERSION_STRING "3.0.1-p2" 4.246 ++#define MPFR_VERSION_STRING "3.0.1-p3" 4.247 + 4.248 + /* Macros dealing with MPFR VERSION */ 4.249 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 4.250 +diff -Naurd mpfr-3.0.1-a/tests/tatan.c mpfr-3.0.1-b/tests/tatan.c 4.251 +--- mpfr-3.0.1-a/tests/tatan.c 2011-04-04 10:19:17.000000000 +0000 4.252 ++++ mpfr-3.0.1-b/tests/tatan.c 2011-05-05 00:00:35.000000000 +0000 4.253 +@@ -535,6 +535,52 @@ 4.254 + mpfr_clears (a, x, y, (mpfr_ptr) 0); 4.255 + } 4.256 + 4.257 ++/* http://websympa.loria.fr/wwsympa/arc/mpfr/2011-05/msg00008.html 4.258 ++ * Incorrect flags (in debug mode on a 32-bit machine, assertion failure). 4.259 ++ */ 4.260 ++static void 4.261 ++reduced_expo_range (void) 4.262 ++{ 4.263 ++ mpfr_exp_t emin, emax; 4.264 ++ mpfr_t x, y, ex_y; 4.265 ++ int inex, ex_inex; 4.266 ++ unsigned int flags, ex_flags; 4.267 ++ 4.268 ++ emin = mpfr_get_emin (); 4.269 ++ emax = mpfr_get_emax (); 4.270 ++ 4.271 ++ mpfr_inits2 (12, x, y, ex_y, (mpfr_ptr) 0); 4.272 ++ mpfr_set_str (x, "0.1e-5", 2, MPFR_RNDN); 4.273 ++ 4.274 ++ mpfr_set_emin (-5); 4.275 ++ mpfr_set_emax (-5); 4.276 ++ mpfr_clear_flags (); 4.277 ++ inex = mpfr_atan (y, x, MPFR_RNDN); 4.278 ++ flags = __gmpfr_flags; 4.279 ++ mpfr_set_emin (emin); 4.280 ++ mpfr_set_emax (emax); 4.281 ++ 4.282 ++ mpfr_set_str (ex_y, "0.1e-5", 2, MPFR_RNDN); 4.283 ++ ex_inex = 1; 4.284 ++ ex_flags = MPFR_FLAGS_INEXACT; 4.285 ++ 4.286 ++ if (SIGN (inex) != ex_inex || flags != ex_flags || 4.287 ++ ! mpfr_equal_p (y, ex_y)) 4.288 ++ { 4.289 ++ printf ("Error in reduced_expo_range\non x = "); 4.290 ++ mpfr_dump (x); 4.291 ++ printf ("Expected y = "); 4.292 ++ mpfr_out_str (stdout, 2, 0, ex_y, MPFR_RNDN); 4.293 ++ printf ("\n inex = %d, flags = %u\n", ex_inex, ex_flags); 4.294 ++ printf ("Got y = "); 4.295 ++ mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN); 4.296 ++ printf ("\n inex = %d, flags = %u\n", SIGN (inex), flags); 4.297 ++ exit (1); 4.298 ++ } 4.299 ++ 4.300 ++ mpfr_clears (x, y, ex_y, (mpfr_ptr) 0); 4.301 ++} 4.302 ++ 4.303 + int 4.304 + main (int argc, char *argv[]) 4.305 + { 4.306 +@@ -546,6 +592,7 @@ 4.307 + smallvals_atan2 (); 4.308 + atan2_bug_20071003 (); 4.309 + atan2_different_prec (); 4.310 ++ reduced_expo_range (); 4.311 + 4.312 + test_generic_atan (2, 200, 17); 4.313 + test_generic_atan2 (2, 200, 17); 4.314 +diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c 4.315 +--- mpfr-3.0.1-a/version.c 2011-05-04 11:18:33.000000000 +0000 4.316 ++++ mpfr-3.0.1-b/version.c 2011-05-05 00:00:35.000000000 +0000 4.317 +@@ -25,5 +25,5 @@ 4.318 + const char * 4.319 + mpfr_get_version (void) 4.320 + { 4.321 +- return "3.0.1-p2"; 4.322 ++ return "3.0.1-p3"; 4.323 + } 4.324 +diff -Naurd mpfr-3.0.1-a/PATCHES mpfr-3.0.1-b/PATCHES 4.325 +--- mpfr-3.0.1-a/PATCHES 2011-05-09 14:48:24.000000000 +0000 4.326 ++++ mpfr-3.0.1-b/PATCHES 2011-05-09 14:48:24.000000000 +0000 4.327 +@@ -0,0 +1 @@ 4.328 ++texp-zero 4.329 +diff -Naurd mpfr-3.0.1-a/VERSION mpfr-3.0.1-b/VERSION 4.330 +--- mpfr-3.0.1-a/VERSION 2011-05-05 00:00:35.000000000 +0000 4.331 ++++ mpfr-3.0.1-b/VERSION 2011-05-09 14:48:24.000000000 +0000 4.332 +@@ -1 +1 @@ 4.333 +-3.0.1-p3 4.334 ++3.0.1-p4 4.335 +diff -Naurd mpfr-3.0.1-a/mpfr.h mpfr-3.0.1-b/mpfr.h 4.336 +--- mpfr-3.0.1-a/mpfr.h 2011-05-05 00:00:35.000000000 +0000 4.337 ++++ mpfr-3.0.1-b/mpfr.h 2011-05-09 14:48:24.000000000 +0000 4.338 +@@ -27,7 +27,7 @@ 4.339 + #define MPFR_VERSION_MAJOR 3 4.340 + #define MPFR_VERSION_MINOR 0 4.341 + #define MPFR_VERSION_PATCHLEVEL 1 4.342 +-#define MPFR_VERSION_STRING "3.0.1-p3" 4.343 ++#define MPFR_VERSION_STRING "3.0.1-p4" 4.344 + 4.345 + /* Macros dealing with MPFR VERSION */ 4.346 + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) 4.347 +diff -Naurd mpfr-3.0.1-a/tests/texp.c mpfr-3.0.1-b/tests/texp.c 4.348 +--- mpfr-3.0.1-a/tests/texp.c 2011-04-04 10:19:17.000000000 +0000 4.349 ++++ mpfr-3.0.1-b/tests/texp.c 2011-05-09 14:48:24.000000000 +0000 4.350 +@@ -170,7 +170,9 @@ 4.351 + mpfr_set_prec (x, prec); 4.352 + mpfr_set_prec (y, prec); 4.353 + mpfr_set_prec (z, prec); 4.354 +- mpfr_urandomb (x, RANDS); 4.355 ++ do 4.356 ++ mpfr_urandomb (x, RANDS); 4.357 ++ while (MPFR_IS_ZERO (x)); /* 0 is handled by mpfr_exp only */ 4.358 + rnd = RND_RAND (); 4.359 + mpfr_exp_2 (y, x, rnd); 4.360 + mpfr_exp_3 (z, x, rnd); 4.361 +diff -Naurd mpfr-3.0.1-a/version.c mpfr-3.0.1-b/version.c 4.362 +--- mpfr-3.0.1-a/version.c 2011-05-05 00:00:35.000000000 +0000 4.363 ++++ mpfr-3.0.1-b/version.c 2011-05-09 14:48:24.000000000 +0000 4.364 +@@ -25,5 +25,5 @@ 4.365 + const char * 4.366 + mpfr_get_version (void) 4.367 + { 4.368 +- return "3.0.1-p3"; 4.369 ++ return "3.0.1-p4"; 4.370 + }