374 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			374 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #define EXECUTE_INSTINIT \
 | |
|       BLOCKADDRESS = (CELL)(*_PREG); \
 | |
|         register CELL d0; \
 | |
| 	PredEntry *pt0; \
 | |
| 	register CELL *ENV_YREG = (YREG); \
 | |
| 	pt0 = (*_PREG)->u.pp.p;
 | |
| 	
 | |
| #ifdef LOW_LEVEL_TRACER
 | |
| #define EXECUTE_LOW_LEVEL_TRACER \
 | |
| 	  low_level_trace(enter_pred,pt0,XREGS+1);
 | |
| #endif
 | |
| 
 | |
| #define EXECUTE_POST_LOW_LEVEL_TRACER \
 | |
| 	CACHE_A1(); \
 | |
| 	ALWAYS_LOOKAHEAD(pt0->OpcodeOfPred); \
 | |
| 	d0 = (CELL)B;
 | |
| 	
 | |
| #define EXECUTE_POST_NOCHECKING \
 | |
| 	(*_PREG) = pt0->CodeOfPred; \
 | |
| 	save_pc(); \
 | |
| 	ENV_YREG[E_CB] = d0;
 | |
| 	
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define EXECUTE_DEPTH_MINOR \
 | |
|       FAILED = 0; \
 | |
| 	  if (pt0->ModuleOfPred) { \
 | |
| 	    if (DEPTH == MkIntTerm(0)) { \
 | |
|           YAAM_FAIL; \
 | |
|         } \
 | |
| 	    else { \
 | |
|           DEPTH = RESET_DEPTH(); \
 | |
|         } \
 | |
| 	  }
 | |
| 	  
 | |
| #define EXECUTE_DEPTH_MOFPRED \
 | |
|       FAILED = 0; \
 | |
|       DEPTH -= MkIntConstant(2);
 | |
| 
 | |
| #define EXECUTE_DEPTH_END \
 | |
|       FAILED = 0;
 | |
| #endif
 | |
| 
 | |
| #define EXECUTE_END_END \
 | |
|       BLOCK = (CELL)EXECUTE_END_END; \
 | |
|     if (!FAILED) { \
 | |
| 	  ALWAYS_GONext(); \
 | |
|     } \
 | |
| 
 | |
| #define DEXECUTE_INSTINIT \
 | |
|       BLOCKADDRESS = (CELL)(*_PREG); \
 | |
| 	  
 | |
| #ifdef LOW_LEVEL_TRACER
 | |
| #define DEXECUTE_LOW_LEVEL_TRACER \
 | |
| 	low_level_trace(enter_pred,(*_PREG)->u.pp.p,XREGS+1);
 | |
| #endif
 | |
| 
 | |
| #define DEXECUTE_POST_LOW_LEVEL_TRACER \
 | |
|      CACHE_Y_AS_ENV(YREG); \
 | |
| 	PredEntry *pt0; \
 | |
| 	CACHE_A1(); \
 | |
| 	pt0 = (*_PREG)->u.pp.p;
 | |
| 	
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define DEXECUTE_DEPTH_MINOR \
 | |
|       FAILED = 0; \
 | |
|       if (pt0->ModuleOfPred) { \
 | |
| 	    if (DEPTH == MkIntTerm(0)) { \
 | |
| 	      YAAM_FAIL; \
 | |
| 		} \
 | |
| 	    else { \
 | |
| 		  DEPTH = RESET_DEPTH(); \
 | |
| 		} \
 | |
| 	  }
 | |
|       
 | |
| #define DEXECUTE_DEPTH_MOFPRED \
 | |
|       FAILED = 0; \
 | |
|       DEPTH -= MkIntConstant(2);
 | |
|       
 | |
| #define DEXECUTE_DEPTH_END \
 | |
|       FAILED = 0;
 | |
| #endif
 | |
| 
 | |
| #ifdef FROZEN_STACKS
 | |
| #ifdef YAPOR_SBA
 | |
| #define DEXECUTE_END_END \
 | |
|       BLOCK = (CELL)DEXECUTE_END_END; \
 | |
