more bigint and dbterm fixes.

This commit is contained in:
Vítor Santos Costa
2010-12-16 22:21:46 +00:00
parent 5a2d908489
commit cfe0dda995
11 changed files with 198 additions and 105 deletions

View File

@@ -4261,17 +4261,17 @@ Yap_absmi(int inp)
ENDD(d0);
ENDOp();
Op(get_bigint, xB);
Op(get_bigint, xN);
#ifdef USE_GMP
BEGD(d0);
d0 = XREG(PREG->u.xB.x);
d0 = XREG(PREG->u.xN.x);
deref_head(d0, gbigint_unk);
gbigint_nonvar:
if (!IsApplTerm(d0))
FAIL();
/* we have met a preexisting bigint */
START_PREFETCH(xB);
START_PREFETCH(xN);
BEGP(pt0);
pt0 = RepAppl(d0);
/* check functor */
@@ -4279,9 +4279,9 @@ Yap_absmi(int inp)
{
FAIL();
}
if (Yap_gmp_tcmp_big_big(d0,PREG->u.xB.b))
if (Yap_gmp_tcmp_big_big(d0,PREG->u.xN.b))
FAIL();
PREG = NEXTOP(PREG, xB);
PREG = NEXTOP(PREG, xN);
ENDP(pt0);
/* enter read mode */
GONext();
@@ -4291,10 +4291,10 @@ Yap_absmi(int inp)
deref_body(d0, pt0, gbigint_unk, gbigint_nonvar);
/* Enter Write mode */
/* set d1 to be the new structure we are going to create */
START_PREFETCH(xB);
START_PREFETCH(xN);
BEGD(d1);
d1 = PREG->u.xB.b;
PREG = NEXTOP(PREG, xB);
d1 = PREG->u.xN.b;
PREG = NEXTOP(PREG, xN);
BIND(pt0, d1, bind_gbigint);
#ifdef COROUTINING
DO_TRAIL(pt0, d1);
@@ -6347,7 +6347,7 @@ Yap_absmi(int inp)
GONext();
ENDOp();
Op(unify_bigint, oB);
Op(unify_bigint, oN);
#ifdef USE_GMP
BEGD(d0);
BEGP(pt0);
@@ -6368,16 +6368,16 @@ Yap_absmi(int inp)
FAIL();
}
ENDD(d1);
if (Yap_gmp_tcmp_big_big(d0,PREG->u.oB.b))
if (Yap_gmp_tcmp_big_big(d0,PREG->u.oN.b))
FAIL();
PREG = NEXTOP(PREG, oB);
PREG = NEXTOP(PREG, oN);
ENDP(pt0);
GONext();
derefa_body(d0, pt0, ubigint_unk, ubigint_nonvar);
BEGD(d1);
d1 = PREG->u.oB.b;
PREG = NEXTOP(PREG, oB);
d1 = PREG->u.oN.b;
PREG = NEXTOP(PREG, oN);
BIND_GLOBAL(pt0, d1, bind_ubigint);
#ifdef COROUTINING
DO_TRAIL(pt0, d1);
@@ -6393,7 +6393,7 @@ Yap_absmi(int inp)
#endif
ENDOp();
Op(unify_l_bigint, oB);
Op(unify_l_bigint, oN);
#ifdef USE_GMP
BEGD(d0);
CACHE_S();
@@ -6413,16 +6413,16 @@ Yap_absmi(int inp)
FAIL();
}
ENDD(d0);
if (Yap_gmp_tcmp_big_big(d0,PREG->u.oB.b))
if (Yap_gmp_tcmp_big_big(d0,PREG->u.oN.b))
FAIL();
PREG = NEXTOP(PREG, oB);
PREG = NEXTOP(PREG, oN);
ENDP(pt0);
GONext();
derefa_body(d0, S_SREG, ulbigint_unk, ulbigint_nonvar);
BEGD(d1);
d1 = PREG->u.oB.b;
PREG = NEXTOP(PREG, oB);
d1 = PREG->u.oN.b;
PREG = NEXTOP(PREG, oN);
BIND_GLOBAL(S_SREG, d1, bind_ulbigint);
#ifdef COROUTINING
DO_TRAIL(S_SREG, d1);
@@ -6907,8 +6907,26 @@ Yap_absmi(int inp)
GONext();
ENDD(d0);
ENDOp();
Op(put_dbterm, xD);
BEGD(d0);
d0 = PREG->u.xD.D;
XREG(PREG->u.xD.x) = d0;
PREG = NEXTOP(PREG, xD);
GONext();
ENDD(d0);
ENDOp();
Op(put_float, xd);
Op(put_bigint, xN);
BEGD(d0);
d0 = PREG->u.xN.b;
XREG(PREG->u.xN.x) = d0;
PREG = NEXTOP(PREG, xN);
GONext();
ENDD(d0);
ENDOp();
Op(put_float, xd);
BEGD(d0);
d0 = AbsAppl(PREG->u.xd.d);
XREG(PREG->u.xd.x) = d0;
@@ -7101,6 +7119,24 @@ Yap_absmi(int inp)
GONext();
ENDOp();
Op(write_bigint, N);
BEGD(d0);
d0 = PREG->u.N.b;
*SREG++ = d0;
ENDD(d0);
PREG = NEXTOP(PREG, N);
GONext();
ENDOp();
Op(write_dbterm, D);
BEGD(d0);
d0 = PREG->u.D.D;
*SREG++ = d0;
ENDD(d0);
PREG = NEXTOP(PREG, D);
GONext();
ENDOp();
Op(write_float, d);
BEGD(d0);
d0 = AbsAppl(PREG->u.d.d);