From c8946e1e4e7cae90e0784f38cb725f0db04b9458 Mon Sep 17 00:00:00 2001 From: Costa Vitor Date: Wed, 22 Jul 2009 17:01:30 -0500 Subject: [PATCH] support inline arithemtic builtins as non-inlined. --- C/arith2.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ C/inlines.c | 8 ------ 2 files changed, 78 insertions(+), 8 deletions(-) diff --git a/C/arith2.c b/C/arith2.c index f6029325d..6044b1ad1 100644 --- a/C/arith2.c +++ b/C/arith2.c @@ -1151,6 +1151,76 @@ p_binary_is(void) return FALSE; } +static Int +do_arith23(arith2_op op) +{ /* X is Y */ + Term t = Deref(ARG1); + Int out; + Term t1, t2; + + if (IsVarTerm(t)) { + Yap_ArithError(INSTANTIATION_ERROR,t, "X is Y"); + return(FALSE); + } + t1 = Yap_Eval(t); + if (t1 == 0L) + return FALSE; + t2 = Yap_Eval(Deref(ARG2)); + if (t2 == 0L) + return FALSE; + if (!(out=Yap_FoundArithError(eval2(op, t1, t2), 0L))) + return FALSE; + return Yap_unify_constant(ARG3,out); +} + +static Int +export_p_plus(void) +{ /* X is Y */ + return do_arith23(op_plus); +} + +static Int +export_p_minus(void) +{ /* X is Y */ + return do_arith23(op_minus); +} + +static Int +export_p_times(void) +{ /* X is Y */ + return do_arith23(op_times); +} + +static Int +export_p_div(void) +{ /* X is Y */ + return do_arith23(op_div); +} + +static Int +export_p_and(void) +{ /* X is Y */ + return do_arith23(op_and); +} + +static Int +export_p_or(void) +{ /* X is Y */ + return do_arith23(op_or); +} + +static Int +export_p_slr(void) +{ /* X is Y */ + return do_arith23(op_slr); +} + +static Int +export_p_sll(void) +{ /* X is Y */ + return do_arith23(op_sll); +} + static Int p_binary_op_as_integer(void) { /* X is Y */ @@ -1214,6 +1284,14 @@ Yap_InitBinaryExps(void) } Yap_InitCPred("is", 4, p_binary_is, TestPredFlag | SafePredFlag); Yap_InitCPred("$binary_op_as_integer", 2, p_binary_op_as_integer, TestPredFlag|SafePredFlag); + Yap_InitAsmPred("$plus", 3, _plus, export_p_plus, SafePredFlag); + Yap_InitAsmPred("$minus", 3, _minus, export_p_minus, SafePredFlag); + Yap_InitAsmPred("$times", 3, _times, export_p_times, SafePredFlag); + Yap_InitAsmPred("$div", 3, _div, export_p_div, SafePredFlag); + Yap_InitAsmPred("$and", 3, _and, export_p_and, SafePredFlag); + Yap_InitAsmPred("$or", 3, _or, export_p_or, SafePredFlag); + Yap_InitAsmPred("$sll", 3, _sll, export_p_sll, SafePredFlag); + Yap_InitAsmPred("$slr", 3, _slr, export_p_slr, SafePredFlag); } /* This routine is called from Restore to make sure we have the same arithmetic operators */ diff --git a/C/inlines.c b/C/inlines.c index d7efa8b38..f8630e18f 100755 --- a/C/inlines.c +++ b/C/inlines.c @@ -921,14 +921,6 @@ Yap_InitInlines(void) Yap_InitAsmPred("==", 2, _eq, p_eq, SafePredFlag); Yap_InitAsmPred("arg", 3, _arg, p_arg, SafePredFlag); Yap_InitAsmPred("functor", 3, _functor, p_functor, 0); - Yap_InitAsmPred("$plus", 3, _plus, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$minus", 3, _minus, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$times", 3, _times, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$div", 3, _div, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$and", 3, _and, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$or", 3, _or, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$sll", 3, _sll, p_erroneous_call, SafePredFlag); - Yap_InitAsmPred("$slr", 3, _slr, p_erroneous_call, SafePredFlag); Yap_InitAsmPred("$label_ctl", 2, _p_label_ctl, p_erroneous_call, SafePredFlag); CurrentModule = ARG_MODULE; Yap_InitCPredBack("genarg", 3, 3, init_genarg, cont_genarg,SafePredFlag);