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