mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-02-22 23:10:46 -08:00
- Added possibility of configuring --without-gmp when cross-compiling
to reduce memory usage when true bignums aren't needed (doesn't work for native compilation because compiler needs bignums).
This commit is contained in:
parent
077a491319
commit
51136f3ef4
21 changed files with 685 additions and 107 deletions
|
|
@ -29,6 +29,10 @@ ECL 0.9h
|
|||
- The code walker is no longer needed and has been removed from the core.
|
||||
It will be available in the contributed packages.
|
||||
|
||||
- Possibility of configure --without-gmp when cross-compiling (there are no
|
||||
true bignums then, just long long int if possible; doesn't work with native
|
||||
compilation because compiler needs true bignums).
|
||||
|
||||
* Visible changes:
|
||||
|
||||
- The code for handling command line options has been redesigned. Now multiple
|
||||
|
|
|
|||
18
src/aclocal.m4
vendored
18
src/aclocal.m4
vendored
|
|
@ -1,4 +1,22 @@
|
|||
dnl -*- autoconf -*-
|
||||
|
||||
dnl --------------------------------------------------------------
|
||||
dnl http://autoconf-archive.cryp.to/ac_c_long_long_.html
|
||||
dnl Provides a test for the existance of the long long int type and defines HAVE_LONG_LONG if it is found.
|
||||
AC_DEFUN([AC_C_LONG_LONG],
|
||||
[AC_CACHE_CHECK(for long long int, ac_cv_c_long_long,
|
||||
[if test "$GCC" = yes; then
|
||||
ac_cv_c_long_long=yes
|
||||
else
|
||||
AC_TRY_COMPILE(,[long long int i;],
|
||||
ac_cv_c_long_long=yes,
|
||||
ac_cv_c_long_long=no)
|
||||
fi])
|
||||
if test $ac_cv_c_long_long = yes; then
|
||||
AC_DEFINE(HAVE_LONG_LONG, 1, [compiler understands long long])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl --------------------------------------------------------------
|
||||
dnl Add *feature* for conditional compilation.
|
||||
AC_DEFUN([ECL_ADD_FEATURE], [
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ OBJS = main.o symbol.o package.o list.o\
|
|||
instance.o gfun.o reference.o character.o\
|
||||
file.o read.o print.o error.o string.o cfun.o\
|
||||
typespec.o assignment.o \
|
||||
predicate.o big.o number.o\
|
||||
predicate.o number.o\
|
||||
num_pred.o num_comp.o num_arith.o num_sfun.o num_co.o\
|
||||
num_log.o num_rand.o array.o sequence.o cmpaux.o\
|
||||
macros.o backq.o stacks.o \
|
||||
|
|
|
|||
145
src/c/big_ll.d
Normal file
145
src/c/big_ll.d
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
big_ll.c -- Bignum emulation with long long.
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2005, Maciek Pasternacki.
|
||||
|
||||
ECL is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
See file '../Copyright' for full details.
|
||||
*/
|
||||
|
||||
#include "ecl.h"
|
||||
#include "internal.h"
|
||||
|
||||
cl_object
|
||||
big_register0_get(void)
|
||||
{
|
||||
cl_env.big_register[0]->big.big_num = 0ll;
|
||||
return cl_env.big_register[0];
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_register1_get(void)
|
||||
{
|
||||
cl_env.big_register[1]->big.big_num = 0ll;
|
||||
return cl_env.big_register[1];
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_register2_get(void)
|
||||
{
|
||||
cl_env.big_register[2]->big.big_num = 0ll;
|
||||
return cl_env.big_register[2];
|
||||
}
|
||||
|
||||
void
|
||||
big_register_free(cl_object x) {}
|
||||
|
||||
cl_object
|
||||
big_register_copy(cl_object old)
|
||||
{
|
||||
cl_object new_big = cl_alloc_object(t_bignum);
|
||||
new_big->big.big_num = old->big.big_num;
|
||||
return new_big;
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_register_normalize(cl_object x)
|
||||
{
|
||||
if (x->big.big_num == 0ll)
|
||||
return(MAKE_FIXNUM(0));
|
||||
if (x->big.big_num <= MOST_POSITIVE_FIXNUM && x->big.big_num >= MOST_NEGATIVE_FIXNUM)
|
||||
return(MAKE_FIXNUM(x->big.big_num));
|
||||
return big_register_copy(x);
|
||||
}
|
||||
|
||||
static cl_object
|
||||
big_alloc(int size)
|
||||
{
|
||||
volatile cl_object x = cl_alloc_object(t_bignum);
|
||||
if (size <= 0)
|
||||
error("negative or zero size for bignum in big_alloc");
|
||||
x->big.big_num = 0ll;
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
cl_object
|
||||
bignum1(cl_fixnum val)
|
||||
{
|
||||
volatile cl_object z = cl_alloc_object(t_bignum);
|
||||
z->big.big_num = val;
|
||||
return(z);
|
||||
}
|
||||
|
||||
cl_object
|
||||
bignum2(cl_fixnum hi, cl_fixnum lo)
|
||||
{
|
||||
cl_object z;
|
||||
|
||||
z = big_alloc(2);
|
||||
z->big.big_num = hi<<32 + lo;
|
||||
return(z);
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_copy(cl_object x)
|
||||
{
|
||||
volatile cl_object y = cl_alloc_object(t_bignum);
|
||||
y->big.big_num = x->big.big_num;
|
||||
return(y);
|
||||
}
|
||||
|
||||
/*
|
||||
big_minus(x) returns the complement of bignum x.
|
||||
*/
|
||||
cl_object
|
||||
big_minus(cl_object x)
|
||||
{
|
||||
volatile cl_object y = big_copy(x);
|
||||
y->big.big_num = -x->big.big_num;
|
||||
return y;
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_plus(cl_object x, cl_object y)
|
||||
{
|
||||
volatile cl_object z = big_register0_get();
|
||||
z->big.big_num = x->big.big_num + y->big.big_num;
|
||||
return(big_register_copy(z));
|
||||
}
|
||||
|
||||
cl_object
|
||||
big_normalize(cl_object x)
|
||||
{
|
||||
if (x->big.big_num == 0ll)
|
||||
return(MAKE_FIXNUM(0));
|
||||
if (x->big.big_num <= MOST_POSITIVE_FIXNUM && x->big.big_num >= MOST_NEGATIVE_FIXNUM)
|
||||
return(MAKE_FIXNUM(x->big.big_num));
|
||||
return(x);
|
||||
}
|
||||
|
||||
int big_num_t_sgn(big_num_t x)
|
||||
{
|
||||
return ( x == (big_num_t)0 ) ? 0 : (x < (big_num_t)0) ? -1 : 1;
|
||||
}
|
||||
|
||||
|
||||
void init_big_registers(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; i++) {
|
||||
cl_env.big_register[i] = cl_alloc_object(t_bignum);
|
||||
cl_env.big_register[i]->big.big_num = 0ll;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
init_big(void)
|
||||
{
|
||||
init_big_registers();
|
||||
}
|
||||
|
|
@ -133,6 +133,7 @@ BEGIN:
|
|||
switch (type_of(x)) {
|
||||
|
||||
case t_bignum:
|
||||
#ifdef WITH_GMP
|
||||
if (collect_blocks) {
|
||||
/* GMP may set num.alloc before actually allocating anything.
|
||||
With these checks we make sure we do not move anything
|
||||
|
|
@ -143,6 +144,7 @@ BEGIN:
|
|||
size_t size = x->big.big_dim * sizeof(mp_limb_t);
|
||||
if (size) mark_contblock(limbs, size);
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
break;
|
||||
|
||||
case t_ratio:
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ BEGIN:
|
|||
switch (type_of(x)) {
|
||||
|
||||
case t_bignum: {
|
||||
#ifdef WITH_GMP
|
||||
/* GMP may set num.alloc before actually allocating anything.
|
||||
With these checks we make sure we do not move anything
|
||||
we don't have to. Besides, we use big_dim as the size
|
||||
|
|
@ -137,6 +138,7 @@ BEGIN:
|
|||
cl_ptr limbs = (cl_ptr)x->big.big_limbs;
|
||||
cl_index size = x->big.big_dim * sizeof(mp_limb_t);
|
||||
if (size) mark_contblock(limbs, size);
|
||||
#endif /* WITH_GMP */
|
||||
break;
|
||||
}
|
||||
case t_ratio:
|
||||
|
|
|
|||
|
|
@ -120,8 +120,12 @@ _hash_eql(cl_hashkey h, cl_object x)
|
|||
BEGIN:
|
||||
switch (type_of(x)) {
|
||||
case t_bignum:
|
||||
#ifdef WITH_GMP
|
||||
return hash_string(h, (unsigned char*)x->big.big_limbs,
|
||||
labs(x->big.big_size) * sizeof(mp_limb_t));
|
||||
#else /* WITH_GMP */
|
||||
return hash_word(h, (uint32_t)(x->big.big_num));
|
||||
#endif /* WITH_GMP */
|
||||
case t_ratio:
|
||||
h = _hash_eql(h, x->ratio.num);
|
||||
return _hash_eql(h, x->ratio.den);
|
||||
|
|
|
|||
|
|
@ -377,16 +377,19 @@ cl_boot(int argc, char **argv)
|
|||
cl_list(8, @'&optional', @'&rest', @'&key', @'&allow-other-keys',
|
||||
@'&aux', @'&whole', @'&environment', @'&body'));
|
||||
|
||||
features = cl_list(5,
|
||||
features = cl_list(4,
|
||||
make_keyword("ECL"),
|
||||
make_keyword("COMMON"),
|
||||
make_keyword("ANSI-CL"),
|
||||
make_keyword("COMMON-LISP"),
|
||||
make_keyword(ECL_ARCHITECTURE),
|
||||
make_keyword("FFI"));
|
||||
|
||||
#define ADD_FEATURE(name) features = CONS(make_keyword(name),features)
|
||||
|
||||
#ifdef WITH_GMP
|
||||
ADD_FEATURE("COMMON-LISP");
|
||||
ADD_FEATURE("ANSI-CL");
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
#if defined(GBC_BOEHM)
|
||||
ADD_FEATURE("BOEHM-GC");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -32,8 +32,12 @@ fixnum_times(cl_fixnum i, cl_fixnum j)
|
|||
{
|
||||
cl_object x = big_register0_get();
|
||||
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_si(x->big.big_num, i);
|
||||
mpz_mul_si(x->big.big_num, x->big.big_num, (long int)j);
|
||||
#else /* WITH_GMP */
|
||||
x->big.big_num = (big_num_t)i * (big_num_t)j;
|
||||
#endif /* WITH_GMP */
|
||||
return big_register_normalize(x);
|
||||
}
|
||||
|
||||
|
|
@ -47,7 +51,11 @@ big_times_fix(cl_object b, cl_fixnum i)
|
|||
if (i == -1)
|
||||
return(big_minus(b));
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_mul_si(z->big.big_num, b->big.big_num, (long int)i);
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = b->big.big_num * i;
|
||||
#endif /* WITH_GMP */
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
}
|
||||
|
|
@ -57,7 +65,11 @@ big_times_big(cl_object x, cl_object y)
|
|||
{
|
||||
cl_object z;
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_mul(z->big.big_num, x->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = x->big.big_num * y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
}
|
||||
|
|
@ -212,10 +224,14 @@ number_plus(cl_object x, cl_object y)
|
|||
if ((i = fix(x)) == 0)
|
||||
return(y);
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
if (i > 0)
|
||||
mpz_add_ui(z->big.big_num, y->big.big_num, (unsigned long)i);
|
||||
else
|
||||
mpz_sub_ui(z->big.big_num, y->big.big_num, (unsigned long)(-i));
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = y->big.big_num + i;
|
||||
#endif /* WITH_GMP */
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
case t_ratio:
|
||||
|
|
@ -240,10 +256,14 @@ number_plus(cl_object x, cl_object y)
|
|||
if ((j = fix(y)) == 0)
|
||||
return(x);
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
if (j > 0)
|
||||
mpz_add_ui(z->big.big_num, x->big.big_num, (unsigned long)j);
|
||||
else
|
||||
mpz_sub_ui(z->big.big_num, x->big.big_num, (unsigned long)(-j));
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = x->big.big_num + j;
|
||||
#endif /* WITH_GMP */
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
case t_bignum:
|
||||
|
|
@ -365,10 +385,14 @@ number_minus(cl_object x, cl_object y)
|
|||
case t_bignum:
|
||||
z = big_register0_get();
|
||||
i = fix(x);
|
||||
#ifdef WITH_GMP
|
||||
if (i > 0)
|
||||
mpz_sub_ui(z->big.big_num, y->big.big_num, (unsigned long)i);
|
||||
else
|
||||
mpz_add_ui(z->big.big_num, y->big.big_num, (unsigned long)(-i));
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = (big_num_t)i - y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
big_complement(z);
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
|
|
@ -392,10 +416,14 @@ number_minus(cl_object x, cl_object y)
|
|||
if ((j = fix(y)) == 0)
|
||||
return(x);
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
if (j > 0)
|
||||
mpz_sub_ui(z->big.big_num, x->big.big_num, (unsigned long)j);
|
||||
else
|
||||
mpz_add_ui(z->big.big_num, x->big.big_num, (unsigned long)(-j));
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = x->big.big_num - j;
|
||||
#endif /* WITH_GMP */
|
||||
z = big_register_normalize(z);
|
||||
return(z);
|
||||
case t_bignum:
|
||||
|
|
@ -528,7 +556,11 @@ number_negate(cl_object x)
|
|||
}
|
||||
case t_bignum:
|
||||
z = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_neg(z->big.big_num, x->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = -(x->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
return big_register_normalize(z);
|
||||
|
||||
case t_ratio:
|
||||
|
|
@ -703,10 +735,14 @@ integer_divide(cl_object x, cl_object y)
|
|||
* MOST_NEGATIVE_FIXNUM = - MOST_POSITIVE_FIXNUM.
|
||||
*/
|
||||
if (-MOST_NEGATIVE_FIXNUM > MOST_POSITIVE_FIXNUM) {
|
||||
#ifdef WITH_GMP
|
||||
if (mpz_cmp_si(y->big.big_num, -fix(x)))
|
||||
return MAKE_FIXNUM(0);
|
||||
else
|
||||
return MAKE_FIXNUM(-1);
|
||||
#else /* WITH_GMP */
|
||||
return y->big.big_num != -fix(x) ? MAKE_FIXNUM(0) : MAKE_FIXNUM(-1);
|
||||
#endif /* WITH_GMP */
|
||||
} else {
|
||||
return MAKE_FIXNUM(0);
|
||||
}
|
||||
|
|
@ -716,12 +752,20 @@ integer_divide(cl_object x, cl_object y)
|
|||
if (tx == t_bignum) {
|
||||
cl_object q = big_register0_get();
|
||||
if (ty == t_bignum) {
|
||||
#ifdef WITH_GMP
|
||||
mpz_tdiv_q(q->big.big_num, x->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q->big.big_num = x->big.big_num / y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
} else if (ty == t_fixnum) {
|
||||
long j = fix(y);
|
||||
#ifdef WITH_GMP
|
||||
mpz_tdiv_q_ui(q->big.big_num, x->big.big_num, (unsigned long)labs(j));
|
||||
if (j < 0)
|
||||
mpz_neg(q->big.big_num, q->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q->big.big_num = x->big.big_num / j;
|
||||
#endif /* WITH_GMP */
|
||||
} else {
|
||||
FEtype_error_integer(y);
|
||||
}
|
||||
|
|
@ -785,7 +829,28 @@ get_gcd(cl_object x, cl_object y)
|
|||
y = bignum1(fix(y));
|
||||
case t_bignum:
|
||||
gcd = big_register0_get();
|
||||
mpz_gcd(gcd->big.big_num, x->big.big_num, y->big.big_num);
|
||||
#ifdef WITH_GMP
|
||||
mpz_gcd(gcd->big.big_num, x->big.big_num, y->big.big_num); /* FIXME!!! */
|
||||
#else /* WITH_GMP */
|
||||
{
|
||||
big_num_t i = x->big.big_num, j = y->big.big_num;
|
||||
while ( 1 ) {
|
||||
big_num_t k;
|
||||
if ( i<j ) {
|
||||
k = i;
|
||||
i = j;
|
||||
j = k;
|
||||
}
|
||||
if ( j == 0 ) {
|
||||
gcd->big.big_num = k;
|
||||
break;
|
||||
}
|
||||
k = i % j;
|
||||
i = j;
|
||||
j = k;
|
||||
}
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
gcd = big_register_normalize(gcd);
|
||||
return(gcd);
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -47,7 +47,11 @@ double_to_integer(double d)
|
|||
return MAKE_FIXNUM((cl_fixnum)d);
|
||||
else {
|
||||
cl_object x = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_d(x->big.big_num, d);
|
||||
#else /* WITH_GMP */
|
||||
x->big.big_num = (big_num_t)d;
|
||||
#endif /* WITH_GMP */
|
||||
return big_register_copy(x);
|
||||
}
|
||||
}
|
||||
|
|
@ -59,7 +63,11 @@ float_to_integer(float d)
|
|||
return MAKE_FIXNUM((cl_fixnum)d);
|
||||
else {
|
||||
cl_object x = big_register0_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_d(x->big.big_num, d);
|
||||
#else /* WITH_GMP */
|
||||
x->big.big_num = (big_num_t)d;
|
||||
#endif /* WITH_GMP */
|
||||
return big_register_copy(x);
|
||||
}
|
||||
}
|
||||
|
|
@ -213,9 +221,14 @@ floor2(cl_object x, cl_object y)
|
|||
*/
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
cl_object j = big_register2_get();
|
||||
mpz_set_si(j->big.big_num, fix(x));
|
||||
mpz_fdiv_qr(q->big.big_num, r->big.big_num, j->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q->big.big_num = (big_num_t)fix(x) / y->big.big_num;
|
||||
r->big.big_num = (big_num_t)fix(x) % y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
@ -249,9 +262,14 @@ floor2(cl_object x, cl_object y)
|
|||
case t_fixnum: { /* BIG / FIX */
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
cl_object j = big_register2_get();
|
||||
mpz_set_si(j->big.big_num, fix(y));
|
||||
mpz_fdiv_qr(q->big.big_num, r->big.big_num, x->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q->big.big_num = x->big.big_num / fix(y);
|
||||
r->big.big_num = x->big.big_num % fix(y);
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
@ -259,7 +277,12 @@ floor2(cl_object x, cl_object y)
|
|||
case t_bignum: { /* BIG / BIG */
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_fdiv_qr(q->big.big_num, r->big.big_num, x->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q = x->big.big_num / y->big.big_num;
|
||||
r = x->big.big_num % y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
@ -392,9 +415,14 @@ ceiling2(cl_object x, cl_object y)
|
|||
*/
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
cl_object j = big_register2_get();
|
||||
mpz_set_si(j->big.big_num, fix(x));
|
||||
mpz_cdiv_qr(q->big.big_num, r->big.big_num, j->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q = (big_num_t)fix(x) / y->big.big_num;
|
||||
r = (big_num_t)fix(x) % y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
@ -428,9 +456,14 @@ ceiling2(cl_object x, cl_object y)
|
|||
case t_fixnum: { /* BIG / FIX */
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
cl_object j = big_register2_get();
|
||||
mpz_set_si(j->big.big_num, fix(y));
|
||||
mpz_cdiv_qr(q->big.big_num, r->big.big_num, x->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q = x->big.big_num / fix(y);
|
||||
r = x->big.big_num % fix(y);
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
@ -438,7 +471,12 @@ ceiling2(cl_object x, cl_object y)
|
|||
case t_bignum: { /* BIG / BIG */
|
||||
cl_object q = big_register0_get();
|
||||
cl_object r = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_cdiv_qr(q->big.big_num, r->big.big_num, x->big.big_num, y->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
q->big.big_num = x->big.big_num / y->big.big_num;
|
||||
r->big.big_num = x->big.big_num % y->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
VALUES(0) = big_register_normalize(q);
|
||||
VALUES(1) = big_register_normalize(r);
|
||||
break;
|
||||
|
|
|
|||
101
src/c/num_log.d
101
src/c/num_log.d
|
|
@ -31,7 +31,11 @@ ior_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_ior_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_ior(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num |= j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -43,7 +47,11 @@ xor_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_xor_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_xor(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num ^= j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -55,7 +63,11 @@ and_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_and_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_and(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num &= j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -67,8 +79,12 @@ eqv_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_eqv_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_xor(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = ~(i->big.big_num ^ j->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -80,8 +96,12 @@ nand_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_nand_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_and(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = ~(i->big.big_num & j->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -93,8 +113,12 @@ nor_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_nor_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_ior(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = ~(i->big.big_num | j->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -106,8 +130,12 @@ andc1_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_andc1_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
mpz_and(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = (~i->big.big_num) & (big_num_t)j;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -121,9 +149,13 @@ static void mpz_orc1_op(cl_object, cl_object);
|
|||
static void
|
||||
mpz_andc2_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
/* (i & ~j) = ~((~i) | j) */
|
||||
mpz_orc1_op(i, j);
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = i->big.big_num & (~j->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -135,8 +167,12 @@ orc1_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_orc1_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
mpz_ior(i->big.big_num, i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = (~i->big.big_num) | j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -148,9 +184,13 @@ orc2_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_orc2_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
/* (i | ~j) = ~((~i) & j) */
|
||||
mpz_andc1_op(i, j);
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = i->big.big_num | (~j->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -162,7 +202,11 @@ b_clr_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_b_clr_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_si(i->big.big_num, 0);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = 0ll;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -174,7 +218,11 @@ b_set_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_b_set_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_si(i->big.big_num, -1);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = -1ll;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -197,7 +245,11 @@ b_2_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_b_2_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_set(i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -209,7 +261,11 @@ b_c1_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_b_c1_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_com(i->big.big_num, i->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = ~i->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
static cl_fixnum
|
||||
|
|
@ -221,7 +277,11 @@ b_c2_op(cl_fixnum i, cl_fixnum j)
|
|||
static void
|
||||
mpz_b_c2_op(cl_object i, cl_object j)
|
||||
{
|
||||
#ifdef WITH_GMP
|
||||
mpz_com(i->big.big_num, j->big.big_num);
|
||||
#else /* WITH_GMP */
|
||||
i->big.big_num = ~j->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
|
||||
typedef cl_fixnum (*bit_operator)(cl_fixnum, cl_fixnum);
|
||||
|
|
@ -371,7 +431,11 @@ ecl_boole(int op, cl_object x, cl_object y)
|
|||
switch (type_of(y)) {
|
||||
case t_fixnum: {
|
||||
cl_object z = big_register1_get();
|
||||
#ifdef WITH_GMP
|
||||
mpz_set_si(z->big.big_num, fix(y));
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = fix(y);
|
||||
#endif /* WITH_GMP */
|
||||
(*big_log_op)(x, z);
|
||||
big_register_free(z);
|
||||
break;
|
||||
|
|
@ -410,6 +474,7 @@ count_bits(cl_object x)
|
|||
break;
|
||||
}
|
||||
case t_bignum:
|
||||
#ifdef WITH_GMP
|
||||
if (big_sign(x) >= 0)
|
||||
count = mpz_popcount(x->big.big_num);
|
||||
else {
|
||||
|
|
@ -418,6 +483,15 @@ count_bits(cl_object x)
|
|||
count = mpz_popcount(z->big.big_num);
|
||||
big_register_free(z);
|
||||
}
|
||||
#else /* WITH_GMP */
|
||||
{
|
||||
big_num_t i = x->big.big_num;
|
||||
if ( i<0 )
|
||||
i = ~i;
|
||||
for ( count=0 ; i ; i >>= 1 )
|
||||
if ( i&1 ) count++;
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
break;
|
||||
default:
|
||||
FEtype_error_integer(x);
|
||||
|
|
@ -454,13 +528,22 @@ ecl_ash(cl_object x, cl_fixnum w)
|
|||
}
|
||||
return MAKE_FIXNUM(y);
|
||||
}
|
||||
#ifdef WITH_GMP
|
||||
mpz_div_2exp(y->big.big_num, x->big.big_num, bits);
|
||||
#else /* WITH_GMP */
|
||||
y->big.big_num = x->big.big_num >> bits;
|
||||
#endif /* WITH_GMP */
|
||||
} else {
|
||||
#ifdef WITH_GMP
|
||||
if (FIXNUMP(x)) {
|
||||
mpz_set_si(y->big.big_num, fix(x));
|
||||
x = y;
|
||||
}
|
||||
mpz_mul_2exp(y->big.big_num, x->big.big_num, (unsigned long)w);
|
||||
#else /* WITH_GMP */
|
||||
y->big.big_num = FIXNUMP(x) ? fix(x) : x->big.big_num;
|
||||
y->big.big_num <<= w;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
return(big_register_normalize(y));
|
||||
}
|
||||
|
|
@ -577,7 +660,15 @@ cl_logbitp(cl_object p, cl_object x)
|
|||
i = ((y >> n) & 1);
|
||||
}
|
||||
} else {
|
||||
#ifdef WITH_GMP
|
||||
i = mpz_tstbit(x->big.big_num, n);
|
||||
#else /* WITH_GMP */
|
||||
if ( n >= 8*sizeof(big_num_t) ) {
|
||||
i = (x->big.big_num < 0);
|
||||
} else {
|
||||
i = (x->big.big_num >> n) & 1;
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
} else {
|
||||
assert_type_non_negative_integer(p);
|
||||
|
|
@ -645,9 +736,17 @@ cl_integer_length(cl_object x)
|
|||
count = ecl_fixnum_bit_length(i);
|
||||
break;
|
||||
case t_bignum:
|
||||
if (mpz_sgn(x->big.big_num) < 0)
|
||||
if (big_sign(x) < 0)
|
||||
x = cl_lognot(x);
|
||||
#ifdef WITH_GMP
|
||||
count = mpz_sizeinbase(x->big.big_num, 2);
|
||||
#else /* WITH_GMP */
|
||||
for ( i=(8*sizeof(big_num_t))-1 ; i>0 ; i-- )
|
||||
if ( (x->big.big_num >> i) & 1 ) {
|
||||
count = i;
|
||||
break;
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
break;
|
||||
default:
|
||||
FEtype_error_integer(x);
|
||||
|
|
|
|||
|
|
@ -37,9 +37,14 @@ fixint(cl_object x)
|
|||
if (FIXNUMP(x))
|
||||
return fix(x);
|
||||
if (type_of(x) == t_bignum) {
|
||||
#ifdef WITH_GMP
|
||||
if (mpz_fits_slong_p(x->big.big_num)) {
|
||||
return mpz_get_si(x->big.big_num);
|
||||
}
|
||||
#else /* WITH_GMP */
|
||||
if ( !((cl_fixnum)x->big.big_num < x->big.big_num) )
|
||||
return (cl_fixnum)x->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
FEwrong_type_argument(@'fixnum', x);
|
||||
}
|
||||
|
|
@ -52,9 +57,15 @@ fixnnint(cl_object x)
|
|||
if (i >= 0)
|
||||
return i;
|
||||
} else if (type_of(x) == t_bignum) {
|
||||
#ifdef WITH_GMP
|
||||
if (mpz_fits_ulong_p(x->big.big_num)) {
|
||||
return mpz_get_ui(x->big.big_num);
|
||||
}
|
||||
#else /* WITH_GMP */
|
||||
if ( x->big.big_num >= 0
|
||||
&& !((cl_fixnum)x->big.big_num < x->big.big_num) )
|
||||
return (cl_fixnum)x->big.big_num;
|
||||
#endif /* WITH_GMP */
|
||||
}
|
||||
cl_error(9, @'simple-type-error', @':format-control',
|
||||
make_constant_string("Not a non-negative fixnum ~S"),
|
||||
|
|
@ -68,7 +79,11 @@ make_integer(cl_fixnum l)
|
|||
{
|
||||
if (l > MOST_POSITIVE_FIXNUM || l < MOST_NEGATIVE_FIXNUM) {
|
||||
cl_object z = cl_alloc_object(t_bignum);
|
||||
#ifdef WITH_GMP
|
||||
mpz_init_set_si(z->big.big_num, l);
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = l;
|
||||
#endif /* WITH_GMP */
|
||||
return z;
|
||||
}
|
||||
return MAKE_FIXNUM(l);
|
||||
|
|
@ -79,7 +94,11 @@ make_unsigned_integer(cl_index l)
|
|||
{
|
||||
if (l > MOST_POSITIVE_FIXNUM) {
|
||||
cl_object z = cl_alloc_object(t_bignum);
|
||||
#ifdef WITH_GMP
|
||||
mpz_init_set_ui(z->big.big_num, l);
|
||||
#else /* WITH_GMP */
|
||||
z->big.big_num = l;
|
||||
#endif /* WITH_GMP */
|
||||
return z;
|
||||
}
|
||||
return MAKE_FIXNUM(l);
|
||||
|
|
@ -215,8 +234,9 @@ number_to_double(cl_object x)
|
|||
return(big_to_double(x));
|
||||
|
||||
case t_ratio: {
|
||||
#ifdef WITH_GMP
|
||||
double output;
|
||||
mpq_t aux;
|
||||
mpq_t aux;
|
||||
mpq_init(aux);
|
||||
if (FIXNUMP(x->ratio.num)) {
|
||||
mpz_set_si(mpq_numref(aux), fix(x->ratio.num));
|
||||
|
|
@ -231,6 +251,11 @@ number_to_double(cl_object x)
|
|||
output = mpq_get_d(aux);
|
||||
mpq_clear(aux);
|
||||
return output;
|
||||
#else /* WITH_GMP */
|
||||
return (double)(FIXNUMP(x->ratio.num) ? fix(x->ratio.num) : x->ratio.num->big.big_num) /
|
||||
(double)(FIXNUMP(x->ratio.den) ? fix(x->ratio.den) : x->ratio.den->big.big_num);
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
}
|
||||
case t_shortfloat:
|
||||
return((double)(sf(x)));
|
||||
|
|
|
|||
|
|
@ -596,6 +596,8 @@ write_double(double d, int e, bool shortp, cl_object stream)
|
|||
}
|
||||
|
||||
|
||||
#ifdef WITH_GMP
|
||||
|
||||
struct powers {
|
||||
cl_object number;
|
||||
cl_index n_digits;
|
||||
|
|
@ -661,6 +663,29 @@ write_bignum(cl_object x, cl_object stream)
|
|||
#endif
|
||||
}
|
||||
|
||||
#else /* WITH_GMP */
|
||||
|
||||
static void
|
||||
write_positive_bignum(big_num_t x, cl_object stream)
|
||||
{
|
||||
/* The maximum number of digits is achieved for base 2 and it
|
||||
is always < 8*sizeof(big_num_t) */
|
||||
int base = ecl_print_base();
|
||||
short digits[8*sizeof(big_num_t)];
|
||||
int j = 0;
|
||||
if (x == (big_num_t)0) {
|
||||
digits[j++] = '0';
|
||||
} else do {
|
||||
digits[j++] = ecl_digit_char((cl_fixnum)(x % (big_num_t)base), base);
|
||||
x /= base;
|
||||
} while (x > (big_num_t)0);
|
||||
/* while (len-- > j)
|
||||
write_ch('0', stream); */
|
||||
while (j-- > 0)
|
||||
write_ch(digits[j], stream);
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
static bool
|
||||
all_dots(cl_object s)
|
||||
{
|
||||
|
|
@ -981,7 +1006,19 @@ si_write_ugly_object(cl_object x, cl_object stream)
|
|||
int print_base = ecl_print_base();
|
||||
if (print_radix && print_base != 10)
|
||||
write_base(print_base, stream);
|
||||
#ifdef WITH_GMP
|
||||
write_bignum(x, stream);
|
||||
#else /* WITH_GMP */
|
||||
if ( big_zerop(x) ) {
|
||||
write_ch('0', stream);
|
||||
} else if ( big_sign(x) < 0 ) {
|
||||
write_ch('-', stream);
|
||||
write_positive_bignum(-(x->big.big_num), stream);
|
||||
} else {
|
||||
write_positive_bignum(x->big.big_num, stream);
|
||||
}
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
if (print_radix && print_base == 10)
|
||||
write_ch('.', stream);
|
||||
break;
|
||||
|
|
|
|||
245
src/configure
vendored
245
src/configure
vendored
|
|
@ -1,5 +1,5 @@
|
|||
#! /bin/sh
|
||||
# From configure.in Revision: 1.110 .
|
||||
# From configure.in Revision: 1.111 .
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.59 for ecl 0.9g.
|
||||
#
|
||||
|
|
@ -751,22 +751,6 @@ ac_env_target_alias_set=${target_alias+set}
|
|||
ac_env_target_alias_value=$target_alias
|
||||
ac_cv_env_target_alias_set=${target_alias+set}
|
||||
ac_cv_env_target_alias_value=$target_alias
|
||||
ac_env_CC_set=${CC+set}
|
||||
ac_env_CC_value=$CC
|
||||
ac_cv_env_CC_set=${CC+set}
|
||||
ac_cv_env_CC_value=$CC
|
||||
ac_env_CFLAGS_set=${CFLAGS+set}
|
||||
ac_env_CFLAGS_value=$CFLAGS
|
||||
ac_cv_env_CFLAGS_set=${CFLAGS+set}
|
||||
ac_cv_env_CFLAGS_value=$CFLAGS
|
||||
ac_env_LDFLAGS_set=${LDFLAGS+set}
|
||||
ac_env_LDFLAGS_value=$LDFLAGS
|
||||
ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
|
||||
ac_cv_env_LDFLAGS_value=$LDFLAGS
|
||||
ac_env_CPPFLAGS_set=${CPPFLAGS+set}
|
||||
ac_env_CPPFLAGS_value=$CPPFLAGS
|
||||
ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
|
||||
ac_cv_env_CPPFLAGS_value=$CPPFLAGS
|
||||
ac_env_CXX_set=${CXX+set}
|
||||
ac_env_CXX_value=$CXX
|
||||
ac_cv_env_CXX_set=${CXX+set}
|
||||
|
|
@ -843,10 +827,6 @@ _ACEOF
|
|||
X features:
|
||||
--x-includes=DIR X include files are in DIR
|
||||
--x-libraries=DIR X library files are in DIR
|
||||
|
||||
System types:
|
||||
--build=BUILD configure for building on BUILD [guessed]
|
||||
--host=HOST cross-compile to build programs to run on HOST [BUILD]
|
||||
_ACEOF
|
||||
fi
|
||||
|
||||
|
|
@ -867,43 +847,35 @@ Optional Features:
|
|||
--enable-local-boehm Deprecated! See --enable-boehm
|
||||
--enable-slow-config use GMP to guess compiler/linker flags (no|yes,
|
||||
default=NO)
|
||||
--enable-local-gmp Deprecated! See --with-system-gmp
|
||||
--enable-opcode8 interpreter uses 8-bit codes (default=NO, only works
|
||||
on Intel)
|
||||
|
||||
Optional Packages:
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||
--with-cross-config=f supply configuration for a cross compiler
|
||||
--with-system-boehm Deprecated! See --enable-boehm
|
||||
--with-gmp=args supply arguments for configuring GMP library
|
||||
--with-system-gmp use already installed GMP library (default=auto)
|
||||
--with-__thread Enable __thread thread-local variables (supported by
|
||||
NPTL-aware glibc and maybe Windows)
|
||||
--with-cxx build ECL using C++ compiler (default=NO)
|
||||
--with-tcp include socket interface (default=NO)
|
||||
--with-clx include CLX library (default=NO)
|
||||
--with-clos-streams user defined stream objects (default=YES)
|
||||
--with-cmuformat use CMUCL's FORMAT routine (default=YES)
|
||||
--with-asdf include ASDF building facility (default=YES if
|
||||
shared library support is on)
|
||||
--with-cmp build in the compiler (default=YES)
|
||||
--with-x use the X Window System
|
||||
--with-gmp=args
|
||||
with_gmp=""supply arguments for configuring GMP library
|
||||
|
||||
Some influential environment variables:
|
||||
CC C compiler command
|
||||
CFLAGS C compiler flags
|
||||
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
|
||||
nonstandard directory <lib dir>
|
||||
CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
|
||||
headers in a nonstandard directory <include dir>
|
||||
|
||||
--with-system-gmp use already installed GMP library (default=auto)
|
||||
# Check whether --with-system-gmp or --without-system-gmp was given.
|
||||
if test "${with_system_gmp+set}" = set; then
|
||||
withval="$with_system_gmp"
|
||||
|
||||
else
|
||||
with_system_gmp="auto"
|
||||
fi;
|
||||
|
||||
--enable-local-gmp Deprecated! See --with-system-gmp
|
||||
# Check whether --enable-local-gmp or --disable-local-gmp was given.
|
||||
if test "${enable_local_gmp+set}" = set; then
|
||||
enableval="$enable_local_gmp"
|
||||
{ echo "$as_me:$LINENO: WARNING: --with-local-gmp is deprecated
|
||||
--with-x use the X Window System
|
||||
CXX C++ compiler command
|
||||
CXXFLAGS C++ compiler flags
|
||||
CPP C preprocessor
|
||||
|
||||
Use these variables to override the choices made by `configure' or to help
|
||||
it to find libraries and programs with nonstandard names/locations.
|
||||
|
||||
_ACEOF
|
||||
fi
|
||||
|
||||
|
|
@ -1447,33 +1419,24 @@ fi;
|
|||
# Check whether --with-gmp or --without-gmp was given.
|
||||
if test "${with_gmp+set}" = set; then
|
||||
withval="$with_gmp"
|
||||
|
||||
fi;
|
||||
|
||||
|
||||
# Check whether --with-system-gmp or --without-system-gmp was given.
|
||||
if test "${with_system_gmp+set}" = set; then
|
||||
withval="$with_system_gmp"
|
||||
|
||||
use --with-system-gmp instead!" >&5
|
||||
echo "$as_me: WARNING: --with-local-gmp is deprecated
|
||||
else
|
||||
with_system_gmp="auto"
|
||||
fi;
|
||||
|
||||
# Check whether --enable-local-gmp or --disable-local-gmp was given.
|
||||
if test "${enable_local_gmp+set}" = set; then
|
||||
enableval="$enable_local_gmp"
|
||||
{ echo "$as_me:$LINENO: WARNING: --with-local-gmp is deprecated, use --with-system-gmp instead!" >&5
|
||||
echo "$as_me: WARNING: --with-local-gmp is deprecated, use --with-system-gmp instead!" >&2;}
|
||||
use --with-system-gmp instead!" >&2;}
|
||||
with_system_gmp="${enableval}"
|
||||
fi;
|
||||
|
||||
|
||||
--with-__thread Enable __thread thread-local variables (supported by
|
||||
NPTL-aware glibc and maybe Windows)
|
||||
# Check whether --with-__thread or --without-__thread was given.
|
||||
if test "${with___thread+set}" = set; then
|
||||
withval="$with___thread"
|
||||
|
||||
fi;
|
||||
|
||||
--enable-opcode8 interpreter uses 8-bit codes (default=NO, only works
|
||||
on Intel)
|
||||
# Check whether --enable-opcode8 or --disable-opcode8 was given.
|
||||
if test "${enable_opcode8+set}" = set; then
|
||||
enableval="$enable_opcode8"
|
||||
|
|
@ -1483,6 +1446,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-cxx build ECL using C++ compiler (default=NO)
|
||||
# Check whether --with-cxx or --without-cxx was given.
|
||||
if test "${with_cxx+set}" = set; then
|
||||
withval="$with_cxx"
|
||||
|
|
@ -1492,6 +1456,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-tcp include socket interface (default=NO)
|
||||
# Check whether --with-tcp or --without-tcp was given.
|
||||
if test "${with_tcp+set}" = set; then
|
||||
withval="$with_tcp"
|
||||
|
|
@ -1501,6 +1466,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-clx include CLX library (default=NO)
|
||||
# Check whether --with-clx or --without-clx was given.
|
||||
if test "${with_clx+set}" = set; then
|
||||
withval="$with_clx"
|
||||
|
|
@ -1510,6 +1476,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-clos-streams user defined stream objects (default=YES)
|
||||
# Check whether --with-clos-streams or --without-clos-streams was given.
|
||||
if test "${with_clos_streams+set}" = set; then
|
||||
withval="$with_clos_streams"
|
||||
|
|
@ -1519,6 +1486,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-cmuformat use CMUCL's FORMAT routine (default=YES)
|
||||
# Check whether --with-cmuformat or --without-cmuformat was given.
|
||||
if test "${with_cmuformat+set}" = set; then
|
||||
withval="$with_cmuformat"
|
||||
|
|
@ -1528,6 +1496,8 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-asdf include ASDF building facility (default=YES if
|
||||
shared library support is on)
|
||||
# Check whether --with-asdf or --without-asdf was given.
|
||||
if test "${with_asdf+set}" = set; then
|
||||
withval="$with_asdf"
|
||||
|
|
@ -1537,6 +1507,7 @@ else
|
|||
fi;
|
||||
|
||||
|
||||
--with-cmp build in the compiler (default=YES)
|
||||
# Check whether --with-cmp or --without-cmp was given.
|
||||
if test "${with_cmp+set}" = set; then
|
||||
withval="$with_cmp"
|
||||
|
|
@ -1557,6 +1528,9 @@ SUBDIRS=c
|
|||
LSP_FEATURES='*features*'
|
||||
|
||||
|
||||
|
||||
System types:
|
||||
--build=BUILD configure for building on BUILD guessed
|
||||
# Make sure we can run config.sub.
|
||||
$ac_config_sub sun4 >/dev/null 2>&1 ||
|
||||
{ { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
|
||||
|
|
@ -1584,11 +1558,12 @@ fi
|
|||
echo "$as_me:$LINENO: result: $ac_cv_build" >&5
|
||||
echo "${ECHO_T}$ac_cv_build" >&6
|
||||
build=$ac_cv_build
|
||||
build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
||||
build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
||||
build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
build_cpu=`echo $ac_cv_build | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\1/'`
|
||||
build_vendor=`echo $ac_cv_build | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\2/'`
|
||||
build_os=`echo $ac_cv_build | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\3/'`
|
||||
|
||||
|
||||
--host=HOST cross-compile to build programs to run on HOST BUILD
|
||||
echo "$as_me:$LINENO: checking host system type" >&5
|
||||
echo $ECHO_N "checking host system type... $ECHO_C" >&6
|
||||
if test "${ac_cv_host+set}" = set; then
|
||||
|
|
@ -1606,9 +1581,9 @@ fi
|
|||
echo "$as_me:$LINENO: result: $ac_cv_host" >&5
|
||||
echo "${ECHO_T}$ac_cv_host" >&6
|
||||
host=$ac_cv_host
|
||||
host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
||||
host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
||||
host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
host_cpu=`echo $ac_cv_host | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\1/'`
|
||||
host_vendor=`echo $ac_cv_host | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\2/'`
|
||||
host_os=`echo $ac_cv_host | sed 's/^\(^-*\)-\(^-*\)-\(.*\)$/\3/'`
|
||||
|
||||
|
||||
|
||||
|
|
@ -1618,6 +1593,33 @@ ac_cpp='$CPP $CPPFLAGS'
|
|||
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||
|
||||
Some influential environment variables:
|
||||
|
||||
Use these variables to override the choices made by `configure' or to help
|
||||
it to find libraries and programs with nonstandard names/locations.
|
||||
CC C compiler command
|
||||
ac_env_CC_set=${CC+set}
|
||||
ac_env_CC_value=$CC
|
||||
ac_cv_env_CC_set=${CC+set}
|
||||
ac_cv_env_CC_value=$CC
|
||||
CFLAGS C compiler flags
|
||||
ac_env_CFLAGS_set=${CFLAGS+set}
|
||||
ac_env_CFLAGS_value=$CFLAGS
|
||||
ac_cv_env_CFLAGS_set=${CFLAGS+set}
|
||||
ac_cv_env_CFLAGS_value=$CFLAGS
|
||||
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
|
||||
nonstandard directory <lib dir>
|
||||
ac_env_LDFLAGS_set=${LDFLAGS+set}
|
||||
ac_env_LDFLAGS_value=$LDFLAGS
|
||||
ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
|
||||
ac_cv_env_LDFLAGS_value=$LDFLAGS
|
||||
CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
|
||||
headers in a nonstandard directory <include dir>
|
||||
ac_env_CPPFLAGS_set=${CPPFLAGS+set}
|
||||
ac_env_CPPFLAGS_value=$CPPFLAGS
|
||||
ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
|
||||
ac_cv_env_CPPFLAGS_value=$CPPFLAGS
|
||||
if test -n "$ac_tool_prefix"; then
|
||||
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}gcc; ac_word=$2
|
||||
|
|
@ -1970,7 +1972,7 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out"
|
|||
# of exeext.
|
||||
echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
|
||||
echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
|
||||
ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
|
||||
ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest^ *//'`
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
|
||||
(eval $ac_link_default) 2>&5
|
||||
ac_status=$?
|
||||
|
|
@ -1988,7 +1990,8 @@ for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
|
|||
do
|
||||
test -f "$ac_file" || continue
|
||||
case $ac_file in
|
||||
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
|
||||
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj
|
||||
fi;
|
||||
;;
|
||||
conftest.$ac_ext )
|
||||
# This is the source file.
|
||||
|
|
@ -4068,8 +4071,9 @@ _ACEOF
|
|||
fi
|
||||
|
||||
|
||||
if test ${with_system_gmp} = "auto"; then
|
||||
echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5
|
||||
if test "x${with_gmp}" != "xno"; then
|
||||
if test ${with_system_gmp} = "auto"; then
|
||||
echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5
|
||||
echo $ECHO_N "checking for __gmpz_init in -lgmp... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
|
|
@ -4139,10 +4143,10 @@ else
|
|||
with_system_gmp=no
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "${with_system_gmp}" = "yes"; then
|
||||
echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5
|
||||
if test "${with_system_gmp}" = "yes"; then
|
||||
echo "$as_me:$LINENO: checking for __gmpz_init in -lgmp" >&5
|
||||
echo $ECHO_N "checking for __gmpz_init in -lgmp... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
|
|
@ -4214,17 +4218,17 @@ echo "$as_me: error: System gmp library requested but not found." >&2;}
|
|||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
|
||||
else
|
||||
SUBDIRS="${SUBDIRS} gmp"
|
||||
CORE_LIBS="-leclgmp ${CORE_LIBS}"
|
||||
if test ${enable_shared} = "no"; then
|
||||
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgmp.${LIBEXT}"
|
||||
else
|
||||
SUBDIRS="${SUBDIRS} gmp"
|
||||
CORE_LIBS="-leclgmp ${CORE_LIBS}"
|
||||
if test ${enable_shared} = "no"; then
|
||||
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgmp.${LIBEXT}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking for X" >&5
|
||||
echo $ECHO_N "checking for X... $ECHO_C" >&6
|
||||
|
||||
|
|
@ -6190,6 +6194,71 @@ _ACEOF
|
|||
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking for long long int" >&5
|
||||
echo $ECHO_N "checking for long long int... $ECHO_C" >&6
|
||||
if test "${ac_cv_c_long_long+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
if test "$GCC" = yes; then
|
||||
ac_cv_c_long_long=yes
|
||||
else
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
/* confdefs.h. */
|
||||
_ACEOF
|
||||
cat confdefs.h >>conftest.$ac_ext
|
||||
cat >>conftest.$ac_ext <<_ACEOF
|
||||
/* end confdefs.h. */
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
long long int i;
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||
(eval $ac_compile) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest.$ac_objext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_c_long_long=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_cv_c_long_long=no
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
fi
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_c_long_long" >&5
|
||||
echo "${ECHO_T}$ac_cv_c_long_long" >&6
|
||||
if test $ac_cv_c_long_long = yes; then
|
||||
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_LONG_LONG 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
|
||||
|
|
@ -9672,9 +9741,19 @@ echo "$as_me: Configuring included Boehm GC library:" >&6;}
|
|||
fi
|
||||
fi
|
||||
|
||||
if test "${with_system_gmp}" = "no" ; then
|
||||
if test "${with_gmp}" = "no" ; then
|
||||
{ echo "$as_me:$LINENO: Not using GMP library at all. Are you sure?" >&5
|
||||
echo "$as_me: Not using GMP library at all. Are you sure?" >&6;}
|
||||
EXTRA_OBJS="${EXTRA_OBJS} big_ll.o"
|
||||
elif test "${with_system_gmp}" = "no" ; then
|
||||
{ echo "$as_me:$LINENO: Configuring included GMP library:" >&5
|
||||
echo "$as_me: Configuring included GMP library:" >&6;}
|
||||
EXTRA_OBJS="${EXTRA_OBJS} big.o"
|
||||
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define WITH_GMP 1
|
||||
_ACEOF
|
||||
|
||||
test -d gmp && rm -rf gmp
|
||||
if mkdir gmp; then
|
||||
(destdir=`${PWDCMD}`; cd gmp; CC="${CC} ${PICFLAG}" \
|
||||
|
|
|
|||
|
|
@ -64,7 +64,8 @@ AC_ARG_WITH(system-boehm,
|
|||
|
||||
AC_ARG_WITH(gmp,
|
||||
AS_HELP_STRING( [--with-gmp=args],
|
||||
[supply arguments for configuring GMP library]))
|
||||
[supply arguments for configuring GMP library]
|
||||
[], [with_gmp=""])
|
||||
|
||||
AC_ARG_WITH(system-gmp,
|
||||
AS_HELP_STRING( [--with-system-gmp],
|
||||
|
|
@ -261,23 +262,24 @@ fi
|
|||
|
||||
dnl ----------------------------------------------------------------------
|
||||
dnl GNU multiprecision library
|
||||
if test ${with_system_gmp} = "auto"; then
|
||||
AC_CHECK_LIB( [gmp], [__gmpz_init],
|
||||
[with_system_gmp=yes], [with_system_gmp=no] )
|
||||
fi
|
||||
|
||||
if test "${with_system_gmp}" = "yes"; then
|
||||
AC_CHECK_LIB( [gmp], [__gmpz_init],
|
||||
[FASL_LIBS="${FASL_LIBS} -lgmp"],
|
||||
[AC_MSG_ERROR([System gmp library requested but not found.])])
|
||||
else
|
||||
SUBDIRS="${SUBDIRS} gmp"
|
||||
CORE_LIBS="-leclgmp ${CORE_LIBS}"
|
||||
if test ${enable_shared} = "no"; then
|
||||
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgmp.${LIBEXT}"
|
||||
if test "x${with_gmp}" != "xno"; then
|
||||
if test ${with_system_gmp} = "auto"; then
|
||||
AC_CHECK_LIB( [gmp], [__gmpz_init],
|
||||
[with_system_gmp=yes], [with_system_gmp=no] )
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "${with_system_gmp}" = "yes"; then
|
||||
AC_CHECK_LIB( [gmp], [__gmpz_init],
|
||||
[FASL_LIBS="${FASL_LIBS} -lgmp"],
|
||||
[AC_MSG_ERROR([System gmp library requested but not found.])])
|
||||
else
|
||||
SUBDIRS="${SUBDIRS} gmp"
|
||||
CORE_LIBS="-leclgmp ${CORE_LIBS}"
|
||||
if test ${enable_shared} = "no"; then
|
||||
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgmp.${LIBEXT}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl =====================================================================
|
||||
dnl Checks for header files
|
||||
|
|
@ -306,6 +308,7 @@ AC_TYPE_SIZE_T dnl !!! DNLed
|
|||
AC_STRUCT_TM
|
||||
AC_C_VOLATILE
|
||||
AC_CHECK_TYPES([ptrdiff_t])
|
||||
AC_C_LONG_LONG
|
||||
dnl !!! end autoscan
|
||||
|
||||
dnl !!! dnled in original
|
||||
|
|
@ -446,8 +449,13 @@ fi
|
|||
|
||||
dnl ----------------------------------------------------------------------
|
||||
dnl Configure local GMP if needed
|
||||
if test "${with_system_gmp}" = "no" ; then
|
||||
if test "${with_gmp}" = "no" ; then
|
||||
AC_MSG_NOTICE(Not using GMP library at all. Are you sure?)
|
||||
EXTRA_OBJS="${EXTRA_OBJS} big_ll.o"
|
||||
elif test "${with_system_gmp}" = "no" ; then
|
||||
AC_MSG_NOTICE(Configuring included GMP library:)
|
||||
EXTRA_OBJS="${EXTRA_OBJS} big.o"
|
||||
AC_DEFINE( [WITH_GMP], [1], [Use GMP for bignums] )
|
||||
test -d gmp && rm -rf gmp
|
||||
if mkdir gmp; then
|
||||
(destdir=`${PWDCMD}`; cd gmp; CC="${CC} ${PICFLAG}" \
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@
|
|||
#define ECL_DYNAMIC_VV
|
||||
#endif
|
||||
|
||||
/* Use GNU Multiple Precision library for bignums */
|
||||
#undef WITH_GMP
|
||||
|
||||
/* Userland threads? */
|
||||
#undef ECL_THREADS
|
||||
|
||||
|
|
@ -191,6 +194,8 @@ typedef unsigned @CL_FIXNUM_TYPE@ cl_hashkey;
|
|||
#undef HAVE_SIGPROCMASK
|
||||
/* isatty() checks whether a file is connected to a */
|
||||
#undef HAVE_ISATTY
|
||||
/* compiler understands long long */
|
||||
#undef HAVE_LONG_LONG
|
||||
|
||||
/* what characters are used to mark beginning of new line */
|
||||
#undef ECL_NEWLINE_IS_CRLF
|
||||
|
|
|
|||
|
|
@ -53,7 +53,9 @@ typedef unsigned short uint16_t;
|
|||
# define end_critical_section()
|
||||
#endif
|
||||
|
||||
#ifdef WITH_GMP
|
||||
#include <gmp.h>
|
||||
#endif /* WITH_GMP */
|
||||
#include <object.h>
|
||||
#include <stacks.h>
|
||||
#include <external.h>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,9 @@ typedef unsigned short uint16_t;
|
|||
# define end_critical_section()
|
||||
#endif
|
||||
|
||||
#ifdef WITH_GMP
|
||||
#include <gmp.h>
|
||||
#endif /* WITH_GMP */
|
||||
#include <object.h>
|
||||
#include <stacks.h>
|
||||
#ifndef _ARGS
|
||||
|
|
|
|||
|
|
@ -92,7 +92,9 @@ struct cl_env_struct {
|
|||
/* Note: if you change the size of these registers, change also
|
||||
BIGNUM_REGISTER_SIZE in config.h */
|
||||
cl_object big_register[3];
|
||||
#ifdef WITH_GMP
|
||||
mp_limb_t big_register_limbs[3][16];
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
#ifdef ECL_THREADS
|
||||
cl_object own_process;
|
||||
|
|
@ -301,7 +303,11 @@ extern cl_object big_register_copy(cl_object x);
|
|||
extern cl_object big_register_normalize(cl_object x);
|
||||
extern void big_register_free(cl_object x);
|
||||
extern cl_object bignum1(cl_fixnum val);
|
||||
#ifdef WITH_GMP
|
||||
extern cl_object bignum2(mp_limb_t hi, mp_limb_t lo);
|
||||
#else /* WITH_GMP */
|
||||
extern cl_object bignum2(cl_fixnum hi, cl_fixnum lo);
|
||||
#endif /* WITH_GMP */
|
||||
extern cl_object big_set_fixnum(cl_object x, cl_object fix);
|
||||
extern cl_object big_copy(cl_object x);
|
||||
extern cl_object big_minus(cl_object x);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
See file '../Copyright' for full details.
|
||||
*/
|
||||
|
||||
#ifdef WITH_GMP
|
||||
#define big_odd_p(x) ((mpz_get_ui(x->big.big_num) & 1) != 0)
|
||||
#define big_even_p(x) ((mpz_get_ui(x->big.big_num) & 1) == 0)
|
||||
#define big_zerop(x) ((x)->big.big_size == 0)
|
||||
|
|
@ -25,3 +26,19 @@
|
|||
#define big_to_double(x) mpz_get_d(x->big.big_num)
|
||||
#define big_to_long(x) mpz_get_si(x->big.big_num)
|
||||
#define big_to_ulong(x) mpz_get_ui(x->big.big_num)
|
||||
#else /* WITH_GMP */
|
||||
extern int big_num_t_sgn(big_num_t x);
|
||||
#define big_odd_p(x) ((int)((x)->big.big_num&1) != 0)
|
||||
#define big_even_p(x) ((int)((x)->big.big_num&1) == 0)
|
||||
#define big_zerop(x) ((x)->big.big_num == (big_num_t)0)
|
||||
#define big_sign(x) big_num_t_sgn((x)->big.big_num)
|
||||
#define big_compare(x,y) big_num_t_sgn((x)->big.big_num - (y)->big.big_num)
|
||||
#define big_complement(x) ((x)->big.big_num = -((x)->big.big_num))
|
||||
#define big_add_ui(x, i) ((x)->big.big_num += (unsigned long)(i))
|
||||
#define big_mul_ui(x, i) ((x)->big.big_num *= (unsigned long)(i))
|
||||
#define big_set_ui(x, i) ((x)->big.big_num = ((big_num_t)((unsigned long int)i)))
|
||||
#define big_set_si(x, i) ((x)->big.big_num = ((big_num_t)((long int)i)))
|
||||
#define big_to_double(x) ((double)((x)->big.big_num))
|
||||
#define big_to_long(x) ((long int)((x)->big.big_num))
|
||||
#define big_to_ulong(x) ((unsigned long int)((x)->big.big_num))
|
||||
#endif /* WITH_GMP */
|
||||
|
|
|
|||
|
|
@ -92,6 +92,8 @@ struct ecl_longfloat {
|
|||
};
|
||||
#define lf(obje) (obje)->LF.LFVAL
|
||||
|
||||
#ifdef WITH_GMP
|
||||
|
||||
struct ecl_bignum {
|
||||
HEADER;
|
||||
mpz_t big_num;
|
||||
|
|
@ -100,6 +102,21 @@ struct ecl_bignum {
|
|||
#define big_size big_num->_mp_size
|
||||
#define big_limbs big_num->_mp_d
|
||||
|
||||
#else /* WITH_GMP */
|
||||
|
||||
# ifdef HAVE_LONG_LONG
|
||||
typedef long long int big_num_t;
|
||||
# else /* HAVE_LONG_LONG */
|
||||
typedef long int big_num_t; /* would it work? */
|
||||
# endif /* HAVE_LONG_LONG */
|
||||
|
||||
struct ecl_bignum {
|
||||
HEADER;
|
||||
big_num_t big_num;
|
||||
};
|
||||
|
||||
#endif /* WITH_GMP */
|
||||
|
||||
struct ecl_ratio {
|
||||
HEADER;
|
||||
cl_object den; /* denominator, must be an integer */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue