#define _p_integer_x_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xl.x); \
      deref_head(d0, integer_x_unk); \
    integer_x_nvar: \
      if (IsIntTerm(d0)) { \
	(*_PREG) = NEXTOP((*_PREG), xl); \
	GONEXT(); \
      } \
      if (IsApplTerm(d0)) { \
	Functor f0 = FunctorOfTerm(d0); \
	if (IsExtensionFunctor(f0)) { \
	  switch ((CELL)f0) { \
	  case (CELL)FunctorLongInt: \
	  case (CELL)FunctorBigInt: \
	    (*_PREG) = NEXTOP((*_PREG), xl); \
	    GONEXT(); \
	  default: \
	    (*_PREG) = (*_PREG)->u.xl.F; \
	    BACK(); \
	  } \
	} \
      } \
      (*_PREG) = (*_PREG)->u.xl.F; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, integer_x_unk, integer_x_nvar); \
      (*_PREG) = (*_PREG)->u.xl.F; \
      BACK(); \
      ENDP(pt0); \
      ENDD(d0);
     
#define _p_plus_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, plus_vv_unk); \
    plus_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, plus_vv_nvar_unk); \
    plus_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	d0 = MkIntegerTerm(IntOfTerm(d0) + IntOfTerm(d1)); \
      } \
      else { \
	saveregs(); \
	d0 = p_plus(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      XREG((*_PREG)->u.xxx.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxx); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, plus_vv_unk, plus_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is _+B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, plus_vv_nvar_unk, plus_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _p_plus_vc_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d0, plus_vc_unk); \
    plus_vc_nvar: \
      { \
	Int d1 = (*_PREG)->u.xxn.c; \
	if (IsIntTerm(d0)) { \
	  d0 = MkIntegerTerm(IntOfTerm(d0) + d1); \
	} \
	else { \
	  saveregs(); \
	  d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1)); \
	  setregs(); \
	  if (d0 == 0L) { \
	    saveregs(); \
	    Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	    setregs(); \
	    FAIL(); \
	  } \
	} \
      } \
      XREG((*_PREG)->u.xxn.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxn); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, plus_vc_unk, plus_vc_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A + " Int_FORMAT, (*_PREG)->u.xxn.c); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
      
#define _p_plus_y_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.yxx.x1); \
      deref_head(d0, plus_y_vv_unk); \
    plus_y_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, plus_y_vv_nvar_unk); \
    plus_y_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	d0 = MkIntegerTerm(IntOfTerm(d0) + IntOfTerm(d1)); \
      } \
      else { \
	saveregs(); \
	d0 = p_plus(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      BEGP(pt0); \
      pt0 = YREG + (*_PREG)->u.yxx.y; \
      (*_PREG) = NEXTOP((*_PREG), yxx); \
      INITIALIZE_PERMVAR(pt0,d0); \
      ENDP(pt0); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, plus_y_vv_unk, plus_y_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, plus_y_vv_nvar_unk, plus_y_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);

#define _p_plus_y_vc_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.yxn.xi); \
      deref_head(d0, plus_y_vc_unk); \
    plus_y_vc_nvar: \
      { \
	Int d1 = (*_PREG)->u.yxn.c; \
	if (IsIntTerm(d0)) { \
	  d0 = MkIntegerTerm(IntOfTerm(d0) + d1); \
	} \
	else { \
	  saveregs(); \
	  d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1)); \
	  setregs(); \
	  if (d0 == 0L) { \
	    saveregs(); \
	    Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	    setregs(); \
	    FAIL(); \
	  } \
	} \
      } \
      BEGP(pt0); \
      pt0 = YREG + (*_PREG)->u.yxn.y; \
      (*_PREG) = NEXTOP((*_PREG), yxn); \
      INITIALIZE_PERMVAR(pt0,d0); \
      ENDP(pt0); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, plus_y_vc_unk, plus_y_vc_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A + " Int_FORMAT, (*_PREG)->u.yxn.c); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
      