| 	 if (!FAILED) { \
 | |
| 	  (*_PREG) = pt0->CodeOfPred; \
 | |
| 	  save_pc(); \
 | |
| 	  (*_CPREG) = (yamop *) ENV_YREG[E_CP]; \
 | |
| 	  ENV_YREG = ENV = (CELL *) ENV_YREG[E_E]; \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) { \
 | |
| 	    ENV_YREG = (CELL *) top_b; \
 | |
|       } \
 | |
| 	  else { \
 | |
| 	    ENV_YREG = (CELL *)((CELL)ENV_YREG + ENV_Size((*_CPREG))); \
 | |
| 	  } \
 | |
| 	  WRITEBACK_Y_AS_ENV(); \
 | |
| 	  ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	  ALWAYS_GONext(); \
 | |
|     } \
 | |
|     ENDCACHE_Y_AS_ENV();
 | |
| #else /* YAPOR_SBA */
 | |
| #define DEXECUTE_END_END \
 | |
|       BLOCK = (CELL)DEXECUTE_END_END; \
 | |
| 	 if (!FAILED) { \
 | |
| 	  (*_PREG) = pt0->CodeOfPred; \
 | |
| 	  save_pc(); \
 | |
| 	  (*_CPREG) = (yamop *) ENV_YREG[E_CP]; \
 | |
| 	  ENV_YREG = ENV = (CELL *) ENV_YREG[E_E]; \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b) { \
 | |
| 	    ENV_YREG = (CELL *) top_b; \
 | |
| 	  } \
 | |
| 	  else { \
 | |
| 	    ENV_YREG = (CELL *)((CELL)ENV_YREG + ENV_Size((*_CPREG))); \
 | |
| 	  } \
 | |
| 	  WRITEBACK_Y_AS_ENV(); \
 | |
| 	  ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	  ALWAYS_GONext(); \
 | |
|     } \
 | |
|     ENDCACHE_Y_AS_ENV();
 | |
| #endif /* YAPOR_SBA */
 | |
| #else /* FROZEN_STACKS */
 | |
| #define DEXECUTE_END_END \
 | |
|       BLOCK = (CELL)DEXECUTE_END_END; \
 | |
| 	 if (!FAILED) { \
 | |
| 	  (*_PREG) = pt0->CodeOfPred; \
 | |
| 	  save_pc(); \
 | |
| 	  (*_CPREG) = (yamop *) ENV_YREG[E_CP]; \
 | |
| 	  ENV_YREG = ENV = (CELL *) ENV_YREG[E_E]; \
 | |
| 	  if (ENV_YREG > (CELL *)B) { \
 | |
| 	    ENV_YREG = (CELL *)B; \
 | |
| 	  } \
 | |
| 	  else { \
 | |
| 	    ENV_YREG = (CELL *) ((CELL) ENV_YREG + ENV_Size((*_CPREG))); \
 | |
| 	  } \
 | |
| 	  WRITEBACK_Y_AS_ENV(); \
 | |
| 	  ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	  ALWAYS_GONext(); \
 | |
|     } \
 | |
|     ENDCACHE_Y_AS_ENV();
 | |
| #endif /* FROZEN_STACKS */
 | |
| 
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define FCALL_INST \
 | |
|       CACHE_Y_AS_ENV(YREG); \
 | |
|       ENV_YREG[E_CP] = (CELL) (*_CPREG); \
 | |
|       ENV_YREG[E_E] = (CELL) ENV; \
 | |
|       ENV_YREG[E_DEPTH] = DEPTH; \
 | |
|       ENDCACHE_Y_AS_ENV();
 | |
| #else /* DEPTH_LIMIT */
 | |
| #define FCALL_INST \
 | |
|       CACHE_Y_AS_ENV(YREG); \
 | |
|       ENV_YREG[E_CP] = (CELL) (*_CPREG); \
 | |
|       ENV_YREG[E_E] = (CELL) ENV; \
 | |
|       ENDCACHE_Y_AS_ENV();
 | |
| #endif /* DEPTH_LIMIT */
 | |
| 	  
 | |
| #define CALL_INSTINIT \
 | |
