2015-01-18 03:00:19 +00:00
|
|
|
|
/************************************************************************\
|
2018-04-04 10:06:54 +01:00
|
|
|
|
* Cut & Commit Inst
|
|
|
|
|
|
|
|
|
|
ructions *
|
2015-01-18 03:00:19 +00:00
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
|
|
#ifdef INDENT_CODE
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
#endif /* INDENT_CODE */
|
|
|
|
|
|
|
|
|
|
/* cut */
|
|
|
|
|
Op(cut, s);
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
2016-04-10 14:21:17 +01:00
|
|
|
|
check_stack(NoStackCut, HR);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
do_cut:
|
|
|
|
|
#endif
|
|
|
|
|
SET_ASP(YREG, PREG->y_u.s.s);
|
|
|
|
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
|
|
|
|
/* assume cut is always in stack */
|
|
|
|
|
saveregs();
|
|
|
|
|
prune((choiceptr)YREG[E_CB] PASS_REGS);
|
|
|
|
|
setregs();
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
NoStackCut:
|
|
|
|
|
PROCESS_INT(interrupt_cut, do_cut);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* cut_t */
|
|
|
|
|
/* cut_t does the same as cut */
|
|
|
|
|
Op(cut_t, s);
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
check_stack(NoStackCutT, HR);
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
do_cut_t:
|
|
|
|
|
#endif
|
|
|
|
|
SET_ASP(YREG, PREG->y_u.s.s);
|
|
|
|
|
/* assume cut is always in stack */
|
|
|
|
|
saveregs();
|
|
|
|
|
prune((choiceptr)YREG[E_CB] PASS_REGS);
|
|
|
|
|
setregs();
|
|
|
|
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
NoStackCutT:
|
|
|
|
|
PROCESS_INT(interrupt_cut_t, do_cut_t);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* cut_e */
|
|
|
|
|
Op(cut_e, s);
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
check_stack(NoStackCutE, HR);
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
do_cut_e:
|
|
|
|
|
#endif
|
|
|
|
|
SET_ASP(YREG, PREG->y_u.s.s);
|
|
|
|
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
|
|
|
|
saveregs();
|
|
|
|
|
prune((choiceptr)SREG[E_CB] PASS_REGS);
|
|
|
|
|
setregs();
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
NoStackCutE:
|
|
|
|
|
PROCESS_INT(interrupt_cut_e, do_cut_e);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* save_b_x Xi */
|
|
|
|
|
Op(save_b_x, x);
|
|
|
|
|
BEGD(d0);
|
|
|
|
|
d0 = PREG->y_u.x.x;
|
|
|
|
|
#if defined(YAPOR_SBA) && defined(FROZEN_STACKS)
|
|
|
|
|
XREG(d0) = MkIntegerTerm((Int)B);
|
|
|
|
|
#else
|
|
|
|
|
XREG(d0) = MkIntegerTerm(LCL0-(CELL *) (B));
|
|
|
|
|
#endif /* YAPOR_SBA && FROZEN_STACKS */
|
|
|
|
|
PREG = NEXTOP(PREG, x);
|
|
|
|
|
ENDD(d0);
|
|
|
|
|
GONext();
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* save_b_y Yi */
|
|
|
|
|
Op(save_b_y, y);
|
|
|
|
|
#if defined(YAPOR_SBA)
|
|
|
|
|
INITIALIZE_PERMVAR(YREG+PREG->y_u.y.y,MkIntegerTerm((Int)B));
|
|
|
|
|
#else
|
|
|
|
|
INITIALIZE_PERMVAR(YREG+PREG->y_u.y.y,MkIntegerTerm(LCL0-(CELL *)(B)));
|
|
|
|
|
#endif /* YAPOR_SBA*/
|
|
|
|
|
PREG = NEXTOP(PREG, y);
|
|
|
|
|
GONext();
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* commit_b_x Xi */
|
|
|
|
|
Op(commit_b_x, xps);
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
check_stack(NoStackCommitX, HR);
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
do_commit_b_x:
|
|
|
|
|
#endif
|
|
|
|
|
BEGD(d0);
|
|
|
|
|
d0 = XREG(PREG->y_u.xps.x);
|
|
|
|
|
deref_head(d0, commit_b_x_unk);
|
|
|
|
|
commit_b_x_nvar:
|
|
|
|
|
/* skip a void call and a label */
|
|
|
|
|
SET_ASP(YREG, PREG->y_u.xps.s);
|
|
|
|
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xps),Osbpp),l);
|
|
|
|
|
{
|
|
|
|
|
choiceptr pt0;
|
|
|
|
|
#if defined(YAPOR_SBA) && defined(FROZEN_STACKS)
|
|
|
|
|
pt0 = (choiceptr)IntegerOfTerm(d0);
|
|
|
|
|
#else
|
|
|
|
|
pt0 = (choiceptr)(LCL0-IntegerOfTerm(d0));
|
|
|
|
|
#endif /* YAPOR_SBA && FROZEN_STACKS */
|
|
|
|
|
saveregs();
|
|
|
|
|
prune(pt0 PASS_REGS);
|
|
|
|
|
setregs();
|
|
|
|
|
}
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
BEGP(pt1);
|
|
|
|
|
deref_body(d0, pt1, commit_b_x_unk, commit_b_x_nvar);
|
|
|
|
|
ENDP(pt1);
|
|
|
|
|
/* never cut to a variable */
|
|
|
|
|
/* Abort */
|
|
|
|
|
FAIL();
|
|
|
|
|
ENDD(d0);
|
|
|
|
|
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
/* Problem: have I got an environment or not? */
|
|
|
|
|
NoStackCommitX:
|
|
|
|
|
PROCESS_INT(interrupt_commit_x, do_commit_b_x);
|
|
|
|
|
#endif
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/* commit_b_y Yi */
|
|
|
|
|
Op(commit_b_y, yps);
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
check_stack(NoStackCommitY, HR);
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
do_commit_b_y:
|
|
|
|
|
#endif
|
|
|
|
|
BEGD(d0);
|
|
|
|
|
d0 = YREG[PREG->y_u.yps.y];
|
|
|
|
|
deref_head(d0, commit_b_y_unk);
|
|
|
|
|
commit_b_y_nvar:
|
|
|
|
|
SET_ASP(YREG, PREG->y_u.yps.s);
|
|
|
|
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yps),Osbpp),l);
|
|
|
|
|
{
|
|
|
|
|
choiceptr pt0;
|
|
|
|
|
#if defined(YAPOR_SBA) && defined(FROZEN_STACKS)
|
|
|
|
|
pt0 = (choiceptr)IntegerOfTerm(d0);
|
|
|
|
|
#else
|
|
|
|
|
pt0 = (choiceptr)(LCL0-IntegerOfTerm(d0));
|
|
|
|
|
#endif
|
|
|
|
|
saveregs();
|
|
|
|
|
prune(pt0 PASS_REGS);
|
|
|
|
|
setregs();
|
|
|
|
|
}
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
BEGP(pt1);
|
|
|
|
|
deref_body(d0, pt1, commit_b_y_unk, commit_b_y_nvar);
|
|
|
|
|
ENDP(pt1);
|
|
|
|
|
/* never cut to a variable */
|
|
|
|
|
/* Abort */
|
|
|
|
|
FAIL();
|
|
|
|
|
ENDD(d0);
|
|
|
|
|
|
|
|
|
|
#ifdef COROUTINING
|
|
|
|
|
/* This is easier: I know there is an environment so I cannot do allocate */
|
|
|
|
|
NoStackCommitY:
|
|
|
|
|
PROCESS_INT(interrupt_commit_y, do_commit_b_y);
|
|
|
|
|
#endif
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|
* Call / Proceed instructions *
|
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
|
|
/* Macros for stack trimming */
|
|
|
|
|
|
|
|
|
|
/* execute Label */
|
2017-08-27 22:03:19 +01:00
|
|
|
|
BOp(execute, Osbpp);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
{
|
|
|
|
|
PredEntry *pt0;
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
2017-08-27 22:03:19 +01:00
|
|
|
|
pt0 = PREG->y_u.Osbpp.p;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#ifndef NO_CHECKING
|
|
|
|
|
check_stack(NoStackExecute, HR);
|
|
|
|
|
goto skip_do_execute;
|
|
|
|
|
#endif
|
|
|
|
|
do_execute:
|
|
|
|
|
FETCH_Y_FROM_ENV(YREG);
|
2017-08-27 22:03:19 +01:00
|
|
|
|
pt0 = PREG->y_u.Osbpp.p;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
skip_do_execute:
|
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
|
if (Yap_do_low_level_trace) {
|
|
|
|
|
low_level_trace(enter_pred,pt0,XREGS+1);
|
|
|
|
|
}
|
|
|
|
|
#endif /* LOW_LEVEL_TRACE */
|
|
|
|
|
CACHE_A1();
|
|
|
|
|
ALWAYS_LOOKAHEAD(pt0->OpcodeOfPred);
|
|
|
|
|
BEGD(d0);
|
|
|
|
|
d0 = (CELL)B;
|
|
|
|
|
PREG = pt0->CodeOfPred;
|
|
|
|
|
/* for profiler */
|
|
|
|
|
save_pc();
|
|
|
|
|
ENV_YREG[E_CB] = d0;
|
|
|
|
|
ENDD(d0);
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is prolog */
|
|
|
|
|
if (pt0->ModuleOfPred) {
|
2015-01-20 03:00:42 +00:00
|
|
|
|
if (DEPTH == MkIntTerm(0)) {
|
2015-01-18 03:00:19 +00:00
|
|
|
|
FAIL();
|
2015-01-20 03:00:42 +00:00
|
|
|
|
} else { DEPTH = RESET_DEPTH(); }
|
2015-01-18 03:00:19 +00:00
|
|
|
|
}
|
|
|
|
|
} else if (pt0->ModuleOfPred)
|
|
|
|
|
DEPTH -= MkIntConstant(2);
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
/* this is the equivalent to setting up the stack */
|
|
|
|
|
ALWAYS_GONext();
|
|
|
|
|
ALWAYS_END_PREFETCH();
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NoStackExecute:
|
|
|
|
|
PROCESS_INT(interrupt_execute, do_execute);
|
|
|
|
|
|
|
|
|
|
ENDBOp();
|
|
|
|
|
|
|
|
|
|
/* dexecute Label */
|
|
|
|
|
/* joint deallocate and execute */
|
2017-08-27 22:03:19 +01:00
|
|
|
|
BOp(dexecute, Osbpp);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
|
if (Yap_do_low_level_trace)
|
2017-08-27 22:03:19 +01:00
|
|
|
|
low_level_trace(enter_pred,PREG->y_u.Osbpp.p,XREGS+1);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#endif /* LOW_LEVEL_TRACER */
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
{
|
|
|
|
|
PredEntry *pt0;
|
|
|
|
|
|
|
|
|
|
CACHE_A1();
|
2017-08-27 22:03:19 +01:00
|
|
|
|
pt0 = PREG->y_u.Osbpp.p;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#ifndef NO_CHECKING
|
|
|
|
|
/* check stacks */
|
|
|
|
|
check_stack(NoStackDExecute, HR);
|
|
|
|
|
goto skip_dexecute;
|
|
|
|
|
#endif
|
|
|
|
|
continue_dexecute:
|
|
|
|
|
FETCH_Y_FROM_ENV(YREG);
|
2017-08-27 22:03:19 +01:00
|
|
|
|
pt0 = PREG->y_u.Osbpp.p;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
skip_dexecute:
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is primitives */
|
|
|
|
|
if (pt0->ModuleOfPred) {
|
2015-01-20 03:00:42 +00:00
|
|
|
|
if (DEPTH == MkIntTerm(0)) {
|
2015-01-18 03:00:19 +00:00
|
|
|
|
FAIL();
|
2015-01-20 03:00:42 +00:00
|
|
|
|
} else {
|
|
|
|
|
DEPTH = RESET_DEPTH();
|
|
|
|
|
}
|
2015-01-18 03:00:19 +00:00
|
|
|
|
}
|
|
|
|
|
} else if (pt0->ModuleOfPred)
|
|
|
|
|
DEPTH -= MkIntConstant(2);
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
PREG = pt0->CodeOfPred;
|
|
|
|
|
/* for profiler */
|
|
|
|
|
save_pc();
|
|
|
|
|
ALWAYS_LOOKAHEAD(pt0->OpcodeOfPred);
|
|
|
|
|
/* do deallocate */
|
|
|
|
|
CPREG = (yamop *) ENV_YREG[E_CP];
|
|
|
|
|
ENV_YREG = ENV = (CELL *) ENV_YREG[E_E];
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
|
{
|
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#endif /* YAPOR_SBA */
|
|
|
|
|
else ENV_YREG = (CELL *)((CELL)ENV_YREG + ENV_Size(CPREG));
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *)B) {
|
|
|
|
|
ENV_YREG = (CELL *)B;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ENV_YREG = (CELL *) ((CELL) ENV_YREG + ENV_Size(CPREG));
|
|
|
|
|
}
|
|
|
|
|
#endif /* FROZEN_STACKS */
|
|
|
|
|
WRITEBACK_Y_AS_ENV();
|
|
|
|
|
/* setup GB */
|
|
|
|
|
ENV_YREG[E_CB] = (CELL) B;
|
|
|
|
|
ALWAYS_GONext();
|
|
|
|
|
ALWAYS_END_PREFETCH();
|
|
|
|
|
}
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
|
|
|
|
|
NoStackDExecute:
|
|
|
|
|
PROCESS_INT(interrupt_dexecute, continue_dexecute);
|
|
|
|
|
|
|
|
|
|
ENDBOp();
|
|
|
|
|
|
|
|
|
|
BOp(fcall, Osbpp);
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
ENV_YREG[E_CP] = (CELL) CPREG;
|
|
|
|
|
ENV_YREG[E_E] = (CELL) ENV;
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
ENV_YREG[E_DEPTH] = DEPTH;
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
ENDBOp();
|
|
|
|
|
|
|
|
|
|
BOp(call, Osbpp);
|
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
|
|
|
if (Yap_do_low_level_trace) {
|
|
|
|
|
low_level_trace(enter_pred,PREG->y_u.Osbpp.p,XREGS+1);
|
|
|
|
|
}
|
|
|
|
|
#endif /* LOW_LEVEL_TRACER */
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
{
|
|
|
|
|
PredEntry *pt;
|
|
|
|
|
CACHE_A1();
|
|
|
|
|
pt = PREG->y_u.Osbpp.p;
|
|
|
|
|
#ifndef NO_CHECKING
|
|
|
|
|
check_stack(NoStackCall, HR);
|
|
|
|
|
goto skip_call;
|
|
|
|
|
#endif
|
|
|
|
|
call_body:
|
|
|
|
|
/* external jump if we don;t want to creep */
|
|
|
|
|
FETCH_Y_FROM_ENV(YREG);
|
|
|
|
|
pt = PREG->y_u.Osbpp.p;
|
|
|
|
|
skip_call:
|
|
|
|
|
ENV = ENV_YREG;
|
|
|
|
|
/* Try to preserve the environment */
|
|
|
|
|
ENV_YREG = (CELL *) (((char *) ENV_YREG) + PREG->y_u.Osbpp.s);
|
|
|
|
|
CPREG = NEXTOP(PREG, Osbpp);
|
|
|
|
|
ALWAYS_LOOKAHEAD(pt->OpcodeOfPred);
|
|
|
|
|
PREG = pt->CodeOfPred;
|
|
|
|
|
/* for profiler */
|
|
|
|
|
save_pc();
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is primitives */
|
|
|
|
|
if (pt->ModuleOfPred) {
|
2015-01-20 03:00:42 +00:00
|
|
|
|
if (DEPTH == MkIntTerm(0)) {
|
2015-01-18 03:00:19 +00:00
|
|
|
|
FAIL();
|
2015-01-20 03:00:42 +00:00
|
|
|
|
} else {
|
|
|
|
|
DEPTH = RESET_DEPTH();
|
|
|
|
|
}
|
2015-01-18 03:00:19 +00:00
|
|
|
|
}
|
|
|
|
|
} else if (pt->ModuleOfPred)
|
|
|
|
|
DEPTH -= MkIntConstant(2);
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
|
{
|
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#endif /* YAPOR_SBA */
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *) B) {
|
|
|
|
|
ENV_YREG = (CELL *) B;
|
|
|
|
|
}
|
|
|
|
|
#endif /* FROZEN_STACKS */
|
|
|
|
|
WRITEBACK_Y_AS_ENV();
|
|
|
|
|
/* setup GB */
|
|
|
|
|
ENV_YREG[E_CB] = (CELL) B;
|
|
|
|
|
#ifdef YAPOR
|
|
|
|
|
SCH_check_requests();
|
|
|
|
|
#endif /* YAPOR */
|
|
|
|
|
ALWAYS_GONext();
|
|
|
|
|
ALWAYS_END_PREFETCH();
|
|
|
|
|
}
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
ENDBOp();
|
|
|
|
|
|
|
|
|
|
BOp(procceed, p);
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
ALWAYS_LOOKAHEAD(CPREG->opc);
|
|
|
|
|
PREG = CPREG;
|
|
|
|
|
/* for profiler */
|
|
|
|
|
save_pc();
|
|
|
|
|
ENV_YREG = ENV;
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
DEPTH = ENV_YREG[E_DEPTH];
|
|
|
|
|
#endif
|
|
|
|
|
WRITEBACK_Y_AS_ENV();
|
|
|
|
|
ALWAYS_GONext();
|
|
|
|
|
ALWAYS_END_PREFETCH();
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
|
|
|
|
|
NoStackCall:
|
|
|
|
|
PROCESS_INT(interrupt_call, call_body);
|
|
|
|
|
|
|
|
|
|
ENDBOp();
|
|
|
|
|
|
|
|
|
|
Op(allocate, e);
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
|
|
|
|
PREG = NEXTOP(PREG, e);
|
|
|
|
|
ENV_YREG[E_CP] = (CELL) CPREG;
|
|
|
|
|
ENV_YREG[E_E] = (CELL) ENV;
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
ENV_YREG[E_DEPTH] = DEPTH;
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
ENV = ENV_YREG;
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
GONext();
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
Op(deallocate, p);
|
|
|
|
|
CACHE_Y_AS_ENV(YREG);
|
2018-10-15 13:48:10 +01:00
|
|
|
|
// do this before checking
|
|
|
|
|
SREG = YREG;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
check_trail(TR);
|
2016-01-06 12:30:33 +00:00
|
|
|
|
#ifndef NO_CHECKING
|
|
|
|
|
/* check stacks */
|
|
|
|
|
check_stack(NoStackDeallocate, HR);
|
|
|
|
|
#endif
|
2015-01-18 03:00:19 +00:00
|
|
|
|
PREG = NEXTOP(PREG, p);
|
|
|
|
|
/* other instructions do depend on S being set by deallocate
|
|
|
|
|
:-( */
|
|
|
|
|
CPREG = (yamop *) ENV_YREG[E_CP];
|
|
|
|
|
ENV = ENV_YREG = (CELL *) ENV_YREG[E_E];
|
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
|
DEPTH = ENV_YREG[E_DEPTH];
|
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
|
#ifdef FROZEN_STACKS
|
|
|
|
|
{
|
|
|
|
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
|
|
|
|
#ifdef YAPOR_SBA
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *) top_b) ENV_YREG = (CELL *) top_b;
|
|
|
|
|
#endif /* YAPOR_SBA */
|
|
|
|
|
else ENV_YREG = (CELL *)((CELL) ENV_YREG + ENV_Size(CPREG));
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
if (ENV_YREG > (CELL *) B)
|
|
|
|
|
ENV_YREG = (CELL *) B;
|
|
|
|
|
else
|
|
|
|
|
ENV_YREG = (CELL *) ((CELL) ENV_YREG + ENV_Size(CPREG));
|
|
|
|
|
#endif /* FROZEN_STACKS */
|
|
|
|
|
WRITEBACK_Y_AS_ENV();
|
|
|
|
|
ENDCACHE_Y_AS_ENV();
|
|
|
|
|
GONext();
|
|
|
|
|
|
|
|
|
|
NoStackDeallocate:
|
|
|
|
|
BEGD(d0);
|
|
|
|
|
#ifdef SHADOW_S
|
2016-01-06 12:30:33 +00:00
|
|
|
|
Yap_REGS.S_ = YREG;
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#endif
|
2016-01-06 12:30:33 +00:00
|
|
|
|
PREG = NEXTOP(PREG,p);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
saveregs();
|
|
|
|
|
d0 = interrupt_deallocate( PASS_REGS1 );
|
|
|
|
|
setregs();
|
2016-01-06 12:30:33 +00:00
|
|
|
|
PREG = PREVOP(PREG,p);
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#ifdef SHADOW_S
|
|
|
|
|
SREG = Yap_REGS.S_;
|
|
|
|
|
#endif
|
2016-01-06 12:30:33 +00:00
|
|
|
|
// return to original deallocate
|
2015-01-18 03:00:19 +00:00
|
|
|
|
if (!d0) FAIL();
|
|
|
|
|
JMPNext();
|
|
|
|
|
ENDD(d0);
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
/**********************************************
|
|
|
|
|
* OPTYap instructions *
|
|
|
|
|
**********************************************/
|
|
|
|
|
|
|
|
|
|
#ifdef YAPOR
|
2015-01-20 03:00:42 +00:00
|
|
|
|
#include "or.insts.h"
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#endif /* YAPOR */
|
|
|
|
|
#ifdef TABLING
|
2015-01-20 03:00:42 +00:00
|
|
|
|
#include "tab.insts.h"
|
|
|
|
|
#include "tab.tries.insts.h"
|
2015-01-18 03:00:19 +00:00
|
|
|
|
#endif /* TABLING */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef BEAM
|
|
|
|
|
extern int eam_am(PredEntry *);
|
|
|
|
|
|
|
|
|
|
Op(retry_eam, e);
|
|
|
|
|
printf("Aqui estou eu..................\n");
|
|
|
|
|
if (!eam_am(2)) {
|
|
|
|
|
abort_eam("Falhei\n");
|
|
|
|
|
FAIL();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
goto procceed;
|
|
|
|
|
PREG = NEXTOP(PREG, e);
|
|
|
|
|
GONext();
|
|
|
|
|
ENDOp();
|
|
|
|
|
|
|
|
|
|
Op(run_eam, os);
|
|
|
|
|
if (inp==-9000) { /* use indexing to find out valid alternatives */
|
|
|
|
|
extern CELL *beam_ALTERNATIVES;
|
|
|
|
|
*beam_ALTERNATIVES= (CELL *) PREG->y_u.os.opcw;
|
|
|
|
|
beam_ALTERNATIVES++;
|
|
|
|
|
if (OLD_B!=B) goto fail;
|
|
|
|
|
#if PUSH_REGS
|
|
|
|
|
Yap_regp=old_regs;
|
|
|
|
|
#endif
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saveregs();
|
|
|
|
|
if (!eam_am((PredEntry *) PREG->y_u.os.s)) FAIL();
|
|
|
|
|
setregs();
|
|
|
|
|
|
|
|
|
|
/* cut */
|
|
|
|
|
BACKUP_B();
|
|
|
|
|
while (POP_CHOICE_POINT(B->cp_b)) {
|
|
|
|
|
POP_EXECUTE();
|
|
|
|
|
}
|
|
|
|
|
B = B->cp_b; /* cut_fail */
|
|
|
|
|
HB = B->cp_h; /* cut_fail */
|
|
|
|
|
RECOVER_B();
|
|
|
|
|
|
|
|
|
|
if (0) { register choiceptr ccp;
|
|
|
|
|
/* initialize ccp */
|
|
|
|
|
#define NORM_CP(CP) ((choiceptr)(CP))
|
|
|
|
|
|
|
|
|
|
YREG = (CELL *) (NORM_CP(YREG) - 1);
|
|
|
|
|
ccp = NORM_CP(YREG);
|
|
|
|
|
store_yaam_reg_cpdepth(ccp);
|
|
|
|
|
ccp->cp_tr = TR;
|
|
|
|
|
ccp->cp_ap = BEAM_RETRY_CODE;
|
|
|
|
|
ccp->cp_h = HR;
|
|
|
|
|
ccp->cp_b = B;
|
|
|
|
|
ccp->cp_env= ENV;
|
|
|
|
|
ccp->cp_cp = CPREG;
|
|
|
|
|
B = ccp;
|
|
|
|
|
SET_BB(B);
|
|
|
|
|
}
|
|
|
|
|
goto procceed;
|
|
|
|
|
PREG = NEXTOP(PREG, os);
|
|
|
|
|
GONext();
|
|
|
|
|
ENDOp();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|