1351 lines
36 KiB
C
1351 lines
36 KiB
C
#define TRY_ME_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR); \
|
|
CACHE_Y(YREG); \
|
|
store_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
store_yaam_regs((*_PREG)->y_u.Otapl.d, 0); \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_ME_YAPOR \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_ME_END \
|
|
BLOCK = (CELL)TRY_ME_END; \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
GONext();
|
|
|
|
#define RETRY_ME_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
CACHE_Y(B); \
|
|
restore_yaam_regs((*_PREG)->y_u.Otapl.d); \
|
|
restore_at_least_one_arg((*_PREG)->y_u.Otapl.s);
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY_ME_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY_ME_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY_ME_END \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
GONext();
|
|
|
|
#define TRUST_ME_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
CACHE_Y(B);
|
|
|
|
#ifdef YAPOR
|
|
#ifdef FROZEN_STACKS
|
|
#define TRUST_ME_YAPOR_IF \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} \
|
|
else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define TRUST_ME_YAPOR_IF \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} \
|
|
else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#endif /* FROZEN STACKS */
|
|
#else /* YAPOR */
|
|
#ifdef FROZEN_STACKS
|
|
#define TRUST_ME_YAPOR_IF \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define TRUST_ME_IF \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#endif /* FROZEN STACKS */
|
|
#endif /* YAPOR */
|
|
|
|
#define TRUST_ME_END \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
GONext();
|
|
|
|
#define ENTER_PROFILING_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
LOCK((*_PREG)->y_u.p.p->StatisticsForPred.lock); \
|
|
(*_PREG)->y_u.p.p->StatisticsForPred.NOfEntries++; \
|
|
UNLOCK((*_PREG)->y_u.p.p->StatisticsForPred.lock); \
|
|
(*_PREG) = NEXTOP((*_PREG), p); \
|
|
GONext();
|
|
|
|
#define RETRY_PROFILED_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
LOCK((*_PREG)->y_u.p.p->StatisticsForPred.lock); \
|
|
(*_PREG)->y_u.p.p->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK((*_PREG)->y_u.p.p->StatisticsForPred.lock); \
|
|
(*_PREG) = NEXTOP((*_PREG), p); \
|
|
GONext();
|
|
|
|
#define PROFILED_RETRY_ME_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
CACHE_Y(B); \
|
|
LOCK((*_PREG)->y_u.Otapl.p->StatisticsForPred.lock); \
|
|
(*_PREG)->y_u.Otapl.p->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK((*_PREG)->y_u.Otapl.p->StatisticsForPred.lock); \
|
|
restore_yaam_regs((*_PREG)->y_u.Otapl.d); \
|
|
restore_args((*_PREG)->y_u.Otapl.s);
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_RETRY_ME_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define PROFILED_RETRY_ME_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define PROFILED_RETRY_ME_END \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
GONext();
|
|
|
|
#define PROFILED_TRUST_ME_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
CACHE_Y(B);
|
|
|
|
#ifdef YAPOR
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_ME_IF \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} \
|
|
else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_ME_IF \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} \
|
|
else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* YAPOR */
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_ME_IF \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args((*_PREG)->y_u.Otapl.s); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_ME_IF \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args((*_PREG)->y_u.Otapl.s); \
|
|
set_cut(S_YREG, B); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* YAPOR */
|
|
|
|
#define PROFILED_TRUST_ME_END \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
LOCK((*_PREG)->y_u.Otapl.p->StatisticsForPred.lock); \
|
|
(*_PREG)->y_u.Otapl.p->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK((*_PREG)->y_u.Otapl.p->StatisticsForPred.lock); \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
GONext();
|
|
|
|
#define PROFILED_RETRY_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
check_trail(TR); \
|
|
{ \
|
|
UInt timestamp; \
|
|
CACHE_Y(B); \
|
|
timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[(*_PREG)->y_u.OtaLl.s]); \
|
|
if (!VALID_TIMESTAMP(timestamp, (*_PREG)->y_u.OtaLl.d)) { \
|
|
(*_PREG)=(*_PREG)->y_u.OtaLl.n; \
|
|
JMPNext(); \
|
|
} \
|
|
else { \
|
|
restore_yaam_regs((*_PREG)->y_u.OtaLl.n); \
|
|
restore_args((*_PREG)->y_u.OtaLl.s); \
|
|
LOCK((*_PREG)->y_u.OtaLl.d->ClPred->StatisticsForPred.lock); \
|
|
(*_PREG)->y_u.OtaLl.d->ClPred->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK((*_PREG)->y_u.OtaLl.d->ClPred->StatisticsForPred.lock); \
|
|
}
|
|
|
|
#ifdef THREADS
|
|
#define PROFILED_RETRY_LOGICAL_THREADS \
|
|
PP = (*_PREG)->y_u.OtaLl.d->ClPred;
|
|
#endif
|
|
|
|
#define PROFILED_RETRY_LOGICAL_POST_THREADS \
|
|
(*_PREG) = (*_PREG)->y_u.OtaLl.d->ClCode;
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_RETRY_LOGICAL_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define PROFILED_RETRY_LOGICAL_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define PROFILED_RETRY_LOGICAL_END \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
BLOCK = (CELL)PROFILED_RETRY_LOGICAL_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
} \
|
|
JMPNext();
|
|
|
|
#if MULTIPLE_STACKS
|
|
#ifdef YAPOR
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
PELOCK(1, ap); \
|
|
PP = ap; \
|
|
DEC_CLREF_COUNT(cl); \
|
|
B->cp_tr--; \
|
|
TR = B->cp_tr; \
|
|
if (cl->ClRefCount == 0 && (cl->ClFlags & (ErasedMask|DirtyMask))) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1) { \
|
|
INC_CLREF_COUNT(lcl); \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
PELOCK(1, ap); \
|
|
PP = ap; \
|
|
DEC_CLREF_COUNT(cl); \
|
|
B->cp_tr--; \
|
|
TR = B->cp_tr; \
|
|
if (cl->ClRefCount == 0 && (cl->ClFlags & (ErasedMask|DirtyMask))) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1) { \
|
|
INC_CLREF_COUNT(lcl); \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG++; \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* YAPOR */
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
PELOCK(1, ap); \
|
|
PP = ap; \
|
|
DEC_CLREF_COUNT(cl); \
|
|
B->cp_tr--; \
|
|
TR = B->cp_tr; \
|
|
if (cl->ClRefCount == 0 && (cl->ClFlags & (ErasedMask|DirtyMask))) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1) { \
|
|
INC_CLREF_COUNT(lcl); \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
PELOCK(1, ap); \
|
|
PP = ap; \
|
|
DEC_CLREF_COUNT(cl); \
|
|
B->cp_tr--; \
|
|
TR = B->cp_tr; \
|
|
if (cl->ClRefCount == 0 && (cl->ClFlags & (ErasedMask|DirtyMask))) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1) { \
|
|
INC_CLREF_COUNT(lcl); \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* YAPOR */
|
|
#else /* MULTIPLE_STACKS */
|
|
#if FROZEN_STACKS
|
|
#ifdef YAPOR
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
\
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
if (B->cp_tr > TR_FZ) \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
if (B->cp_tr > TR_FZ) \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG++; \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* YAPOR */
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
if (B->cp_tr > TR_FZ) \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
\
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
if (B->cp_tr > TR_FZ) \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* YAPOR */
|
|
#else /* FROZEN_STACKS */
|
|
#ifdef YAPOR
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_args(ap->ArityOfPE); \
|
|
S_YREG++; \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} else \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* YAPOR */
|
|
#ifdef FROZEN_STACKS
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define PROFILED_TRUST_LOGICAL_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
{ \
|
|
LogUpdIndex *cl = (*_PREG)->y_u.OtILl.block; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
LogUpdClause *lcl = (*_PREG)->y_u.OtILl.d; \
|
|
UInt timestamp = IntegerOfTerm(((CELL *)(B_YREG+1))[ap->ArityOfPE]); \
|
|
if (!VALID_TIMESTAMP(timestamp, lcl)) { \
|
|
(*_PREG) = FAILCODE; \
|
|
} else { \
|
|
LOCK(ap->StatisticsForPred.lock); \
|
|
ap->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(ap->StatisticsForPred.lock); \
|
|
(*_PREG) = lcl->ClCode; \
|
|
} \
|
|
if (TrailTerm(B->cp_tr-1) == CLREF_TO_TRENTRY(cl) && \
|
|
B->cp_tr != B->cp_b->cp_tr) { \
|
|
cl->ClFlags &= ~InUseMask; \
|
|
--B->cp_tr; \
|
|
{ \
|
|
TR = B->cp_tr; \
|
|
} \
|
|
if (cl->ClFlags & (ErasedMask|DirtyMask)) { \
|
|
if ((*_PREG) != FAILCODE) { \
|
|
if (lcl->ClRefCount == 1 && !(lcl->ClFlags & InUseMask)) { \
|
|
lcl->ClFlags |= InUseMask; \
|
|
TRAIL_CLREF(lcl); \
|
|
} \
|
|
} \
|
|
if (cl->ClFlags & ErasedMask) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
save_pc(); \
|
|
} \
|
|
} \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_args(ap->ArityOfPE); \
|
|
S_YREG--; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* YAPOR */
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* MULTIPLE_STACKS */
|
|
|
|
#define PROFILED_TRUST_LOGICAL_END \
|
|
BLOCK = (CELL)PROFILED_TRUST_LOGICAL_END;
|
|
|
|
#define TRY_CLAUSE_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR); \
|
|
CACHE_Y(YREG); \
|
|
store_at_least_one_arg((*_PREG)->y_u.Otapl.s); \
|
|
store_yaam_regs(NEXTOP((*_PREG), Otapl), 0); \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.d; \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_CLAUSE_YAPOR \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_CLAUSE_END \
|
|
BLOCK = (CELL)TRY_CLAUSE_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define TRY_CLAUSE2_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR); \
|
|
CACHE_Y(YREG); \
|
|
{ \
|
|
register CELL x2 = ARG2; \
|
|
register CELL x1 = ARG1; \
|
|
store_yaam_regs(NEXTOP((*_PREG), l), 2); \
|
|
B_YREG->cp_a1 = x1; \
|
|
B_YREG->cp_a2 = x2; \
|
|
} \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_CLAUSE2_YAPOR \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_CLAUSE2_END \
|
|
BLOCK = (CELL)TRY_CLAUSE2_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define TRY_CLAUSE3_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR); \
|
|
CACHE_Y(YREG); \
|
|
{ \
|
|
store_yaam_regs(NEXTOP((*_PREG), l), 3); \
|
|
B_YREG->cp_a1 = ARG1; \
|
|
B_YREG->cp_a2 = ARG2; \
|
|
B_YREG->cp_a3 = ARG3; \
|
|
} \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_CLAUSE3_YAPOR \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_CLAUSE3_END \
|
|
BLOCK = (CELL)TRY_CLAUSE3_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define TRY_CLAUSE4_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR); \
|
|
CACHE_Y(YREG); \
|
|
{ \
|
|
store_yaam_regs(NEXTOP((*_PREG), l), 4); \
|
|
B_YREG->cp_a1 = ARG1; \
|
|
B_YREG->cp_a2 = ARG2; \
|
|
B_YREG->cp_a3 = ARG3; \
|
|
B_YREG->cp_a4 = ARG4; \
|
|
} \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_CLAUSE4_YAPOR \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_CLAUSE4_END \
|
|
BLOCK = (CELL)TRY_CLAUSE4_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define RETRY_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
restore_yaam_regs(NEXTOP((*_PREG), Otapl)); \
|
|
restore_at_least_one_arg((*_PREG)->y_u.Otapl.s);
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY_END \
|
|
BLOCK = (CELL)RETRY_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.d; \
|
|
JMPNext();
|
|
|
|
#define RETRY2_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
restore_yaam_regs(NEXTOP((*_PREG), l)); \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
ARG1 = B_YREG->cp_a1; \
|
|
ARG2 = B_YREG->cp_a2;
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY2_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY2_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY2_END \
|
|
BLOCK = (CELL)RETRY2_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define RETRY3_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
restore_yaam_regs(NEXTOP((*_PREG), l)); \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
ARG1 = B_YREG->cp_a1; \
|
|
ARG2 = B_YREG->cp_a2; \
|
|
ARG3 = B_YREG->cp_a3;
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY3_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY3_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY3_END \
|
|
BLOCK = (CELL)RETRY3_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define RETRY4_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B); \
|
|
restore_yaam_regs(NEXTOP((*_PREG), l)); \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
ARG1 = B_YREG->cp_a1; \
|
|
ARG2 = B_YREG->cp_a2; \
|
|
ARG3 = B_YREG->cp_a3; \
|
|
ARG4 = B_YREG->cp_a4;
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY4_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY4_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY4_END \
|
|
BLOCK = (CELL)RETRY4_END; \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
JMPNext();
|
|
|
|
#define TRUST_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
CACHE_Y(B);
|
|
|
|
#ifdef YAPOR
|
|
#define TRUST_IFOK_INIT \
|
|
if (SCH_top_shared_cp(B)) { \
|
|
SCH_last_alternative((*_PREG), B_YREG); \
|
|
restore_at_least_one_arg((*_PREG)->y_u.Otapl.s);
|
|
#ifdef FROZEN_STACKS
|
|
#define TRUST_IFOK_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
|
#endif
|
|
#define TRUST_IFOK_END \
|
|
set_cut(S_YREG, B->cp_b); \
|
|
} \
|
|
else
|
|
#endif
|
|
|
|
#define TRUST_NOIF_INIT \
|
|
{ \
|
|
pop_yaam_regs(); \
|
|
pop_at_least_one_arg((*_PREG)->y_u.Otapl.s);
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define TRUST_NOIF_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG);
|
|
#endif
|
|
|
|
#define TRUST_END \
|
|
BLOCK = (CELL)TRUST_END; \
|
|
set_cut(S_YREG, B); \
|
|
} \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y(); \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.d; \
|
|
JMPNext();
|
|
|
|
#define TRY_IN_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
B->cp_ap = NEXTOP((*_PREG), l); \
|
|
(*_PREG) = (*_PREG)->y_u.l.l; \
|
|
JMPNext();
|
|
|
|
#define TRY_IN_END \
|
|
BLOCK = (CELL)TRY_IN_END;
|
|
|
|
#define SPY_OR_TRYMARK_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
PELOCK(5, ((PredEntry *)((*_PREG)->y_u.Otapl.p))); \
|
|
(*_PREG) = (yamop *)(&(((PredEntry *)((*_PREG)->y_u.Otapl.p))->OpcodeOfPred)); \
|
|
UNLOCKPE(11,(PredEntry *)((*_PREG)->y_u.Otapl.p)); \
|
|
return external_labels[12];
|
|
|
|
#define TRY_AND_MARK_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
check_trail(TR);
|
|
|
|
#if defined(YAPOR) || defined(THREADS)
|
|
#ifdef YAPOR
|
|
#define TRY_AND_MARK_YAPOR_THREADS_YAPOR \
|
|
CUT_wait_leftmost();
|
|
#endif
|
|
|
|
#define TRY_AND_MARK_YAPOR_THREADS_NOYAPOR_IF \
|
|
BLOCK = (CELL)TRY_AND_MARK_YAPOR_THREADS_NOYAPOR_IF; \
|
|
if ((*_PREG)->y_u.Otapl.p->PredFlags & LogUpdatePredFlag) { \
|
|
PELOCK(6,(*_PREG)->y_u.Otapl.p); \
|
|
PP = (*_PREG)->y_u.Otapl.p; \
|
|
} \
|
|
if ((*_PREG)->y_u.Otapl.p->CodeOfPred != (*_PREG)) { \
|
|
PP = NULL; \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.p->CodeOfPred; \
|
|
UNLOCKPE(12,(*_PREG)->y_u.Otapl.p); \
|
|
save_pc(); \
|
|
JMPNext(); \
|
|
}
|
|
#endif
|
|
|
|
#define TRY_AND_MARK_NOYAPOR_NOTHREADS \
|
|
CACHE_Y(YREG); \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.d; \
|
|
LOCK(DynamicLock((*_PREG))); \
|
|
UNLOCKPE(13,((PredEntry *)((*_PREG)->y_u.Otapl.p))); \
|
|
BEGD(d1); \
|
|
d1 = (*_PREG)->y_u.Otapl.s; \
|
|
store_args(d1); \
|
|
store_yaam_regs((*_PREG), 0); \
|
|
ENDD(d1); \
|
|
set_cut(S_YREG, B); \
|
|
B = B_YREG;
|
|
|
|
#ifdef YAPOR
|
|
#define TRY_AND_MARK_SET_LOAD \
|
|
SCH_set_load(B_YREG);
|
|
#endif
|
|
|
|
#define TRY_AND_MARK_POST_SET_LOAD \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y();
|
|
|
|
#if MULTIPLE_STACKS
|
|
#define TRY_AND_MARK_MULTIPLE_STACKS \
|
|
INC_CLREF_COUNT(ClauseCodeToDynamicClause((*_PREG))); \
|
|
UNLOCK(DynamicLock((*_PREG))); \
|
|
TRAIL_CLREF(ClauseCodeToDynamicClause((*_PREG)));
|
|
#else
|
|
#define TRY_AND_MARK_NOMULTIPLE_STACKS_IF \
|
|
if (FlagOff(InUseMask, DynamicFlags((*_PREG)))) { \
|
|
SetFlag(InUseMask, DynamicFlags((*_PREG))); \
|
|
TRAIL_CLREF(ClauseCodeToDynamicClause((*_PREG))); \
|
|
}
|
|
#endif
|
|
|
|
#define TRY_AND_MARK_END \
|
|
(*_PREG) = NEXTOP((*_PREG),Otapl); \
|
|
JMPNext();
|
|
|
|
#define COUNT_RETRY_AND_MARK_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
LOCAL_RetriesCounter--; \
|
|
if (LOCAL_RetriesCounter == 0) { \
|
|
saveregs(); \
|
|
Yap_NilError(RETRY_COUNTER_UNDERFLOW,""); \
|
|
setregs(); \
|
|
JMPNext(); \
|
|
} \
|
|
else { \
|
|
LOCAL_PredEntriesCounter--; \
|
|
if (LOCAL_PredEntriesCounter == 0) { \
|
|
saveregs(); \
|
|
Yap_NilError(PRED_ENTRY_COUNTER_UNDERFLOW,""); \
|
|
setregs(); \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define PROFILED_RETRY_AND_MARK_INSTINIT \
|
|
print_instruction((*_PREG), ON_NATIVE); \
|
|
LOCK(((PredEntry *)((*_PREG)->y_u.Otapl.p))->StatisticsForPred.lock); \
|
|
((PredEntry *)((*_PREG)->y_u.Otapl.p))->StatisticsForPred.NOfRetries++; \
|
|
UNLOCK(((PredEntry *)((*_PREG)->y_u.Otapl.p))->StatisticsForPred.lock); \
|
|
|
|
#define RETRY_AND_MARK_INSTINIT
|
|
|
|
#ifdef YAPOR
|
|
#define RETRY_AND_MARK_YAPOR \
|
|
CUT_wait_leftmost();
|
|
#endif
|
|
|
|
#define RETRY_AND_MARK_POST_YAPOR \
|
|
PELOCK(7,(*_PREG)->y_u.Otapl.p); \
|
|
CACHE_Y(B); \
|
|
(*_PREG) = (*_PREG)->y_u.Otapl.d; \
|
|
LOCK(DynamicLock((*_PREG))); \
|
|
UNLOCK((*_PREG)->y_u.Otapl.p->PELock); \
|
|
restore_yaam_regs((*_PREG)); \
|
|
restore_args((*_PREG)->y_u.Otapl.s);
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#define RETRY_AND_MARK_FROZEN \
|
|
S_YREG = (CELL *) PROTECT_FROZEN_B(B_YREG); \
|
|
set_cut(S_YREG, B->cp_b);
|
|
#else
|
|
#define RETRY_AND_MARK_NOFROZEN \
|
|
set_cut(S_YREG, B_YREG->cp_b);
|
|
#endif
|
|
|
|
#define RETRY_AND_MARK_POST_FROZEN \
|
|
SET_BB(B_YREG); \
|
|
ENDCACHE_Y();
|
|
|
|
#if MULTIPLE_STACKS
|
|
#define RETRY_AND_MARK_MULTIPLE_STACKS \
|
|
INC_CLREF_COUNT(ClauseCodeToDynamicClause((*_PREG))); \
|
|
TRAIL_CLREF(ClauseCodeToDynamicClause((*_PREG))); \
|
|
UNLOCK(DynamicLock((*_PREG)));
|
|
#else
|
|
#define RETRY_AND_MARK_NOMULTIPLE_STACKS_IF \
|
|
if (FlagOff(InUseMask, DynamicFlags((*_PREG)))) { \
|
|
SetFlag(InUseMask, DynamicFlags((*_PREG))); \
|
|
TRAIL_CLREF(ClauseCodeToDynamicClause((*_PREG))); \
|
|
}
|
|
#endif
|
|
|
|
#define RETRY_AND_MARK_END \
|
|
(*_PREG) = NEXTOP((*_PREG), Otapl); \
|
|
JMPNext();
|
|
|