|       BLOCKADDRESS = (CELL)(*_PREG); \
 | |
|       if (Yap_op_from_opcode((*_PREG)->opc) == _fcall) { \
 | |
| 	    FCALL_INST; \
 | |
| 	  }
 | |
| 	  
 | |
| #ifdef LOW_LEVEL_TRACER
 | |
| #define CALL_LOW_LEVEL_TRACER \
 | |
| 	low_level_trace(enter_pred,(*_PREG)->u.Osbpp.p,XREGS+1);
 | |
| #endif
 | |
| 
 | |
| #define CALL_POST_LOW_LEVEL_TRACER \
 | |
|     register CELL *ENV_YREG = (YREG); \
 | |
| 	PredEntry *pt; \
 | |
| 	pt = (*_PREG)->u.Osbpp.p; \
 | |
| 	CACHE_A1();
 | |
| 	
 | |
| #define CALL_POST_NO_CHECKING \
 | |
| 	ENV = ENV_YREG; \
 | |
| 	ENV_YREG = (CELL *) (((char *) ENV_YREG) + (*_PREG)->u.Osbpp.s); \
 | |
| 	(*_CPREG) = NEXTOP((*_PREG), Osbpp); \
 | |
| 	(*_PREG) = pt->CodeOfPred; \
 | |
| 	save_pc(); \
 | |
| 	
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define CALL_DEPTH_MINOR \
 | |
|       FAILED = 0; \
 | |
| 	  if (pt->ModuleOfPred) { \
 | |
| 	    if (DEPTH == MkIntTerm(0)){ \
 | |
| 	        YAAM_FAIL; \
 | |
| 	    } else { \
 | |
| 	        DEPTH = RESET_DEPTH(); \
 | |
| 	    } \
 | |
| 	  }
 | |
| 	  
 | |
| #define CALL_DEPTH_MOFPRED \
 | |
|       FAILED = 0; \
 | |
| 	  DEPTH -= MkIntConstant(2);
 | |
|       
 | |
| #define CALL_DEPTH_END \
 | |
|       FAILED = 0;
 | |
| #endif
 | |
| 
 | |
| #ifdef YAPOR
 | |
| #ifdef FROZEN_STACKS
 | |
| #ifdef YAPOR_SBA
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	{ \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) { \
 | |
| 	      ENV_YREG = (CELL *) top_b; \
 | |
| 	  } \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	SCH_check_requests(); \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #else /* YAPOR_SBA */
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	{ \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b) { \
 | |
| 	      ENV_YREG = (CELL *) top_b; \
 | |
| 	  } \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	SCH_check_requests(); \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #endif /* YAPOR_SBA */
 | |
