summaryrefslogtreecommitdiff
path: root/stdlib/gmp-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/gmp-impl.h')
-rw-r--r--stdlib/gmp-impl.h110
1 files changed, 59 insertions, 51 deletions
diff --git a/stdlib/gmp-impl.h b/stdlib/gmp-impl.h
index 2f0956d960..83d4e32847 100644
--- a/stdlib/gmp-impl.h
+++ b/stdlib/gmp-impl.h
@@ -1,6 +1,6 @@
/* Include file for internal GNU MP types and definitions.
-Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
@@ -18,25 +18,50 @@ You should have received a copy of the GNU Library General Public License
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-#if ! defined (alloca)
-#if defined (__GNUC__)
+/* When using gcc, make sure to use its builtin alloca. */
+#if ! defined (alloca) && defined (__GNUC__)
#define alloca __builtin_alloca
-#endif
+#define HAVE_ALLOCA
#endif
+/* When using cc, do whatever necessary to allow use of alloca. For many
+ machines, this means including alloca.h. IBM's compilers need a #pragma
+ in "each module that needs to use alloca". */
#if ! defined (alloca)
-#if defined (__sparc__) || defined (sparc) || defined (__sgi)
+/* We need lots of variants for MIPS, to cover all versions and perversions
+ of OSes for MIPS. */
+#if defined (__mips) || defined (MIPSEL) || defined (MIPSEB) \
+ || defined (_MIPSEL) || defined (_MIPSEB) || defined (__sgi) \
+ || defined (__alpha) || defined (__sparc) || defined (sparc) \
+ || defined (__ksr__)
#include <alloca.h>
+#define HAVE_ALLOCA
+#endif
+#if defined (_IBMR2)
+#pragma alloca
+#define HAVE_ALLOCA
+#endif
+#if defined (__DECC)
+#define alloca(x) __ALLOCA(x)
+#define HAVE_ALLOCA
#endif
#endif
+#if ! defined (HAVE_ALLOCA) || USE_STACK_ALLOC
+#include "stack-alloc.h"
+#else
+#define TMP_DECL(m)
+#define TMP_ALLOC(x) alloca(x)
+#define TMP_MARK(m)
+#define TMP_FREE(m)
+#endif
+
#ifndef NULL
-#define NULL 0L
+#define NULL ((void *) 0)
#endif
#if ! defined (__GNUC__)
#define inline /* Empty */
-void *alloca();
#endif
#define ABS(x) (x >= 0 ? x : -x)
@@ -46,7 +71,7 @@ void *alloca();
#include "gmp-mparam.h"
/* #include "longlong.h" */
-#ifdef __STDC__
+#if defined (__STDC__) || defined (__cplusplus)
void *malloc (size_t);
void *realloc (void *, size_t);
void free (void *);
@@ -119,35 +144,6 @@ void _mp_default_free ();
} \
} while (0)
-/* Swap (mp_ptr, mp_size_t) (U, UL) with (V, VL) */
-#define MPN_SWAP(u, l, v, m) \
- do { \
- { mp_ptr _; _ = (u), (u) = (v), (v) = _;} \
- { mp_size_t _; _ = (l), (l) = (m), (m) = _;} \
- } while (0)
-
-/* Return true iff the limb X has less bits than the limb Y. */
-#define MPN_LESS_BITS_LIMB(x,y) ((x) < (y) && (x) < ((x) ^ (y)))
-
-/* Return true iff (mp_ptr, mp_size_t) (U, UL) has less bits than (V, VL). */
-#define MPN_LESS_BITS(u, l, v, m) \
- ((l) < (m) \
- || ((l) == (m) && (l) != 0 && MPN_LESS_BITS_LIMB ((u)[(l - 1)], (v)[(l) - 1])))
-
-/* Return true iff (mp_ptr, mp_size_t) (U, UL) has more bits than (V, VL). */
-#define MPN_MORE_BITS(u, l, v, m) MPN_LESS_BITS (v, m, u, l)
-
-/* Perform twos complement on (mp_ptr, mp_size_t) (U, UL),
- putting result at (v, VL). Precondition: U[0] != 0. */
-#define MPN_COMPL_INCR(u, v, l) \
- do { \
- mp_size_t _ = 0; \
- (u)[0] = -(v)[_]; \
- while (_++ < (l)) \
- (u)[_] = ~(v)[_]; \
- } while (0)
-#define MPN_COMPL MPN_COMPL_INCR
-
/* Initialize the MP_INT X with space for NLIMBS limbs.
X should be a temporary variable, and it will be automatically
cleared out when the running function returns.
@@ -156,23 +152,23 @@ void _mp_default_free ();
#define MPZ_TMP_INIT(X, NLIMBS) \
do { \
mpz_ptr __x = (X); \
- __x->alloc = (NLIMBS); \
- __x->d = (mp_ptr) alloca ((NLIMBS) * BYTES_PER_MP_LIMB); \
+ __x->_mp_alloc = (NLIMBS); \
+ __x->_mp_d = (mp_ptr) TMP_ALLOC ((NLIMBS) * BYTES_PER_MP_LIMB); \
} while (0)
#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
do { \
if ((size) < KARATSUBA_THRESHOLD) \
- ____mpn_mul_n_basecase (prodp, up, vp, size); \
+ impn_mul_n_basecase (prodp, up, vp, size); \
else \
- ____mpn_mul_n (prodp, up, vp, size, tspace); \
+ impn_mul_n (prodp, up, vp, size, tspace); \
} while (0);
#define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \
do { \
if ((size) < KARATSUBA_THRESHOLD) \
- ____mpn_sqr_n_basecase (prodp, up, size); \
+ impn_sqr_n_basecase (prodp, up, size); \
else \
- ____mpn_sqr_n (prodp, up, size, tspace); \
+ impn_sqr_n (prodp, up, size, tspace); \
} while (0);
/* Structure for conversion between internal binary format and
@@ -198,6 +194,13 @@ struct bases
mp_limb big_base_inverted;
};
+/* Access macros for structure fields for user-visible structures with
+ hidden fields. */
+#define size(X) (X)._mp_size
+#define alloc(X) (X)._mp_alloc
+#define prec(X) (X)._mp_prec
+#define limbs(X) (X)._mp_d
+
extern const struct bases __mp_bases[];
extern mp_size_t __gmp_default_fp_limb_precision;
@@ -288,6 +291,11 @@ typedef mp_limb UWtype;
typedef unsigned int UHWtype;
#define W_TYPE_SIZE BITS_PER_MP_LIMB
+/* Internal mpn calls */
+#define impn_mul_n_basecase __MPN(impn_mul_n_basecase)
+#define impn_mul_n __MPN(impn_mul_n)
+#define impn_sqr_n_basecase __MPN(impn_sqr_n_basecase)
+#define impn_sqr_n __MPN(impn_sqr_n)
#ifndef IEEE_DOUBLE_BIG_ENDIAN
#define IEEE_DOUBLE_BIG_ENDIAN 1
@@ -298,10 +306,10 @@ union ieee_double_extract
{
struct
{
- unsigned long sig:1;
- unsigned long exp:11;
- unsigned long manh:20;
- unsigned long manl:32;
+ unsigned int sig:1;
+ unsigned int exp:11;
+ unsigned int manh:20;
+ unsigned int manl:32;
} s;
double d;
};
@@ -310,10 +318,10 @@ union ieee_double_extract
{
struct
{
- unsigned long manl:32;
- unsigned long manh:20;
- unsigned long exp:11;
- unsigned long sig:1;
+ unsigned int manl:32;
+ unsigned int manh:20;
+ unsigned int exp:11;
+ unsigned int sig:1;
} s;
double d;
};