#define _p_minus_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, minus_vv_unk); \
    minus_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, minus_vv_nvar_unk); \
    minus_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	d0 = MkIntegerTerm(IntOfTerm(d0) - IntOfTerm(d1)); \
      } \
      else { \
	saveregs(); \
	d0 = p_minus(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      XREG((*_PREG)->u.xxx.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxx); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, minus_vv_unk, minus_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, minus_vv_nvar_unk, minus_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _p_times_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, times_vv_unk); \
    times_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, times_vv_nvar_unk); \
    times_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	d0 = times_int(IntOfTerm(d0), IntOfTerm(d1)); \
      } \
      else { \
	saveregs(); \
	d0 = p_times(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      XREG((*_PREG)->u.xxx.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxx); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, times_vv_unk, times_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, times_vv_nvar_unk, times_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);

#define _p_times_vc_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d0, times_vc_unk); \
    times_vc_nvar: \
      { \
	Int d1 = (*_PREG)->u.xxn.c; \
	if (IsIntTerm(d0)) { \
	  d0 = times_int(IntOfTerm(d0), d1); \
	} \
	else { \
	  saveregs(); \
	  d0 = p_times(Yap_Eval(d0), MkIntegerTerm(d1)); \
	  setregs(); \
	  if (d0 == 0L) { \
	    saveregs(); \
	    Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	    setregs(); \
	    FAIL(); \
	  } \
	} \
      } \
      XREG((*_PREG)->u.xxn.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxn); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, times_vc_unk, times_vc_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A* " Int_FORMAT, (*_PREG)->u.xxn.c); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
      
#define _p_div_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, div_vv_unk); \
    div_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, div_vv_nvar_unk); \
    div_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	Int div = IntOfTerm(d1); \
	if (div == 0) { \
	  saveregs(); \
	  Yap_NilError(EVALUATION_ERROR_ZERO_DIVISOR,"// /2"); \
	  setregs(); \
	  FAIL(); \
	} \
	d0 = MkIntTerm(IntOfTerm(d0) / div); \
      } \
      else { \
	saveregs(); \
	d0 = p_div(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      XREG((*_PREG)->u.xxx.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxx); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, div_vv_unk, div_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, div_vv_nvar_unk, div_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _p_and_vv_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, and_vv_unk); \
    and_vv_nvar: \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, and_vv_nvar_unk); \
    and_vv_nvar_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	d0 = MkIntegerTerm(IntOfTerm(d0) & IntOfTerm(d1)); \
      } \
      else { \
	saveregs(); \
	d0 = p_and(Yap_Eval(d0), Yap_Eval(d1)); \
	setregs(); \
	if (d0 == 0L) { \
	  saveregs(); \
	  Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	  setregs(); \
	  FAIL(); \
	} \
      } \
      XREG((*_PREG)->u.xxx.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxx); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, and_vv_unk, and_vv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, and_vv_nvar_unk, and_vv_nvar_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _p_and_vc_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d0, and_vc_unk); \
    and_vc_nvar: \
      { \
	Int d1 = (*_PREG)->u.xxn.c; \
	if (IsIntTerm(d0)) { \
	  d0 = MkIntegerTerm(IntOfTerm(d0) & d1); \
	} \
	else { \
	  saveregs(); \
	  d0 = p_and(Yap_Eval(d0), MkIntegerTerm(d1)); \
	  setregs(); \
	  if (d0 == 0L) { \
	    saveregs(); \
	    Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	    setregs(); \
	    FAIL(); \
	  } \
	} \
      } \
      XREG((*_PREG)->u.xxn.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxn); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, and_vc_unk, and_vc_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A /\\ " Int_FORMAT , (*_PREG)->u.xxn.c); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
      
#define _p_sll_cv_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d0, sll_cv_unk); \
    sll_cv_nvar: \
      { \
	Int d1 = (*_PREG)->u.xxn.c; \
	if (IsIntTerm(d0)) { \
	  Int i2 = IntOfTerm(d0); \
	  if (i2 < 0) { \
	    d0 = MkIntegerTerm(SLR(d1, -i2)); \
	  } else { \
	    d0 = do_sll(d1,i2); \
	} \
	} else { \
	  saveregs(); \
	  d0 = p_sll(MkIntegerTerm(d1), Yap_Eval(d0)); \
	  setregs(); \
	} \
      } \
      if (d0 == 0L) { \
	saveregs(); \
	Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	setregs(); \
	FAIL(); \
      } \
      XREG((*_PREG)->u.xxn.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxn); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, sll_cv_unk, sll_cv_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A<<B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
      
#define _p_slr_vc_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d0, slr_vc_unk); \
    slr_vc_nvar: \
      { \
	Int d1 = (*_PREG)->u.xxn.c; \
	if (IsIntTerm(d0)) { \
	  d0 = MkIntTerm(SLR(IntOfTerm(d0), d1)); \
	} \
	else { \
	  saveregs(); \
	  d0 = p_slr(Yap_Eval(d0), MkIntegerTerm(d1)); \
	  setregs(); \
	  if (d0 == 0L) { \
	    saveregs(); \
	    Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); \
	    setregs(); \
	    FAIL(); \
	  } \
	} \
      } \
      XREG((*_PREG)->u.xxn.x) = d0; \
      (*_PREG) = NEXTOP((*_PREG), xxn); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, slr_vc_unk, slr_vc_nvar); \
      saveregs(); \
      Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); \
      setregs(); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);

#define _call_bfunc_xx_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = XREG((*_PREG)->u.plxxs.x1); \
    call_bfunc_xx_nvar: \
      d1 = XREG((*_PREG)->u.plxxs.x2); \
    call_bfunc_xx2_nvar: \
      deref_head(d0, call_bfunc_xx_unk); \
      deref_head(d1, call_bfunc_xx2_unk); \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	COUNT flags; \
	Int v = IntOfTerm(d0) - IntOfTerm(d1); \
	flags = (*_PREG)->u.plxxs.flags; \
	if (v > 0) { \
	  if (flags & GT_OK_IN_CMP) { \
	    yamop *nextp = NEXTOP((*_PREG), plxxs); \
	    (*_PREG) = nextp; \
	    GONEXT(); \
      } \
	  else { \
	    yamop *nextp = (*_PREG)->u.plxxs.f; \
	    (*_PREG) = nextp; \
	    BACK(); \
      } \
    } \
	else if (v < 0) { \
	  if (flags & LT_OK_IN_CMP) { \
	    yamop *nextp = NEXTOP((*_PREG), plxxs); \
	    (*_PREG) = nextp; \
	    GONEXT(); \
      } \
	  else { \
	    yamop *nextp = (*_PREG)->u.plxxs.f; \
	    (*_PREG) = nextp; \
	    BACK(); \
      } \
	} \
	else { \
	  if (flags & EQ_OK_IN_CMP) { \
	    yamop *nextp = NEXTOP((*_PREG), plxxs); \
	    (*_PREG) = nextp; \
	    GONEXT(); \
	  } \
	  else { \
	    yamop *nextp = (*_PREG)->u.plxxs.f; \
	    (*_PREG) = nextp; \
	    BACK(); \
	  } \
	} \
      } \
    exec_bin_cmp_xx: \
      { \
	 CmpPredicate f = (*_PREG)->u.plxxs.p->cs.d_code; \
	 saveregs(); \
	 d0 = (CELL) (f) (d0,d1); \
	 setregs(); \
      } \
      if ((*_PREG) == FAILCODE) { \
	BACK(); \
      } \
      if (!d0) { \
	  (*_PREG) = (*_PREG)->u.plxxs.f; \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), plxxs); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, call_bfunc_xx_unk, call_bfunc_xx_nvar); \
      d1 = Deref(d1); \
      goto exec_bin_cmp_xx; \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, call_bfunc_xx2_unk, call_bfunc_xx2_nvar); \
      goto exec_bin_cmp_xx; \
      ENDP(pt0); \
 \
      ENDD(d1); \
      ENDD(d0);
      
