xref: /netbsd-src/external/lgpl3/gmp/dist/tests/tests.h (revision 6a493d6bc668897c91594964a732d38505b70cbb)
1 /* Tests support prototypes etc.
2 
3 Copyright 2000, 2001, 2002, 2003, 2004, 2008, 2009, 2010, 2011, 2012 Free
4 Software Foundation, Inc.
5 
6 This file is part of the GNU MP Library test suite.
7 
8 The GNU MP Library test suite is free software; you can redistribute it
9 and/or modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 3 of the License,
11 or (at your option) any later version.
12 
13 The GNU MP Library test suite is distributed in the hope that it will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
16 Public License for more details.
17 
18 You should have received a copy of the GNU General Public License along with
19 the GNU MP Library test suite.  If not, see http://www.gnu.org/licenses/.  */
20 
21 
22 #ifndef __TESTS_H__
23 #define __TESTS_H__
24 
25 #include "config.h"
26 
27 #include <setjmp.h>  /* for jmp_buf */
28 
29 #if defined (__cplusplus)
30 extern "C" {
31 #endif
32 
33 
34 #ifdef __cplusplus
35 #define ANYARGS  ...
36 #else
37 #define ANYARGS
38 #endif
39 
40 
41 void tests_start (void);
42 void tests_end (void);
43 
44 void tests_memory_start (void);
45 void tests_memory_end (void);
46 void *tests_allocate (size_t);
47 void *tests_reallocate (void *, size_t, size_t);
48 void tests_free (void *, size_t);
49 void tests_free_nosize (void *);
50 int tests_memory_valid (void *);
51 
52 void tests_rand_start (void);
53 void tests_rand_end (void);
54 
55 double tests_infinity_d ();
56 int tests_hardware_getround (void);
57 int tests_hardware_setround (int);
58 int tests_isinf (double);
59 int tests_dbl_mant_bits (void);
60 
61 void x86_fldcw (unsigned short);
62 unsigned short x86_fstcw (void);
63 
64 
65 /* tests_setjmp_sigfpe is like a setjmp, establishing a trap for SIGFPE.
66    The initial return is 0, if SIGFPE is trapped execution goes back there
67    with return value 1.
68 
69    tests_sigfpe_done puts SIGFPE back to SIG_DFL, which should be used once
70    the setjmp point is out of scope, so a later SIGFPE won't try to go back
71    there.  */
72 
73 #define tests_setjmp_sigfpe()                   \
74   (signal (SIGFPE, tests_sigfpe_handler),       \
75    setjmp (tests_sigfpe_target))
76 
77 RETSIGTYPE tests_sigfpe_handler (int);
78 void tests_sigfpe_done (void);
79 extern jmp_buf  tests_sigfpe_target;
80 
81 
82 #if HAVE_CALLING_CONVENTIONS
83 extern mp_limb_t (*calling_conventions_function) (ANYARGS);
84 mp_limb_t calling_conventions (ANYARGS);
85 int calling_conventions_check (void);
86 #define CALLING_CONVENTIONS(function) \
87   (calling_conventions_function = (function), calling_conventions)
88 #define CALLING_CONVENTIONS_CHECK()    (calling_conventions_check())
89 #else
90 #define CALLING_CONVENTIONS(function)  (function)
91 #define CALLING_CONVENTIONS_CHECK()    1 /* always ok */
92 #endif
93 
94 
95 extern int mp_trace_base;
96 void mp_limb_trace (const char *, mp_limb_t);
97 void mpn_trace (const char *, mp_srcptr, mp_size_t);
98 void mpn_tracea (const char *, const mp_ptr *, int, mp_size_t);
99 void mpn_tracen (const char *, int, mp_srcptr, mp_size_t);
100 void mpn_trace_file (const char *, mp_srcptr, mp_size_t);
101 void mpn_tracea_file (const char *, const mp_ptr *, int, mp_size_t);
102 void mpf_trace (const char *, mpf_srcptr);
103 void mpq_trace (const char *, mpq_srcptr);
104 void mpz_trace (const char *, mpz_srcptr);
105 void mpz_tracen (const char *, int, mpz_srcptr);
106 void byte_trace (const char *, const void *, mp_size_t);
107 void byte_tracen (const char *, int, const void *, mp_size_t);
108 void d_trace (const char *, double);
109 
110 
111 void spinner (void);
112 extern unsigned long  spinner_count;
113 extern int  spinner_wanted;
114 extern int  spinner_tick;
115 
116 
117 void *align_pointer (void *, size_t);
118 void *__gmp_allocate_func_aligned (size_t, size_t);
119 void *__gmp_allocate_or_reallocate (void *, size_t, size_t);
120 char *__gmp_allocate_strdup (const char *);
121 char *strtoupper (char *);
122 mp_limb_t urandom (void);
123 void call_rand_algs (void (*func) (const char *, gmp_randstate_t));
124 
125 
126 void mpf_set_str_or_abort (mpf_ptr, const char *, int);
127 
128 
129 void mpq_set_str_or_abort (mpq_ptr, const char *, int);
130 
131 
132 void mpz_erandomb (mpz_ptr, gmp_randstate_t, unsigned long);
133 void mpz_erandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long);
134 void mpz_errandomb (mpz_ptr, gmp_randstate_t, unsigned long);
135 void mpz_errandomb_nonzero (mpz_ptr, gmp_randstate_t, unsigned long);
136 void mpz_init_set_n (mpz_ptr, mp_srcptr, mp_size_t);
137 void mpz_negrandom (mpz_ptr, gmp_randstate_t);
138 int mpz_pow2abs_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
139 void mpz_set_n (mpz_ptr, mp_srcptr, mp_size_t);
140 void mpz_set_str_or_abort (mpz_ptr, const char *, int);
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_addcnd_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t);
166 mp_limb_t refmpn_subcnd_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_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_1 (mp_srcptr, mp_size_t, mp_limb_t);
234 mp_limb_t refmpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
235 
236 size_t refmpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
237 
238 unsigned long refmpn_hamdist (mp_srcptr, mp_srcptr, mp_size_t);
239 
240 mp_limb_t refmpn_invert_limb (mp_limb_t);
241 void refmpn_ior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
242 void refmpn_iorn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
243 
244 mp_limb_t refmpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned);
245 mp_limb_t refmpn_lshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned);
246 mp_limb_t refmpn_lshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned);
247 mp_limb_t refmpn_lshiftc (mp_ptr, mp_srcptr, mp_size_t, unsigned);
248 void refmpn_com (mp_ptr, mp_srcptr, mp_size_t);
249 
250 mp_ptr refmpn_malloc_limbs (mp_size_t);
251 mp_ptr refmpn_malloc_limbs_aligned (mp_size_t, size_t);
252 void refmpn_free_limbs (mp_ptr);
253 mp_limb_t refmpn_msbone (mp_limb_t);
254 mp_limb_t refmpn_msbone_mask (mp_limb_t);
255 mp_ptr refmpn_memdup_limbs (mp_srcptr, mp_size_t);
256 
257 mp_limb_t refmpn_mod_1 (mp_srcptr, mp_size_t, mp_limb_t);
258 mp_limb_t refmpn_mod_1c (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t);
259 mp_limb_t refmpn_mod_34lsub1 (mp_srcptr, mp_size_t);
260 
261 mp_limb_t refmpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
262 mp_limb_t refmpn_mul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t);
263 mp_limb_t refmpn_mul_2 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
264 mp_limb_t refmpn_mul_3 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
265 mp_limb_t refmpn_mul_4 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
266 mp_limb_t refmpn_mul_5 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
267 mp_limb_t refmpn_mul_6 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
268 
269 void refmpn_mul_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
270 void refmpn_mulmid_basecase (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
271 void refmpn_toom42_mulmid (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr);
272 void refmpn_mulmid_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
273 void refmpn_mulmid (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
274 void refmpn_mullo_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
275 void refmpn_mul_any (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
276 void refmpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
277 void refmpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
278 
279 void refmpn_nand_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
280 void refmpn_nior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
281 mp_limb_t refmpn_neg (mp_ptr, mp_srcptr, mp_size_t);
282 mp_size_t refmpn_normalize (mp_srcptr, mp_size_t);
283 
284 unsigned long refmpn_popcount (mp_srcptr, mp_size_t);
285 mp_limb_t refmpn_preinv_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t, unsigned);
286 mp_limb_t refmpn_preinv_mod_1 (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t);
287 
288 void refmpn_random (mp_ptr, mp_size_t);
289 void refmpn_random2 (mp_ptr, mp_size_t);
290 mp_limb_t refmpn_random_limb (void);
291 
292 mp_limb_t refmpn_rsh1add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
293 mp_limb_t refmpn_rsh1sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
294 mp_limb_t refmpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned);
295 mp_limb_t refmpn_rshift_or_copy (mp_ptr, mp_srcptr, mp_size_t, unsigned);
296 mp_limb_t refmpn_rshift_or_copy_any (mp_ptr, mp_srcptr, mp_size_t, unsigned);
297 
298 mp_limb_t refmpn_sb_div_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t);
299 unsigned long refmpn_scan0 (mp_srcptr, unsigned long);
300 unsigned long refmpn_scan1 (mp_srcptr, unsigned long);
301 void refmpn_setbit (mp_ptr, unsigned long);
302 void refmpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
303 mp_size_t refmpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
304 
305 void refmpn_sub_ddmmss (mp_limb_t *, mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t);
306 mp_limb_t refmpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
307 mp_limb_t refmpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
308 mp_limb_t refmpn_sub_err1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
309 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);
310 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);
311 mp_limb_t refmpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
312 mp_limb_t refmpn_sub_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t);
313 mp_limb_t refmpn_sublsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
314 mp_limb_t refmpn_sublsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
315 mp_limb_t refmpn_sublsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int);
316 mp_limb_t refmpn_sublsh1_n_ip1 (mp_ptr, mp_srcptr, mp_size_t);
317 mp_limb_t refmpn_sublsh2_n_ip1 (mp_ptr, mp_srcptr, mp_size_t);
318 mp_limb_t refmpn_sublsh_n_ip1 (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
319 mp_limb_t refmpn_sublsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t);
320 mp_limb_t refmpn_sublsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_t);
321 mp_limb_t refmpn_sublsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_t);
322 mp_limb_t refmpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
323 mp_limb_t refmpn_submul_1c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t);
324 
325 mp_limb_signed_t refmpn_rsblsh1_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
326 mp_limb_signed_t refmpn_rsblsh2_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
327 mp_limb_signed_t refmpn_rsblsh_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int);
328 mp_limb_signed_t refmpn_rsblsh1_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t);
329 mp_limb_signed_t refmpn_rsblsh2_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_limb_signed_t);
330 mp_limb_signed_t refmpn_rsblsh_nc (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int, mp_limb_signed_t);
331 
332 void refmpn_tdiv_qr (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t);
333 int refmpn_tstbit (mp_srcptr, unsigned long);
334 
335 mp_limb_t refmpn_udiv_qrnnd (mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t);
336 mp_limb_t refmpn_udiv_qrnnd_r (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t *);
337 mp_limb_t refmpn_umul_ppmm (mp_limb_t *, mp_limb_t, mp_limb_t);
338 mp_limb_t refmpn_umul_ppmm_r (mp_limb_t, mp_limb_t, mp_limb_t *);
339 
340 void refmpn_xnor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
341 void refmpn_xor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
342 
343 void refmpn_zero (mp_ptr, mp_size_t);
344 void refmpn_zero_extend (mp_ptr, mp_size_t, mp_size_t);
345 int refmpn_zero_p (mp_srcptr, mp_size_t);
346 
347 void refmpn_binvert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr);
348 void refmpn_invert (mp_ptr, mp_srcptr, mp_size_t, mp_ptr);
349 
350 
351 void refmpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr);
352 void refmpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr);
353 
354 
355 void refmpz_combit (mpz_ptr, unsigned long);
356 unsigned long refmpz_hamdist (mpz_srcptr, mpz_srcptr);
357 int refmpz_kronecker (mpz_srcptr, mpz_srcptr);
358 int refmpz_jacobi (mpz_srcptr, mpz_srcptr);
359 int refmpz_legendre (mpz_srcptr, mpz_srcptr);
360 int refmpz_kronecker_si (mpz_srcptr, long);
361 int refmpz_kronecker_ui (mpz_srcptr, unsigned long);
362 int refmpz_si_kronecker (long, mpz_srcptr);
363 int refmpz_ui_kronecker (unsigned long, mpz_srcptr);
364 
365 void refmpz_pow_ui (mpz_ptr, mpz_srcptr, unsigned long);
366 
367 
368 #if defined (__cplusplus)
369 }
370 #endif
371 
372 
373 /* Establish ostringstream and istringstream.  Do this here so as to hide
374    the conditionals, rather than putting stuff in each test program.
375 
376    Oldish versions of g++, like 2.95.2, don't have <sstream>, only
377    <strstream>.  Fake up ostringstream and istringstream classes, but not a
378    full implementation, just enough for our purposes.  */
379 
380 #ifdef __cplusplus
381 #if 1 || HAVE_SSTREAM
382 #include <sstream>
383 #else /* ! HAVE_SSTREAM */
384 #include <string>
385 #include <strstream>
386 class
387 ostringstream : public std::ostrstream {
388  public:
389   string str() {
390     int  pcount = ostrstream::pcount ();
391     char *s = (char *) (*__gmp_allocate_func) (pcount + 1);
392     memcpy (s, ostrstream::str(), pcount);
393     s[pcount] = '\0';
394     string ret = string(s);
395     (*__gmp_free_func) (s, pcount + 1);
396     return ret; }
397 };
398 class
399 istringstream : public std::istrstream {
400  public:
401   istringstream (const char *s) : istrstream (s) { };
402 };
403 #endif /* ! HAVE_SSTREAM */
404 #endif /* __cplusplus */
405 
406 
407 #define TESTS_REPS(count, argv, argc)					\
408   do {									\
409   char *envval, *end;							\
410   double repfactor;							\
411   int reps_nondefault = 0;						\
412   if (argc > 1)								\
413     {									\
414       count = strtol (argv[1], &end, 0);				\
415       if (*end || count <= 0)						\
416 	{								\
417 	  fprintf (stderr, "Invalid test count: %s.\n", argv[1]);	\
418 	  exit (1);							\
419 	}								\
420       argv++;								\
421       argc--;								\
422       reps_nondefault = 1;						\
423     }									\
424   envval = getenv ("GMP_CHECK_REPFACTOR");				\
425   if (envval != NULL)							\
426     {									\
427       repfactor = strtod (envval, &end);				\
428       if (*end || repfactor <= 0)					\
429 	{								\
430 	  fprintf (stderr, "Invalid repfactor: %f.\n", repfactor);	\
431 	  exit (1);							\
432 	}								\
433       count *= repfactor;						\
434       reps_nondefault = 1;						\
435     }									\
436   if (reps_nondefault)							\
437     printf ("Running test with %ld repetitions (include this in bug reports)\n",\
438 	    (long) count);						\
439   } while (0)
440 
441 
442 #endif /* __TESTS_H__ */
443