1380 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1380 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#define TRUST_FAIL_INSTINIT
 | 
						|
 | 
						|
#ifdef CUT_C
 | 
						|
#define TRUST_FAIL_CUT_C \
 | 
						|
	while (POP_CHOICE_POINT(B->cp_b)) \
 | 
						|
	    POP_EXECUTE();
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef YAPOR
 | 
						|
#define TRUST_FAIL_YAPOR \
 | 
						|
    choiceptr cut_pt; \
 | 
						|
    cut_pt = B->cp_b; \
 | 
						|
    CUT_prune_to(cut_pt); \
 | 
						|
    B = cut_pt;
 | 
						|
#else
 | 
						|
#define TRUST_FAIL_NOYAPOR \
 | 
						|
      B = B->cp_b; \
 | 
						|
	  return external_labels[0];
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef YAPOR
 | 
						|
#define LBL_SHARED_FAIL \
 | 
						|
      B = Get_LOCAL_top_cp(); \
 | 
						|
      SET_BB(PROTECT_FROZEN_B(B));
 | 
						|
#endif
 | 
						|
 | 
						|
#define OP_FAIL_INSTINIT \
 | 
						|
      if (PP) { \
 | 
						|
	UNLOCK(PP->PELock); \
 | 
						|
	PP = NULL; \
 | 
						|
      }
 | 
						|
 | 
						|
#ifdef LOW_LEVEL_TRACER
 | 
						|
#if defined(YAPOR) || defined(THREADS)
 | 
						|
