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