1203954Srdivacky/* Test mpn_and, mpn_ior, mpn_xor, mpn_andn, mpn_iorn, mpn_xnor, mpn_nand, and
2203954Srdivacky   mpn_nior.
3203954Srdivacky
4203954SrdivackyCopyright 2011-2013 Free Software Foundation, Inc.
5203954Srdivacky
6203954SrdivackyThis file is part of the GNU MP Library test suite.
7203954Srdivacky
8203954SrdivackyThe GNU MP Library test suite is free software; you can redistribute it
9203954Srdivackyand/or modify it under the terms of the GNU General Public License as
10203954Srdivackypublished by the Free Software Foundation; either version 3 of the License,
11203954Srdivackyor (at your option) any later version.
12203954Srdivacky
13203954SrdivackyThe GNU MP Library test suite is distributed in the hope that it will be
14203954Srdivackyuseful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15203954SrdivackyMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
16203954SrdivackyPublic License for more details.
17203954Srdivacky
18203954SrdivackyYou should have received a copy of the GNU General Public License along with
19203954Srdivackythe GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
20203954Srdivacky
21203954Srdivacky
22203954Srdivacky#include <stdlib.h>
23203954Srdivacky#include <stdio.h>
24203954Srdivacky
25208599Srdivacky/* Fake native prevalence of the tested operations, so that we actually test
26203954Srdivacky   the compiled functions, i.e., the ones which users will reach.  The inlined
27203954Srdivacky   variants will be tested through tests/mpz/logic.c.  */
28203954Srdivacky#define HAVE_NATIVE_mpn_com    1
29203954Srdivacky#define HAVE_NATIVE_mpn_and_n  1
30203954Srdivacky#define HAVE_NATIVE_mpn_andn_n 1
31203954Srdivacky#define HAVE_NATIVE_mpn_nand_n 1
32218893Sdim#define HAVE_NATIVE_mpn_ior_n  1
33203954Srdivacky#define HAVE_NATIVE_mpn_iorn_n 1
34203954Srdivacky#define HAVE_NATIVE_mpn_nior_n 1
35203954Srdivacky#define HAVE_NATIVE_mpn_xor_n  1
36203954Srdivacky#define HAVE_NATIVE_mpn_xnor_n 1
37218893Sdim
38203954Srdivacky#include "gmp-impl.h"
39204642Srdivacky#include "tests.h"
40203954Srdivacky
41203954Srdivacky
42203954Srdivackyvoid
43203954Srdivackycheck_one (mp_srcptr refp, mp_srcptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n, const char *funcname)
44203954Srdivacky{
45203954Srdivacky  if (mpn_cmp (refp, rp, n))
46203954Srdivacky    {
47203954Srdivacky      printf ("ERROR in mpn_%s\n", funcname);
48203954Srdivacky      printf ("a: "); mpn_dump (ap, n);
49203954Srdivacky      printf ("b: "); mpn_dump (bp, n);
50218893Sdim      printf ("r:   "); mpn_dump (rp, n);
51218893Sdim      printf ("ref: "); mpn_dump (refp, n);
52207618Srdivacky      abort();
53203954Srdivacky    }
54203954Srdivacky}
55218893Sdim
56218893Sdimint
57218893Sdimmain (int argc, char **argv)
58207618Srdivacky{
59203954Srdivacky  mpz_t a, b;
60203954Srdivacky  mp_ptr ap, bp, rp, refp;
61218893Sdim  mp_size_t max_n, n, i;
62218893Sdim  gmp_randstate_ptr rands;
63207618Srdivacky  long test, reps = 1000;
64203954Srdivacky  TMP_DECL;
65203954Srdivacky  TMP_MARK;
66218893Sdim
67218893Sdim  tests_start ();
68207618Srdivacky  TESTS_REPS (reps, argv, argc);
69203954Srdivacky
70203954Srdivacky  mpz_inits (a, b, NULL);
71218893Sdim
72218893Sdim  rands = RANDS;		/* FIXME: not used */
73218893Sdim
74207618Srdivacky  max_n = 100;
75203954Srdivacky
76203954Srdivacky  rp = TMP_ALLOC_LIMBS (1 + max_n * 8 / GMP_LIMB_BITS);
77218893Sdim  refp = TMP_ALLOC_LIMBS (1 + max_n * 8 / GMP_LIMB_BITS);
78218893Sdim
79218893Sdim  for (test = 0; test < reps; test++)
80207618Srdivacky    {
81203954Srdivacky      for (i = 1; i <= max_n; i++)
82203954Srdivacky	{
83218893Sdim	  mpz_rrandomb (a, rands, i * 8);
84218893Sdim	  mpz_rrandomb (b, rands, i * 8);
85207618Srdivacky	  mpz_setbit (a, i * 8 - 1);
86203954Srdivacky	  mpz_setbit (b, i * 8 - 1);
87203954Srdivacky	  ap = PTR(a);
88218893Sdim	  bp = PTR(b);
89218893Sdim	  n = SIZ(a);
90207618Srdivacky
91203954Srdivacky	  refmpn_and_n (refp, ap, bp, n);
92203954Srdivacky	  mpn_and_n (rp, ap, bp, n);
93218893Sdim	  check_one (refp, rp, ap, bp, n, "and_n");
94218893Sdim
95207618Srdivacky	  refmpn_ior_n (refp, ap, bp, n);
96203954Srdivacky	  mpn_ior_n (rp, ap, bp, n);
97203954Srdivacky	  check_one (refp, rp, ap, bp, n, "ior_n");
98218893Sdim
99218893Sdim	  refmpn_xor_n (refp, ap, bp, n);
100207618Srdivacky	  mpn_xor_n (rp, ap, bp, n);
101203954Srdivacky	  check_one (refp, rp, ap, bp, n, "xor_n");
102203954Srdivacky
103218893Sdim	  refmpn_andn_n (refp, ap, bp, n);
104218893Sdim	  mpn_andn_n (rp, ap, bp, n);
105207618Srdivacky	  check_one (refp, rp, ap, bp, n, "andn_n");
106203954Srdivacky
107203954Srdivacky	  refmpn_iorn_n (refp, ap, bp, n);
108218893Sdim	  mpn_iorn_n (rp, ap, bp, n);
109218893Sdim	  check_one (refp, rp, ap, bp, n, "iorn_n");
110207618Srdivacky
111203954Srdivacky	  refmpn_nand_n (refp, ap, bp, n);
112203954Srdivacky	  mpn_nand_n (rp, ap, bp, n);
113218893Sdim	  check_one (refp, rp, ap, bp, n, "nand_n");
114218893Sdim
115207618Srdivacky	  refmpn_nior_n (refp, ap, bp, n);
116203954Srdivacky	  mpn_nior_n (rp, ap, bp, n);
117203954Srdivacky	  check_one (refp, rp, ap, bp, n, "nior_n");
118218893Sdim
119218893Sdim	  refmpn_xnor_n (refp, ap, bp, n);
120207618Srdivacky	  mpn_xnor_n (rp, ap, bp, n);
121203954Srdivacky	  check_one (refp, rp, ap, bp, n, "xnor_n");
122203954Srdivacky
123218893Sdim	  refmpn_com (refp, ap, n);
124218893Sdim	  mpn_com (rp, ap, n);
125207618Srdivacky	  check_one (refp, rp, ap, bp, n, "com");
126203954Srdivacky	}
127203954Srdivacky    }
128203954Srdivacky
129203954Srdivacky  TMP_FREE;
130203954Srdivacky  mpz_clears (a, b, NULL);
131203954Srdivacky  tests_end ();
132203954Srdivacky  return 0;
133203954Srdivacky}
134218893Sdim