514 lines
35 KiB
C
514 lines
35 KiB
C
p #define USER_SWITCH_INSTINIT BLOCKADDRESS = (CELL)(*_PREG);
|
|
{
|
|
yamop *new = Yap_udi_search((*_PREG)->u.lp.p);
|
|
if (!new) {
|
|
(*_PREG) = (*_PREG)->u.lp.l;
|
|
JMPNext();
|
|
} else {
|
|
(*_PREG) = new;
|
|
JMPNext();
|
|
}
|
|
}
|
|
|
|
#define USER_SWITCH_END BLOCK = (CELL)USER_SWITCH_END;
|
|
|
|
#define SWITCH_ON_TYPE_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = CACHED_A1(); \
|
|
Int nonvar = 1; \
|
|
if (IsVarTerm(d0)) { \
|
|
nonvar = 0; \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.llll.l4); \
|
|
(*_PREG) = (*_PREG)->u.llll.l4; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
if (IsPairTerm(d0)) { \
|
|
(*_SREG) = RepPair(d0); \
|
|
copy_jmp_address((*_PREG)->u.llll.l1); \
|
|
(*_PREG) = (*_PREG)->u.llll.l1; \
|
|
JMPNext(); \
|
|
} else if (!IsApplTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.llll.l2); \
|
|
(*_PREG) = (*_PREG)->u.llll.l2; \
|
|
I_R = d0; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.llll.l3); \
|
|
(*_PREG) = (*_PREG)->u.llll.l3; \
|
|
(*_SREG) = RepAppl(d0); \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define SWITCH_ON_TYPE_END BLOCK = (CELL)SWITCH_ON_TYPE_END;
|
|
|
|
#if UNIQUE_TAG_FOR_PAIRS
|
|
#define SWITCH_LIST_NL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
ALWAYS_LOOKAHEAD((*_PREG)->u.ollll.pop); \
|
|
d0 = CACHED_A1(); \
|
|
Int nonvar = 0; \
|
|
Int pair = 1; \
|
|
if (!IsPairTerm(d0)) { \
|
|
pair = 0; \
|
|
do { \
|
|
if (!IsVarTerm(d0)) { \
|
|
if (d0 == TermNil) { \
|
|
(*_PREG) = (*_PREG)->u.ollll.l2; \
|
|
JMPNext(); \
|
|
} else { \
|
|
if (IsApplTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l3); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l3; \
|
|
(*_SREG) = RepAppl(d0); \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l3); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l3; \
|
|
I_R = d0; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(pt0); \
|
|
if (Unsigned(pt0) == (d0)) \
|
|
break; \
|
|
if (IsPairTerm(d0)) { \
|
|
pair = 1; \
|
|
break; \
|
|
} \
|
|
} while (TRUE); \
|
|
if (!nonvar && !pair) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l4); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l4; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (!nonvar && pair) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l1); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l1; \
|
|
(*_SREG) = RepPair(d0); \
|
|
ALWAYS_GONext(); \
|
|
}
|
|
#else
|
|
#define SWITCH_LIST_NL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
ALWAYS_LOOKAHEAD((*_PREG)->u.ollll.pop); \
|
|
d0 = CACHED_A1(); \
|
|
Int nonvar = 0; \
|
|
if (IsVarTerm(d0)) { \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l4); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l4; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
if (__builtin_expect(IsPairTerm(d0), 1)) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l1); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l1; \
|
|
(*_SREG) = RepPair(d0); \
|
|
ALWAYS_GONext(); \
|
|
} \
|
|
if (d0 == TermNil) { \
|
|
(*_PREG) = (*_PREG)->u.ollll.l2; \
|
|
JMPNext(); \
|
|
} else { \
|
|
if (IsApplTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l3); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l3; \
|
|
(*_SREG) = RepAppl(d0); \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.ollll.l3); \
|
|
(*_PREG) = (*_PREG)->u.ollll.l3; \
|
|
I_R = d0; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
}
|
|
#endif
|
|
|
|
#define SWITCH_LIST_NL_END BLOCK = (CELL)SWITCH_LIST_NL_END;
|
|
|
|
#define SWITCH_ON_ARG_TYPE_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = XREG((*_PREG)->u.xllll.x); \
|
|
Int nonvar = 1; \
|
|
if (IsVarTerm(d0)) { \
|
|
nonvar = 0; \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.xllll.l4); \
|
|
(*_PREG) = (*_PREG)->u.xllll.l4; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
if (IsPairTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.xllll.l1); \
|
|
(*_PREG) = (*_PREG)->u.xllll.l1; \
|
|
(*_SREG) = RepPair(d0); \
|
|
JMPNext(); \
|
|
} else if (!IsApplTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.xllll.l2); \
|
|
(*_PREG) = (*_PREG)->u.xllll.l2; \
|
|
I_R = d0; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.xllll.l3); \
|
|
(*_PREG) = (*_PREG)->u.xllll.l3; \
|
|
(*_SREG) = RepAppl(d0); \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define SWITCH_ON_ARG_TYPE_END BLOCK = (CELL)SWITCH_ON_ARG_TYPE_END;
|
|
|
|
#define SWITCH_ON_SUB_ARG_TYPE_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = (*_SREG)[(*_PREG)->u.sllll.s]; \
|
|
Int nonvar = 1; \
|
|
if (IsVarTerm(d0)) { \
|
|
nonvar = 0; \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.sllll.l4); \
|
|
(*_PREG) = (*_PREG)->u.sllll.l4; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
if (IsPairTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.sllll.l1); \
|
|
(*_PREG) = (*_PREG)->u.sllll.l1; \
|
|
(*_SREG) = RepPair(d0); \
|
|
JMPNext(); \
|
|
} else if (!IsApplTerm(d0)) { \
|
|
copy_jmp_address((*_PREG)->u.sllll.l2); \
|
|
(*_PREG) = (*_PREG)->u.sllll.l2; \
|
|
I_R = d0; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.sllll.l3); \
|
|
(*_PREG) = (*_PREG)->u.sllll.l3; \
|
|
(*_SREG) = RepAppl(d0); \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define SWITCH_ON_SUB_ARG_TYPE_END BLOCK = (CELL)SWITCH_ON_SUB_ARG_TYPE_END;
|
|
|
|
#define JUMP_IF_VAR_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = CACHED_A1(); \
|
|
Int nonvar = 1; \
|
|
if (IsVarTerm(d0)) { \
|
|
nonvar = 0; \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.l.l); \
|
|
(*_PREG) = (*_PREG)->u.l.l; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
(*_PREG) = NEXTOP((*_PREG), l); \
|
|
JMPNext(); \
|
|
}
|
|
|
|
#define JUMP_IF_VAR_END BLOCK = (CELL)JUMP_IF_VAR_END;
|
|
|
|
#define JUMP_IF_NONVAR_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = XREG((*_PREG)->u.xll.x); \
|
|
Int nonvar = 0; \
|
|
if (IsVarTerm(d0)) { \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
(*_PREG) = NEXTOP((*_PREG), xll); \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.xll.l1); \
|
|
(*_PREG) = (*_PREG)->u.xll.l1; \
|
|
JMPNext(); \
|
|
}
|
|
|
|
#define JUMP_IF_NONVAR_END BLOCK = (CELL)JUMP_IF_NONVAR_END;
|
|
|
|
#define IF_NOT_THEN_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
register CELL *pt0; \
|
|
d0 = CACHED_A1(); \
|
|
Int nonvar = 1; \
|
|
if (IsVarTerm(d0)) { \
|
|
nonvar = 0; \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
while (Unsigned(pt0) != (d0)) { \
|
|
if (!IsVarTerm(d0)) { \
|
|
nonvar = 1; \
|
|
break; \
|
|
} \
|
|
(pt0) = (CELL *)(d0); \
|
|
(d0) = *(CELL *)(d0); \
|
|
} \
|
|
if (!nonvar) { \
|
|
copy_jmp_address((*_PREG)->u.clll.l3); \
|
|
(*_PREG) = (*_PREG)->u.clll.l3; \
|
|
JMPNext(); \
|
|
} \
|
|
} \
|
|
if (nonvar) { \
|
|
if (d0 == (*_PREG)->u.clll.c) { \
|
|
copy_jmp_address((*_PREG)->u.clll.l2); \
|
|
(*_PREG) = (*_PREG)->u.clll.l2; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_address((*_PREG)->u.clll.l1); \
|
|
(*_PREG) = (*_PREG)->u.clll.l1; \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define IF_NOT_THEN_END BLOCK = (CELL)IF_NOT_THEN_END;
|
|
|
|
#define HRASH_SHIFT 6
|
|
|
|
#define SWITCH_ON_FUNC_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0, d1; \
|
|
register CELL *pt0; \
|
|
d1 = *(*_SREG)++; \
|
|
{ \
|
|
CELL Mask = ((*_PREG)->u.sssl.s - 1) << 1, \
|
|
hash = d1 >> (HRASH_SHIFT - 1) & Mask; \
|
|
CELL *base; \
|
|
base = (CELL *)(*_PREG)->u.sssl.l; \
|
|
pt0 = base + hash; \
|
|
d0 = pt0[0]; \
|
|
if (d0 == d1 || d0 == 0) { \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)(pt0[1]); \
|
|
JMPNext(); \
|
|
} else { \
|
|
register CELL d = ((d1 | 1) << 1) & Mask; \
|
|
while (1) { \
|
|
hash = (hash + d) & Mask; \
|
|
pt0 = base + hash; \
|
|
d0 = pt0[0]; \
|
|
if (d0 == d1 || d0 == 0) { \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)pt0[1]; \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SWITCH_ON_FUNC_END BLOCK = (CELL)SWITCH_ON_FUNC_END;
|
|
|
|
#define SWITCH_ON_CONS_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0, d1; \
|
|
register CELL *pt0; \
|
|
d1 = I_R; \
|
|
{ \
|
|
CELL Mask = ((*_PREG)->u.sssl.s - 1) << 1, \
|
|
hash = d1 >> (HRASH_SHIFT - 1) & Mask; \
|
|
CELL *base; \
|
|
base = (CELL *)(*_PREG)->u.sssl.l; \
|
|
pt0 = base + hash; \
|
|
d0 = pt0[0]; \
|
|
if (d0 == d1 || d0 == 0) { \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)(pt0[1]); \
|
|
JMPNext(); \
|
|
} else { \
|
|
register CELL d = ((d1 | 1) << 1) & Mask; \
|
|
while (1) { \
|
|
hash = (hash + d) & Mask; \
|
|
pt0 = base + hash; \
|
|
d0 = pt0[0]; \
|
|
if (d0 == d1 || d0 == 0) { \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)pt0[1]; \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define SWITCH_ON_CONS_END BLOCK = (CELL)SWITCH_ON_CONS_END;
|
|
|
|
#define GO_ON_FUNC_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
{ \
|
|
CELL *pt = (CELL *)((*_PREG)->u.sssl.l); \
|
|
d0 = *(*_SREG)++; \
|
|
if (d0 == pt[0]) { \
|
|
copy_jmp_addressa(pt + 1); \
|
|
(*_PREG) = (yamop *)pt[1]; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_addressa(pt + 3); \
|
|
(*_PREG) = (yamop *)pt[3]; \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define GO_ON_FUNC_END BLOCK = (CELL)GO_ON_FUNC_END;
|
|
|
|
#define GO_ON_CONS_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d0; \
|
|
{ \
|
|
CELL *pt = (CELL *)((*_PREG)->u.sssl.l); \
|
|
d0 = I_R; \
|
|
if (d0 == pt[0]) { \
|
|
copy_jmp_addressa(pt + 1); \
|
|
(*_PREG) = (yamop *)pt[1]; \
|
|
JMPNext(); \
|
|
} else { \
|
|
copy_jmp_addressa(pt + 3); \
|
|
(*_PREG) = (yamop *)pt[3]; \
|
|
JMPNext(); \
|
|
} \
|
|
}
|
|
|
|
#define GO_ON_CONS_END BLOCK = (CELL)GO_ON_CONS_END;
|
|
|
|
#define IF_FUNC_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d1; \
|
|
register CELL *pt0; \
|
|
pt0 = (CELL *)(*_PREG)->u.sssl.l; \
|
|
d1 = *(*_SREG)++; \
|
|
while (pt0[0] != d1 && pt0[0] != (CELL)NULL) { \
|
|
pt0 += 2; \
|
|
} \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)(pt0[1]); \
|
|
JMPNext();
|
|
|
|
#define IF_FUNC_END BLOCK = (CELL)IF_FUNC_END;
|
|
|
|
#define IF_CONS_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
register CELL d1; \
|
|
register CELL *pt0; \
|
|
pt0 = (CELL *)(*_PREG)->u.sssl.l; \
|
|
d1 = I_R; \
|
|
while (pt0[0] != d1 && pt0[0] != 0L) { \
|
|
pt0 += 2; \
|
|
} \
|
|
copy_jmp_addressa(pt0 + 1); \
|
|
(*_PREG) = (yamop *)(pt0[1]); \
|
|
JMPNext();
|
|
|
|
#define IF_CONS_END BLOCK = (CELL)IF_CONS_END;
|
|
|
|
#define INDEX_DBREF_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
(*_PREG) = NEXTOP((*_PREG), e); \
|
|
I_R = AbsAppl((*_SREG) - 1); \
|
|
GONext();
|
|
|
|
#define INDEX_DBREF_END BLOCK = (CELL)INDEX_DBREF_END;
|
|
|
|
#define INDEX_BLOB_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
(*_PREG) = NEXTOP((*_PREG), e); \
|
|
I_R = Yap_DoubleP_key((*_SREG)); \
|
|
GONext();
|
|
|
|
#define INDEX_BLOB_END BLOCK = (CELL)INDEX_BLOB_END;
|
|
|
|
#define INDEX_LONG_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
(*_PREG) = NEXTOP((*_PREG), e); \
|
|
I_R = Yap_IntP_key((*_SREG)); \
|
|
GONext();
|
|
|
|
#define INDEX_LONG_END BLOCK = (CELL)INDEX_LONG_INSTINIT;
|