1 /* Tests support prototypes etc. 2 3 Copyright 2000-2004, 2008-2013 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 20 21 #ifndef __TESTS_H__ 22 #define __TESTS_H__ 23 24 #include "config.h" 25 26 #include <setjmp.h> /* for jmp_buf */ 27 28 #if defined (__cplusplus) 29 extern "C" { 30 #endif 31 32 33 #ifdef __cplusplus 34 #define ANYARGS ... 35 #else 36 #define ANYARGS 37 #endif 38 39 40 void tests_start (void); 41 void tests_end (void); 42 43 void tests_memory_start (void); 44 void tests_memory_end (void); 45 void *tests_allocate (size_t); 46 void *tests_reallocate (void *, size_t, size_t); 47 void tests_free (void *, size_t); 48 void tests_free_nosize (void *); 49 int tests_memory_valid (void *); 50 51 void tests_rand_start (void); 52 void tests_rand_end (void); 53 54 double tests_infinity_d (); 55 int tests_hardware_getround (void); 56 int tests_hardware_setround (int); 57 int tests_isinf (double); 58 int tests_dbl_mant_bits (void); 59 60 void x86_fldcw (unsigned short); 61 unsigned short x86_fstcw (void); 62 63 64 /* tests_setjmp_sigfpe is like a setjmp, establishing a trap for SIGFPE. 65 The initial return is 0, if SIGFPE is trapped execution goes back there 66 with return value 1. 67 68 tests_sigfpe_done puts SIGFPE back to SIG_DFL, which should be used once 69 the setjmp point is out of scope, so a later SIGFPE won't try to go back 70 there. */ 71 72 #define tests_setjmp_sigfpe() \ 73 (signal (SIGFPE, tests_sigfpe_handler), \ 74 setjmp (tests_sigfpe_target)) 75 76 RETSIGTYPE tests_sigfpe_handler (int); 77 void tests_sigfpe_done (void); 78 extern jmp_buf tests_sigfpe_target; 79 80 81 #if HAVE_CALLING_CONVENTIONS 82 extern mp_limb_t (*calling_conventions_function) (ANYARGS); 83 mp_limb_t calling_conventions (ANYARGS); 84 int calling_conventions_check (void); 85 #define CALLING_CONVENTIONS(function) \ 86 (calling_conventions_function = (function), calling_conventions) 87 #define CALLING_CONVENTIONS_CHECK() (calling_conventions_check()) 88 #else 89 #define CALLING_CONVENTIONS(function) (function) 90 #define CALLING_CONVENTIONS_CHECK() 1 /* always ok */ 91 #endif 92 93 94 extern int mp_trace_base; 95 void mp_limb_trace (const char *, mp_limb_t); 96 void mpn_trace (const char *, mp_srcptr, mp_size_t); 97 void mpn_tracea (const char *, const mp_ptr *, int, mp_size_t); 98 void mpn_tracen (const char *, int, mp_srcptr, mp_size_t); 99 void mpn_trace_file (const char *, mp_srcptr, mp_size_t); 100 void mpn_tracea_file (const char *, const mp_ptr *, int, mp_size_t); 101 void mpf_trace (const char *, mpf_srcptr); 102 void mpq_trace (const char *, mpq_srcptr); 103 void mpz_trace (const char *, mpz_srcptr); 104 void mpz_tracen (const char *, int, mpz_srcptr); 105 void byte_trace (const char *, const void *, mp_size_t); 106 void byte_tracen (const char *, int, const void *, mp_size_t); 107 void d_trace (const char *, double); 108 109 110 void spinner (void); 111 extern unsigned long spinner_count; 112 extern int spinner_wanted; 113 extern int spinner_tick; 114 115 116 void *align_pointer (void *, size_t); 117 void *__gmp_allocate_func_aligned (size_t, size_t); 118 void *__gmp_allocate_or_reallocate (void *, size_t, size_t); 119 char *__gmp_allocate_strdup (const char *); 120 char *strtoupper (char *); 121 mp_limb_t urandom (void); 122 void call_rand_algs (void (*func) (const char *, gmp_randstate_t)); 123 124 125 void mpf_set_str_or_abort (mpf_ptr, const char *, int); 126 127 128 void mpq_set_str_or_abort (mpq_ptr, const char *, int); 129 130 131 void mpz_erandomb (mpz_ptr, gmp_randstate_t, unsigned long); 132 void mpz_erandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long); 133 void mpz_errandomb (mpz_ptr, gmp_randstate_t, unsigned long); 134 void mpz_errandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long); 135 void mpz_init_set_n (mpz_ptr, mp_srcptr, mp_size_t); 136 void mpz_negrandom (mpz_ptr, gmp_randstate_t); 137 int mpz_pow2abs_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE; 138 void mpz_set_n (mpz_ptr, mp_srcptr, mp_size_t); 139 void mpz_set_str_or_abort (mpz_ptr, const char *, int); 140 void mpz_clobber(mpz_ptr); 141 142 mp_size_t mpn_diff_highest (mp_srcptr, mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE; 143 mp_size_t mpn_diff_lowest (mp_srcptr, mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE; 144 mp_size_t byte_diff_highest (const void *, const void *, mp_size_t) __GMP_ATTRIBUTE_PURE; 145 mp_size_t byte_diff_lowest (const void *, const void *, mp_size_t) __GMP_ATTRIBUTE_PURE; 146 147 148 mp_limb_t ref_addc_limb (mp_limb_t *, mp_limb_t, mp_limb_t); 149 mp_limb_t ref_bswap_limb (mp_limb_t); 150 unsigned long ref_popc_limb (mp_limb_t); 151 mp_limb_t ref_subc_limb (mp_limb_t *, mp_limb_t, mp_limb_t); 152 153 154 void refmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr); 155 void refmpf_add_ulp (mpf_ptr ); 156 void refmpf_fill (mpf_ptr, mp_size_t, mp_limb_t); 157 void refmpf_normalize (mpf_ptr); 158 void refmpf_set_prec_limbs (mpf_ptr, unsigned long); 159 unsigned long refmpf_set_overlap (mpf_ptr, mpf_srcptr); 160 void refmpf_sub (mpf_ptr, mpf_srcptr, mpf_srcptr); 161 int refmpf_validate (const char *, mpf_srcptr, mpf_srcptr); 162 int refmpf_validate_division (const char *, mpf_srcptr, mpf_srcptr, mpf_srcptr); 163 164 165 mp_limb_t refmpn_cnd_add_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 166 mp_limb_t refmpn_cnd_sub_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 167 168 mp_limb_t refmpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 169 mp_limb_t refmpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 170 mp_limb_t refmpn_add_err1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 171 mp_limb_t refmpn_add_err2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 172 mp_limb_t refmpn_add_err3_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 173 mp_limb_t refmpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 174 mp_limb_t refmpn_add_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 175 mp_limb_t refmpn_addlsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 176 mp_limb_t refmpn_addlsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 177 mp_limb_t refmpn_addlsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned); 178 mp_limb_t refmpn_addlsh1_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 179 mp_limb_t refmpn_addlsh2_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 180 mp_limb_t refmpn_addlsh_n_ip1 (mp_ptr, mp_srcptr, mp_size_t, unsigned); 181 mp_limb_t refmpn_addlsh1_n_ip2 (mp_ptr, mp_srcptr, mp_size_t); 182 mp_limb_t refmpn_addlsh2_n_ip2 (mp_ptr, mp_srcptr, mp_size_t); 183 mp_limb_t refmpn_addlsh_n_ip2 (mp_ptr, mp_srcptr, mp_size_t, unsigned); 184 mp_limb_t refmpn_addlsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 185 mp_limb_t refmpn_addlsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 186 mp_limb_t refmpn_addlsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned, mp_limb_t); 187 mp_limb_t refmpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 188 mp_limb_t refmpn_addmul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 189 mp_limb_t refmpn_addmul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 190 mp_limb_t refmpn_addmul_3 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 191 mp_limb_t refmpn_addmul_4 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 192 mp_limb_t refmpn_addmul_5 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 193 mp_limb_t refmpn_addmul_6 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 194 mp_limb_t refmpn_addmul_7 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 195 mp_limb_t refmpn_addmul_8 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 196 197 mp_limb_t refmpn_add_n_sub_n (mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 198 mp_limb_t refmpn_add_n_sub_nc (mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 199 200 void refmpn_and_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 201 void refmpn_andn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 202 203 mp_limb_t refmpn_big_base (int); 204 205 int refmpn_chars_per_limb (int); 206 void refmpn_clrbit (mp_ptr, unsigned long); 207 int refmpn_cmp (mp_srcptr, mp_srcptr, mp_size_t); 208 int refmpn_cmp_allowzero (mp_srcptr, mp_srcptr, mp_size_t); 209 int refmpn_cmp_twosizes (mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 210 211 void refmpn_com (mp_ptr, mp_srcptr, mp_size_t); 212 void refmpn_copy (mp_ptr, mp_srcptr, mp_size_t); 213 void refmpn_copyi (mp_ptr, mp_srcptr, mp_size_t); 214 void refmpn_copyd (mp_ptr, mp_srcptr, mp_size_t); 215 void refmpn_copy_extend (mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 216 217 unsigned refmpn_count_leading_zeros (mp_limb_t); 218 unsigned refmpn_count_trailing_zeros (mp_limb_t); 219 220 mp_limb_t refmpn_divexact_by3 (mp_ptr, mp_srcptr, mp_size_t); 221 mp_limb_t refmpn_divexact_by3c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 222 223 mp_limb_t refmpn_divmod_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 224 mp_limb_t refmpn_divmod_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 225 mp_limb_t refmpn_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t); 226 mp_limb_t refmpn_divrem_1c (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 227 mp_limb_t refmpn_divrem_2 (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr); 228 229 int refmpn_equal_anynail (mp_srcptr, mp_srcptr, mp_size_t); 230 231 void refmpn_fill (mp_ptr, mp_size_t, mp_limb_t); 232 233 mp_limb_t refmpn_gcd_11 (mp_limb_t, mp_limb_t); 234 mp_limb_t refmpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t); 235 mp_double_limb_t refmpn_gcd_22 (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t); 236 mp_limb_t refmpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t); 237 238 size_t refmpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); 239 240 unsigned long refmpn_hamdist (mp_srcptr, mp_srcptr, mp_size_t); 241 242 mp_limb_t refmpn_invert_limb (mp_limb_t); 243 void refmpn_ior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 244 void refmpn_iorn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 245 246 mp_limb_t refmpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned); 247 mp_limb_t refmpn_lshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned); 248 mp_limb_t refmpn_lshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned); 249 mp_limb_t refmpn_lshiftc (mp_ptr, mp_srcptr, mp_size_t, unsigned); 250 void refmpn_com (mp_ptr, mp_srcptr, mp_size_t); 251 252 mp_ptr refmpn_malloc_limbs (mp_size_t); 253 mp_ptr refmpn_malloc_limbs_aligned (mp_size_t, size_t); 254 void refmpn_free_limbs (mp_ptr); 255 mp_limb_t refmpn_msbone (mp_limb_t); 256 mp_limb_t refmpn_msbone_mask (mp_limb_t); 257 mp_ptr refmpn_memdup_limbs (mp_srcptr, mp_size_t); 258 259 mp_limb_t refmpn_mod_1 (mp_srcptr, mp_size_t, mp_limb_t); 260 mp_limb_t refmpn_mod_1c (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 261 mp_limb_t refmpn_mod_34lsub1 (mp_srcptr, mp_size_t); 262 263 mp_limb_t refmpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 264 mp_limb_t refmpn_mul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 265 mp_limb_t refmpn_mul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 266 mp_limb_t refmpn_mul_3 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 267 mp_limb_t refmpn_mul_4 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 268 mp_limb_t refmpn_mul_5 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 269 mp_limb_t refmpn_mul_6 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 270 271 void refmpn_mul_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 272 void refmpn_mulmid_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 273 void refmpn_toom42_mulmid (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr); 274 void refmpn_mulmid_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 275 void refmpn_mulmid (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 276 void refmpn_mullo_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 277 void refmpn_mul_any (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 278 void refmpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 279 void refmpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 280 281 void refmpn_nand_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 282 void refmpn_nior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 283 mp_limb_t refmpn_neg (mp_ptr, mp_srcptr, mp_size_t); 284 mp_size_t refmpn_normalize (mp_srcptr, mp_size_t); 285 286 unsigned long refmpn_popcount (mp_srcptr, mp_size_t); 287 mp_limb_t refmpn_preinv_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, unsigned); 288 mp_limb_t refmpn_preinv_mod_1 (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 289 290 void refmpn_random (mp_ptr, mp_size_t); 291 void refmpn_random2 (mp_ptr, mp_size_t); 292 mp_limb_t refmpn_random_limb (void); 293 294 mp_limb_t refmpn_rsh1add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 295 mp_limb_t refmpn_rsh1sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 296 mp_limb_t refmpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned); 297 mp_limb_t refmpn_rshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned); 298 mp_limb_t refmpn_rshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned); 299 300 mp_limb_t refmpn_sb_div_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 301 unsigned long refmpn_scan0 (mp_srcptr, unsigned long); 302 unsigned long refmpn_scan1 (mp_srcptr, unsigned long); 303 void refmpn_setbit (mp_ptr, unsigned long); 304 void refmpn_sqr (mp_ptr, mp_srcptr, mp_size_t); 305 void refmpn_sqrlo (mp_ptr, mp_srcptr, mp_size_t); 306 mp_size_t refmpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t); 307 308 void refmpn_sub_ddmmss (mp_limb_t *, mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t); 309 mp_limb_t refmpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 310 mp_limb_t refmpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 311 mp_limb_t refmpn_sub_err1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 312 mp_limb_t refmpn_sub_err2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 313 mp_limb_t refmpn_sub_err3_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 314 mp_limb_t refmpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 315 mp_limb_t refmpn_sub_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 316 mp_limb_t refmpn_sublsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 317 mp_limb_t refmpn_sublsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 318 mp_limb_t refmpn_sublsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int); 319 mp_limb_t refmpn_sublsh1_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 320 mp_limb_t refmpn_sublsh2_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 321 mp_limb_t refmpn_sublsh_n_ip1 (mp_ptr, mp_srcptr, mp_size_t, unsigned int); 322 mp_limb_t refmpn_sublsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 323 mp_limb_t refmpn_sublsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 324 mp_limb_t refmpn_sublsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_t); 325 mp_limb_t refmpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 326 mp_limb_t refmpn_submul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 327 328 mp_limb_signed_t refmpn_rsblsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 329 mp_limb_signed_t refmpn_rsblsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 330 mp_limb_signed_t refmpn_rsblsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int); 331 mp_limb_signed_t refmpn_rsblsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t); 332 mp_limb_signed_t refmpn_rsblsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t); 333 mp_limb_signed_t refmpn_rsblsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_signed_t); 334 335 void refmpn_tdiv_qr (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 336 int refmpn_tstbit (mp_srcptr, unsigned long); 337 338 mp_limb_t refmpn_udiv_qrnnd (mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t); 339 mp_limb_t refmpn_udiv_qrnnd_r (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t *); 340 mp_limb_t refmpn_umul_ppmm (mp_limb_t *, mp_limb_t, mp_limb_t); 341 mp_limb_t refmpn_umul_ppmm_r (mp_limb_t, mp_limb_t, mp_limb_t *); 342 343 void refmpn_xnor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 344 void refmpn_xor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 345 346 void refmpn_zero (mp_ptr, mp_size_t); 347 void refmpn_zero_extend (mp_ptr, mp_size_t, mp_size_t); 348 int refmpn_zero_p (mp_srcptr, mp_size_t); 349 350 void refmpn_binvert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr); 351 void refmpn_invert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr); 352 353 354 void refmpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr); 355 void refmpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr); 356 357 358 void refmpz_combit (mpz_ptr, unsigned long); 359 unsigned long refmpz_hamdist (mpz_srcptr, mpz_srcptr); 360 void refmpz_gcd (mpz_ptr, mpz_srcptr, mpz_srcptr); 361 int refmpz_kronecker (mpz_srcptr, mpz_srcptr); 362 int refmpz_jacobi (mpz_srcptr, mpz_srcptr); 363 int refmpz_legendre (mpz_srcptr, mpz_srcptr); 364 int refmpz_kronecker_si (mpz_srcptr, long); 365 int refmpz_kronecker_ui (mpz_srcptr, unsigned long); 366 int refmpz_si_kronecker (long, mpz_srcptr); 367 int refmpz_ui_kronecker (unsigned long, mpz_srcptr); 368 369 void refmpz_pow_ui (mpz_ptr, mpz_srcptr, unsigned long); 370 371 372 #if defined (__cplusplus) 373 } 374 #endif 375 376 377 /* Establish ostringstream and istringstream. Do this here so as to hide 378 the conditionals, rather than putting stuff in each test program. 379 380 Oldish versions of g++, like 2.95.2, don't have <sstream>, only 381 <strstream>. Fake up ostringstream and istringstream classes, but not a 382 full implementation, just enough for our purposes. */ 383 384 #ifdef __cplusplus 385 #if 1 || HAVE_SSTREAM 386 #include <sstream> 387 #else /* ! HAVE_SSTREAM */ 388 #include <string> 389 #include <strstream> 390 class 391 ostringstream : public std::ostrstream { 392 public: str()393 string str() { 394 int pcount = ostrstream::pcount (); 395 char *s = (char *) (*__gmp_allocate_func) (pcount + 1); 396 memcpy (s, ostrstream::str(), pcount); 397 s[pcount] = '\0'; 398 string ret = string(s); 399 (*__gmp_free_func) (s, pcount + 1); 400 return ret; } 401 }; 402 class 403 istringstream : public std::istrstream { 404 public: istringstream(const char * s)405 istringstream (const char *s) : istrstream (s) { }; 406 }; 407 #endif /* ! HAVE_SSTREAM */ 408 #endif /* __cplusplus */ 409 410 411 #define TESTS_REPS(count, argv, argc) \ 412 do { \ 413 char *envval, *end; \ 414 double repfactor; \ 415 int reps_nondefault = 0; \ 416 if (argc > 1) \ 417 { \ 418 count = strtol (argv[1], &end, 0); \ 419 if (*end || count <= 0) \ 420 { \ 421 fprintf (stderr, "Invalid test count: %s.\n", argv[1]); \ 422 exit (1); \ 423 } \ 424 argv++; \ 425 argc--; \ 426 reps_nondefault = 1; \ 427 } \ 428 envval = getenv ("GMP_CHECK_REPFACTOR"); \ 429 if (envval != NULL) \ 430 { \ 431 repfactor = strtod (envval, &end); \ 432 if (*end || repfactor <= 0) \ 433 { \ 434 fprintf (stderr, "Invalid repfactor: %f.\n", repfactor); \ 435 exit (1); \ 436 } \ 437 count *= repfactor; \ 438 count = MAX (count, 1); \ 439 reps_nondefault = 1; \ 440 } \ 441 if (reps_nondefault) \ 442 printf ("Running test with %ld repetitions (include this in bug reports)\n",\ 443 (long) count); \ 444 } while (0) 445 446 447 #endif /* __TESTS_H__ */ 448