(root)/
gmp-6.3.0/
tests/
tests.h
       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:
     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:
     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__ */