#define _call_bfunc_yx_instinit \
      BEGD(d0); \
      BEGD(d1); \
      BEGP(pt0); \
      pt0 = YREG + (*_PREG)->u.plxys.y; \
      d1 = XREG((*_PREG)->u.plxys.x); \
      d0 = *pt0; \
      ENDP(pt0); \
      deref_head(d0, call_bfunc_yx_unk); \
    call_bfunc_yx_nvar: \
      deref_head(d1, call_bfunc_yx2_unk); \
    call_bfunc_yx2_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	int flags; \
	Int v = IntOfTerm(d0) - IntOfTerm(d1); \
	flags = (*_PREG)->u.plxys.flags; \
	if (v > 0) { \
	  if (flags & GT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} else if (v < 0) { \
	  if (flags & LT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} else { \
	  if (flags & EQ_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} \
      } \
    exec_bin_cmp_yx: \
      { \
	CmpPredicate f = (*_PREG)->u.plxys.p->cs.d_code; \
	saveregs(); \
	d0 = (CELL) (f) (d0,d1); \
	setregs(); \
      } \
      if (!d0 || (*_PREG) == FAILCODE) { \
	if ((*_PREG) != FAILCODE) { \
	  (*_PREG) = (*_PREG)->u.plxys.f; \
	} \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), plxys); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, call_bfunc_yx_unk, call_bfunc_yx_nvar); \
      d1 = Deref(d1); \
      goto exec_bin_cmp_yx; \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, call_bfunc_yx2_unk, call_bfunc_yx2_nvar); \
      goto exec_bin_cmp_yx; \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _call_bfunc_xy_instinit \
      BEGD(d0); \
      BEGD(d1); \
      BEGP(pt0); \
      pt0 = YREG + (*_PREG)->u.plxys.y; \
      d0 = XREG((*_PREG)->u.plxys.x); \
      d1 = *pt0; \
      ENDP(pt0); \
      deref_head(d0, call_bfunc_xy_unk); \
    call_bfunc_xy_nvar: \
      deref_head(d1, call_bfunc_xy2_unk); \
    call_bfunc_xy2_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	int flags; \
	Int v = IntOfTerm(d0) - IntOfTerm(d1); \
	flags = (*_PREG)->u.plxys.flags; \
	if (v > 0) { \
	  if (flags & GT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} else if (v < 0) { \
	  if (flags & LT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} else { \
	  if (flags & EQ_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plxys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plxys.f; \
	    BACK(); \
	  } \
	} \
      } \
    exec_bin_cmp_xy: \
      { \
	CmpPredicate f = (*_PREG)->u.plxys.p->cs.d_code; \
	saveregs(); \
	d0 = (CELL) (f) (d0,d1); \
	setregs(); \
      } \
      if (!d0 || (*_PREG) == FAILCODE) { \
	if ((*_PREG) != FAILCODE) { \
	  (*_PREG) = (*_PREG)->u.plxys.f; \
	} \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), plxys); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, call_bfunc_xy_unk, call_bfunc_xy_nvar); \
      d1 = Deref(d1); \
      goto exec_bin_cmp_xy; \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, call_bfunc_xy2_unk, call_bfunc_xy2_nvar); \
      goto exec_bin_cmp_xy; \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#define _call_bfunc_yy_instinit \
      BEGD(d0); \
      BEGD(d1); \
      BEGP(pt0); \
      pt0 = YREG + (*_PREG)->u.plyys.y1; \
      BEGP(pt1); \
      pt1 = YREG + (*_PREG)->u.plyys.y2; \
      d0 = *pt0; \
      d1 = *pt1; \
      ENDP(pt1); \
      ENDP(pt0); \
      deref_head(d0, call_bfunc_yy_unk); \
    call_bfunc_yy_nvar: \
      deref_head(d1, call_bfunc_yy2_unk); \
    call_bfunc_yy2_nvar: \
      if (IsIntTerm(d0) && IsIntTerm(d1)) { \
	int flags; \
	Int v = IntOfTerm(d0) - IntOfTerm(d1); \
	flags = (*_PREG)->u.plyys.flags; \
	if (v > 0) { \
	  if (flags & GT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plyys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plyys.f; \
	    BACK(); \
	  } \
	} else if (v < 0) { \
	  if (flags & LT_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plyys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plyys.f; \
	    BACK(); \
	  } \
	} else { \
	  if (flags & EQ_OK_IN_CMP) { \
	    (*_PREG) = NEXTOP((*_PREG), plyys); \
	    GONEXT(); \
	  } else { \
	    (*_PREG) = (*_PREG)->u.plyys.f; \
	    BACK(); \
	  } \
	} \
      } \
    exec_bin_cmp_yy: \
      { \
	CmpPredicate f = (*_PREG)->u.plyys.p->cs.d_code; \
	saveregs(); \
	d0 = (CELL) (f) (d0,d1); \
	setregs(); \
      } \
      if (!d0 || (*_PREG) == FAILCODE) { \
	if ((*_PREG) != FAILCODE) { \
	  (*_PREG) = (*_PREG)->u.plyys.f; \
	} \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), plyys); \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, call_bfunc_yy_unk, call_bfunc_yy_nvar); \
      d1 = Deref(d1); \
      goto exec_bin_cmp_yy; \
      ENDP(pt0); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, call_bfunc_yy2_unk, call_bfunc_yy2_nvar); \
      goto exec_bin_cmp_yy; \
      ENDP(pt0); \
      ENDD(d1); \
      ENDD(d0);
      
