1/* Tests support prototypes etc. 2 3Copyright 2000-2004, 2008-2013 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library test suite. 6 7The GNU MP Library test suite is free software; you can redistribute it 8and/or modify it under the terms of the GNU General Public License as 9published by the Free Software Foundation; either version 3 of the License, 10or (at your option) any later version. 11 12The GNU MP Library test suite is distributed in the hope that it will be 13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15Public License for more details. 16 17You should have received a copy of the GNU General Public License along with 18the 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) 29extern "C" { 30#endif 31 32 33#ifdef __cplusplus 34#define ANYARGS ... 35#else 36#define ANYARGS 37#endif 38 39 40void tests_start (void); 41void tests_end (void); 42 43void tests_memory_start (void); 44void tests_memory_end (void); 45void *tests_allocate (size_t); 46void *tests_reallocate (void *, size_t, size_t); 47void tests_free (void *, size_t); 48void tests_free_nosize (void *); 49int tests_memory_valid (void *); 50 51void tests_rand_start (void); 52void tests_rand_end (void); 53 54double tests_infinity_d (); 55int tests_hardware_getround (void); 56int tests_hardware_setround (int); 57int tests_isinf (double); 58int tests_dbl_mant_bits (void); 59 60void x86_fldcw (unsigned short); 61unsigned 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 76RETSIGTYPE tests_sigfpe_handler (int); 77void tests_sigfpe_done (void); 78extern jmp_buf tests_sigfpe_target; 79 80 81#if HAVE_CALLING_CONVENTIONS 82extern mp_limb_t (*calling_conventions_function) (ANYARGS); 83mp_limb_t calling_conventions (ANYARGS); 84int 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 94extern int mp_trace_base; 95void mp_limb_trace (const char *, mp_limb_t); 96void mpn_trace (const char *, mp_srcptr, mp_size_t); 97void mpn_tracea (const char *, const mp_ptr *, int, mp_size_t); 98void mpn_tracen (const char *, int, mp_srcptr, mp_size_t); 99void mpn_trace_file (const char *, mp_srcptr, mp_size_t); 100void mpn_tracea_file (const char *, const mp_ptr *, int, mp_size_t); 101void mpf_trace (const char *, mpf_srcptr); 102void mpq_trace (const char *, mpq_srcptr); 103void mpz_trace (const char *, mpz_srcptr); 104void mpz_tracen (const char *, int, mpz_srcptr); 105void byte_trace (const char *, const void *, mp_size_t); 106void byte_tracen (const char *, int, const void *, mp_size_t); 107void d_trace (const char *, double); 108 109 110void spinner (void); 111extern unsigned long spinner_count; 112extern int spinner_wanted; 113extern int spinner_tick; 114 115 116void *align_pointer (void *, size_t); 117void *__gmp_allocate_func_aligned (size_t, size_t); 118void *__gmp_allocate_or_reallocate (void *, size_t, size_t); 119char *__gmp_allocate_strdup (const char *); 120char *strtoupper (char *); 121mp_limb_t urandom (void); 122void call_rand_algs (void (*func) (const char *, gmp_randstate_t)); 123 124 125void mpf_set_str_or_abort (mpf_ptr, const char *, int); 126 127 128void mpq_set_str_or_abort (mpq_ptr, const char *, int); 129 130 131void mpz_erandomb (mpz_ptr, gmp_randstate_t, unsigned long); 132void mpz_erandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long); 133void mpz_errandomb (mpz_ptr, gmp_randstate_t, unsigned long); 134void mpz_errandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long); 135void mpz_init_set_n (mpz_ptr, mp_srcptr, mp_size_t); 136void mpz_negrandom (mpz_ptr, gmp_randstate_t); 137int mpz_pow2abs_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE; 138void mpz_set_n (mpz_ptr, mp_srcptr, mp_size_t); 139void mpz_set_str_or_abort (mpz_ptr, const char *, int); 140void mpz_clobber(mpz_ptr); 141 142mp_size_t mpn_diff_highest (mp_srcptr, mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE; 143mp_size_t mpn_diff_lowest (mp_srcptr, mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE; 144mp_size_t byte_diff_highest (const void *, const void *, mp_size_t) __GMP_ATTRIBUTE_PURE; 145mp_size_t byte_diff_lowest (const void *, const void *, mp_size_t) __GMP_ATTRIBUTE_PURE; 146 147 148mp_limb_t ref_addc_limb (mp_limb_t *, mp_limb_t, mp_limb_t); 149mp_limb_t ref_bswap_limb (mp_limb_t); 150unsigned long ref_popc_limb (mp_limb_t); 151mp_limb_t ref_subc_limb (mp_limb_t *, mp_limb_t, mp_limb_t); 152 153 154void refmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr); 155void refmpf_add_ulp (mpf_ptr ); 156void refmpf_fill (mpf_ptr, mp_size_t, mp_limb_t); 157void refmpf_normalize (mpf_ptr); 158void refmpf_set_prec_limbs (mpf_ptr, unsigned long); 159unsigned long refmpf_set_overlap (mpf_ptr, mpf_srcptr); 160void refmpf_sub (mpf_ptr, mpf_srcptr, mpf_srcptr); 161int refmpf_validate (const char *, mpf_srcptr, mpf_srcptr); 162int refmpf_validate_division (const char *, mpf_srcptr, mpf_srcptr, mpf_srcptr); 163 164 165mp_limb_t refmpn_cnd_add_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 166mp_limb_t refmpn_cnd_sub_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 167 168mp_limb_t refmpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 169mp_limb_t refmpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 170mp_limb_t refmpn_add_err1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 171mp_limb_t refmpn_add_err2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 172mp_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); 173mp_limb_t refmpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 174mp_limb_t refmpn_add_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 175mp_limb_t refmpn_addlsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 176mp_limb_t refmpn_addlsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 177mp_limb_t refmpn_addlsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned); 178mp_limb_t refmpn_addlsh1_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 179mp_limb_t refmpn_addlsh2_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 180mp_limb_t refmpn_addlsh_n_ip1 (mp_ptr, mp_srcptr, mp_size_t, unsigned); 181mp_limb_t refmpn_addlsh1_n_ip2 (mp_ptr, mp_srcptr, mp_size_t); 182mp_limb_t refmpn_addlsh2_n_ip2 (mp_ptr, mp_srcptr, mp_size_t); 183mp_limb_t refmpn_addlsh_n_ip2 (mp_ptr, mp_srcptr, mp_size_t, unsigned); 184mp_limb_t refmpn_addlsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 185mp_limb_t refmpn_addlsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 186mp_limb_t refmpn_addlsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned, mp_limb_t); 187mp_limb_t refmpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 188mp_limb_t refmpn_addmul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 189mp_limb_t refmpn_addmul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 190mp_limb_t refmpn_addmul_3 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 191mp_limb_t refmpn_addmul_4 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 192mp_limb_t refmpn_addmul_5 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 193mp_limb_t refmpn_addmul_6 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 194mp_limb_t refmpn_addmul_7 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 195mp_limb_t refmpn_addmul_8 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 196 197mp_limb_t refmpn_add_n_sub_n (mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 198mp_limb_t refmpn_add_n_sub_nc (mp_ptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 199 200void refmpn_and_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 201void refmpn_andn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 202 203mp_limb_t refmpn_big_base (int); 204 205int refmpn_chars_per_limb (int); 206void refmpn_clrbit (mp_ptr, unsigned long); 207int refmpn_cmp (mp_srcptr, mp_srcptr, mp_size_t); 208int refmpn_cmp_allowzero (mp_srcptr, mp_srcptr, mp_size_t); 209int refmpn_cmp_twosizes (mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 210 211void refmpn_com (mp_ptr, mp_srcptr, mp_size_t); 212void refmpn_copy (mp_ptr, mp_srcptr, mp_size_t); 213void refmpn_copyi (mp_ptr, mp_srcptr, mp_size_t); 214void refmpn_copyd (mp_ptr, mp_srcptr, mp_size_t); 215void refmpn_copy_extend (mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 216 217unsigned refmpn_count_leading_zeros (mp_limb_t); 218unsigned refmpn_count_trailing_zeros (mp_limb_t); 219 220mp_limb_t refmpn_divexact_by3 (mp_ptr, mp_srcptr, mp_size_t); 221mp_limb_t refmpn_divexact_by3c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 222 223mp_limb_t refmpn_divmod_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 224mp_limb_t refmpn_divmod_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 225mp_limb_t refmpn_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t); 226mp_limb_t refmpn_divrem_1c (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 227mp_limb_t refmpn_divrem_2 (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr); 228 229int refmpn_equal_anynail (mp_srcptr, mp_srcptr, mp_size_t); 230 231void refmpn_fill (mp_ptr, mp_size_t, mp_limb_t); 232 233mp_limb_t refmpn_gcd_11 (mp_limb_t, mp_limb_t); 234mp_limb_t refmpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t); 235mp_double_limb_t refmpn_gcd_22 (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t); 236mp_limb_t refmpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t); 237 238size_t refmpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); 239 240unsigned long refmpn_hamdist (mp_srcptr, mp_srcptr, mp_size_t); 241 242mp_limb_t refmpn_invert_limb (mp_limb_t); 243void refmpn_ior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 244void refmpn_iorn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 245 246mp_limb_t refmpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned); 247mp_limb_t refmpn_lshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned); 248mp_limb_t refmpn_lshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned); 249mp_limb_t refmpn_lshiftc (mp_ptr, mp_srcptr, mp_size_t, unsigned); 250void refmpn_com (mp_ptr, mp_srcptr, mp_size_t); 251 252mp_ptr refmpn_malloc_limbs (mp_size_t); 253mp_ptr refmpn_malloc_limbs_aligned (mp_size_t, size_t); 254void refmpn_free_limbs (mp_ptr); 255mp_limb_t refmpn_msbone (mp_limb_t); 256mp_limb_t refmpn_msbone_mask (mp_limb_t); 257mp_ptr refmpn_memdup_limbs (mp_srcptr, mp_size_t); 258 259mp_limb_t refmpn_mod_1 (mp_srcptr, mp_size_t, mp_limb_t); 260mp_limb_t refmpn_mod_1c (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 261mp_limb_t refmpn_mod_34lsub1 (mp_srcptr, mp_size_t); 262 263mp_limb_t refmpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 264mp_limb_t refmpn_mul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 265mp_limb_t refmpn_mul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 266mp_limb_t refmpn_mul_3 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 267mp_limb_t refmpn_mul_4 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 268mp_limb_t refmpn_mul_5 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 269mp_limb_t refmpn_mul_6 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr); 270 271void refmpn_mul_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 272void refmpn_mulmid_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 273void refmpn_toom42_mulmid (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr); 274void refmpn_mulmid_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 275void refmpn_mulmid (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 276void refmpn_mullo_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 277void refmpn_mul_any (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 278void refmpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 279void refmpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 280 281void refmpn_nand_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 282void refmpn_nior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 283mp_limb_t refmpn_neg (mp_ptr, mp_srcptr, mp_size_t); 284mp_size_t refmpn_normalize (mp_srcptr, mp_size_t); 285 286unsigned long refmpn_popcount (mp_srcptr, mp_size_t); 287mp_limb_t refmpn_preinv_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, unsigned); 288mp_limb_t refmpn_preinv_mod_1 (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 289 290void refmpn_random (mp_ptr, mp_size_t); 291void refmpn_random2 (mp_ptr, mp_size_t); 292mp_limb_t refmpn_random_limb (void); 293 294mp_limb_t refmpn_rsh1add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 295mp_limb_t refmpn_rsh1sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 296mp_limb_t refmpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned); 297mp_limb_t refmpn_rshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned); 298mp_limb_t refmpn_rshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned); 299 300mp_limb_t refmpn_sb_div_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 301unsigned long refmpn_scan0 (mp_srcptr, unsigned long); 302unsigned long refmpn_scan1 (mp_srcptr, unsigned long); 303void refmpn_setbit (mp_ptr, unsigned long); 304void refmpn_sqr (mp_ptr, mp_srcptr, mp_size_t); 305void refmpn_sqrlo (mp_ptr, mp_srcptr, mp_size_t); 306mp_size_t refmpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t); 307 308void refmpn_sub_ddmmss (mp_limb_t *, mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t); 309mp_limb_t refmpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t); 310mp_limb_t refmpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 311mp_limb_t refmpn_sub_err1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 312mp_limb_t refmpn_sub_err2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 313mp_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); 314mp_limb_t refmpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 315mp_limb_t refmpn_sub_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 316mp_limb_t refmpn_sublsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 317mp_limb_t refmpn_sublsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 318mp_limb_t refmpn_sublsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int); 319mp_limb_t refmpn_sublsh1_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 320mp_limb_t refmpn_sublsh2_n_ip1 (mp_ptr, mp_srcptr, mp_size_t); 321mp_limb_t refmpn_sublsh_n_ip1 (mp_ptr, mp_srcptr, mp_size_t, unsigned int); 322mp_limb_t refmpn_sublsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 323mp_limb_t refmpn_sublsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t); 324mp_limb_t refmpn_sublsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_t); 325mp_limb_t refmpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t); 326mp_limb_t refmpn_submul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t); 327 328mp_limb_signed_t refmpn_rsblsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 329mp_limb_signed_t refmpn_rsblsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 330mp_limb_signed_t refmpn_rsblsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int); 331mp_limb_signed_t refmpn_rsblsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t); 332mp_limb_signed_t refmpn_rsblsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t); 333mp_limb_signed_t refmpn_rsblsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_signed_t); 334 335void refmpn_tdiv_qr (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t); 336int refmpn_tstbit (mp_srcptr, unsigned long); 337 338mp_limb_t refmpn_udiv_qrnnd (mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t); 339mp_limb_t refmpn_udiv_qrnnd_r (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t *); 340mp_limb_t refmpn_umul_ppmm (mp_limb_t *, mp_limb_t, mp_limb_t); 341mp_limb_t refmpn_umul_ppmm_r (mp_limb_t, mp_limb_t, mp_limb_t *); 342 343void refmpn_xnor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 344void refmpn_xor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t); 345 346void refmpn_zero (mp_ptr, mp_size_t); 347void refmpn_zero_extend (mp_ptr, mp_size_t, mp_size_t); 348int refmpn_zero_p (mp_srcptr, mp_size_t); 349 350void refmpn_binvert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr); 351void refmpn_invert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr); 352 353 354void refmpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr); 355void refmpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr); 356 357 358void refmpz_combit (mpz_ptr, unsigned long); 359unsigned long refmpz_hamdist (mpz_srcptr, mpz_srcptr); 360void refmpz_gcd (mpz_ptr, mpz_srcptr, mpz_srcptr); 361int refmpz_kronecker (mpz_srcptr, mpz_srcptr); 362int refmpz_jacobi (mpz_srcptr, mpz_srcptr); 363int refmpz_legendre (mpz_srcptr, mpz_srcptr); 364int refmpz_kronecker_si (mpz_srcptr, long); 365int refmpz_kronecker_ui (mpz_srcptr, unsigned long); 366int refmpz_si_kronecker (long, mpz_srcptr); 367int refmpz_ui_kronecker (unsigned long, mpz_srcptr); 368 369void 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> 390class 391ostringstream : public std::ostrstream { 392 public: 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}; 402class 403istringstream : public std::istrstream { 404 public: 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