1 1.1 mrg /* Test mpn_and, mpn_ior, mpn_xor, mpn_andn, mpn_iorn, mpn_xnor, mpn_nand, and 2 1.1 mrg mpn_nior. 3 1.1 mrg 4 1.1.1.2 mrg Copyright 2011-2013 Free Software Foundation, Inc. 5 1.1 mrg 6 1.1 mrg This file is part of the GNU MP Library test suite. 7 1.1 mrg 8 1.1 mrg The GNU MP Library test suite is free software; you can redistribute it 9 1.1 mrg and/or modify it under the terms of the GNU General Public License as 10 1.1 mrg published by the Free Software Foundation; either version 3 of the License, 11 1.1 mrg or (at your option) any later version. 12 1.1 mrg 13 1.1 mrg The GNU MP Library test suite is distributed in the hope that it will be 14 1.1 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 16 1.1 mrg Public License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU General Public License along with 19 1.1.1.2 mrg the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 20 1.1 mrg 21 1.1 mrg 22 1.1 mrg #include <stdlib.h> 23 1.1 mrg #include <stdio.h> 24 1.1 mrg 25 1.1 mrg /* Fake native prevalence of the tested operations, so that we actually test 26 1.1 mrg the compiled functions, i.e., the ones which users will reach. The inlined 27 1.1 mrg variants will be tested through tests/mpz/logic.c. */ 28 1.1 mrg #define HAVE_NATIVE_mpn_com 1 29 1.1 mrg #define HAVE_NATIVE_mpn_and_n 1 30 1.1 mrg #define HAVE_NATIVE_mpn_andn_n 1 31 1.1 mrg #define HAVE_NATIVE_mpn_nand_n 1 32 1.1 mrg #define HAVE_NATIVE_mpn_ior_n 1 33 1.1 mrg #define HAVE_NATIVE_mpn_iorn_n 1 34 1.1 mrg #define HAVE_NATIVE_mpn_nior_n 1 35 1.1 mrg #define HAVE_NATIVE_mpn_xor_n 1 36 1.1 mrg #define HAVE_NATIVE_mpn_xnor_n 1 37 1.1 mrg 38 1.1 mrg #include "gmp-impl.h" 39 1.1 mrg #include "tests.h" 40 1.1 mrg 41 1.1 mrg 42 1.1 mrg void 43 1.1.1.2 mrg check_one (mp_srcptr refp, mp_srcptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n, const char *funcname) 44 1.1 mrg { 45 1.1 mrg if (mpn_cmp (refp, rp, n)) 46 1.1 mrg { 47 1.1 mrg printf ("ERROR in mpn_%s\n", funcname); 48 1.1 mrg printf ("a: "); mpn_dump (ap, n); 49 1.1 mrg printf ("b: "); mpn_dump (bp, n); 50 1.1 mrg printf ("r: "); mpn_dump (rp, n); 51 1.1 mrg printf ("ref: "); mpn_dump (refp, n); 52 1.1 mrg abort(); 53 1.1 mrg } 54 1.1 mrg } 55 1.1 mrg 56 1.1 mrg int 57 1.1 mrg main (int argc, char **argv) 58 1.1 mrg { 59 1.1.1.2 mrg mpz_t a, b; 60 1.1 mrg mp_ptr ap, bp, rp, refp; 61 1.1.1.2 mrg mp_size_t max_n, n, i; 62 1.1 mrg gmp_randstate_ptr rands; 63 1.1 mrg long test, reps = 1000; 64 1.1.1.2 mrg TMP_DECL; 65 1.1.1.2 mrg TMP_MARK; 66 1.1 mrg 67 1.1 mrg tests_start (); 68 1.1 mrg TESTS_REPS (reps, argv, argc); 69 1.1 mrg 70 1.1.1.2 mrg mpz_inits (a, b, NULL); 71 1.1 mrg 72 1.1.1.2 mrg rands = RANDS; /* FIXME: not used */ 73 1.1 mrg 74 1.1.1.2 mrg max_n = 100; 75 1.1.1.2 mrg 76 1.1.1.2 mrg rp = TMP_ALLOC_LIMBS (1 + max_n * 8 / GMP_LIMB_BITS); 77 1.1.1.2 mrg refp = TMP_ALLOC_LIMBS (1 + max_n * 8 / GMP_LIMB_BITS); 78 1.1 mrg 79 1.1 mrg for (test = 0; test < reps; test++) 80 1.1 mrg { 81 1.1.1.2 mrg for (i = 1; i <= max_n; i++) 82 1.1 mrg { 83 1.1.1.2 mrg mpz_rrandomb (a, rands, i * 8); 84 1.1.1.2 mrg mpz_rrandomb (b, rands, i * 8); 85 1.1.1.2 mrg mpz_setbit (a, i * 8 - 1); 86 1.1.1.2 mrg mpz_setbit (b, i * 8 - 1); 87 1.1.1.2 mrg ap = PTR(a); 88 1.1.1.2 mrg bp = PTR(b); 89 1.1.1.2 mrg n = SIZ(a); 90 1.1 mrg 91 1.1 mrg refmpn_and_n (refp, ap, bp, n); 92 1.1 mrg mpn_and_n (rp, ap, bp, n); 93 1.1 mrg check_one (refp, rp, ap, bp, n, "and_n"); 94 1.1 mrg 95 1.1 mrg refmpn_ior_n (refp, ap, bp, n); 96 1.1 mrg mpn_ior_n (rp, ap, bp, n); 97 1.1 mrg check_one (refp, rp, ap, bp, n, "ior_n"); 98 1.1 mrg 99 1.1 mrg refmpn_xor_n (refp, ap, bp, n); 100 1.1 mrg mpn_xor_n (rp, ap, bp, n); 101 1.1 mrg check_one (refp, rp, ap, bp, n, "xor_n"); 102 1.1 mrg 103 1.1 mrg refmpn_andn_n (refp, ap, bp, n); 104 1.1 mrg mpn_andn_n (rp, ap, bp, n); 105 1.1 mrg check_one (refp, rp, ap, bp, n, "andn_n"); 106 1.1 mrg 107 1.1 mrg refmpn_iorn_n (refp, ap, bp, n); 108 1.1 mrg mpn_iorn_n (rp, ap, bp, n); 109 1.1 mrg check_one (refp, rp, ap, bp, n, "iorn_n"); 110 1.1 mrg 111 1.1 mrg refmpn_nand_n (refp, ap, bp, n); 112 1.1 mrg mpn_nand_n (rp, ap, bp, n); 113 1.1 mrg check_one (refp, rp, ap, bp, n, "nand_n"); 114 1.1 mrg 115 1.1 mrg refmpn_nior_n (refp, ap, bp, n); 116 1.1 mrg mpn_nior_n (rp, ap, bp, n); 117 1.1 mrg check_one (refp, rp, ap, bp, n, "nior_n"); 118 1.1 mrg 119 1.1 mrg refmpn_xnor_n (refp, ap, bp, n); 120 1.1 mrg mpn_xnor_n (rp, ap, bp, n); 121 1.1 mrg check_one (refp, rp, ap, bp, n, "xnor_n"); 122 1.1 mrg 123 1.1 mrg refmpn_com (refp, ap, n); 124 1.1 mrg mpn_com (rp, ap, n); 125 1.1 mrg check_one (refp, rp, ap, bp, n, "com"); 126 1.1 mrg } 127 1.1 mrg } 128 1.1 mrg 129 1.1.1.2 mrg TMP_FREE; 130 1.1.1.2 mrg mpz_clears (a, b, NULL); 131 1.1 mrg tests_end (); 132 1.1 mrg return 0; 133 1.1 mrg } 134