patches/mpfr/2.4.2/100-sin_cos_underflow.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 17:54:21 2011 +0200 (2011-07-17)
changeset 2888 dd71df95903a
permissions -rw-r--r--
cc/gcc: pass the companion libs prefix to cc_core

In case of canadian-cross, the companion libraries are not the same for
the core cc (they run on 'build') as they are for the final cc (they run
on 'host').

Prepare for this differentiation (coming later), while retaining the
current behavior (to use the same compblibs).

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@1699
     1
diff -Naurd mpfr-2.4.2-a/PATCHES mpfr-2.4.2-b/PATCHES
yann@1699
     2
--- mpfr-2.4.2-a/PATCHES	2009-12-07 13:37:12.000000000 +0000
yann@1699
     3
+++ mpfr-2.4.2-b/PATCHES	2009-12-07 13:37:12.000000000 +0000
yann@1699
     4
@@ -0,0 +1 @@
yann@1699
     5
+sin_cos_underflow
yann@1699
     6
diff -Naurd mpfr-2.4.2-a/VERSION mpfr-2.4.2-b/VERSION
yann@1699
     7
--- mpfr-2.4.2-a/VERSION	2009-11-30 02:43:08.000000000 +0000
yann@1699
     8
+++ mpfr-2.4.2-b/VERSION	2009-12-07 13:37:12.000000000 +0000
yann@1699
     9
@@ -1 +1 @@
yann@1699
    10
-2.4.2
yann@1699
    11
+2.4.2-p1
yann@1699
    12
diff -Naurd mpfr-2.4.2-a/mpfr.h mpfr-2.4.2-b/mpfr.h
yann@1699
    13
--- mpfr-2.4.2-a/mpfr.h	2009-11-30 02:43:08.000000000 +0000
yann@1699
    14
+++ mpfr-2.4.2-b/mpfr.h	2009-12-07 13:37:12.000000000 +0000
yann@1699
    15
@@ -27,7 +27,7 @@
yann@1699
    16
 #define MPFR_VERSION_MAJOR 2
yann@1699
    17
 #define MPFR_VERSION_MINOR 4
yann@1699
    18
 #define MPFR_VERSION_PATCHLEVEL 2
yann@1699
    19
-#define MPFR_VERSION_STRING "2.4.2"
yann@1699
    20
+#define MPFR_VERSION_STRING "2.4.2-p1"
yann@1699
    21
 
yann@1699
    22
 /* Macros dealing with MPFR VERSION */
yann@1699
    23
 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
yann@1699
    24
diff -Naurd mpfr-2.4.2-a/sin_cos.c mpfr-2.4.2-b/sin_cos.c
yann@1699
    25
--- mpfr-2.4.2-a/sin_cos.c	2009-11-30 02:43:09.000000000 +0000
yann@1699
    26
+++ mpfr-2.4.2-b/sin_cos.c	2009-12-07 13:37:12.000000000 +0000
yann@1699
    27
@@ -82,17 +82,19 @@
yann@1699
    28
       if (y != x)
yann@1699
    29
         /* y and x differ, thus we can safely try to compute y first */
yann@1699
    30
         {
yann@1699
    31
-          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0, rnd_mode,
yann@1699
    32
-                                            { inexy = _inexact;
yann@1699
    33
-                                              goto small_input; });
yann@1699
    34
+          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
yann@1699
    35
+            y, x, -2 * expx, 2, 0, rnd_mode,
yann@1699
    36
+            { inexy = _inexact;
yann@1699
    37
+              goto small_input; });
yann@1699
    38
           if (0)
yann@1699
    39
             {
yann@1699
    40
             small_input:
yann@1699
    41
               /* we can go here only if we can round sin(x) */
yann@1699
    42
-              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
yann@1699
    43
-                                                1, 0, rnd_mode,
yann@1699
    44
-                                                { inexz = _inexact;
yann@1699
    45
-                                                  goto end; });
yann@1699
    46
+              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
yann@1699
    47
+                z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
yann@1699
    48
+                { inexz = _inexact;
yann@1699
    49
+                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
yann@1699
    50
+                  goto end; });
yann@1699
    51
             }
yann@1699
    52
 
