| Index: gcc/gmp/tests/refmpf.c
|
| diff --git a/gcc/gmp/tests/refmpf.c b/gcc/gmp/tests/refmpf.c
|
| deleted file mode 100644
|
| index 90ca59832164bcfa021c50de9f6ef84f6e78d17c..0000000000000000000000000000000000000000
|
| --- a/gcc/gmp/tests/refmpf.c
|
| +++ /dev/null
|
| @@ -1,428 +0,0 @@
|
| -/* Reference floating point routines.
|
| -
|
| -Copyright 1996, 2001, 2004, 2005 Free Software Foundation, Inc.
|
| -
|
| -This file is part of the GNU MP Library.
|
| -
|
| -The GNU MP Library is free software; you can redistribute it and/or modify
|
| -it under the terms of the GNU Lesser General Public License as published by
|
| -the Free Software Foundation; either version 3 of the License, or (at your
|
| -option) any later version.
|
| -
|
| -The GNU MP Library is distributed in the hope that it will be useful, but
|
| -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
| -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
| -License for more details.
|
| -
|
| -You should have received a copy of the GNU Lesser General Public License
|
| -along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
|
| -
|
| -#include <stdio.h>
|
| -#include <stdlib.h>
|
| -
|
| -#include "gmp.h"
|
| -#include "gmp-impl.h"
|
| -#include "tests.h"
|
| -
|
| -
|
| -void
|
| -refmpf_add (mpf_ptr w, mpf_srcptr u, mpf_srcptr v)
|
| -{
|
| - mp_size_t hi, lo, size;
|
| - mp_ptr ut, vt, wt;
|
| - int neg;
|
| - mp_exp_t exp;
|
| - mp_limb_t cy;
|
| - TMP_DECL;
|
| -
|
| - TMP_MARK;
|
| -
|
| - if (SIZ (u) == 0)
|
| - {
|
| - size = ABSIZ (v);
|
| - wt = (mp_ptr) TMP_ALLOC ((size+1) * BYTES_PER_MP_LIMB);
|
| - MPN_COPY (wt, PTR (v), size);
|
| - exp = EXP (v);
|
| - neg = SIZ (v) < 0;
|
| - goto done;
|
| - }
|
| - if (SIZ (v) == 0)
|
| - {
|
| - size = ABSIZ (u);
|
| - wt = (mp_ptr) TMP_ALLOC ((size+1) * BYTES_PER_MP_LIMB);
|
| - MPN_COPY (wt, PTR (u), size);
|
| - exp = EXP (u);
|
| - neg = SIZ (u) < 0;
|
| - goto done;
|
| - }
|
| - if ((SIZ (u) ^ SIZ (v)) < 0)
|
| - {
|
| - mpf_t tmp;
|
| - SIZ (tmp) = -SIZ (v);
|
| - EXP (tmp) = EXP (v);
|
| - PTR (tmp) = PTR (v);
|
| - refmpf_sub (w, u, tmp);
|
| - return;
|
| - }
|
| - neg = SIZ (u) < 0;
|
| -
|
| - /* Compute the significance of the hi and lo end of the result. */
|
| - hi = MAX (EXP (u), EXP (v));
|
| - lo = MIN (EXP (u) - ABSIZ (u), EXP (v) - ABSIZ (v));
|
| - size = hi - lo;
|
| - ut = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - vt = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - wt = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - MPN_ZERO (ut, size);
|
| - MPN_ZERO (vt, size);
|
| - {int off;
|
| - off = size + (EXP (u) - hi) - ABSIZ (u);
|
| - MPN_COPY (ut + off, PTR (u), ABSIZ (u));
|
| - off = size + (EXP (v) - hi) - ABSIZ (v);
|
| - MPN_COPY (vt + off, PTR (v), ABSIZ (v));
|
| - }
|
| -
|
| - cy = mpn_add_n (wt, ut, vt, size);
|
| - wt[size] = cy;
|
| - size += cy;
|
| - exp = hi + cy;
|
| -
|
| -done:
|
| - if (size > PREC (w))
|
| - {
|
| - wt += size - PREC (w);
|
| - size = PREC (w);
|
| - }
|
| - MPN_COPY (PTR (w), wt, size);
|
| - SIZ (w) = neg == 0 ? size : -size;
|
| - EXP (w) = exp;
|
| - TMP_FREE;
|
| -}
|
| -
|
| -
|
| -/* Add 1 "unit in last place" (ie. in the least significant limb) to f.
|
| - f cannot be zero, since that has no well-defined "last place".
|
| -
|
| - This routine is designed for use in cases where we pay close attention to
|
| - the size of the data value and are using that (and the exponent) to
|
| - indicate the accurate part of a result, or similar. For this reason, if
|
| - there's a carry out we don't store 1 and adjust the exponent, we just
|
| - leave 100..00. We don't even adjust if there's a carry out of prec+1
|
| - limbs, but instead give up in that case (which we intend shouldn't arise
|
| - in normal circumstances). */
|
| -
|
| -void
|
| -refmpf_add_ulp (mpf_ptr f)
|
| -{
|
| - mp_ptr fp = PTR(f);
|
| - mp_size_t fsize = SIZ(f);
|
| - mp_size_t abs_fsize = ABSIZ(f);
|
| - mp_limb_t c;
|
| -
|
| - if (fsize == 0)
|
| - {
|
| - printf ("Oops, refmpf_add_ulp called with f==0\n");
|
| - abort ();
|
| - }
|
| -
|
| - c = refmpn_add_1 (fp, fp, abs_fsize, CNST_LIMB(1));
|
| - if (c != 0)
|
| - {
|
| - if (abs_fsize >= PREC(f) + 1)
|
| - {
|
| - printf ("Oops, refmpf_add_ulp carried out of prec+1 limbs\n");
|
| - abort ();
|
| - }
|
| -
|
| - fp[abs_fsize] = c;
|
| - abs_fsize++;
|
| - SIZ(f) = (fsize > 0 ? abs_fsize : - abs_fsize);
|
| - EXP(f)++;
|
| - }
|
| -}
|
| -
|
| -/* Fill f with size limbs of the given value, setup as an integer. */
|
| -void
|
| -refmpf_fill (mpf_ptr f, mp_size_t size, mp_limb_t value)
|
| -{
|
| - ASSERT (size >= 0);
|
| - size = MIN (PREC(f) + 1, size);
|
| - SIZ(f) = size;
|
| - EXP(f) = size;
|
| - refmpn_fill (PTR(f), size, value);
|
| -}
|
| -
|
| -/* Strip high zero limbs from the f data, adjusting exponent accordingly. */
|
| -void
|
| -refmpf_normalize (mpf_ptr f)
|
| -{
|
| - while (SIZ(f) != 0 && PTR(f)[ABSIZ(f)-1] == 0)
|
| - {
|
| - SIZ(f) = (SIZ(f) >= 0 ? SIZ(f)-1 : SIZ(f)+1);
|
| - EXP(f) --;
|
| - }
|
| - if (SIZ(f) == 0)
|
| - EXP(f) = 0;
|
| -}
|
| -
|
| -/* refmpf_set_overlap sets up dst as a copy of src, but with PREC(dst)
|
| - unchanged, in preparation for an overlap test.
|
| -
|
| - The full value of src is copied, and the space at PTR(dst) is extended as
|
| - necessary. The way PREC(dst) is unchanged is as per an mpf_set_prec_raw.
|
| - The return value is the new PTR(dst) space precision, in bits, ready for
|
| - a restoring mpf_set_prec_raw before mpf_clear. */
|
| -
|
| -unsigned long
|
| -refmpf_set_overlap (mpf_ptr dst, mpf_srcptr src)
|
| -{
|
| - mp_size_t dprec = PREC(dst);
|
| - mp_size_t ssize = ABSIZ(src);
|
| - unsigned long ret;
|
| -
|
| - refmpf_set_prec_limbs (dst, (unsigned long) MAX (dprec, ssize));
|
| - mpf_set (dst, src);
|
| -
|
| - ret = mpf_get_prec (dst);
|
| - PREC(dst) = dprec;
|
| - return ret;
|
| -}
|
| -
|
| -/* Like mpf_set_prec, but taking a precision in limbs.
|
| - PREC(f) ends up as the given "prec" value. */
|
| -void
|
| -refmpf_set_prec_limbs (mpf_ptr f, unsigned long prec)
|
| -{
|
| - mpf_set_prec (f, __GMPF_PREC_TO_BITS (prec));
|
| -}
|
| -
|
| -
|
| -void
|
| -refmpf_sub (mpf_ptr w, mpf_srcptr u, mpf_srcptr v)
|
| -{
|
| - mp_size_t hi, lo, size;
|
| - mp_ptr ut, vt, wt;
|
| - int neg;
|
| - mp_exp_t exp;
|
| - TMP_DECL;
|
| -
|
| - TMP_MARK;
|
| -
|
| - if (SIZ (u) == 0)
|
| - {
|
| - size = ABSIZ (v);
|
| - wt = (mp_ptr) TMP_ALLOC ((size+1) * BYTES_PER_MP_LIMB);
|
| - MPN_COPY (wt, PTR (v), size);
|
| - exp = EXP (v);
|
| - neg = SIZ (v) > 0;
|
| - goto done;
|
| - }
|
| - if (SIZ (v) == 0)
|
| - {
|
| - size = ABSIZ (u);
|
| - wt = (mp_ptr) TMP_ALLOC ((size+1) * BYTES_PER_MP_LIMB);
|
| - MPN_COPY (wt, PTR (u), size);
|
| - exp = EXP (u);
|
| - neg = SIZ (u) < 0;
|
| - goto done;
|
| - }
|
| - if ((SIZ (u) ^ SIZ (v)) < 0)
|
| - {
|
| - mpf_t tmp;
|
| - SIZ (tmp) = -SIZ (v);
|
| - EXP (tmp) = EXP (v);
|
| - PTR (tmp) = PTR (v);
|
| - refmpf_add (w, u, tmp);
|
| - if (SIZ (u) < 0)
|
| - mpf_neg (w, w);
|
| - return;
|
| - }
|
| - neg = SIZ (u) < 0;
|
| -
|
| - /* Compute the significance of the hi and lo end of the result. */
|
| - hi = MAX (EXP (u), EXP (v));
|
| - lo = MIN (EXP (u) - ABSIZ (u), EXP (v) - ABSIZ (v));
|
| - size = hi - lo;
|
| - ut = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - vt = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - wt = (mp_ptr) TMP_ALLOC ((size + 1) * BYTES_PER_MP_LIMB);
|
| - MPN_ZERO (ut, size);
|
| - MPN_ZERO (vt, size);
|
| - {int off;
|
| - off = size + (EXP (u) - hi) - ABSIZ (u);
|
| - MPN_COPY (ut + off, PTR (u), ABSIZ (u));
|
| - off = size + (EXP (v) - hi) - ABSIZ (v);
|
| - MPN_COPY (vt + off, PTR (v), ABSIZ (v));
|
| - }
|
| -
|
| - if (mpn_cmp (ut, vt, size) >= 0)
|
| - mpn_sub_n (wt, ut, vt, size);
|
| - else
|
| - {
|
| - mpn_sub_n (wt, vt, ut, size);
|
| - neg ^= 1;
|
| - }
|
| - exp = hi;
|
| - while (size != 0 && wt[size - 1] == 0)
|
| - {
|
| - size--;
|
| - exp--;
|
| - }
|
| -
|
| -done:
|
| - if (size > PREC (w))
|
| - {
|
| - wt += size - PREC (w);
|
| - size = PREC (w);
|
| - }
|
| - MPN_COPY (PTR (w), wt, size);
|
| - SIZ (w) = neg == 0 ? size : -size;
|
| - EXP (w) = exp;
|
| - TMP_FREE;
|
| -}
|
| -
|
| -
|
| -/* Validate got by comparing to want. Return 1 if good, 0 if bad.
|
| -
|
| - The data in got is compared to that in want, up to either PREC(got) limbs
|
| - or the size of got, whichever is bigger. Clearly we always demand
|
| - PREC(got) of accuracy, but we go further and say that if got is bigger
|
| - then any extra must be correct too.
|
| -
|
| - want needs to have enough data to allow this comparison. The size in
|
| - want doesn't have to be that big though, if it's smaller then further low
|
| - limbs are taken to be zero.
|
| -
|
| - This validation approach is designed to allow some flexibility in exactly
|
| - how much data is generated by an mpf function, ie. either prec or prec+1
|
| - limbs. We don't try to make a reference function that emulates that same
|
| - size decision, instead the idea is for a validation function to generate
|
| - at least as much data as the real function, then compare. */
|
| -
|
| -int
|
| -refmpf_validate (const char *name, mpf_srcptr got, mpf_srcptr want)
|
| -{
|
| - int bad = 0;
|
| - mp_size_t gsize, wsize, cmpsize, i;
|
| - mp_srcptr gp, wp;
|
| - mp_limb_t glimb, wlimb;
|
| -
|
| - MPF_CHECK_FORMAT (got);
|
| -
|
| - if (EXP (got) != EXP (want))
|
| - {
|
| - printf ("%s: wrong exponent\n", name);
|
| - bad = 1;
|
| - }
|
| -
|
| - gsize = SIZ (got);
|
| - wsize = SIZ (want);
|
| - if ((gsize < 0 && wsize > 0) || (gsize > 0 && wsize < 0))
|
| - {
|
| - printf ("%s: wrong sign\n", name);
|
| - bad = 1;
|
| - }
|
| -
|
| - gsize = ABS (gsize);
|
| - wsize = ABS (wsize);
|
| -
|
| - /* most significant limb of respective data */
|
| - gp = PTR (got) + gsize - 1;
|
| - wp = PTR (want) + wsize - 1;
|
| -
|
| - /* compare limb data */
|
| - cmpsize = MAX (PREC (got), gsize);
|
| - for (i = 0; i < cmpsize; i++)
|
| - {
|
| - glimb = (i < gsize ? gp[-i] : 0);
|
| - wlimb = (i < wsize ? wp[-i] : 0);
|
| -
|
| - if (glimb != wlimb)
|
| - {
|
| - printf ("%s: wrong data starting at index %ld from top\n",
|
| - name, (long) i);
|
| - bad = 1;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (bad)
|
| - {
|
| - printf (" prec %d\n", PREC(got));
|
| - printf (" exp got %ld\n", (long) EXP(got));
|
| - printf (" exp want %ld\n", (long) EXP(want));
|
| - printf (" size got %d\n", SIZ(got));
|
| - printf (" size want %d\n", SIZ(want));
|
| - printf (" limbs (high to low)\n");
|
| - printf (" got ");
|
| - for (i = ABSIZ(got)-1; i >= 0; i--)
|
| - {
|
| - gmp_printf ("%MX", PTR(got)[i]);
|
| - if (i != 0)
|
| - printf (",");
|
| - }
|
| - printf ("\n");
|
| - printf (" want ");
|
| - for (i = ABSIZ(want)-1; i >= 0; i--)
|
| - {
|
| - gmp_printf ("%MX", PTR(want)[i]);
|
| - if (i != 0)
|
| - printf (",");
|
| - }
|
| - printf ("\n");
|
| - return 0;
|
| - }
|
| -
|
| - return 1;
|
| -}
|
| -
|
| -
|
| -int
|
| -refmpf_validate_division (const char *name, mpf_srcptr got,
|
| - mpf_srcptr n, mpf_srcptr d)
|
| -{
|
| - mp_size_t nsize, dsize, sign, prec, qsize, tsize;
|
| - mp_srcptr np, dp;
|
| - mp_ptr tp, qp, rp;
|
| - mpf_t want;
|
| - int ret;
|
| -
|
| - nsize = SIZ (n);
|
| - dsize = SIZ (d);
|
| - ASSERT_ALWAYS (dsize != 0);
|
| -
|
| - sign = nsize ^ dsize;
|
| - nsize = ABS (nsize);
|
| - dsize = ABS (dsize);
|
| -
|
| - np = PTR (n);
|
| - dp = PTR (d);
|
| - prec = PREC (got);
|
| -
|
| - EXP (want) = EXP (n) - EXP (d) + 1;
|
| -
|
| - qsize = prec + 2; /* at least prec+1 limbs, after high zero */
|
| - tsize = qsize + dsize - 1; /* dividend size to give desired qsize */
|
| -
|
| - /* dividend n, extended or truncated */
|
| - tp = refmpn_malloc_limbs (tsize);
|
| - refmpn_copy_extend (tp, tsize, np, nsize);
|
| -
|
| - qp = refmpn_malloc_limbs (qsize);
|
| - rp = refmpn_malloc_limbs (dsize); /* remainder, unused */
|
| -
|
| - ASSERT_ALWAYS (qsize == tsize - dsize + 1);
|
| - refmpn_tdiv_qr (qp, rp, (mp_size_t) 0, tp, tsize, dp, dsize);
|
| -
|
| - PTR (want) = qp;
|
| - SIZ (want) = (sign >= 0 ? qsize : -qsize);
|
| - refmpf_normalize (want);
|
| -
|
| - ret = refmpf_validate (name, got, want);
|
| -
|
| - free (tp);
|
| - free (qp);
|
| - free (rp);
|
| -
|
| - return ret;
|
| -}
|
|
|