asus/m5a88-v: Fix build
[coreboot.git] / util / crossgcc / patches / mpfr-2.4.2_allpatches_20100308.patch
1 diff -ur mpfr-2.4.2.orig/PATCHES mpfr-2.4.2/PATCHES
2 --- mpfr-2.4.2.orig/PATCHES     2010-03-08 22:28:46.000000000 +0100
3 +++ mpfr-2.4.2/PATCHES  2010-03-08 22:28:53.000000000 +0100
4 @@ -0,0 +1,3 @@
5 +gmp5
6 +longlong.h
7 +sin_cos_underflow
8 diff -ur mpfr-2.4.2.orig/VERSION mpfr-2.4.2/VERSION
9 --- mpfr-2.4.2.orig/VERSION     2010-03-08 22:28:46.000000000 +0100
10 +++ mpfr-2.4.2/VERSION  2010-03-08 22:28:53.000000000 +0100
11 @@ -1 +1 @@
12 -2.4.2
13 +2.4.2-p3
14 diff -ur mpfr-2.4.2.orig/configure mpfr-2.4.2/configure
15 --- mpfr-2.4.2.orig/configure   2010-03-08 22:28:46.000000000 +0100
16 +++ mpfr-2.4.2/configure        2010-03-08 22:28:53.000000000 +0100
17 @@ -20449,6 +20449,9 @@
18  main ()
19  {
20  
21 +#ifndef BITS_PER_MP_LIMB
22 +#define BITS_PER_MP_LIMB GMP_LIMB_BITS
23 +#endif
24    return BITS_PER_MP_LIMB == BYTES_PER_MP_LIMB * CHAR_BIT
25           && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ? 0 : 1;
26  
27 diff -ur mpfr-2.4.2.orig/configure.in mpfr-2.4.2/configure.in
28 --- mpfr-2.4.2.orig/configure.in        2010-03-08 22:28:46.000000000 +0100
29 +++ mpfr-2.4.2/configure.in     2010-03-08 22:28:53.000000000 +0100
30 @@ -424,6 +424,9 @@
31  #include "gmp.h"
32  #include "gmp-impl.h"
33  ]], [[
34 +#ifndef BITS_PER_MP_LIMB
35 +#define BITS_PER_MP_LIMB GMP_LIMB_BITS
36 +#endif
37    return BITS_PER_MP_LIMB == BYTES_PER_MP_LIMB * CHAR_BIT
38           && sizeof(mp_limb_t) == BYTES_PER_MP_LIMB ? 0 : 1;
39  ]])], [AC_MSG_RESULT(yes)], [
40 diff -ur mpfr-2.4.2.orig/mpfr-impl.h mpfr-2.4.2/mpfr-impl.h
41 --- mpfr-2.4.2.orig/mpfr-impl.h 2010-03-08 22:28:46.000000000 +0100
42 +++ mpfr-2.4.2/mpfr-impl.h      2010-03-08 22:28:53.000000000 +0100
43 @@ -65,6 +65,12 @@
44  # ifndef __GMP_IMPL_H__
45  #  include "gmp-impl.h"
46  # endif
47 +# ifndef BITS_PER_MP_LIMB
48 +#  define BITS_PER_MP_LIMB GMP_LIMB_BITS
49 +# endif
50 +#ifndef mpn_sqr_n
51 +# define mpn_sqr_n mpn_sqr
52 +#endif
53  # ifdef MPFR_NEED_LONGLONG_H
54  #  include "longlong.h"
55  # endif
56 diff -ur mpfr-2.4.2.orig/mpfr-longlong.h mpfr-2.4.2/mpfr-longlong.h
57 --- mpfr-2.4.2.orig/mpfr-longlong.h     2010-03-08 22:28:46.000000000 +0100
58 +++ mpfr-2.4.2/mpfr-longlong.h  2010-03-08 22:28:53.000000000 +0100
59 @@ -1011,7 +1011,15 @@
60  #endif /* __m88000__ */
61  
62  #if defined (__mips) && W_TYPE_SIZE == 32
63 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
64 +#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
65 +#define umul_ppmm(w1, w0, u, v) \
66 +  do {                                                                 \
67 +    UDItype _r;                                                        \
68 +    _r = (UDItype) u * v;                                              \
69 +    (w1) = _r >> 32;                                                   \
70 +    (w0) = (USItype) _r;                                               \
71 +  } while (0)
72 +#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
73  #define umul_ppmm(w1, w0, u, v) \
74    __asm__ ("multu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
75  #else
76 @@ -1024,7 +1032,16 @@
77  #endif /* __mips */
78  
79  #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
80 -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
81 +#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
82 +typedef unsigned int UTItype __attribute__ ((mode (TI)));
83 +#define umul_ppmm(w1, w0, u, v) \
84 +  do {                                                                 \
85 +    UTItype _r;                                                        \
86 +    _r = (UTItype) u * v;                                              \
87 +    (w1) = _r >> 64;                                                   \
88 +    (w0) = (UDItype) _r;                                               \
89 +  } while (0)
90 +#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
91  #define umul_ppmm(w1, w0, u, v) \
92    __asm__ ("dmultu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
93  #else
94 diff -ur mpfr-2.4.2.orig/mpfr.h mpfr-2.4.2/mpfr.h
95 --- mpfr-2.4.2.orig/mpfr.h      2010-03-08 22:28:46.000000000 +0100
96 +++ mpfr-2.4.2/mpfr.h   2010-03-08 22:28:53.000000000 +0100
97 @@ -27,7 +27,7 @@
98  #define MPFR_VERSION_MAJOR 2
99  #define MPFR_VERSION_MINOR 4
100  #define MPFR_VERSION_PATCHLEVEL 2
101 -#define MPFR_VERSION_STRING "2.4.2"
102 +#define MPFR_VERSION_STRING "2.4.2-p3"
103  
104  /* Macros dealing with MPFR VERSION */
105  #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
106 diff -ur mpfr-2.4.2.orig/sin_cos.c mpfr-2.4.2/sin_cos.c
107 --- mpfr-2.4.2.orig/sin_cos.c   2010-03-08 22:28:46.000000000 +0100
108 +++ mpfr-2.4.2/sin_cos.c        2010-03-08 22:28:53.000000000 +0100
109 @@ -82,17 +82,19 @@
110        if (y != x)
111          /* y and x differ, thus we can safely try to compute y first */
112          {
113 -          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0, rnd_mode,
114 -                                            { inexy = _inexact;
115 -                                              goto small_input; });
116 +          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
117 +            y, x, -2 * expx, 2, 0, rnd_mode,
118 +            { inexy = _inexact;
119 +              goto small_input; });
120            if (0)
121              {
122              small_input:
123                /* we can go here only if we can round sin(x) */
124 -              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
125 -                                                1, 0, rnd_mode,
126 -                                                { inexz = _inexact;
127 -                                                  goto end; });
128 +              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
129 +                z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
130 +                { inexz = _inexact;
131 +                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
132 +                  goto end; });
133              }
134  
135            /* if we go here, one of the two MPFR_FAST_COMPUTE_IF_SMALL_INPUT
136 @@ -101,18 +103,19 @@
137        else /* y and x are the same variable: try to compute z first, which
138                necessarily differs */
139          {
140 -          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
141 -                                            1, 0, rnd_mode,
142 -                                            { inexz = _inexact;
143 -                                              goto small_input2; });
144 +          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
145 +            z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
146 +            { inexz = _inexact;
147 +              goto small_input2; });
148            if (0)
149              {
150              small_input2:
151                /* we can go here only if we can round cos(x) */
152 -              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0,
153 -                                                rnd_mode,
154 -                                                { inexy = _inexact;
155 -                                                  goto end; });
156 +              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
157 +                y, x, -2 * expx, 2, 0, rnd_mode,
158 +                { inexy = _inexact;
159 +                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
160 +                  goto end; });
161              }
162          }
163        m += 2 * (-expx);
164 @@ -207,7 +210,6 @@
165    mpfr_clear (xr);
166  
167   end:
168 -  /* FIXME: update the underflow flag if need be. */
169    MPFR_SAVE_EXPO_FREE (expo);
170    mpfr_check_range (y, inexy, rnd_mode);
171    mpfr_check_range (z, inexz, rnd_mode);
172 diff -ur mpfr-2.4.2.orig/tests/tsin_cos.c mpfr-2.4.2/tests/tsin_cos.c
173 --- mpfr-2.4.2.orig/tests/tsin_cos.c    2010-03-08 22:28:46.000000000 +0100
174 +++ mpfr-2.4.2/tests/tsin_cos.c 2010-03-08 22:28:53.000000000 +0100
175 @@ -382,23 +382,56 @@
176  consistency (void)
177  {
178    mpfr_t x, s1, s2, c1, c2;
179 +  mp_exp_t emin, emax;
180    mp_rnd_t rnd;
181 +  unsigned int flags_sin, flags_cos, flags, flags_before, flags_ref;
182 +  int inex_sin, inex_cos, inex, inex_ref;
183    int i;
184  
185 +  emin = mpfr_get_emin ();
186 +  emax = mpfr_get_emax ();
187 +
188    for (i = 0; i <= 10000; i++)
189      {
190        mpfr_init2 (x, MPFR_PREC_MIN + (randlimb () % 8));
191        mpfr_inits2 (MPFR_PREC_MIN + (randlimb () % 8), s1, s2, c1, c2,
192                     (mpfr_ptr) 0);
193 -      tests_default_random (x, 256, -5, 50);
194 -      rnd = RND_RAND ();
195 -      mpfr_sin (s1, x, rnd);
196 -      mpfr_cos (c1, x, rnd);
197 -      mpfr_sin_cos (s2, c2, x, rnd);
198 -      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)))
199 +      if (i < 8 * GMP_RND_MAX)
200 +        {
201 +          int j = i / GMP_RND_MAX;
202 +          if (j & 1)
203 +            mpfr_set_emin (MPFR_EMIN_MIN);
204 +          mpfr_set_si (x, (j & 2) ? 1 : -1, GMP_RNDN);
205 +          mpfr_set_exp (x, mpfr_get_emin ());
206 +          rnd = (mpfr_rnd_t) (i % GMP_RND_MAX);
207 +          flags_before = 0;
208 +          if (j & 4)
209 +            mpfr_set_emax (-17);
210 +        }
211 +      else
212 +        {
213 +          tests_default_random (x, 256, -5, 50);
214 +          rnd = RND_RAND ();
215 +          flags_before = (randlimb () & 1) ?
216 +            (unsigned int) (MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE) :
217 +            (unsigned int) 0;
218 +        }
219 +      __gmpfr_flags = flags_before;
220 +      inex_sin = mpfr_sin (s1, x, rnd);
221 +      flags_sin = __gmpfr_flags;
222 +      __gmpfr_flags = flags_before;
223 +      inex_cos = mpfr_cos (c1, x, rnd);
224 +      flags_cos = __gmpfr_flags;
225 +      __gmpfr_flags = flags_before;
226 +      inex = !!mpfr_sin_cos (s2, c2, x, rnd);
227 +      flags = __gmpfr_flags;
228 +      inex_ref = inex_sin || inex_cos;
229 +      flags_ref = flags_sin | flags_cos;
230 +      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)) ||
231 +          inex != inex_ref || flags != flags_ref)
232          {
233 -          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,\nx = ",
234 -                  mpfr_print_rnd_mode (rnd));
235 +          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,"
236 +                  " i = %d\nx = ", mpfr_print_rnd_mode (rnd), i);
237            mpfr_dump (x);
238            printf ("s1 = ");
239            mpfr_dump (s1);
240 @@ -408,9 +441,16 @@
241            mpfr_dump (c1);
242            printf ("c2 = ");
243            mpfr_dump (c2);
244 +          printf ("inex_sin = %d, inex_cos = %d, inex = %d (expected %d)\n",
245 +                  inex_sin, inex_cos, inex, inex_ref);
246 +          printf ("flags_sin = 0x%x, flags_cos = 0x%x, "
247 +                  "flags = 0x%x (expected 0x%x)\n",
248 +                  flags_sin, flags_cos, flags, flags_ref);
249            exit (1);
250          }
251        mpfr_clears (x, s1, s2, c1, c2, (mpfr_ptr) 0);
252 +      mpfr_set_emin (emin);
253 +      mpfr_set_emax (emax);
254      }
255  }
256  
257 diff -ur mpfr-2.4.2.orig/version.c mpfr-2.4.2/version.c
258 --- mpfr-2.4.2.orig/version.c   2010-03-08 22:28:46.000000000 +0100
259 +++ mpfr-2.4.2/version.c        2010-03-08 22:28:53.000000000 +0100
260 @@ -25,5 +25,5 @@
261  const char *
262  mpfr_get_version (void)
263  {
264 -  return "2.4.2";
265 +  return "2.4.2-p3";
266  }