first cut at call counter.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@580 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc
2002-09-03 14:28:09 +00:00
parent 89a188d5d7
commit 94e9529128
20 changed files with 459 additions and 16 deletions

123
C/absmi.c
View File

@@ -459,7 +459,7 @@ absmi(int inp)
GONext();
ENDOp();
/* profiled_enter_me Label,NArgs */
/* profiled_retry Label,NArgs */
Op(retry_profiled, l);
LOCK(((PredEntry *)(PREG->u.l.l))->StatisticsForPred.lock);
((PredEntry *)(PREG->u.l.l))->StatisticsForPred.NOfRetries++;
@@ -523,6 +523,111 @@ absmi(int inp)
GONext();
ENDOp();
/*****************************************************************
* Call count instructions *
*****************************************************************/
/* count_enter_me Label,NArgs */
Op(count_call, l);
ReductionsCounter--;
if (ReductionsCounter == 0 && ReductionsCounterOn) {
Error(CALL_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PredEntriesCounter--;
if (PredEntriesCounter == 0 && PredEntriesCounterOn) {
Error(PRED_ENTRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PREG = NEXTOP(PREG, l);
GONext();
ENDOp();
/* count_retry Label,NArgs */
Op(count_retry, l);
RetriesCounter--;
if (RetriesCounter == 0 && RetriesCounterOn) {
Error(RETRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PredEntriesCounter--;
if (PredEntriesCounter == 0 && PredEntriesCounterOn) {
Error(PRED_ENTRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PREG = NEXTOP(PREG, l);
GONext();
ENDOp();
/* count_retry_me Label,NArgs */
Op(count_retry_me, ld);
CACHE_Y(B);
/* After retry, cut should be pointing at the parent
* choicepoint for the current B */
RetriesCounter--;
if (RetriesCounter == 0 && RetriesCounterOn) {
Error(RETRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PredEntriesCounter--;
if (PredEntriesCounter == 0 && PredEntriesCounterOn) {
Error(PRED_ENTRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
restore_yaam_regs(PREG->u.ld.d);
restore_args(PREG->u.ld.s);
#ifdef FROZEN_STACKS
S_Y = (CELL *)PROTECT_FROZEN_B(B_Y);
set_cut(S_Y, B->cp_b);
#else
set_cut(S_Y, B_Y->cp_b);
#endif /* FROZEN_STACKS */
SET_BB(B_Y);
ENDCACHE_Y();
PREG = NEXTOP(PREG, ld);
GONext();
ENDOp();
/* count_trust_me UnusedLabel,NArgs */
Op(count_trust_me, ld);
CACHE_Y(B);
#ifdef YAPOR
if (SCH_top_shared_cp(B)) {
SCH_last_alternative(PREG, B_Y);
restore_args(PREG->u.ld.s);
#ifdef FROZEN_STACKS
B_Y = PROTECT_FROZEN_B(B_Y);
#endif /* FROZEN_STACKS */
set_cut(S_Y, B->cp_b);
}
else
#endif /* YAPOR */
{
pop_yaam_regs();
pop_args(PREG->u.ld.s);
/* After trust, cut should be pointing at the new top
* choicepoint */
#ifdef FROZEN_STACKS
S_Y = (CELL *)PROTECT_FROZEN_B(B_Y);
#endif /* FROZEN_STACKS */
set_cut(S_Y, B);
}
SET_BB(B_Y);
ENDCACHE_Y();
RetriesCounter--;
if (RetriesCounter == 0) {
Error(RETRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PredEntriesCounter--;
if (PredEntriesCounter == 0) {
Error(PRED_ENTRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PREG = NEXTOP(PREG, ld);
GONext();
ENDOp();
/*****************************************************************
* Specialised try - retry - trust instructions *
*****************************************************************/
@@ -1071,6 +1176,21 @@ absmi(int inp)
ENDBOp();
BOp(count_retry_and_mark, ld);
RetriesCounter--;
if (RetriesCounter == 0) {
Error(RETRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
PredEntriesCounter--;
if (PredEntriesCounter == 0) {
Error(PRED_ENTRY_COUNTER_UNDERFLOW,TermNil,"");
JMPNext();
}
goto actual_retry_and_mark;
/* enter a retry dynamic */
ENDBOp();
BOp(profiled_retry_and_mark, ld);
LOCK(((PredEntry *)(PREG->u.ld.p))->StatisticsForPred.lock);
((PredEntry *)(PREG->u.ld.p))->StatisticsForPred.NOfRetries++;
@@ -1080,6 +1200,7 @@ absmi(int inp)
/* retry_and_mark Label,NArgs */
BOp(retry_and_mark, ld);
actual_retry_and_mark:
#ifdef YAPOR
CUT_wait_leftmost();
#endif /* YAPOR */