Change to simpler Eval mechanism
- avoid duplicate code - implement different optimised code.
This commit is contained in:
154
H/eval.h
154
H/eval.h
@@ -39,23 +39,83 @@
|
||||
#define Int_MIN (-Int_MAX-(CELL)1)
|
||||
#endif
|
||||
|
||||
typedef union arith_ret {
|
||||
Int Int;
|
||||
Float dbl;
|
||||
#ifdef USE_GMP
|
||||
mpz_t big;
|
||||
#endif
|
||||
} *arith_retptr;
|
||||
typedef enum {
|
||||
op_pi,
|
||||
op_e,
|
||||
op_inf,
|
||||
op_nan,
|
||||
op_random,
|
||||
op_cputime,
|
||||
op_heapused,
|
||||
op_localsp,
|
||||
op_globalsp,
|
||||
op_b,
|
||||
op_env,
|
||||
op_tr,
|
||||
op_stackfree
|
||||
} arith0_op;
|
||||
|
||||
/*
|
||||
#define RINT(v) return(MkIntegerTerm(v))
|
||||
#define RFLOAT(v) return(MkFloatTerm(v))
|
||||
#define RBIG(v) return(Yap_MkBigIntTerm(v))
|
||||
#define RBIG_FL(v) return(Yap_MkBigIntTerm((MP_INT *)(Int)v))
|
||||
#define RERROR() return(MkIntTerm(0))
|
||||
*/
|
||||
typedef enum {
|
||||
op_uplus,
|
||||
op_uminus,
|
||||
op_unot,
|
||||
op_exp,
|
||||
op_log,
|
||||
op_log10,
|
||||
op_sqrt,
|
||||
op_sin,
|
||||
op_cos,
|
||||
op_tan,
|
||||
op_sinh,
|
||||
op_cosh,
|
||||
op_tanh,
|
||||
op_asin,
|
||||
op_acos,
|
||||
op_atan,
|
||||
op_asinh,
|
||||
op_acosh,
|
||||
op_atanh,
|
||||
op_floor,
|
||||
op_ceiling,
|
||||
op_round,
|
||||
op_truncate,
|
||||
op_integer,
|
||||
op_float,
|
||||
op_abs,
|
||||
op_msb,
|
||||
op_ffracp,
|
||||
op_fintp,
|
||||
op_sign,
|
||||
op_lgamma,
|
||||
op_random1
|
||||
} arith1_op;
|
||||
|
||||
Functor STD_PROTO(EvalArg,(Term,arith_retptr));
|
||||
typedef enum {
|
||||
op_plus,
|
||||
op_minus,
|
||||
op_times,
|
||||
op_fdiv,
|
||||
op_mod,
|
||||
op_rem,
|
||||
op_div,
|
||||
op_sll,
|
||||
op_slr,
|
||||
op_and,
|
||||
op_or,
|
||||
op_xor,
|
||||
op_atan2,
|
||||
/* C-Prolog exponentiation */
|
||||
op_power,
|
||||
/* ISO-Prolog exponentiation */
|
||||
/* op_power, */
|
||||
/* Quintus exponentiation */
|
||||
/* op_power, */
|
||||
op_gcd,
|
||||
op_min,
|
||||
op_max
|
||||
} arith2_op;
|
||||
|
||||
Functor STD_PROTO(EvalArg,(Term));
|
||||
|
||||
/* Needed to handle numbers:
|
||||
these two macros are fundamental in the integer/float conversions */
|
||||
@@ -98,27 +158,53 @@ int STD_PROTO(Yap_ReInitConstExps,(void));
|
||||
int STD_PROTO(Yap_ReInitUnaryExps,(void));
|
||||
int STD_PROTO(Yap_ReInitBinaryExps,(void));
|
||||
|
||||
blob_type STD_PROTO(Yap_Eval,(Term, union arith_ret *));
|
||||
Term STD_PROTO(Yap_eval_atom,(Int));
|
||||
Term STD_PROTO(Yap_eval_unary,(Int,Term));
|
||||
Term STD_PROTO(Yap_eval_binary,(Int,Term,Term));
|
||||
|
||||
blob_type STD_PROTO(Yap_Eval,(Term));
|
||||
|
||||
#define RINT(v) return(MkIntegerTerm(v))
|
||||
#define RFLOAT(v) return(MkFloatTerm(v))
|
||||
#define RBIG(v) return(Yap_MkBigIntTerm(v))
|
||||
#define RERROR() return(0L)
|
||||
|
||||
static inline blob_type
|
||||
ETypeOfTerm(Term t)
|
||||
{
|
||||
if (IsIntTerm(t))
|
||||
return long_int_e;
|
||||
if (IsApplTerm(t)) {
|
||||
Functor f = FunctorOfTerm(t);
|
||||
if (f == FunctorDouble)
|
||||
return double_e;
|
||||
if (f == FunctorLongInt)
|
||||
return long_int_e;
|
||||
if (f == FunctorBigInt)
|
||||
return big_int_e;
|
||||
}
|
||||
return db_ref_e;
|
||||
}
|
||||
|
||||
#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 *));
|
||||
Term STD_PROTO(Yap_gmp_add_ints,(Int, Int));
|
||||
Term STD_PROTO(Yap_gmp_sub_ints,(Int, Int));
|
||||
Term STD_PROTO(Yap_gmp_mul_ints,(Int, Int));
|
||||
Term STD_PROTO(Yap_gmp_sll_ints,(Int, Int));
|
||||
Term STD_PROTO(Yap_gmp_add_int_big,(Int, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_sub_int_big,(Int, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_sub_big_int,(MP_INT *, Int));
|
||||
Term STD_PROTO(Yap_gmp_mul_int_big,(Int, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_div_big_int,(MP_INT *, Int));
|
||||
Term STD_PROTO(Yap_gmp_and_int_big,(Int, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_ior_int_big,(Int, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_sll_big_int,(MP_INT *, Int));
|
||||
Term STD_PROTO(Yap_gmp_add_big_big,(MP_INT *, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_sub_big_big,(MP_INT *, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_mul_big_big,(MP_INT *, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_div_big_big,(MP_INT *, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_and_big_big,(MP_INT *, MP_INT *));
|
||||
Term STD_PROTO(Yap_gmp_ior_big_big,(MP_INT *, MP_INT *));
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user