| #else /* FROZEN_STACKS */
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	if (ENV_YREG > (CELL *) B) { \
 | |
| 	  ENV_YREG = (CELL *) B; \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	SCH_check_requests(); \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #endif /* FROZEN_STACKS */
 | |
| #else /* YAPOR */
 | |
| #ifdef FROZEN_STACKS
 | |
| #ifdef YAPOR_SBA
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	{ \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) { \
 | |
| 	      ENV_YREG = (CELL *) top_b; \
 | |
| 	  } \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #else /* YAPOR_SBA */
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	{ \
 | |
| 	  choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	  if (ENV_YREG > (CELL *) top_b) { \
 | |
| 	      ENV_YREG = (CELL *) top_b; \
 | |
| 	  } \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #endif /* YAPOR_SBA */
 | |
| #else /* FROZEN_STACKS */
 | |
| #define CALL_END_END \
 | |
|   BLOCK = (CELL)CALL_END_END; \
 | |
|   if (!FAILED) { \
 | |
| 	if (ENV_YREG > (CELL *) B) { \
 | |
| 	  ENV_YREG = (CELL *) B; \
 | |
| 	} \
 | |
| 	WRITEBACK_Y_AS_ENV(); \
 | |
| 	ENV_YREG[E_CB] = (CELL) B; \
 | |
| 	ALWAYS_GONext(); \
 | |
|   }
 | |
| #endif /* FROZEN_STACKS */
 | |
| #endif /* YAPOR */
 | |
| 
 | |
| #define PROCCEED_INSTINIT \
 | |
|       BLOCKADDRESS = (CELL)(*_PREG); \
 | |
|       CACHE_Y_AS_ENV(YREG); \
 | |
|       (*_PREG) = (*_CPREG); \
 | |
|       save_pc(); \
 | |
|       ENV_YREG = ENV;
 | |
| 	  
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define PROCCEED_DEPTH \
 | |
|       DEPTH = ENV_YREG[E_DEPTH];
 | |
| #endif
 | |
| 
 | |
| #define PROCCEED_END \
 | |
|       BLOCK = (CELL)PROCCEED_END; \
 | |
|       WRITEBACK_Y_AS_ENV(); \
 | |
|       ENDCACHE_Y_AS_ENV(); \
 | |
|       ALWAYS_GONext();
 | |
| 
 | |
| #define ALLOCATE_INSTINIT \
 | |
|       CACHE_Y_AS_ENV(YREG); \
 | |
|       (*_PREG) = NEXTOP((*_PREG), e); \
 | |
|       ENV_YREG[E_CP] = (CELL) (*_CPREG); \
 | |
|       ENV_YREG[E_E] = (CELL) ENV;
 | |
| 	  
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define ALLOCATE_DEPTH \
 | |
|       ENV_YREG[E_DEPTH] = DEPTH;
 | |
| #endif
 | |
| 
 | |
| #define ALLOCATE_END \
 | |
|       ENV = ENV_YREG; \
 | |
|       ENDCACHE_Y_AS_ENV(); \
 | |
|       GONext();
 | |
| 
 | |
| #define DEALLOCATE_INSTINIT
 | |
| 
 | |
| #define DEALLOCATE_POST_CHECK \
 | |
|       CACHE_Y_AS_ENV(YREG); \
 | |
|       (*_PREG) = NEXTOP((*_PREG), p); \
 | |
|       (*_SREG) = YREG; \
 | |
|       (*_CPREG) = (yamop *) ENV_YREG[E_CP]; \
 | |
|       ENV = ENV_YREG = (CELL *) ENV_YREG[E_E];
 | |
| 	  
 | |
| #ifdef DEPTH_LIMIT
 | |
| #define DEALLOCATE_DEPTH \
 | |
|       DEPTH = ENV_YREG[E_DEPTH];
 | |
| #endif
 | |
| 
 | |
| #ifdef FROZEN_STACKS
 | |
| #ifdef YAPOR_SBA
 | |
| #define DEALLOCATE_FROZEN \
 | |
| 	choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) \
 | |
| 	    ENV_YREG = (CELL *) top_b; \
 | |
| 	else \
 | |
| 	  ENV_YREG = (CELL *)((CELL) ENV_YREG + ENV_Size(CPREG));
 | |
| #else /* YAPOR_SBA */
 | |
| #define DEALLOCATE_FROZEN \
 | |
| 	choiceptr top_b = PROTECT_FROZEN_B(B); \
 | |
| 	if (ENV_YREG > (CELL *) top_b) \
 | |
| 	    ENV_YREG = (CELL *) top_b; \
 | |
| 	else \
 | |
| 	  ENV_YREG = (CELL *)((CELL) ENV_YREG + ENV_Size(CPREG));
 | |
| #endif /* YAPOR_SBA */
 | |
| #else /* FROZEN_STACKS */
 | |
| #define DEALLOCATE_FROZEN \
 | |
|       if (ENV_YREG > (CELL *) B) \
 | |
| 	ENV_YREG = (CELL *) B; \
 | |
|       else \
 | |
| 	ENV_YREG = (CELL *) ((CELL) ENV_YREG + ENV_Size(CPREG));
 | |
| #endif /* FROZEN_STACKS */
 | |
| 	
 | |
| #define DEALLOCATE_POST_FROZEN \
 | |
|       WRITEBACK_Y_AS_ENV();
 | |
| 
 | |
| #define DEALLOCATE_END \
 | |
|       ENDCACHE_Y_AS_ENV(); \
 | |
|       GONext();
 | |
| 
 |