23static char SccsId[] =
"%W% %G%";
26#include "inline-only.h"
28extern Functor FunctorAtt1, FunctorAttVar;
30#define IsAttVar(pt) __IsAttVar(pt PASS_REGS)
33INLINE_ONLY
bool __IsAttVar(CELL *pt USES_REGS) {
35 return (pt)[-1] == (CELL)FunctorAttVar && pt < HR;
37 return (pt)[-1] == (CELL)attvar_e;
41INLINE_ONLY
bool GlobalIsAttVar(CELL *pt) {
42 return (pt)[-1] == (CELL)FunctorAttVar;
45#define IsArrayReference(a) ((a)->array_access_func == FunctorArrayAccess)
58#define profiled_deref_head_TEST(D, Label) \
60 if (!strcmp(#D, "d0")) { \
61 EMIT_CONDITIONAL_SUCCESS("IsVarTerm(d0)"); \
62 } else if (!strcmp(#D, "d1")) { \
63 EMIT_CONDITIONAL_SUCCESS("IsVarTerm(d1)"); \
67 if (!strcmp(#D, "d0")) { \
68 EMIT_CONDITIONAL_FAIL("IsVarTerm(d0)"); \
69 } else if (!strcmp(#D, "d1")) { \
70 EMIT_CONDITIONAL_FAIL("IsVarTerm(d1)"); \
73#define deref_head(D, Label) \
77#define profiled_deref_body(D, A, LabelUnk, LabelNonVar) \
84 if (!strcmp(#D, "d0") && !strcmp(#A, "pt0")) { \
85 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0PT0); \
86 } else if (!strcmp(#D, "d0") && !strcmp(#A, "pt1")) { \
87 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0PT1); \
88 } else if (!strcmp(#D, "d0") && !strcmp(#A, "S_SREG")) { \
89 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0S_SREG); \
90 } else if (!strcmp(#D, "d1") && !strcmp(#A, "pt0")) { \
91 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D1PT0); \
92 } else if (!strcmp(#D, "d1") && !strcmp(#A, "pt1")) { \
93 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D1PT1); \
95 } while (Unsigned(A) != (D));
97#define deref_body(D, A, LabelUnk, LabelNonVar) \
103 (D) = *(CELL *)(D); \
104 } while (Unsigned(A) != (D))
106#define deref_body(D, A, LabelUnk, LabelNonVar) \
112 (D) = *(CELL *)(D); \
113 } while (Unsigned(A) != (D))
115#define do_derefa(D, A, LabelUnk, LabelDone) \
116 (D) = *(CELL *)(A); \
117 if (IsNonVarTerm(D)) \
122 (D) = *(CELL *)(D); \
126 } while (Unsigned(A) != (D)); \
129#define profiled_derefa_body(D, A, LabelUnk, LabelNonVar) \
132 (D) = *(CELL *)(D); \
133 if (!strcmp(#D, "d0") && !strcmp(#A, "pt0")) { \
134 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0PT0); \
135 } else if (!strcmp(#D, "d0") && !strcmp(#A, "pt1")) { \
136 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0PT1); \
137 } else if (!strcmp(#D, "d0") && !strcmp(#A, "S_SREG")) { \
138 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D0S_SREG); \
139 } else if (!strcmp(#D, "d1") && !strcmp(#A, "pt0")) { \
140 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D1PT0); \
141 } else if (!strcmp(#D, "d1") && !strcmp(#A, "pt1")) { \
142 EMIT_SIMPLE_BLOCK_TEST(YAAM_DEREF_BODY_D1PT1); \
147 } while (Unsigned(A) != (D));
149#define derefa_body(D, A, LabelUnk, LabelNonVar) \
152 (D) = *(CELL *)(D); \
156 } while (Unsigned(A) != (D))
158#if UNIQUE_TAG_FOR_PAIRS
168#define deref_list_head(D, Label) \
169 if (!IsPairTerm(D)) \
172#define deref_list_body(D, A, LabelList, LabelNonVar) \
178 if (Unsigned(A) == (D)) \
184INLINE_ONLY CELL *deref_ptr(CELL *A);
186INLINE_ONLY CELL *deref_ptr(CELL *A) {
193 if (Unsigned(A) == (D))
207#define RESET_VARIABLE(V) (*(CELL *)(V) = Unsigned(V))
211#define DO_TRAIL(TERM, VAL) \
216 TrailTerm(r) = (Term)(TERM); \
217 TrailVal(r) = (CELL)(VAL); \
220#ifdef BFZ_TRAIL_SCHEME
222#define TRAIL(TERM, VAL) \
223 if (OUTSIDE(HBREG, TERM, B) || ((TERM) > (CELL *)B_FZ)) \
226#define TRAIL_LOCAL(TERM, VAL) \
227 if ((TERM) > (CELL *)B || (TERM) > (CELL *)B_FZ) \
232#define TRAIL(TERM, VAL) \
233 if (OUTSIDE(HBREG, TERM, BBREG)) \
236#define TRAIL_LOCAL(TERM, VAL) \
237 if ((TERM) > (CELL *)BBREG) \
244#define TRAIL_GLOBAL(TERM, VAL) \
245 if ((TERM) < HBREG) \
248#define DO_MATRAIL(TERM, OLDVAL, NEWVAL) \
250 register tr_fr_ptr r = TR; \
252 TrailVal(r) = (OLDVAL); \
253 TrailTerm(r) = TrailTerm(r + 1) = AbsAppl((CELL *)(TERM)); \
254 TrailVal(r + 1) = (NEWVAL); \
257#define MATRAIL(TERM, OVAL, VAL) \
258 if (OUTSIDE(HBREG, TERM, B)) \
259 DO_MATRAIL(TERM, OVAL, VAL)
263#if defined(i386) && !defined(TERM_EXTENSIONS)
265#define DO_TRAIL(A, D) \
270 TrailTerm(r) = (CELL)(A); \
274 if (OUTSIDE(HBREG, A, B)) \
277#define TRAIL_GLOBAL(A, D) \
281#define TRAIL_LOCAL(A, D) \
282 if ((A) > (CELL *)B) \
285#elif defined(__alpha) && !defined(TERM_EXTENSIONS)
290 TrailTerm(TR) = (CELL)(A); \
291 if (OUTSIDE(HBREG, A, B)) \
295 TrailTerm(TR) = (CELL)(A); \
296 if (!OUTSIDE(HBREG, A, B)) \
299#define TRAIL_GLOBAL(A, D) \
304#define TRAIL_LOCAL(A, D) \
306 if ((A) > ((CELL *)(B))) \
309#elif !defined(TERM_EXTENSIONS)
311#define DO_TRAIL(A, D) TrailTerm(TR++) = (CELL)(A)
314 if (OUTSIDE(HBREG, A, B)) \
317#define TRAIL_AND_JUMP(A, D) \
318 if (IN_BETWEEN(HBREG, A, B)) \
322#define TRAIL_GLOBAL(A, D) \
326#define TRAIL_LOCAL(A, D) \
327 if ((A) > ((CELL *)B)) \
332#define DO_TRAIL(A, D) TrailTerm(TR++) = (CELL)(A)
335 if (OUTSIDE(HBREG, A, B)) \
338#define TrailAndJump(A, D) \
339 if (IN_BETWEEN(HBREG, A, B)) \
342#define TRAIL_GLOBAL(A, D) \
346#define TRAIL_LOCAL(A, D) \
347 if ((A) > ((CELL *)B)) \
358#define DO_MATRAIL(VP, OLDV, D) \
360 TrailTerm(TR + 1) = OLDV; \
361 TrailTerm(TR) = TrailTerm(TR + 2) = AbsAppl(VP); \
365#define MATRAIL(VP, OLDV, D) \
366 if (OUTSIDE(HBREG, VP, B)) \
367 DO_MATRAIL(VP, OLDV, D)
371#define REF_TO_TRENTRY(REF) AbsPair(((CELL *)&((REF)->Flags)))
372#define CLREF_TO_TRENTRY(REF) AbsPair(((CELL *)&((REF)->ClFlags)))
375#define TRAIL_REF(REF) \
376 RESET_VARIABLE(&TrailVal(TR)), TrailTerm(TR++) = REF_TO_TRENTRY(REF)
377#define TRAIL_CLREF(REF) \
378 RESET_VARIABLE(&TrailVal(TR)), TrailTerm(TR++) = CLREF_TO_TRENTRY(REF)
379#define TRAIL_LINK(REF) \
380 RESET_VARIABLE(&TrailVal(TR)), TrailTerm(TR++) = AbsPair((CELL *)(REF))
382#define TRAIL_REF(REF) TrailTerm(TR++) = REF_TO_TRENTRY(REF)
383#define TRAIL_CLREF(REF) TrailTerm(TR++) = CLREF_TO_TRENTRY(REF)
384#define TRAIL_LINK(REF) TrailTerm(TR++) = AbsPair((CELL *)(REF))
386#define TRAIL_FRAME(FR) DO_TRAIL(AbsPair((CELL *)(LOCAL_TrailBase)), FR)
388extern void Yap_WakeUp(CELL *v);
390#define Bind_Local(A, D) \
395#define Bind_Global(A, D) \
398 if (__builtin_expect(GlobalIsAttVar(A), 0)) \
401 TRAIL_GLOBAL(A, D); \
403#define YapBind(A, D) \
407 if (__builtin_expect(GlobalIsAttVar(A), 0)) \
410 TRAIL_GLOBAL(A, D); \
415#define Bind_NonAtt(A, D) \
420#define Bind_Global_NonAtt(A, D) \
423 TRAIL_GLOBAL(A, D); \
425#define Bind_and_Trail(A, D) \
432#define MaBind(VP, D) \
434 MATRAIL((VP), *(VP), (D)); \
444INLINE_ONLY
void reset_trail(tr_fr_ptr TR0);
446INLINE_ONLY
void reset_trail(tr_fr_ptr TR0) {
452#ifdef MULTI_ASSIGNMENT_VARIABLES
455 CELL *pt = (CELL *)d1;
457#ifdef MULTI_ASSIGNMENT_VARIABLES
459 CELL *pt = RepAppl(d1);
464 pt[0] = TrailVal(TR - 1);
467 pt[0] = TrailTerm(TR - 1);
475INLINE_ONLY
void reset_attvars(CELL *dvarsmin, CELL *dvarsmax);
477INLINE_ONLY
void reset_attvars(CELL *dvarsmin, CELL *dvarsmax) {
482 newv = CellPtr(*dvarsmin);
483 RESET_VARIABLE(dvarsmin + 1);
484 if (IsUnboundVar(dvarsmin))
486 RESET_VARIABLE(dvarsmin);
492INLINE_ONLY
void close_attvar_chain(CELL *dvarsmin,
495INLINE_ONLY
void close_attvar_chain(CELL *dvarsmin,
502 YapBind(dvarsmin + 1, dvarsmin[1]);
503 if (IsUnboundVar(dvarsmin))
505 newv = CellPtr(*dvarsmin);
506 RESET_VARIABLE(dvarsmin);
512INLINE_ONLY
bool Yap_unify(Term t0, Term t1);
514INLINE_ONLY
bool Yap_unify(Term t0, Term t1) {
518 if (Yap_IUnify(t0, t1)) {
526INLINE_ONLY Int Yap_unify_constant(Term a, Term cons);
528INLINE_ONLY Int Yap_unify_constant(Term a, Term cons) {
531 deref_head(a, unify_cons_unk);
535 else if (IsApplTerm(a)) {
537 if (!IsApplTerm(cons))
539 f = FunctorOfTerm(a);
540 if (f != FunctorOfTerm(cons))
542 if (IsExtensionFunctor(f)) {
547 CELL d0 = RepAppl(a)[1];
548 CELL d1 = RepAppl(cons)[1];
552 Float d0 = FloatOfTerm(a);
553 Float d1 = FloatOfTerm(cons);
558 return (Yap_gmp_tcmp_big_big(a, cons) == 0);
568 deref_body(a, pt, unify_cons_unk, unify_cons_nonvar);
573#define EQ_OK_IN_CMP 1
574#define LT_OK_IN_CMP 2
575#define GT_OK_IN_CMP 4
577static inline int do_cut(
int i) {
579 if (POP_CHOICE_POINT(B->cp_b)) {
587#define cut_succeed() return do_cut(TRUE)
589#define cut_fail() return do_cut(FALSE)
591INLINE_ONLY Term MkGlobal(Term t)
593 if (!IsVarTerm((t = Deref(t))))
return t;
594 Term *pt = VarOfTerm(t);
595 if (H0<=pt && HR> pt)
597 Term nt = MkVarTerm();