#define LBL_FAIL_INSTINIT \
 | 
						|
      BLOCKADDRESS = (CELL)(*_PREG); \
 | 
						|
      { \
 | 
						|
	register tr_fr_ptr pt0 = TR; \
 | 
						|
	if (PP) { \
 | 
						|
	  UNLOCK(PP->PELock); \
 | 
						|
	  PP = NULL; \
 | 
						|
	} \
 | 
						|
	(*_PREG) = B->cp_ap; \
 | 
						|
	save_pc(); \
 | 
						|
	CACHE_TR(B->cp_tr); \
 | 
						|
	PREFETCH_OP((*_PREG)); \
 | 
						|
      while (1) { \
 | 
						|
	if (pt0 == S_TR) { \
 | 
						|
	  SP = SP0; \
 | 
						|
    LBL_FAIL_LOW_LEVEL_TRACER
 | 
						|
#else
 | 
						|
#define LBL_FAIL_INSTINIT \
 | 
						|
      BLOCKADDRESS = (CELL)(*_PREG); \
 | 
						|
      { \
 | 
						|
	register tr_fr_ptr pt0 = TR; \
 | 
						|
	(*_PREG) = B->cp_ap; \
 | 
						|
	save_pc(); \
 | 
						|
	CACHE_TR(B->cp_tr); \
 | 
						|
	PREFETCH_OP((*_PREG)); \
 | 
						|
      while (1) { \
 | 
						|
	if (pt0 == S_TR) { \
 | 
						|
	  SP = SP0; \
 | 
						|
    LBL_FAIL_LOW_LEVEL_TRACER
 | 
						|
#endif
 | 
						|
#else /* LOW_LEVEL_TRACER */
 | 
						|
#if defined(YAPOR) || defined(THREADS)
 | 
						|
#define LBL_FAIL_INSTINIT \
 | 
						|
      BLOCKADDRESS = (CELL)(*_PREG); \
 | 
						|
      { \
 | 
						|
	register tr_fr_ptr pt0 = TR; \
 | 
						|
	if (PP) { \
 | 
						|
	  UNLOCK(PP->PELock); \
 | 
						|
	  PP = NULL; \
 | 
						|
	} \
 | 
						|
	(*_PREG) = B->cp_ap; \
 | 
						|
	save_pc(); \
 | 
						|
	CACHE_TR(B->cp_tr); \
 | 
						|
	PREFETCH_OP((*_PREG)); \
 | 
						|
      while (1) { \
 | 
						|
	if (pt0 == S_TR) { \
 | 
						|
	  SP = SP0; \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#else
 | 
						|
#define LBL_FAIL_INSTINIT \
 | 
						|
      BLOCKADDRESS = (CELL)(*_PREG); \
 | 
						|
      { \
 | 
						|
	register tr_fr_ptr pt0 = TR; \
 | 
						|
	(*_PREG) = B->cp_ap; \
 | 
						|
	save_pc(); \
 | 
						|
	CACHE_TR(B->cp_tr); \
 | 
						|
	PREFETCH_OP((*_PREG)); \
 | 
						|
      while (1) { \
 | 
						|
	if (pt0 == S_TR) { \
 | 
						|
	  SP = SP0; \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#endif
 | 
						|
#endif /* LOW_LEVEL_TRACER */
 | 
						|
 | 
						|
#ifdef LOW_LEVEL_TRACER
 | 
						|
#ifdef TABLING
 | 
						|
#ifdef THREADS_CONSUMER_SHARING
 | 
						|
#ifdef DETERMINISTIC_TABLING
 | 
						|
#define LBL_FAIL_LOW_LEVEL_TRACER \
 | 
						|
	  if (Yap_do_low_level_trace) { \
 | 
						|
	    int go_on = TRUE; \
 | 
						|
	    yamop *ipc = (*_(*_PREG)); \
 | 
						|
	    while (go_on) { \
 | 
						|
	      op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
 | 
						|
	      go_on = FALSE; \
 | 
						|
	      switch (opnum) { \
 | 
						|
	      case _table_load_answer: \
 | 
						|
		  { \
 | 
						|
		low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		  } \
 | 
						|
	      case _table_try_answer: \
 | 
						|
	      case _table_retry_me: \
 | 
						|
	      case _table_trust_me: \
 | 
						|
	      case _table_retry: \
 | 
						|
	      case _table_trust: \
 | 
						|
	      case _table_completion: \
 | 
						|
	      case _table_answer_resolution_completion: \
 | 
						|
		if (IS_DET_GEN_CP(B)) { \
 | 
						|
		  low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		} else \
 | 
						|
        { \
 | 
						|
		  low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
 | 
						|
		} \
 | 
						|
		break; \
 | 
						|
	      case _table_answer_resolution: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
              case _trie_trust_var: \
 | 
						|
              case _trie_retry_var: \
 | 
						|
              case _trie_trust_var_in_pair: \
 | 
						|
              case _trie_retry_var_in_pair: \
 | 
						|
              case _trie_trust_val: \
 | 
						|
              case _trie_retry_val: \
 | 
						|
              case _trie_trust_val_in_pair: \
 | 
						|
              case _trie_retry_val_in_pair: \
 | 
						|
              case _trie_trust_atom: \
 | 
						|
              case _trie_retry_atom: \
 | 
						|
              case _trie_trust_atom_in_pair: \
 | 
						|
              case _trie_retry_atom_in_pair: \
 | 
						|
              case _trie_trust_null: \
 | 
						|
              case _trie_retry_null: \
 | 
						|
              case _trie_trust_null_in_pair: \
 | 
						|
              case _trie_retry_null_in_pair: \
 | 
						|
              case _trie_trust_pair: \
 | 
						|
              case _trie_retry_pair: \
 | 
						|
              case _trie_trust_appl: \
 | 
						|
              case _trie_retry_appl: \
 | 
						|
              case _trie_trust_appl_in_pair: \
 | 
						|
              case _trie_retry_appl_in_pair: \
 | 
						|
              case _trie_trust_extension: \
 | 
						|
              case _trie_retry_extension: \
 | 
						|
              case _trie_trust_double: \
 | 
						|
              case _trie_retry_double: \
 | 
						|
              case _trie_trust_longint: \
 | 
						|
              case _trie_retry_longint: \
 | 
						|
              case _trie_trust_gterm: \
 | 
						|
              case _trie_retry_gterm: \
 | 
						|
	    { \
 | 
						|
		low_level_trace(retry_table_loader, UndefCode, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#else /* DETERMINISTIC_TABLING */
 | 
						|
#define LBL_FAIL_LOW_LEVEL_TRACER \
 | 
						|
	  if (Yap_do_low_level_trace) { \
 | 
						|
	    int go_on = TRUE; \
 | 
						|
	    yamop *ipc = (*_PREG); \
 | 
						|
	    while (go_on) { \
 | 
						|
	      op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
 | 
						|
	      go_on = FALSE; \
 | 
						|
	      switch (opnum) { \
 | 
						|
	      case _table_load_answer: \
 | 
						|
		  { \
 | 
						|
		low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		  } \
 | 
						|
	      case _table_try_answer: \
 | 
						|
	      case _table_retry_me: \
 | 
						|
	      case _table_trust_me: \
 | 
						|
	      case _table_retry: \
 | 
						|
	      case _table_trust: \
 | 
						|
	      case _table_completion: \
 | 
						|
	      case _table_answer_resolution_completion: \
 | 
						|
        { \
 | 
						|
		  low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
 | 
						|
		} \
 | 
						|
		break; \
 | 
						|
	      case _table_answer_resolution: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
              case _trie_trust_var: \
 | 
						|
              case _trie_retry_var: \
 | 
						|
              case _trie_trust_var_in_pair: \
 | 
						|
              case _trie_retry_var_in_pair: \
 | 
						|
              case _trie_trust_val: \
 | 
						|
              case _trie_retry_val: \
 | 
						|
              case _trie_trust_val_in_pair: \
 | 
						|
              case _trie_retry_val_in_pair: \
 | 
						|
              case _trie_trust_atom: \
 | 
						|
              case _trie_retry_atom: \
 | 
						|
              case _trie_trust_atom_in_pair: \
 | 
						|
              case _trie_retry_atom_in_pair: \
 | 
						|
              case _trie_trust_null: \
 | 
						|
              case _trie_retry_null: \
 | 
						|
              case _trie_trust_null_in_pair: \
 | 
						|
              case _trie_retry_null_in_pair: \
 | 
						|
              case _trie_trust_pair: \
 | 
						|
              case _trie_retry_pair: \
 | 
						|
              case _trie_trust_appl: \
 | 
						|
              case _trie_retry_appl: \
 | 
						|
              case _trie_trust_appl_in_pair: \
 | 
						|
              case _trie_retry_appl_in_pair: \
 | 
						|
              case _trie_trust_extension: \
 | 
						|
              case _trie_retry_extension: \
 | 
						|
              case _trie_trust_double: \
 | 
						|
              case _trie_retry_double: \
 | 
						|
              case _trie_trust_longint: \
 | 
						|
              case _trie_retry_longint: \
 | 
						|
              case _trie_trust_gterm: \
 | 
						|
              case _trie_retry_gterm: \
 | 
						|
	    { \
 | 
						|
		low_level_trace(retry_table_loader, UndefCode, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#endif /* DETERMINISTIC_TABLING */
 | 
						|
#else /* THREADS_CONSUMER_SHARING */
 | 
						|
#ifdef DETERMINISTIC_TABLING
 | 
						|
#define LBL_FAIL_LOW_LEVEL_TRACER \
 | 
						|
	  if (Yap_do_low_level_trace) { \
 | 
						|
	    int go_on = TRUE; \
 | 
						|
	    yamop *ipc = (*_PREG); \
 | 
						|
	    while (go_on) { \
 | 
						|
	      op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
 | 
						|
	      go_on = FALSE; \
 | 
						|
	      switch (opnum) { \
 | 
						|
	      case _table_load_answer: \
 | 
						|
		  { \
 | 
						|
		low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		  } \
 | 
						|
	      case _table_try_answer: \
 | 
						|
	      case _table_retry_me: \
 | 
						|
	      case _table_trust_me: \
 | 
						|
	      case _table_retry: \
 | 
						|
	      case _table_trust: \
 | 
						|
	      case _table_completion: \
 | 
						|
		if (IS_DET_GEN_CP(B)) { \
 | 
						|
		  low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		} else \
 | 
						|
        { \
 | 
						|
		  low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
 | 
						|
		} \
 | 
						|
		break; \
 | 
						|
	      case _table_answer_resolution: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
              case _trie_trust_var: \
 | 
						|
              case _trie_retry_var: \
 | 
						|
              case _trie_trust_var_in_pair: \
 | 
						|
              case _trie_retry_var_in_pair: \
 | 
						|
              case _trie_trust_val: \
 | 
						|
              case _trie_retry_val: \
 | 
						|
              case _trie_trust_val_in_pair: \
 | 
						|
              case _trie_retry_val_in_pair: \
 | 
						|
              case _trie_trust_atom: \
 | 
						|
              case _trie_retry_atom: \
 | 
						|
              case _trie_trust_atom_in_pair: \
 | 
						|
              case _trie_retry_atom_in_pair: \
 | 
						|
              case _trie_trust_null: \
 | 
						|
              case _trie_retry_null: \
 | 
						|
              case _trie_trust_null_in_pair: \
 | 
						|
              case _trie_retry_null_in_pair: \
 | 
						|
              case _trie_trust_pair: \
 | 
						|
              case _trie_retry_pair: \
 | 
						|
              case _trie_trust_appl: \
 | 
						|
              case _trie_retry_appl: \
 | 
						|
              case _trie_trust_appl_in_pair: \
 | 
						|
              case _trie_retry_appl_in_pair: \
 | 
						|
              case _trie_trust_extension: \
 | 
						|
              case _trie_retry_extension: \
 | 
						|
              case _trie_trust_double: \
 | 
						|
              case _trie_retry_double: \
 | 
						|
              case _trie_trust_longint: \
 | 
						|
              case _trie_retry_longint: \
 | 
						|
              case _trie_trust_gterm: \
 | 
						|
              case _trie_retry_gterm: \
 | 
						|
	    { \
 | 
						|
		low_level_trace(retry_table_loader, UndefCode, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#else /* DETERMINISTIC_TABLING */
 | 
						|
#define LBL_FAIL_LOW_LEVEL_TRACER \
 | 
						|
	  if (Yap_do_low_level_trace) { \
 | 
						|
	    int go_on = TRUE; \
 | 
						|
	    yamop *ipc = (*_PREG); \
 | 
						|
	    while (go_on) { \
 | 
						|
	      op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
 | 
						|
	      go_on = FALSE; \
 | 
						|
	      switch (opnum) { \
 | 
						|
	      case _table_load_answer: \
 | 
						|
		  { \
 | 
						|
		low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		  } \
 | 
						|
	      case _table_try_answer: \
 | 
						|
	      case _table_retry_me: \
 | 
						|
	      case _table_trust_me: \
 | 
						|
	      case _table_retry: \
 | 
						|
	      case _table_trust: \
 | 
						|
	      case _table_completion: \
 | 
						|
        { \
 | 
						|
		  low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
 | 
						|
		} \
 | 
						|
		break; \
 | 
						|
	      case _table_answer_resolution: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
              case _trie_trust_var: \
 | 
						|
              case _trie_retry_var: \
 | 
						|
              case _trie_trust_var_in_pair: \
 | 
						|
              case _trie_retry_var_in_pair: \
 | 
						|
              case _trie_trust_val: \
 | 
						|
              case _trie_retry_val: \
 | 
						|
              case _trie_trust_val_in_pair: \
 | 
						|
              case _trie_retry_val_in_pair: \
 | 
						|
              case _trie_trust_atom: \
 | 
						|
              case _trie_retry_atom: \
 | 
						|
              case _trie_trust_atom_in_pair: \
 | 
						|
              case _trie_retry_atom_in_pair: \
 | 
						|
              case _trie_trust_null: \
 | 
						|
              case _trie_retry_null: \
 | 
						|
              case _trie_trust_null_in_pair: \
 | 
						|
              case _trie_retry_null_in_pair: \
 | 
						|
              case _trie_trust_pair: \
 | 
						|
              case _trie_retry_pair: \
 | 
						|
              case _trie_trust_appl: \
 | 
						|
              case _trie_retry_appl: \
 | 
						|
              case _trie_trust_appl_in_pair: \
 | 
						|
              case _trie_retry_appl_in_pair: \
 | 
						|
              case _trie_trust_extension: \
 | 
						|
              case _trie_retry_extension: \
 | 
						|
              case _trie_trust_double: \
 | 
						|
              case _trie_retry_double: \
 | 
						|
              case _trie_trust_longint: \
 | 
						|
              case _trie_retry_longint: \
 | 
						|
              case _trie_trust_gterm: \
 | 
						|
              case _trie_retry_gterm: \
 | 
						|
	    { \
 | 
						|
		low_level_trace(retry_table_loader, UndefCode, NULL); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#endif /* DETERMINISTIC_TABLING */
 | 
						|
#endif /* THREADS_CONSUMER_SHARING */
 | 
						|
#endif /* TABLING */
 | 
						|
#define LBL_FAIL_LOW_LEVEL_TRACER \
 | 
						|
	  if (Yap_do_low_level_trace) { \
 | 
						|
	    int go_on = TRUE; \
 | 
						|
	    yamop *ipc = (*_PREG); \
 | 
						|
	    while (go_on) { \
 | 
						|
	      op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
 | 
						|
	      go_on = FALSE; \
 | 
						|
	      switch (opnum) { \
 | 
						|
	      case _or_else: \
 | 
						|
	      case _or_last: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_or, (PredEntry *)ipc, &(B->cp_a1)); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _retry2: \
 | 
						|
	      case _retry3: \
 | 
						|
	      case _retry4: \
 | 
						|
		{ \
 | 
						|
		ipc = NEXTOP(ipc,l); \
 | 
						|
		go_on = TRUE; \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _jump: \
 | 
						|
		{ \
 | 
						|
		ipc = ipc->u.l.l; \
 | 
						|
		go_on = TRUE; \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _retry_c: \
 | 
						|
	      case _retry_userc: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_pred, ipc->u.OtapFs.p, B->cp_args); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _retry_profiled: \
 | 
						|
	      case _count_retry: \
 | 
						|
		{ \
 | 
						|
		ipc = NEXTOP(ipc,p); \
 | 
						|
		go_on = TRUE; \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _retry_me: \
 | 
						|
	      case _trust_me: \
 | 
						|
	      case _count_retry_me: \
 | 
						|
	      case _count_trust_me: \
 | 
						|
	      case _profiled_retry_me: \
 | 
						|
	      case _profiled_trust_me: \
 | 
						|
	      case _retry_and_mark: \
 | 
						|
	      case _profiled_retry_and_mark: \
 | 
						|
	      case _retry: \
 | 
						|
	      case _trust: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_pred, ipc->u.Otapl.p, B->cp_args); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _try_logical: \
 | 
						|
	      case _retry_logical: \
 | 
						|
	      case _profiled_retry_logical: \
 | 
						|
	      case _count_retry_logical: \
 | 
						|
	      case _trust_logical: \
 | 
						|
	      case _profiled_trust_logical: \
 | 
						|
	      case _count_trust_logical: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_pred, ipc->u.OtILl.d->ClPred, B->cp_args); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      case _Nstop: \
 | 
						|
	      case _Ystop: \
 | 
						|
		{ \
 | 
						|
		low_level_trace(retry_pred, NULL, B->cp_args); \
 | 
						|
		break; \
 | 
						|
		} \
 | 
						|
	      default: \
 | 
						|
		break; \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	  } \
 | 
						|
    LBL_FAIL_POST_LOW_LEVEL_TRACER
 | 
						|
#endif	/* LOW_LEVEL_TRACER */
 | 
						|
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#ifdef YAPOR_SBA
 | 
						|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
 | 
						|
	  if (pt0 < TR_FZ || pt0 > (ADDR)CurrentTrailTop+MinTrailGap) \
 | 
						|
	    { \
 | 
						|
	      TR = TR_FZ; \
 | 
						|
	      TRAIL_LINK(pt0); \
 | 
						|
	    } else \
 | 
						|
        { \
 | 
						|
      RESTORE_TR(); \
 | 
						|
        } \
 | 
						|
      GONext(); \
 | 
						|
	  break; \
 | 
						|
	} \
 | 
						|
	register CELL d1; \
 | 
						|
	d1 = TrailTerm(pt0-1); \
 | 
						|
	pt0--; \
 | 
						|
    LBL_FAIL_VARTERM
 | 
						|
#else /* YAPOR_SBA */
 | 
						|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
 | 
						|
	  if (pt0 < TR_FZ) \
 | 
						|
	    { \
 | 
						|
	      TR = TR_FZ; \
 | 
						|
	      TRAIL_LINK(pt0); \
 | 
						|
	    } else \
 | 
						|
        { \
 | 
						|
      RESTORE_TR(); \
 | 
						|
        } \
 | 
						|
	  break; \
 | 
						|
	} \
 | 
						|
	register CELL d1; \
 | 
						|
	d1 = TrailTerm(pt0-1); \
 | 
						|
	pt0--; \
 | 
						|
    LBL_FAIL_VARTERM
 | 
						|
#endif /* YAPOR_SBA */
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
 | 
						|
        { \
 | 
						|
      RESTORE_TR(); \
 | 
						|
        } \
 | 
						|
	  break; \
 | 
						|
	} \
 | 
						|
	register CELL d1; \
 | 
						|
	d1 = TrailTerm(pt0-1); \
 | 
						|
	pt0--; \
 | 
						|
    LBL_FAIL_VARTERM
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
 | 
						|
#if defined(YAPOR_SBA) && defined(YAPOR)
 | 
						|
#define LBL_FAIL_VARTERM \
 | 
						|
	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); \
 | 
						|
      } \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
    LBL_FAIL_PAIRTERM_INIT
 | 
						|
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
 | 
						|
#define LBL_FAIL_VARTERM \
 | 
						|
	if (IsVarTerm(d1)) { \
 | 
						|
      { \
 | 
						|
	    RESET_VARIABLE(d1); \
 | 
						|
      } \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
    LBL_FAIL_PAIRTERM_INIT
 | 
						|
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
 | 
						|
 | 
						|
#if defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES)
 | 
						|
#ifdef LIMIT_TABLING
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#ifdef YAPOR_SBA
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	    if ( \
 | 
						|
		(ADDR) pt1 >= HeapTop \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#else /* YAPOR_SBA */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	    if ( \
 | 
						|
		IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* YAPOR_SBA */
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#else /* LIMIT_TABLING */
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#ifdef YAPOR_SBA
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ( \
 | 
						|
		(ADDR) pt1 >= HeapTop \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#else /* YAPOR_SBA */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ( \
 | 
						|
		IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* YAPOR_SBA */
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	if (IsPairTerm(d1)) \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#endif /* LIMIT_TABLING */
 | 
						|
#else /* defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES) */
 | 
						|
#ifdef LIMIT_TABLING
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#ifdef YAPOR_SBA
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	    if ( \
 | 
						|
		(ADDR) pt1 >= HeapTop \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#else /* YAPOR_SBA */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	    if ( \
 | 
						|
		IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* YAPOR_SBA */
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ((ADDR) pt1 == LOCAL_TrailBase) { \
 | 
						|
	      sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
 | 
						|
	      TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
 | 
						|
	      SgFr_state(sg_fr)--; \
 | 
						|
	      insert_into_global_sg_fr_list(sg_fr); \
 | 
						|
	      continue; \
 | 
						|
	    } \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#else /* LIMIT_TABLING */
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#ifdef YAPOR_SBA
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ( \
 | 
						|
		(ADDR) pt1 >= HeapTop \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#else /* YAPOR_SBA */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	    if ( \
 | 
						|
		IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
 | 
						|
		) \
 | 
						|
            { \
 | 
						|
	      pt0 = (tr_fr_ptr) pt1; \
 | 
						|
	      continue; \
 | 
						|
	    } else \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    if (pt0 < TR_FZ) { \
 | 
						|
		  continue; \
 | 
						|
	    } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* YAPOR_SBA */
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_INIT \
 | 
						|
	  { \
 | 
						|
	    register CELL flags; \
 | 
						|
	    CELL *pt1 = RepPair(d1); \
 | 
						|
	      if (IN_BETWEEN(H0,pt1,H)) { \
 | 
						|
		if (IsAttVar(pt1)) { \
 | 
						|
		  continue; \
 | 
						|
		} else if (*pt1 == (CELL)FunctorBigInt) { \
 | 
						|
		  Yap_CleanOpaqueVariable(pt1); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
    LBL_FAIL_PAIRTERM_END_APPL
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#endif /* LIMIT_TABLING */
 | 
						|
#endif /* defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES) */
 | 
						|
 | 
						|
#if MULTIPLE_STACKS
 | 
						|
#if PARALLEL_YAP
 | 
						|
#ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  --pt0; \
 | 
						|
	  pt[0] = TrailVal(pt0); \
 | 
						|
	  pt[0] = TrailTerm(pt0-1); \
 | 
						|
	  pt0 -= 2; \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  pt[0] = TrailTerm(pt0-1); \
 | 
						|
	  pt0 -= 2; \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#else /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PredEntry *ap = cl->ClPred; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#else /* PARALLEL_YAP */
 | 
						|
#ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  --pt0; \
 | 
						|
	  pt[0] = TrailVal(pt0); \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  pt[0] = TrailTerm(pt0-1); \
 | 
						|
	  pt0 -= 2; \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#else /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    if (FlagOn(DBClMask, flags)) { \
 | 
						|
	      DBRef dbr = DBStructFlagsToDBStruct(pt1); \
 | 
						|
	      int erase; \
 | 
						|
	      LOCK(dbr->lock); \
 | 
						|
	      DEC_DBREF_COUNT(dbr); \
 | 
						|
	      erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
 | 
						|
	      UNLOCK(dbr->lock); \
 | 
						|
	      if (erase) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(dbr); \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } else { \
 | 
						|
	      if (flags & LogUpdMask) { \
 | 
						|
		if (flags & IndexMask) { \
 | 
						|
		  LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(8,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } else if (cl->ClFlags & DirtyMask) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_CleanUpIndex(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} else { \
 | 
						|
		  LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
 | 
						|
		  int erase; \
 | 
						|
		  PELOCK(9,ap); \
 | 
						|
		  DEC_CLREF_COUNT(cl); \
 | 
						|
		  erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		  if (erase) { \
 | 
						|
		    saveregs(); \
 | 
						|
		    Yap_ErLogUpdCl(cl); \
 | 
						|
		    setregs(); \
 | 
						|
		  } \
 | 
						|
		  UNLOCK(ap->PELock); \
 | 
						|
		} \
 | 
						|
	      } else { \
 | 
						|
		DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
 | 
						|
		int erase; \
 | 
						|
		LOCK(cl->ClLock); \
 | 
						|
		DEC_CLREF_COUNT(cl); \
 | 
						|
		erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
 | 
						|
		UNLOCK(cl->ClLock); \
 | 
						|
		if (erase) { \
 | 
						|
		  saveregs(); \
 | 
						|
		  Yap_ErCl(cl); \
 | 
						|
		  setregs(); \
 | 
						|
		} \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#endif /* PARALLEL_YAP */
 | 
						|
#else /* MULTIPLE_STACKS */
 | 
						|
#ifdef MULTI_ASSIGNMENT_VARIABLES
 | 
						|
#ifdef FROZEN_STACKS
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    ResetFlag(InUseMask, flags); \
 | 
						|
	    *pt1 = flags; \
 | 
						|
	    if (FlagOn((ErasedMask|DirtyMask), flags)) { \
 | 
						|
	      if (FlagOn(DBClMask, flags)) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
 | 
						|
		setregs(); \
 | 
						|
	      } else { \
 | 
						|
		saveregs(); \
 | 
						|
		if (flags & LogUpdMask) { \
 | 
						|
		  if (flags & IndexMask) { \
 | 
						|
		    if (FlagOn(ErasedMask, flags)) { \
 | 
						|
		      Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } else { \
 | 
						|
		      Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } \
 | 
						|
		  } else { \
 | 
						|
		    Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
 | 
						|
		  } \
 | 
						|
		} else { \
 | 
						|
		  Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
 | 
						|
		} \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  --pt0; \
 | 
						|
	  pt[0] = TrailVal(pt0); \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#else /* FROZEN_STACKS */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    ResetFlag(InUseMask, flags); \
 | 
						|
	    *pt1 = flags; \
 | 
						|
	    if (FlagOn((ErasedMask|DirtyMask), flags)) { \
 | 
						|
	      if (FlagOn(DBClMask, flags)) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
 | 
						|
		setregs(); \
 | 
						|
	      } else { \
 | 
						|
		saveregs(); \
 | 
						|
		if (flags & LogUpdMask) { \
 | 
						|
		  if (flags & IndexMask) { \
 | 
						|
		    if (FlagOn(ErasedMask, flags)) { \
 | 
						|
		      Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } else { \
 | 
						|
		      Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } \
 | 
						|
		  } else { \
 | 
						|
		    Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
 | 
						|
		  } \
 | 
						|
		} else { \
 | 
						|
		  Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
 | 
						|
		} \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	else { \
 | 
						|
	  CELL *pt = RepAppl(d1); \
 | 
						|
	  pt[0] = TrailTerm(pt0-1); \
 | 
						|
	  pt0 -= 2; \
 | 
						|
	  continue; \
 | 
						|
	} \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* FROZEN_STACKS */
 | 
						|
#else /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#define LBL_FAIL_PAIRTERM_END_APPL \
 | 
						|
	    flags = *pt1; \
 | 
						|
	    ResetFlag(InUseMask, flags); \
 | 
						|
	    *pt1 = flags; \
 | 
						|
	    if (FlagOn((ErasedMask|DirtyMask), flags)) { \
 | 
						|
	      if (FlagOn(DBClMask, flags)) { \
 | 
						|
		saveregs(); \
 | 
						|
		Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
 | 
						|
		setregs(); \
 | 
						|
	      } else { \
 | 
						|
		saveregs(); \
 | 
						|
		if (flags & LogUpdMask) { \
 | 
						|
		  if (flags & IndexMask) { \
 | 
						|
		    if (FlagOn(ErasedMask, flags)) { \
 | 
						|
		      Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } else { \
 | 
						|
		      Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
 | 
						|
		    } \
 | 
						|
		  } else { \
 | 
						|
		    Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
 | 
						|
		  } \
 | 
						|
		} else { \
 | 
						|
		  Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
 | 
						|
		} \
 | 
						|
		setregs(); \
 | 
						|
	      } \
 | 
						|
	    } \
 | 
						|
	    continue; \
 | 
						|
	  } \
 | 
						|
	ENDCACHE_TR(); \
 | 
						|
      } \
 | 
						|
    }
 | 
						|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
 | 
						|
#endif /* MULTIPLE_STACKS */
 | 
						|
 | 
						|
#define LBL_FAIL_END \
 | 
						|
      BLOCK = (CELL)LBL_FAIL_END;
 |