#ifdef LOW_LEVEL_TRACER
#if defined(YAPOR_SBA) && defined(YAPOR)
#ifdef COROUTINING
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#else /* COROUTINING */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#endif /* COROUTINING */
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
#ifdef COROUTINING
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#else /* COROUTINING */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); \
	} \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#endif /* COROUTINING */
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
#else /* LOW_LEVEL_TRACER */
#if defined(YAPOR_SBA) && defined(YAPOR)
#ifdef COROUTINING
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#else /* COROUTINING */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
	    if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
		Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
	      RESET_VARIABLE(STACK_TO_SBA(d1)); \
	    } else \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#endif /* COROUTINING */
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
#ifdef COROUTINING
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	Yap_UpdateTimedVar(LOCAL_WokenGoals, OldWokenGoals); \
	if (OldWokenGoals == TermNil) { \
	  Yap_undo_signal(YAP_WAKEUP_SIGNAL); \
	} \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	H = HRBREG; \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#else /* COROUTINING */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailVal(--TR); \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#else /* FROZEN_STACKS */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } else { \
	    CELL *pt = RepAppl(d1); \
	    pt[0] = TrailTerm(--TR); \
	    TR--; \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* FROZEN_STACKS */
#else /* MULTI_ASSIGNMENT_VARIABLES */
#define _p_dif_instinit \
      BEGD(d0); \
      BEGD(d1); \
      d0 = ARG1; \
      deref_head(d0, dif_unk1); \
    dif_nvar1: \
      d1 = ARG2; \
      deref_head(d1, dif_nvar1_unk2); \
    dif_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      { \
	Int opresult; \
	register tr_fr_ptr pt0; \
	pt0 = TR; \
	BEGCHO(pt1); \
	pt1 = B; \
	HBREG = HR; \
	B = (choiceptr) HR; \
	B->cp_h = HR; \
	SET_BB(B); \
	save_hb(); \
	opresult = Yap_IUnify(d0, d1); \
	B = pt1; \
	SET_BB(PROTECT_FROZEN_B(pt1)); \
	HBREG = B->cp_h; \
	while (TR != pt0) { \
	  BEGD(d1); \
	  d1 = TrailTerm(--TR); \
	  if (IsVarTerm(d1)) { \
        { \
	      RESET_VARIABLE(d1); \
		} \
	  } \
	  ENDD(d1); \
	} \
	if (opresult) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	(*_PREG) = NEXTOP((*_PREG), l); \
	ENDCHO(pt1); \
      } \
      GONEXT(); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, dif_unk1, dif_nvar1); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2); \
      ENDP(pt0); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* MULTI_ASSIGNMENT_VARIABLES */
#endif /* COROUTINING */
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
#endif /* LOW_LEVEL_TRACER */
      
