github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/devel/logops_n.c (about) 1 /* 2 Copyright 1996-2004, 2009 Free Software Foundation, Inc. 3 4 This file is part of the GNU MP Library test suite. 5 6 The GNU MP Library test suite is free software; you can redistribute it 7 and/or modify it under the terms of the GNU General Public License as 8 published by the Free Software Foundation; either version 3 of the License, 9 or (at your option) any later version. 10 11 The GNU MP Library test suite is distributed in the hope that it will be 12 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 14 Public License for more details. 15 16 You should have received a copy of the GNU General Public License along with 17 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 18 19 #include <stdlib.h> 20 #include <stdio.h> 21 #include "gmp.h" 22 #include "gmp-impl.h" 23 #include "tests.h" 24 25 #ifdef OPERATION_and_n 26 #define func __gmpn_and_n 27 #define reffunc refmpn_and_n 28 #define funcname "mpn_and_n" 29 #endif 30 31 #ifdef OPERATION_andn_n 32 #define func __gmpn_andn_n 33 #define reffunc refmpn_andn_n 34 #define funcname "mpn_andn_n" 35 #endif 36 37 #ifdef OPERATION_nand_n 38 #define func __gmpn_nand_n 39 #define reffunc refmpn_nand_n 40 #define funcname "mpn_nand_n" 41 #endif 42 43 #ifdef OPERATION_ior_n 44 #define func __gmpn_ior_n 45 #define reffunc refmpn_ior_n 46 #define funcname "mpn_ior_n" 47 #endif 48 49 #ifdef OPERATION_iorn_n 50 #define func __gmpn_iorn_n 51 #define reffunc refmpn_iorn_n 52 #define funcname "mpn_iorn_n" 53 #endif 54 55 #ifdef OPERATION_nior_n 56 #define func __gmpn_nior_n 57 #define reffunc refmpn_nior_n 58 #define funcname "mpn_nior_n" 59 #endif 60 61 #ifdef OPERATION_xor_n 62 #define func __gmpn_xor_n 63 #define reffunc refmpn_xor_n 64 #define funcname "mpn_xor_n" 65 #endif 66 67 #ifdef OPERATION_xnor_n 68 #define func __gmpn_xnor_n 69 #define reffunc refmpn_xnor_n 70 #define funcname "mpn_xnor_n" 71 #endif 72 73 #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux) 74 #include <time.h> 75 76 int 77 cputime () 78 { 79 if (CLOCKS_PER_SEC < 100000) 80 return clock () * 1000 / CLOCKS_PER_SEC; 81 return clock () / (CLOCKS_PER_SEC / 1000); 82 } 83 #else 84 #include <sys/types.h> 85 #include <sys/time.h> 86 #include <sys/resource.h> 87 88 int 89 cputime () 90 { 91 struct rusage rus; 92 93 getrusage (0, &rus); 94 return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000; 95 } 96 #endif 97 98 static void mpn_print (mp_ptr, mp_size_t); 99 100 #define M * 1000000 101 102 #ifndef CLOCK 103 #error "Don't know CLOCK of your machine" 104 #endif 105 106 #ifndef OPS 107 #define OPS (CLOCK/5) 108 #endif 109 #ifndef SIZE 110 #define SIZE 328 111 #endif 112 #ifndef TIMES 113 #define TIMES OPS/(SIZE+1) 114 #endif 115 116 int 117 main (int argc, char **argv) 118 { 119 mp_ptr s1, s2, dx, dy; 120 int i; 121 long t0, t; 122 unsigned int test; 123 mp_size_t size; 124 unsigned int ntests; 125 126 s1 = malloc (SIZE * sizeof (mp_limb_t)); 127 s2 = malloc (SIZE * sizeof (mp_limb_t)); 128 dx = malloc ((SIZE + 2) * sizeof (mp_limb_t)); 129 dy = malloc ((SIZE + 2) * sizeof (mp_limb_t)); 130 131 ntests = ~(unsigned) 0; 132 if (argc == 2) 133 ntests = strtol (argv[1], 0, 0); 134 135 for (test = 1; test <= ntests; test++) 136 { 137 #if TIMES == 1 && ! defined (PRINT) 138 if (test % (SIZE > 100000 ? 1 : 100000 / SIZE) == 0) 139 { 140 printf ("\r%d", test); 141 fflush (stdout); 142 } 143 #endif 144 145 #ifdef RANDOM 146 size = random () % SIZE + 1; 147 #else 148 size = SIZE; 149 #endif 150 151 dx[0] = 0x87654321; 152 dy[0] = 0x87654321; 153 dx[size+1] = 0x12345678; 154 dy[size+1] = 0x12345678; 155 156 #if TIMES != 1 157 mpn_random (s1, size); 158 mpn_random (s2, size); 159 160 t0 = cputime(); 161 for (i = 0; i < TIMES; i++) 162 func (dx+1, s1, s2, size); 163 t = cputime() - t0; 164 printf (funcname ": %5ldms (%.3f cycles/limb)\n", 165 t, ((double) t * CLOCK) / (TIMES * size * 1000.0)); 166 #endif 167 168 #ifndef NOCHECK 169 mpn_random2 (s1, size); 170 mpn_random2 (s2, size); 171 172 #ifdef PRINT 173 mpn_print (s1, size); 174 mpn_print (s2, size); 175 #endif 176 177 /* Put garbage in the destination. */ 178 for (i = 0; i < size; i++) 179 { 180 dx[i+1] = 0xdead; 181 dy[i+1] = 0xbeef; 182 } 183 184 reffunc (dx+1, s1, s2, size); 185 func (dy+1, s1, s2, size); 186 #ifdef PRINT 187 mpn_print (dx+1, size); 188 mpn_print (dy+1, size); 189 #endif 190 if (mpn_cmp (dx, dy, size+2) != 0 191 || dx[0] != 0x87654321 || dx[size+1] != 0x12345678) 192 { 193 #ifndef PRINT 194 mpn_print (dx+1, size); 195 mpn_print (dy+1, size); 196 #endif 197 printf ("\n"); 198 if (dy[0] != 0x87654321) 199 printf ("clobbered at low end\n"); 200 if (dy[size+1] != 0x12345678) 201 printf ("clobbered at high end\n"); 202 printf ("TEST NUMBER %u\n", test); 203 abort(); 204 } 205 #endif 206 } 207 exit (0); 208 } 209 210 static void 211 mpn_print (mp_ptr p, mp_size_t size) 212 { 213 mp_size_t i; 214 215 for (i = size - 1; i >= 0; i--) 216 { 217 #ifdef _LONG_LONG_LIMB 218 printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)), 219 (unsigned long) (p[i] >> (GMP_LIMB_BITS/2)), 220 (int) (sizeof(mp_limb_t)), (unsigned long) (p[i])); 221 #else 222 printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]); 223 #endif 224 #ifdef SPACE 225 if (i != 0) 226 printf (" "); 227 #endif 228 } 229 puts (""); 230 }