2014-07-13 05:30:14 +01:00
|
|
|
#define CALL_CPRED_INSTINIT \
|
|
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
|
|
register CELL d0;
|
|
|
|
|
|
|
|
#if (defined(YAPOR_SBA) && defined(YAPOR)) || defined(TABLING)
|
|
|
|
#define CALL_CPRED_TEST_STACK \
|
2015-01-18 01:32:13 +00:00
|
|
|
if (!((*_PREG)->u.Osbpp.p->PredFlags & (SafePredFlag|HiddenPredFlag))) { \
|
2014-07-13 05:30:14 +01:00
|
|
|
CACHE_Y_AS_ENV(YREG); \
|
2015-01-18 01:32:13 +00:00
|
|
|
if (__builtin_expect( ((Int)(Unsigned(YOUNGEST_CP((choiceptr)ENV_YREG,B_FZ)) - Unsigned(YOUNGEST_H(H_FZ,H))) < CreepFlag), 0) ) { return external_labels[6]; } \
|
2014-07-13 05:30:14 +01:00
|
|
|
ENDCACHE_Y_AS_ENV(); \
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#define CALL_CPRED_TEST_STACK \
|
2015-01-18 01:32:13 +00:00
|
|
|
if (!((*_PREG)->u.Osbpp.p->PredFlags & (SafePredFlag|HiddenPredFlag))) { \
|
2014-07-13 05:30:14 +01:00
|
|
|
CACHE_Y_AS_ENV(YREG); \
|
|
|
|
if (__builtin_expect(((Int)(Unsigned(ENV_YREG) - Unsigned(HR)) < CreepFlag ), 0) ) { return external_labels[6]; } \
|
|
|
|
ENDCACHE_Y_AS_ENV(); \
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
#define CALL_CPRED_FROZEN_INIT \
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
|
|
|
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
#define CALL_CPRED_TOPB \
|
|
|
|
if (YREG > (CELL *) top_b || YREG < HR) \
|
|
|
|
ASP = (CELL *)top_b; \
|
|
|
|
else \
|
2015-01-18 01:32:13 +00:00
|
|
|
ASP = (CELL *)(((char *)YREG) + (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#else /* YAPOR_SBA */
|
|
|
|
#define CALL_CPRED_TOPB \
|
|
|
|
if (YREG > (CELL *) top_b) \
|
|
|
|
ASP = (CELL *)top_b; \
|
|
|
|
else \
|
2015-01-18 01:32:13 +00:00
|
|
|
ASP = (CELL *)(((char *)YREG) + (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif /* YAPOR_SBA */
|
|
|
|
|
|
|
|
#else
|
|
|
|
#define CALL_CPRED_NOFROZEN \
|
2015-01-18 01:32:13 +00:00
|
|
|
SET_ASP(YREG, (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
#define CALL_CPRED_LOW_LEVEL_TRACER \
|
2015-01-18 01:32:13 +00:00
|
|
|
low_level_trace(enter_pred,(*_PREG)->u.Osbpp.p,XREGS+1);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CALL_CPRED_POST_LOW_LEVEL_TRACER \
|
2015-01-18 01:32:13 +00:00
|
|
|
CPredicate f = (*_PREG)->u.Osbpp.p->cs.f_code; \
|
2014-07-13 05:30:14 +01:00
|
|
|
(*_PREG) = NEXTOP((*_PREG), Osbpp); \
|
|
|
|
saveregs(); \
|
|
|
|
d0 = (f)(PASS_REGS1); \
|
|
|
|
setregs();
|
|
|
|
|
|
|
|
#ifdef SHADOW_S
|
|
|
|
#define CALL_CPRED_SETSREG \
|
|
|
|
(*_SREG) = Yap_REGS.S_;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CALL_CPRED_END \
|
|
|
|
BLOCK = (CELL)CALL_CPRED_END; \
|
|
|
|
FAILED = 0; \
|
|
|
|
if (!d0) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
CACHE_A1(); \
|
|
|
|
JMPNext(); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_INSTINIT \
|
|
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_POST_CHECK_TRAIL \
|
|
|
|
PredEntry *pt0; \
|
|
|
|
CELL d0; \
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
#define EXECUTE_CPRED_FROZEN \
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
|
|
|
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
#define EXECUTE_CPRED_TOPB \
|
|
|
|
if (YREG > (CELL *) top_b || YREG < HR) { \
|
|
|
|
ASP = (CELL *)top_b; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
ASP = YREG+E_CB; \
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#define EXECUTE_CPRED_TOPB \
|
|
|
|
if (YREG > (CELL *) top_b) { \
|
|
|
|
ASP = (CELL *)top_b; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
ASP = YREG+E_CB; \
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#else
|
|
|
|
#define EXECUTE_CPRED_NOFROZEN \
|
|
|
|
SET_ASP(YREG, E_CB*sizeof(CELL));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_POST_FROZEN \
|
2015-01-18 01:32:13 +00:00
|
|
|
pt0 = (*_PREG)->u.pp.p;
|
2014-07-13 05:30:14 +01:00
|
|
|
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
#define EXECUTE_CPRED_LOW_LEVEL_TRACER \
|
|
|
|
low_level_trace(enter_pred,pt0,XREGS+1);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_POST_LOW_LEVEL_TRACER \
|
|
|
|
CACHE_A1(); \
|
|
|
|
register CELL d0; \
|
|
|
|
d0 = (CELL)B;
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_SAVE_PC \
|
|
|
|
save_pc(); \
|
|
|
|
ENV_YREG[E_CB] = d0;
|
|
|
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
#define EXECUTE_CPRED_DEPTH_MINOR \
|
|
|
|
FAILED = 0; \
|
|
|
|
if (pt0->ModuleOfPred) { \
|
|
|
|
if (DEPTH == MkIntTerm(0)) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
DEPTH = RESET_DEPTH(); \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_DEPTH_MOFPRED \
|
|
|
|
FAILED = 0; \
|
|
|
|
DEPTH -= MkIntConstant(2);
|
|
|
|
|
|
|
|
#define EXECUTE_CPRED_DEPTH_END \
|
|
|
|
FAILED = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef SHADOW_S
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
#define EXECUTE_CPRED_END \
|
|
|
|
BLOCK = (CELL)EXECUTE_CPRED_END; \
|
|
|
|
if (!FAILED) { \
|
2015-01-18 01:32:13 +00:00
|
|
|
CPredicate f = (*_PREG)->u.pp.p->cs.f_code; \
|
2014-07-13 05:30:14 +01:00
|
|
|
yamop *oldPREG = (*_PREG); \
|
|
|
|
saveregs(); \
|
|
|
|
d0 = (f)(PASS_REGS1); \
|
|
|
|
setregs(); \
|
|
|
|
(*_SREG) = Yap_REGS.S_; \
|
|
|
|
if (!d0) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
if (oldPREG == (*_PREG)) { \
|
|
|
|
(*_PREG) = (*_CPREG); \
|
|
|
|
ENV_YREG = ENV; \
|
|
|
|
DEPTH = ENV_YREG[E_DEPTH]; \
|
|
|
|
WRITEBACK_Y_AS_ENV(); \
|
|
|
|
} else { \
|
|
|
|
CACHE_A1(); \
|
|
|
|
} \
|
|
|
|
JMPNext(); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#else /* DEPTH_LIMIT */
|
|
|
|
#define EXECUTE_CPRED_END \
|
|
|
|
BLOCK = (CELL)EXECUTE_CPRED_END; \
|
|
|
|
if (!FAILED) { \
|
2015-01-18 01:32:13 +00:00
|
|
|
CPredicate f = (*_PREG)->u.pp.p->cs.f_code; \
|
2014-07-13 05:30:14 +01:00
|
|
|
yamop *oldPREG = (*_PREG); \
|
|
|
|
saveregs(); \
|
|
|
|
d0 = (f)(PASS_REGS1); \
|
|
|
|
setregs(); \
|
|
|
|
(*_SREG) = Yap_REGS.S_; \
|
|
|
|
if (!d0) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
if (oldPREG == (*_PREG)) { \
|
|
|
|
(*_PREG) = (*_CPREG); \
|
|
|
|
ENV_YREG = ENV; \
|
|
|
|
WRITEBACK_Y_AS_ENV(); \
|
|
|
|
} else { \
|
|
|
|
CACHE_A1(); \
|
|
|
|
} \
|
|
|
|
JMPNext(); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
#else /* SHADOW_S */
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
#define EXECUTE_CPRED_END \
|
|
|
|
BLOCK = (CELL)EXECUTE_CPRED_END; \
|
|
|
|
if (!FAILED) { \
|
2015-01-18 01:32:13 +00:00
|
|
|
CPredicate f = (*_PREG)->u.pp.p->cs.f_code; \
|
2014-07-13 05:30:14 +01:00
|
|
|
yamop *oldPREG = (*_PREG); \
|
|
|
|
saveregs(); \
|
|
|
|
d0 = (f)(PASS_REGS1); \
|
|
|
|
setregs(); \
|
|
|
|
if (!d0) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
if (oldPREG == (*_PREG)) { \
|
|
|
|
(*_PREG) = (*_CPREG); \
|
|
|
|
ENV_YREG = ENV; \
|
|
|
|
DEPTH = ENV_YREG[E_DEPTH]; \
|
|
|
|
WRITEBACK_Y_AS_ENV(); \
|
|
|
|
} else { \
|
|
|
|
CACHE_A1(); \
|
|
|
|
} \
|
|
|
|
JMPNext(); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#else /* DEPTH_LIMIT */
|
|
|
|
#define EXECUTE_CPRED_END \
|
|
|
|
BLOCK = (CELL)EXECUTE_CPRED_END; \
|
|
|
|
if (!FAILED) { \
|
2015-01-18 01:32:13 +00:00
|
|
|
CPredicate f = (*_PREG)->u.pp.p->cs.f_code; \
|
2014-07-13 05:30:14 +01:00
|
|
|
yamop *oldPREG = (*_PREG); \
|
|
|
|
saveregs(); \
|
|
|
|
d0 = (f)(PASS_REGS1); \
|
|
|
|
setregs(); \
|
|
|
|
if (!d0) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
if (oldPREG == (*_PREG)) { \
|
|
|
|
(*_PREG) = (*_CPREG); \
|
|
|
|
ENV_YREG = ENV; \
|
|
|
|
WRITEBACK_Y_AS_ENV(); \
|
|
|
|
} else { \
|
|
|
|
CACHE_A1(); \
|
|
|
|
} \
|
|
|
|
JMPNext(); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
#endif /* SHADOW_S */
|
|
|
|
|
|
|
|
#if (defined(YAPOR_SBA) && defined(YAPOR)) || defined(TABLING)
|
|
|
|
#define CALL_USERCPRED_INSTINIT \
|
|
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
|
|
CACHE_Y_AS_ENV(YREG); \
|
2015-01-18 01:32:13 +00:00
|
|
|
if (__builtin_expect( ((Int)(Unsigned(YOUNGEST_CP((choiceptr)ENV_YREG,B_FZ)) - Unsigned(YOUNGEST_H(H_FZ,H))) < CreepFlag), 0) ) { return external_labels[6]; } \
|
2014-07-13 05:30:14 +01:00
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#else
|
|
|
|
#define CALL_USERCPRED_INSTINIT \
|
|
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
|
|
CACHE_Y_AS_ENV(YREG); \
|
|
|
|
if (__builtin_expect(((Int)(Unsigned(ENV_YREG) - Unsigned(HR)) < CreepFlag ), 0) ) { return external_labels[6]; } \
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
#define CALL_USERCPRED_LOW_LEVEL_TRACER \
|
2015-01-18 01:32:13 +00:00
|
|
|
low_level_trace(enter_pred,(*_PREG)->u.Osbpp.p,XREGS+1);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
#define CALL_USERCPRED_FROZEN \
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B); \
|
|
|
|
if (YREG > (CELL *) top_b || YREG < HR) \
|
|
|
|
ASP = (CELL *) top_b; \
|
|
|
|
else \
|
2015-01-18 01:32:13 +00:00
|
|
|
ASP = (CELL *)(((char *)YREG) + (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#else /* YAPOR_SBA */
|
|
|
|
#define CALL_USERCPRED_FROZEN \
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B); \
|
|
|
|
if (YREG > (CELL *) top_b) \
|
|
|
|
ASP = (CELL *) top_b; \
|
|
|
|
else \
|
2015-01-18 01:32:13 +00:00
|
|
|
ASP = (CELL *)(((char *)YREG) + (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif /* YAPOR_SBA */
|
|
|
|
#else /* FROZEN_STACKS */
|
|
|
|
#define CALL_USERCPRED_FROZEN \
|
2015-01-18 01:32:13 +00:00
|
|
|
SET_ASP(YREG, (*_PREG)->u.Osbpp.s);
|
2014-07-13 05:30:14 +01:00
|
|
|
#endif /* FROZEN_STACKS */
|
|
|
|
|
|
|
|
#define CALL_USERCPRED_POST_FROZEN \
|
|
|
|
yamop *savedP; \
|
|
|
|
Yap_StartSlots( PASS_REGS1 ); \
|
|
|
|
LOCAL_PrologMode = UserCCallMode; \
|
|
|
|
{ \
|
2015-01-18 01:32:13 +00:00
|
|
|
PredEntry *p = (*_PREG)->u.Osbpp.p; \
|
2014-07-13 05:30:14 +01:00
|
|
|
(*_PREG) = NEXTOP((*_PREG), Osbpp); \
|
|
|
|
savedP = (*_PREG); \
|
|
|
|
saveregs(); \
|
|
|
|
save_machine_regs(); \
|
|
|
|
(*_SREG) = (CELL *) YAP_Execute(p, p->cs.f_code); \
|
|
|
|
} \
|
|
|
|
Yap_CloseSlots( PASS_REGS1 ); \
|
|
|
|
setregs(); \
|
|
|
|
LOCAL_PrologMode = UserMode; \
|
|
|
|
restore_machine_regs(); \
|
|
|
|
(*_PREG) = savedP;
|
|
|
|
|
|
|
|
#define CALL_USERCPRED_END \
|
|
|
|
BLOCK = (CELL)CALL_USERCPRED_END; \
|
|
|
|
FAILED = 0; \
|
|
|
|
if (EX) { \
|
|
|
|
struct DB_TERM *exp = EX; \
|
|
|
|
EX = NULL; \
|
|
|
|
Yap_JumpToEnv(Yap_PopTermFromDB(exp)); \
|
|
|
|
} \
|
|
|
|
if (!(*_SREG)) { \
|
|
|
|
YAAM_FAIL; \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
YENV = ENV; \
|
|
|
|
YREG = ENV; \
|
|
|
|
JMPNext(); \
|
|
|
|
}
|