#ifdef LOW_LEVEL_TRACER
#ifdef USE_GMP
#define _p_eq_instinit \
    register CELL d0, d1, d2; \
    register CELL *pt0, *pt1; \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorSame,0)),XREGS+1); \
    } \
      d0 = ARG1; \
      deref_head(d0, p_eq_unk1); \
    p_eq_nvar1: \
      d1 = ARG2; \
      deref_head(d1, p_eq_nvar1_unk2); \
    p_eq_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsPairTerm(d0)) { \
	if (!IsPairTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsApplTerm(d0)) { \
	Functor f0 = FunctorOfTerm(d0); \
	Functor f1; \
 \
	if (!IsApplTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	f1 = FunctorOfTerm(d1); \
 \
	if (IsExtensionFunctor(f0)) { \
	  switch ((CELL)f0) { \
	  case (CELL)FunctorDBRef: \
	    if (d0 == d1) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorLongInt: \
	    if (f1 != FunctorLongInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (LongIntOfTerm(d0) == LongIntOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorBigInt: \
	    if (f1 != FunctorBigInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (Yap_gmp_tcmp_big_big(d0,d1) == 0) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorDouble: \
	    if (f1 != FunctorDouble) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (FloatOfTerm(d0) == FloatOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	  default: \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  } \
	} \
	if (f0 != f1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt0, p_eq_nvar1_unk2, p_eq_nvar1_nvar2); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d0, pt0, p_eq_unk1, p_eq_nvar1); \
      d1 = ARG2; \
      deref_head(d1, p_eq_var1_unk2); \
    p_eq_var1_nvar2: \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt1, p_eq_var1_unk2, p_eq_var1_nvar2); \
      if (pt1 != pt0) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), l); \
      GONEXT();
#else /* USE_GMP */
#define _p_eq_instinit \
    register CELL d0, d1, d2; \
    register CELL *pt0, *pt1; \
      if (Yap_do_low_level_trace) { \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorSame,0)),XREGS+1); \
    } \
      d0 = ARG1; \
      deref_head(d0, p_eq_unk1); \
    p_eq_nvar1: \
      d1 = ARG2; \
      deref_head(d1, p_eq_nvar1_unk2); \
    p_eq_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsPairTerm(d0)) { \
	if (!IsPairTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsApplTerm(d0)) { \
	Functor f0 = FunctorOfTerm(d0); \
	Functor f1; \
 \
	if (!IsApplTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	f1 = FunctorOfTerm(d1); \
 \
	if (IsExtensionFunctor(f0)) { \
	  switch ((CELL)f0) { \
	  case (CELL)FunctorDBRef: \
	    if (d0 == d1) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorLongInt: \
	    if (f1 != FunctorLongInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (LongIntOfTerm(d0) == LongIntOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorDouble: \
	    if (f1 != FunctorDouble) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (FloatOfTerm(d0) == FloatOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	  default: \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  } \
	} \
	if (f0 != f1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt0, p_eq_nvar1_unk2, p_eq_nvar1_nvar2); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d0, pt0, p_eq_unk1, p_eq_nvar1); \
      d1 = ARG2; \
      deref_head(d1, p_eq_var1_unk2); \
    p_eq_var1_nvar2: \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt1, p_eq_var1_unk2, p_eq_var1_nvar2); \
      if (pt1 != pt0) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), l); \
      GONEXT();
#endif /* USE_GMP */
#else /* LOW_LEVEL_TRACER */
#ifdef USE_GMP
#define _p_eq_instinit \
    register CELL d0, d1, d2; \
    register CELL *pt0, *pt1; \
      d0 = ARG1; \
      deref_head(d0, p_eq_unk1); \
    p_eq_nvar1: \
      d1 = ARG2; \
      deref_head(d1, p_eq_nvar1_unk2); \
    p_eq_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsPairTerm(d0)) { \
	if (!IsPairTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsApplTerm(d0)) { \
	Functor f0 = FunctorOfTerm(d0); \
	Functor f1; \
 \
	if (!IsApplTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	f1 = FunctorOfTerm(d1); \
 \
	if (IsExtensionFunctor(f0)) { \
	  switch ((CELL)f0) { \
	  case (CELL)FunctorDBRef: \
	    if (d0 == d1) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorLongInt: \
	    if (f1 != FunctorLongInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (LongIntOfTerm(d0) == LongIntOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorBigInt: \
	    if (f1 != FunctorBigInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (Yap_gmp_tcmp_big_big(d0,d1) == 0) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorDouble: \
	    if (f1 != FunctorDouble) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (FloatOfTerm(d0) == FloatOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	  default: \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  } \
	} \
	if (f0 != f1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt0, p_eq_nvar1_unk2, p_eq_nvar1_nvar2); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d0, pt0, p_eq_unk1, p_eq_nvar1); \
      d1 = ARG2; \
      deref_head(d1, p_eq_var1_unk2); \
    p_eq_var1_nvar2: \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt1, p_eq_var1_unk2, p_eq_var1_nvar2); \
      if (pt1 != pt0) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), l); \
      GONEXT();
#else /* USE_GMP */
#define _p_eq_instinit \
    register CELL d0, d1, d2; \
    register CELL *pt0, *pt1; \
      d0 = ARG1; \
      deref_head(d0, p_eq_unk1); \
    p_eq_nvar1: \
      d1 = ARG2; \
      deref_head(d1, p_eq_nvar1_unk2); \
    p_eq_nvar1_nvar2: \
      if (d0 == d1) { \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsPairTerm(d0)) { \
	if (!IsPairTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      if (IsApplTerm(d0)) { \
	Functor f0 = FunctorOfTerm(d0); \
	Functor f1; \
 \
	if (!IsApplTerm(d1)) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	f1 = FunctorOfTerm(d1); \
 \
	if (IsExtensionFunctor(f0)) { \
	  switch ((CELL)f0) { \
	  case (CELL)FunctorDBRef: \
	    if (d0 == d1) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorLongInt: \
	    if (f1 != FunctorLongInt) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (LongIntOfTerm(d0) == LongIntOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  case (CELL)FunctorDouble: \
	    if (f1 != FunctorDouble) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      BACK(); \
	    } \
	    if (FloatOfTerm(d0) == FloatOfTerm(d1)) { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
	      GONEXT(); \
	    } \
	  default: \
	    (*_PREG) = (*_PREG)->u.l.l; \
	    BACK(); \
	  } \
	} \
	if (f0 != f1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_save_pc(); \
	d2 = iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)); \
	if (d2 == FALSE) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  BACK(); \
	} \
	always_set_pc(); \
	(*_PREG) = NEXTOP((*_PREG), l); \
	GONEXT(); \
      } \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt0, p_eq_nvar1_unk2, p_eq_nvar1_nvar2); \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d0, pt0, p_eq_unk1, p_eq_nvar1); \
      d1 = ARG2; \
      deref_head(d1, p_eq_var1_unk2); \
    p_eq_var1_nvar2: \
      (*_PREG) = (*_PREG)->u.l.l; \
      BACK(); \
 \
      deref_body(d1, pt1, p_eq_var1_unk2, p_eq_var1_nvar2); \
      if (pt1 != pt0) { \
	(*_PREG) = (*_PREG)->u.l.l; \
	BACK(); \
      } \
      (*_PREG) = NEXTOP((*_PREG), l); \
      GONEXT();
#endif /* USE_GMP */
#endif /* LOW_LEVEL_TRACER */

#ifdef LOW_LEVEL_TRACER
#define _p_arg_vv_instinit \
      if (Yap_do_low_level_trace) { \
	H[0] = XREG((*_PREG)->u.xxx.x1); \
	H[1] = XREG((*_PREG)->u.xxx.x2); \
	RESET_VARIABLE(HR+2); \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),H); \
      } \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, arg_arg1_unk); \
    arg_arg1_nvar: \
      if (IsIntTerm(d0)) { \
	d0 = IntOfTerm(d0); \
      } else if (IsLongIntTerm(d0)) { \
	d0 = LongIntOfTerm(d0); \
      } else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); \
	setregs(); \
	FAIL(); \
      } \
 \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, arg_arg2_unk); \
    arg_arg2_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxx.x) = pt0[d0]; \
	(*_PREG) = NEXTOP((*_PREG), xxx); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxx.x) = pt0[d0-1]; \
	(*_PREG) = NEXTOP((*_PREG), xxx); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_arg2_unk, arg_arg2_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, arg_arg1_unk, arg_arg1_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d0);
