#define P_DIF_INSTINIT \
      BLOCKADDRESS = (CELL)(*_PREG); \

#ifdef LOW_LEVEL_TRACER
#define P_DIF_LOW_LEVEL_TRACER \
	low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1);
#endif

#define P_DIF_POST_LOW_LEVEL_TRACER \
	  register CELL d0, d1; \
	  register CELL *pt0; \
      d0 = ARG1;

#define P_DIF_DIF_NVAR1 \
      d1 = ARG2;

#ifdef COROUTINING
#if defined(YAPOR_SBA) && defined(YAPOR)
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#else /* FROZEN_STACKS */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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--; \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /* FROZEN_STACKS */
#else /*MULTI_ASSIGNMENT_VARIABLES */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /*MULTI_ASSIGNMENT_VARIABLES */
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } else { \
	        CELL *pt = RepAppl(d1); \
	        pt[0] = TrailVal(--TR); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#else /* FROZEN_STACKS */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } else { \
	        CELL *pt = RepAppl(d1); \
	        pt[0] = TrailTerm(--TR); \
	        TR--; \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /* FROZEN_STACKS */
#else /*MULTI_ASSIGNMENT_VARIABLES */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    CELL OldWokenGoals = Yap_ReadTimedVar(LOCAL_WokenGoals); \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HR = HRBREG; \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /*MULTI_ASSIGNMENT_VARIABLES */
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
#else /* COROUTINING */
#if defined(YAPOR_SBA) && defined(YAPOR)
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#else /* FROZEN_STACKS */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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--; \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /* FROZEN_STACKS */
#else /*MULTI_ASSIGNMENT_VARIABLES */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      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); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /*MULTI_ASSIGNMENT_VARIABLES */
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
#ifdef MULTI_ASSIGNMENT_VARIABLES
#ifdef FROZEN_STACKS
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } else { \
	        CELL *pt = RepAppl(d1); \
	        pt[0] = TrailVal(--TR); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#else /* FROZEN_STACKS */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } else { \
	        CELL *pt = RepAppl(d1); \
	        pt[0] = TrailTerm(--TR); \
	        TR--; \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /* FROZEN_STACKS */
#else /*MULTI_ASSIGNMENT_VARIABLES */
#define P_DIF_DIF_NVAR1_NVAR2 \
    BLOCK = (CELL)P_DIF_DIF_NVAR1_NVAR2; \
    if (d0 == d1) { \
	  (*_PREG) = (*_PREG)->u.l.l; \
	  GONext(); \
    } \
    else { \
      if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) { \
	    (*_PREG) = NEXTOP((*_PREG), l); \
	    GONext(); \
      } \
      else { \
	    Int opresult; \
	    register tr_fr_ptr pt0; \
	    pt0 = TR; \
	    BEGCHO(pt1); \
	    pt1 = B; \
	    HRBREG = 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)); \
	    HRBREG = B->cp_h; \
	    while (TR != pt0) { \
	      d1 = TrailTerm(--TR); \
	      if (IsVarTerm(d1)) { \
	          RESET_VARIABLE(d1); \
	      } \
	    } \
	    if (opresult) { \
	      (*_PREG) = (*_PREG)->u.l.l; \
	      GONext(); \
	    } \
	    else { \
	      (*_PREG) = NEXTOP((*_PREG), l); \
          GONext(); \
        } \
        ENDCHO(pt1); \
      } \
    }
#endif /*MULTI_ASSIGNMENT_VARIABLES */
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
#endif /* COROUTINING */

#define P_DIF_DIF_UNK1 \
      (*_PREG) = (*_PREG)->u.l.l; \
      GONext();

#define P_DIF_DIF_NVAR1_UNK2 \
      (*_PREG) = (*_PREG)->u.l.l; \
      GONext();