Tizen 2.1 base
[external/gmp.git] / tests / tests.h
1 /* Tests support prototypes etc.
2
3 Copyright 2000, 2001, 2002, 2003, 2004, 2008, 2009 Free Software Foundation,
4 Inc.
5
6 This file is part of the GNU MP Library.
7
8 The GNU MP Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12
13 The GNU MP Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MP Library.  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 __GMP_PROTO ((void));
42 void tests_end __GMP_PROTO ((void));
43
44 void tests_memory_start __GMP_PROTO ((void));
45 void tests_memory_end __GMP_PROTO ((void));
46 void *tests_allocate __GMP_PROTO ((size_t size));
47 void *tests_reallocate __GMP_PROTO ((void *ptr, size_t old_size, size_t new_size));
48 void tests_free __GMP_PROTO ((void *ptr, size_t size));
49 void tests_free_nosize __GMP_PROTO ((void *ptr));
50 int tests_memory_valid __GMP_PROTO ((void *ptr));
51
52 void tests_rand_start __GMP_PROTO ((void));
53 void tests_rand_end __GMP_PROTO ((void));
54
55 double tests_infinity_d __GMP_PROTO (());
56 int tests_hardware_getround __GMP_PROTO ((void));
57 int tests_hardware_setround __GMP_PROTO ((int));
58 int tests_isinf __GMP_PROTO ((double));
59 int tests_dbl_mant_bits __GMP_PROTO ((void));
60
61 void x86_fldcw __GMP_PROTO ((unsigned short));
62 unsigned short x86_fstcw __GMP_PROTO ((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 __GMP_PROTO ((int));
78 void tests_sigfpe_done __GMP_PROTO ((void));
79 extern jmp_buf  tests_sigfpe_target;
80
81
82 #if HAVE_CALLING_CONVENTIONS
83 extern mp_limb_t (*calling_conventions_function) __GMP_PROTO ((ANYARGS));
84 mp_limb_t calling_conventions __GMP_PROTO ((ANYARGS));
85 int calling_conventions_check __GMP_PROTO ((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 __GMP_PROTO ((const char *, mp_limb_t));
97 void mpn_trace __GMP_PROTO ((const char *name, mp_srcptr ptr, mp_size_t size));
98 void mpn_tracea __GMP_PROTO ((const char *name, const mp_ptr *a, int count,
99                  mp_size_t size));
100 void mpn_tracen __GMP_PROTO ((const char *name, int num, mp_srcptr ptr,
101                  mp_size_t size));
102 void mpn_trace_file __GMP_PROTO ((const char *filename,
103                              mp_srcptr ptr, mp_size_t size));
104 void mpn_tracea_file __GMP_PROTO ((const char *filename,
105                               const mp_ptr *a, int count, mp_size_t size));
106 void mpf_trace __GMP_PROTO ((const char *name, mpf_srcptr z));
107 void mpq_trace __GMP_PROTO ((const char *name, mpq_srcptr q));
108 void mpz_trace __GMP_PROTO ((const char *name, mpz_srcptr z));
109 void mpz_tracen __GMP_PROTO ((const char *name, int num, mpz_srcptr z));
110 void byte_trace __GMP_PROTO ((const char *, const void *, mp_size_t));
111 void byte_tracen __GMP_PROTO ((const char *, int, const void *, mp_size_t));
112 void d_trace __GMP_PROTO ((const char *, double));
113
114
115 void spinner __GMP_PROTO ((void));
116 extern unsigned long  spinner_count;
117 extern int  spinner_wanted;
118 extern int  spinner_tick;
119
120
121 void *align_pointer __GMP_PROTO ((void *p, size_t align));
122 void *__gmp_allocate_func_aligned __GMP_PROTO ((size_t bytes, size_t align));
123 void *__gmp_allocate_or_reallocate __GMP_PROTO ((void *ptr,
124                                           size_t oldsize, size_t newsize));
125 char *__gmp_allocate_strdup __GMP_PROTO ((const char *s));
126 char *strtoupper __GMP_PROTO ((char *s_orig));
127 mp_limb_t urandom __GMP_PROTO ((void));
128 void call_rand_algs __GMP_PROTO ((void (*func) (const char *, gmp_randstate_t)));
129
130
131 void mpf_set_str_or_abort __GMP_PROTO ((mpf_ptr f, const char *str, int base));
132
133
134 void mpq_set_str_or_abort __GMP_PROTO ((mpq_ptr q, const char *str, int base));
135
136
137 void mpz_erandomb __GMP_PROTO ((mpz_ptr rop, gmp_randstate_t rstate,
138                            unsigned long nbits));
139 void mpz_erandomb_nonzero __GMP_PROTO ((mpz_ptr rop, gmp_randstate_t rstate,
140                                    unsigned long nbits));
141 void mpz_errandomb __GMP_PROTO ((mpz_ptr rop, gmp_randstate_t rstate,
142                             unsigned long nbits));
143 void mpz_errandomb_nonzero __GMP_PROTO ((mpz_ptr rop, gmp_randstate_t rstate,
144                                     unsigned long nbits));
145 void mpz_init_set_n __GMP_PROTO ((mpz_ptr z, mp_srcptr p, mp_size_t size));
146 void mpz_negrandom __GMP_PROTO ((mpz_ptr rop, gmp_randstate_t rstate));
147 int mpz_pow2abs_p __GMP_PROTO ((mpz_srcptr z)) __GMP_ATTRIBUTE_PURE;
148 void mpz_set_n __GMP_PROTO ((mpz_ptr z, mp_srcptr p, mp_size_t size));
149 void mpz_set_str_or_abort __GMP_PROTO ((mpz_ptr z, const char *str, int base));
150
151 mp_size_t mpn_diff_highest __GMP_PROTO ((mp_srcptr p1, mp_srcptr p2, mp_size_t n)) __GMP_ATTRIBUTE_PURE;
152 mp_size_t mpn_diff_lowest __GMP_PROTO ((mp_srcptr p1, mp_srcptr p2, mp_size_t n)) __GMP_ATTRIBUTE_PURE;
153 mp_size_t byte_diff_highest __GMP_PROTO ((const void *p1, const void *p2, mp_size_t size)) __GMP_ATTRIBUTE_PURE;
154 mp_size_t byte_diff_lowest __GMP_PROTO ((const void *p1, const void *p2, mp_size_t size)) __GMP_ATTRIBUTE_PURE;
155
156
157 mp_limb_t ref_addc_limb __GMP_PROTO ((mp_limb_t *, mp_limb_t, mp_limb_t));
158 mp_limb_t ref_bswap_limb __GMP_PROTO ((mp_limb_t src));
159 unsigned long ref_popc_limb __GMP_PROTO ((mp_limb_t src));
160 mp_limb_t ref_subc_limb __GMP_PROTO ((mp_limb_t *, mp_limb_t, mp_limb_t));
161
162
163 void refmpf_add __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
164 void refmpf_add_ulp __GMP_PROTO ((mpf_ptr f));
165 void refmpf_fill __GMP_PROTO ((mpf_ptr f, mp_size_t size, mp_limb_t value));
166 void refmpf_normalize __GMP_PROTO ((mpf_ptr f));
167 void refmpf_set_prec_limbs __GMP_PROTO ((mpf_ptr f, unsigned long prec));
168 unsigned long refmpf_set_overlap __GMP_PROTO ((mpf_ptr dst, mpf_srcptr src));
169 void refmpf_sub __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
170 int refmpf_validate __GMP_PROTO ((const char *name, mpf_srcptr got, mpf_srcptr want));
171 int refmpf_validate_division __GMP_PROTO ((const char *name, mpf_srcptr got,
172                                            mpf_srcptr n, mpf_srcptr d));
173
174
175 mp_limb_t refmpn_add __GMP_PROTO ((mp_ptr rp,
176                               mp_srcptr s1p, mp_size_t s1size,
177                               mp_srcptr s2p, mp_size_t s2size));
178 mp_limb_t refmpn_add_1 __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size,
179                                 mp_limb_t n));
180 mp_limb_t refmpn_add_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
181                                 mp_size_t size));
182 mp_limb_t refmpn_add_nc __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
183                                  mp_size_t size, mp_limb_t carry));
184 mp_limb_t refmpn_addlsh1_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
185                                 mp_size_t size));
186 mp_limb_t refmpn_addlsh2_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
187                                 mp_size_t size));
188 mp_limb_t refmpn_addlsh_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
189                                 mp_size_t size, unsigned int));
190 mp_limb_t refmpn_addmul_1 __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
191                                    mp_limb_t multiplier));
192 mp_limb_t refmpn_addmul_1c __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
193                                     mp_limb_t multiplier, mp_limb_t carry));
194 mp_limb_t refmpn_addmul_2 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
195                                         mp_size_t size, mp_srcptr mult));
196 mp_limb_t refmpn_addmul_3 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
197                                         mp_size_t size, mp_srcptr mult));
198 mp_limb_t refmpn_addmul_4 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
199                                         mp_size_t size, mp_srcptr mult));
200 mp_limb_t refmpn_addmul_5 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
201                                         mp_size_t size, mp_srcptr mult));
202 mp_limb_t refmpn_addmul_6 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
203                                         mp_size_t size, mp_srcptr mult));
204 mp_limb_t refmpn_addmul_7 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
205                                         mp_size_t size, mp_srcptr mult));
206 mp_limb_t refmpn_addmul_8 __GMP_PROTO ((mp_ptr dst, mp_srcptr src,
207                                         mp_size_t size, mp_srcptr mult));
208
209 mp_limb_t refmpn_add_n_sub_n __GMP_PROTO ((mp_ptr r1p, mp_ptr r2p,
210                                    mp_srcptr s1p, mp_srcptr s2p,
211                                    mp_size_t size));
212 mp_limb_t refmpn_add_n_sub_nc __GMP_PROTO ((mp_ptr r1p, mp_ptr r2p,
213                                     mp_srcptr s1p, mp_srcptr s2p,
214                                     mp_size_t size, mp_limb_t carry));
215
216 void refmpn_and_n  __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
217                             mp_size_t size));
218 void refmpn_andn_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
219                             mp_size_t size));
220
221 mp_limb_t refmpn_big_base __GMP_PROTO ((int));
222
223 int refmpn_chars_per_limb __GMP_PROTO ((int));
224 void refmpn_clrbit __GMP_PROTO ((mp_ptr, unsigned long));
225 int refmpn_cmp __GMP_PROTO ((mp_srcptr s1p, mp_srcptr s2p, mp_size_t size));
226 int refmpn_cmp_allowzero __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
227 int refmpn_cmp_twosizes __GMP_PROTO ((mp_srcptr xp, mp_size_t xsize,
228                                  mp_srcptr yp, mp_size_t ysize));
229
230 void refmpn_com __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size));
231 void refmpn_copy  __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size));
232 void refmpn_copyi __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size));
233 void refmpn_copyd __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size));
234 void refmpn_copy_extend __GMP_PROTO ((mp_ptr wp, mp_size_t wsize, mp_srcptr xp, mp_size_t xsize));
235
236 unsigned refmpn_count_leading_zeros __GMP_PROTO ((mp_limb_t x));
237 unsigned refmpn_count_trailing_zeros __GMP_PROTO ((mp_limb_t x));
238
239 mp_limb_t refmpn_divexact_by3 __GMP_PROTO ((mp_ptr rp, mp_srcptr sp,
240                                        mp_size_t size));
241 mp_limb_t refmpn_divexact_by3c __GMP_PROTO ((mp_ptr rp, mp_srcptr sp,
242                                        mp_size_t size, mp_limb_t carry));
243
244 mp_limb_t refmpn_divmod_1 __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size,
245                                    mp_limb_t divisor));
246 mp_limb_t refmpn_divmod_1c __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size,
247                                     mp_limb_t divisor, mp_limb_t carry));
248 mp_limb_t refmpn_divrem_1 __GMP_PROTO ((mp_ptr rp, mp_size_t xsize,
249                                    mp_srcptr sp, mp_size_t size,
250                                    mp_limb_t divisor));
251 mp_limb_t refmpn_divrem_1c __GMP_PROTO ((mp_ptr rp, mp_size_t xsize,
252                                     mp_srcptr sp, mp_size_t size,
253                                     mp_limb_t divisor, mp_limb_t carry));
254 mp_limb_t refmpn_divrem_2 __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t,
255                                         mp_srcptr));
256
257 int refmpn_equal_anynail __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
258
259 void refmpn_fill __GMP_PROTO ((mp_ptr p, mp_size_t s, mp_limb_t v));
260
261 mp_limb_t refmpn_gcd_1 __GMP_PROTO ((mp_srcptr xp, mp_size_t xsize, mp_limb_t y));
262 mp_limb_t refmpn_gcd __GMP_PROTO ((mp_ptr gp, mp_ptr xp, mp_size_t xsize,
263                               mp_ptr yp, mp_size_t ysize));
264
265 size_t refmpn_get_str __GMP_PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
266
267 unsigned long refmpn_hamdist __GMP_PROTO ((mp_srcptr s1p, mp_srcptr s2p,
268                                       mp_size_t size));
269
270 mp_limb_t refmpn_invert_limb __GMP_PROTO ((mp_limb_t d));
271 void refmpn_ior_n  __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
272                             mp_size_t size));
273 void refmpn_iorn_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
274                             mp_size_t size));
275
276 mp_limb_t refmpn_lshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned));
277 mp_limb_t refmpn_lshift_or_copy __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned));
278 mp_limb_t refmpn_lshift_or_copy_any __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned));
279 mp_limb_t refmpn_lshiftc __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned));
280 void refmpn_com __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t));
281
282 mp_ptr refmpn_malloc_limbs __GMP_PROTO ((mp_size_t size));
283 mp_ptr refmpn_malloc_limbs_aligned __GMP_PROTO ((mp_size_t n, size_t m));
284 void refmpn_free_limbs __GMP_PROTO ((mp_ptr p));
285 mp_limb_t refmpn_msbone __GMP_PROTO ((mp_limb_t x));
286 mp_limb_t refmpn_msbone_mask __GMP_PROTO ((mp_limb_t x));
287 mp_ptr refmpn_memdup_limbs __GMP_PROTO ((mp_srcptr ptr, mp_size_t size));
288
289 mp_limb_t refmpn_mod_1 __GMP_PROTO ((mp_srcptr sp, mp_size_t size,
290                                 mp_limb_t divisor));
291 mp_limb_t refmpn_mod_1c __GMP_PROTO ((mp_srcptr sp, mp_size_t size,
292                                  mp_limb_t divisor, mp_limb_t carry));
293 mp_limb_t refmpn_mod_34lsub1 __GMP_PROTO ((mp_srcptr p, mp_size_t n));
294
295 mp_limb_t refmpn_mul_1 __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
296                                 mp_limb_t multiplier));
297 mp_limb_t refmpn_mul_1c __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
298                                  mp_limb_t multiplier, mp_limb_t carry));
299 mp_limb_t refmpn_mul_2 __GMP_PROTO ((mp_ptr dst, mp_srcptr src, mp_size_t size,
300                                      mp_srcptr mult));
301 mp_limb_t refmpn_mul_3 __GMP_PROTO ((mp_ptr dst, mp_srcptr src, mp_size_t size,
302                                      mp_srcptr mult));
303 mp_limb_t refmpn_mul_4 __GMP_PROTO ((mp_ptr dst, mp_srcptr src, mp_size_t size,
304                                      mp_srcptr mult));
305
306 void refmpn_mul_basecase __GMP_PROTO ((mp_ptr prodp,
307                                   mp_srcptr up, mp_size_t usize,
308                                   mp_srcptr vp, mp_size_t vsize));
309 void refmpn_mullo_n __GMP_PROTO ((mp_ptr prodp,
310                                   mp_srcptr up, mp_srcptr vp, mp_size_t vsize));
311 void refmpn_mul_any __GMP_PROTO ((mp_ptr prodp,
312                              mp_srcptr up, mp_size_t usize,
313                              mp_srcptr vp, mp_size_t vsize));
314 void refmpn_mul_n __GMP_PROTO ((mp_ptr prodp, mp_srcptr up, mp_srcptr vp,
315                            mp_size_t size));
316 void refmpn_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
317
318 void refmpn_nand_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
319                             mp_size_t size));
320 void refmpn_nior_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
321                             mp_size_t size));
322 mp_limb_t refmpn_neg __GMP_PROTO ((mp_ptr dst, mp_srcptr src, mp_size_t size));
323 mp_size_t refmpn_normalize __GMP_PROTO ((mp_srcptr, mp_size_t));
324
325 unsigned long refmpn_popcount __GMP_PROTO ((mp_srcptr sp, mp_size_t size));
326 mp_limb_t refmpn_preinv_divrem_1 __GMP_PROTO ((mp_ptr rp, mp_size_t xsize,
327                                           mp_srcptr sp, mp_size_t size,
328                                           mp_limb_t divisor,
329                                           mp_limb_t inverse, unsigned shift));
330 mp_limb_t refmpn_preinv_mod_1 __GMP_PROTO ((mp_srcptr sp, mp_size_t size,
331                                        mp_limb_t divisor,
332                                        mp_limb_t divisor_inverse));
333
334 void refmpn_random __GMP_PROTO ((mp_ptr, mp_size_t));
335 void refmpn_random2 __GMP_PROTO ((mp_ptr, mp_size_t));
336 mp_limb_t refmpn_random_limb __GMP_PROTO ((void));
337
338 mp_limb_t refmpn_rsh1add_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
339                                 mp_size_t size));
340 mp_limb_t refmpn_rsh1sub_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
341                                 mp_size_t size));
342 mp_limb_t refmpn_rshift __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
343                                  unsigned shift));
344 mp_limb_t refmpn_rshift_or_copy __GMP_PROTO ((mp_ptr wp,
345                                          mp_srcptr xp, mp_size_t size,
346                                          unsigned shift));
347 mp_limb_t refmpn_rshift_or_copy_any __GMP_PROTO ((mp_ptr wp,
348                                                   mp_srcptr xp, mp_size_t size,
349                                                   unsigned shift));
350
351 mp_limb_t refmpn_sb_div_qr __GMP_PROTO ((mp_ptr,
352                                          mp_ptr, mp_size_t,
353                                          mp_srcptr, mp_size_t));
354 unsigned long refmpn_scan0 __GMP_PROTO ((mp_srcptr, unsigned long));
355 unsigned long refmpn_scan1 __GMP_PROTO ((mp_srcptr, unsigned long));
356 void refmpn_setbit __GMP_PROTO ((mp_ptr, unsigned long));
357 void refmpn_sqr __GMP_PROTO ((mp_ptr dst, mp_srcptr src, mp_size_t size));
358 mp_size_t refmpn_sqrtrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
359
360 void refmpn_sub_ddmmss __GMP_PROTO ((mp_limb_t *, mp_limb_t *,
361                                      mp_limb_t, mp_limb_t,
362                                      mp_limb_t, mp_limb_t));
363 mp_limb_t refmpn_sub __GMP_PROTO ((mp_ptr rp,
364                               mp_srcptr s1p, mp_size_t s1size,
365                               mp_srcptr s2p, mp_size_t s2size));
366 mp_limb_t refmpn_sub_1 __GMP_PROTO ((mp_ptr rp, mp_srcptr sp, mp_size_t size,
367                                 mp_limb_t n));
368 mp_limb_t refmpn_sub_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
369                                 mp_size_t size));
370 mp_limb_t refmpn_sub_nc __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
371                                  mp_size_t size, mp_limb_t carry));
372 mp_limb_t refmpn_sublsh1_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
373                                 mp_size_t size));
374 mp_limb_t refmpn_sublsh_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
375                                 mp_size_t size, unsigned int));
376 mp_limb_t refmpn_submul_1 __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
377                                    mp_limb_t multiplier));
378 mp_limb_t refmpn_submul_1c __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size,
379                                     mp_limb_t multiplier, mp_limb_t carry));
380
381 mp_limb_signed_t refmpn_rsblsh1_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
382 mp_limb_signed_t refmpn_rsblsh2_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
383 mp_limb_signed_t refmpn_rsblsh_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, unsigned int));
384
385 void refmpn_tdiv_qr __GMP_PROTO ((mp_ptr qp, mp_ptr rp, mp_size_t qxn,
386                              mp_ptr np, mp_size_t nsize,
387                              mp_srcptr dp, mp_size_t dsize));
388 int refmpn_tstbit __GMP_PROTO ((mp_srcptr, unsigned long));
389
390 mp_limb_t refmpn_udiv_qrnnd __GMP_PROTO ((mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t));
391 mp_limb_t refmpn_udiv_qrnnd_r __GMP_PROTO ((mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t *));
392 mp_limb_t refmpn_umul_ppmm __GMP_PROTO ((mp_limb_t *, mp_limb_t, mp_limb_t));
393 mp_limb_t refmpn_umul_ppmm_r __GMP_PROTO ((mp_limb_t, mp_limb_t, mp_limb_t *));
394
395 void refmpn_xnor_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
396                             mp_size_t size));
397 void refmpn_xor_n  __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp,
398                             mp_size_t size));
399
400 void refmpn_zero __GMP_PROTO ((mp_ptr p, mp_size_t s));
401 void refmpn_zero_extend __GMP_PROTO ((mp_ptr, mp_size_t, mp_size_t));
402 int refmpn_zero_p __GMP_PROTO ((mp_srcptr ptr, mp_size_t size));
403
404 void refmpn_binvert __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
405 void refmpn_invert __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
406
407
408 void refmpq_add __GMP_PROTO ((mpq_ptr w, mpq_srcptr x, mpq_srcptr y));
409 void refmpq_sub __GMP_PROTO ((mpq_ptr w, mpq_srcptr x, mpq_srcptr y));
410
411
412 void refmpz_combit __GMP_PROTO ((mpz_ptr r, unsigned long bit));
413 unsigned long refmpz_hamdist __GMP_PROTO ((mpz_srcptr x, mpz_srcptr y));
414 int refmpz_kronecker __GMP_PROTO ((mpz_srcptr a_orig, mpz_srcptr b_orig));
415 int refmpz_jacobi __GMP_PROTO ((mpz_srcptr a_orig, mpz_srcptr b_orig));
416 int refmpz_legendre __GMP_PROTO ((mpz_srcptr a_orig, mpz_srcptr b_orig));
417 int refmpz_kronecker_si __GMP_PROTO ((mpz_srcptr, long));
418 int refmpz_kronecker_ui __GMP_PROTO ((mpz_srcptr, unsigned long));
419 int refmpz_si_kronecker __GMP_PROTO ((long, mpz_srcptr));
420 int refmpz_ui_kronecker __GMP_PROTO ((unsigned long, mpz_srcptr));
421
422 void refmpz_pow_ui __GMP_PROTO ((mpz_ptr w, mpz_srcptr b, unsigned long e));
423
424
425 #if defined (__cplusplus)
426 }
427 #endif
428
429
430 /* Establish ostringstream and istringstream.  Do this here so as to hide
431    the conditionals, rather than putting stuff in each test program.
432
433    Oldish versions of g++, like 2.95.2, don't have <sstream>, only
434    <strstream>.  Fake up ostringstream and istringstream classes, but not a
435    full implementation, just enough for our purposes.  */
436
437 #ifdef __cplusplus
438 #if HAVE_SSTREAM
439 #include <sstream>
440 #else /* ! HAVE_SSTREAM */
441 #include <string>
442 #include <strstream>
443 class
444 ostringstream : public std::ostrstream {
445  public:
446   string str() {
447     int  pcount = ostrstream::pcount ();
448     char *s = (char *) (*__gmp_allocate_func) (pcount + 1);
449     memcpy (s, ostrstream::str(), pcount);
450     s[pcount] = '\0';
451     string ret = string(s);
452     (*__gmp_free_func) (s, pcount + 1);
453     return ret; }
454 };
455 class
456 istringstream : public std::istrstream {
457  public:
458   istringstream (const char *s) : istrstream (s) { };
459 };
460 #endif /* ! HAVE_SSTREAM */
461 #endif /* __cplusplus */
462
463
464 #define TESTS_REPS(count, argv, argc)                                   \
465   do {                                                                  \
466   char *envval, *end;                                                   \
467   long repfactor;                                                       \
468   if (argc > 1)                                                         \
469     {                                                                   \
470       count = strtol (argv[1], &end, 0);                                \
471       if (*end || count <= 0)                                           \
472         {                                                               \
473           fprintf (stderr, "Invalid test count: %s.\n", argv[1]);       \
474           exit (1);                                                     \
475         }                                                               \
476       argv++;                                                           \
477       argc--;                                                           \
478     }                                                                   \
479   envval = getenv ("GMP_CHECK_REPFACTOR");                              \
480   if (envval != NULL)                                                   \
481     {                                                                   \
482       repfactor = strtol (envval, &end, 0);                             \
483       if (*end || repfactor <= 0)                                       \
484         {                                                               \
485           fprintf (stderr, "Invalid repfactor: %s.\n", repfactor);      \
486           exit (1);                                                     \
487         }                                                               \
488       count *= repfactor;                                               \
489     }                                                                   \
490   } while (0)
491
492
493 #endif /* __TESTS_H__ */