#else /* LOW_LEVEL_TRACER */
#define _p_arg_vv_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.xxx.x1); \
      deref_head(d0, arg_arg1_unk); \
    arg_arg1_nvar: \
      if (IsIntTerm(d0)) { \
	d0 = IntOfTerm(d0); \
      } else if (IsLongIntTerm(d0)) { \
	d0 = LongIntOfTerm(d0); \
      } else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); \
	setregs(); \
	FAIL(); \
      } \
 \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.xxx.x2); \
      deref_head(d1, arg_arg2_unk); \
    arg_arg2_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxx.x) = pt0[d0]; \
	(*_PREG) = NEXTOP((*_PREG), xxx); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxx.x) = pt0[d0-1]; \
	(*_PREG) = NEXTOP((*_PREG), xxx); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_arg2_unk, arg_arg2_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, arg_arg1_unk, arg_arg1_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d0);
#endif /* LOW_LEVEL_TRACER */

#ifdef LOW_LEVEL_TRACER
#define _p_arg_cv_instinit \
      if (Yap_do_low_level_trace) { \
	CELL *Ho = HR; \
	Term t = MkIntegerTerm((*_PREG)->u.xxn.c); \
	H[0] =  t; \
	H[1] = XREG((*_PREG)->u.xxn.xi); \
	RESET_VARIABLE(HR+2); \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),H); \
	H = HRo; \
      } \
      BEGD(d0); \
      d0 = (*_PREG)->u.xxn.c; \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d1, arg_arg2_vc_unk); \
    arg_arg2_vc_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxn.x) = pt0[d0]; \
	(*_PREG) = NEXTOP((*_PREG), xxn); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxn.x) = pt0[d0-1]; \
	(*_PREG) = NEXTOP((*_PREG), xxn); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_arg2_vc_unk, arg_arg2_vc_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
      ENDD(d0);
#else /* LOW_LEVEL_TRACER */
#define _p_arg_cv_instinit \
      BEGD(d0); \
      d0 = (*_PREG)->u.xxn.c; \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.xxn.xi); \
      deref_head(d1, arg_arg2_vc_unk); \
    arg_arg2_vc_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxn.x) = pt0[d0]; \
	(*_PREG) = NEXTOP((*_PREG), xxn); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	XREG((*_PREG)->u.xxn.x) = pt0[d0-1]; \
	(*_PREG) = NEXTOP((*_PREG), xxn); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_arg2_vc_unk, arg_arg2_vc_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
      ENDD(d0);
#endif /* LOW_LEVEL_TRACER */

#ifdef LOW_LEVEL_TRACER
#define _p_arg_y_vv_instinit \
      if (Yap_do_low_level_trace) { \
	H[0] = XREG((*_PREG)->u.yxx.x1); \
	H[1] = XREG((*_PREG)->u.yxx.x2); \
	H[2] = YREG[(*_PREG)->u.yxx.y]; \
	RESET_VARIABLE(HR+2); \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),H); \
      } \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.yxx.x1); \
      deref_head(d0, arg_y_arg1_unk); \
    arg_y_arg1_nvar: \
      if (IsIntTerm(d0)) { \
	d0 = IntOfTerm(d0); \
      } else if (IsLongIntTerm(d0)) { \
	d0 = LongIntOfTerm(d0); \
      } else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); \
	setregs(); \
	FAIL(); \
      } \
 \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.yxx.x2); \
      deref_head(d1, arg_y_arg2_unk); \
    arg_y_arg2_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	BEGP(pt1); \
	pt1 = YREG + (*_PREG)->u.yxx.y; \
	(*_PREG) = NEXTOP((*_PREG), yxx); \
	INITIALIZE_PERMVAR(pt1,pt0[d0]); \
	ENDP(pt1); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	BEGP(pt1); \
	pt1 = YREG + (*_PREG)->u.yxx.y; \
	(*_PREG) = NEXTOP((*_PREG), yxx); \
	INITIALIZE_PERMVAR(pt1,pt0[d0-1]); \
	GONEXT(); \
	ENDP(pt1); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_y_arg2_unk, arg_y_arg2_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, arg_y_arg1_unk, arg_y_arg1_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d0);