yann@1699
    53
           /* if we go here, one of the two MPFR_FAST_COMPUTE_IF_SMALL_INPUT
yann@1699
    54
@@ -101,18 +103,19 @@
yann@1699
    55
       else /* y and x are the same variable: try to compute z first, which
yann@1699
    56
               necessarily differs */
yann@1699
    57
         {
yann@1699
    58
-          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
yann@1699
    59
-                                            1, 0, rnd_mode,
yann@1699
    60
-                                            { inexz = _inexact;
yann@1699
    61
-                                              goto small_input2; });
yann@1699
    62
+          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
yann@1699
    63
+            z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
yann@1699
    64
+            { inexz = _inexact;
yann@1699
    65
+              goto small_input2; });
yann@1699
    66
           if (0)
yann@1699
    67
             {
yann@1699
    68
             small_input2:
yann@1699
    69
               /* we can go here only if we can round cos(x) */
yann@1699
    70
-              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0,
yann@1699
    71
-                                                rnd_mode,
yann@1699
    72
-                                                { inexy = _inexact;
yann@1699
    73
-                                                  goto end; });
yann@1699
    74
+              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
yann@1699
    75
+                y, x, -2 * expx, 2, 0, rnd_mode,
yann@1699
    76
+                { inexy = _inexact;
yann@1699
    77
+                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
yann@1699
    78
+                  goto end; });
yann@1699
    79
             }
yann@1699
    80
         }
yann@1699
    81
       m += 2 * (-expx);
yann@1699
    82
@@ -207,7 +210,6 @@
yann@1699
    83
   mpfr_clear (xr);
yann@1699
    84
 
yann@1699
    85
  end:
yann@1699
    86
-  /* FIXME: update the underflow flag if need be. */
yann@1699
    87
   MPFR_SAVE_EXPO_FREE (expo);
yann@1699
    88
   mpfr_check_range (y, inexy, rnd_mode);
yann@1699
    89
   mpfr_check_range (z, inexz, rnd_mode);
yann@1699
    90
diff -Naurd mpfr-2.4.2-a/tests/tsin_cos.c mpfr-2.4.2-b/tests/tsin_cos.c
yann@1699
    91
--- mpfr-2.4.2-a/tests/tsin_cos.c	2009-11-30 02:43:08.000000000 +0000
yann@1699
    92
+++ mpfr-2.4.2-b/tests/tsin_cos.c	2009-12-07 13:37:12.000000000 +0000
yann@1699
    93
@@ -382,23 +382,56 @@
yann@1699
    94
 consistency (void)
yann@1699
    95
 {
yann@1699
    96
   mpfr_t x, s1, s2, c1, c2;
yann@1699
    97
+  mp_exp_t emin, emax;
yann@1699
    98
   mp_rnd_t rnd;
yann@1699
    99
+  unsigned int flags_sin, flags_cos, flags, flags_before, flags_ref;
yann@1699
   100
+  int inex_sin, inex_cos, inex, inex_ref;
yann@1699
   101
   int i;
yann@1699
   102
 
yann@1699
   103
+  emin = mpfr_get_emin ();
yann@1699
   104
+  emax = mpfr_get_emax ();
yann@1699
   105
+
yann@1699
   106
   for (i = 0; i <= 10000; i++)
yann@1699
   107
     {
yann@1699
   108
       mpfr_init2 (x, MPFR_PREC_MIN + (randlimb () % 8));
yann@1699
   109
       mpfr_inits2 (MPFR_PREC_MIN + (randlimb () % 8), s1, s2, c1, c2,
yann@1699
   110
                    (mpfr_ptr) 0);
yann@1699
   111
-      tests_default_random (x, 256, -5, 50);
yann@1699
   112
-      rnd = RND_RAND ();
yann@1699
   113
-      mpfr_sin (s1, x, rnd);
yann@1699
   114
-      mpfr_cos (c1, x, rnd);
yann@1699
   115
-      mpfr_sin_cos (s2, c2, x, rnd);
yann@1699
   116
-      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)))
yann@1699
   117
+      if (i < 8 * GMP_RND_MAX)
yann@1699
   118
         {
yann@1699
   119
-          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,\nx = ",
yann@1699
   120
-                  mpfr_print_rnd_mode (rnd));
yann@1699
   121
