From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/mini-gmp/tests/t-limbs.c | 111 +++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 gmp-6.3.0/mini-gmp/tests/t-limbs.c (limited to 'gmp-6.3.0/mini-gmp/tests/t-limbs.c') diff --git a/gmp-6.3.0/mini-gmp/tests/t-limbs.c b/gmp-6.3.0/mini-gmp/tests/t-limbs.c new file mode 100644 index 0000000..f4e57dd --- /dev/null +++ b/gmp-6.3.0/mini-gmp/tests/t-limbs.c @@ -0,0 +1,111 @@ +/* + +Copyright 2012, 2014, 2016, Free Software Foundation, Inc. + +This file is part of the GNU MP Library test suite. + +The GNU MP Library test suite is free software; you can redistribute it +and/or modify it under the terms of the GNU 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 test suite 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 General +Public License for more details. + +You should have received a copy of the GNU General Public License along with +the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ + +#include +#include +#include +#include +#include + +#include "testutils.h" + +#define MAXBITS 400 +#define COUNT 100 + +void +my_mpz_mul (mpz_t r, mpz_srcptr a, mpz_srcptr b) +{ + mp_limb_t *tp; + mp_size_t tn, an, bn; + + an = mpz_size (a); + bn = mpz_size (b); + + assert (an > 0); + assert (bn > 0); + + tn = an + bn; + tp = mpz_limbs_write (r, tn); + if (an > bn) + mpn_mul (tp, mpz_limbs_read (a), an, mpz_limbs_read (b), bn); + else + mpn_mul (tp, mpz_limbs_read (b), bn, mpz_limbs_read (a), an); + + if (mpz_sgn (a) != mpz_sgn(b)) + tn = - tn; + + mpz_limbs_finish (r, tn); +} + +void +testmain (int argc, char **argv) +{ + unsigned i; + mpz_t a, b, res, ref; + + mpz_init (a); + mpz_init (b); + mpz_init (res); + mpz_init (ref); + + for (i = 0; i < COUNT; i++) + { + mini_random_op3 (OP_MUL, MAXBITS, a, b, ref); + if (mpz_sgn(ref) == 0) + /* my_mpz_mul requires a != 0, b != 0 */ + continue; + my_mpz_mul (res, a, b); + if (mpz_cmp (res, ref)) + { + fprintf (stderr, "my_mpz_mul failed:\n"); + dump ("a", a); + dump ("b", b); + dump ("r", res); + dump ("ref", ref); + abort (); + } + /* The following test exploits a side-effect of my_mpz_mul: res + points to a buffer with at least an+bn limbs, and the limbs + above the result are zeroed. */ + if (mpz_size (b) > 0 && mpz_getlimbn (res, mpz_size(a)) != mpz_limbs_read (res) [mpz_size(a)]) + { + fprintf (stderr, "getlimbn - limbs_read differ.\n"); + abort (); + } + if ((i % 4 == 0) && mpz_size (res) > 1) + { + mpz_realloc2 (res, 1); + if (mpz_cmp_ui (res, 0)) + { + fprintf (stderr, "mpz_realloc2 did not clear res.\n"); + abort (); + } + mpz_limbs_finish (ref, 0); + if (mpz_cmp_d (ref, 0)) + { + fprintf (stderr, "mpz_limbs_finish did not clear res.\n"); + abort (); + } + } + } + mpz_clear (a); + mpz_clear (b); + mpz_clear (res); + mpz_clear (ref); +} -- cgit v1.2.3