#else /* LOW_LEVEL_TRACER */
#define _p_arg_y_vv_instinit \
      BEGD(d0); \
      d0 = XREG((*_PREG)->u.yxx.x1); \
      deref_head(d0, arg_y_arg1_unk); \
    arg_y_arg1_nvar: \
      if (IsIntTerm(d0)) { \
	d0 = IntOfTerm(d0); \
      } else if (IsLongIntTerm(d0)) { \
	d0 = LongIntOfTerm(d0); \
      } else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); \
	setregs(); \
	FAIL(); \
      } \
 \
      BEGD(d1); \
      d1 = XREG((*_PREG)->u.yxx.x2); \
      deref_head(d1, arg_y_arg2_unk); \
    arg_y_arg2_nvar: \
      if (IsApplTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepAppl(d1); \
	d1 = *pt0; \
	if (IsExtensionFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	if ((Int)d0 <= 0 || \
	    (Int)d0 > ArityOfFunctor((Functor) d1)) { \
	  FAIL(); \
	} \
	BEGP(pt1); \
	pt1 = YREG + (*_PREG)->u.yxx.y; \
	(*_PREG) = NEXTOP((*_PREG), yxx); \
	INITIALIZE_PERMVAR(pt1,pt0[d0]); \
	ENDP(pt1); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      else if (IsPairTerm(d1)) { \
	BEGP(pt0); \
	pt0 = RepPair(d1); \
	if (d0 != 1 && d0 != 2) { \
	  if ((Int)d0 < 0) { \
	    saveregs(); \
	    Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, \
		  MkIntegerTerm(d0),"arg 1 of arg/3"); \
	    setregs(); \
	  } \
	  FAIL(); \
	} \
	BEGP(pt1); \
	pt1 = YREG + (*_PREG)->u.yxx.y; \
	(*_PREG) = NEXTOP((*_PREG), yxx); \
	INITIALIZE_PERMVAR(pt1,pt0[d0-1]); \
	GONEXT(); \
	ENDP(pt1); \
	ENDP(pt0); \
      } \
      else { \
	FAIL(); \
      } \
 \
      BEGP(pt0); \
      deref_body(d1, pt0, arg_y_arg2_unk, arg_y_arg2_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, arg_y_arg1_unk, arg_y_arg1_nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3"); \
      setregs(); \
      ENDP(pt0); \
      FAIL(); \
      ENDD(d0);
#endif /* LOW_LEVEL_TRACER */


#ifdef LOW_LEVEL_TRACER
#define _p_functor_instinit \
      if (Yap_do_low_level_trace) \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),XREGS+1); \
      restart_functor: \
      BEGD(d0); \
      d0 = ARG1; \
      deref_head(d0, func_unk); \
    func_nvar: \
      BEGD(d1); \
      if (IsApplTerm(d0)) { \
	d1 = *RepAppl(d0); \
	if (IsExtensionFunctor((Functor) d1)) { \
	  if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
	    d1 = MkIntTerm(0); \
	  } else \
	    FAIL(); \
	} else { \
	    d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
	    d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
	} \
      } \
      else if (IsPairTerm(d0)) { \
	d0 = TermDot; \
	d1 = MkIntTerm(2); \
      } \
      else { \
	d1 = MkIntTerm(0); \
      } \
      { \
	register CELL arity = d1; \
 \
	d1 = ARG2; \
	deref_head(d1, func_nvar_unk); \
      func_nvar_nvar: \
	if (d0 != d1) { \
	  FAIL(); \
	} \
	d0 = arity; \
	goto func_bind_x3; \
 \
	BEGP(pt0); \
	deref_body(d1, pt0, func_nvar_unk, func_nvar_nvar); \
	Bind(pt0, d0); \
	d0 = arity; \
	ENDP(pt0); \
      func_bind_x3: \
	d1 = ARG3; \
	deref_head(d1, func_nvar3_unk); \
      func_nvar3_nvar: \
	if (d0 != d1) { \
	  FAIL(); \
	} \
	(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
	GONEXT(); \
 \
	BEGP(pt0); \
	deref_body(d1, pt0, func_nvar3_unk, func_nvar3_nvar); \
	(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
	Bind(pt0, d0); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, func_unk, func_nvar); \
      d0 = ARG2; \
      deref_head(d0, func_var_2unk); \
    func_var_2nvar: \
      BEGD(d1); \
      d1 = ARG3; \
      deref_head(d1, func_var_3unk); \
    func_var_3nvar: \
      if (IsIntTerm(d1)) \
	d1 = IntOfTerm(d1); \
      else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      if (!IsAtomicTerm(d0)) { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      if (d0 == TermDot && d1 == 2) { \
	RESET_VARIABLE(HR); \
	RESET_VARIABLE(HR+1); \
	d0 = AbsPair(HR); \
	H += 2; \
      } \
      else if ((Int)d1 > 0) { \
	if (!IsAtomTerm(d0)) { \
	  saveregs(); \
	  Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
	  setregs(); \
	  FAIL(); \
	} \
	BEGP(pt1); \
	if (!IsAtomTerm(d0)) { \
	  FAIL(); \
	} \
	else \
	  d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
	pt1 = HR; \
	*pt1++ = d0; \
	d0 = AbsAppl(HR); \
	if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
	  saveregs(); \
	  if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
	    Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); \
	    setregs(); \
	    BACK(); \
	  } else { \
	    setregs(); \
	  } \
	  goto restart_functor; \
	} \
	while ((Int)d1--) { \
	  RESET_VARIABLE(pt1); \
	  pt1++; \
	} \
	H = pt1; \
	ENDP(pt1); \
      }	else if ((Int)d1  < 0) { \
	saveregs(); \
	Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
      Bind(pt0, d0); \
      GONEXT(); \
 \
      BEGP(pt1); \
      deref_body(d1, pt1, func_var_3unk, func_var_3nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
      setregs(); \
      ENDP(pt1); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt1); \
      deref_body(d0, pt1, func_var_2unk, func_var_2nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); \
      setregs(); \
      ENDP(pt1); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
#else /* LOW_LEVEL_TRACER */
#define _p_functor_instinit \
      restart_functor: \
      BEGD(d0); \
      d0 = ARG1; \
      deref_head(d0, func_unk); \
    func_nvar: \
      BEGD(d1); \
      if (IsApplTerm(d0)) { \
	d1 = *RepAppl(d0); \
	if (IsExtensionFunctor((Functor) d1)) { \
	  if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { \
	    d1 = MkIntTerm(0); \
	  } else \
	    FAIL(); \
	} else { \
	    d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); \
	    d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); \
	} \
      } \
      else if (IsPairTerm(d0)) { \
	d0 = TermDot; \
	d1 = MkIntTerm(2); \
      } \
      else { \
	d1 = MkIntTerm(0); \
      } \
      { \
	register CELL arity = d1; \
 \
	d1 = ARG2; \
	deref_head(d1, func_nvar_unk); \
      func_nvar_nvar: \
	if (d0 != d1) { \
	  FAIL(); \
	} \
	d0 = arity; \
	goto func_bind_x3; \
 \
	BEGP(pt0); \
	deref_body(d1, pt0, func_nvar_unk, func_nvar_nvar); \
	Bind(pt0, d0); \
	d0 = arity; \
	ENDP(pt0); \
      func_bind_x3: \
	d1 = ARG3; \
	deref_head(d1, func_nvar3_unk); \
      func_nvar3_nvar: \
	if (d0 != d1) { \
	  FAIL(); \
	} \
	(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
	GONEXT(); \
 \
	BEGP(pt0); \
	deref_body(d1, pt0, func_nvar3_unk, func_nvar3_nvar); \
	(*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbmp),l); \
	Bind(pt0, d0); \
	GONEXT(); \
	ENDP(pt0); \
      } \
      ENDD(d1); \
 \
      BEGP(pt0); \
      deref_body(d0, pt0, func_unk, func_nvar); \
      d0 = ARG2; \
      deref_head(d0, func_var_2unk); \
    func_var_2nvar: \
      BEGD(d1); \
      d1 = ARG3; \
      deref_head(d1, func_var_3unk); \
    func_var_3nvar: \
      if (IsIntTerm(d1)) \
	d1 = IntOfTerm(d1); \
      else { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      if (!IsAtomicTerm(d0)) { \
	saveregs(); \
	Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      if (d0 == TermDot && d1 == 2) { \
	RESET_VARIABLE(HR); \
	RESET_VARIABLE(HR+1); \
	d0 = AbsPair(HR); \
	H += 2; \
      } \
      else if ((Int)d1 > 0) { \
	if (!IsAtomTerm(d0)) { \
	  saveregs(); \
	  Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); \
	  setregs(); \
	  FAIL(); \
	} \
	BEGP(pt1); \
	if (!IsAtomTerm(d0)) { \
	  FAIL(); \
	} \
	else \
	  d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); \
	pt1 = HR; \
	*pt1++ = d0; \
	d0 = AbsAppl(HR); \
	if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { \
	  saveregs(); \
	  if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP((*_PREG),e),Osbmp))) { \
	    Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); \
	    setregs(); \
	    BACK(); \
	  } else { \
	    setregs(); \
	  } \
	  goto restart_functor; \
	} \
	while ((Int)d1--) { \
	  RESET_VARIABLE(pt1); \
	  pt1++; \
	} \
	H = pt1; \
	ENDP(pt1); \
      }	else if ((Int)d1  < 0) { \
	saveregs(); \
	Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); \
	setregs(); \
	FAIL(); \
      } \
      (*_PREG) = NEXTOP(NEXTOP(NEXTOP((*_PREG), e),Osbpp),l); \
      Bind(pt0, d0); \
      GONEXT(); \
 \
      BEGP(pt1); \
      deref_body(d1, pt1, func_var_3unk, func_var_3nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); \
      setregs(); \
      ENDP(pt1); \
      FAIL(); \
      ENDD(d1); \
 \
      BEGP(pt1); \
      deref_body(d0, pt1, func_var_2unk, func_var_2nvar); \
      saveregs(); \
      Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); \
      setregs(); \
      ENDP(pt1); \
      FAIL(); \
      ENDP(pt0); \
      ENDD(d0);
#endif /* LOW_LEVEL_TRACER */