+          int j = i / GMP_RND_MAX;
yann@1699
   122
+          if (j & 1)
yann@1699
   123
+            mpfr_set_emin (MPFR_EMIN_MIN);
yann@1699
   124
+          mpfr_set_si (x, (j & 2) ? 1 : -1, GMP_RNDN);
yann@1699
   125
+          mpfr_set_exp (x, mpfr_get_emin ());
yann@1699
   126
+          rnd = (mpfr_rnd_t) (i % GMP_RND_MAX);
yann@1699
   127
+          flags_before = 0;
yann@1699
   128
+          if (j & 4)
yann@1699
   129
+            mpfr_set_emax (-17);
yann@1699
   130
+        }
yann@1699
   131
+      else
yann@1699
   132
+        {
yann@1699
   133
+          tests_default_random (x, 256, -5, 50);
yann@1699
   134
+          rnd = RND_RAND ();
yann@1699
   135
+          flags_before = (randlimb () & 1) ?
yann@1699
   136
+            (unsigned int) (MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE) :
yann@1699
   137
+            (unsigned int) 0;
yann@1699
   138
+        }
yann@1699
   139
+      __gmpfr_flags = flags_before;
yann@1699
   140
+      inex_sin = mpfr_sin (s1, x, rnd);
yann@1699
   141
+      flags_sin = __gmpfr_flags;
yann@1699
   142
+      __gmpfr_flags = flags_before;
yann@1699
   143
+      inex_cos = mpfr_cos (c1, x, rnd);
yann@1699
   144
+      flags_cos = __gmpfr_flags;
yann@1699
   145
+      __gmpfr_flags = flags_before;
yann@1699
   146
+      inex = !!mpfr_sin_cos (s2, c2, x, rnd);
yann@1699
   147
+      flags = __gmpfr_flags;
yann@1699
   148
+      inex_ref = inex_sin || inex_cos;
yann@1699
   149
+      flags_ref = flags_sin | flags_cos;
yann@1699
   150
+      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)) ||
yann@1699
   151
+          inex != inex_ref || flags != flags_ref)
yann@1699
   152
+        {
yann@1699
   153
+          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,"
yann@1699
   154
+                  " i = %d\nx = ", mpfr_print_rnd_mode (rnd), i);
yann@1699
   155
           mpfr_dump (x);
yann@1699
   156
           printf ("s1 = ");
yann@1699
   157
           mpfr_dump (s1);
yann@1699
   158
@@ -408,9 +441,16 @@
yann@1699
   159
           mpfr_dump (c1);
yann@1699
   160
           printf ("c2 = ");
yann@1699
   161
           mpfr_dump (c2);
yann@1699
   162
+          printf ("inex_sin = %d, inex_cos = %d, inex = %d (expected %d)\n",
yann@1699
   163
+                  inex_sin, inex_cos, inex, inex_ref);
yann@1699
   164
+          printf ("flags_sin = 0x%x, flags_cos = 0x%x, "
yann@1699
   165
+                  "flags = 0x%x (expected 0x%x)\n",
yann@1699
   166
+                  flags_sin, flags_cos, flags, flags_ref);
yann@1699
   167
           exit (1);
yann@1699
   168
         }
yann@1699
   169
       mpfr_clears (x, s1, s2, c1, c2, (mpfr_ptr) 0);
yann@1699
   170
+      mpfr_set_emin (emin);
yann@1699
   171
+      mpfr_set_emax (emax);
yann@1699
   172
     }
yann@1699
   173
 }
yann@1699
   174
 
yann@1699
   175
diff -Naurd mpfr-2.4.2-a/version.c mpfr-2.4.2-b/version.c
yann@1699
   176
--- mpfr-2.4.2-a/version.c	2009-11-30 02:43:08.000000000 +0000
yann@1699
   177
+++ mpfr-2.4.2-b/version.c	2009-12-07 13:37:12.000000000 +0000
yann@1699
   178
@@ -25,5 +25,5 @@
yann@1699
   179
 const char *
yann@1699
   180
 mpfr_get_version (void)
yann@1699
   181
 {
yann@1699
   182
-  return "2.4.2";
yann@1699
   183
+  return "2.4.2-p1";
yann@1699
   184
 }