first patch to isolate GMP code.
This commit is contained in:
parent
902dafa906
commit
e8cbc5034e
261
C/gmp_support.c
Normal file
261
C/gmp_support.c
Normal file
@ -0,0 +1,261 @@
|
||||
/*************************************************************************
|
||||
* *
|
||||
* YAP Prolog *
|
||||
* *
|
||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||
* *
|
||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||
* *
|
||||
**************************************************************************
|
||||
* *
|
||||
* File: gmp_support.c *
|
||||
* Last rev: *
|
||||
* mods: *
|
||||
* comments: bignum code *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#include "Yap.h"
|
||||
#include "Heap.h"
|
||||
#include "eval.h"
|
||||
|
||||
#if USE_GMP
|
||||
|
||||
/* add i + j using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_add_ints(Int i, Int j, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new,i);
|
||||
if (j > 0) {
|
||||
mpz_add_ui(new, new, j);
|
||||
} else {
|
||||
if (j-1 > 0) { /* negative overflow */
|
||||
mpz_sub_ui(new, new, -(j+1));
|
||||
mpz_sub_ui(new, new, 1);
|
||||
} else {
|
||||
mpz_sub_ui(new, new, -j);
|
||||
}
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_sub_ints(Int i, Int j, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new,i);
|
||||
if (j > 0) {
|
||||
mpz_sub_ui(new, new, j);
|
||||
} else {
|
||||
if (j-1 > 0) { /* negative overflow */
|
||||
mpz_add_ui(new, new, -(j+1));
|
||||
mpz_add_ui(new, new, 1);
|
||||
} else {
|
||||
mpz_add_ui(new, new, -j);
|
||||
}
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_mul_ints(Int i, Int j, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new,i);
|
||||
mpz_mul_si(new, new, j);
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_sll_ints(Int i, Int j, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new,i);
|
||||
mpz_mul_2exp(new, new, j);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* add i + b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_add_int_big(Int i, MP_INT *b, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_add(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* sub i - b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_sub_int_big(Int i, MP_INT *b, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_sub(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* add i + b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_mul_int_big(Int i, MP_INT *b, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_mul(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* sub i - b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_sub_big_int(MP_INT *b, Int i, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_neg(new, new);
|
||||
mpz_add(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* div i / b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_div_big_int(MP_INT *b, Int i, MP_INT *new)
|
||||
{
|
||||
|
||||
mpz_init_set(new, b);
|
||||
if (yap_flags[INTEGER_ROUNDING_FLAG] == 0) {
|
||||
if (i > 0) {
|
||||
mpz_fdiv_q_ui(new, new, i);
|
||||
} else if (i == 0) {
|
||||
Yap_Error(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2");
|
||||
return NULL;
|
||||
} else {
|
||||
/* we do not handle MIN_INT */
|
||||
mpz_fdiv_q_ui(new, new, -i);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
} else {
|
||||
if (i > 0) {
|
||||
mpz_tdiv_q_ui(new, new, i);
|
||||
} else if (i == 0) {
|
||||
Yap_Error(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2");
|
||||
return NULL;
|
||||
} else {
|
||||
/* we do not handle MIN_INT */
|
||||
mpz_tdiv_q_ui(new, new, -i);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
/* sub i - b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_and_int_big(Int i, MP_INT *b, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_and(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* sub i - b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_ior_int_big(Int i, MP_INT *b, MP_INT *new)
|
||||
{
|
||||
mpz_init_set_si(new, i);
|
||||
mpz_ior(new, new, b);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* add i + b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_sll_big_int(MP_INT *b, Int i, MP_INT *new)
|
||||
{
|
||||
if (i > 0) {
|
||||
mpz_init_set(new, b);
|
||||
mpz_mul_2exp(new, new, i);
|
||||
} else if (i == 0) {
|
||||
mpz_init_set(new, b);
|
||||
} else {
|
||||
mpz_init_set(new, b);
|
||||
if (i == Int_MIN) {
|
||||
return NULL;
|
||||
}
|
||||
mpz_tdiv_q_2exp(new, new, -i);
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_add_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
mpz_init_set(new, b1);
|
||||
mpz_add(new, new, b2);
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_sub_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
mpz_init_set(new, b1);
|
||||
mpz_sub(new, new, b2);
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_mul_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
mpz_init_set(new, b1);
|
||||
mpz_mul(new, new, b2);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* div i / b using temporary bigint new */
|
||||
MP_INT *
|
||||
Yap_gmp_div_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
|
||||
mpz_init_set(new, b1);
|
||||
if (yap_flags[INTEGER_ROUNDING_FLAG] == 0) {
|
||||
mpz_fdiv_q(new, new, b2);
|
||||
} else {
|
||||
mpz_tdiv_q(new, new, b2);
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_and_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
mpz_init_set(new, b1);
|
||||
mpz_and(new, new, b2);
|
||||
return new;
|
||||
}
|
||||
|
||||
MP_INT *
|
||||
Yap_gmp_ior_big_big(MP_INT *b1, MP_INT *b2, MP_INT *new)
|
||||
{
|
||||
mpz_init_set(new, b1);
|
||||
mpz_ior(new, new, b2);
|
||||
return new;
|
||||
}
|
||||
|
||||
Float
|
||||
Yap_gmp_add_float_big(Float d, MP_INT *b)
|
||||
{
|
||||
return d+mpz_get_d(b);
|
||||
}
|
||||
|
||||
Float
|
||||
Yap_gmp_sub_float_big(Float d, MP_INT *b)
|
||||
{
|
||||
return d-mpz_get_d(b);
|
||||
}
|
||||
|
||||
Float
|
||||
Yap_gmp_sub_big_float(MP_INT *b, Float d)
|
||||
{
|
||||
return mpz_get_d(b)-d;
|
||||
}
|
||||
|
||||
Float
|
||||
Yap_gmp_mul_float_big(Float d, MP_INT *b)
|
||||
{
|
||||
return d*mpz_get_d(b);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
389
H/arith2.h
389
H/arith2.h
@ -23,22 +23,34 @@ inline static E_FUNC
|
||||
add_int(Int i, Int j E_ARGS)
|
||||
{
|
||||
Int x = i+j;
|
||||
/* Integer overflow, we need to use big integers */
|
||||
#if USE_GMP
|
||||
if (((i^j) >= 0 && (i^x) < 0 ) ||
|
||||
j == Int_MIN) {
|
||||
/* Integer overflow, we need to use big integers */
|
||||
Int overflow = (i & j & ~x) | (~i & ~j & x);
|
||||
if (overflow) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
new = Yap_gmp_add_ints(i, j, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
#ifdef BEAM
|
||||
RINT(x);
|
||||
return( MkIntegerTerm (x));
|
||||
#else
|
||||
RINT(x);
|
||||
#endif
|
||||
}
|
||||
|
||||
mpz_init_set_si(new,i);
|
||||
if (j > 0) {
|
||||
mpz_add_ui(new, new, j);
|
||||
RBIG(new);
|
||||
} else {
|
||||
unsigned long u = -(j+1);
|
||||
u++;
|
||||
mpz_sub_ui(new, new, u);
|
||||
RBIG(new);
|
||||
}
|
||||
inline static E_FUNC
|
||||
sub_int(Int i, Int j E_ARGS)
|
||||
{
|
||||
Int x = i-j;
|
||||
#if USE_GMP
|
||||
Int overflow = (i & ~j & ~x) | (~i & j & x);
|
||||
/* Integer overflow, we need to use big integers */
|
||||
if (overflow) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
new = Yap_gmp_sub_ints(i, j, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
#ifdef BEAM
|
||||
@ -78,18 +90,9 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
{
|
||||
Int i1 = IntegerOfTerm(t1);
|
||||
MP_INT *l2 = Yap_BigIntOfTerm(t2);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l2);
|
||||
if (i1 > 0) {
|
||||
mpz_add_ui(new, new, i1);
|
||||
} else if (i1 < 0) {
|
||||
unsigned long u1 = -(i1+1);
|
||||
u1++;
|
||||
mpz_sub_ui(new, new, u1);
|
||||
}
|
||||
new = Yap_gmp_add_int_big(IntegerOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -111,7 +114,7 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
RFLOAT(FloatOfTerm(t1)+FloatOfTerm(t2));
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
RFLOAT(FloatOfTerm(t1)+mpz_get_d(Yap_BigIntOfTerm(t2)));
|
||||
RFLOAT(Yap_gmp_add_float_big(FloatOfTerm(t1),Yap_BigIntOfTerm(t2)));
|
||||
#endif
|
||||
default:
|
||||
/* we've got a full term, need to evaluate it first */
|
||||
@ -127,18 +130,9 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *l1 = Yap_BigIntOfTerm(t1);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new,l1);
|
||||
if (i2 > 0) {
|
||||
mpz_add_ui(new, new, i2);
|
||||
} else if (i2 < 0) {
|
||||
unsigned long u2 = -(i2+1);
|
||||
u2++;
|
||||
mpz_sub_ui(new, l1, u2);
|
||||
}
|
||||
new = Yap_gmp_add_int_big(IntegerOfTerm(t2), Yap_BigIntOfTerm(t1), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
@ -146,12 +140,11 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
mpz_add(new, new, Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_add_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
RFLOAT(mpz_get_d(Yap_BigIntOfTerm(t1))+FloatOfTerm(t2));
|
||||
RFLOAT(Yap_gmp_add_float_big(FloatOfTerm(t2),Yap_BigIntOfTerm(t1)));
|
||||
default:
|
||||
/* we've got a full term, need to evaluate it first */
|
||||
mpz_init_set(v1.big, Yap_BigIntOfTerm(t1));
|
||||
@ -181,14 +174,7 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v2.big);
|
||||
if (v1.Int > 0) {
|
||||
mpz_add_ui(new, new, v1.Int);
|
||||
} else if (v1.Int < 0) {
|
||||
unsigned long u1 = -(v1.Int+1);
|
||||
u1++;
|
||||
mpz_sub_ui(new, new, u1);
|
||||
}
|
||||
new = Yap_gmp_add_int_big(v1.Int, v2.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -207,7 +193,7 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
/* float * float */
|
||||
RFLOAT(v1.dbl+mpz_get_d(v2.big));
|
||||
RFLOAT(Yap_gmp_add_float_big(v1.dbl, v2.big));
|
||||
mpz_clear(v2.big);
|
||||
#endif
|
||||
default:
|
||||
@ -221,21 +207,13 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
/* big * integer */
|
||||
if (v2.Int > 0) {
|
||||
mpz_add_ui(new, new, v2.Int);
|
||||
} else if (v2.Int < 0) {
|
||||
unsigned long u2 = -(v2.Int+1);
|
||||
u2++;
|
||||
mpz_sub_ui(new, new, u2);
|
||||
}
|
||||
new = Yap_gmp_add_int_big(v2.Int, v1.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
/* big * float */
|
||||
{
|
||||
Float dbl = mpz_get_d(v1.big)+v2.dbl;
|
||||
Float dbl = Yap_gmp_add_float_big(v2.dbl, v1.big);
|
||||
mpz_clear(v1.big);
|
||||
RFLOAT(dbl);
|
||||
}
|
||||
@ -244,8 +222,7 @@ p_plus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_add(new, new, v2.big);
|
||||
new = Yap_gmp_add_big_big(v1.big, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -278,28 +255,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
/* two integers */
|
||||
{
|
||||
Term sub = IntegerOfTerm(t2);
|
||||
#ifdef USE_GMP
|
||||
if (sub == Int_MIN) {
|
||||
Int i1 = IntegerOfTerm(t1);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new, sub);
|
||||
if (i1 > 0) {
|
||||
mpz_neg(new, new);
|
||||
mpz_add_ui(new, new, i1);
|
||||
} else {
|
||||
unsigned long u1 = -(i1+1);
|
||||
u1++;
|
||||
mpz_add_ui(new, new, u1);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
RBIG(new);
|
||||
} else
|
||||
#endif
|
||||
return add_int(IntegerOfTerm(t1), -sub USE_E_ARGS);
|
||||
}
|
||||
return sub_int(IntegerOfTerm(t1), IntegerOfTerm(t2) USE_E_ARGS);
|
||||
case double_e:
|
||||
{
|
||||
/* integer, double */
|
||||
@ -310,21 +266,9 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
{
|
||||
Int i1 = IntegerOfTerm(t1);
|
||||
MP_INT *l2 = Yap_BigIntOfTerm(t2);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l2);
|
||||
if (i1 > 0) {
|
||||
mpz_ui_sub(new, i1, new);
|
||||
} else if (i1 == 0) {
|
||||
mpz_neg(new, new);
|
||||
} else {
|
||||
unsigned long u1 = -(i1+1);
|
||||
u1++;
|
||||
mpz_add_ui(new, new, u1);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
new = Yap_gmp_sub_int_big(IntegerOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -349,7 +293,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
{
|
||||
RFLOAT(FloatOfTerm(t1)-mpz_get_d(Yap_BigIntOfTerm(t2)));
|
||||
RFLOAT(Yap_gmp_sub_float_big(FloatOfTerm(t1),Yap_BigIntOfTerm(t2)));
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
@ -366,18 +310,9 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *l1 = Yap_BigIntOfTerm(t1);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
if (i2 > 0) {
|
||||
mpz_sub_ui(new, new, i2);
|
||||
} else if (i2 < 0) {
|
||||
unsigned long u2 = -(i2+1);
|
||||
u2++;
|
||||
mpz_add_ui(new, new, u2);
|
||||
}
|
||||
new = Yap_gmp_sub_big_int(Yap_BigIntOfTerm(t1), IntegerOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
@ -385,13 +320,12 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
mpz_sub(new, new, Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_sub_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
{
|
||||
RFLOAT(mpz_get_d(Yap_BigIntOfTerm(t1))-FloatOfTerm(t2));
|
||||
RFLOAT(Yap_gmp_sub_big_float(Yap_BigIntOfTerm(t1),FloatOfTerm(t2)));
|
||||
}
|
||||
default:
|
||||
/* we've got a full term, need to evaluate it first */
|
||||
@ -413,24 +347,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
switch (bt2) {
|
||||
case long_int_e:
|
||||
/* two integers */
|
||||
#ifdef USE_GMP
|
||||
if (v2.Int == Int_MIN) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new, v2.Int);
|
||||
if (v1.Int > 0) {
|
||||
mpz_neg(new, new);
|
||||
mpz_add_ui(new, new, v1.Int);
|
||||
} else {
|
||||
if (v1.Int == Int_MIN)
|
||||
mpz_set_ui(new, 0);
|
||||
else if (v1.Int < 0)
|
||||
mpz_add_ui(new, new, -v1.Int);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
RBIG(new);
|
||||
} else
|
||||
#endif
|
||||
return(add_int(v1.Int, -v2.Int USE_E_ARGS));
|
||||
return sub_int(v1.Int, v2.Int USE_E_ARGS);
|
||||
case double_e:
|
||||
{
|
||||
/* integer, double */
|
||||
@ -441,19 +358,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v2.big);
|
||||
if (v1.Int > 0) {
|
||||
mpz_ui_sub(new, v1.Int, v2.big);
|
||||
} else if (v1.Int == 0) {
|
||||
mpz_neg(new, new);
|
||||
} else {
|
||||
unsigned long int u1;
|
||||
|
||||
u1 = -(v1.Int+1);
|
||||
u1++;
|
||||
mpz_add_ui(new, new, u1);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
new = Yap_gmp_sub_int_big(v1.Int, v2.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -473,7 +378,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
case big_int_e:
|
||||
/* float * float */
|
||||
{
|
||||
Float flt = v1.dbl-mpz_get_d(v2.big);
|
||||
Float flt = Yap_gmp_sub_float_big(v1.dbl,v2.big);
|
||||
|
||||
mpz_clear(v2.big);
|
||||
RFLOAT(flt);
|
||||
@ -490,23 +395,13 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
/* big - integer */
|
||||
if (v2.Int > 0) {
|
||||
mpz_sub_ui(new, new, v2.Int);
|
||||
} else if (v2.Int < 0) {
|
||||
unsigned long int u2;
|
||||
|
||||
u2 = -(v2.Int+1);
|
||||
u2++;
|
||||
mpz_add_ui(new, new, u2);
|
||||
}
|
||||
new = Yap_gmp_sub_big_int(v1.big, v2.Int, new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
/* big * float */
|
||||
{
|
||||
Float flt = mpz_get_d(v1.big)-v2.dbl;
|
||||
Float flt = Yap_gmp_sub_big_float(v1.big,v2.dbl);
|
||||
|
||||
mpz_clear(v1.big);
|
||||
RFLOAT(flt);
|
||||
@ -516,9 +411,7 @@ p_minus(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_sub(new, new, v2.big);
|
||||
mpz_clear(v2.big);
|
||||
new = Yap_gmp_sub_big_big(v1.big, v2.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
default:
|
||||
@ -561,17 +454,9 @@ times_int(Int i1, Int i2 E_ARGS) {
|
||||
overflow:
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new,i1);
|
||||
if (i2 > 0) {
|
||||
mpz_mul_ui(new, new, i2);
|
||||
RBIG(new);
|
||||
} else {
|
||||
unsigned long int u2 = -(i2-1);
|
||||
u2++;
|
||||
mpz_mul_ui(new, new, u2);
|
||||
mpz_neg(new, new);
|
||||
RBIG(new);
|
||||
}
|
||||
|
||||
new = Yap_gmp_mul_ints(i1, i2, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#else
|
||||
RINT(i1*i2);
|
||||
@ -607,12 +492,9 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
{
|
||||
Int i1 = IntegerOfTerm(t1);
|
||||
MP_INT *l2 = Yap_BigIntOfTerm(t2);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l2);
|
||||
mpz_mul_si(new, new, i1);
|
||||
new = Yap_gmp_mul_int_big(IntegerOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -637,7 +519,7 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
#ifdef USE_GMP
|
||||
case big_int_e:
|
||||
{
|
||||
RFLOAT(FloatOfTerm(t1)*mpz_get_d(Yap_BigIntOfTerm(t2)));
|
||||
RFLOAT(Yap_gmp_mul_float_big(FloatOfTerm(t1),Yap_BigIntOfTerm(t2)));
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
@ -654,12 +536,9 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *l1 = Yap_BigIntOfTerm(t1);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
mpz_mul_si(new, new, i2);
|
||||
new = Yap_gmp_mul_int_big(IntegerOfTerm(t2), Yap_BigIntOfTerm(t1), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
@ -667,13 +546,12 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
mpz_mul(new, new, Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_mul_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
{
|
||||
RFLOAT(mpz_get_d(Yap_BigIntOfTerm(t1))*FloatOfTerm(t2));
|
||||
RFLOAT(Yap_gmp_mul_float_big(FloatOfTerm(t2),Yap_BigIntOfTerm(t1)));
|
||||
}
|
||||
default:
|
||||
/* We've got a full term, need to evaluate it first */
|
||||
@ -706,8 +584,7 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v2.big);
|
||||
mpz_mul_si(new, new, v1.Int);
|
||||
new = Yap_gmp_mul_int_big(v1.Int, v2.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -727,7 +604,7 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
case big_int_e:
|
||||
/* float * float */
|
||||
{
|
||||
Float flt = v1.dbl*mpz_get_d(v2.big);
|
||||
Float flt = Yap_gmp_mul_float_big(v1.dbl, v2.big);
|
||||
|
||||
mpz_clear(v2.big);
|
||||
RFLOAT(flt);
|
||||
@ -744,15 +621,13 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
/* big * integer */
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_mul_si(new, new, v2.Int);
|
||||
new = Yap_gmp_mul_int_big(v2.Int, v1.big, new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
/* big * float */
|
||||
{
|
||||
Float dbl = mpz_get_d(v1.big)*v2.dbl;
|
||||
Float dbl = Yap_gmp_mul_float_big(v2.dbl, v1.big);
|
||||
mpz_clear(v1.big);
|
||||
RFLOAT(dbl);
|
||||
}
|
||||
@ -760,9 +635,7 @@ p_times(Term t1, Term t2 E_ARGS)
|
||||
/* big * big */
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_mul(new, new, v2.big);
|
||||
new = Yap_gmp_mul_big_big(v1.big, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -834,33 +707,22 @@ p_div(Term t1, Term t2 E_ARGS)
|
||||
case long_int_e:
|
||||
/* dividing a bignum by an integer */
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
if (i2 > 0) {
|
||||
mpz_tdiv_q_ui(new, new, i2);
|
||||
RBIG(new);
|
||||
} else if (i2 == 0) {
|
||||
Yap_Error(EVALUATION_ERROR_ZERO_DIVISOR, t2, "// /2");
|
||||
new = Yap_gmp_div_big_int(Yap_BigIntOfTerm(t1), IntegerOfTerm(t2), new);
|
||||
if (!new) {
|
||||
/* make GCC happy */
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
} else {
|
||||
unsigned long int u2 = -(i2-1);
|
||||
u2++;
|
||||
mpz_tdiv_q_ui(new, new, u2);
|
||||
mpz_neg(new, new);
|
||||
RBIG(new);
|
||||
}
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
/* two bignums */
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init(new);
|
||||
mpz_tdiv_q(new, Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_div_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
@ -921,18 +783,11 @@ p_div(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
if (v2.Int > 0) {
|
||||
mpz_tdiv_q_ui(new, new, v2.Int);
|
||||
} else if (v2.Int == 0) {
|
||||
mpz_clear(new);
|
||||
Yap_Error(EVALUATION_ERROR_ZERO_DIVISOR, t2, "// /2");
|
||||
new = Yap_gmp_div_big_int(v1.big, v2.Int, new);
|
||||
if (!new) {
|
||||
/* make GCC happy */
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
} else {
|
||||
mpz_tdiv_q_ui(new, new, -v2.Int);
|
||||
mpz_neg(new, new);
|
||||
}
|
||||
RBIG(new);
|
||||
}
|
||||
@ -947,8 +802,7 @@ p_div(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_tdiv_q(new, new, v2.big);
|
||||
new = Yap_gmp_div_big_big(v1.big, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -989,8 +843,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
case big_int_e:
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new, IntegerOfTerm(t1));
|
||||
mpz_and(new, new, Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_and_int_big(IntegerOfTerm(t1),Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -1014,8 +867,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
/* anding a bignum with an integer is easy */
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new, IntegerOfTerm(t2));
|
||||
mpz_and(new, new, Yap_BigIntOfTerm(t1));
|
||||
new = Yap_gmp_and_int_big(IntegerOfTerm(t2),Yap_BigIntOfTerm(t1), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
@ -1023,8 +875,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
mpz_and(new, new, Yap_BigIntOfTerm(t2));
|
||||
new = Yap_gmp_and_big_big(Yap_BigIntOfTerm(t2), Yap_BigIntOfTerm(t1), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
@ -1061,8 +912,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
case big_int_e:
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new, v1.Int);
|
||||
mpz_and(new, new, v2.big);
|
||||
new = Yap_gmp_and_int_big(v1.Int, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1087,8 +937,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
/* anding a bignum with an integer is easy */
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
mpz_init_set_si(new, v2.Int);
|
||||
mpz_and(new, new, v1.big);
|
||||
new = Yap_gmp_and_int_big(v2.Int, v1.big, new);
|
||||
mpz_clear(v1.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1103,8 +952,7 @@ p_and(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_and(new, new, v2.big);
|
||||
new = Yap_gmp_and_big_big(v1.big, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1146,8 +994,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new, IntegerOfTerm(t1));
|
||||
mpz_ior(new, new, Yap_BigIntOfTerm(t2));
|
||||
Yap_gmp_ior_int_big(IntegerOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -1171,8 +1018,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new,IntegerOfTerm(t2));
|
||||
mpz_ior(new, Yap_BigIntOfTerm(t1), new);
|
||||
Yap_gmp_ior_int_big(IntegerOfTerm(t2), Yap_BigIntOfTerm(t1), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
@ -1180,8 +1026,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, Yap_BigIntOfTerm(t1));
|
||||
mpz_ior(new, new, Yap_BigIntOfTerm(t2));
|
||||
Yap_gmp_ior_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2), new);
|
||||
RBIG(new);
|
||||
}
|
||||
case double_e:
|
||||
@ -1219,8 +1064,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new,v1.Int);
|
||||
mpz_ior(new, new, v2.big);
|
||||
Yap_gmp_ior_int_big(v1.Int, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1241,8 +1085,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new, v2.Int);
|
||||
mpz_ior(new, v1.big, new);
|
||||
Yap_gmp_ior_int_big(v2.Int, v1.big, new);
|
||||
mpz_clear(v1.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1257,8 +1100,7 @@ p_or(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
mpz_ior(new, new, v2.big);
|
||||
Yap_gmp_ior_big_big(v1.big, v2.big, new);
|
||||
mpz_clear(v2.big);
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1292,8 +1134,7 @@ do_sll(Int i, Int j E_ARGS)
|
||||
sll_ovflw(x,i)) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set_si(new,i);
|
||||
mpz_mul_2exp(new, new, j);
|
||||
new = Yap_gmp_sll_ints(i, j, new);
|
||||
RBIG(new);
|
||||
}
|
||||
#endif
|
||||
@ -1358,32 +1199,14 @@ p_sll(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *l1 = Yap_BigIntOfTerm(t1);
|
||||
|
||||
if (i2 > 0) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
mpz_mul_2exp(new, new, i2);
|
||||
RBIG(new);
|
||||
} else if (i2 == 0) {
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
RBIG(new);
|
||||
} else {
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
if (i2 == Int_MIN) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, t2, ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
mpz_tdiv_q_2exp(new, new, -i2);
|
||||
RBIG(new);
|
||||
MP_INT *new = TMP_BIG();
|
||||
new = Yap_gmp_sll_big_int(Yap_BigIntOfTerm(t1), IntegerOfTerm(t2), new);
|
||||
if (!new) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, t2, ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
RBIG(new);
|
||||
}
|
||||
case big_int_e:
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, t2, "<</2");
|
||||
@ -1454,16 +1277,11 @@ p_sll(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
MPZ_SET(new, v1.big);
|
||||
if (v2.Int > 0) {
|
||||
mpz_mul_2exp(new, new, v2.Int);
|
||||
} else if (v2.Int < 0) {
|
||||
if (v2.Int == Int_MIN) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, MkIntegerTerm(v2.Int), ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
mpz_tdiv_q_2exp(v1.big, v1.big, -v2.Int);
|
||||
new = Yap_gmp_sll_big_int(v1.big, v2.Int, new);
|
||||
if (!new) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, MkIntegerTerm(v2.Int), ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1551,20 +1369,13 @@ p_slr(Term t1, Term t2 E_ARGS)
|
||||
switch (BlobOfFunctor(f2)) {
|
||||
case long_int_e:
|
||||
{
|
||||
Int i2 = IntegerOfTerm(t2);
|
||||
MP_INT *l1 = Yap_BigIntOfTerm(t1);
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
mpz_init_set(new, l1);
|
||||
if (i2 > 0) {
|
||||
mpz_tdiv_q_2exp(new, new, i2);
|
||||
} else if (i2 < 0) {
|
||||
if (i2 == Int_MIN) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, t2, ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
mpz_mul_2exp(new, new, -i2);
|
||||
new = Yap_gmp_sll_big_int(Yap_BigIntOfTerm(t1), -IntegerOfTerm(t2), new);
|
||||
if (!new) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, t2, ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
RBIG(new);
|
||||
}
|
||||
@ -1636,6 +1447,12 @@ p_slr(Term t1, Term t2 E_ARGS)
|
||||
{
|
||||
MP_INT *new = TMP_BIG();
|
||||
|
||||
new = Yap_gmp_sll_big_int(v1.big, -v2.Int, new);
|
||||
if (!new) {
|
||||
Yap_Error(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, MkIntegerTerm(v2.Int), ">>/2");
|
||||
P = (yamop *)FAILCODE;
|
||||
RERROR();
|
||||
}
|
||||
MPZ_SET(new, v1.big);
|
||||
if (v2.Int > 0) {
|
||||
mpz_tdiv_q_2exp(new, new, v2.Int);
|
||||
|
28
H/eval.h
28
H/eval.h
@ -99,3 +99,31 @@ int STD_PROTO(Yap_ReInitUnaryExps,(void));
|
||||
int STD_PROTO(Yap_ReInitBinaryExps,(void));
|
||||
|
||||
blob_type STD_PROTO(Yap_Eval,(Term, union arith_ret *));
|
||||
|
||||
#if USE_GMP
|
||||
MP_INT *STD_PROTO(Yap_gmp_add_ints,(Int, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sub_ints,(Int, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_mul_ints,(Int, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sll_ints,(Int, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_add_int_big,(Int, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sub_int_big,(Int, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sub_big_int,(MP_INT *, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_mul_int_big,(Int, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_div_big_int,(MP_INT *, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_and_int_big,(Int, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_ior_int_big,(Int, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sll_big_int,(MP_INT *, Int, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_add_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_sub_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_mul_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_div_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_and_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
MP_INT *STD_PROTO(Yap_gmp_ior_big_big,(MP_INT *, MP_INT *, MP_INT *));
|
||||
|
||||
|
||||
|
||||
Float STD_PROTO(Yap_gmp_add_float_big,(Float, MP_INT *));
|
||||
Float STD_PROTO(Yap_gmp_sub_float_big,(Float, MP_INT *));
|
||||
Float STD_PROTO(Yap_gmp_sub_big_float,(MP_INT *, Float));
|
||||
Float STD_PROTO(Yap_gmp_mul_float_big,(Float, MP_INT *));
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user