1003c26c9Smrg /* Definitions for GNU multiple precision functions.   -*- mode: c -*-
2003c26c9Smrg 
30f3f60b5Smrg Copyright 1991, 1993-1997, 1999-2016, 2020 Free Software Foundation, Inc.
4003c26c9Smrg 
5003c26c9Smrg This file is part of the GNU MP Library.
6003c26c9Smrg 
7003c26c9Smrg The GNU MP Library is free software; you can redistribute it and/or modify
87d829589Smrg it under the terms of either:
97d829589Smrg 
107d829589Smrg   * the GNU Lesser General Public License as published by the Free
117d829589Smrg     Software Foundation; either version 3 of the License, or (at your
12003c26c9Smrg     option) any later version.
13003c26c9Smrg 
147d829589Smrg or
157d829589Smrg 
167d829589Smrg   * the GNU General Public License as published by the Free Software
177d829589Smrg     Foundation; either version 2 of the License, or (at your option) any
187d829589Smrg     later version.
197d829589Smrg 
207d829589Smrg or both in parallel, as here.
217d829589Smrg 
22003c26c9Smrg The GNU MP Library is distributed in the hope that it will be useful, but
23003c26c9Smrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
247d829589Smrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
257d829589Smrg for more details.
26003c26c9Smrg 
277d829589Smrg You should have received copies of the GNU General Public License and the
287d829589Smrg GNU Lesser General Public License along with the GNU MP Library.  If not,
297d829589Smrg see https://www.gnu.org/licenses/.  */
30003c26c9Smrg 
31003c26c9Smrg #ifndef __GMP_H__
32003c26c9Smrg 
33003c26c9Smrg #if defined (__cplusplus)
34003c26c9Smrg #include <iosfwd>   /* for std::istream, std::ostream, std::string */
35003c26c9Smrg #include <cstdio>
36003c26c9Smrg #endif
37003c26c9Smrg 
38003c26c9Smrg 
39003c26c9Smrg /* Instantiated by configure. */
40003c26c9Smrg #if ! defined (__GMP_WITHIN_CONFIGURE)
41003c26c9Smrg #define __GMP_HAVE_HOST_CPU_FAMILY_power   0
42003c26c9Smrg #define __GMP_HAVE_HOST_CPU_FAMILY_powerpc 1
43003c26c9Smrg #define GMP_LIMB_BITS                      32
44003c26c9Smrg #define GMP_NAIL_BITS                      0
45003c26c9Smrg #endif
46003c26c9Smrg #define GMP_NUMB_BITS     (GMP_LIMB_BITS - GMP_NAIL_BITS)
47003c26c9Smrg #define GMP_NUMB_MASK     ((~ __GMP_CAST (mp_limb_t, 0)) >> GMP_NAIL_BITS)
48003c26c9Smrg #define GMP_NUMB_MAX      GMP_NUMB_MASK
49003c26c9Smrg #define GMP_NAIL_MASK     (~ GMP_NUMB_MASK)
50003c26c9Smrg 
51003c26c9Smrg 
52003c26c9Smrg #ifndef __GNU_MP__
537d829589Smrg #define __GNU_MP__ 6
54003c26c9Smrg 
55003c26c9Smrg #include <stddef.h>    /* for size_t */
567d829589Smrg #include <limits.h>
57003c26c9Smrg 
58003c26c9Smrg /* Instantiated by configure. */
59003c26c9Smrg #if ! defined (__GMP_WITHIN_CONFIGURE)
60003c26c9Smrg /* #undef _LONG_LONG_LIMB */
61003c26c9Smrg #define __GMP_LIBGMP_DLL  0
62003c26c9Smrg #endif
63003c26c9Smrg 
64003c26c9Smrg 
65003c26c9Smrg /* __GMP_DECLSPEC supports Windows DLL versions of libgmp, and is empty in
66003c26c9Smrg    all other circumstances.
67003c26c9Smrg 
68003c26c9Smrg    When compiling objects for libgmp, __GMP_DECLSPEC is an export directive,
69003c26c9Smrg    or when compiling for an application it's an import directive.  The two
70003c26c9Smrg    cases are differentiated by __GMP_WITHIN_GMP defined by the GMP Makefiles
71003c26c9Smrg    (and not defined from an application).
72003c26c9Smrg 
73003c26c9Smrg    __GMP_DECLSPEC_XX is similarly used for libgmpxx.  __GMP_WITHIN_GMPXX
74003c26c9Smrg    indicates when building libgmpxx, and in that case libgmpxx functions are
75003c26c9Smrg    exports, but libgmp functions which might get called are imports.
76003c26c9Smrg 
77003c26c9Smrg    Libtool DLL_EXPORT define is not used.
78003c26c9Smrg 
79003c26c9Smrg    There's no attempt to support GMP built both static and DLL.  Doing so
80003c26c9Smrg    would mean applications would have to tell us which of the two is going
81003c26c9Smrg    to be used when linking, and that seems very tedious and error prone if
82003c26c9Smrg    using GMP by hand, and equally tedious from a package since autoconf and
83003c26c9Smrg    automake don't give much help.
84003c26c9Smrg 
85003c26c9Smrg    __GMP_DECLSPEC is required on all documented global functions and
86003c26c9Smrg    variables, the various internals in gmp-impl.h etc can be left unadorned.
87003c26c9Smrg    But internals used by the test programs or speed measuring programs
88003c26c9Smrg    should have __GMP_DECLSPEC, and certainly constants or variables must
89003c26c9Smrg    have it or the wrong address will be resolved.
90003c26c9Smrg 
91003c26c9Smrg    In gcc __declspec can go at either the start or end of a prototype.
92003c26c9Smrg 
93003c26c9Smrg    In Microsoft C __declspec must go at the start, or after the type like
94003c26c9Smrg    void __declspec(...) *foo()".  There's no __dllexport or anything to
95003c26c9Smrg    guard against someone foolish #defining dllexport.  _export used to be
96003c26c9Smrg    available, but no longer.
97003c26c9Smrg 
98003c26c9Smrg    In Borland C _export still exists, but needs to go after the type, like
99003c26c9Smrg    "void _export foo();".  Would have to change the __GMP_DECLSPEC syntax to
100003c26c9Smrg    make use of that.  Probably more trouble than it's worth.  */
101003c26c9Smrg 
102003c26c9Smrg #if defined (__GNUC__)
103003c26c9Smrg #define __GMP_DECLSPEC_EXPORT  __declspec(__dllexport__)
104003c26c9Smrg #define __GMP_DECLSPEC_IMPORT  __declspec(__dllimport__)
105003c26c9Smrg #endif
106003c26c9Smrg #if defined (_MSC_VER) || defined (__BORLANDC__)
107003c26c9Smrg #define __GMP_DECLSPEC_EXPORT  __declspec(dllexport)
108003c26c9Smrg #define __GMP_DECLSPEC_IMPORT  __declspec(dllimport)
109003c26c9Smrg #endif
110003c26c9Smrg #ifdef __WATCOMC__
111003c26c9Smrg #define __GMP_DECLSPEC_EXPORT  __export
112003c26c9Smrg #define __GMP_DECLSPEC_IMPORT  __import
113003c26c9Smrg #endif
114003c26c9Smrg #ifdef __IBMC__
115003c26c9Smrg #define __GMP_DECLSPEC_EXPORT  _Export
116003c26c9Smrg #define __GMP_DECLSPEC_IMPORT  _Import
117003c26c9Smrg #endif
118003c26c9Smrg 
119003c26c9Smrg #if __GMP_LIBGMP_DLL
1205210846fSmrg #ifdef __GMP_WITHIN_GMP
121003c26c9Smrg /* compiling to go into a DLL libgmp */
122003c26c9Smrg #define __GMP_DECLSPEC  __GMP_DECLSPEC_EXPORT
123003c26c9Smrg #else
124003c26c9Smrg /* compiling to go into an application which will link to a DLL libgmp */
125003c26c9Smrg #define __GMP_DECLSPEC  __GMP_DECLSPEC_IMPORT
126003c26c9Smrg #endif
127003c26c9Smrg #else
128003c26c9Smrg /* all other cases */
129003c26c9Smrg #define __GMP_DECLSPEC
130003c26c9Smrg #endif
131003c26c9Smrg 
132003c26c9Smrg 
133003c26c9Smrg #ifdef __GMP_SHORT_LIMB
134003c26c9Smrg typedef unsigned int		mp_limb_t;
135003c26c9Smrg typedef int			mp_limb_signed_t;
136003c26c9Smrg #else
137003c26c9Smrg #ifdef _LONG_LONG_LIMB
138003c26c9Smrg typedef unsigned long long int	mp_limb_t;
139003c26c9Smrg typedef long long int		mp_limb_signed_t;
140003c26c9Smrg #else
141003c26c9Smrg typedef unsigned long int	mp_limb_t;
142003c26c9Smrg typedef long int		mp_limb_signed_t;
143003c26c9Smrg #endif
144003c26c9Smrg #endif
145003c26c9Smrg typedef unsigned long int	mp_bitcnt_t;
146003c26c9Smrg 
147003c26c9Smrg /* For reference, note that the name __mpz_struct gets into C++ mangled
148003c26c9Smrg    function names, which means although the "__" suggests an internal, we
149003c26c9Smrg    must leave this name for binary compatibility.  */
150003c26c9Smrg typedef struct
151003c26c9Smrg {
152003c26c9Smrg   int _mp_alloc;		/* Number of *limbs* allocated and pointed
153003c26c9Smrg 				   to by the _mp_d field.  */
154003c26c9Smrg   int _mp_size;			/* abs(_mp_size) is the number of limbs the
155003c26c9Smrg 				   last field points to.  If _mp_size is
156003c26c9Smrg 				   negative this is a negative number.  */
157003c26c9Smrg   mp_limb_t *_mp_d;		/* Pointer to the limbs.  */
158003c26c9Smrg } __mpz_struct;
159003c26c9Smrg 
160003c26c9Smrg #endif /* __GNU_MP__ */
161003c26c9Smrg 
162003c26c9Smrg 
163003c26c9Smrg typedef __mpz_struct MP_INT;    /* gmp 1 source compatibility */
164003c26c9Smrg typedef __mpz_struct mpz_t[1];
165003c26c9Smrg 
166003c26c9Smrg typedef mp_limb_t *		mp_ptr;
1675210846fSmrg typedef const mp_limb_t *	mp_srcptr;
168003c26c9Smrg #if defined (_CRAY) && ! defined (_CRAYMPP)
169003c26c9Smrg /* plain `int' is much faster (48 bits) */
170003c26c9Smrg #define __GMP_MP_SIZE_T_INT     1
171003c26c9Smrg typedef int			mp_size_t;
172003c26c9Smrg typedef int			mp_exp_t;
173003c26c9Smrg #else
174003c26c9Smrg #define __GMP_MP_SIZE_T_INT     0
175003c26c9Smrg typedef long int		mp_size_t;
176003c26c9Smrg typedef long int		mp_exp_t;
177003c26c9Smrg #endif
178003c26c9Smrg 
179003c26c9Smrg typedef struct
180003c26c9Smrg {
181003c26c9Smrg   __mpz_struct _mp_num;
182003c26c9Smrg   __mpz_struct _mp_den;
183003c26c9Smrg } __mpq_struct;
184003c26c9Smrg 
185003c26c9Smrg typedef __mpq_struct MP_RAT;    /* gmp 1 source compatibility */
186003c26c9Smrg typedef __mpq_struct mpq_t[1];
187003c26c9Smrg 
188003c26c9Smrg typedef struct
189003c26c9Smrg {
190003c26c9Smrg   int _mp_prec;			/* Max precision, in number of `mp_limb_t's.
191003c26c9Smrg 				   Set by mpf_init and modified by
192003c26c9Smrg 				   mpf_set_prec.  The area pointed to by the
193003c26c9Smrg 				   _mp_d field contains `prec' + 1 limbs.  */
194003c26c9Smrg   int _mp_size;			/* abs(_mp_size) is the number of limbs the
195003c26c9Smrg 				   last field points to.  If _mp_size is
196003c26c9Smrg 				   negative this is a negative number.  */
197003c26c9Smrg   mp_exp_t _mp_exp;		/* Exponent, in the base of `mp_limb_t'.  */
198003c26c9Smrg   mp_limb_t *_mp_d;		/* Pointer to the limbs.  */
199003c26c9Smrg } __mpf_struct;
200003c26c9Smrg 
201003c26c9Smrg /* typedef __mpf_struct MP_FLOAT; */
202003c26c9Smrg typedef __mpf_struct mpf_t[1];
203003c26c9Smrg 
204003c26c9Smrg /* Available random number generation algorithms.  */
205003c26c9Smrg typedef enum
206003c26c9Smrg {
207003c26c9Smrg   GMP_RAND_ALG_DEFAULT = 0,
208003c26c9Smrg   GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential.  */
209003c26c9Smrg } gmp_randalg_t;
210003c26c9Smrg 
211003c26c9Smrg /* Random state struct.  */
212003c26c9Smrg typedef struct
213003c26c9Smrg {
214003c26c9Smrg   mpz_t _mp_seed;	  /* _mp_d member points to state of the generator. */
215003c26c9Smrg   gmp_randalg_t _mp_alg;  /* Currently unused. */
216003c26c9Smrg   union {
217003c26c9Smrg     void *_mp_lc;         /* Pointer to function pointers structure.  */
218003c26c9Smrg   } _mp_algdata;
219003c26c9Smrg } __gmp_randstate_struct;
220003c26c9Smrg typedef __gmp_randstate_struct gmp_randstate_t[1];
221003c26c9Smrg 
222003c26c9Smrg /* Types for function declarations in gmp files.  */
223003c26c9Smrg /* ??? Should not pollute user name space with these ??? */
2245210846fSmrg typedef const __mpz_struct *mpz_srcptr;
225003c26c9Smrg typedef __mpz_struct *mpz_ptr;
2265210846fSmrg typedef const __mpf_struct *mpf_srcptr;
227003c26c9Smrg typedef __mpf_struct *mpf_ptr;
2285210846fSmrg typedef const __mpq_struct *mpq_srcptr;
229003c26c9Smrg typedef __mpq_struct *mpq_ptr;
230003c26c9Smrg 
231003c26c9Smrg 
232003c26c9Smrg #if __GMP_LIBGMP_DLL
2335210846fSmrg #ifdef __GMP_WITHIN_GMPXX
234003c26c9Smrg /* compiling to go into a DLL libgmpxx */
235003c26c9Smrg #define __GMP_DECLSPEC_XX  __GMP_DECLSPEC_EXPORT
236003c26c9Smrg #else
237003c26c9Smrg /* compiling to go into a application which will link to a DLL libgmpxx */
238003c26c9Smrg #define __GMP_DECLSPEC_XX  __GMP_DECLSPEC_IMPORT
239003c26c9Smrg #endif
240003c26c9Smrg #else
241003c26c9Smrg /* all other cases */
242003c26c9Smrg #define __GMP_DECLSPEC_XX
243003c26c9Smrg #endif
244003c26c9Smrg 
245003c26c9Smrg 
246003c26c9Smrg #ifndef __MPN
247003c26c9Smrg #define __MPN(x) __gmpn_##x
248003c26c9Smrg #endif
249003c26c9Smrg 
250003c26c9Smrg /* For reference, "defined(EOF)" cannot be used here.  In g++ 2.95.4,
251003c26c9Smrg    <iostream> defines EOF but not FILE.  */
252003c26c9Smrg #if defined (FILE)                                              \
253003c26c9Smrg   || defined (H_STDIO)                                          \
254003c26c9Smrg   || defined (_H_STDIO)               /* AIX */                 \
255003c26c9Smrg   || defined (_STDIO_H)               /* glibc, Sun, SCO */     \
256003c26c9Smrg   || defined (_STDIO_H_)              /* BSD, OSF */            \
257003c26c9Smrg   || defined (__STDIO_H)              /* Borland */             \
258003c26c9Smrg   || defined (__STDIO_H__)            /* IRIX */                \
259003c26c9Smrg   || defined (_STDIO_INCLUDED)        /* HPUX */                \
260003c26c9Smrg   || defined (__dj_include_stdio_h_)  /* DJGPP */               \
261003c26c9Smrg   || defined (_FILE_DEFINED)          /* Microsoft */           \
262003c26c9Smrg   || defined (__STDIO__)              /* Apple MPW MrC */       \
263003c26c9Smrg   || defined (_MSL_STDIO_H)           /* Metrowerks */          \
264003c26c9Smrg   || defined (_STDIO_H_INCLUDED)      /* QNX4 */		\
2655210846fSmrg   || defined (_ISO_STDIO_ISO_H)       /* Sun C++ */		\
2667d829589Smrg   || defined (__STDIO_LOADED)         /* VMS */			\
2677d829589Smrg   || defined (__DEFINED_FILE)         /* musl */
268003c26c9Smrg #define _GMP_H_HAVE_FILE 1
269003c26c9Smrg #endif
270003c26c9Smrg 
271003c26c9Smrg /* In ISO C, if a prototype involving "struct obstack *" is given without
272003c26c9Smrg    that structure defined, then the struct is scoped down to just the
273003c26c9Smrg    prototype, causing a conflict if it's subsequently defined for real.  So
274003c26c9Smrg    only give prototypes if we've got obstack.h.  */
275003c26c9Smrg #if defined (_OBSTACK_H)   /* glibc <obstack.h> */
276003c26c9Smrg #define _GMP_H_HAVE_OBSTACK 1
277003c26c9Smrg #endif
278003c26c9Smrg 
2797d829589Smrg /* The prototypes for gmp_vprintf etc are provided only if va_list is defined,
2807d829589Smrg    via an application having included <stdarg.h>.  Usually va_list is a typedef
2817d829589Smrg    so can't be tested directly, but C99 specifies that va_start is a macro.
282003c26c9Smrg 
283003c26c9Smrg    <stdio.h> will define some sort of va_list for vprintf and vfprintf, but
284003c26c9Smrg    let's not bother trying to use that since it's not standard and since
285003c26c9Smrg    application uses for gmp_vprintf etc will almost certainly require the
2867d829589Smrg    whole <stdarg.h> anyway.  */
287003c26c9Smrg 
288003c26c9Smrg #ifdef va_start
289003c26c9Smrg #define _GMP_H_HAVE_VA_LIST 1
290003c26c9Smrg #endif
291003c26c9Smrg 
292003c26c9Smrg /* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
293003c26c9Smrg #if defined (__GNUC__) && defined (__GNUC_MINOR__)
294003c26c9Smrg #define __GMP_GNUC_PREREQ(maj, min) \
295003c26c9Smrg   ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
296003c26c9Smrg #else
297003c26c9Smrg #define __GMP_GNUC_PREREQ(maj, min)  0
298003c26c9Smrg #endif
299003c26c9Smrg 
300003c26c9Smrg /* "pure" is in gcc 2.96 and up, see "(gcc)Function Attributes".  Basically
301003c26c9Smrg    it means a function does nothing but examine its arguments and memory
302003c26c9Smrg    (global or via arguments) to generate a return value, but changes nothing
303003c26c9Smrg    and has no side-effects.  __GMP_NO_ATTRIBUTE_CONST_PURE lets
304003c26c9Smrg    tune/common.c etc turn this off when trying to write timing loops.  */
305003c26c9Smrg #if __GMP_GNUC_PREREQ (2,96) && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE)
306003c26c9Smrg #define __GMP_ATTRIBUTE_PURE   __attribute__ ((__pure__))
307003c26c9Smrg #else
308003c26c9Smrg #define __GMP_ATTRIBUTE_PURE
309003c26c9Smrg #endif
310003c26c9Smrg 
311003c26c9Smrg 
312003c26c9Smrg /* __GMP_CAST allows us to use static_cast in C++, so our macros are clean
313003c26c9Smrg    to "g++ -Wold-style-cast".
314003c26c9Smrg 
315003c26c9Smrg    Casts in "extern inline" code within an extern "C" block don't induce
316003c26c9Smrg    these warnings, so __GMP_CAST only needs to be used on documented
317003c26c9Smrg    macros.  */
318003c26c9Smrg 
319003c26c9Smrg #ifdef __cplusplus
320003c26c9Smrg #define __GMP_CAST(type, expr)  (static_cast<type> (expr))
321003c26c9Smrg #else
322003c26c9Smrg #define __GMP_CAST(type, expr)  ((type) (expr))
323003c26c9Smrg #endif
324003c26c9Smrg 
325003c26c9Smrg 
326003c26c9Smrg /* An empty "throw ()" means the function doesn't throw any C++ exceptions,
327003c26c9Smrg    this can save some stack frame info in applications.
328003c26c9Smrg 
329003c26c9Smrg    Currently it's given only on functions which never divide-by-zero etc,
330003c26c9Smrg    don't allocate memory, and are expected to never need to allocate memory.
331003c26c9Smrg    This leaves open the possibility of a C++ throw from a future GMP
332003c26c9Smrg    exceptions scheme.
333003c26c9Smrg 
334003c26c9Smrg    mpz_set_ui etc are omitted to leave open the lazy allocation scheme
335003c26c9Smrg    described in doc/tasks.html.  mpz_get_d etc are omitted to leave open
336003c26c9Smrg    exceptions for float overflows.
337003c26c9Smrg 
338003c26c9Smrg    Note that __GMP_NOTHROW must be given on any inlines the same as on their
339003c26c9Smrg    prototypes (for g++ at least, where they're used together).  Note also
340003c26c9Smrg    that g++ 3.0 demands that __GMP_NOTHROW is before other attributes like
341003c26c9Smrg    __GMP_ATTRIBUTE_PURE.  */
342003c26c9Smrg 
343003c26c9Smrg #if defined (__cplusplus)
3440f3f60b5Smrg #if __cplusplus >= 201103L
3450f3f60b5Smrg #define __GMP_NOTHROW  noexcept
3460f3f60b5Smrg #else
347003c26c9Smrg #define __GMP_NOTHROW  throw ()
3480f3f60b5Smrg #endif
349003c26c9Smrg #else
350003c26c9Smrg #define __GMP_NOTHROW
351003c26c9Smrg #endif
352003c26c9Smrg 
353003c26c9Smrg 
354003c26c9Smrg /* PORTME: What other compilers have a useful "extern inline"?  "static
355003c26c9Smrg    inline" would be an acceptable substitute if the compiler (or linker)
356003c26c9Smrg    discards unused statics.  */
357003c26c9Smrg 
358003c26c9Smrg  /* gcc has __inline__ in all modes, including strict ansi.  Give a prototype
359003c26c9Smrg     for an inline too, so as to correctly specify "dllimport" on windows, in
360003c26c9Smrg     case the function is called rather than inlined.
361003c26c9Smrg     GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
362003c26c9Smrg     inline semantics, unless -fgnu89-inline is used.  */
363003c26c9Smrg #ifdef __GNUC__
364*d0080044Smrg #if (defined __GNUC_STDC_INLINE__) || \
365*d0080044Smrg     (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) || (__GNUC__ > 4)
366003c26c9Smrg #define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__))
367003c26c9Smrg #endif
368003c26c9Smrg #define __GMP_INLINE_PROTOTYPES  1
369003c26c9Smrg #endif
370003c26c9Smrg 
371003c26c9Smrg /* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1
372003c26c9Smrg    strict ANSI mode.  Inlining is done even when not optimizing (ie. -O0
373003c26c9Smrg    mode, which is the default), but an unnecessary local copy of foo is
374003c26c9Smrg    emitted unless -O is used.  "extern __inline" is accepted, but the
375003c26c9Smrg    "extern" appears to be ignored, ie. it becomes a plain global function
376003c26c9Smrg    but which is inlined within its file.  Don't know if all old versions of
377003c26c9Smrg    DEC C supported __inline, but as a start let's do the right thing for
378003c26c9Smrg    current versions.  */
379003c26c9Smrg #ifdef __DECC
380003c26c9Smrg #define __GMP_EXTERN_INLINE  static __inline
381003c26c9Smrg #endif
382003c26c9Smrg 
383003c26c9Smrg /* SCO OpenUNIX 8 cc supports "static inline foo()" but not in -Xc strict
384003c26c9Smrg    ANSI mode (__STDC__ is 1 in that mode).  Inlining only actually takes
385003c26c9Smrg    place under -O.  Without -O "foo" seems to be emitted whether it's used
386003c26c9Smrg    or not, which is wasteful.  "extern inline foo()" isn't useful, the
387003c26c9Smrg    "extern" is apparently ignored, so foo is inlined if possible but also
388003c26c9Smrg    emitted as a global, which causes multiple definition errors when
389003c26c9Smrg    building a shared libgmp.  */
390003c26c9Smrg #ifdef __SCO_VERSION__
391003c26c9Smrg #if __SCO_VERSION__ > 400000000 && __STDC__ != 1 \
392003c26c9Smrg   && ! defined (__GMP_EXTERN_INLINE)
393003c26c9Smrg #define __GMP_EXTERN_INLINE  static inline
394003c26c9Smrg #endif
395003c26c9Smrg #endif
396003c26c9Smrg 
397003c26c9Smrg /* Microsoft's C compiler accepts __inline */
398003c26c9Smrg #ifdef _MSC_VER
399003c26c9Smrg #define __GMP_EXTERN_INLINE  __inline
400003c26c9Smrg #endif
401003c26c9Smrg 
402003c26c9Smrg /* Recent enough Sun C compilers want "inline" */
403003c26c9Smrg #if defined (__SUNPRO_C) && __SUNPRO_C >= 0x560 \
404003c26c9Smrg   && ! defined (__GMP_EXTERN_INLINE)
405003c26c9Smrg #define __GMP_EXTERN_INLINE  inline
406003c26c9Smrg #endif
407003c26c9Smrg 
408003c26c9Smrg /* Somewhat older Sun C compilers want "static inline" */
409003c26c9Smrg #if defined (__SUNPRO_C) && __SUNPRO_C >= 0x540 \
410003c26c9Smrg   && ! defined (__GMP_EXTERN_INLINE)
411003c26c9Smrg #define __GMP_EXTERN_INLINE  static inline
412003c26c9Smrg #endif
413003c26c9Smrg 
414003c26c9Smrg 
415003c26c9Smrg /* C++ always has "inline" and since it's a normal feature the linker should
416003c26c9Smrg    discard duplicate non-inlined copies, or if it doesn't then that's a
417003c26c9Smrg    problem for everyone, not just GMP.  */
418003c26c9Smrg #if defined (__cplusplus) && ! defined (__GMP_EXTERN_INLINE)
419003c26c9Smrg #define __GMP_EXTERN_INLINE  inline
420003c26c9Smrg #endif
421003c26c9Smrg 
422003c26c9Smrg /* Don't do any inlining within a configure run, since if the compiler ends
423003c26c9Smrg    up emitting copies of the code into the object file it can end up
424003c26c9Smrg    demanding the various support routines (like mpn_popcount) for linking,
425003c26c9Smrg    making the "alloca" test and perhaps others fail.  And on hppa ia64 a
426003c26c9Smrg    pre-release gcc 3.2 was seen not respecting the "extern" in "extern
427003c26c9Smrg    __inline__", triggering this problem too.  */
428003c26c9Smrg #if defined (__GMP_WITHIN_CONFIGURE) && ! __GMP_WITHIN_CONFIGURE_INLINE
429003c26c9Smrg #undef __GMP_EXTERN_INLINE
430003c26c9Smrg #endif
431003c26c9Smrg 
432003c26c9Smrg /* By default, don't give a prototype when there's going to be an inline
433003c26c9Smrg    version.  Note in particular that Cray C++ objects to the combination of
434003c26c9Smrg    prototype and inline.  */
435003c26c9Smrg #ifdef __GMP_EXTERN_INLINE
436003c26c9Smrg #ifndef __GMP_INLINE_PROTOTYPES
437003c26c9Smrg #define __GMP_INLINE_PROTOTYPES  0
438003c26c9Smrg #endif
439003c26c9Smrg #else
440003c26c9Smrg #define __GMP_INLINE_PROTOTYPES  1
441003c26c9Smrg #endif
442003c26c9Smrg 
443003c26c9Smrg 
444003c26c9Smrg #define __GMP_ABS(x)   ((x) >= 0 ? (x) : -(x))
445003c26c9Smrg #define __GMP_MAX(h,i) ((h) > (i) ? (h) : (i))
446003c26c9Smrg 
447003c26c9Smrg 
448003c26c9Smrg /* __builtin_expect is in gcc 3.0, and not in 2.95. */
449003c26c9Smrg #if __GMP_GNUC_PREREQ (3,0)
450003c26c9Smrg #define __GMP_LIKELY(cond)    __builtin_expect ((cond) != 0, 1)
451003c26c9Smrg #define __GMP_UNLIKELY(cond)  __builtin_expect ((cond) != 0, 0)
452003c26c9Smrg #else
453003c26c9Smrg #define __GMP_LIKELY(cond)    (cond)
454003c26c9Smrg #define __GMP_UNLIKELY(cond)  (cond)
455003c26c9Smrg #endif
456003c26c9Smrg 
457003c26c9Smrg #ifdef _CRAY
458003c26c9Smrg #define __GMP_CRAY_Pragma(str)  _Pragma (str)
459003c26c9Smrg #else
460003c26c9Smrg #define __GMP_CRAY_Pragma(str)
461003c26c9Smrg #endif
462003c26c9Smrg 
463003c26c9Smrg 
4647d829589Smrg /* Allow direct user access to numerator and denominator of an mpq_t object.  */
465003c26c9Smrg #define mpq_numref(Q) (&((Q)->_mp_num))
466003c26c9Smrg #define mpq_denref(Q) (&((Q)->_mp_den))
467003c26c9Smrg 
468003c26c9Smrg 
469003c26c9Smrg #if defined (__cplusplus)
470003c26c9Smrg extern "C" {
471003c26c9Smrg using std::FILE;
472003c26c9Smrg #endif
473003c26c9Smrg 
474003c26c9Smrg #define mp_set_memory_functions __gmp_set_memory_functions
4755210846fSmrg __GMP_DECLSPEC void mp_set_memory_functions (void *(*) (size_t),
476003c26c9Smrg 				      void *(*) (void *, size_t, size_t),
4775210846fSmrg 				      void (*) (void *, size_t)) __GMP_NOTHROW;
478003c26c9Smrg 
479003c26c9Smrg #define mp_get_memory_functions __gmp_get_memory_functions
4805210846fSmrg __GMP_DECLSPEC void mp_get_memory_functions (void *(**) (size_t),
481003c26c9Smrg 				      void *(**) (void *, size_t, size_t),
4825210846fSmrg 				      void (**) (void *, size_t)) __GMP_NOTHROW;
483003c26c9Smrg 
484003c26c9Smrg #define mp_bits_per_limb __gmp_bits_per_limb
4855210846fSmrg __GMP_DECLSPEC extern const int mp_bits_per_limb;
486003c26c9Smrg 
487003c26c9Smrg #define gmp_errno __gmp_errno
488003c26c9Smrg __GMP_DECLSPEC extern int gmp_errno;
489003c26c9Smrg 
490003c26c9Smrg #define gmp_version __gmp_version
4915210846fSmrg __GMP_DECLSPEC extern const char * const gmp_version;
492003c26c9Smrg 
493003c26c9Smrg 
494003c26c9Smrg /**************** Random number routines.  ****************/
495003c26c9Smrg 
496003c26c9Smrg /* obsolete */
497003c26c9Smrg #define gmp_randinit __gmp_randinit
4985210846fSmrg __GMP_DECLSPEC void gmp_randinit (gmp_randstate_t, gmp_randalg_t, ...);
499003c26c9Smrg 
500003c26c9Smrg #define gmp_randinit_default __gmp_randinit_default
5015210846fSmrg __GMP_DECLSPEC void gmp_randinit_default (gmp_randstate_t);
502003c26c9Smrg 
503003c26c9Smrg #define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp
5045210846fSmrg __GMP_DECLSPEC void gmp_randinit_lc_2exp (gmp_randstate_t, mpz_srcptr, unsigned long int, mp_bitcnt_t);
505003c26c9Smrg 
506003c26c9Smrg #define gmp_randinit_lc_2exp_size __gmp_randinit_lc_2exp_size
5075210846fSmrg __GMP_DECLSPEC int gmp_randinit_lc_2exp_size (gmp_randstate_t, mp_bitcnt_t);
508003c26c9Smrg 
509003c26c9Smrg #define gmp_randinit_mt __gmp_randinit_mt
5105210846fSmrg __GMP_DECLSPEC void gmp_randinit_mt (gmp_randstate_t);
511003c26c9Smrg 
512003c26c9Smrg #define gmp_randinit_set __gmp_randinit_set
5135210846fSmrg __GMP_DECLSPEC void gmp_randinit_set (gmp_randstate_t, const __gmp_randstate_struct *);
514003c26c9Smrg 
515003c26c9Smrg #define gmp_randseed __gmp_randseed
5165210846fSmrg __GMP_DECLSPEC void gmp_randseed (gmp_randstate_t, mpz_srcptr);
517003c26c9Smrg 
518003c26c9Smrg #define gmp_randseed_ui __gmp_randseed_ui
5195210846fSmrg __GMP_DECLSPEC void gmp_randseed_ui (gmp_randstate_t, unsigned long int);
520003c26c9Smrg 
521003c26c9Smrg #define gmp_randclear __gmp_randclear
5225210846fSmrg __GMP_DECLSPEC void gmp_randclear (gmp_randstate_t);
523003c26c9Smrg 
524003c26c9Smrg #define gmp_urandomb_ui __gmp_urandomb_ui
5255210846fSmrg __GMP_DECLSPEC unsigned long gmp_urandomb_ui (gmp_randstate_t, unsigned long);
526003c26c9Smrg 
527003c26c9Smrg #define gmp_urandomm_ui __gmp_urandomm_ui
5285210846fSmrg __GMP_DECLSPEC unsigned long gmp_urandomm_ui (gmp_randstate_t, unsigned long);
529003c26c9Smrg 
530003c26c9Smrg 
531003c26c9Smrg /**************** Formatted output routines.  ****************/
532003c26c9Smrg 
533003c26c9Smrg #define gmp_asprintf __gmp_asprintf
5345210846fSmrg __GMP_DECLSPEC int gmp_asprintf (char **, const char *, ...);
535003c26c9Smrg 
536003c26c9Smrg #define gmp_fprintf __gmp_fprintf
537003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
5385210846fSmrg __GMP_DECLSPEC int gmp_fprintf (FILE *, const char *, ...);
539003c26c9Smrg #endif
540003c26c9Smrg 
541003c26c9Smrg #define gmp_obstack_printf __gmp_obstack_printf
542003c26c9Smrg #if defined (_GMP_H_HAVE_OBSTACK)
5435210846fSmrg __GMP_DECLSPEC int gmp_obstack_printf (struct obstack *, const char *, ...);
544003c26c9Smrg #endif
545003c26c9Smrg 
546003c26c9Smrg #define gmp_obstack_vprintf __gmp_obstack_vprintf
547003c26c9Smrg #if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST)
5485210846fSmrg __GMP_DECLSPEC int gmp_obstack_vprintf (struct obstack *, const char *, va_list);
549003c26c9Smrg #endif
550003c26c9Smrg 
551003c26c9Smrg #define gmp_printf __gmp_printf
5525210846fSmrg __GMP_DECLSPEC int gmp_printf (const char *, ...);
553003c26c9Smrg 
554003c26c9Smrg #define gmp_snprintf __gmp_snprintf
5555210846fSmrg __GMP_DECLSPEC int gmp_snprintf (char *, size_t, const char *, ...);
556003c26c9Smrg 
557003c26c9Smrg #define gmp_sprintf __gmp_sprintf
5585210846fSmrg __GMP_DECLSPEC int gmp_sprintf (char *, const char *, ...);
559003c26c9Smrg 
560003c26c9Smrg #define gmp_vasprintf __gmp_vasprintf
561003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
5625210846fSmrg __GMP_DECLSPEC int gmp_vasprintf (char **, const char *, va_list);
563003c26c9Smrg #endif
564003c26c9Smrg 
565003c26c9Smrg #define gmp_vfprintf __gmp_vfprintf
566003c26c9Smrg #if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
5675210846fSmrg __GMP_DECLSPEC int gmp_vfprintf (FILE *, const char *, va_list);
568003c26c9Smrg #endif
569003c26c9Smrg 
570003c26c9Smrg #define gmp_vprintf __gmp_vprintf
571003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
5725210846fSmrg __GMP_DECLSPEC int gmp_vprintf (const char *, va_list);
573003c26c9Smrg #endif
574003c26c9Smrg 
575003c26c9Smrg #define gmp_vsnprintf __gmp_vsnprintf
576003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
5775210846fSmrg __GMP_DECLSPEC int gmp_vsnprintf (char *, size_t, const char *, va_list);
578003c26c9Smrg #endif
579003c26c9Smrg 
580003c26c9Smrg #define gmp_vsprintf __gmp_vsprintf
581003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
5825210846fSmrg __GMP_DECLSPEC int gmp_vsprintf (char *, const char *, va_list);
583003c26c9Smrg #endif
584003c26c9Smrg 
585003c26c9Smrg 
586003c26c9Smrg /**************** Formatted input routines.  ****************/
587003c26c9Smrg 
588003c26c9Smrg #define gmp_fscanf __gmp_fscanf
589003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
5905210846fSmrg __GMP_DECLSPEC int gmp_fscanf (FILE *, const char *, ...);
591003c26c9Smrg #endif
592003c26c9Smrg 
593003c26c9Smrg #define gmp_scanf __gmp_scanf
5945210846fSmrg __GMP_DECLSPEC int gmp_scanf (const char *, ...);
595003c26c9Smrg 
596003c26c9Smrg #define gmp_sscanf __gmp_sscanf
5975210846fSmrg __GMP_DECLSPEC int gmp_sscanf (const char *, const char *, ...);
598003c26c9Smrg 
599003c26c9Smrg #define gmp_vfscanf __gmp_vfscanf
600003c26c9Smrg #if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
6015210846fSmrg __GMP_DECLSPEC int gmp_vfscanf (FILE *, const char *, va_list);
602003c26c9Smrg #endif
603003c26c9Smrg 
604003c26c9Smrg #define gmp_vscanf __gmp_vscanf
605003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
6065210846fSmrg __GMP_DECLSPEC int gmp_vscanf (const char *, va_list);
607003c26c9Smrg #endif
608003c26c9Smrg 
609003c26c9Smrg #define gmp_vsscanf __gmp_vsscanf
610003c26c9Smrg #if defined (_GMP_H_HAVE_VA_LIST)
6115210846fSmrg __GMP_DECLSPEC int gmp_vsscanf (const char *, const char *, va_list);
612003c26c9Smrg #endif
613003c26c9Smrg 
614003c26c9Smrg 
615003c26c9Smrg /**************** Integer (i.e. Z) routines.  ****************/
616003c26c9Smrg 
617003c26c9Smrg #define _mpz_realloc __gmpz_realloc
618003c26c9Smrg #define mpz_realloc __gmpz_realloc
6195210846fSmrg __GMP_DECLSPEC void *_mpz_realloc (mpz_ptr, mp_size_t);
620003c26c9Smrg 
621003c26c9Smrg #define mpz_abs __gmpz_abs
622003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_abs)
6235210846fSmrg __GMP_DECLSPEC void mpz_abs (mpz_ptr, mpz_srcptr);
624003c26c9Smrg #endif
625003c26c9Smrg 
626003c26c9Smrg #define mpz_add __gmpz_add
6275210846fSmrg __GMP_DECLSPEC void mpz_add (mpz_ptr, mpz_srcptr, mpz_srcptr);
628003c26c9Smrg 
629003c26c9Smrg #define mpz_add_ui __gmpz_add_ui
6305210846fSmrg __GMP_DECLSPEC void mpz_add_ui (mpz_ptr, mpz_srcptr, unsigned long int);
631003c26c9Smrg 
632003c26c9Smrg #define mpz_addmul __gmpz_addmul
6335210846fSmrg __GMP_DECLSPEC void mpz_addmul (mpz_ptr, mpz_srcptr, mpz_srcptr);
634003c26c9Smrg 
635003c26c9Smrg #define mpz_addmul_ui __gmpz_addmul_ui
6365210846fSmrg __GMP_DECLSPEC void mpz_addmul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
637003c26c9Smrg 
638003c26c9Smrg #define mpz_and __gmpz_and
6395210846fSmrg __GMP_DECLSPEC void mpz_and (mpz_ptr, mpz_srcptr, mpz_srcptr);
640003c26c9Smrg 
641003c26c9Smrg #define mpz_array_init __gmpz_array_init
6425210846fSmrg __GMP_DECLSPEC void mpz_array_init (mpz_ptr, mp_size_t, mp_size_t);
643003c26c9Smrg 
644003c26c9Smrg #define mpz_bin_ui __gmpz_bin_ui
6455210846fSmrg __GMP_DECLSPEC void mpz_bin_ui (mpz_ptr, mpz_srcptr, unsigned long int);
646003c26c9Smrg 
647003c26c9Smrg #define mpz_bin_uiui __gmpz_bin_uiui
6485210846fSmrg __GMP_DECLSPEC void mpz_bin_uiui (mpz_ptr, unsigned long int, unsigned long int);
649003c26c9Smrg 
650003c26c9Smrg #define mpz_cdiv_q __gmpz_cdiv_q
6515210846fSmrg __GMP_DECLSPEC void mpz_cdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
652003c26c9Smrg 
653003c26c9Smrg #define mpz_cdiv_q_2exp __gmpz_cdiv_q_2exp
6545210846fSmrg __GMP_DECLSPEC void mpz_cdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
655003c26c9Smrg 
656003c26c9Smrg #define mpz_cdiv_q_ui __gmpz_cdiv_q_ui
6575210846fSmrg __GMP_DECLSPEC unsigned long int mpz_cdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
658003c26c9Smrg 
659003c26c9Smrg #define mpz_cdiv_qr __gmpz_cdiv_qr
6605210846fSmrg __GMP_DECLSPEC void mpz_cdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
661003c26c9Smrg 
662003c26c9Smrg #define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui
6635210846fSmrg __GMP_DECLSPEC unsigned long int mpz_cdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
664003c26c9Smrg 
665003c26c9Smrg #define mpz_cdiv_r __gmpz_cdiv_r
6665210846fSmrg __GMP_DECLSPEC void mpz_cdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
667003c26c9Smrg 
668003c26c9Smrg #define mpz_cdiv_r_2exp __gmpz_cdiv_r_2exp
6695210846fSmrg __GMP_DECLSPEC void mpz_cdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
670003c26c9Smrg 
671003c26c9Smrg #define mpz_cdiv_r_ui __gmpz_cdiv_r_ui
6725210846fSmrg __GMP_DECLSPEC unsigned long int mpz_cdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
673003c26c9Smrg 
674003c26c9Smrg #define mpz_cdiv_ui __gmpz_cdiv_ui
6755210846fSmrg __GMP_DECLSPEC unsigned long int mpz_cdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
676003c26c9Smrg 
677003c26c9Smrg #define mpz_clear __gmpz_clear
6785210846fSmrg __GMP_DECLSPEC void mpz_clear (mpz_ptr);
679003c26c9Smrg 
680003c26c9Smrg #define mpz_clears __gmpz_clears
6815210846fSmrg __GMP_DECLSPEC void mpz_clears (mpz_ptr, ...);
682003c26c9Smrg 
683003c26c9Smrg #define mpz_clrbit __gmpz_clrbit
6845210846fSmrg __GMP_DECLSPEC void mpz_clrbit (mpz_ptr, mp_bitcnt_t);
685003c26c9Smrg 
686003c26c9Smrg #define mpz_cmp __gmpz_cmp
6875210846fSmrg __GMP_DECLSPEC int mpz_cmp (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
688003c26c9Smrg 
689003c26c9Smrg #define mpz_cmp_d __gmpz_cmp_d
6905210846fSmrg __GMP_DECLSPEC int mpz_cmp_d (mpz_srcptr, double) __GMP_ATTRIBUTE_PURE;
691003c26c9Smrg 
692003c26c9Smrg #define _mpz_cmp_si __gmpz_cmp_si
6935210846fSmrg __GMP_DECLSPEC int _mpz_cmp_si (mpz_srcptr, signed long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
694003c26c9Smrg 
695003c26c9Smrg #define _mpz_cmp_ui __gmpz_cmp_ui
6965210846fSmrg __GMP_DECLSPEC int _mpz_cmp_ui (mpz_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
697003c26c9Smrg 
698003c26c9Smrg #define mpz_cmpabs __gmpz_cmpabs
6995210846fSmrg __GMP_DECLSPEC int mpz_cmpabs (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
700003c26c9Smrg 
701003c26c9Smrg #define mpz_cmpabs_d __gmpz_cmpabs_d
7025210846fSmrg __GMP_DECLSPEC int mpz_cmpabs_d (mpz_srcptr, double) __GMP_ATTRIBUTE_PURE;
703003c26c9Smrg 
704003c26c9Smrg #define mpz_cmpabs_ui __gmpz_cmpabs_ui
7055210846fSmrg __GMP_DECLSPEC int mpz_cmpabs_ui (mpz_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
706003c26c9Smrg 
707003c26c9Smrg #define mpz_com __gmpz_com
7085210846fSmrg __GMP_DECLSPEC void mpz_com (mpz_ptr, mpz_srcptr);
709003c26c9Smrg 
710003c26c9Smrg #define mpz_combit __gmpz_combit
7115210846fSmrg __GMP_DECLSPEC void mpz_combit (mpz_ptr, mp_bitcnt_t);
712003c26c9Smrg 
713003c26c9Smrg #define mpz_congruent_p __gmpz_congruent_p
7145210846fSmrg __GMP_DECLSPEC int mpz_congruent_p (mpz_srcptr, mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
715003c26c9Smrg 
716003c26c9Smrg #define mpz_congruent_2exp_p __gmpz_congruent_2exp_p
7175210846fSmrg __GMP_DECLSPEC int mpz_congruent_2exp_p (mpz_srcptr, mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
718003c26c9Smrg 
719003c26c9Smrg #define mpz_congruent_ui_p __gmpz_congruent_ui_p
7205210846fSmrg __GMP_DECLSPEC int mpz_congruent_ui_p (mpz_srcptr, unsigned long, unsigned long) __GMP_ATTRIBUTE_PURE;
721003c26c9Smrg 
722003c26c9Smrg #define mpz_divexact __gmpz_divexact
7235210846fSmrg __GMP_DECLSPEC void mpz_divexact (mpz_ptr, mpz_srcptr, mpz_srcptr);
724003c26c9Smrg 
725003c26c9Smrg #define mpz_divexact_ui __gmpz_divexact_ui
7265210846fSmrg __GMP_DECLSPEC void mpz_divexact_ui (mpz_ptr, mpz_srcptr, unsigned long);
727003c26c9Smrg 
728003c26c9Smrg #define mpz_divisible_p __gmpz_divisible_p
7295210846fSmrg __GMP_DECLSPEC int mpz_divisible_p (mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
730003c26c9Smrg 
731003c26c9Smrg #define mpz_divisible_ui_p __gmpz_divisible_ui_p
7325210846fSmrg __GMP_DECLSPEC int mpz_divisible_ui_p (mpz_srcptr, unsigned long) __GMP_ATTRIBUTE_PURE;
733003c26c9Smrg 
734003c26c9Smrg #define mpz_divisible_2exp_p __gmpz_divisible_2exp_p
7355210846fSmrg __GMP_DECLSPEC int mpz_divisible_2exp_p (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
736003c26c9Smrg 
737003c26c9Smrg #define mpz_dump __gmpz_dump
7385210846fSmrg __GMP_DECLSPEC void mpz_dump (mpz_srcptr);
739003c26c9Smrg 
740003c26c9Smrg #define mpz_export __gmpz_export
7415210846fSmrg __GMP_DECLSPEC void *mpz_export (void *, size_t *, int, size_t, int, size_t, mpz_srcptr);
742003c26c9Smrg 
743003c26c9Smrg #define mpz_fac_ui __gmpz_fac_ui
7445210846fSmrg __GMP_DECLSPEC void mpz_fac_ui (mpz_ptr, unsigned long int);
7455210846fSmrg 
7465210846fSmrg #define mpz_2fac_ui __gmpz_2fac_ui
7475210846fSmrg __GMP_DECLSPEC void mpz_2fac_ui (mpz_ptr, unsigned long int);
7485210846fSmrg 
7495210846fSmrg #define mpz_mfac_uiui __gmpz_mfac_uiui
7505210846fSmrg __GMP_DECLSPEC void mpz_mfac_uiui (mpz_ptr, unsigned long int, unsigned long int);
7515210846fSmrg 
7525210846fSmrg #define mpz_primorial_ui __gmpz_primorial_ui
7535210846fSmrg __GMP_DECLSPEC void mpz_primorial_ui (mpz_ptr, unsigned long int);
754003c26c9Smrg 
755003c26c9Smrg #define mpz_fdiv_q __gmpz_fdiv_q
7565210846fSmrg __GMP_DECLSPEC void mpz_fdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
757003c26c9Smrg 
758003c26c9Smrg #define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp
7595210846fSmrg __GMP_DECLSPEC void mpz_fdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
760003c26c9Smrg 
761003c26c9Smrg #define mpz_fdiv_q_ui __gmpz_fdiv_q_ui
7625210846fSmrg __GMP_DECLSPEC unsigned long int mpz_fdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
763003c26c9Smrg 
764003c26c9Smrg #define mpz_fdiv_qr __gmpz_fdiv_qr
7655210846fSmrg __GMP_DECLSPEC void mpz_fdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
766003c26c9Smrg 
767003c26c9Smrg #define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui
7685210846fSmrg __GMP_DECLSPEC unsigned long int mpz_fdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
769003c26c9Smrg 
770003c26c9Smrg #define mpz_fdiv_r __gmpz_fdiv_r
7715210846fSmrg __GMP_DECLSPEC void mpz_fdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
772003c26c9Smrg 
773003c26c9Smrg #define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp
7745210846fSmrg __GMP_DECLSPEC void mpz_fdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
775003c26c9Smrg 
776003c26c9Smrg #define mpz_fdiv_r_ui __gmpz_fdiv_r_ui
7775210846fSmrg __GMP_DECLSPEC unsigned long int mpz_fdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
778003c26c9Smrg 
779003c26c9Smrg #define mpz_fdiv_ui __gmpz_fdiv_ui
7805210846fSmrg __GMP_DECLSPEC unsigned long int mpz_fdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
781003c26c9Smrg 
782003c26c9Smrg #define mpz_fib_ui __gmpz_fib_ui
7835210846fSmrg __GMP_DECLSPEC void mpz_fib_ui (mpz_ptr, unsigned long int);
784003c26c9Smrg 
785003c26c9Smrg #define mpz_fib2_ui __gmpz_fib2_ui
7865210846fSmrg __GMP_DECLSPEC void mpz_fib2_ui (mpz_ptr, mpz_ptr, unsigned long int);
787003c26c9Smrg 
788003c26c9Smrg #define mpz_fits_sint_p __gmpz_fits_sint_p
7895210846fSmrg __GMP_DECLSPEC int mpz_fits_sint_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
790003c26c9Smrg 
791003c26c9Smrg #define mpz_fits_slong_p __gmpz_fits_slong_p
7925210846fSmrg __GMP_DECLSPEC int mpz_fits_slong_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
793003c26c9Smrg 
794003c26c9Smrg #define mpz_fits_sshort_p __gmpz_fits_sshort_p
7955210846fSmrg __GMP_DECLSPEC int mpz_fits_sshort_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
796003c26c9Smrg 
797003c26c9Smrg #define mpz_fits_uint_p __gmpz_fits_uint_p
798003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_uint_p)
7995210846fSmrg __GMP_DECLSPEC int mpz_fits_uint_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
800003c26c9Smrg #endif
801003c26c9Smrg 
802003c26c9Smrg #define mpz_fits_ulong_p __gmpz_fits_ulong_p
803003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ulong_p)
8045210846fSmrg __GMP_DECLSPEC int mpz_fits_ulong_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
805003c26c9Smrg #endif
806003c26c9Smrg 
807003c26c9Smrg #define mpz_fits_ushort_p __gmpz_fits_ushort_p
808003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ushort_p)
8095210846fSmrg __GMP_DECLSPEC int mpz_fits_ushort_p (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
810003c26c9Smrg #endif
811003c26c9Smrg 
812003c26c9Smrg #define mpz_gcd __gmpz_gcd
8135210846fSmrg __GMP_DECLSPEC void mpz_gcd (mpz_ptr, mpz_srcptr, mpz_srcptr);
814003c26c9Smrg 
815003c26c9Smrg #define mpz_gcd_ui __gmpz_gcd_ui
8165210846fSmrg __GMP_DECLSPEC unsigned long int mpz_gcd_ui (mpz_ptr, mpz_srcptr, unsigned long int);
817003c26c9Smrg 
818003c26c9Smrg #define mpz_gcdext __gmpz_gcdext
8195210846fSmrg __GMP_DECLSPEC void mpz_gcdext (mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
820003c26c9Smrg 
821003c26c9Smrg #define mpz_get_d __gmpz_get_d
8225210846fSmrg __GMP_DECLSPEC double mpz_get_d (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
823003c26c9Smrg 
824003c26c9Smrg #define mpz_get_d_2exp __gmpz_get_d_2exp
8255210846fSmrg __GMP_DECLSPEC double mpz_get_d_2exp (signed long int *, mpz_srcptr);
826003c26c9Smrg 
827003c26c9Smrg #define mpz_get_si __gmpz_get_si
8285210846fSmrg __GMP_DECLSPEC /* signed */ long int mpz_get_si (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
829003c26c9Smrg 
830003c26c9Smrg #define mpz_get_str __gmpz_get_str
8315210846fSmrg __GMP_DECLSPEC char *mpz_get_str (char *, int, mpz_srcptr);
832003c26c9Smrg 
833003c26c9Smrg #define mpz_get_ui __gmpz_get_ui
834003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_get_ui)
8355210846fSmrg __GMP_DECLSPEC unsigned long int mpz_get_ui (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
836003c26c9Smrg #endif
837003c26c9Smrg 
838003c26c9Smrg #define mpz_getlimbn __gmpz_getlimbn
839003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_getlimbn)
8405210846fSmrg __GMP_DECLSPEC mp_limb_t mpz_getlimbn (mpz_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
841003c26c9Smrg #endif
842003c26c9Smrg 
843003c26c9Smrg #define mpz_hamdist __gmpz_hamdist
8445210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpz_hamdist (mpz_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
845003c26c9Smrg 
846003c26c9Smrg #define mpz_import __gmpz_import
8475210846fSmrg __GMP_DECLSPEC void mpz_import (mpz_ptr, size_t, int, size_t, int, size_t, const void *);
848003c26c9Smrg 
849003c26c9Smrg #define mpz_init __gmpz_init
8500f3f60b5Smrg __GMP_DECLSPEC void mpz_init (mpz_ptr) __GMP_NOTHROW;
851003c26c9Smrg 
852003c26c9Smrg #define mpz_init2 __gmpz_init2
8535210846fSmrg __GMP_DECLSPEC void mpz_init2 (mpz_ptr, mp_bitcnt_t);
854003c26c9Smrg 
855003c26c9Smrg #define mpz_inits __gmpz_inits
8560f3f60b5Smrg __GMP_DECLSPEC void mpz_inits (mpz_ptr, ...) __GMP_NOTHROW;
857003c26c9Smrg 
858003c26c9Smrg #define mpz_init_set __gmpz_init_set
8595210846fSmrg __GMP_DECLSPEC void mpz_init_set (mpz_ptr, mpz_srcptr);
860003c26c9Smrg 
861003c26c9Smrg #define mpz_init_set_d __gmpz_init_set_d
8625210846fSmrg __GMP_DECLSPEC void mpz_init_set_d (mpz_ptr, double);
863003c26c9Smrg 
864003c26c9Smrg #define mpz_init_set_si __gmpz_init_set_si
8655210846fSmrg __GMP_DECLSPEC void mpz_init_set_si (mpz_ptr, signed long int);
866003c26c9Smrg 
867003c26c9Smrg #define mpz_init_set_str __gmpz_init_set_str
8685210846fSmrg __GMP_DECLSPEC int mpz_init_set_str (mpz_ptr, const char *, int);
869003c26c9Smrg 
870003c26c9Smrg #define mpz_init_set_ui __gmpz_init_set_ui
8715210846fSmrg __GMP_DECLSPEC void mpz_init_set_ui (mpz_ptr, unsigned long int);
872003c26c9Smrg 
873003c26c9Smrg #define mpz_inp_raw __gmpz_inp_raw
874003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
8755210846fSmrg __GMP_DECLSPEC size_t mpz_inp_raw (mpz_ptr, FILE *);
876003c26c9Smrg #endif
877003c26c9Smrg 
878003c26c9Smrg #define mpz_inp_str __gmpz_inp_str
879003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
8805210846fSmrg __GMP_DECLSPEC size_t mpz_inp_str (mpz_ptr, FILE *, int);
881003c26c9Smrg #endif
882003c26c9Smrg 
883003c26c9Smrg #define mpz_invert __gmpz_invert
8845210846fSmrg __GMP_DECLSPEC int mpz_invert (mpz_ptr, mpz_srcptr, mpz_srcptr);
885003c26c9Smrg 
886003c26c9Smrg #define mpz_ior __gmpz_ior
8875210846fSmrg __GMP_DECLSPEC void mpz_ior (mpz_ptr, mpz_srcptr, mpz_srcptr);
888003c26c9Smrg 
889003c26c9Smrg #define mpz_jacobi __gmpz_jacobi
8905210846fSmrg __GMP_DECLSPEC int mpz_jacobi (mpz_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
891003c26c9Smrg 
892003c26c9Smrg #define mpz_kronecker mpz_jacobi  /* alias */
893003c26c9Smrg 
894003c26c9Smrg #define mpz_kronecker_si __gmpz_kronecker_si
8955210846fSmrg __GMP_DECLSPEC int mpz_kronecker_si (mpz_srcptr, long) __GMP_ATTRIBUTE_PURE;
896003c26c9Smrg 
897003c26c9Smrg #define mpz_kronecker_ui __gmpz_kronecker_ui
8985210846fSmrg __GMP_DECLSPEC int mpz_kronecker_ui (mpz_srcptr, unsigned long) __GMP_ATTRIBUTE_PURE;
899003c26c9Smrg 
900003c26c9Smrg #define mpz_si_kronecker __gmpz_si_kronecker
9015210846fSmrg __GMP_DECLSPEC int mpz_si_kronecker (long, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
902003c26c9Smrg 
903003c26c9Smrg #define mpz_ui_kronecker __gmpz_ui_kronecker
9045210846fSmrg __GMP_DECLSPEC int mpz_ui_kronecker (unsigned long, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
905003c26c9Smrg 
906003c26c9Smrg #define mpz_lcm __gmpz_lcm
9075210846fSmrg __GMP_DECLSPEC void mpz_lcm (mpz_ptr, mpz_srcptr, mpz_srcptr);
908003c26c9Smrg 
909003c26c9Smrg #define mpz_lcm_ui __gmpz_lcm_ui
9105210846fSmrg __GMP_DECLSPEC void mpz_lcm_ui (mpz_ptr, mpz_srcptr, unsigned long);
911003c26c9Smrg 
912003c26c9Smrg #define mpz_legendre mpz_jacobi  /* alias */
913003c26c9Smrg 
914003c26c9Smrg #define mpz_lucnum_ui __gmpz_lucnum_ui
9155210846fSmrg __GMP_DECLSPEC void mpz_lucnum_ui (mpz_ptr, unsigned long int);
916003c26c9Smrg 
917003c26c9Smrg #define mpz_lucnum2_ui __gmpz_lucnum2_ui
9185210846fSmrg __GMP_DECLSPEC void mpz_lucnum2_ui (mpz_ptr, mpz_ptr, unsigned long int);
919003c26c9Smrg 
920003c26c9Smrg #define mpz_millerrabin __gmpz_millerrabin
9215210846fSmrg __GMP_DECLSPEC int mpz_millerrabin (mpz_srcptr, int) __GMP_ATTRIBUTE_PURE;
922003c26c9Smrg 
923003c26c9Smrg #define mpz_mod __gmpz_mod
9245210846fSmrg __GMP_DECLSPEC void mpz_mod (mpz_ptr, mpz_srcptr, mpz_srcptr);
925003c26c9Smrg 
926003c26c9Smrg #define mpz_mod_ui mpz_fdiv_r_ui /* same as fdiv_r because divisor unsigned */
927003c26c9Smrg 
928003c26c9Smrg #define mpz_mul __gmpz_mul
9295210846fSmrg __GMP_DECLSPEC void mpz_mul (mpz_ptr, mpz_srcptr, mpz_srcptr);
930003c26c9Smrg 
931003c26c9Smrg #define mpz_mul_2exp __gmpz_mul_2exp
9325210846fSmrg __GMP_DECLSPEC void mpz_mul_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
933003c26c9Smrg 
934003c26c9Smrg #define mpz_mul_si __gmpz_mul_si
9355210846fSmrg __GMP_DECLSPEC void mpz_mul_si (mpz_ptr, mpz_srcptr, long int);
936003c26c9Smrg 
937003c26c9Smrg #define mpz_mul_ui __gmpz_mul_ui
9385210846fSmrg __GMP_DECLSPEC void mpz_mul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
939003c26c9Smrg 
940003c26c9Smrg #define mpz_neg __gmpz_neg
941003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_neg)
9425210846fSmrg __GMP_DECLSPEC void mpz_neg (mpz_ptr, mpz_srcptr);
943003c26c9Smrg #endif
944003c26c9Smrg 
945003c26c9Smrg #define mpz_nextprime __gmpz_nextprime
9465210846fSmrg __GMP_DECLSPEC void mpz_nextprime (mpz_ptr, mpz_srcptr);
947003c26c9Smrg 
948003c26c9Smrg #define mpz_out_raw __gmpz_out_raw
949003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
9505210846fSmrg __GMP_DECLSPEC size_t mpz_out_raw (FILE *, mpz_srcptr);
951003c26c9Smrg #endif
952003c26c9Smrg 
953003c26c9Smrg #define mpz_out_str __gmpz_out_str
954003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
9555210846fSmrg __GMP_DECLSPEC size_t mpz_out_str (FILE *, int, mpz_srcptr);
956003c26c9Smrg #endif
957003c26c9Smrg 
958003c26c9Smrg #define mpz_perfect_power_p __gmpz_perfect_power_p
9595210846fSmrg __GMP_DECLSPEC int mpz_perfect_power_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
960003c26c9Smrg 
961003c26c9Smrg #define mpz_perfect_square_p __gmpz_perfect_square_p
962003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_perfect_square_p)
9635210846fSmrg __GMP_DECLSPEC int mpz_perfect_square_p (mpz_srcptr) __GMP_ATTRIBUTE_PURE;
964003c26c9Smrg #endif
965003c26c9Smrg 
966003c26c9Smrg #define mpz_popcount __gmpz_popcount
967003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_popcount)
9685210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpz_popcount (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
969003c26c9Smrg #endif
970003c26c9Smrg 
971003c26c9Smrg #define mpz_pow_ui __gmpz_pow_ui
9725210846fSmrg __GMP_DECLSPEC void mpz_pow_ui (mpz_ptr, mpz_srcptr, unsigned long int);
973003c26c9Smrg 
974003c26c9Smrg #define mpz_powm __gmpz_powm
9755210846fSmrg __GMP_DECLSPEC void mpz_powm (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
976003c26c9Smrg 
977003c26c9Smrg #define mpz_powm_sec __gmpz_powm_sec
9785210846fSmrg __GMP_DECLSPEC void mpz_powm_sec (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr);
979003c26c9Smrg 
980003c26c9Smrg #define mpz_powm_ui __gmpz_powm_ui
9815210846fSmrg __GMP_DECLSPEC void mpz_powm_ui (mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr);
982003c26c9Smrg 
983003c26c9Smrg #define mpz_probab_prime_p __gmpz_probab_prime_p
9845210846fSmrg __GMP_DECLSPEC int mpz_probab_prime_p (mpz_srcptr, int) __GMP_ATTRIBUTE_PURE;
985003c26c9Smrg 
986003c26c9Smrg #define mpz_random __gmpz_random
9875210846fSmrg __GMP_DECLSPEC void mpz_random (mpz_ptr, mp_size_t);
988003c26c9Smrg 
989003c26c9Smrg #define mpz_random2 __gmpz_random2
9905210846fSmrg __GMP_DECLSPEC void mpz_random2 (mpz_ptr, mp_size_t);
991003c26c9Smrg 
992003c26c9Smrg #define mpz_realloc2 __gmpz_realloc2
9935210846fSmrg __GMP_DECLSPEC void mpz_realloc2 (mpz_ptr, mp_bitcnt_t);
994003c26c9Smrg 
995003c26c9Smrg #define mpz_remove __gmpz_remove
9965210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpz_remove (mpz_ptr, mpz_srcptr, mpz_srcptr);
997003c26c9Smrg 
998003c26c9Smrg #define mpz_root __gmpz_root
9995210846fSmrg __GMP_DECLSPEC int mpz_root (mpz_ptr, mpz_srcptr, unsigned long int);
1000003c26c9Smrg 
1001003c26c9Smrg #define mpz_rootrem __gmpz_rootrem
10025210846fSmrg __GMP_DECLSPEC void mpz_rootrem (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
1003003c26c9Smrg 
1004003c26c9Smrg #define mpz_rrandomb __gmpz_rrandomb
10055210846fSmrg __GMP_DECLSPEC void mpz_rrandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t);
1006003c26c9Smrg 
1007003c26c9Smrg #define mpz_scan0 __gmpz_scan0
10085210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpz_scan0 (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1009003c26c9Smrg 
1010003c26c9Smrg #define mpz_scan1 __gmpz_scan1
10115210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpz_scan1 (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1012003c26c9Smrg 
1013003c26c9Smrg #define mpz_set __gmpz_set
10145210846fSmrg __GMP_DECLSPEC void mpz_set (mpz_ptr, mpz_srcptr);
1015003c26c9Smrg 
1016003c26c9Smrg #define mpz_set_d __gmpz_set_d
10175210846fSmrg __GMP_DECLSPEC void mpz_set_d (mpz_ptr, double);
1018003c26c9Smrg 
1019003c26c9Smrg #define mpz_set_f __gmpz_set_f
10205210846fSmrg __GMP_DECLSPEC void mpz_set_f (mpz_ptr, mpf_srcptr);
1021003c26c9Smrg 
1022003c26c9Smrg #define mpz_set_q __gmpz_set_q
1023003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_set_q)
10245210846fSmrg __GMP_DECLSPEC void mpz_set_q (mpz_ptr, mpq_srcptr);
1025003c26c9Smrg #endif
1026003c26c9Smrg 
1027003c26c9Smrg #define mpz_set_si __gmpz_set_si
10285210846fSmrg __GMP_DECLSPEC void mpz_set_si (mpz_ptr, signed long int);
1029003c26c9Smrg 
1030003c26c9Smrg #define mpz_set_str __gmpz_set_str
10315210846fSmrg __GMP_DECLSPEC int mpz_set_str (mpz_ptr, const char *, int);
1032003c26c9Smrg 
1033003c26c9Smrg #define mpz_set_ui __gmpz_set_ui
10345210846fSmrg __GMP_DECLSPEC void mpz_set_ui (mpz_ptr, unsigned long int);
1035003c26c9Smrg 
1036003c26c9Smrg #define mpz_setbit __gmpz_setbit
10375210846fSmrg __GMP_DECLSPEC void mpz_setbit (mpz_ptr, mp_bitcnt_t);
1038003c26c9Smrg 
1039003c26c9Smrg #define mpz_size __gmpz_size
1040003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size)
10415210846fSmrg __GMP_DECLSPEC size_t mpz_size (mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1042003c26c9Smrg #endif
1043003c26c9Smrg 
1044003c26c9Smrg #define mpz_sizeinbase __gmpz_sizeinbase
10455210846fSmrg __GMP_DECLSPEC size_t mpz_sizeinbase (mpz_srcptr, int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1046003c26c9Smrg 
1047003c26c9Smrg #define mpz_sqrt __gmpz_sqrt
10485210846fSmrg __GMP_DECLSPEC void mpz_sqrt (mpz_ptr, mpz_srcptr);
1049003c26c9Smrg 
1050003c26c9Smrg #define mpz_sqrtrem __gmpz_sqrtrem
10515210846fSmrg __GMP_DECLSPEC void mpz_sqrtrem (mpz_ptr, mpz_ptr, mpz_srcptr);
1052003c26c9Smrg 
1053003c26c9Smrg #define mpz_sub __gmpz_sub
10545210846fSmrg __GMP_DECLSPEC void mpz_sub (mpz_ptr, mpz_srcptr, mpz_srcptr);
1055003c26c9Smrg 
1056003c26c9Smrg #define mpz_sub_ui __gmpz_sub_ui
10575210846fSmrg __GMP_DECLSPEC void mpz_sub_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1058003c26c9Smrg 
1059003c26c9Smrg #define mpz_ui_sub __gmpz_ui_sub
10605210846fSmrg __GMP_DECLSPEC void mpz_ui_sub (mpz_ptr, unsigned long int, mpz_srcptr);
1061003c26c9Smrg 
1062003c26c9Smrg #define mpz_submul __gmpz_submul
10635210846fSmrg __GMP_DECLSPEC void mpz_submul (mpz_ptr, mpz_srcptr, mpz_srcptr);
1064003c26c9Smrg 
1065003c26c9Smrg #define mpz_submul_ui __gmpz_submul_ui
10665210846fSmrg __GMP_DECLSPEC void mpz_submul_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1067003c26c9Smrg 
1068003c26c9Smrg #define mpz_swap __gmpz_swap
10695210846fSmrg __GMP_DECLSPEC void mpz_swap (mpz_ptr, mpz_ptr) __GMP_NOTHROW;
1070003c26c9Smrg 
1071003c26c9Smrg #define mpz_tdiv_ui __gmpz_tdiv_ui
10725210846fSmrg __GMP_DECLSPEC unsigned long int mpz_tdiv_ui (mpz_srcptr, unsigned long int) __GMP_ATTRIBUTE_PURE;
1073003c26c9Smrg 
1074003c26c9Smrg #define mpz_tdiv_q __gmpz_tdiv_q
10755210846fSmrg __GMP_DECLSPEC void mpz_tdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr);
1076003c26c9Smrg 
1077003c26c9Smrg #define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp
10785210846fSmrg __GMP_DECLSPEC void mpz_tdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
1079003c26c9Smrg 
1080003c26c9Smrg #define mpz_tdiv_q_ui __gmpz_tdiv_q_ui
10815210846fSmrg __GMP_DECLSPEC unsigned long int mpz_tdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1082003c26c9Smrg 
1083003c26c9Smrg #define mpz_tdiv_qr __gmpz_tdiv_qr
10845210846fSmrg __GMP_DECLSPEC void mpz_tdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
1085003c26c9Smrg 
1086003c26c9Smrg #define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui
10875210846fSmrg __GMP_DECLSPEC unsigned long int mpz_tdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int);
1088003c26c9Smrg 
1089003c26c9Smrg #define mpz_tdiv_r __gmpz_tdiv_r
10905210846fSmrg __GMP_DECLSPEC void mpz_tdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr);
1091003c26c9Smrg 
1092003c26c9Smrg #define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp
10935210846fSmrg __GMP_DECLSPEC void mpz_tdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t);
1094003c26c9Smrg 
1095003c26c9Smrg #define mpz_tdiv_r_ui __gmpz_tdiv_r_ui
10965210846fSmrg __GMP_DECLSPEC unsigned long int mpz_tdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int);
1097003c26c9Smrg 
1098003c26c9Smrg #define mpz_tstbit __gmpz_tstbit
10995210846fSmrg __GMP_DECLSPEC int mpz_tstbit (mpz_srcptr, mp_bitcnt_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1100003c26c9Smrg 
1101003c26c9Smrg #define mpz_ui_pow_ui __gmpz_ui_pow_ui
11025210846fSmrg __GMP_DECLSPEC void mpz_ui_pow_ui (mpz_ptr, unsigned long int, unsigned long int);
1103003c26c9Smrg 
1104003c26c9Smrg #define mpz_urandomb __gmpz_urandomb
11055210846fSmrg __GMP_DECLSPEC void mpz_urandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t);
1106003c26c9Smrg 
1107003c26c9Smrg #define mpz_urandomm __gmpz_urandomm
11085210846fSmrg __GMP_DECLSPEC void mpz_urandomm (mpz_ptr, gmp_randstate_t, mpz_srcptr);
1109003c26c9Smrg 
1110003c26c9Smrg #define mpz_xor __gmpz_xor
1111003c26c9Smrg #define mpz_eor __gmpz_xor
11125210846fSmrg __GMP_DECLSPEC void mpz_xor (mpz_ptr, mpz_srcptr, mpz_srcptr);
1113003c26c9Smrg 
11147d829589Smrg #define mpz_limbs_read __gmpz_limbs_read
11157d829589Smrg __GMP_DECLSPEC mp_srcptr mpz_limbs_read (mpz_srcptr);
11167d829589Smrg 
11177d829589Smrg #define mpz_limbs_write __gmpz_limbs_write
11187d829589Smrg __GMP_DECLSPEC mp_ptr mpz_limbs_write (mpz_ptr, mp_size_t);
11197d829589Smrg 
11207d829589Smrg #define mpz_limbs_modify __gmpz_limbs_modify
11217d829589Smrg __GMP_DECLSPEC mp_ptr mpz_limbs_modify (mpz_ptr, mp_size_t);
11227d829589Smrg 
11237d829589Smrg #define mpz_limbs_finish __gmpz_limbs_finish
11247d829589Smrg __GMP_DECLSPEC void mpz_limbs_finish (mpz_ptr, mp_size_t);
11257d829589Smrg 
11267d829589Smrg #define mpz_roinit_n __gmpz_roinit_n
11277d829589Smrg __GMP_DECLSPEC mpz_srcptr mpz_roinit_n (mpz_ptr, mp_srcptr, mp_size_t);
11287d829589Smrg 
11297d829589Smrg #define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
1130003c26c9Smrg 
1131003c26c9Smrg /**************** Rational (i.e. Q) routines.  ****************/
1132003c26c9Smrg 
1133003c26c9Smrg #define mpq_abs __gmpq_abs
1134003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_abs)
11355210846fSmrg __GMP_DECLSPEC void mpq_abs (mpq_ptr, mpq_srcptr);
1136003c26c9Smrg #endif
1137003c26c9Smrg 
1138003c26c9Smrg #define mpq_add __gmpq_add
11395210846fSmrg __GMP_DECLSPEC void mpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr);
1140003c26c9Smrg 
1141003c26c9Smrg #define mpq_canonicalize __gmpq_canonicalize
11425210846fSmrg __GMP_DECLSPEC void mpq_canonicalize (mpq_ptr);
1143003c26c9Smrg 
1144003c26c9Smrg #define mpq_clear __gmpq_clear
11455210846fSmrg __GMP_DECLSPEC void mpq_clear (mpq_ptr);
1146003c26c9Smrg 
1147003c26c9Smrg #define mpq_clears __gmpq_clears
11485210846fSmrg __GMP_DECLSPEC void mpq_clears (mpq_ptr, ...);
1149003c26c9Smrg 
1150003c26c9Smrg #define mpq_cmp __gmpq_cmp
11515210846fSmrg __GMP_DECLSPEC int mpq_cmp (mpq_srcptr, mpq_srcptr) __GMP_ATTRIBUTE_PURE;
1152003c26c9Smrg 
1153003c26c9Smrg #define _mpq_cmp_si __gmpq_cmp_si
11545210846fSmrg __GMP_DECLSPEC int _mpq_cmp_si (mpq_srcptr, long, unsigned long) __GMP_ATTRIBUTE_PURE;
1155003c26c9Smrg 
1156003c26c9Smrg #define _mpq_cmp_ui __gmpq_cmp_ui
11575210846fSmrg __GMP_DECLSPEC int _mpq_cmp_ui (mpq_srcptr, unsigned long int, unsigned long int) __GMP_ATTRIBUTE_PURE;
1158003c26c9Smrg 
11597d829589Smrg #define mpq_cmp_z __gmpq_cmp_z
11607d829589Smrg __GMP_DECLSPEC int mpq_cmp_z (mpq_srcptr, mpz_srcptr) __GMP_ATTRIBUTE_PURE;
11617d829589Smrg 
1162003c26c9Smrg #define mpq_div __gmpq_div
11635210846fSmrg __GMP_DECLSPEC void mpq_div (mpq_ptr, mpq_srcptr, mpq_srcptr);
1164003c26c9Smrg 
1165003c26c9Smrg #define mpq_div_2exp __gmpq_div_2exp
11665210846fSmrg __GMP_DECLSPEC void mpq_div_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t);
1167003c26c9Smrg 
1168003c26c9Smrg #define mpq_equal __gmpq_equal
11695210846fSmrg __GMP_DECLSPEC int mpq_equal (mpq_srcptr, mpq_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1170003c26c9Smrg 
1171003c26c9Smrg #define mpq_get_num __gmpq_get_num
11725210846fSmrg __GMP_DECLSPEC void mpq_get_num (mpz_ptr, mpq_srcptr);
1173003c26c9Smrg 
1174003c26c9Smrg #define mpq_get_den __gmpq_get_den
11755210846fSmrg __GMP_DECLSPEC void mpq_get_den (mpz_ptr, mpq_srcptr);
1176003c26c9Smrg 
1177003c26c9Smrg #define mpq_get_d __gmpq_get_d
11785210846fSmrg __GMP_DECLSPEC double mpq_get_d (mpq_srcptr) __GMP_ATTRIBUTE_PURE;
1179003c26c9Smrg 
1180003c26c9Smrg #define mpq_get_str __gmpq_get_str
11815210846fSmrg __GMP_DECLSPEC char *mpq_get_str (char *, int, mpq_srcptr);
1182003c26c9Smrg 
1183003c26c9Smrg #define mpq_init __gmpq_init
11845210846fSmrg __GMP_DECLSPEC void mpq_init (mpq_ptr);
1185003c26c9Smrg 
1186003c26c9Smrg #define mpq_inits __gmpq_inits
11875210846fSmrg __GMP_DECLSPEC void mpq_inits (mpq_ptr, ...);
1188003c26c9Smrg 
1189003c26c9Smrg #define mpq_inp_str __gmpq_inp_str
1190003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
11915210846fSmrg __GMP_DECLSPEC size_t mpq_inp_str (mpq_ptr, FILE *, int);
1192003c26c9Smrg #endif
1193003c26c9Smrg 
1194003c26c9Smrg #define mpq_inv __gmpq_inv
11955210846fSmrg __GMP_DECLSPEC void mpq_inv (mpq_ptr, mpq_srcptr);
1196003c26c9Smrg 
1197003c26c9Smrg #define mpq_mul __gmpq_mul
11985210846fSmrg __GMP_DECLSPEC void mpq_mul (mpq_ptr, mpq_srcptr, mpq_srcptr);
1199003c26c9Smrg 
1200003c26c9Smrg #define mpq_mul_2exp __gmpq_mul_2exp
12015210846fSmrg __GMP_DECLSPEC void mpq_mul_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t);
1202003c26c9Smrg 
1203003c26c9Smrg #define mpq_neg __gmpq_neg
1204003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_neg)
12055210846fSmrg __GMP_DECLSPEC void mpq_neg (mpq_ptr, mpq_srcptr);
1206003c26c9Smrg #endif
1207003c26c9Smrg 
1208003c26c9Smrg #define mpq_out_str __gmpq_out_str
1209003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
12105210846fSmrg __GMP_DECLSPEC size_t mpq_out_str (FILE *, int, mpq_srcptr);
1211003c26c9Smrg #endif
1212003c26c9Smrg 
1213003c26c9Smrg #define mpq_set __gmpq_set
12145210846fSmrg __GMP_DECLSPEC void mpq_set (mpq_ptr, mpq_srcptr);
1215003c26c9Smrg 
1216003c26c9Smrg #define mpq_set_d __gmpq_set_d
12175210846fSmrg __GMP_DECLSPEC void mpq_set_d (mpq_ptr, double);
1218003c26c9Smrg 
1219003c26c9Smrg #define mpq_set_den __gmpq_set_den
12205210846fSmrg __GMP_DECLSPEC void mpq_set_den (mpq_ptr, mpz_srcptr);
1221003c26c9Smrg 
1222003c26c9Smrg #define mpq_set_f __gmpq_set_f
12235210846fSmrg __GMP_DECLSPEC void mpq_set_f (mpq_ptr, mpf_srcptr);
1224003c26c9Smrg 
1225003c26c9Smrg #define mpq_set_num __gmpq_set_num
12265210846fSmrg __GMP_DECLSPEC void mpq_set_num (mpq_ptr, mpz_srcptr);
1227003c26c9Smrg 
1228003c26c9Smrg #define mpq_set_si __gmpq_set_si
12295210846fSmrg __GMP_DECLSPEC void mpq_set_si (mpq_ptr, signed long int, unsigned long int);
1230003c26c9Smrg 
1231003c26c9Smrg #define mpq_set_str __gmpq_set_str
12325210846fSmrg __GMP_DECLSPEC int mpq_set_str (mpq_ptr, const char *, int);
1233003c26c9Smrg 
1234003c26c9Smrg #define mpq_set_ui __gmpq_set_ui
12355210846fSmrg __GMP_DECLSPEC void mpq_set_ui (mpq_ptr, unsigned long int, unsigned long int);
1236003c26c9Smrg 
1237003c26c9Smrg #define mpq_set_z __gmpq_set_z
12385210846fSmrg __GMP_DECLSPEC void mpq_set_z (mpq_ptr, mpz_srcptr);
1239003c26c9Smrg 
1240003c26c9Smrg #define mpq_sub __gmpq_sub
12415210846fSmrg __GMP_DECLSPEC void mpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr);
1242003c26c9Smrg 
1243003c26c9Smrg #define mpq_swap __gmpq_swap
12445210846fSmrg __GMP_DECLSPEC void mpq_swap (mpq_ptr, mpq_ptr) __GMP_NOTHROW;
1245003c26c9Smrg 
1246003c26c9Smrg 
1247003c26c9Smrg /**************** Float (i.e. F) routines.  ****************/
1248003c26c9Smrg 
1249003c26c9Smrg #define mpf_abs __gmpf_abs
12505210846fSmrg __GMP_DECLSPEC void mpf_abs (mpf_ptr, mpf_srcptr);
1251003c26c9Smrg 
1252003c26c9Smrg #define mpf_add __gmpf_add
12535210846fSmrg __GMP_DECLSPEC void mpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
1254003c26c9Smrg 
1255003c26c9Smrg #define mpf_add_ui __gmpf_add_ui
12565210846fSmrg __GMP_DECLSPEC void mpf_add_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1257003c26c9Smrg #define mpf_ceil __gmpf_ceil
12585210846fSmrg __GMP_DECLSPEC void mpf_ceil (mpf_ptr, mpf_srcptr);
1259003c26c9Smrg 
1260003c26c9Smrg #define mpf_clear __gmpf_clear
12615210846fSmrg __GMP_DECLSPEC void mpf_clear (mpf_ptr);
1262003c26c9Smrg 
1263003c26c9Smrg #define mpf_clears __gmpf_clears
12645210846fSmrg __GMP_DECLSPEC void mpf_clears (mpf_ptr, ...);
1265003c26c9Smrg 
1266003c26c9Smrg #define mpf_cmp __gmpf_cmp
12675210846fSmrg __GMP_DECLSPEC int mpf_cmp (mpf_srcptr, mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1268003c26c9Smrg 
12697d829589Smrg #define mpf_cmp_z __gmpf_cmp_z
12707d829589Smrg __GMP_DECLSPEC int mpf_cmp_z (mpf_srcptr, mpz_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
12717d829589Smrg 
1272003c26c9Smrg #define mpf_cmp_d __gmpf_cmp_d
12735210846fSmrg __GMP_DECLSPEC int mpf_cmp_d (mpf_srcptr, double) __GMP_ATTRIBUTE_PURE;
1274003c26c9Smrg 
1275003c26c9Smrg #define mpf_cmp_si __gmpf_cmp_si
12765210846fSmrg __GMP_DECLSPEC int mpf_cmp_si (mpf_srcptr, signed long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1277003c26c9Smrg 
1278003c26c9Smrg #define mpf_cmp_ui __gmpf_cmp_ui
12795210846fSmrg __GMP_DECLSPEC int mpf_cmp_ui (mpf_srcptr, unsigned long int) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1280003c26c9Smrg 
1281003c26c9Smrg #define mpf_div __gmpf_div
12825210846fSmrg __GMP_DECLSPEC void mpf_div (mpf_ptr, mpf_srcptr, mpf_srcptr);
1283003c26c9Smrg 
1284003c26c9Smrg #define mpf_div_2exp __gmpf_div_2exp
12855210846fSmrg __GMP_DECLSPEC void mpf_div_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t);
1286003c26c9Smrg 
1287003c26c9Smrg #define mpf_div_ui __gmpf_div_ui
12885210846fSmrg __GMP_DECLSPEC void mpf_div_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1289003c26c9Smrg 
1290003c26c9Smrg #define mpf_dump __gmpf_dump
12915210846fSmrg __GMP_DECLSPEC void mpf_dump (mpf_srcptr);
1292003c26c9Smrg 
1293003c26c9Smrg #define mpf_eq __gmpf_eq
12945210846fSmrg __GMP_DECLSPEC int mpf_eq (mpf_srcptr, mpf_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1295003c26c9Smrg 
1296003c26c9Smrg #define mpf_fits_sint_p __gmpf_fits_sint_p
12975210846fSmrg __GMP_DECLSPEC int mpf_fits_sint_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1298003c26c9Smrg 
1299003c26c9Smrg #define mpf_fits_slong_p __gmpf_fits_slong_p
13005210846fSmrg __GMP_DECLSPEC int mpf_fits_slong_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1301003c26c9Smrg 
1302003c26c9Smrg #define mpf_fits_sshort_p __gmpf_fits_sshort_p
13035210846fSmrg __GMP_DECLSPEC int mpf_fits_sshort_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1304003c26c9Smrg 
1305003c26c9Smrg #define mpf_fits_uint_p __gmpf_fits_uint_p
13065210846fSmrg __GMP_DECLSPEC int mpf_fits_uint_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1307003c26c9Smrg 
1308003c26c9Smrg #define mpf_fits_ulong_p __gmpf_fits_ulong_p
13095210846fSmrg __GMP_DECLSPEC int mpf_fits_ulong_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1310003c26c9Smrg 
1311003c26c9Smrg #define mpf_fits_ushort_p __gmpf_fits_ushort_p
13125210846fSmrg __GMP_DECLSPEC int mpf_fits_ushort_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1313003c26c9Smrg 
1314003c26c9Smrg #define mpf_floor __gmpf_floor
13155210846fSmrg __GMP_DECLSPEC void mpf_floor (mpf_ptr, mpf_srcptr);
1316003c26c9Smrg 
1317003c26c9Smrg #define mpf_get_d __gmpf_get_d
13185210846fSmrg __GMP_DECLSPEC double mpf_get_d (mpf_srcptr) __GMP_ATTRIBUTE_PURE;
1319003c26c9Smrg 
1320003c26c9Smrg #define mpf_get_d_2exp __gmpf_get_d_2exp
13215210846fSmrg __GMP_DECLSPEC double mpf_get_d_2exp (signed long int *, mpf_srcptr);
1322003c26c9Smrg 
1323003c26c9Smrg #define mpf_get_default_prec __gmpf_get_default_prec
13245210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpf_get_default_prec (void) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1325003c26c9Smrg 
1326003c26c9Smrg #define mpf_get_prec __gmpf_get_prec
13275210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpf_get_prec (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1328003c26c9Smrg 
1329003c26c9Smrg #define mpf_get_si __gmpf_get_si
13305210846fSmrg __GMP_DECLSPEC long mpf_get_si (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1331003c26c9Smrg 
1332003c26c9Smrg #define mpf_get_str __gmpf_get_str
13335210846fSmrg __GMP_DECLSPEC char *mpf_get_str (char *, mp_exp_t *, int, size_t, mpf_srcptr);
1334003c26c9Smrg 
1335003c26c9Smrg #define mpf_get_ui __gmpf_get_ui
13365210846fSmrg __GMP_DECLSPEC unsigned long mpf_get_ui (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1337003c26c9Smrg 
1338003c26c9Smrg #define mpf_init __gmpf_init
13395210846fSmrg __GMP_DECLSPEC void mpf_init (mpf_ptr);
1340003c26c9Smrg 
1341003c26c9Smrg #define mpf_init2 __gmpf_init2
13425210846fSmrg __GMP_DECLSPEC void mpf_init2 (mpf_ptr, mp_bitcnt_t);
1343003c26c9Smrg 
1344003c26c9Smrg #define mpf_inits __gmpf_inits
13455210846fSmrg __GMP_DECLSPEC void mpf_inits (mpf_ptr, ...);
1346003c26c9Smrg 
1347003c26c9Smrg #define mpf_init_set __gmpf_init_set
13485210846fSmrg __GMP_DECLSPEC void mpf_init_set (mpf_ptr, mpf_srcptr);
1349003c26c9Smrg 
1350003c26c9Smrg #define mpf_init_set_d __gmpf_init_set_d
13515210846fSmrg __GMP_DECLSPEC void mpf_init_set_d (mpf_ptr, double);
1352003c26c9Smrg 
1353003c26c9Smrg #define mpf_init_set_si __gmpf_init_set_si
13545210846fSmrg __GMP_DECLSPEC void mpf_init_set_si (mpf_ptr, signed long int);
1355003c26c9Smrg 
1356003c26c9Smrg #define mpf_init_set_str __gmpf_init_set_str
13575210846fSmrg __GMP_DECLSPEC int mpf_init_set_str (mpf_ptr, const char *, int);
1358003c26c9Smrg 
1359003c26c9Smrg #define mpf_init_set_ui __gmpf_init_set_ui
13605210846fSmrg __GMP_DECLSPEC void mpf_init_set_ui (mpf_ptr, unsigned long int);
1361003c26c9Smrg 
1362003c26c9Smrg #define mpf_inp_str __gmpf_inp_str
1363003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
13645210846fSmrg __GMP_DECLSPEC size_t mpf_inp_str (mpf_ptr, FILE *, int);
1365003c26c9Smrg #endif
1366003c26c9Smrg 
1367003c26c9Smrg #define mpf_integer_p __gmpf_integer_p
13685210846fSmrg __GMP_DECLSPEC int mpf_integer_p (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1369003c26c9Smrg 
1370003c26c9Smrg #define mpf_mul __gmpf_mul
13715210846fSmrg __GMP_DECLSPEC void mpf_mul (mpf_ptr, mpf_srcptr, mpf_srcptr);
1372003c26c9Smrg 
1373003c26c9Smrg #define mpf_mul_2exp __gmpf_mul_2exp
13745210846fSmrg __GMP_DECLSPEC void mpf_mul_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t);
1375003c26c9Smrg 
1376003c26c9Smrg #define mpf_mul_ui __gmpf_mul_ui
13775210846fSmrg __GMP_DECLSPEC void mpf_mul_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1378003c26c9Smrg 
1379003c26c9Smrg #define mpf_neg __gmpf_neg
13805210846fSmrg __GMP_DECLSPEC void mpf_neg (mpf_ptr, mpf_srcptr);
1381003c26c9Smrg 
1382003c26c9Smrg #define mpf_out_str __gmpf_out_str
1383003c26c9Smrg #ifdef _GMP_H_HAVE_FILE
13845210846fSmrg __GMP_DECLSPEC size_t mpf_out_str (FILE *, int, size_t, mpf_srcptr);
1385003c26c9Smrg #endif
1386003c26c9Smrg 
1387003c26c9Smrg #define mpf_pow_ui __gmpf_pow_ui
13885210846fSmrg __GMP_DECLSPEC void mpf_pow_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1389003c26c9Smrg 
1390003c26c9Smrg #define mpf_random2 __gmpf_random2
13915210846fSmrg __GMP_DECLSPEC void mpf_random2 (mpf_ptr, mp_size_t, mp_exp_t);
1392003c26c9Smrg 
1393003c26c9Smrg #define mpf_reldiff __gmpf_reldiff
13945210846fSmrg __GMP_DECLSPEC void mpf_reldiff (mpf_ptr, mpf_srcptr, mpf_srcptr);
1395003c26c9Smrg 
1396003c26c9Smrg #define mpf_set __gmpf_set
13975210846fSmrg __GMP_DECLSPEC void mpf_set (mpf_ptr, mpf_srcptr);
1398003c26c9Smrg 
1399003c26c9Smrg #define mpf_set_d __gmpf_set_d
14005210846fSmrg __GMP_DECLSPEC void mpf_set_d (mpf_ptr, double);
1401003c26c9Smrg 
1402003c26c9Smrg #define mpf_set_default_prec __gmpf_set_default_prec
14035210846fSmrg __GMP_DECLSPEC void mpf_set_default_prec (mp_bitcnt_t) __GMP_NOTHROW;
1404003c26c9Smrg 
1405003c26c9Smrg #define mpf_set_prec __gmpf_set_prec
14065210846fSmrg __GMP_DECLSPEC void mpf_set_prec (mpf_ptr, mp_bitcnt_t);
1407003c26c9Smrg 
1408003c26c9Smrg #define mpf_set_prec_raw __gmpf_set_prec_raw
14095210846fSmrg __GMP_DECLSPEC void mpf_set_prec_raw (mpf_ptr, mp_bitcnt_t) __GMP_NOTHROW;
1410003c26c9Smrg 
1411003c26c9Smrg #define mpf_set_q __gmpf_set_q
14125210846fSmrg __GMP_DECLSPEC void mpf_set_q (mpf_ptr, mpq_srcptr);
1413003c26c9Smrg 
1414003c26c9Smrg #define mpf_set_si __gmpf_set_si
14155210846fSmrg __GMP_DECLSPEC void mpf_set_si (mpf_ptr, signed long int);
1416003c26c9Smrg 
1417003c26c9Smrg #define mpf_set_str __gmpf_set_str
14185210846fSmrg __GMP_DECLSPEC int mpf_set_str (mpf_ptr, const char *, int);
1419003c26c9Smrg 
1420003c26c9Smrg #define mpf_set_ui __gmpf_set_ui
14215210846fSmrg __GMP_DECLSPEC void mpf_set_ui (mpf_ptr, unsigned long int);
1422003c26c9Smrg 
1423003c26c9Smrg #define mpf_set_z __gmpf_set_z
14245210846fSmrg __GMP_DECLSPEC void mpf_set_z (mpf_ptr, mpz_srcptr);
1425003c26c9Smrg 
1426003c26c9Smrg #define mpf_size __gmpf_size
14275210846fSmrg __GMP_DECLSPEC size_t mpf_size (mpf_srcptr) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1428003c26c9Smrg 
1429003c26c9Smrg #define mpf_sqrt __gmpf_sqrt
14305210846fSmrg __GMP_DECLSPEC void mpf_sqrt (mpf_ptr, mpf_srcptr);
1431003c26c9Smrg 
1432003c26c9Smrg #define mpf_sqrt_ui __gmpf_sqrt_ui
14335210846fSmrg __GMP_DECLSPEC void mpf_sqrt_ui (mpf_ptr, unsigned long int);
1434003c26c9Smrg 
1435003c26c9Smrg #define mpf_sub __gmpf_sub
14365210846fSmrg __GMP_DECLSPEC void mpf_sub (mpf_ptr, mpf_srcptr, mpf_srcptr);
1437003c26c9Smrg 
1438003c26c9Smrg #define mpf_sub_ui __gmpf_sub_ui
14395210846fSmrg __GMP_DECLSPEC void mpf_sub_ui (mpf_ptr, mpf_srcptr, unsigned long int);
1440003c26c9Smrg 
1441003c26c9Smrg #define mpf_swap __gmpf_swap
14425210846fSmrg __GMP_DECLSPEC void mpf_swap (mpf_ptr, mpf_ptr) __GMP_NOTHROW;
1443003c26c9Smrg 
1444003c26c9Smrg #define mpf_trunc __gmpf_trunc
14455210846fSmrg __GMP_DECLSPEC void mpf_trunc (mpf_ptr, mpf_srcptr);
1446003c26c9Smrg 
1447003c26c9Smrg #define mpf_ui_div __gmpf_ui_div
14485210846fSmrg __GMP_DECLSPEC void mpf_ui_div (mpf_ptr, unsigned long int, mpf_srcptr);
1449003c26c9Smrg 
1450003c26c9Smrg #define mpf_ui_sub __gmpf_ui_sub
14515210846fSmrg __GMP_DECLSPEC void mpf_ui_sub (mpf_ptr, unsigned long int, mpf_srcptr);
1452003c26c9Smrg 
1453003c26c9Smrg #define mpf_urandomb __gmpf_urandomb
14545210846fSmrg __GMP_DECLSPEC void mpf_urandomb (mpf_t, gmp_randstate_t, mp_bitcnt_t);
1455003c26c9Smrg 
1456003c26c9Smrg 
1457003c26c9Smrg /************ Low level positive-integer (i.e. N) routines.  ************/
1458003c26c9Smrg 
1459003c26c9Smrg /* This is ugly, but we need to make user calls reach the prefixed function. */
1460003c26c9Smrg 
1461003c26c9Smrg #define mpn_add __MPN(add)
1462003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add)
14635210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1464003c26c9Smrg #endif
1465003c26c9Smrg 
1466003c26c9Smrg #define mpn_add_1 __MPN(add_1)
1467003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add_1)
14685210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t) __GMP_NOTHROW;
1469003c26c9Smrg #endif
1470003c26c9Smrg 
1471003c26c9Smrg #define mpn_add_n __MPN(add_n)
14725210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1473003c26c9Smrg 
1474003c26c9Smrg #define mpn_addmul_1 __MPN(addmul_1)
14755210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1476003c26c9Smrg 
1477003c26c9Smrg #define mpn_cmp __MPN(cmp)
1478003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_cmp)
14795210846fSmrg __GMP_DECLSPEC int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1480003c26c9Smrg #endif
1481003c26c9Smrg 
14827d829589Smrg #define mpn_zero_p __MPN(zero_p)
14837d829589Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_zero_p)
14847d829589Smrg __GMP_DECLSPEC int mpn_zero_p (mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
14857d829589Smrg #endif
14867d829589Smrg 
14877d829589Smrg #define mpn_divexact_1 __MPN(divexact_1)
14887d829589Smrg __GMP_DECLSPEC void mpn_divexact_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
14897d829589Smrg 
1490003c26c9Smrg #define mpn_divexact_by3(dst,src,size) \
1491003c26c9Smrg   mpn_divexact_by3c (dst, src, size, __GMP_CAST (mp_limb_t, 0))
1492003c26c9Smrg 
1493003c26c9Smrg #define mpn_divexact_by3c __MPN(divexact_by3c)
14945210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_divexact_by3c (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1495003c26c9Smrg 
1496003c26c9Smrg #define mpn_divmod_1(qp,np,nsize,dlimb) \
1497003c26c9Smrg   mpn_divrem_1 (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dlimb)
1498003c26c9Smrg 
1499003c26c9Smrg #define mpn_divrem __MPN(divrem)
15005210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_divrem (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t);
1501003c26c9Smrg 
1502003c26c9Smrg #define mpn_divrem_1 __MPN(divrem_1)
15035210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_divrem_1 (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t);
1504003c26c9Smrg 
1505003c26c9Smrg #define mpn_divrem_2 __MPN(divrem_2)
15065210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_divrem_2 (mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr);
15075210846fSmrg 
15087d829589Smrg #define mpn_div_qr_1 __MPN(div_qr_1)
15097d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_div_qr_1 (mp_ptr, mp_limb_t *, mp_srcptr, mp_size_t, mp_limb_t);
15107d829589Smrg 
15115210846fSmrg #define mpn_div_qr_2 __MPN(div_qr_2)
15125210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_div_qr_2 (mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr);
1513003c26c9Smrg 
1514003c26c9Smrg #define mpn_gcd __MPN(gcd)
15155210846fSmrg __GMP_DECLSPEC mp_size_t mpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
1516003c26c9Smrg 
15170f3f60b5Smrg #define mpn_gcd_11 __MPN(gcd_11)
15180f3f60b5Smrg __GMP_DECLSPEC mp_limb_t mpn_gcd_11 (mp_limb_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
15190f3f60b5Smrg 
1520003c26c9Smrg #define mpn_gcd_1 __MPN(gcd_1)
15215210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1522003c26c9Smrg 
1523003c26c9Smrg #define mpn_gcdext_1 __MPN(gcdext_1)
15245210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_gcdext_1 (mp_limb_signed_t *, mp_limb_signed_t *, mp_limb_t, mp_limb_t);
1525003c26c9Smrg 
1526003c26c9Smrg #define mpn_gcdext __MPN(gcdext)
15275210846fSmrg __GMP_DECLSPEC mp_size_t mpn_gcdext (mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t);
1528003c26c9Smrg 
1529003c26c9Smrg #define mpn_get_str __MPN(get_str)
15305210846fSmrg __GMP_DECLSPEC size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
1531003c26c9Smrg 
1532003c26c9Smrg #define mpn_hamdist __MPN(hamdist)
15335210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpn_hamdist (mp_srcptr, mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1534003c26c9Smrg 
1535003c26c9Smrg #define mpn_lshift __MPN(lshift)
15365210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
1537003c26c9Smrg 
1538003c26c9Smrg #define mpn_mod_1 __MPN(mod_1)
15395210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_mod_1 (mp_srcptr, mp_size_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1540003c26c9Smrg 
1541003c26c9Smrg #define mpn_mul __MPN(mul)
15425210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1543003c26c9Smrg 
1544003c26c9Smrg #define mpn_mul_1 __MPN(mul_1)
15455210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1546003c26c9Smrg 
1547003c26c9Smrg #define mpn_mul_n __MPN(mul_n)
15485210846fSmrg __GMP_DECLSPEC void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1549003c26c9Smrg 
1550003c26c9Smrg #define mpn_sqr __MPN(sqr)
15515210846fSmrg __GMP_DECLSPEC void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
1552003c26c9Smrg 
1553003c26c9Smrg #define mpn_neg __MPN(neg)
1554003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_neg)
15555210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
1556003c26c9Smrg #endif
1557003c26c9Smrg 
1558003c26c9Smrg #define mpn_com __MPN(com)
15595210846fSmrg __GMP_DECLSPEC void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
1560003c26c9Smrg 
1561003c26c9Smrg #define mpn_perfect_square_p __MPN(perfect_square_p)
15625210846fSmrg __GMP_DECLSPEC int mpn_perfect_square_p (mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE;
1563003c26c9Smrg 
1564003c26c9Smrg #define mpn_perfect_power_p __MPN(perfect_power_p)
15655210846fSmrg __GMP_DECLSPEC int mpn_perfect_power_p (mp_srcptr, mp_size_t) __GMP_ATTRIBUTE_PURE;
1566003c26c9Smrg 
1567003c26c9Smrg #define mpn_popcount __MPN(popcount)
15685210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
1569003c26c9Smrg 
1570003c26c9Smrg #define mpn_pow_1 __MPN(pow_1)
15715210846fSmrg __GMP_DECLSPEC mp_size_t mpn_pow_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
1572003c26c9Smrg 
1573003c26c9Smrg /* undocumented now, but retained here for upward compatibility */
1574003c26c9Smrg #define mpn_preinv_mod_1 __MPN(preinv_mod_1)
15755210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_preinv_mod_1 (mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t) __GMP_ATTRIBUTE_PURE;
1576003c26c9Smrg 
1577003c26c9Smrg #define mpn_random __MPN(random)
15785210846fSmrg __GMP_DECLSPEC void mpn_random (mp_ptr, mp_size_t);
1579003c26c9Smrg 
1580003c26c9Smrg #define mpn_random2 __MPN(random2)
15815210846fSmrg __GMP_DECLSPEC void mpn_random2 (mp_ptr, mp_size_t);
1582003c26c9Smrg 
1583003c26c9Smrg #define mpn_rshift __MPN(rshift)
15845210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
1585003c26c9Smrg 
1586003c26c9Smrg #define mpn_scan0 __MPN(scan0)
15875210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1588003c26c9Smrg 
1589003c26c9Smrg #define mpn_scan1 __MPN(scan1)
15905210846fSmrg __GMP_DECLSPEC mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t) __GMP_ATTRIBUTE_PURE;
1591003c26c9Smrg 
1592003c26c9Smrg #define mpn_set_str __MPN(set_str)
15935210846fSmrg __GMP_DECLSPEC mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
1594003c26c9Smrg 
15957d829589Smrg #define mpn_sizeinbase __MPN(sizeinbase)
15967d829589Smrg __GMP_DECLSPEC size_t mpn_sizeinbase (mp_srcptr, mp_size_t, int);
15977d829589Smrg 
1598003c26c9Smrg #define mpn_sqrtrem __MPN(sqrtrem)
15995210846fSmrg __GMP_DECLSPEC mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
1600003c26c9Smrg 
1601003c26c9Smrg #define mpn_sub __MPN(sub)
1602003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub)
16035210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1604003c26c9Smrg #endif
1605003c26c9Smrg 
1606003c26c9Smrg #define mpn_sub_1 __MPN(sub_1)
1607003c26c9Smrg #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub_1)
16085210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t) __GMP_NOTHROW;
1609003c26c9Smrg #endif
1610003c26c9Smrg 
1611003c26c9Smrg #define mpn_sub_n __MPN(sub_n)
16125210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1613003c26c9Smrg 
1614003c26c9Smrg #define mpn_submul_1 __MPN(submul_1)
16155210846fSmrg __GMP_DECLSPEC mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
1616003c26c9Smrg 
1617003c26c9Smrg #define mpn_tdiv_qr __MPN(tdiv_qr)
16185210846fSmrg __GMP_DECLSPEC void mpn_tdiv_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
1619003c26c9Smrg 
1620003c26c9Smrg #define mpn_and_n __MPN(and_n)
16215210846fSmrg __GMP_DECLSPEC void mpn_and_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1622003c26c9Smrg #define mpn_andn_n __MPN(andn_n)
16235210846fSmrg __GMP_DECLSPEC void mpn_andn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1624003c26c9Smrg #define mpn_nand_n __MPN(nand_n)
16255210846fSmrg __GMP_DECLSPEC void mpn_nand_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1626003c26c9Smrg #define mpn_ior_n __MPN(ior_n)
16275210846fSmrg __GMP_DECLSPEC void mpn_ior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1628003c26c9Smrg #define mpn_iorn_n __MPN(iorn_n)
16295210846fSmrg __GMP_DECLSPEC void mpn_iorn_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1630003c26c9Smrg #define mpn_nior_n __MPN(nior_n)
16315210846fSmrg __GMP_DECLSPEC void mpn_nior_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1632003c26c9Smrg #define mpn_xor_n __MPN(xor_n)
16335210846fSmrg __GMP_DECLSPEC void mpn_xor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1634003c26c9Smrg #define mpn_xnor_n __MPN(xnor_n)
16355210846fSmrg __GMP_DECLSPEC void mpn_xnor_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
1636003c26c9Smrg 
1637003c26c9Smrg #define mpn_copyi __MPN(copyi)
16385210846fSmrg __GMP_DECLSPEC void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
1639003c26c9Smrg #define mpn_copyd __MPN(copyd)
16405210846fSmrg __GMP_DECLSPEC void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
1641003c26c9Smrg #define mpn_zero __MPN(zero)
16425210846fSmrg __GMP_DECLSPEC void mpn_zero (mp_ptr, mp_size_t);
1643003c26c9Smrg 
16447d829589Smrg #define mpn_cnd_add_n __MPN(cnd_add_n)
16457d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_cnd_add_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
16467d829589Smrg #define mpn_cnd_sub_n __MPN(cnd_sub_n)
16477d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_cnd_sub_n (mp_limb_t, mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
16487d829589Smrg 
16497d829589Smrg #define mpn_sec_add_1 __MPN(sec_add_1)
16507d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_sec_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
16517d829589Smrg #define mpn_sec_add_1_itch __MPN(sec_add_1_itch)
16527d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_add_1_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
16537d829589Smrg 
16547d829589Smrg #define mpn_sec_sub_1 __MPN(sec_sub_1)
16557d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_sec_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr);
16567d829589Smrg #define mpn_sec_sub_1_itch __MPN(sec_sub_1_itch)
16577d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_sub_1_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
16587d829589Smrg 
16597d829589Smrg #define mpn_cnd_swap  __MPN(cnd_swap)
16607d829589Smrg __GMP_DECLSPEC void mpn_cnd_swap (mp_limb_t, volatile mp_limb_t *, volatile mp_limb_t *, mp_size_t);
16617d829589Smrg 
16627d829589Smrg #define mpn_sec_mul __MPN(sec_mul)
16637d829589Smrg __GMP_DECLSPEC void mpn_sec_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
16647d829589Smrg #define mpn_sec_mul_itch __MPN(sec_mul_itch)
16657d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_mul_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
16667d829589Smrg 
16677d829589Smrg #define mpn_sec_sqr __MPN(sec_sqr)
16687d829589Smrg __GMP_DECLSPEC void mpn_sec_sqr (mp_ptr, mp_srcptr, mp_size_t, mp_ptr);
16697d829589Smrg #define mpn_sec_sqr_itch __MPN(sec_sqr_itch)
16707d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_sqr_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
16717d829589Smrg 
16727d829589Smrg #define mpn_sec_powm __MPN(sec_powm)
16737d829589Smrg __GMP_DECLSPEC void mpn_sec_powm (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_bitcnt_t, mp_srcptr, mp_size_t, mp_ptr);
16747d829589Smrg #define mpn_sec_powm_itch __MPN(sec_powm_itch)
16757d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_powm_itch (mp_size_t, mp_bitcnt_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
16767d829589Smrg 
16777d829589Smrg #define mpn_sec_tabselect __MPN(sec_tabselect)
16787d829589Smrg __GMP_DECLSPEC void mpn_sec_tabselect (volatile mp_limb_t *, volatile const mp_limb_t *, mp_size_t, mp_size_t, mp_size_t);
16797d829589Smrg 
16807d829589Smrg #define mpn_sec_div_qr __MPN(sec_div_qr)
16817d829589Smrg __GMP_DECLSPEC mp_limb_t mpn_sec_div_qr (mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
16827d829589Smrg #define mpn_sec_div_qr_itch __MPN(sec_div_qr_itch)
16837d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_div_qr_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
16847d829589Smrg #define mpn_sec_div_r __MPN(sec_div_r)
16857d829589Smrg __GMP_DECLSPEC void mpn_sec_div_r (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
16867d829589Smrg #define mpn_sec_div_r_itch __MPN(sec_div_r_itch)
16877d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_div_r_itch (mp_size_t, mp_size_t) __GMP_ATTRIBUTE_PURE;
16887d829589Smrg 
16897d829589Smrg #define mpn_sec_invert __MPN(sec_invert)
16907d829589Smrg __GMP_DECLSPEC int mpn_sec_invert (mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_bitcnt_t, mp_ptr);
16917d829589Smrg #define mpn_sec_invert_itch __MPN(sec_invert_itch)
16927d829589Smrg __GMP_DECLSPEC mp_size_t mpn_sec_invert_itch (mp_size_t) __GMP_ATTRIBUTE_PURE;
16937d829589Smrg 
1694*d0080044Smrg #define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv)
1695*d0080044Smrg __GMP_DECLSPEC mp_limb_t mpn_udiv_w_sdiv (mp_limb_t *, mp_limb_t, mp_limb_t, mp_limb_t);
1696*d0080044Smrg 
1697c176b794Smrg 
1698003c26c9Smrg /**************** mpz inlines ****************/
1699003c26c9Smrg 
1700003c26c9Smrg /* The following are provided as inlines where possible, but always exist as
1701003c26c9Smrg    library functions too, for binary compatibility.
1702003c26c9Smrg 
1703003c26c9Smrg    Within gmp itself this inlining generally isn't relied on, since it
1704003c26c9Smrg    doesn't get done for all compilers, whereas if something is worth
1705003c26c9Smrg    inlining then it's worth arranging always.
1706003c26c9Smrg 
1707003c26c9Smrg    There are two styles of inlining here.  When the same bit of code is
1708003c26c9Smrg    wanted for the inline as for the library version, then __GMP_FORCE_foo
1709003c26c9Smrg    arranges for that code to be emitted and the __GMP_EXTERN_INLINE
1710003c26c9Smrg    directive suppressed, eg. mpz_fits_uint_p.  When a different bit of code
1711003c26c9Smrg    is wanted for the inline than for the library version, then
1712003c26c9Smrg    __GMP_FORCE_foo arranges the inline to be suppressed, eg. mpz_abs.  */
1713003c26c9Smrg 
1714003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_abs)
1715003c26c9Smrg __GMP_EXTERN_INLINE void
mpz_abs(mpz_ptr __gmp_w,mpz_srcptr __gmp_u)1716003c26c9Smrg mpz_abs (mpz_ptr __gmp_w, mpz_srcptr __gmp_u)
1717003c26c9Smrg {
1718003c26c9Smrg   if (__gmp_w != __gmp_u)
1719003c26c9Smrg     mpz_set (__gmp_w, __gmp_u);
1720003c26c9Smrg   __gmp_w->_mp_size = __GMP_ABS (__gmp_w->_mp_size);
1721003c26c9Smrg }
1722003c26c9Smrg #endif
1723003c26c9Smrg 
1724003c26c9Smrg #if GMP_NAIL_BITS == 0
1725003c26c9Smrg #define __GMPZ_FITS_UTYPE_P(z,maxval)					\
1726003c26c9Smrg   mp_size_t  __gmp_n = z->_mp_size;					\
1727003c26c9Smrg   mp_ptr  __gmp_p = z->_mp_d;						\
1728003c26c9Smrg   return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval));
1729003c26c9Smrg #else
1730003c26c9Smrg #define __GMPZ_FITS_UTYPE_P(z,maxval)					\
1731003c26c9Smrg   mp_size_t  __gmp_n = z->_mp_size;					\
1732003c26c9Smrg   mp_ptr  __gmp_p = z->_mp_d;						\
1733003c26c9Smrg   return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval)	\
1734003c26c9Smrg 	  || (__gmp_n == 2 && __gmp_p[1] <= ((mp_limb_t) maxval >> GMP_NUMB_BITS)));
1735003c26c9Smrg #endif
1736003c26c9Smrg 
1737003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_uint_p)
1738003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_fits_uint_p)
1739003c26c9Smrg __GMP_EXTERN_INLINE
1740003c26c9Smrg #endif
1741003c26c9Smrg int
mpz_fits_uint_p(mpz_srcptr __gmp_z)1742003c26c9Smrg mpz_fits_uint_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1743003c26c9Smrg {
17447d829589Smrg   __GMPZ_FITS_UTYPE_P (__gmp_z, UINT_MAX);
1745003c26c9Smrg }
1746003c26c9Smrg #endif
1747003c26c9Smrg 
1748003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ulong_p)
1749003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_fits_ulong_p)
1750003c26c9Smrg __GMP_EXTERN_INLINE
1751003c26c9Smrg #endif
1752003c26c9Smrg int
mpz_fits_ulong_p(mpz_srcptr __gmp_z)1753003c26c9Smrg mpz_fits_ulong_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1754003c26c9Smrg {
17557d829589Smrg   __GMPZ_FITS_UTYPE_P (__gmp_z, ULONG_MAX);
1756003c26c9Smrg }
1757003c26c9Smrg #endif
1758003c26c9Smrg 
1759003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ushort_p)
1760003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_fits_ushort_p)
1761003c26c9Smrg __GMP_EXTERN_INLINE
1762003c26c9Smrg #endif
1763003c26c9Smrg int
mpz_fits_ushort_p(mpz_srcptr __gmp_z)1764003c26c9Smrg mpz_fits_ushort_p (mpz_srcptr __gmp_z) __GMP_NOTHROW
1765003c26c9Smrg {
17667d829589Smrg   __GMPZ_FITS_UTYPE_P (__gmp_z, USHRT_MAX);
1767003c26c9Smrg }
1768003c26c9Smrg #endif
1769003c26c9Smrg 
1770003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_get_ui)
1771003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_get_ui)
1772003c26c9Smrg __GMP_EXTERN_INLINE
1773003c26c9Smrg #endif
1774003c26c9Smrg unsigned long
mpz_get_ui(mpz_srcptr __gmp_z)1775003c26c9Smrg mpz_get_ui (mpz_srcptr __gmp_z) __GMP_NOTHROW
1776003c26c9Smrg {
1777003c26c9Smrg   mp_ptr __gmp_p = __gmp_z->_mp_d;
1778003c26c9Smrg   mp_size_t __gmp_n = __gmp_z->_mp_size;
1779003c26c9Smrg   mp_limb_t __gmp_l = __gmp_p[0];
1780003c26c9Smrg   /* This is a "#if" rather than a plain "if" so as to avoid gcc warnings
1781003c26c9Smrg      about "<< GMP_NUMB_BITS" exceeding the type size, and to avoid Borland
1782003c26c9Smrg      C++ 6.0 warnings about condition always true for something like
17837d829589Smrg      "ULONG_MAX < GMP_NUMB_MASK".  */
1784003c26c9Smrg #if GMP_NAIL_BITS == 0 || defined (_LONG_LONG_LIMB)
1785003c26c9Smrg   /* limb==long and no nails, or limb==longlong, one limb is enough */
1786003c26c9Smrg   return (__gmp_n != 0 ? __gmp_l : 0);
1787003c26c9Smrg #else
1788003c26c9Smrg   /* limb==long and nails, need two limbs when available */
1789003c26c9Smrg   __gmp_n = __GMP_ABS (__gmp_n);
1790003c26c9Smrg   if (__gmp_n <= 1)
1791003c26c9Smrg     return (__gmp_n != 0 ? __gmp_l : 0);
1792003c26c9Smrg   else
1793003c26c9Smrg     return __gmp_l + (__gmp_p[1] << GMP_NUMB_BITS);
1794003c26c9Smrg #endif
1795003c26c9Smrg }
1796003c26c9Smrg #endif
1797003c26c9Smrg 
1798003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_getlimbn)
1799003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_getlimbn)
1800003c26c9Smrg __GMP_EXTERN_INLINE
1801003c26c9Smrg #endif
1802003c26c9Smrg mp_limb_t
mpz_getlimbn(mpz_srcptr __gmp_z,mp_size_t __gmp_n)1803003c26c9Smrg mpz_getlimbn (mpz_srcptr __gmp_z, mp_size_t __gmp_n) __GMP_NOTHROW
1804003c26c9Smrg {
1805003c26c9Smrg   mp_limb_t  __gmp_result = 0;
1806003c26c9Smrg   if (__GMP_LIKELY (__gmp_n >= 0 && __gmp_n < __GMP_ABS (__gmp_z->_mp_size)))
1807003c26c9Smrg     __gmp_result = __gmp_z->_mp_d[__gmp_n];
1808003c26c9Smrg   return __gmp_result;
1809003c26c9Smrg }
1810003c26c9Smrg #endif
1811003c26c9Smrg 
1812003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_neg)
1813003c26c9Smrg __GMP_EXTERN_INLINE void
mpz_neg(mpz_ptr __gmp_w,mpz_srcptr __gmp_u)1814003c26c9Smrg mpz_neg (mpz_ptr __gmp_w, mpz_srcptr __gmp_u)
1815003c26c9Smrg {
1816003c26c9Smrg   if (__gmp_w != __gmp_u)
1817003c26c9Smrg     mpz_set (__gmp_w, __gmp_u);
1818003c26c9Smrg   __gmp_w->_mp_size = - __gmp_w->_mp_size;
1819003c26c9Smrg }
1820003c26c9Smrg #endif
1821003c26c9Smrg 
1822003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_perfect_square_p)
1823003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_perfect_square_p)
1824003c26c9Smrg __GMP_EXTERN_INLINE
1825003c26c9Smrg #endif
1826003c26c9Smrg int
mpz_perfect_square_p(mpz_srcptr __gmp_a)1827003c26c9Smrg mpz_perfect_square_p (mpz_srcptr __gmp_a)
1828003c26c9Smrg {
1829003c26c9Smrg   mp_size_t __gmp_asize;
1830003c26c9Smrg   int       __gmp_result;
1831003c26c9Smrg 
1832003c26c9Smrg   __gmp_asize = __gmp_a->_mp_size;
1833003c26c9Smrg   __gmp_result = (__gmp_asize >= 0);  /* zero is a square, negatives are not */
1834003c26c9Smrg   if (__GMP_LIKELY (__gmp_asize > 0))
1835003c26c9Smrg     __gmp_result = mpn_perfect_square_p (__gmp_a->_mp_d, __gmp_asize);
1836003c26c9Smrg   return __gmp_result;
1837003c26c9Smrg }
1838003c26c9Smrg #endif
1839003c26c9Smrg 
1840003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_popcount)
1841003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_popcount)
1842003c26c9Smrg __GMP_EXTERN_INLINE
1843003c26c9Smrg #endif
1844003c26c9Smrg mp_bitcnt_t
mpz_popcount(mpz_srcptr __gmp_u)1845003c26c9Smrg mpz_popcount (mpz_srcptr __gmp_u) __GMP_NOTHROW
1846003c26c9Smrg {
1847003c26c9Smrg   mp_size_t      __gmp_usize;
1848003c26c9Smrg   mp_bitcnt_t    __gmp_result;
1849003c26c9Smrg 
1850003c26c9Smrg   __gmp_usize = __gmp_u->_mp_size;
18510f3f60b5Smrg   __gmp_result = (__gmp_usize < 0 ? ~ __GMP_CAST (mp_bitcnt_t, 0) : __GMP_CAST (mp_bitcnt_t, 0));
1852003c26c9Smrg   if (__GMP_LIKELY (__gmp_usize > 0))
1853003c26c9Smrg     __gmp_result =  mpn_popcount (__gmp_u->_mp_d, __gmp_usize);
1854003c26c9Smrg   return __gmp_result;
1855003c26c9Smrg }
1856003c26c9Smrg #endif
1857003c26c9Smrg 
1858003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_set_q)
1859003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_set_q)
1860003c26c9Smrg __GMP_EXTERN_INLINE
1861003c26c9Smrg #endif
1862003c26c9Smrg void
mpz_set_q(mpz_ptr __gmp_w,mpq_srcptr __gmp_u)1863003c26c9Smrg mpz_set_q (mpz_ptr __gmp_w, mpq_srcptr __gmp_u)
1864003c26c9Smrg {
1865003c26c9Smrg   mpz_tdiv_q (__gmp_w, mpq_numref (__gmp_u), mpq_denref (__gmp_u));
1866003c26c9Smrg }
1867003c26c9Smrg #endif
1868003c26c9Smrg 
1869003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_size)
1870003c26c9Smrg #if ! defined (__GMP_FORCE_mpz_size)
1871003c26c9Smrg __GMP_EXTERN_INLINE
1872003c26c9Smrg #endif
1873003c26c9Smrg size_t
mpz_size(mpz_srcptr __gmp_z)1874003c26c9Smrg mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW
1875003c26c9Smrg {
1876003c26c9Smrg   return __GMP_ABS (__gmp_z->_mp_size);
1877003c26c9Smrg }
1878003c26c9Smrg #endif
1879003c26c9Smrg 
1880003c26c9Smrg 
1881003c26c9Smrg /**************** mpq inlines ****************/
1882003c26c9Smrg 
1883003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_abs)
1884003c26c9Smrg __GMP_EXTERN_INLINE void
mpq_abs(mpq_ptr __gmp_w,mpq_srcptr __gmp_u)1885003c26c9Smrg mpq_abs (mpq_ptr __gmp_w, mpq_srcptr __gmp_u)
1886003c26c9Smrg {
1887003c26c9Smrg   if (__gmp_w != __gmp_u)
1888003c26c9Smrg     mpq_set (__gmp_w, __gmp_u);
1889003c26c9Smrg   __gmp_w->_mp_num._mp_size = __GMP_ABS (__gmp_w->_mp_num._mp_size);
1890003c26c9Smrg }
1891003c26c9Smrg #endif
1892003c26c9Smrg 
1893003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_neg)
1894003c26c9Smrg __GMP_EXTERN_INLINE void
mpq_neg(mpq_ptr __gmp_w,mpq_srcptr __gmp_u)1895003c26c9Smrg mpq_neg (mpq_ptr __gmp_w, mpq_srcptr __gmp_u)
1896003c26c9Smrg {
1897003c26c9Smrg   if (__gmp_w != __gmp_u)
1898003c26c9Smrg     mpq_set (__gmp_w, __gmp_u);
1899003c26c9Smrg   __gmp_w->_mp_num._mp_size = - __gmp_w->_mp_num._mp_size;
1900003c26c9Smrg }
1901003c26c9Smrg #endif
1902003c26c9Smrg 
1903003c26c9Smrg 
1904003c26c9Smrg /**************** mpn inlines ****************/
1905003c26c9Smrg 
1906003c26c9Smrg /* The comments with __GMPN_ADD_1 below apply here too.
1907003c26c9Smrg 
1908003c26c9Smrg    The test for FUNCTION returning 0 should predict well.  If it's assumed
1909003c26c9Smrg    {yp,ysize} will usually have a random number of bits then the high limb
1910003c26c9Smrg    won't be full and a carry out will occur a good deal less than 50% of the
1911003c26c9Smrg    time.
1912003c26c9Smrg 
1913003c26c9Smrg    ysize==0 isn't a documented feature, but is used internally in a few
1914003c26c9Smrg    places.
1915003c26c9Smrg 
1916003c26c9Smrg    Producing cout last stops it using up a register during the main part of
1917003c26c9Smrg    the calculation, though gcc (as of 3.0) on an "if (mpn_add (...))"
1918003c26c9Smrg    doesn't seem able to move the true and false legs of the conditional up
1919003c26c9Smrg    to the two places cout is generated.  */
1920003c26c9Smrg 
1921003c26c9Smrg #define __GMPN_AORS(cout, wp, xp, xsize, yp, ysize, FUNCTION, TEST)     \
1922003c26c9Smrg   do {                                                                  \
1923003c26c9Smrg     mp_size_t  __gmp_i;                                                 \
1924003c26c9Smrg     mp_limb_t  __gmp_x;                                                 \
1925003c26c9Smrg                                                                         \
1926003c26c9Smrg     /* ASSERT ((ysize) >= 0); */                                        \
1927003c26c9Smrg     /* ASSERT ((xsize) >= (ysize)); */                                  \
1928003c26c9Smrg     /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, xp, xsize)); */      \
1929003c26c9Smrg     /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, yp, ysize)); */      \
1930003c26c9Smrg                                                                         \
1931003c26c9Smrg     __gmp_i = (ysize);                                                  \
1932003c26c9Smrg     if (__gmp_i != 0)                                                   \
1933003c26c9Smrg       {                                                                 \
1934003c26c9Smrg         if (FUNCTION (wp, xp, yp, __gmp_i))                             \
1935003c26c9Smrg           {                                                             \
1936003c26c9Smrg             do                                                          \
1937003c26c9Smrg               {                                                         \
1938003c26c9Smrg                 if (__gmp_i >= (xsize))                                 \
1939003c26c9Smrg                   {                                                     \
1940003c26c9Smrg                     (cout) = 1;                                         \
1941003c26c9Smrg                     goto __gmp_done;                                    \
1942003c26c9Smrg                   }                                                     \
1943003c26c9Smrg                 __gmp_x = (xp)[__gmp_i];                                \
1944003c26c9Smrg               }                                                         \
1945003c26c9Smrg             while (TEST);                                               \
1946003c26c9Smrg           }                                                             \
1947003c26c9Smrg       }                                                                 \
1948003c26c9Smrg     if ((wp) != (xp))                                                   \
1949003c26c9Smrg       __GMPN_COPY_REST (wp, xp, xsize, __gmp_i);                        \
1950003c26c9Smrg     (cout) = 0;                                                         \
1951003c26c9Smrg   __gmp_done:                                                           \
1952003c26c9Smrg     ;                                                                   \
1953003c26c9Smrg   } while (0)
1954003c26c9Smrg 
1955003c26c9Smrg #define __GMPN_ADD(cout, wp, xp, xsize, yp, ysize)              \
1956003c26c9Smrg   __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_add_n,       \
1957003c26c9Smrg                (((wp)[__gmp_i++] = (__gmp_x + 1) & GMP_NUMB_MASK) == 0))
1958003c26c9Smrg #define __GMPN_SUB(cout, wp, xp, xsize, yp, ysize)              \
1959003c26c9Smrg   __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_sub_n,       \
1960003c26c9Smrg                (((wp)[__gmp_i++] = (__gmp_x - 1) & GMP_NUMB_MASK), __gmp_x == 0))
1961003c26c9Smrg 
1962003c26c9Smrg 
1963003c26c9Smrg /* The use of __gmp_i indexing is designed to ensure a compile time src==dst
1964003c26c9Smrg    remains nice and clear to the compiler, so that __GMPN_COPY_REST can
1965003c26c9Smrg    disappear, and the load/add/store gets a chance to become a
1966003c26c9Smrg    read-modify-write on CISC CPUs.
1967003c26c9Smrg 
1968003c26c9Smrg    Alternatives:
1969003c26c9Smrg 
1970003c26c9Smrg    Using a pair of pointers instead of indexing would be possible, but gcc
1971003c26c9Smrg    isn't able to recognise compile-time src==dst in that case, even when the
1972003c26c9Smrg    pointers are incremented more or less together.  Other compilers would
1973003c26c9Smrg    very likely have similar difficulty.
1974003c26c9Smrg 
1975003c26c9Smrg    gcc could use "if (__builtin_constant_p(src==dst) && src==dst)" or
1976003c26c9Smrg    similar to detect a compile-time src==dst.  This works nicely on gcc
1977003c26c9Smrg    2.95.x, it's not good on gcc 3.0 where __builtin_constant_p(p==p) seems
1978003c26c9Smrg    to be always false, for a pointer p.  But the current code form seems
1979003c26c9Smrg    good enough for src==dst anyway.
1980003c26c9Smrg 
1981003c26c9Smrg    gcc on x86 as usual doesn't give particularly good flags handling for the
1982003c26c9Smrg    carry/borrow detection.  It's tempting to want some multi instruction asm
1983003c26c9Smrg    blocks to help it, and this was tried, but in truth there's only a few
1984003c26c9Smrg    instructions to save and any gain is all too easily lost by register
1985003c26c9Smrg    juggling setting up for the asm.  */
1986003c26c9Smrg 
1987003c26c9Smrg #if GMP_NAIL_BITS == 0
1988003c26c9Smrg #define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB)		\
1989003c26c9Smrg   do {								\
1990003c26c9Smrg     mp_size_t  __gmp_i;						\
1991003c26c9Smrg     mp_limb_t  __gmp_x, __gmp_r;                                \
1992003c26c9Smrg 								\
1993003c26c9Smrg     /* ASSERT ((n) >= 1); */					\
1994003c26c9Smrg     /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */	\
1995003c26c9Smrg 								\
1996003c26c9Smrg     __gmp_x = (src)[0];						\
1997003c26c9Smrg     __gmp_r = __gmp_x OP (v);                                   \
1998003c26c9Smrg     (dst)[0] = __gmp_r;						\
1999003c26c9Smrg     if (CB (__gmp_r, __gmp_x, (v)))                             \
2000003c26c9Smrg       {								\
2001003c26c9Smrg 	(cout) = 1;						\
2002003c26c9Smrg 	for (__gmp_i = 1; __gmp_i < (n);)                       \
2003003c26c9Smrg 	  {							\
2004003c26c9Smrg 	    __gmp_x = (src)[__gmp_i];                           \
2005003c26c9Smrg 	    __gmp_r = __gmp_x OP 1;                             \
2006003c26c9Smrg 	    (dst)[__gmp_i] = __gmp_r;                           \
2007003c26c9Smrg 	    ++__gmp_i;						\
2008003c26c9Smrg 	    if (!CB (__gmp_r, __gmp_x, 1))                      \
2009003c26c9Smrg 	      {							\
2010003c26c9Smrg 		if ((src) != (dst))				\
2011003c26c9Smrg 		  __GMPN_COPY_REST (dst, src, n, __gmp_i);      \
2012003c26c9Smrg 		(cout) = 0;					\
2013003c26c9Smrg 		break;						\
2014003c26c9Smrg 	      }							\
2015003c26c9Smrg 	  }							\
2016003c26c9Smrg       }								\
2017003c26c9Smrg     else							\
2018003c26c9Smrg       {								\
2019003c26c9Smrg 	if ((src) != (dst))					\
2020003c26c9Smrg 	  __GMPN_COPY_REST (dst, src, n, 1);			\
2021003c26c9Smrg 	(cout) = 0;						\
2022003c26c9Smrg       }								\
2023003c26c9Smrg   } while (0)
2024003c26c9Smrg #endif
2025003c26c9Smrg 
2026003c26c9Smrg #if GMP_NAIL_BITS >= 1
2027003c26c9Smrg #define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB)		\
2028003c26c9Smrg   do {								\
2029003c26c9Smrg     mp_size_t  __gmp_i;						\
2030003c26c9Smrg     mp_limb_t  __gmp_x, __gmp_r;				\
2031003c26c9Smrg 								\
2032003c26c9Smrg     /* ASSERT ((n) >= 1); */					\
2033003c26c9Smrg     /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */	\
2034003c26c9Smrg 								\
2035003c26c9Smrg     __gmp_x = (src)[0];						\
2036003c26c9Smrg     __gmp_r = __gmp_x OP (v);					\
2037003c26c9Smrg     (dst)[0] = __gmp_r & GMP_NUMB_MASK;				\
2038003c26c9Smrg     if (__gmp_r >> GMP_NUMB_BITS != 0)				\
2039003c26c9Smrg       {								\
2040003c26c9Smrg 	(cout) = 1;						\
2041003c26c9Smrg 	for (__gmp_i = 1; __gmp_i < (n);)			\
2042003c26c9Smrg 	  {							\
2043003c26c9Smrg 	    __gmp_x = (src)[__gmp_i];				\
2044003c26c9Smrg 	    __gmp_r = __gmp_x OP 1;				\
2045003c26c9Smrg 	    (dst)[__gmp_i] = __gmp_r & GMP_NUMB_MASK;		\
2046003c26c9Smrg 	    ++__gmp_i;						\
2047003c26c9Smrg 	    if (__gmp_r >> GMP_NUMB_BITS == 0)			\
2048003c26c9Smrg 	      {							\
2049003c26c9Smrg 		if ((src) != (dst))				\
2050003c26c9Smrg 		  __GMPN_COPY_REST (dst, src, n, __gmp_i);	\
2051003c26c9Smrg 		(cout) = 0;					\
2052003c26c9Smrg 		break;						\
2053003c26c9Smrg 	      }							\
2054003c26c9Smrg 	  }							\
2055003c26c9Smrg       }								\
2056003c26c9Smrg     else							\
2057003c26c9Smrg       {								\
2058003c26c9Smrg 	if ((src) != (dst))					\
2059003c26c9Smrg 	  __GMPN_COPY_REST (dst, src, n, 1);			\
2060003c26c9Smrg 	(cout) = 0;						\
2061003c26c9Smrg       }								\
2062003c26c9Smrg   } while (0)
2063003c26c9Smrg #endif
2064003c26c9Smrg 
2065003c26c9Smrg #define __GMPN_ADDCB(r,x,y) ((r) < (y))
2066003c26c9Smrg #define __GMPN_SUBCB(r,x,y) ((x) < (y))
2067003c26c9Smrg 
2068003c26c9Smrg #define __GMPN_ADD_1(cout, dst, src, n, v)	     \
2069003c26c9Smrg   __GMPN_AORS_1(cout, dst, src, n, v, +, __GMPN_ADDCB)
2070003c26c9Smrg #define __GMPN_SUB_1(cout, dst, src, n, v)	     \
2071003c26c9Smrg   __GMPN_AORS_1(cout, dst, src, n, v, -, __GMPN_SUBCB)
2072003c26c9Smrg 
2073003c26c9Smrg 
2074003c26c9Smrg /* Compare {xp,size} and {yp,size}, setting "result" to positive, zero or
2075003c26c9Smrg    negative.  size==0 is allowed.  On random data usually only one limb will
2076003c26c9Smrg    need to be examined to get a result, so it's worth having it inline.  */
2077003c26c9Smrg #define __GMPN_CMP(result, xp, yp, size)                                \
2078003c26c9Smrg   do {                                                                  \
2079003c26c9Smrg     mp_size_t  __gmp_i;                                                 \
2080003c26c9Smrg     mp_limb_t  __gmp_x, __gmp_y;                                        \
2081003c26c9Smrg                                                                         \
2082003c26c9Smrg     /* ASSERT ((size) >= 0); */                                         \
2083003c26c9Smrg                                                                         \
2084003c26c9Smrg     (result) = 0;                                                       \
2085003c26c9Smrg     __gmp_i = (size);                                                   \
2086003c26c9Smrg     while (--__gmp_i >= 0)                                              \
2087003c26c9Smrg       {                                                                 \
2088003c26c9Smrg         __gmp_x = (xp)[__gmp_i];                                        \
2089003c26c9Smrg         __gmp_y = (yp)[__gmp_i];                                        \
2090003c26c9Smrg         if (__gmp_x != __gmp_y)                                         \
2091003c26c9Smrg           {                                                             \
2092003c26c9Smrg             /* Cannot use __gmp_x - __gmp_y, may overflow an "int" */   \
2093003c26c9Smrg             (result) = (__gmp_x > __gmp_y ? 1 : -1);                    \
2094003c26c9Smrg             break;                                                      \
2095003c26c9Smrg           }                                                             \
2096003c26c9Smrg       }                                                                 \
2097003c26c9Smrg   } while (0)
2098003c26c9Smrg 
2099003c26c9Smrg 
2100003c26c9Smrg #if defined (__GMPN_COPY) && ! defined (__GMPN_COPY_REST)
2101003c26c9Smrg #define __GMPN_COPY_REST(dst, src, size, start)                 \
2102003c26c9Smrg   do {                                                          \
2103003c26c9Smrg     /* ASSERT ((start) >= 0); */                                \
2104003c26c9Smrg     /* ASSERT ((start) <= (size)); */                           \
2105003c26c9Smrg     __GMPN_COPY ((dst)+(start), (src)+(start), (size)-(start)); \
2106003c26c9Smrg   } while (0)
2107003c26c9Smrg #endif
2108003c26c9Smrg 
2109003c26c9Smrg /* Copy {src,size} to {dst,size}, starting at "start".  This is designed to
2110003c26c9Smrg    keep the indexing dst[j] and src[j] nice and simple for __GMPN_ADD_1,
2111003c26c9Smrg    __GMPN_ADD, etc.  */
2112003c26c9Smrg #if ! defined (__GMPN_COPY_REST)
2113003c26c9Smrg #define __GMPN_COPY_REST(dst, src, size, start)                 \
2114003c26c9Smrg   do {                                                          \
2115003c26c9Smrg     mp_size_t __gmp_j;                                          \
2116003c26c9Smrg     /* ASSERT ((size) >= 0); */                                 \
2117003c26c9Smrg     /* ASSERT ((start) >= 0); */                                \
2118003c26c9Smrg     /* ASSERT ((start) <= (size)); */                           \
2119003c26c9Smrg     /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size)); */     \
2120003c26c9Smrg     __GMP_CRAY_Pragma ("_CRI ivdep");                           \
2121003c26c9Smrg     for (__gmp_j = (start); __gmp_j < (size); __gmp_j++)        \
2122003c26c9Smrg       (dst)[__gmp_j] = (src)[__gmp_j];                          \
2123003c26c9Smrg   } while (0)
2124003c26c9Smrg #endif
2125003c26c9Smrg 
2126003c26c9Smrg /* Enhancement: Use some of the smarter code from gmp-impl.h.  Maybe use
2127003c26c9Smrg    mpn_copyi if there's a native version, and if we don't mind demanding
2128003c26c9Smrg    binary compatibility for it (on targets which use it).  */
2129003c26c9Smrg 
2130003c26c9Smrg #if ! defined (__GMPN_COPY)
2131003c26c9Smrg #define __GMPN_COPY(dst, src, size)   __GMPN_COPY_REST (dst, src, size, 0)
2132003c26c9Smrg #endif
2133003c26c9Smrg 
2134003c26c9Smrg 
2135003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add)
2136003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_add)
2137003c26c9Smrg __GMP_EXTERN_INLINE
2138003c26c9Smrg #endif
2139003c26c9Smrg mp_limb_t
mpn_add(mp_ptr __gmp_wp,mp_srcptr __gmp_xp,mp_size_t __gmp_xsize,mp_srcptr __gmp_yp,mp_size_t __gmp_ysize)2140003c26c9Smrg mpn_add (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize)
2141003c26c9Smrg {
2142003c26c9Smrg   mp_limb_t  __gmp_c;
2143003c26c9Smrg   __GMPN_ADD (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize);
2144003c26c9Smrg   return __gmp_c;
2145003c26c9Smrg }
2146003c26c9Smrg #endif
2147003c26c9Smrg 
2148003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add_1)
2149003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_add_1)
2150003c26c9Smrg __GMP_EXTERN_INLINE
2151003c26c9Smrg #endif
2152003c26c9Smrg mp_limb_t
mpn_add_1(mp_ptr __gmp_dst,mp_srcptr __gmp_src,mp_size_t __gmp_size,mp_limb_t __gmp_n)2153003c26c9Smrg mpn_add_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW
2154003c26c9Smrg {
2155003c26c9Smrg   mp_limb_t  __gmp_c;
2156003c26c9Smrg   __GMPN_ADD_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n);
2157003c26c9Smrg   return __gmp_c;
2158003c26c9Smrg }
2159003c26c9Smrg #endif
2160003c26c9Smrg 
2161003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_cmp)
2162003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_cmp)
2163003c26c9Smrg __GMP_EXTERN_INLINE
2164003c26c9Smrg #endif
2165003c26c9Smrg int
mpn_cmp(mp_srcptr __gmp_xp,mp_srcptr __gmp_yp,mp_size_t __gmp_size)2166003c26c9Smrg mpn_cmp (mp_srcptr __gmp_xp, mp_srcptr __gmp_yp, mp_size_t __gmp_size) __GMP_NOTHROW
2167003c26c9Smrg {
2168003c26c9Smrg   int __gmp_result;
2169003c26c9Smrg   __GMPN_CMP (__gmp_result, __gmp_xp, __gmp_yp, __gmp_size);
2170003c26c9Smrg   return __gmp_result;
2171003c26c9Smrg }
2172003c26c9Smrg #endif
2173003c26c9Smrg 
21747d829589Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_zero_p)
21757d829589Smrg #if ! defined (__GMP_FORCE_mpn_zero_p)
21767d829589Smrg __GMP_EXTERN_INLINE
21777d829589Smrg #endif
21787d829589Smrg int
mpn_zero_p(mp_srcptr __gmp_p,mp_size_t __gmp_n)21797d829589Smrg mpn_zero_p (mp_srcptr __gmp_p, mp_size_t __gmp_n) __GMP_NOTHROW
21807d829589Smrg {
21817d829589Smrg   /* if (__GMP_LIKELY (__gmp_n > 0)) */
21827d829589Smrg     do {
21837d829589Smrg       if (__gmp_p[--__gmp_n] != 0)
21847d829589Smrg 	return 0;
21857d829589Smrg     } while (__gmp_n != 0);
21867d829589Smrg   return 1;
21877d829589Smrg }
21887d829589Smrg #endif
21897d829589Smrg 
2190003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub)
2191003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_sub)
2192003c26c9Smrg __GMP_EXTERN_INLINE
2193003c26c9Smrg #endif
2194003c26c9Smrg mp_limb_t
mpn_sub(mp_ptr __gmp_wp,mp_srcptr __gmp_xp,mp_size_t __gmp_xsize,mp_srcptr __gmp_yp,mp_size_t __gmp_ysize)2195003c26c9Smrg mpn_sub (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize)
2196003c26c9Smrg {
2197003c26c9Smrg   mp_limb_t  __gmp_c;
2198003c26c9Smrg   __GMPN_SUB (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize);
2199003c26c9Smrg   return __gmp_c;
2200003c26c9Smrg }
2201003c26c9Smrg #endif
2202003c26c9Smrg 
2203003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub_1)
2204003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_sub_1)
2205003c26c9Smrg __GMP_EXTERN_INLINE
2206003c26c9Smrg #endif
2207003c26c9Smrg mp_limb_t
mpn_sub_1(mp_ptr __gmp_dst,mp_srcptr __gmp_src,mp_size_t __gmp_size,mp_limb_t __gmp_n)2208003c26c9Smrg mpn_sub_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW
2209003c26c9Smrg {
2210003c26c9Smrg   mp_limb_t  __gmp_c;
2211003c26c9Smrg   __GMPN_SUB_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n);
2212003c26c9Smrg   return __gmp_c;
2213003c26c9Smrg }
2214003c26c9Smrg #endif
2215003c26c9Smrg 
2216003c26c9Smrg #if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_neg)
2217003c26c9Smrg #if ! defined (__GMP_FORCE_mpn_neg)
2218003c26c9Smrg __GMP_EXTERN_INLINE
2219003c26c9Smrg #endif
2220003c26c9Smrg mp_limb_t
mpn_neg(mp_ptr __gmp_rp,mp_srcptr __gmp_up,mp_size_t __gmp_n)2221003c26c9Smrg mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n)
2222003c26c9Smrg {
22237d829589Smrg   while (*__gmp_up == 0) /* Low zero limbs are unchanged by negation. */
22247d829589Smrg     {
22257d829589Smrg       *__gmp_rp = 0;
22267d829589Smrg       if (!--__gmp_n) /* All zero */
22277d829589Smrg 	return 0;
22287d829589Smrg       ++__gmp_up; ++__gmp_rp;
22297d829589Smrg     }
22307d829589Smrg 
22317d829589Smrg   *__gmp_rp = (- *__gmp_up) & GMP_NUMB_MASK;
22327d829589Smrg 
22337d829589Smrg   if (--__gmp_n) /* Higher limbs get complemented. */
22347d829589Smrg     mpn_com (++__gmp_rp, ++__gmp_up, __gmp_n);
22357d829589Smrg 
22367d829589Smrg   return 1;
2237003c26c9Smrg }
2238003c26c9Smrg #endif
2239003c26c9Smrg 
2240003c26c9Smrg #if defined (__cplusplus)
2241003c26c9Smrg }
2242003c26c9Smrg #endif
2243003c26c9Smrg 
2244003c26c9Smrg 
2245003c26c9Smrg /* Allow faster testing for negative, zero, and positive.  */
2246003c26c9Smrg #define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0)
2247003c26c9Smrg #define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0)
2248003c26c9Smrg #define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0)
2249003c26c9Smrg 
2250003c26c9Smrg /* When using GCC, optimize certain common comparisons.  */
2251003c26c9Smrg #if defined (__GNUC__) && __GNUC__ >= 2
2252003c26c9Smrg #define mpz_cmp_ui(Z,UI) \
2253003c26c9Smrg   (__builtin_constant_p (UI) && (UI) == 0				\
2254003c26c9Smrg    ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI))
2255003c26c9Smrg #define mpz_cmp_si(Z,SI)						\
22567d829589Smrg   (__builtin_constant_p ((SI) >= 0) && (SI) >= 0			\
22577d829589Smrg    ? mpz_cmp_ui (Z, __GMP_CAST (unsigned long, SI))			\
2258003c26c9Smrg    : _mpz_cmp_si (Z,SI))
2259003c26c9Smrg #define mpq_cmp_ui(Q,NUI,DUI)					\
22607d829589Smrg   (__builtin_constant_p (NUI) && (NUI) == 0 ? mpq_sgn (Q)	\
22617d829589Smrg    : __builtin_constant_p ((NUI) == (DUI)) && (NUI) == (DUI)	\
22627d829589Smrg    ? mpz_cmp (mpq_numref (Q), mpq_denref (Q))			\
22637d829589Smrg    : _mpq_cmp_ui (Q,NUI,DUI))
2264003c26c9Smrg #define mpq_cmp_si(q,n,d)				\
2265003c26c9Smrg   (__builtin_constant_p ((n) >= 0) && (n) >= 0		\
2266003c26c9Smrg    ? mpq_cmp_ui (q, __GMP_CAST (unsigned long, n), d)	\
2267003c26c9Smrg    : _mpq_cmp_si (q, n, d))
2268003c26c9Smrg #else
2269003c26c9Smrg #define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI)
2270003c26c9Smrg #define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI)
2271003c26c9Smrg #define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI)
2272003c26c9Smrg #define mpq_cmp_si(q,n,d)  _mpq_cmp_si(q,n,d)
2273003c26c9Smrg #endif
2274003c26c9Smrg 
2275003c26c9Smrg 
2276003c26c9Smrg /* Using "&" rather than "&&" means these can come out branch-free.  Every
2277003c26c9Smrg    mpz_t has at least one limb allocated, so fetching the low limb is always
2278003c26c9Smrg    allowed.  */
2279003c26c9Smrg #define mpz_odd_p(z)   (((z)->_mp_size != 0) & __GMP_CAST (int, (z)->_mp_d[0]))
2280003c26c9Smrg #define mpz_even_p(z)  (! mpz_odd_p (z))
2281003c26c9Smrg 
2282003c26c9Smrg 
2283003c26c9Smrg /**************** C++ routines ****************/
2284003c26c9Smrg 
2285003c26c9Smrg #ifdef __cplusplus
2286003c26c9Smrg __GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr);
2287003c26c9Smrg __GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr);
2288003c26c9Smrg __GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr);
2289003c26c9Smrg __GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr);
2290003c26c9Smrg __GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr);
2291003c26c9Smrg __GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr);
2292003c26c9Smrg #endif
2293003c26c9Smrg 
2294003c26c9Smrg 
2295003c26c9Smrg /* Source-level compatibility with GMP 2 and earlier. */
2296003c26c9Smrg #define mpn_divmod(qp,np,nsize,dp,dsize) \
2297003c26c9Smrg   mpn_divrem (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dp, dsize)
2298003c26c9Smrg 
2299003c26c9Smrg /* Source-level compatibility with GMP 1.  */
2300003c26c9Smrg #define mpz_mdiv	mpz_fdiv_q
2301003c26c9Smrg #define mpz_mdivmod	mpz_fdiv_qr
2302003c26c9Smrg #define mpz_mmod	mpz_fdiv_r
2303003c26c9Smrg #define mpz_mdiv_ui	mpz_fdiv_q_ui
2304003c26c9Smrg #define mpz_mdivmod_ui(q,r,n,d) \
2305003c26c9Smrg   (((r) == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
2306003c26c9Smrg #define mpz_mmod_ui(r,n,d) \
2307003c26c9Smrg   (((r) == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
2308003c26c9Smrg 
2309003c26c9Smrg /* Useful synonyms, but not quite compatible with GMP 1.  */
2310003c26c9Smrg #define mpz_div		mpz_fdiv_q
2311003c26c9Smrg #define mpz_divmod	mpz_fdiv_qr
2312003c26c9Smrg #define mpz_div_ui	mpz_fdiv_q_ui
2313003c26c9Smrg #define mpz_divmod_ui	mpz_fdiv_qr_ui
2314003c26c9Smrg #define mpz_div_2exp	mpz_fdiv_q_2exp
2315003c26c9Smrg #define mpz_mod_2exp	mpz_fdiv_r_2exp
2316003c26c9Smrg 
2317003c26c9Smrg enum
2318003c26c9Smrg {
2319003c26c9Smrg   GMP_ERROR_NONE = 0,
2320003c26c9Smrg   GMP_ERROR_UNSUPPORTED_ARGUMENT = 1,
2321003c26c9Smrg   GMP_ERROR_DIVISION_BY_ZERO = 2,
2322003c26c9Smrg   GMP_ERROR_SQRT_OF_NEGATIVE = 4,
2323003c26c9Smrg   GMP_ERROR_INVALID_ARGUMENT = 8
2324003c26c9Smrg };
2325003c26c9Smrg 
2326003c26c9Smrg /* Define CC and CFLAGS which were used to build this version of GMP */
23277d829589Smrg #define __GMP_CC "gcc"
23287d829589Smrg #define __GMP_CFLAGS "-m32 -O2 -pedantic"
2329003c26c9Smrg 
23307d829589Smrg /* Major version number is the value of __GNU_MP__ too, above. */
23317d829589Smrg #define __GNU_MP_VERSION            6
23320f3f60b5Smrg #define __GNU_MP_VERSION_MINOR      2
2333*d0080044Smrg #define __GNU_MP_VERSION_PATCHLEVEL 1
23345210846fSmrg #define __GNU_MP_RELEASE (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL)
2335003c26c9Smrg 
2336003c26c9Smrg #define __GMP_H__
2337003c26c9Smrg #endif /* __GMP_H__ */
2338