/************************************************************************\ * Get Instructions * \************************************************************************/ #include #ifdef INDENT_CODE { { { #endif /* INDENT_CODE */ Op(get_x_var, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xr); XREG(PREG->y_u.xx.xl) = d0; PREG = NEXTOP(PREG, xx); ENDD(d0); GONext(); ENDOp(); Op(get_y_var, yx); BEGD(d0); BEGP(pt0); pt0 = YREG + PREG->y_u.yx.y; d0 = XREG(PREG->y_u.yx.x); PREG = NEXTOP(PREG, yx); INITIALIZE_PERMVAR(pt0,d0); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); Op(get_yy_var, yyxx); CACHE_Y(YREG); BEGD(d0); BEGP(pt0); pt0 = S_YREG + PREG->y_u.yyxx.y1; d0 = XREG(PREG->y_u.yyxx.x1); BEGD(d1); BEGP(pt1); pt1 = S_YREG + PREG->y_u.yyx.y2; d1 = XREG(PREG->y_u.yyxx.x2); PREG = NEXTOP(PREG, yyxx); INITIALIZE_PERMVAR(pt0,d0); INITIALIZE_PERMVAR(pt1,d1); ENDP(pt1); ENDD(d1); GONext(); ENDP(pt0); ENDD(d0); ENDCACHE_Y(); ENDOp(); /* The code for get_x_val is hard to follow because I use a * lot of jumps. The convention is that in the label * gval_X_YREG X refers to the state of the first argument, and * YREG to the state of the second argument */ Op(get_x_val, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xl); deref_head(d0, gvalx_unk); /* d0 will keep the first argument */ gvalx_nonvar: /* first argument is bound */ BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); deref_head(d1, gvalx_nonvar_unk); gvalx_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, xx); UnifyBound(d0, d1); BEGP(pt0); /* deref second argument */ deref_body(d1, pt0, gvalx_nonvar_unk, gvalx_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, xx); YapBind(pt0, d0); GONext(); ENDP(pt0); ENDD(d1); BEGP(pt0); /* first argument may be unbound */ deref_body(d0, pt0, gvalx_unk, gvalx_nonvar); /* first argument is unbound and in pt0 and in d0 */ BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); deref_head(d1, gvalx_var_unk); gvalx_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, xx); YapBind(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, gvalx_var_unk, gvalx_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, xx); UnifyCells(pt0, pt1); GONext(); ENDP(pt1); ENDD(d1); ENDP(pt0); ENDD(d0); ENDOp(); /* The code for get_y_val mostly uses the code for get_x_val */ Op(get_y_val, yx); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = YREG + PREG->y_u.yx.y; d0 = *pt0; /* From now on, it's just a copy of the code for get_x_val */ deref_head(d0, gvaly_unk); gvaly_nonvar: /* first argument is bound */ d1 = XREG(PREG->y_u.yx.x); deref_head(d1, gvaly_nonvar_unk); gvaly_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, yx); UnifyBound(d0, d1); BEGP(pt1); /* deref second argument */ deref_body(d1, pt1, gvaly_nonvar_unk, gvaly_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, yx); YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, gvaly_unk, gvaly_nonvar); /* first argument is unbound */ d1 = XREG(PREG->y_u.yx.x); deref_head(d1, gvaly_var_unk); gvaly_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, yx); YapBind(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, gvaly_var_unk, gvaly_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, yx); UnifyCells(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_atom, xc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = XREG(PREG->y_u.xc.x); d1 = PREG->y_u.xc.c; BEGP(pt0); deref_head(d0, gatom_unk); /* argument is nonvar */ gatom_nonvar: if (d0 == d1) { PREG = NEXTOP(PREG, xc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_unk, gatom_nonvar); /* argument is a variable */ PREG = NEXTOP(PREG, xc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_atom_exo, x); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = XREG(PREG->y_u.x.x); d1 = *SREG; SREG++; BEGP(pt0); deref_head(d0, gatom_exo_unk); /* argument is nonvar */ gatom_exo_nonvar: if (d0 == d1) { PREG = NEXTOP(PREG, x); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_exo_unk, gatom_exo_nonvar); /* argument is a variable */ pt0 = (CELL *)d0; PREG = NEXTOP(PREG, x); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_2atoms, cc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = ARG1; BEGP(pt0); deref_head(d0, gatom_2unk); /* argument is nonvar */ gatom_2nonvar: if (d0 == PREG->y_u.cc.c1) { goto gatom_2b; } else { FAIL(); } deref_body(d0, pt0, gatom_2unk, gatom_2nonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cc.c1); ENDP(pt0); gatom_2b: /* fetch arguments */ d0 = ARG2; d1 = PREG->y_u.cc.c2; BEGP(pt0); deref_head(d0, gatom_2bunk); /* argument is nonvar */ gatom_2bnonvar: if (d0 == d1) { PREG = NEXTOP(PREG, cc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_2bunk, gatom_2bnonvar); /* argument is a variable */ PREG = NEXTOP(PREG, cc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_3atoms, ccc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = ARG1; BEGP(pt0); deref_head(d0, gatom_3unk); /* argument is nonvar */ gatom_3nonvar: if (d0 == PREG->y_u.ccc.c1) { goto gatom_3b; } else { FAIL(); } deref_body(d0, pt0, gatom_3unk, gatom_3nonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccc.c1); ENDP(pt0); gatom_3b: /* fetch arguments */ d0 = ARG2; BEGP(pt0); deref_head(d0, gatom_3bunk); /* argument is nonvar */ gatom_3bnonvar: if (d0 == PREG->y_u.ccc.c2) { goto gatom_3c; } else { FAIL(); } deref_body(d0, pt0, gatom_3bunk, gatom_3bnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccc.c2); ENDP(pt0); gatom_3c: /* fetch arguments */ d0 = ARG3; d1 = PREG->y_u.ccc.c3; BEGP(pt0); deref_head(d0, gatom_3cunk); /* argument is nonvar */ gatom_3cnonvar: if (d0 == d1) { PREG = NEXTOP(PREG, ccc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_3cunk, gatom_3cnonvar); /* argument is a variable */ PREG = NEXTOP(PREG, ccc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_4atoms, cccc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = ARG1; BEGP(pt0); deref_head(d0, gatom_4unk); /* argument is nonvar */ gatom_4nonvar: if (d0 == PREG->y_u.cccc.c1) { goto gatom_4b; } else { FAIL(); } deref_body(d0, pt0, gatom_4unk, gatom_4nonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccc.c1); ENDP(pt0); gatom_4b: /* fetch arguments */ d0 = ARG2; BEGP(pt0); deref_head(d0, gatom_4bunk); /* argument is nonvar */ gatom_4bnonvar: if (d0 == PREG->y_u.cccc.c2) { goto gatom_4c; } else { FAIL(); } deref_body(d0, pt0, gatom_4bunk, gatom_4bnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccc.c2); ENDP(pt0); gatom_4c: /* fetch arguments */ d0 = ARG3; BEGP(pt0); deref_head(d0, gatom_4cunk); /* argument is nonvar */ gatom_4cnonvar: if (d0 == PREG->y_u.cccc.c3) { goto gatom_4d; } else { FAIL(); } deref_body(d0, pt0, gatom_4cunk, gatom_4cnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccc.c3); ENDP(pt0); gatom_4d: /* fetch arguments */ d0 = ARG4; d1 = PREG->y_u.cccc.c4; BEGP(pt0); deref_head(d0, gatom_4dunk); /* argument is nonvar */ gatom_4dnonvar: if (d0 == d1) { PREG = NEXTOP(PREG, cccc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_4dunk, gatom_4dnonvar); /* argument is a variable */ PREG = NEXTOP(PREG, cccc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_5atoms, ccccc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = ARG1; BEGP(pt0); deref_head(d0, gatom_5unk); /* argument is nonvar */ gatom_5nonvar: if (d0 == PREG->y_u.ccccc.c1) { goto gatom_5b; } else { FAIL(); } deref_body(d0, pt0, gatom_5unk, gatom_5nonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccccc.c1); ENDP(pt0); gatom_5b: /* fetch arguments */ d0 = ARG2; BEGP(pt0); deref_head(d0, gatom_5bunk); /* argument is nonvar */ gatom_5bnonvar: if (d0 == PREG->y_u.ccccc.c2) { goto gatom_5c; } else { FAIL(); } deref_body(d0, pt0, gatom_5bunk, gatom_5bnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccccc.c2); ENDP(pt0); gatom_5c: /* fetch arguments */ d0 = ARG3; BEGP(pt0); deref_head(d0, gatom_5cunk); /* argument is nonvar */ gatom_5cnonvar: if (d0 == PREG->y_u.ccccc.c3) { goto gatom_5d; } else { FAIL(); } deref_body(d0, pt0, gatom_5cunk, gatom_5cnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccccc.c3); ENDP(pt0); gatom_5d: /* fetch arguments */ d0 = ARG4; BEGP(pt0); deref_head(d0, gatom_5dunk); /* argument is nonvar */ gatom_5dnonvar: if (d0 == PREG->y_u.ccccc.c4) { goto gatom_5e; } else { FAIL(); } deref_body(d0, pt0, gatom_5dunk, gatom_5dnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.ccccc.c4); ENDP(pt0); gatom_5e: /* fetch arguments */ d0 = ARG5; d1 = PREG->y_u.ccccc.c5; BEGP(pt0); deref_head(d0, gatom_5eunk); /* argument is nonvar */ gatom_5enonvar: if (d0 == d1) { PREG = NEXTOP(PREG, ccccc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_5eunk, gatom_5enonvar); /* argument is a variable */ PREG = NEXTOP(PREG, ccccc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(get_6atoms, cccccc); BEGD(d0); BEGD(d1); /* fetch arguments */ d0 = ARG1; BEGP(pt0); deref_head(d0, gatom_6unk); /* argument is nonvar */ gatom_6nonvar: if (d0 == PREG->y_u.cccccc.c1) { goto gatom_6b; } else { FAIL(); } deref_body(d0, pt0, gatom_6unk, gatom_6nonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccccc.c1); ENDP(pt0); gatom_6b: /* fetch arguments */ d0 = ARG2; BEGP(pt0); deref_head(d0, gatom_6bunk); /* argument is nonvar */ gatom_6bnonvar: if (d0 == PREG->y_u.cccccc.c2) { goto gatom_6c; } else { FAIL(); } deref_body(d0, pt0, gatom_6bunk, gatom_6bnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccccc.c2); ENDP(pt0); gatom_6c: /* fetch arguments */ d0 = ARG3; BEGP(pt0); deref_head(d0, gatom_6cunk); /* argument is nonvar */ gatom_6cnonvar: if (d0 == PREG->y_u.cccccc.c3) { goto gatom_6d; } else { FAIL(); } deref_body(d0, pt0, gatom_6cunk, gatom_6cnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccccc.c3); ENDP(pt0); gatom_6d: /* fetch arguments */ d0 = ARG4; BEGP(pt0); deref_head(d0, gatom_6dunk); /* argument is nonvar */ gatom_6dnonvar: if (d0 == PREG->y_u.cccccc.c4) { goto gatom_6e; } else { FAIL(); } deref_body(d0, pt0, gatom_6dunk, gatom_6dnonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccccc.c4); ENDP(pt0); gatom_6e: /* fetch arguments */ d0 = ARG5; BEGP(pt0); deref_head(d0, gatom_6eunk); /* argument is nonvar */ gatom_6enonvar: if (d0 == PREG->y_u.cccccc.c5) { goto gatom_6f; } else { FAIL(); } deref_body(d0, pt0, gatom_6eunk, gatom_6enonvar); /* argument is a variable */ YapBind(pt0, PREG->y_u.cccccc.c5); ENDP(pt0); gatom_6f: /* fetch arguments */ d0 = ARG6; d1 = PREG->y_u.cccccc.c6; BEGP(pt0); deref_head(d0, gatom_6funk); /* argument is nonvar */ gatom_6fnonvar: if (d0 == d1) { PREG = NEXTOP(PREG, cccccc); GONext(); } else { FAIL(); } deref_body(d0, pt0, gatom_6funk, gatom_6fnonvar); /* argument is a variable */ PREG = NEXTOP(PREG, cccccc); YapBind(pt0, d1); GONext(); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); /* The next instructions can lead to either the READ stream * or the write stream */ OpRW(get_list, x); BEGD(d0); d0 = XREG(PREG->y_u.x.x); deref_head(d0, glist_unk); glist_nonvar: /* did we find a list? */ if (!IsPairTerm(d0)) { FAIL(); } START_PREFETCH(x); PREG = NEXTOP(PREG, x); /* enter read mode */ SREG = RepPair(d0); GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, glist_unk, glist_nonvar); /* glist var */ /* enter write mode */ CACHE_S(); S_SREG = HR; START_PREFETCH_W(x); PREG = NEXTOP(PREG, x); BEGD(d0); d0 = AbsPair(S_SREG); YapBind(pt0, d0); S_SREG = HR; /* don't put an ENDD just after a label */ HR = S_SREG + 2; ENDD(d0); WRITEBACK_S(S_SREG); GONextW(); END_PREFETCH_W(); ENDCACHE_S(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpRW(get_struct, xfa); BEGD(d0); d0 = XREG(PREG->y_u.xfa.x); deref_head(d0, gstruct_unk); gstruct_nonvar: if (!IsApplTerm(d0)) FAIL(); /* we have met a compound term */ START_PREFETCH(xfa); CACHE_S(); S_SREG = RepAppl(d0); /* check functor */ d0 = (CELL) (PREG->y_u.xfa.f); if (*S_SREG != d0) { FAIL(); } WRITEBACK_S(S_SREG+1); ENDCACHE_S(); PREG = NEXTOP(PREG, xfa); /* enter read mode */ GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, gstruct_unk, gstruct_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH_W(xfa); BEGD(d1); d1 = AbsAppl(HR); YapBind(pt0, d1); /* now, set pt0 to point to the heap where we are going to * build our term */ pt0 = HR; ENDD(d1); /* first, put the functor */ d0 = (CELL) (PREG->y_u.xfa.f); *pt0++ = d0; HR = pt0 + PREG->y_u.xfa.a; PREG = NEXTOP(PREG, xfa); /* set SREG */ SREG = pt0; /* update HR */ GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); Op(get_float, xd); BEGD(d0); d0 = XREG(PREG->y_u.xd.x); deref_head(d0, gfloat_unk); gfloat_nonvar: if (!IsApplTerm(d0)) FAIL(); /* we have met a preexisting float */ START_PREFETCH(xd); BEGP(pt0); pt0 = RepAppl(d0); /* check functor */ if (*pt0 != (CELL)FunctorDouble) { FAIL(); } BEGP(pt1); pt1 = PREG->y_u.xd.d; PREG = NEXTOP(PREG, xd); if ( pt1[1] != pt0[1] #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P || pt1[2] != pt0[2] #endif ) FAIL(); ENDP(pt1); ENDP(pt0); /* enter read mode */ GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, gfloat_unk, gfloat_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH(xc); BEGD(d1); d1 = AbsAppl(PREG->y_u.xd.d); PREG = NEXTOP(PREG, xd); YapBind(pt0, d1); GONext(); ENDD(d1); END_PREFETCH(); ENDP(pt0); ENDD(d0); ENDOp(); Op(get_string, xu); BEGD(d0); d0 = XREG(PREG->y_u.xu.x); deref_head(d0, gstring_unk); gstring_nonvar: if (!IsApplTerm(d0)) FAIL(); /* we have met a preexisting string */ START_PREFETCH(xu); BEGP(pt0); pt0 = RepAppl(d0); /* check functor */ if (*pt0 != (CELL)FunctorString) { FAIL(); } BEGP(pt1); pt1 = RepAppl(PREG->y_u.xu.ut); PREG = NEXTOP(PREG, xu); if ( pt1[1] != pt0[1] || strcmp((const char *)(pt1+2), (const char *)(pt0+2)) ) FAIL(); ENDP(pt1); ENDP(pt0); /* enter read mode */ GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, gstring_unk, gstring_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH(xc); BEGD(d1); d1 = PREG->y_u.xu.ut; PREG = NEXTOP(PREG, xu); YapBind(pt0, d1); GONext(); ENDD(d1); END_PREFETCH(); ENDP(pt0); ENDD(d0); ENDOp(); Op(get_longint, xi); BEGD(d0); d0 = XREG(PREG->y_u.xi.x); deref_head(d0, glongint_unk); glongint_nonvar: if (!IsApplTerm(d0)) FAIL(); /* we have met a preexisting longint */ START_PREFETCH(xi); BEGP(pt0); pt0 = RepAppl(d0); /* check functor */ if (*pt0 != (CELL)FunctorLongInt) { FAIL(); } if (PREG->y_u.xi.i[1] != (CELL)pt0[1]) FAIL(); ENDP(pt0); PREG = NEXTOP(PREG, xi); /* enter read mode */ GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, glongint_unk, glongint_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH(xi); BEGD(d1); d1 = AbsAppl(PREG->y_u.xi.i); PREG = NEXTOP(PREG, xi); YapBind(pt0, d1); GONext(); ENDD(d1); END_PREFETCH(); ENDP(pt0); ENDD(d0); ENDOp(); Op(get_bigint, xN); #ifdef USE_GMP BEGD(d0); d0 = XREG(PREG->y_u.xN.x); deref_head(d0, gbigint_unk); gbigint_nonvar: if (!IsApplTerm(d0)) FAIL(); /* we have met a preexisting bigint */ START_PREFETCH(xN); BEGP(pt0); pt0 = RepAppl(d0); /* check functor */ if (*pt0 != (CELL)FunctorBigInt) { FAIL(); } if (Yap_gmp_tcmp_big_big(d0,PREG->y_u.xN.b)) FAIL(); PREG = NEXTOP(PREG, xN); ENDP(pt0); /* enter read mode */ GONext(); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, gbigint_unk, gbigint_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH(xN); BEGD(d1); d1 = PREG->y_u.xN.b; PREG = NEXTOP(PREG, xN); YapBind(pt0, d1); GONext(); ENDD(d1); END_PREFETCH(); ENDP(pt0); ENDD(d0); #else FAIL(); #endif ENDOp(); Op(get_dbterm, xD); BEGD(d0); d0 = XREG(PREG->y_u.xD.x); deref_head(d0, gdbterm_unk); gdbterm_nonvar: BEGD(d1); /* we have met a preexisting dbterm */ d1 = PREG->y_u.xD.D; PREG = NEXTOP(PREG, xD); UnifyBound(d0,d1); ENDD(d1); BEGP(pt0); deref_body(d0, pt0, gdbterm_unk, gdbterm_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH(xD); BEGD(d1); d1 = PREG->y_u.xD.D; PREG = NEXTOP(PREG, xD); YapBind(pt0, d1); GONext(); ENDD(d1); END_PREFETCH(); ENDP(pt0); ENDD(d0); ENDOp(); /************************************************************************\ * Optimised Get List Instructions * \************************************************************************/ OpRW(glist_valx, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xl); deref_head(d0, glist_valx_write); glist_valx_read: BEGP(pt0); /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); /* enter read mode */ START_PREFETCH(xx); pt0 = RepPair(d0); SREG = pt0 + 1; /* start unification with first argument */ d0 = *pt0; deref_head(d0, glist_valx_unk); /* first argument is in d0 */ glist_valx_nonvar: /* first argument is bound */ BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); deref_head(d1, glist_valx_nonvar_unk); glist_valx_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, xx); UnifyBound(d0, d1); BEGP(pt1); /* deref second argument */ deref_body(d1, pt1, glist_valx_nonvar_unk, glist_valx_nonvar_nonvar); /* head bound, argument unbound */ PREG = NEXTOP(PREG, xx); YapBind(pt1, d0); GONext(); ENDP(pt1); ENDD(d1); /* head may be unbound */ derefa_body(d0, pt0, glist_valx_unk, glist_valx_nonvar); /* head is unbound, pt0 has the value */ d0 = XREG(PREG->y_u.xx.xr); deref_head(d0, glist_valx_var_unk); glist_valx_var_nonvar: /* head is unbound, second arg bound */ PREG = NEXTOP(PREG, xx); Bind_Global(pt0, d0); GONext(); BEGP(pt1); deref_body(d0, pt1, glist_valx_var_unk, glist_valx_var_nonvar); /* head and second argument are unbound */ PREG = NEXTOP(PREG, xx); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, glist_valx_write, glist_valx_read); CACHE_S(); /* enter write mode */ S_SREG = HR; BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); d0 = AbsPair(S_SREG); S_SREG[0] = d1; ENDD(d1); ALWAYS_START_PREFETCH_W(xx); PREG = NEXTOP(PREG, xx); HR = S_SREG + 2; WRITEBACK_S(S_SREG+1); YapBind(pt0, d0); ALWAYS_GONextW(); ALWAYS_END_PREFETCH_W(); ENDCACHE_S(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpRW(glist_valy, yx); BEGD(d0); d0 = XREG(PREG->y_u.yx.x); deref_head(d0, glist_valy_write); glist_valy_read: BEGP(pt0); /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); START_PREFETCH(yx); /* enter read mode */ pt0 = RepPair(d0); SREG = pt0 + 1; /* start unification with first argument */ d0 = *pt0; deref_head(d0, glist_valy_unk); glist_valy_nonvar: /* first argument is bound */ BEGD(d1); BEGP(pt1); pt1 = YREG + PREG->y_u.yx.y; d1 = *pt1; PREG = NEXTOP(PREG, yx); deref_head(d1, glist_valy_nonvar_unk); glist_valy_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ SREG = pt0 + 1; UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, glist_valy_nonvar_unk, glist_valy_nonvar_nonvar); /* first argument bound, second unbound */ YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, glist_valy_unk, glist_valy_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.yx.y; d1 = *pt1; deref_head(d1, glist_valy_var_unk); glist_valy_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, yx); Bind_Global(pt0, d1); GONext(); derefa_body(d1, pt1, glist_valy_var_unk, glist_valy_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, yx); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDD(d1); END_PREFETCH(); ENDP(pt0); BEGP(pt0); deref_body(d0, pt0, glist_valy_write, glist_valy_read); /* enter write mode */ START_PREFETCH_W(yx); BEGP(pt1); pt1 = HR; d0 = AbsPair(pt1); YapBind(pt0, d0); BEGD(d0); /* include XREG on it */ d0 = YREG[PREG->y_u.yx.y]; pt1[0] = d0; ENDD(d0); HR = pt1 + 2; SREG = pt1 + 1; ENDP(pt1); PREG = NEXTOP(PREG, yx); GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); Op(gl_void_varx, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xl); deref_head(d0, glist_void_varx_write); glist_void_varx_read: /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); ALWAYS_START_PREFETCH(xx); /* enter read mode */ BEGP(pt0); pt0 = RepPair(d0); d0 = pt0[1]; XREG(PREG->y_u.xx.xr) = d0; PREG = NEXTOP(PREG, xx); ALWAYS_GONext(); ENDP(pt0); ALWAYS_END_PREFETCH(); BEGP(pt0); deref_body(d0, pt0, glist_void_varx_write, glist_void_varx_read); /* enter write mode */ BEGP(pt1); pt1 = HR; /* include XREG on it */ XREG(PREG->y_u.xx.xr) = Unsigned(pt1 + 1); RESET_VARIABLE(pt1); RESET_VARIABLE(pt1+1); HR = pt1 + 2; BEGD(d0); d0 = AbsPair(pt1); YapBind(pt0, d0); PREG = NEXTOP(PREG, xx); ENDD(d0); ENDP(pt1); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); Op(gl_void_vary, yx); BEGD(d0); d0 = XREG(PREG->y_u.yx.x); deref_head(d0, glist_void_vary_write); glist_void_vary_read: /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); /* enter read mode */ BEGP(pt0); pt0 = RepPair(d0); d0 = pt0[1]; ENDP(pt0); INITIALIZE_PERMVAR(YREG+PREG->y_u.yx.y,d0); PREG = NEXTOP(PREG, yx); GONext(); BEGP(pt0); deref_body(d0, pt0, glist_void_vary_write, glist_void_vary_read); /* enter write mode */ BEGP(pt1); pt1 = HR; /* include XREG on it */ INITIALIZE_PERMVAR(YREG+PREG->y_u.yx.y,Unsigned(pt1 + 1)); PREG = NEXTOP(PREG, yx); RESET_VARIABLE(pt1); RESET_VARIABLE(pt1+1); d0 = AbsPair(pt1); HR = pt1 + 2; YapBind(pt0, d0); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d0); ENDOp(); Op(gl_void_valx, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xl); deref_head(d0, glist_void_valx_write); glist_void_valx_read: BEGP(pt0); /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); /* enter read mode */ pt0 = RepPair(d0)+1; /* start unification with first argument */ d0 = *pt0; deref_head(d0, glist_void_valx_unk); glist_void_valx_nonvar: /* first argument is bound */ BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); deref_head(d1, glist_void_valx_nonvar_unk); glist_void_valx_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, xx); UnifyBound(d0, d1); /* deref second argument */ BEGP(pt1); deref_body(d1, pt1, glist_void_valx_nonvar_unk, glist_void_valx_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, xx); YapBind(pt1, d0); GONext(); ENDP(pt1); ENDD(d1); /* first argument may be unbound */ derefa_body(d0, pt0, glist_void_valx_unk, glist_void_valx_nonvar); /* first argument is unbound */ BEGD(d1); d1 = XREG(PREG->y_u.xx.xr); deref_head(d1, glist_void_valx_var_unk); glist_void_valx_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, xx); Bind_Global(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, glist_void_valx_var_unk, glist_void_valx_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, xx); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDD(d1); ENDP(pt0); BEGP(pt0); deref_body(d0, pt0, glist_void_valx_write, glist_void_valx_read); /* enter write mode */ BEGP(pt1); pt1 = HR; d0 = AbsPair(pt1); YapBind(pt0, d0); pt1 = HR; BEGD(d0); /* include XREG on it */ d0 = XREG(PREG->y_u.xx.xr); RESET_VARIABLE(pt1); pt1[1] = d0; HR = pt1 + 2; ENDD(d0); ENDP(pt1); PREG = NEXTOP(PREG, xx); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); Op(gl_void_valy, yx); BEGD(d0); d0 = XREG(PREG->y_u.yx.x); deref_head(d0, glist_void_valy_write); glist_void_valy_read: BEGP(pt0); /* did we find a list? */ if (!IsPairTerm(d0)) FAIL(); /* enter read mode */ pt0 = RepPair(d0)+1; /* start unification with first argument */ d0 = *pt0; deref_head(d0, glist_void_valy_unk); glist_void_valy_nonvar: /* first argument is bound */ BEGD(d1); BEGP(pt1); pt1 = YREG+PREG->y_u.yx.y; d1 = *pt1; deref_head(d1, glist_void_valy_nonvar_unk); glist_void_valy_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, yx); UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, glist_void_valy_nonvar_unk, glist_void_valy_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, yx); YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, glist_void_valy_unk, glist_void_valy_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.yx.y; d1 = *pt1; deref_head(d1, glist_void_valy_var_unk); glist_void_valy_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, yx); Bind_Global(pt0, d1); GONext(); deref_body(d1, pt1, glist_void_valy_var_unk, glist_void_valy_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, yx); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDD(d1); ENDP(pt0); BEGP(pt0); deref_body(d0, pt0, glist_void_valy_write, glist_void_valy_read); /* enter write mode */ CACHE_S(); S_SREG = HR; d0 = AbsPair(S_SREG); YapBind(pt0, d0); S_SREG = HR; /* include XREG on it */ BEGD(d1); d1 = YREG[PREG->y_u.yx.y]; RESET_VARIABLE(S_SREG); S_SREG[1] = d1; ENDD(d1); PREG = NEXTOP(PREG, yx); HR = S_SREG + 2; ENDCACHE_S(); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); /************************************************************************\ * Unify instructions * \************************************************************************/ Op(unify_x_var, ox); CACHE_S(); READ_IN_S(); BEGD(d0); d0 = *S_SREG; #ifdef YAPOR_SBA if (d0 == 0) d0 = (CELL)S_SREG; #endif WRITEBACK_S(S_SREG+1); ALWAYS_START_PREFETCH(ox); XREG(PREG->y_u.ox.x) = d0; PREG = NEXTOP(PREG, ox); ALWAYS_GONext(); ALWAYS_END_PREFETCH(); ENDD(d0); ENDCACHE_S(); ENDOp(); OpW(unify_x_var_write, ox); CACHE_S(); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.ox.x); PREG = NEXTOP(PREG, ox); RESET_VARIABLE(S_SREG); *pt0 = (CELL) S_SREG; WRITEBACK_S(S_SREG+1); ENDP(pt0); ENDCACHE_S(); GONextW(); ENDOpW(); BOp(unify_l_x_var, ox); ALWAYS_START_PREFETCH(ox); BEGP(pt0); BEGD(d0); d0 = SREG[0]; pt0 = &XREG(PREG->y_u.ox.x); PREG = NEXTOP(PREG, ox); #ifdef YAPOR_SBA if (d0 == 0) d0 = (CELL)SREG; #endif *pt0 = d0; ALWAYS_GONext(); ENDD(d0); ENDP(pt0); ALWAYS_END_PREFETCH(); ENDBOp(); BOp(unify_l_x_var_write, ox); ALWAYS_START_PREFETCH(ox); CACHE_S(); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.ox.x); PREG = NEXTOP(PREG, ox); RESET_VARIABLE(S_SREG); *pt0 = (CELL)S_SREG; ENDP(pt0); ENDCACHE_S(); ALWAYS_GONext(); ENDBOp(); ALWAYS_END_PREFETCH(); BOp(unify_x_var2, oxx); CACHE_S(); ALWAYS_START_PREFETCH(oxx); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.oxx.xr); BEGD(d0); d0 = S_SREG[0]; BEGD(d1); d1 = S_SREG[1]; #ifdef YAPOR_SBA if (d0 == 0) d0 = (CELL)S_SREG; if (d1 == 0) d1 = (CELL)(S_SREG+1); #endif WRITEBACK_S(S_SREG+2); XREG(PREG->y_u.oxx.xl) = d0; PREG = NEXTOP(PREG, oxx); *pt0 = d1; ENDD(d0); ENDD(d1); ENDP(pt0); ALWAYS_GONext(); ENDBOp(); ALWAYS_END_PREFETCH(); ENDCACHE_S(); OpW(unify_x_var2_write, oxx); CACHE_S(); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.oxx.xr); RESET_VARIABLE(S_SREG); XREG(PREG->y_u.oxx.xl) = (CELL) S_SREG; S_SREG++; PREG = NEXTOP(PREG, oxx); RESET_VARIABLE(S_SREG); *pt0 = (CELL) S_SREG; ENDP(pt0); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONextW(); ENDOpW(); BOp(unify_l_x_var2, oxx); ALWAYS_START_PREFETCH(oxx); CACHE_S(); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.oxx.xr); BEGD(d0); d0 = S_SREG[0]; BEGD(d1); d1 = S_SREG[1]; #ifdef YAPOR_SBA if (d0 == 0) XREG(PREG->y_u.oxx.xl) = (CELL)S_SREG; else #endif XREG(PREG->y_u.oxx.xl) = d0; PREG = NEXTOP(PREG, oxx); #ifdef YAPOR_SBA if (d1 == 0) *pt0 = (CELL)(S_SREG+1); else #endif *pt0 = d1; ENDD(d0); ENDD(d1); ENDP(pt0); ENDCACHE_S(); ALWAYS_GONext(); ENDBOp(); ALWAYS_END_PREFETCH(); Op(unify_l_x_var2_write, oxx); CACHE_S(); READ_IN_S(); BEGP(pt0); pt0 = &XREG(PREG->y_u.oxx.xr); XREG(PREG->y_u.oxx.xl) = (CELL) S_SREG; RESET_VARIABLE(S_SREG); S_SREG++; *pt0 = (CELL) S_SREG; PREG = NEXTOP(PREG, oxx); RESET_VARIABLE(S_SREG); ENDP(pt0); ENDCACHE_S(); GONext(); ENDOp(); Op(unify_y_var, oy); BEGD(d0); d0 = *SREG++; #ifdef YAPOR_SBA if (d0 == 0) { INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,(CELL)(SREG-1)); } else #else INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,d0); #endif /* YAPOR_SBA */ PREG = NEXTOP(PREG, oy); GONext(); ENDD(d0); ENDOp(); OpW(unify_y_var_write, oy); CACHE_S(); READ_IN_S(); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,(CELL) S_SREG); PREG = NEXTOP(PREG, oy); RESET_VARIABLE(S_SREG); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONextW(); ENDOpW(); Op(unify_l_y_var, oy); BEGD(d0); d0 = SREG[0]; #ifdef YAPOR_SBA if (d0 == 0) { INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,(CELL)SREG); } else #else INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,d0); #endif /* YAPOR_SBA */ PREG = NEXTOP(PREG, oy); GONext(); ENDD(d0); ENDOp(); Op(unify_l_y_var_write, oy); CACHE_S(); READ_IN_S(); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,(CELL) S_SREG); PREG = NEXTOP(PREG, oy); RESET_VARIABLE(S_SREG); ENDCACHE_S(); GONext(); ENDOp(); /* We assume the value in X is pointing to an object in the * global stack */ Op(unify_x_val, ox); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, uvalx_unk); uvalx_nonvar: /* first argument is bound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, uvalx_nonvar_unk); uvalx_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, ox); SREG++; UnifyBound(d0, d1); /* deref second argument */ /* pt0 is in the structure and pt1 the register */ BEGP(pt1); deref_body(d1, pt1, uvalx_nonvar_unk, uvalx_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, ox); SREG++; YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, uvalx_unk, uvalx_nonvar); /* first argument is unbound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, uvalx_var_unk); uvalx_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, ox); SREG++; Bind_Global(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, uvalx_var_unk, uvalx_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, ox); SREG++; UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); OpW(unify_x_val_write, ox); /* we are in write mode */ *SREG++ = XREG(PREG->y_u.ox.x); PREG = NEXTOP(PREG, ox); GONextW(); ENDOpW(); /* We assume the value in X is pointing to an object in the * global stack */ Op(unify_l_x_val, ox); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulvalx_unk); ulvalx_nonvar: /* first argument is bound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, ulvalx_nonvar_unk); ulvalx_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, ox); UnifyBound(d0, d1); BEGP(pt1); /* deref second argument */ deref_body(d1, pt1, ulvalx_nonvar_unk, ulvalx_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, ox); YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, ulvalx_unk, ulvalx_nonvar); /* first argument is unbound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, ulvalx_var_unk); ulvalx_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, ox); Bind_Global(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, ulvalx_var_unk, ulvalx_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, ox); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(unify_l_x_val_write, ox); /* we are in write mode */ SREG[0] = XREG(PREG->y_u.ox.x); PREG = NEXTOP(PREG, ox); GONext(); ENDOp(); /* We assume the value in X is pointing to an object in the * global stack */ Op(unify_y_val, oy); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, uvaly_unk); uvaly_nonvar: /* first argument is bound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, uvaly_nonvar_unk); uvaly_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, oy); SREG++; UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, uvaly_nonvar_unk, uvaly_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, oy); SREG++; YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, uvaly_unk, uvaly_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, uvaly_var_unk); uvaly_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, oy); SREG++; Bind_Global(pt0, d1); GONext(); derefa_body(d1, pt1, uvaly_var_unk, uvaly_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, oy); SREG++; UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); OpW(unify_y_val_write, oy); /* we are in write mode */ BEGD(d0); d0 = YREG[PREG->y_u.oy.y]; #ifdef YAPOR_SBA if (d0 == 0) /* free variable */ *SREG++ = (CELL)(YREG+PREG->y_u.oy.y); else #endif *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, oy); GONextW(); ENDOpW(); /* We assume the value in X is pointing to an object in the * global stack */ Op(unify_l_y_val, oy); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulvaly_unk); ulvaly_nonvar: /* first argument is bound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, ulvaly_nonvar_unk); ulvaly_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, oy); UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, ulvaly_nonvar_unk, ulvaly_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, oy); YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, ulvaly_unk, ulvaly_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, ulvaly_var_unk); ulvaly_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, oy); Bind_Global(pt0, d1); GONext(); /* Here we are in trouble: we have a clash between pt1 and * SREG. We address this by storing SREG in d0 for the duration. */ derefa_body(d1, pt1, ulvaly_var_unk, ulvaly_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, oy); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(unify_l_y_val_write, oy); /* we are in write mode */ BEGD(d0); d0 = YREG[PREG->y_u.oy.y]; #ifdef YAPOR_SBA if (d0 == 0) /* new variable */ SREG[0] = (CELL)(YREG+PREG->y_u.oy.y); else #endif SREG[0] = d0; ENDD(d0); PREG = NEXTOP(PREG, oy); GONext(); ENDOp(); /* In the next instructions, we do not know anything about * what is in X */ Op(unify_x_loc, ox); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, uvalx_loc_unk); uvalx_loc_nonvar: /* first argument is bound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, uvalx_loc_nonvar_unk); uvalx_loc_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, ox); SREG++; UnifyBound(d0, d1); BEGP(pt1); /* deref second argument */ deref_body(d1, pt1, uvalx_loc_nonvar_unk, uvalx_loc_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, ox); SREG++; YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, uvalx_loc_unk, uvalx_loc_nonvar); /* first argument is unbound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, uvalx_loc_var_unk); uvalx_loc_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, ox); SREG++; Bind_Global(pt0, d1); GONext(); /* Here we are in trouble: we have a clash between pt1 and * SREG. We address this by storing SREG in d0 for the duration. */ BEGP(pt1); deref_body(d1, pt1, uvalx_loc_var_unk, uvalx_loc_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, ox); SREG++; UnifyCells(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); OpW(unify_x_loc_write, ox); /* we are in write mode */ BEGD(d0); d0 = XREG(PREG->y_u.ox.x); deref_head(d0, unify_x_loc_unk); unify_x_loc_nonvar: *SREG++ = d0; PREG = NEXTOP(PREG, ox); GONextW(); BEGP(pt0); deref_body(d0, pt0, unify_x_loc_unk, unify_x_loc_nonvar); /* move ahead in the instructions */ PREG = NEXTOP(PREG, ox); /* d0 is a variable, check whether we need to globalise it */ if (pt0 < HR) { /* variable is global */ *SREG++ = Unsigned(pt0); GONextW(); } else { /* bind our variable to the structure */ CACHE_S(); READ_IN_S(); Bind_Local(pt0, Unsigned(S_SREG)); RESET_VARIABLE(S_SREG); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONextW(); } ENDP(pt0); ENDD(d0); ENDOpW(); /* In the next instructions, we do not know anything about * what is in X */ Op(unify_l_x_loc, ox); BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulvalx_loc_unk); ulvalx_loc_nonvar: /* first argument is bound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, ulvalx_loc_nonvar_unk); ulvalx_loc_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, ox); UnifyBound(d0, d1); /* deref second argument */ deref_body(d1, pt0, ulvalx_loc_nonvar_unk, ulvalx_loc_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, ox); YapBind(pt0, d0); GONext(); /* first argument may be unbound */ derefa_body(d0, pt0, ulvalx_loc_unk, ulvalx_loc_nonvar); /* first argument is unbound */ d1 = XREG(PREG->y_u.ox.x); deref_head(d1, ulvalx_loc_var_unk); ulvalx_loc_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, ox); Bind_Global(pt0, d1); GONext(); BEGP(pt1); deref_body(d1, pt1, ulvalx_loc_var_unk, ulvalx_loc_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, ox); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(unify_l_x_loc_write, ox); /* we are in write mode */ BEGD(d0); d0 = XREG(PREG->y_u.ox.x); deref_head(d0, ulnify_x_loc_unk); ulnify_x_loc_nonvar: SREG[0] = d0; PREG = NEXTOP(PREG, ox); GONext(); BEGP(pt0); deref_body(d0, pt0, ulnify_x_loc_unk, ulnify_x_loc_nonvar); /* d0 is a variable, check whether we need to globalise it */ PREG = NEXTOP(PREG, ox); if (pt0 < HR) { /* variable is global */ SREG[0] = Unsigned(pt0); GONext(); } else { /* create a new Heap variable and bind our variable to it */ Bind_Local(pt0, Unsigned(SREG)); RESET_VARIABLE(SREG); GONext(); } ENDP(pt0); ENDD(d0); ENDOpW(); Op(unify_y_loc, oy); /* we are in read mode */ BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, uvaly_loc_unk); uvaly_loc_nonvar: /* structure is bound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, uvaly_loc_nonvar_unk); uvaly_loc_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, oy); SREG++; UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, uvaly_loc_nonvar_unk, uvaly_loc_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, oy); SREG++; YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, uvaly_loc_unk, uvaly_loc_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, uvaly_loc_var_unk); uvaly_loc_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, oy); SREG++; Bind_Global(pt0, d1); GONext(); /* Here we are in trouble: we have a clash between pt1 and * SREG. We address this by storing SREG in d0 for the duration. */ derefa_body(d1, pt1, uvaly_loc_var_unk, uvaly_loc_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, oy); SREG++; UnifyCells(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); OpW(unify_y_loc_write, oy); /* we are in write mode */ BEGD(d0); BEGP(pt0); pt0 = YREG+PREG->y_u.oy.y; d0 = *pt0; deref_head(d0, unify_y_loc_unk); unify_y_loc_nonvar: *SREG++ = d0; PREG = NEXTOP(PREG, oy); GONextW(); derefa_body(d0, pt0, unify_y_loc_unk, unify_y_loc_nonvar); /* d0 is a variable, check whether we need to globalise it */ PREG = NEXTOP(PREG, oy); if (pt0 < HR) { /* variable is global */ *SREG++ = Unsigned(pt0); GONextW(); } else { /* create a new Heap variable and bind our variable to it */ CACHE_S(); READ_IN_S(); Bind_Local(pt0, Unsigned(S_SREG)); RESET_VARIABLE(S_SREG); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONextW(); } ENDP(pt0); ENDD(d0); ENDOpW(); Op(unify_l_y_loc, oy); /* else we are in read mode */ BEGD(d0); BEGD(d1); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulvaly_loc_unk); ulvaly_loc_nonvar: /* structure is bound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, ulvaly_loc_nonvar_unk); ulvaly_loc_nonvar_nonvar: /* both arguments are bound */ /* we may have to bind structures */ PREG = NEXTOP(PREG, oy); UnifyBound(d0, d1); /* deref second argument */ derefa_body(d1, pt1, ulvaly_loc_nonvar_unk, ulvaly_loc_nonvar_nonvar); /* first argument bound, second unbound */ PREG = NEXTOP(PREG, oy); YapBind(pt1, d0); GONext(); ENDP(pt1); /* first argument may be unbound */ derefa_body(d0, pt0, ulvaly_loc_unk, ulvaly_loc_nonvar); /* first argument is unbound */ BEGP(pt1); pt1 = YREG+PREG->y_u.oy.y; d1 = *pt1; deref_head(d1, ulvaly_loc_var_unk); ulvaly_loc_var_nonvar: /* first unbound, second bound */ PREG = NEXTOP(PREG, oy); Bind_Global(pt0, d1); GONext(); /* Here we are in trouble: we have a clash between pt1 and * SREG. We address this by storing SREG in d0 for the duration. */ derefa_body(d1, pt1, ulvaly_loc_var_unk, ulvaly_loc_var_nonvar); /* both arguments are unbound */ PREG = NEXTOP(PREG, oy); UnifyGlobalCellToCell(pt0, pt1); GONext(); ENDP(pt1); ENDP(pt0); ENDD(d1); ENDD(d0); ENDOp(); Op(unify_l_y_loc_write, oy); /* we are in write mode */ BEGD(d0); BEGP(pt0); pt0 = YREG+PREG->y_u.oy.y; d0 = *pt0; deref_head(d0, ulunify_y_loc_unk); ulunify_y_loc_nonvar: SREG[0] = d0; PREG = NEXTOP(PREG, oy); GONext(); derefa_body(d0, pt0, ulunify_y_loc_unk, ulunify_y_loc_nonvar); /* d0 is a variable, check whether we need to globalise it */ PREG = NEXTOP(PREG, oy); if (pt0 < HR) { /* variable is global */ SREG[0] = Unsigned(pt0); GONext(); } else { /* create a new Heap variable and bind our variable to it */ CACHE_S(); READ_IN_S(); Bind_Local(pt0, Unsigned(S_SREG)); RESET_VARIABLE(S_SREG); ENDCACHE_S(); GONext(); } ENDP(pt0); ENDD(d0); ENDOp(); Op(unify_void, o); START_PREFETCH(o); PREG = NEXTOP(PREG, o); SREG++; GONext(); END_PREFETCH(); ENDOp(); OpW(unify_void_write, o); CACHE_S(); READ_IN_S(); PREG = NEXTOP(PREG, o); RESET_VARIABLE(S_SREG); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONextW(); ENDOpW(); Op(unify_l_void, o); PREG = NEXTOP(PREG, o); GONext(); ENDOp(); Op(unify_l_void_write, o); PREG = NEXTOP(PREG, o); RESET_VARIABLE(SREG); GONext(); ENDOp(); Op(unify_n_voids, os); SREG += PREG->y_u.os.s; PREG = NEXTOP(PREG, os); GONext(); ENDOp(); OpW(unify_n_voids_write, os); BEGD(d0); CACHE_S(); d0 = PREG->y_u.os.s; READ_IN_S(); PREG = NEXTOP(PREG, os); for (; d0 > 0; d0--) { RESET_VARIABLE(S_SREG); S_SREG++; } WRITEBACK_S(S_SREG); ENDCACHE_S(); ENDD(d0); GONextW(); ENDOpW(); Op(unify_l_n_voids, os); PREG = NEXTOP(PREG, os); GONext(); ENDOp(); Op(unify_l_n_voids_write, os); BEGD(d0); d0 = PREG->y_u.os.s; PREG = NEXTOP(PREG, os); CACHE_S(); READ_IN_S(); for (; d0 > 0; d0--) { RESET_VARIABLE(S_SREG); S_SREG++; } ENDCACHE_S(); ENDD(d0); GONext(); ENDOp(); Op(unify_atom, oc); BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, uatom_unk); uatom_nonvar: if (d0 != PREG->y_u.oc.c) { FAIL(); } PREG = NEXTOP(PREG, oc); GONext(); derefa_body(d0, pt0, uatom_unk, uatom_nonvar); d0 = PREG->y_u.oc.c; PREG = NEXTOP(PREG, oc); Bind_Global(pt0, d0); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); OpW(unify_atom_write, oc); * SREG++ = PREG->y_u.oc.c; PREG = NEXTOP(PREG, oc); GONextW(); ENDOpW(); Op(unify_l_atom, oc); BEGD(d0); BEGP(pt0); pt0 = SREG; d0 = *SREG; deref_head(d0, ulatom_unk); ulatom_nonvar: if (d0 != PREG->y_u.oc.c) { FAIL(); } PREG = NEXTOP(PREG, oc); GONext(); derefa_body(d0, pt0, ulatom_unk, ulatom_nonvar); d0 = PREG->y_u.oc.c; PREG = NEXTOP(PREG, oc); Bind_Global(pt0, d0); GONext(); ENDP(pt0); ENDD(d0); ENDOp(); Op(unify_l_atom_write, oc); SREG[0] = PREG->y_u.oc.c; PREG = NEXTOP(PREG, oc); GONext(); ENDOp(); Op(unify_n_atoms, osc); { register Int i = PREG->y_u.osc.s; /* not enough registers */ BEGD(d1); d1 = PREG->y_u.osc.c; for (; i > 0; i--) { BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, uatom_n_var); uatom_n_nonvar: if (d0 != d1) { FAIL(); } continue; derefa_body(d0, pt0, uatom_n_var, uatom_n_nonvar); Bind_Global(pt0, d1); continue; ENDP(pt0); ENDD(d0); } ENDD(d1); } PREG = NEXTOP(PREG, osc); GONext(); ENDOp(); OpW(unify_n_atoms_write, osc); BEGD(d0); BEGD(d1); d0 = PREG->y_u.osc.s; d1 = PREG->y_u.osc.c; /* write N atoms */ CACHE_S(); READ_IN_S(); PREG = NEXTOP(PREG, osc); for (; d0 > 0; d0--) *S_SREG++ = d1; WRITEBACK_S(S_SREG); ENDCACHE_S(); ENDD(d1); ENDD(d0); GONextW(); ENDOpW(); Op(unify_float, od); BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, ufloat_unk); ufloat_nonvar: if (!IsApplTerm(d0)) { FAIL(); } /* look inside term */ BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorDouble) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = PREG->y_u.od.d; PREG = NEXTOP(PREG, od); if ( pt1[1] != pt0[1] #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P || pt1[2] != pt0[2] #endif ) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, pt0, ufloat_unk, ufloat_nonvar); BEGD(d1); d1 = AbsAppl(PREG->y_u.od.d); PREG = NEXTOP(PREG, od); Bind_Global(pt0, d1); GONext(); ENDD(d1); ENDP(pt0); ENDD(d0); ENDOp(); OpW(unify_float_write, od); * SREG++ = AbsAppl(PREG->y_u.od.d); PREG = NEXTOP(PREG, od); GONextW(); ENDOpW(); Op(unify_l_float, od); BEGD(d0); CACHE_S(); READ_IN_S(); d0 = *S_SREG; deref_head(d0, ulfloat_unk); ulfloat_nonvar: if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorDouble) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = PREG->y_u.od.d; PREG = NEXTOP(PREG, od); if ( pt1[1] != pt0[1] #if SIZEOF_DOUBLE == 2*SIZEOF_INT_P || pt1[2] != pt0[2] #endif ) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, S_SREG, ulfloat_unk, ulfloat_nonvar); BEGD(d1); d1 = AbsAppl(PREG->y_u.od.d); PREG = NEXTOP(PREG, od); Bind_Global(S_SREG, d1); GONext(); ENDD(d1); ENDCACHE_S(); ENDD(d0); ENDOp(); Op(unify_l_float_write, od); SREG[0] = AbsAppl(PREG->y_u.od.d); PREG = NEXTOP(PREG, od); GONext(); ENDOp(); Op(unify_string, ou); BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, ustring_unk); ustring_nonvar: if (!IsApplTerm(d0)) { FAIL(); } /* look inside term */ BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorString) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = RepAppl(PREG->y_u.ou.ut); PREG = NEXTOP(PREG, ou); if ( pt1[1] != pt0[1] || strcmp( (const char *)(pt1 + 2), (const char *)(pt0+2) ) ) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, pt0, ustring_unk, ustring_nonvar); BEGD(d1); d1 = PREG->y_u.ou.ut; PREG = NEXTOP(PREG, ou); Bind_Global(pt0, d1); GONext(); ENDD(d1); ENDP(pt0); ENDD(d0); ENDOp(); Op(unify_l_string, ou); BEGD(d0); CACHE_S(); READ_IN_S(); d0 = *S_SREG; deref_head(d0, ulstring_unk); ulstring_nonvar: if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorString) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = RepAppl(PREG->y_u.ou.ut); PREG = NEXTOP(PREG, ou); if ( pt1[1] != pt0[1] || strcmp( (const char *)(pt1 + 2), (const char *)(pt0+2) ) ) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, S_SREG, ulstring_unk, ulstring_nonvar); BEGD(d1); d1 = PREG->y_u.ou.ut; PREG = NEXTOP(PREG, ou); Bind_Global(S_SREG, d1); GONext(); ENDD(d1); ENDCACHE_S(); ENDD(d0); ENDOp(); Op(unify_longint, oi); BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, ulongint_unk); ulongint_nonvar: /* look inside term */ if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorLongInt) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = PREG->y_u.oi.i; PREG = NEXTOP(PREG, oi); if (pt1[1] != pt0[1]) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, pt0, ulongint_unk, ulongint_nonvar); BEGD(d1); d1 = AbsAppl(PREG->y_u.oi.i); PREG = NEXTOP(PREG, oi); Bind_Global(pt0, d1); GONext(); ENDD(d1); ENDP(pt0); ENDD(d0); ENDOp(); OpW(unify_longint_write, oi); * SREG++ = AbsAppl(PREG->y_u.oi.i); PREG = NEXTOP(PREG, oi); GONextW(); ENDOpW(); Op(unify_l_longint, oi); BEGD(d0); CACHE_S(); READ_IN_S(); d0 = *S_SREG; deref_head(d0, ullongint_unk); ullongint_nonvar: if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorLongInt) { FAIL(); } ENDD(d0); BEGP(pt1); pt1 = PREG->y_u.oi.i; PREG = NEXTOP(PREG, oi); if (pt1[1] != pt0[1]) FAIL(); ENDP(pt1); ENDP(pt0); GONext(); derefa_body(d0, S_SREG, ullongint_unk, ullongint_nonvar); BEGD(d1); d1 = AbsAppl(PREG->y_u.oi.i); PREG = NEXTOP(PREG, oi); Bind_Global(S_SREG, d1); GONext(); ENDD(d1); ENDCACHE_S(); ENDD(d0); ENDOp(); Op(unify_l_longint_write, oi); SREG[0] = AbsAppl(PREG->y_u.oi.i); PREG = NEXTOP(PREG, oi); GONext(); ENDOp(); Op(unify_bigint, oN); #ifdef USE_GMP BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, ubigint_unk); ubigint_nonvar: /* look inside term */ if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d1); d1 = *pt0; if (d1 != (CELL)FunctorBigInt) { FAIL(); } ENDD(d1); if (Yap_gmp_tcmp_big_big(d0,PREG->y_u.oN.b)) FAIL(); PREG = NEXTOP(PREG, oN); ENDP(pt0); GONext(); derefa_body(d0, pt0, ubigint_unk, ubigint_nonvar); BEGD(d1); d1 = PREG->y_u.oN.b; PREG = NEXTOP(PREG, oN); Bind_Global(pt0, d1); GONext(); ENDD(d1); ENDP(pt0); ENDD(d0); #else FAIL(); #endif ENDOp(); Op(unify_l_bigint, oN); #ifdef USE_GMP BEGD(d0); CACHE_S(); READ_IN_S(); d0 = *S_SREG; deref_head(d0, ulbigint_unk); ulbigint_nonvar: if (!IsApplTerm(d0)) { FAIL(); } BEGP(pt0); pt0 = RepAppl(d0); BEGD(d0); d0 = *pt0; if (d0 != (CELL)FunctorBigInt) { FAIL(); } ENDD(d0); if (Yap_gmp_tcmp_big_big(d0,PREG->y_u.oN.b)) FAIL(); PREG = NEXTOP(PREG, oN); ENDP(pt0); GONext(); derefa_body(d0, S_SREG, ulbigint_unk, ulbigint_nonvar); BEGD(d1); d1 = PREG->y_u.oN.b; PREG = NEXTOP(PREG, oN); Bind_Global(S_SREG, d1); GONext(); ENDD(d1); ENDCACHE_S(); ENDD(d0); #else FAIL(); #endif ENDOp(); Op(unify_dbterm, oD); BEGD(d0); BEGP(pt0); pt0 = SREG++; d0 = *pt0; deref_head(d0, udbterm_unk); udbterm_nonvar: BEGD(d1); /* we have met a preexisting dbterm */ d1 = PREG->y_u.oD.D; PREG = NEXTOP(PREG, oD); UnifyBound(d0,d1); ENDD(d1); derefa_body(d0, pt0, udbterm_unk, udbterm_nonvar); BEGD(d1); d1 = PREG->y_u.oD.D; PREG = NEXTOP(PREG, oD); Bind_Global(pt0, d1); GONext(); ENDD(d1); ENDP(pt0); ENDD(d0); ENDOp(); Op(unify_l_dbterm, oD); BEGD(d0); CACHE_S(); READ_IN_S(); d0 = *S_SREG; deref_head(d0, uldbterm_unk); uldbterm_nonvar: BEGD(d1); /* we have met a preexisting dbterm */ d1 = PREG->y_u.oD.D; PREG = NEXTOP(PREG, oD); UnifyBound(d0,d1); ENDD(d1); derefa_body(d0, S_SREG, uldbterm_unk, uldbterm_nonvar); BEGD(d1); d1 = PREG->y_u.oD.D; PREG = NEXTOP(PREG, oD); Bind_Global(S_SREG, d1); GONext(); ENDD(d1); ENDCACHE_S(); ENDD(d0); ENDOp(); OpRW(unify_list, o); *--SP = Unsigned(SREG + 1); *--SP = READ_MODE; BEGD(d0); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulist_unk); ulist_nonvar: if (!IsPairTerm(d0)) { FAIL(); } /* we continue in read mode */ START_PREFETCH(o); SREG = RepPair(d0); PREG = NEXTOP(PREG, o); GONext(); END_PREFETCH(); derefa_body(d0, pt0, ulist_unk, ulist_nonvar); /* we enter write mode */ START_PREFETCH_W(o); CACHE_S(); READ_IN_S(); S_SREG = HR; PREG = NEXTOP(PREG, o); HR = S_SREG + 2; d0 = AbsPair(S_SREG); WRITEBACK_S(S_SREG); ENDCACHE_S(); Bind_Global(pt0, d0); GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpW(unify_list_write, o); PREG = NEXTOP(PREG, o); BEGD(d0); d0 = AbsPair(HR); CACHE_S(); READ_IN_S(); SP -= 2; SP[0] = WRITE_MODE; SP[1] = Unsigned(S_SREG + 1); S_SREG[0] = d0; S_SREG = HR; HR = S_SREG + 2; WRITEBACK_S(S_SREG); ENDCACHE_S(); GONextW(); ENDD(d0); ENDOpW(); OpRW(unify_l_list, o); BEGD(d0); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ullist_unk); ullist_nonvar: START_PREFETCH(o); if (!IsPairTerm(d0)) { FAIL(); } /* we continue in read mode */ PREG = NEXTOP(PREG, o); SREG = RepPair(d0); GONext(); END_PREFETCH(); derefa_body(d0, pt0, ullist_unk, ullist_nonvar); /* we enter write mode */ START_PREFETCH_W(o); PREG = NEXTOP(PREG, o); CACHE_S(); READ_IN_S(); S_SREG = HR; HR = S_SREG + 2; d0 = AbsPair(S_SREG); WRITEBACK_S(S_SREG); ENDCACHE_S(); Bind_Global(pt0, d0); GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpW(unify_l_list_write, o); /* we continue in write mode */ BEGD(d0); d0 = AbsPair(HR); PREG = NEXTOP(PREG, o); CACHE_S(); READ_IN_S(); S_SREG[0] = d0; S_SREG = HR; HR = S_SREG + 2; WRITEBACK_S(S_SREG); ENDCACHE_S(); GONextW(); ENDD(d0); ENDOpW(); OpRW(unify_struct, ofa); *--SP = Unsigned(SREG + 1); *--SP = READ_MODE; BEGD(d0); BEGP(pt0); pt0 = SREG; d0 = *pt0; START_PREFETCH(ofa); deref_head(d0, ustruct_unk); ustruct_nonvar: /* we are in read mode */ if (!IsApplTerm(d0)) { FAIL(); } CACHE_S(); READ_IN_S(); /* we continue in read mode */ S_SREG = RepAppl(d0); /* just check functor */ d0 = (CELL) (PREG->y_u.ofa.f); if (*S_SREG != d0) { FAIL(); } PREG = NEXTOP(PREG, ofa); WRITEBACK_S(S_SREG+1); ENDCACHE_S(); GONext(); END_PREFETCH(); derefa_body(d0, pt0, ustruct_unk, ustruct_nonvar); /* Enter Write mode */ START_PREFETCH_W(ofa); /* set d1 to be the new structure we are going to create */ BEGD(d1); d1 = AbsAppl(HR); /* we know the variable must be in the heap */ Bind_Global(pt0, d1); /* now, set pt0 to point to the heap where we are going to * build our term */ pt0 = HR; ENDD(d1); /* first, put the functor */ d0 = (CELL) (PREG->y_u.ofa.f); *pt0++ = d0; HR = pt0 + PREG->y_u.ofa.a; PREG = NEXTOP(PREG, ofa); /* set SREG */ SREG = pt0; /* update H */ GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpW(unify_struct_write, ofa); CACHE_S(); READ_IN_S(); *--SP = Unsigned(S_SREG + 1); *--SP = WRITE_MODE; /* we continue in write mode */ BEGD(d0); d0 = AbsAppl(HR); S_SREG[0] = d0; S_SREG = HR; d0 = (CELL) (PREG->y_u.ofa.f); *S_SREG++ = d0; HR = S_SREG + PREG->y_u.ofa.a; PREG = NEXTOP(PREG, ofa); WRITEBACK_S(S_SREG); ENDCACHE_S(); ENDD(d0); GONextW(); ENDOpW(); OpRW(unify_l_struc, ofa); BEGD(d0); BEGP(pt0); pt0 = SREG; d0 = *pt0; deref_head(d0, ulstruct_unk); ulstruct_nonvar: /* we are in read mode */ START_PREFETCH(ofa); if (!IsApplTerm(d0)) { FAIL(); } /* we continue in read mode */ SREG = RepAppl(d0); /* just check functor */ d0 = (CELL) (PREG->y_u.ofa.f); if (*SREG++ != d0) { FAIL(); } PREG = NEXTOP(PREG, ofa); GONext(); END_PREFETCH(); derefa_body(d0, pt0, ulstruct_unk, ulstruct_nonvar); /* Enter Write mode */ /* set d1 to be the new structure we are going to create */ START_PREFETCH_W(ofa); BEGD(d1); d1 = AbsAppl(HR); /* we know the variable must be in the heap */ Bind_Global(pt0, d1); /* now, set pt0 to point to the heap where we are going to * build our term */ pt0 = HR; ENDD(d1); /* first, put the functor */ d0 = (CELL) (PREG->y_u.ofa.f); *pt0++ = d0; HR = pt0 + PREG->y_u.ofa.a; PREG = NEXTOP(PREG, ofa); /* set SREG */ SREG = pt0; /* update H */ GONextW(); END_PREFETCH_W(); ENDP(pt0); ENDD(d0); ENDOpRW(); OpW(unify_l_struc_write, ofa); BEGD(d0); d0 = AbsAppl(HR); CACHE_S(); READ_IN_S(); S_SREG[0] = d0; S_SREG = HR; d0 = (CELL) (PREG->y_u.ofa.f); *S_SREG++ = d0; HR = S_SREG + PREG->y_u.ofa.a; PREG = NEXTOP(PREG, ofa); WRITEBACK_S(S_SREG); ENDCACHE_S(); ENDD(d0); GONextW(); ENDOpW(); /************************************************************************\ * Put Instructions * \************************************************************************/ Op(put_x_var, xx); BEGP(pt0); pt0 = HR; XREG(PREG->y_u.xx.xl) = Unsigned(pt0); HR = pt0 + 1; XREG(PREG->y_u.xx.xr) = Unsigned(pt0); PREG = NEXTOP(PREG, xx); RESET_VARIABLE(pt0); ENDP(pt0); GONext(); ENDOp(); Op(put_y_var, yx); BEGP(pt0); pt0 = YREG + PREG->y_u.yx.y; XREG(PREG->y_u.yx.x) = (CELL) pt0; PREG = NEXTOP(PREG, yx); #if defined(YAPOR_SBA) && defined(FROZEN_STACKS) /* We must initialize a shared variable to point to the SBA */ if (Unsigned((Int)(pt0)-(Int)(H_FZ)) > Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { *pt0 = (CELL)STACK_TO_SBA(pt0); } else #endif /* YAPOR_SBA && FROZEN_STACKS */ INITIALIZE_PERMVAR(pt0, (CELL)pt0); ENDP(pt0); GONext(); ENDOp(); Op(put_x_val, xx); BEGD(d0); d0 = XREG(PREG->y_u.xx.xl); XREG(PREG->y_u.xx.xr) = d0; ENDD(d0); PREG = NEXTOP(PREG, xx); GONext(); ENDOp(); Op(put_xx_val, xxxx); BEGD(d0); BEGD(d1); d0 = XREG(PREG->y_u.xxxx.xl1); d1 = XREG(PREG->y_u.xxxx.xl2); XREG(PREG->y_u.xxxx.xr1) = d0; XREG(PREG->y_u.xxxx.xr2) = d1; ENDD(d1); ENDD(d0); PREG = NEXTOP(PREG, xxxx); GONext(); ENDOp(); Op(put_y_val, yx); BEGD(d0); d0 = YREG[PREG->y_u.yx.y]; #ifdef YAPOR_SBA if (d0 == 0) /* new variable */ XREG(PREG->y_u.yx.x) = (CELL)(YREG+PREG->y_u.yx.y); else #endif XREG(PREG->y_u.yx.x) = d0; ENDD(d0); PREG = NEXTOP(PREG, yx); GONext(); ENDOp(); Op(put_y_vals, yyxx); ALWAYS_START_PREFETCH(yyxx); BEGD(d0); d0 = YREG[PREG->y_u.yyxx.y1]; #ifdef YAPOR_SBA if (d0 == 0) /* new variable */ XREG(PREG->y_u.yyxx.x1) = (CELL)(YREG+PREG->y_u.yyxx.y1); else #endif XREG(PREG->y_u.yyxx.x1) = d0; ENDD(d0); /* allow for some prefetching */ PREG = NEXTOP(PREG, yyxx); BEGD(d1); d1 = YREG[PREVOP(PREG,yyxx)->y_u.yyxx.y2]; #ifdef YAPOR_SBA if (d1 == 0) /* new variable */ XREG(PREVOP(PREG->y_u.yyxx,yyxx).x2) = (CELL)(YREG+PREG->y_u.yyxx.y2); else #endif XREG(PREVOP(PREG,yyxx)->y_u.yyxx.x2) = d1; ENDD(d1); ALWAYS_GONext(); ALWAYS_END_PREFETCH(); ENDOp(); Op(put_unsafe, yx); BEGD(d0); BEGP(pt0); pt0 = YREG+PREG->y_u.yx.y; d0 = *pt0; deref_head(d0, punsafe_unk); punsafe_nonvar: XREG(PREG->y_u.yx.x) = d0; PREG = NEXTOP(PREG, yx); GONext(); derefa_body(d0, pt0, punsafe_unk, punsafe_nonvar); /* d0 is a variable, check whether we need to globalise it */ if (pt0 <= HR || pt0 >= YREG) { /* variable is safe */ XREG(PREG->y_u.yx.x) = Unsigned(pt0); PREG = NEXTOP(PREG, yx); GONext(); } else { /* create a new Heap variable and bind our variable to it */ Bind_Local(pt0, Unsigned(HR)); XREG(PREG->y_u.yx.x) = (CELL) HR; RESET_VARIABLE(HR); HR++; PREG = NEXTOP(PREG, yx); GONext(); } ENDP(pt0); ENDD(d0); ENDOp(); Op(put_atom, xc); BEGD(d0); d0 = PREG->y_u.xc.c; XREG(PREG->y_u.xc.x) = d0; PREG = NEXTOP(PREG, xc); GONext(); ENDD(d0); ENDOp(); Op(put_dbterm, xD); BEGD(d0); d0 = PREG->y_u.xD.D; XREG(PREG->y_u.xD.x) = d0; PREG = NEXTOP(PREG, xD); GONext(); ENDD(d0); ENDOp(); Op(put_bigint, xN); BEGD(d0); d0 = PREG->y_u.xN.b; XREG(PREG->y_u.xN.x) = d0; PREG = NEXTOP(PREG, xN); GONext(); ENDD(d0); ENDOp(); Op(put_float, xd); BEGD(d0); d0 = AbsAppl(PREG->y_u.xd.d); XREG(PREG->y_u.xd.x) = d0; PREG = NEXTOP(PREG, xd); GONext(); ENDD(d0); ENDOp(); Op(put_longint, xi); BEGD(d0); d0 = AbsAppl(PREG->y_u.xi.i); XREG(PREG->y_u.xi.x) = d0; PREG = NEXTOP(PREG, xi); GONext(); ENDD(d0); ENDOp(); Op(put_list, x); CACHE_S(); READ_IN_S(); S_SREG = HR; HR += 2; BEGD(d0); d0 = AbsPair(S_SREG); XREG(PREG->y_u.x.x) = d0; PREG = NEXTOP(PREG, x); ENDD(d0); WRITEBACK_S(S_SREG); ENDCACHE_S(); GONext(); ENDOp(); Op(put_struct, xfa); BEGD(d0); d0 = AbsAppl(HR); XREG(PREG->y_u.xfa.x) = d0; d0 = (CELL) (PREG->y_u.xfa.f); *HR++ = d0; SREG = HR; HR += PREG->y_u.xfa.a; ENDD(d0); PREG = NEXTOP(PREG, xfa); GONext(); ENDOp(); /************************************************************************\ * Write Instructions * \************************************************************************/ Op(write_x_var, x); XREG(PREG->y_u.x.x) = Unsigned(SREG); PREG = NEXTOP(PREG, x); RESET_VARIABLE(SREG); SREG++; GONext(); ENDOp(); Op(write_void, e); PREG = NEXTOP(PREG, e); RESET_VARIABLE(SREG); SREG++; GONext(); ENDOp(); Op(write_n_voids, s); BEGD(d0); d0 = PREG->y_u.s.s; PREG = NEXTOP(PREG, s); for (; d0 > 0; d0--) { RESET_VARIABLE(SREG); SREG++; } ENDD(d0); GONext(); ENDOp(); Op(write_y_var, y); INITIALIZE_PERMVAR(YREG+PREG->y_u.y.y,Unsigned(SREG)); PREG = NEXTOP(PREG, y); RESET_VARIABLE(SREG); SREG++; GONext(); ENDOp(); Op(write_x_val, x); BEGD(d0); d0 = XREG(PREG->y_u.x.x); *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, x); GONext(); ENDOp(); Op(write_x_loc, x); BEGD(d0); d0 = XREG(PREG->y_u.x.x); PREG = NEXTOP(PREG, x); deref_head(d0, w_x_unk); w_x_bound: *SREG++ = d0; GONext(); BEGP(pt0); deref_body(d0, pt0, w_x_unk, w_x_bound); #if defined(YAPOR_SBA) && defined(FROZEN_STACKS) if (pt0 > HR && pt0<(CELL *)B_FZ) { #else if (pt0 > HR) { #endif /* YAPOR_SBA && FROZEN_STACKS */ /* local variable: let us bind it to the list */ #ifdef FROZEN_STACKS /* TRAIL */ Bind_Local(pt0, Unsigned(SREG)); #else TRAIL_LOCAL(pt0, Unsigned(SREG)); *pt0 = Unsigned(SREG); #endif /* FROZEN_STACKS */ RESET_VARIABLE(SREG); SREG++; GONext(); } else { *SREG++ = Unsigned(pt0); GONext(); } ENDP(pt0); ENDD(d0); ENDOp(); Op(write_y_val, y); BEGD(d0); d0 = YREG[PREG->y_u.y.y]; #ifdef YAPOR_SBA if (d0 == 0) /* new variable */ *SREG++ = (CELL)(YREG+PREG->y_u.y.y); else #endif *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, y); GONext(); ENDOp(); Op(write_y_loc, y); BEGD(d0); BEGP(pt0); pt0 = YREG+PREG->y_u.y.y; d0 = *pt0; deref_head(d0, w_y_unk); w_y_bound: PREG = NEXTOP(PREG, y); *SREG++ = d0; GONext(); derefa_body(d0, pt0, w_y_unk, w_y_bound); if (pt0 > HR #if defined(YAPOR_SBA) && defined(FROZEN_STACKS) && pt0<(CELL *)B_FZ #endif /* YAPOR_SBA && FROZEN_STACKS */ ) { PREG = NEXTOP(PREG, y); /* local variable: let us bind it to the list */ #ifdef FROZEN_STACKS Bind_Local(pt0, Unsigned(SREG)); #else *pt0 = Unsigned(SREG); TRAIL_LOCAL(pt0, Unsigned(SREG)); #endif /* FROZEN_STACKS */ RESET_VARIABLE(SREG); SREG++; GONext(); } else { PREG = NEXTOP(PREG, y); *SREG++ = Unsigned(pt0); GONext(); } ENDP(pt0); ENDD(d0); ENDOp(); Op(write_atom, c); BEGD(d0); d0 = PREG->y_u.c.c; *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, c); GONext(); ENDOp(); Op(write_bigint, N); BEGD(d0); d0 = PREG->y_u.N.b; *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, N); GONext(); ENDOp(); Op(write_dbterm, D); BEGD(d0); d0 = PREG->y_u.D.D; *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, D); GONext(); ENDOp(); Op(write_float, d); BEGD(d0); d0 = AbsAppl(PREG->y_u.d.d); *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, d); GONext(); ENDOp(); Op(write_longint, i); BEGD(d0); d0 = AbsAppl(PREG->y_u.i.i); *SREG++ = d0; ENDD(d0); PREG = NEXTOP(PREG, i); GONext(); ENDOp(); Op(write_n_atoms, sc); BEGD(d0); BEGD(d1); d0 = PREG->y_u.sc.s; d1 = PREG->y_u.sc.c; for (; d0 > 0; d0--) *SREG++ = d1; ENDD(d1); ENDD(d0); PREG = NEXTOP(PREG, sc); GONext(); ENDOp(); Op(write_list, e); BEGD(d0); d0 = AbsPair(HR); *SREG++ = d0; /* I will not actually store the mode in the stack */ SP[-1] = Unsigned(SREG); SP[-2] = 1; /* Put instructions follow the main stream */ SP -= 2; SREG = HR; HR += 2; ENDD(d0); PREG = NEXTOP(PREG, e); GONext(); ENDOp(); Op(write_l_list, e); ALWAYS_START_PREFETCH(e); PREG = NEXTOP(PREG, e); BEGD(d0); CACHE_S(); READ_IN_S(); d0 = AbsPair(HR); *S_SREG = d0; WRITEBACK_S(HR); HR += 2; ENDCACHE_S(); ENDD(d0); ALWAYS_GONext(); ALWAYS_END_PREFETCH(); ENDOp(); Op(write_struct, fa); BEGD(d0); d0 = AbsAppl(HR); *SREG++ = d0; SP[-1] = Unsigned(SREG); SP[-2] = 1; /* Put instructions follow the main stream */ SP -= 2; d0 = (CELL) (PREG->y_u.fa.f); *HR++ = d0; ENDD(d0); BEGD(d0); d0 = PREG->y_u.fa.a; PREG = NEXTOP(PREG, fa); SREG = HR; HR += d0; ENDD(d0); GONext(); ENDOp(); Op(write_l_struc, fa); BEGD(d0); d0 = AbsAppl(HR); *SREG = d0; d0 = (CELL) (PREG->y_u.fa.f); *HR++ = d0; SREG = HR; ENDD(d0); BEGD(d0); d0 = PREG->y_u.fa.a; PREG = NEXTOP(PREG, fa); HR += d0; ENDD(d0); GONext(); ENDOp(); /************************************************************************\ * Save last unified struct or list * \************************************************************************/ /* vitor: I think I should kill these two instructions, by expanding the * othe instructions. */ Op(save_pair_x, ox); XREG(PREG->y_u.ox.x) = AbsPair(SREG); PREG = NEXTOP(PREG, ox); GONext(); ENDOp(); OpW(save_pair_x_write, ox); XREG(PREG->y_u.ox.x) = AbsPair(SREG); PREG = NEXTOP(PREG, ox); GONextW(); ENDOpW(); Op(save_pair_y, oy); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,AbsPair(SREG)); PREG = NEXTOP(PREG, oy); GONext(); ENDOp(); OpW(save_pair_y_write, oy); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,AbsPair(SREG)); PREG = NEXTOP(PREG, oy); GONextW(); ENDOpW(); Op(save_appl_x, ox); XREG(PREG->y_u.ox.x) = AbsAppl(SREG - 1); PREG = NEXTOP(PREG, ox); GONext(); ENDOp(); OpW(save_appl_x_write, ox); XREG(PREG->y_u.ox.x) = AbsAppl(SREG - 1); PREG = NEXTOP(PREG, ox); GONextW(); ENDOpW(); Op(save_appl_y, oy); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,AbsAppl(SREG-1)); PREG = NEXTOP(PREG, oy); GONext(); ENDOp(); OpW(save_appl_y_write, oy); INITIALIZE_PERMVAR(YREG+PREG->y_u.oy.y,AbsAppl(SREG-1)); PREG = NEXTOP(PREG, oy); GONextW(); ENDOpW();