1/*
2
3Copyright 2012, 2014, Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
19
20#include <limits.h>
21#include <stdlib.h>
22#include <stdio.h>
23#include <string.h>
24
25#include "testutils.h"
26
27#define MAXBITS 400
28#define COUNT 10000
29
30#define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT)
31#define MAXLIMBS ((MAXBITS + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS)
32
33void
34testmain (int argc, char **argv)
35{
36  unsigned i;
37  mpz_t a, b, res, res_ui, ref, tz;
38  mp_limb_t t[2*MAXLIMBS];
39  mp_size_t an;
40
41  mpz_init (a);
42  mpz_init (b);
43  mpz_init (res);
44  mpz_init (res_ui);
45  mpz_init (ref);
46
47  for (i = 0; i < COUNT; i++)
48    {
49      mini_random_op3 (OP_MUL, MAXBITS, a, b, ref);
50      mpz_mul (res, a, b);
51      if (mpz_cmp (res, ref))
52	{
53	  fprintf (stderr, "mpz_mul failed:\n");
54	  dump ("a", a);
55	  dump ("b", b);
56	  dump ("r", res);
57	  dump ("ref", ref);
58	  abort ();
59	}
60      if (mpz_size (a) == mpz_size (b))
61	{
62	  memset (t, 0x55, sizeof(t));
63	  an = mpz_size (a);
64	  if (an > 0)
65	    {
66	      mpn_mul_n (t, a->_mp_d, b->_mp_d, an);
67
68	      mpz_roinit_n (tz, t, 2*an);
69	      if (mpz_cmpabs (tz, ref))
70		{
71		  fprintf (stderr, "mpn_mul_n failed:\n");
72		  dump ("a", a);
73		  dump ("b", b);
74		  dump ("ref", ref);
75		  abort ();
76		}
77	    }
78	}
79      if (mpz_fits_slong_p (b)) {
80	mpz_mul_si (res_ui, a, mpz_get_si (b));
81	if (mpz_cmp (res_ui, ref))
82	  {
83	    fprintf (stderr, "mpz_mul_si failed:\n");
84	    dump ("a", a);
85	    dump ("b", b);
86	    dump ("r", res_ui);
87	    dump ("ref", ref);
88	    abort ();
89	  }
90      }
91      mini_random_op2 (OP_SQR, MAXBITS, a, ref);
92      an = mpz_size (a);
93      if (an > 0)
94	{
95	  memset (t, 0x33, sizeof(t));
96	  mpn_sqr (t, mpz_limbs_read (a), an);
97
98	  mpz_roinit_n (tz, t, 2*an);
99	  if (mpz_cmp (tz, ref))
100	    {
101	      fprintf (stderr, "mpn (squaring) failed:\n");
102	      dump ("a", a);
103	      dump ("ref", ref);
104	      abort ();
105	    }
106	}
107    }
108  mpz_clear (a);
109  mpz_clear (b);
110  mpz_clear (res);
111  mpz_clear (res_ui);
112  mpz_clear (ref);
113}
114