diff options
Diffstat (limited to 'Build/source/libs/mpfr/mpfr-src/src/mpfr-gmp.h')
-rw-r--r-- | Build/source/libs/mpfr/mpfr-src/src/mpfr-gmp.h | 744 |
1 files changed, 0 insertions, 744 deletions
diff --git a/Build/source/libs/mpfr/mpfr-src/src/mpfr-gmp.h b/Build/source/libs/mpfr/mpfr-src/src/mpfr-gmp.h deleted file mode 100644 index f7bc57df233..00000000000 --- a/Build/source/libs/mpfr/mpfr-src/src/mpfr-gmp.h +++ /dev/null @@ -1,744 +0,0 @@ -/* Uniform Interface to GMP. - -Copyright 2004-2020 Free Software Foundation, Inc. -Contributed by the AriC and Caramba projects, INRIA. - -This file is part of the GNU MPFR Library. - -The GNU MPFR Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 3 of the License, or (at your -option) any later version. - -The GNU MPFR Library is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see -https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#ifndef __GMPFR_GMP_H__ -#define __GMPFR_GMP_H__ - -#ifndef __MPFR_IMPL_H__ -# error "mpfr-impl.h not included" -#endif - - -/****************************************************** - ******************** C++ Compatibility *************** - ******************************************************/ -#if defined (__cplusplus) -extern "C" { -#endif - - -/****************************************************** - ******************** Identify GMP ******************** - ******************************************************/ - -/* Macro to detect the GMP version */ -#if defined(__GNU_MP_VERSION) && \ - defined(__GNU_MP_VERSION_MINOR) && \ - defined(__GNU_MP_VERSION_PATCHLEVEL) -# define __MPFR_GMP(a,b,c) \ - (MPFR_VERSION_NUM(__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR,__GNU_MP_VERSION_PATCHLEVEL) >= MPFR_VERSION_NUM(a,b,c)) -#else -# define __MPFR_GMP(a,b,c) 0 -#endif - - - -/****************************************************** - ******************** Check GMP *********************** - ******************************************************/ - -#if !__MPFR_GMP(5,0,0) && !defined(MPFR_USE_MINI_GMP) -# error "GMP 5.0.0 or newer is required" -#endif - -#if GMP_NAIL_BITS != 0 -# error "MPFR doesn't support nonzero values of GMP_NAIL_BITS" -#endif - -#if (GMP_NUMB_BITS<8) || (GMP_NUMB_BITS & (GMP_NUMB_BITS - 1)) -# error "GMP_NUMB_BITS must be a power of 2, and >= 8" -#endif - -#if GMP_NUMB_BITS == 8 -# define MPFR_LOG2_GMP_NUMB_BITS 3 -#elif GMP_NUMB_BITS == 16 -# define MPFR_LOG2_GMP_NUMB_BITS 4 -#elif GMP_NUMB_BITS == 32 -# define MPFR_LOG2_GMP_NUMB_BITS 5 -#elif GMP_NUMB_BITS == 64 -# define MPFR_LOG2_GMP_NUMB_BITS 6 -#elif GMP_NUMB_BITS == 128 -# define MPFR_LOG2_GMP_NUMB_BITS 7 -#elif GMP_NUMB_BITS == 256 -# define MPFR_LOG2_GMP_NUMB_BITS 8 -#else -# error "Can't compute log2(GMP_NUMB_BITS)" -#endif - - - -/****************************************************** - ************* Define GMP Internal Interface ********* - ******************************************************/ - -#ifdef MPFR_HAVE_GMP_IMPL /* with gmp build */ - -#define mpfr_allocate_func (*__gmp_allocate_func) -#define mpfr_reallocate_func (*__gmp_reallocate_func) -#define mpfr_free_func (*__gmp_free_func) - -#else /* without gmp build (gmp-impl.h replacement) */ - -/* Define some macros */ - -#define ULONG_HIGHBIT (ULONG_MAX ^ ((unsigned long) ULONG_MAX >> 1)) -#define UINT_HIGHBIT (UINT_MAX ^ ((unsigned) UINT_MAX >> 1)) -#define USHRT_HIGHBIT ((unsigned short) (USHRT_MAX ^ ((unsigned short) USHRT_MAX >> 1))) - - -#if __GMP_MP_SIZE_T_INT -#define MP_SIZE_T_MAX INT_MAX -#define MP_SIZE_T_MIN INT_MIN -#else -#define MP_SIZE_T_MAX LONG_MAX -#define MP_SIZE_T_MIN LONG_MIN -#endif - -/* MP_LIMB macros. - Note: GMP now also has the MPN_FILL macro, and GMP's MPN_ZERO(dst,n) is - defined as "if (n) MPN_FILL(dst, n, 0);". */ -#define MPN_ZERO(dst, n) memset((dst), 0, (n)*MPFR_BYTES_PER_MP_LIMB) -#define MPN_COPY(dst,src,n) \ - do \ - { \ - if ((dst) != (src)) \ - { \ - MPFR_ASSERTD ((char *) (dst) >= (char *) (src) + \ - (n) * MPFR_BYTES_PER_MP_LIMB || \ - (char *) (src) >= (char *) (dst) + \ - (n) * MPFR_BYTES_PER_MP_LIMB); \ - memcpy ((dst), (src), (n) * MPFR_BYTES_PER_MP_LIMB); \ - } \ - } \ - while (0) - -/* MPN macros taken from gmp-impl.h */ -#define MPN_NORMALIZE(DST, NLIMBS) \ - do { \ - while (NLIMBS > 0) \ - { \ - if ((DST)[(NLIMBS) - 1] != 0) \ - break; \ - NLIMBS--; \ - } \ - } while (0) -#define MPN_NORMALIZE_NOT_ZERO(DST, NLIMBS) \ - do { \ - MPFR_ASSERTD ((NLIMBS) >= 1); \ - while (1) \ - { \ - if ((DST)[(NLIMBS) - 1] != 0) \ - break; \ - NLIMBS--; \ - } \ - } while (0) -#define MPN_OVERLAP_P(xp, xsize, yp, ysize) \ - ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp)) -#define MPN_SAME_OR_INCR2_P(dst, dsize, src, ssize) \ - ((dst) <= (src) || ! MPN_OVERLAP_P (dst, dsize, src, ssize)) -#define MPN_SAME_OR_INCR_P(dst, src, size) \ - MPN_SAME_OR_INCR2_P(dst, size, src, size) -#define MPN_SAME_OR_DECR2_P(dst, dsize, src, ssize) \ - ((dst) >= (src) || ! MPN_OVERLAP_P (dst, dsize, src, ssize)) -#define MPN_SAME_OR_DECR_P(dst, src, size) \ - MPN_SAME_OR_DECR2_P(dst, size, src, size) - -#ifndef MUL_FFT_THRESHOLD -#define MUL_FFT_THRESHOLD 8448 -#endif - -/* If mul_basecase or mpn_sqr_basecase are not exported, used mpn_mul instead */ -#ifndef mpn_mul_basecase -# define mpn_mul_basecase(dst,s1,n1,s2,n2) mpn_mul((dst),(s1),(n1),(s2),(n2)) -#endif -#ifndef mpn_sqr_basecase -# define mpn_sqr_basecase(dst,src,n) mpn_mul((dst),(src),(n),(src),(n)) -#endif - -/* ASSERT */ -__MPFR_DECLSPEC void mpfr_assert_fail (const char *, int, - const char *); - -#define ASSERT_FAIL(expr) mpfr_assert_fail (__FILE__, __LINE__, #expr) -/* ASSERT() is for mpfr-longlong.h only. */ -#define ASSERT(expr) MPFR_ASSERTD(expr) - -/* Access fields of GMP struct */ -#define SIZ(x) ((x)->_mp_size) -#define ABSIZ(x) ABS (SIZ (x)) -#define PTR(x) ((x)->_mp_d) -#define ALLOC(x) ((x)->_mp_alloc) -/* For mpf numbers only. */ -#ifdef MPFR_NEED_MPF_INTERNALS -/* Note: the EXP macro name is reserved when <errno.h> is included. - For compatibility with gmp-impl.h (cf --with-gmp-build), we cannot - change this macro, but let's define it only when we need it, where - <errno.h> will not be included. */ -#define EXP(x) ((x)->_mp_exp) -#define PREC(x) ((x)->_mp_prec) -#endif - -/* For longlong.h */ -#ifdef HAVE_ATTRIBUTE_MODE -typedef unsigned int UQItype __attribute__ ((mode (QI))); -typedef int SItype __attribute__ ((mode (SI))); -typedef unsigned int USItype __attribute__ ((mode (SI))); -typedef int DItype __attribute__ ((mode (DI))); -typedef unsigned int UDItype __attribute__ ((mode (DI))); -#else -typedef unsigned char UQItype; -typedef long SItype; -typedef unsigned long USItype; -#ifdef HAVE_LONG_LONG -typedef long long int DItype; -typedef unsigned long long int UDItype; -#else /* Assume `long' gives us a wide enough type. Needed for hppa2.0w. */ -typedef long int DItype; -typedef unsigned long int UDItype; -#endif -#endif -typedef mp_limb_t UWtype; -typedef unsigned int UHWtype; -#define W_TYPE_SIZE GMP_NUMB_BITS - -/* Remap names of internal mpn functions (for longlong.h). */ -#undef __clz_tab -#define __clz_tab mpfr_clz_tab - -/* Use (4.0 * ...) instead of (2.0 * ...) to work around buggy compilers - that don't convert ulong->double correctly (eg. SunOS 4 native cc). */ -#undef MP_BASE_AS_DOUBLE -#define MP_BASE_AS_DOUBLE (4.0 * (MPFR_LIMB_ONE << (GMP_NUMB_BITS - 2))) - -/* Structure for conversion between internal binary format and - strings in base 2..36. */ -struct bases -{ - /* log(2)/log(conversion_base) */ - double chars_per_bit_exactly; -}; -#undef __mp_bases -#define __mp_bases mpfr_bases -__MPFR_DECLSPEC extern const struct bases mpfr_bases[257]; - -/* Standard macros */ -#undef ABS -#undef MIN -#undef MAX -#define ABS(x) ((x) >= 0 ? (x) : -(x)) -#define MIN(l,o) ((l) < (o) ? (l) : (o)) -#define MAX(h,i) ((h) > (i) ? (h) : (i)) - -__MPFR_DECLSPEC void * mpfr_allocate_func (size_t); -__MPFR_DECLSPEC void * mpfr_reallocate_func (void *, size_t, size_t); -__MPFR_DECLSPEC void mpfr_free_func (void *, size_t); - -#if defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_SBPI1_DIVAPPR_Q) -#ifndef __gmpn_sbpi1_divappr_q -__MPFR_DECLSPEC mp_limb_t __gmpn_sbpi1_divappr_q (mp_limb_t*, - mp_limb_t*, mp_size_t, mp_limb_t*, mp_size_t, mp_limb_t); -#endif -#endif - -#if defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_INVERT_LIMB) -#ifndef __gmpn_invert_limb -__MPFR_DECLSPEC mp_limb_t __gmpn_invert_limb (mp_limb_t); -#endif -#endif - -#if defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_RSBLSH1_N) -#ifndef __gmpn_rsblsh1_n -__MPFR_DECLSPEC mp_limb_t __gmpn_rsblsh1_n (mp_limb_t*, mp_limb_t*, mp_limb_t*, mp_size_t); -#endif -#endif - -/* Definitions related to temporary memory allocation */ - -struct tmp_marker -{ - void *ptr; - size_t size; - struct tmp_marker *next; -}; - -__MPFR_DECLSPEC void *mpfr_tmp_allocate (struct tmp_marker **, - size_t); -__MPFR_DECLSPEC void mpfr_tmp_free (struct tmp_marker *); - -/* Default MPFR_ALLOCA_MAX value. It can be overridden at configure time; - with some tools, by giving a low value such as 0, this is useful for - checking buffer overflow, which may not be possible with alloca. - If HAVE_ALLOCA is not defined, then alloca() is not available, so that - MPFR_ALLOCA_MAX needs to be 0 (see the definition of TMP_ALLOC below); - if the user has explicitly given a non-zero value, this will probably - yield an error at link time or at run time. */ -#ifndef MPFR_ALLOCA_MAX -# ifdef HAVE_ALLOCA -# define MPFR_ALLOCA_MAX 16384 -# else -# define MPFR_ALLOCA_MAX 0 -# endif -#endif - -/* Do not define TMP_SALLOC (see the test in mpfr-impl.h)! */ - -#if MPFR_ALLOCA_MAX != 0 - -/* The following tries to get a good version of alloca. - See gmp-impl.h for implementation details and original version */ -/* FIXME: the autoconf manual gives a different piece of code under the - documentation of the AC_FUNC_ALLOCA macro. Should we switch to it? - But note that the HAVE_ALLOCA test in it seems wrong. - https://lists.gnu.org/archive/html/bug-autoconf/2019-01/msg00009.html */ -#ifndef alloca -# if defined ( __GNUC__ ) -# define alloca __builtin_alloca -# elif defined (__DECC) -# define alloca(x) __ALLOCA(x) -# elif defined (_MSC_VER) -# include <malloc.h> -# define alloca _alloca -# elif defined (HAVE_ALLOCA_H) -# include <alloca.h> -# elif defined (_AIX) || defined (_IBMR2) -# pragma alloca -# else -void *alloca (size_t); -# endif -#endif - -#define TMP_ALLOC(n) (MPFR_ASSERTD ((n) > 0), \ - MPFR_LIKELY ((n) <= MPFR_ALLOCA_MAX) ? \ - alloca (n) : mpfr_tmp_allocate (&tmp_marker, (n))) - -#else /* MPFR_ALLOCA_MAX == 0, alloca() not needed */ - -#define TMP_ALLOC(n) (mpfr_tmp_allocate (&tmp_marker, (n))) - -#endif - -#define TMP_DECL(m) struct tmp_marker *tmp_marker - -#define TMP_MARK(m) (tmp_marker = 0) - -/* Note about TMP_FREE: For small precisions, tmp_marker is null as - the allocation is done on the stack (see TMP_ALLOC above). */ -#define TMP_FREE(m) \ - (MPFR_LIKELY (tmp_marker == NULL) ? (void) 0 : mpfr_tmp_free (tmp_marker)) - -#endif /* gmp-impl.h replacement */ - - - -/****************************************************** - ****** GMP Interface which changes with versions ***** - ****** to other versions of GMP. Add missing ***** - ****** interfaces. ***** - ******************************************************/ - -#ifndef MPFR_LONG_WITHIN_LIMB - -/* the following routines assume that an unsigned long has at least twice the - size of an mp_limb_t */ - -#define umul_ppmm(ph, pl, m0, m1) \ - do { \ - unsigned long _p = (unsigned long) (m0) * (unsigned long) (m1); \ - (ph) = (mp_limb_t) (_p >> GMP_NUMB_BITS); \ - (pl) = (mp_limb_t) (_p & MPFR_LIMB_MAX); \ - } while (0) - -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - do { \ - unsigned long _a = ((unsigned long) (ah) << GMP_NUMB_BITS) + (al); \ - unsigned long _b = ((unsigned long) (bh) << GMP_NUMB_BITS) + (bl); \ - unsigned long _s = _a + _b; \ - (sh) = (mp_limb_t) (_s >> GMP_NUMB_BITS); \ - (sl) = (mp_limb_t) (_s & MPFR_LIMB_MAX); \ - } while (0) - -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - do { \ - unsigned long _a = ((unsigned long) (ah) << GMP_NUMB_BITS) + (al); \ - unsigned long _b = ((unsigned long) (bh) << GMP_NUMB_BITS) + (bl); \ - unsigned long _s = _a - _b; \ - (sh) = (mp_limb_t) (_s >> GMP_NUMB_BITS); \ - (sl) = (mp_limb_t) (_s & MPFR_LIMB_MAX); \ - } while (0) - -#define count_leading_zeros(count,x) \ - do { \ - int _c = 0; \ - mp_limb_t _x = (mp_limb_t) (x); \ - while (GMP_NUMB_BITS > 16 && (_x >> (GMP_NUMB_BITS - 16)) == 0) \ - { \ - _c += 16; \ - _x = (mp_limb_t) (_x << 16); \ - } \ - if (GMP_NUMB_BITS > 8 && (_x >> (GMP_NUMB_BITS - 8)) == 0) \ - { \ - _c += 8; \ - _x = (mp_limb_t) (_x << 8); \ - } \ - if (GMP_NUMB_BITS > 4 && (_x >> (GMP_NUMB_BITS - 4)) == 0) \ - { \ - _c += 4; \ - _x = (mp_limb_t) (_x << 4); \ - } \ - if (GMP_NUMB_BITS > 2 && (_x >> (GMP_NUMB_BITS - 2)) == 0) \ - { \ - _c += 2; \ - _x = (mp_limb_t) (_x << 2); \ - } \ - if ((_x & MPFR_LIMB_HIGHBIT) == 0) \ - _c ++; \ - (count) = _c; \ - } while (0) - -#define invert_limb(invxl,xl) \ - do { \ - unsigned long _num; \ - MPFR_ASSERTD ((xl) != 0); \ - _num = (unsigned long) (mp_limb_t) ~(xl); \ - _num = (_num << GMP_NUMB_BITS) | MPFR_LIMB_MAX; \ - (invxl) = _num / (xl); \ - } while (0) - -#define udiv_qrnnd(q, r, n1, n0, d) \ - do { \ - unsigned long _num; \ - _num = ((unsigned long) (n1) << GMP_NUMB_BITS) | (n0); \ - (q) = _num / (d); \ - (r) = _num % (d); \ - } while (0) - -#endif - -/* If mpn_sqr is not defined, use mpn_mul_n instead - (mpn_sqr was called mpn_sqr_n (internal) in older versions of GMP). */ -#ifndef mpn_sqr -# define mpn_sqr(dst,src,n) mpn_mul_n((dst),(src),(src),(n)) -#endif - -/* invert_limb macro, copied from GMP 5.0.2, file gmp-impl.h. - It returns invxl = floor((B^2-1)/xl)-B, where B=2^BITS_PER_LIMB, - assuming the most significant bit of xl is set. */ -#ifndef invert_limb -#if defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_INVERT_LIMB) -#define invert_limb(invxl,xl) \ - do { \ - invxl = __gmpn_invert_limb (xl); \ - } while (0) -#else -#define invert_limb(invxl,xl) \ - do { \ - mp_limb_t dummy MPFR_MAYBE_UNUSED; \ - MPFR_ASSERTD ((xl) != 0); \ - udiv_qrnnd (invxl, dummy, ~(xl), MPFR_LIMB_MAX, xl); \ - } while (0) -#endif /* defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_INVERT_LIMB) */ -#endif /* ifndef invert_limb */ - -/* udiv_qr_3by2 macro, adapted from GMP 5.0.2, file gmp-impl.h. - Compute quotient the quotient and remainder for n / d. Requires d - >= B^2 / 2 and n < d B. dinv is the inverse - - floor ((B^3 - 1) / (d0 + d1 B)) - B. - - NOTE: Output variables are updated multiple times. Only some inputs - and outputs may overlap. -*/ -#ifndef udiv_qr_3by2 -#define udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \ - do { \ - mp_limb_t _q0, _t1, _t0, _mask; \ - umul_ppmm ((q), _q0, (n2), (dinv)); \ - add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \ - \ - /* Compute the two most significant limbs of n - q'd */ \ - (r1) = (n1) - (d1) * (q); \ - (r0) = (n0); \ - sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \ - umul_ppmm (_t1, _t0, (d0), (q)); \ - sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \ - (q)++; \ - \ - /* Conditionally adjust q and the remainders */ \ - _mask = - (mp_limb_t) ((r1) >= _q0); \ - (q) += _mask; \ - add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \ - if (MPFR_UNLIKELY ((r1) >= (d1))) \ - { \ - if ((r1) > (d1) || (r0) >= (d0)) \ - { \ - (q)++; \ - sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \ - } \ - } \ - } while (0) -#endif - -/* invert_pi1 macro adapted from GMP 5, this computes in (dinv).inv32 - the value of floor((beta^3 - 1)/(d1*beta+d0)) - beta, - cf "Improved Division by Invariant Integers" by Niels Möller and - Torbjörn Granlund */ -typedef struct {mp_limb_t inv32;} mpfr_pi1_t; -#ifndef invert_pi1 -#define invert_pi1(dinv, d1, d0) \ - do { \ - mp_limb_t _v, _p, _t1, _t0, _mask; \ - invert_limb (_v, d1); \ - _p = (d1) * _v; \ - _p += (d0); \ - if (_p < (d0)) \ - { \ - _v--; \ - _mask = -(mp_limb_t) (_p >= (d1)); \ - _p -= (d1); \ - _v += _mask; \ - _p -= _mask & (d1); \ - } \ - umul_ppmm (_t1, _t0, d0, _v); \ - _p += _t1; \ - if (_p < _t1) \ - { \ - _v--; \ - if (MPFR_UNLIKELY (_p >= (d1))) \ - { \ - if (_p > (d1) || _t0 >= (d0)) \ - _v--; \ - } \ - } \ - (dinv).inv32 = _v; \ - } while (0) -#endif - -/* The following macro is copied from GMP-6.1.1, file gmp-impl.h, - macro udiv_qrnnd_preinv. - It computes q and r such that nh*2^GMP_NUMB_BITS + nl = q*d + r, - with 0 <= r < d, assuming di = __gmpn_invert_limb (d). */ -#define __udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ - do { \ - mp_limb_t _qh, _ql, _r, _mask; \ - umul_ppmm (_qh, _ql, (nh), (di)); \ - if (__builtin_constant_p (nl) && (nl) == 0) \ - { \ - _qh += (nh) + 1; \ - _r = - _qh * (d); \ - _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \ - _qh += _mask; \ - _r += _mask & (d); \ - } \ - else \ - { \ - add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \ - _r = (nl) - _qh * (d); \ - _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \ - _qh += _mask; \ - _r += _mask & (d); \ - if (MPFR_UNLIKELY (_r >= (d))) \ - { \ - _r -= (d); \ - _qh++; \ - } \ - } \ - (r) = _r; \ - (q) = _qh; \ - } while (0) - -#if GMP_NUMB_BITS == 64 -/* specialized version for nl = 0, with di computed inside */ -#define __udiv_qrnd_preinv(q, r, nh, d) \ - do { \ - mp_limb_t _di; \ - \ - MPFR_ASSERTD ((d) != 0); \ - MPFR_ASSERTD ((nh) < (d)); \ - MPFR_ASSERTD ((d) & MPFR_LIMB_HIGHBIT); \ - \ - __gmpfr_invert_limb (_di, d); \ - __udiv_qrnnd_preinv (q, r, nh, 0, d, _di); \ - } while (0) -#elif defined(WANT_GMP_INTERNALS) && defined(HAVE___GMPN_INVERT_LIMB) -/* specialized version for nl = 0, with di computed inside */ -#define __udiv_qrnd_preinv(q, r, nh, d) \ - do { \ - mp_limb_t _di; \ - \ - MPFR_ASSERTD ((d) != 0); \ - MPFR_ASSERTD ((nh) < (d)); \ - MPFR_ASSERTD ((d) & MPFR_LIMB_HIGHBIT); \ - \ - _di = __gmpn_invert_limb (d); \ - __udiv_qrnnd_preinv (q, r, nh, 0, d, _di); \ - } while (0) -#else -/* Same as __udiv_qrnnd_c from longlong.h, but using a single UWType/UWtype - division instead of two, and with n0=0. The analysis below assumes a limb - has 64 bits for simplicity. */ -#define __udiv_qrnd_preinv(q, r, n1, d) \ - do { \ - UWtype __d1, __d0, __q1, __q0, __r1, __r0, __i; \ - \ - MPFR_ASSERTD ((d) != 0); \ - MPFR_ASSERTD ((n1) < (d)); \ - MPFR_ASSERTD ((d) & MPFR_LIMB_HIGHBIT); \ - \ - __d1 = __ll_highpart (d); \ - /* 2^31 <= d1 < 2^32 */ \ - __d0 = __ll_lowpart (d); \ - /* 0 <= d0 < 2^32 */ \ - __i = ~(UWtype) 0 / __d1; \ - /* 2^32 < i < 2^33 with i < 2^64/d1 */ \ - \ - __q1 = (((n1) / __ll_B) * __i) / __ll_B; \ - /* Since n1 < d, high(n1) <= d1 = high(d), thus */ \ - /* q1 <= high(n1) * (2^64/d1) / 2^32 <= 2^32 */ \ - /* and also q1 <= n1/d1 thus r1 >= 0 below */ \ - __r1 = (n1) - __q1 * __d1; \ - while (__r1 >= __d1) \ - __q1 ++, __r1 -= __d1; \ - /* by construction, we have n1 = q1*d1+r1, and 0 <= r1 < d1 */ \ - /* thus q1 <= n1/d1 < 2^32+2 */ \ - /* q1*d0 <= (2^32+1)*(2^32-1) <= 2^64-1 thus it fits in a limb. */ \ - __r0 = __r1 * __ll_B; \ - __r1 = __r0 - __q1 * __d0; \ - /* At most two corrections are needed like in __udiv_qrnnd_c. */ \ - if (__r1 > __r0) /* borrow when subtracting q1*d0 */ \ - { \ - __q1--, __r1 += (d); \ - if (__r1 > (d)) /* no carry when adding d */ \ - __q1--, __r1 += (d); \ - } \ - /* We can have r1 < m here, but in this case the true remainder */ \ - /* is 2^64+r1, which is > m (same analysis as below for r0). */ \ - /* Now we have n1*2^32 = q1*d + r1, with 0 <= r1 < d. */ \ - MPFR_ASSERTD(__r1 < (d)); \ - \ - /* The same analysis as above applies, with n1 replaced by r1, */ \ - /* q1 by q0, r1 by r0. */ \ - __q0 = ((__r1 / __ll_B) * __i) / __ll_B; \ - __r0 = __r1 - __q0 * __d1; \ - while (__r0 >= __d1) \ - __q0 ++, __r0 -= __d1; \ - __r1 = __r0 * __ll_B; \ - __r0 = __r1 - __q0 * __d0; \ - /* We know the quotient floor(r1*2^64/d) is q0, q0-1 or q0-2.*/ \ - if (__r0 > __r1) /* borrow when subtracting q0*d0 */ \ - { \ - /* The quotient is either q0-1 or q0-2. */ \ - __q0--, __r0 += (d); \ - if (__r0 > (d)) /* no carry when adding d */ \ - __q0--, __r0 += (d); \ - } \ - /* Now we have n1*2^64 = (q1*2^32+q0)*d + r0, with 0 <= r0 < d. */ \ - MPFR_ASSERTD(__r0 < (d)); \ - \ - (q) = __q1 * __ll_B | __q0; \ - (r) = __r0; \ - } while (0) -#endif - -/****************************************************** - ************* GMP Basic Pointer Types **************** - ******************************************************/ - -typedef mp_limb_t *mpfr_limb_ptr; -typedef const mp_limb_t *mpfr_limb_srcptr; - -/* mpfr_ieee_double_extract structure (copied from GMP 6.1.0, gmp-impl.h, with - ieee_double_extract changed into mpfr_ieee_double_extract, and - _GMP_IEEE_FLOATS changed into _MPFR_IEEE_FLOATS). */ - -/* Define mpfr_ieee_double_extract and _MPFR_IEEE_FLOATS. - - Bit field packing is "implementation defined" according to C99, which - leaves us at the compiler's mercy here. For some systems packing is - defined in the ABI (eg. x86). In any case so far it seems universal that - little endian systems pack from low to high, and big endian from high to - low within the given type. - - Within the fields we rely on the integer endianness being the same as the - float endianness, this is true everywhere we know of and it'd be a fairly - strange system that did anything else. */ - -/* Note for MPFR: building with "gcc -std=c89 -pedantic -pedantic-errors" - fails if the bit-field type is unsigned long: - - error: type of bit-field '...' is a GCC extension [-Wpedantic] - - Though with -std=c99 no errors are obtained, this is still an extension - in C99, which says: - - A bit-field shall have a type that is a qualified or unqualified version - of _Bool, signed int, unsigned int, or some other implementation-defined - type. - - So, unsigned int should be better. This will fail with implementations - having 16-bit int's, but such implementations are not required to - support bit-fields of size > 16 anyway; if ever an implementation with - 16-bit int's is found, the appropriate minimal changes could still be - done in the future. -*/ - -#ifndef _MPFR_IEEE_FLOATS - -#ifdef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN -#define _MPFR_IEEE_FLOATS 1 -union mpfr_ieee_double_extract -{ - struct - { - unsigned int manl:32; - unsigned int manh:20; - unsigned int exp:11; - unsigned int sig:1; - } s; - double d; -}; -#endif - -#ifdef HAVE_DOUBLE_IEEE_BIG_ENDIAN -#define _MPFR_IEEE_FLOATS 1 -union mpfr_ieee_double_extract -{ - struct - { - unsigned int sig:1; - unsigned int exp:11; - unsigned int manh:20; - unsigned int manl:32; - } s; - double d; -}; -#endif - -#endif /* _MPFR_IEEE_FLOATS */ - -/****************************************************** - ******************** C++ Compatibility *************** - ******************************************************/ -#if defined (__cplusplus) -} -#endif - -#endif /* Gmp internal emulator */ |