2001-04-09 20:54:03 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* *
|
|
|
|
* YAP Prolog %W% %G% *
|
|
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
|
|
* *
|
|
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* File: Regs.h *
|
|
|
|
* mods: *
|
|
|
|
* comments: YAP abstract machine registers *
|
2008-03-25 22:03:14 +00:00
|
|
|
* version: $Id: Regs.h,v 1.40 2008-03-25 22:03:13 vsc Exp $ *
|
2001-04-09 20:54:03 +01:00
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/********* abstract machine registers **********************************/
|
2005-11-18 18:52:41 +00:00
|
|
|
#ifdef CUT_C
|
|
|
|
#include "cut_c.h"
|
|
|
|
#endif
|
|
|
|
|
2006-05-22 17:31:47 +01:00
|
|
|
#if defined MYDDAS_ODBC || defined MYDDAS_MYSQL
|
|
|
|
#include "myddas.h"
|
2006-01-17 22:54:02 +00:00
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
#define MaxTemps 512
|
|
|
|
|
|
|
|
#ifdef i386
|
|
|
|
#define PUSH_REGS 1
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
2006-02-01 13:28:57 +00:00
|
|
|
#ifdef __x86_64__
|
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
2001-09-24 19:07:16 +01:00
|
|
|
#if defined(sparc) || defined(__sparc)
|
2001-04-09 20:54:03 +01:00
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __alpha
|
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
2005-12-23 00:20:14 +00:00
|
|
|
#if defined(_POWER) || defined(__POWERPC__)
|
2001-04-09 20:54:03 +01:00
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef hppa
|
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef mips
|
|
|
|
#undef PUSH_REGS
|
|
|
|
#undef PUSH_X
|
|
|
|
#endif
|
|
|
|
|
2004-01-23 02:23:51 +00:00
|
|
|
/* force a cache of WAM regs for multi-threaded architectures! */
|
|
|
|
#ifdef THREADS
|
|
|
|
#ifndef PUSH_REGS
|
|
|
|
#define PUSH_REGS 1
|
|
|
|
#endif
|
|
|
|
#ifndef PUSH_X
|
|
|
|
#define PUSH_X 1
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
EXTERN void restore_machine_regs(void);
|
|
|
|
EXTERN void save_machine_regs(void);
|
|
|
|
EXTERN void restore_H(void);
|
|
|
|
EXTERN void save_H(void);
|
|
|
|
EXTERN void restore_B(void);
|
|
|
|
EXTERN void save_B(void);
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
CELL CreepFlag_; /* 13 */
|
|
|
|
CELL *HB_; /* 4 heap (global) stack top at latest c.p. */
|
2003-11-05 18:55:03 +00:00
|
|
|
#if defined(SBA) || defined(TABLING)
|
2001-04-09 20:54:03 +01:00
|
|
|
choiceptr BB_; /* 4 local stack top at latest c.p. */
|
2003-11-05 18:55:03 +00:00
|
|
|
#endif /* SBA || TABLING */
|
2001-04-09 20:54:03 +01:00
|
|
|
CELL *H0_; /* 2 base of heap (global) stack */
|
|
|
|
tr_fr_ptr TR_; /* 24 top of trail */
|
|
|
|
CELL *H_; /* 25 top of heap (global) stack */
|
|
|
|
choiceptr B_; /* 26 latest choice point */
|
2005-11-18 18:52:41 +00:00
|
|
|
#ifdef CUT_C
|
|
|
|
cut_c_str_ptr CUT_C_TOP;
|
|
|
|
#endif
|
2006-01-17 22:54:02 +00:00
|
|
|
#if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL)
|
|
|
|
MYDDAS_GLOBAL MYDDAS_GLOBAL_POINTER;
|
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
CELL DEPTH_; /* 27 */
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
yamop *CP_; /* 28 continuation program counter */
|
|
|
|
yamop *P_; /* 7 prolog machine program counter */
|
|
|
|
CELL *YENV_; /* 5 current environment (may differ from ENV)*/
|
|
|
|
CELL *S_; /* 6 structure pointer */
|
|
|
|
CELL *ENV_; /* 1 current environment */
|
|
|
|
CELL *ASP_; /* 8 top of local stack */
|
|
|
|
CELL *LCL0_; /* 3 local stack base */
|
|
|
|
CELL *AuxSp_; /* 9 Auxiliary stack pointer */
|
|
|
|
ADDR AuxTop_; /* 10 Auxiliary stack top */
|
|
|
|
/* visualc*/
|
2002-05-14 19:24:34 +01:00
|
|
|
CELL EX_; /* 18 */
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef COROUTINING
|
|
|
|
Term DelayedVars_; /* maximum number of attributed variables */
|
|
|
|
#endif
|
2004-02-12 12:37:12 +00:00
|
|
|
Term CurrentModule_;
|
2003-11-05 18:55:03 +00:00
|
|
|
#if defined(SBA) || defined(TABLING)
|
2001-04-09 20:54:03 +01:00
|
|
|
CELL *H_FZ_;
|
|
|
|
choiceptr B_FZ_;
|
|
|
|
tr_fr_ptr TR_FZ_;
|
2003-11-05 18:55:03 +00:00
|
|
|
#endif /* SBA || TABLING */
|
2002-10-21 23:14:29 +01:00
|
|
|
#if defined(YAPOR) || defined(THREADS)
|
2004-02-05 16:57:02 +00:00
|
|
|
struct pred_entry *PP_;
|
2004-02-11 13:33:19 +00:00
|
|
|
/* recursive write-locks for PredEntry */
|
2004-02-05 16:57:02 +00:00
|
|
|
yamop **PREG_ADDR_;
|
2002-10-21 23:14:29 +01:00
|
|
|
unsigned int worker_id_;
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef SBA
|
|
|
|
choiceptr BSEG_;
|
|
|
|
struct or_frame *frame_head_, *frame_tail_;
|
|
|
|
char *binding_array_;
|
|
|
|
int sba_offset_;
|
|
|
|
int sba_end_;
|
|
|
|
int sba_size_;
|
|
|
|
#endif /* SBA */
|
2002-10-21 23:14:29 +01:00
|
|
|
#endif /* YAPOR || THREADS */
|
2001-04-09 20:54:03 +01:00
|
|
|
#if PUSH_REGS
|
|
|
|
/* On a X86 machine, the best solution is to keep the
|
|
|
|
X registers on a global variable, whose address is known between
|
|
|
|
runs, and to push the remaining registers to the stack.
|
|
|
|
|
|
|
|
On a register based machine, one can have a dedicated register,
|
|
|
|
always pointing to the XREG global variable. This spends an
|
|
|
|
extra register, but makes it easier to access X[1].
|
|
|
|
*/
|
|
|
|
|
2008-03-25 22:03:14 +00:00
|
|
|
#ifdef PUSH_X
|
2001-04-09 20:54:03 +01:00
|
|
|
Term XTERMS[MaxTemps]; /* 29 */
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
REGSTORE;
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
extern REGSTORE *Yap_regp;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-03-25 22:03:14 +00:00
|
|
|
#ifdef PUSH_X
|
2004-01-23 02:23:51 +00:00
|
|
|
|
2004-02-06 17:22:24 +00:00
|
|
|
#define XREGS (Yap_REGS.XTERMS)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2004-01-23 02:23:51 +00:00
|
|
|
#else
|
|
|
|
|
|
|
|
/* keep X as a global variable */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
Term Yap_XREGS[MaxTemps]; /* 29 */
|
2002-11-11 17:38:10 +00:00
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define XREGS Yap_XREGS
|
2002-11-11 17:38:10 +00:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
|
2004-01-23 02:23:51 +00:00
|
|
|
#ifdef THREADS
|
|
|
|
|
2004-02-06 17:22:24 +00:00
|
|
|
extern pthread_key_t Yap_yaamregs_key;
|
2004-01-23 02:23:51 +00:00
|
|
|
|
2004-02-06 17:22:24 +00:00
|
|
|
#define Yap_regp ((REGSTORE *)pthread_getspecific(Yap_yaamregs_key))
|
2004-01-23 02:23:51 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define Yap_REGS (*Yap_regp)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2004-01-23 02:23:51 +00:00
|
|
|
#else /* !PUSH_REGS */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
Term X[MaxTemps]; /* 29 */
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define XREGS Yap_REGS.X
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
REGSTORE;
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
extern REGSTORE Yap_REGS;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* PUSH_REGS */
|
|
|
|
|
|
|
|
#define MinTrailGap (sizeof(CELL)*1024)
|
|
|
|
#define MinHeapGap (sizeof(CELL)*4096)
|
|
|
|
#define MinStackGap (sizeof(CELL)*8*1024)
|
2002-11-18 18:18:05 +00:00
|
|
|
extern int Yap_stack_overflows;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define ENV Yap_REGS.ENV_ /* current environment */
|
|
|
|
#define ASP Yap_REGS.ASP_ /* top of local stack */
|
|
|
|
#define H0 Yap_REGS.H0_ /* base of heap (global) stack */
|
|
|
|
#define LCL0 Yap_REGS.LCL0_ /* local stack base */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-01-17 14:10:42 +00:00
|
|
|
#define YENV2MEM
|
|
|
|
#define YENV_ADDRESS (&(YENV))
|
|
|
|
#define MEM2YENV
|
|
|
|
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__GNUC__) && defined(sparc) && !defined(__NetBSD__) && !defined(THREADS)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
|
|
|
#define YENV Yap_REGS.YENV_ /* current environment (may differ from ENV)*/
|
|
|
|
#define S Yap_REGS.S_ /* structure pointer */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
register CELL *H asm ("g6");
|
|
|
|
register tr_fr_ptr TR asm ("g7");
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2001-04-09 20:54:03 +01:00
|
|
|
register choiceptr B asm ("g5");
|
|
|
|
#else
|
2002-11-18 18:18:05 +00:00
|
|
|
#define B Yap_REGS.B_ /* latest choice point */
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
2002-11-18 18:18:05 +00:00
|
|
|
#define CP Yap_REGS.CP_ /* continuation program counter */
|
|
|
|
#define HB Yap_REGS.HB_ /* heap (global) stack top at time of latest c.p. */
|
|
|
|
#define CreepFlag Yap_REGS.CreepFlag_
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
EXTERN inline void save_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
|
|
|
Yap_REGS.TR_ = TR;
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
|
|
|
TR = Yap_REGS.TR_;
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS() \
|
|
|
|
CELL *BK_H = H; \
|
|
|
|
choiceptr BK_B = B; \
|
|
|
|
tr_fr_ptr BK_TR = TR; \
|
|
|
|
restore_machine_regs()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS() \
|
|
|
|
save_machine_regs(); \
|
|
|
|
H = BK_H; \
|
|
|
|
B = BK_B; \
|
|
|
|
TR = BK_TR
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H() CELL *BK_H = H; restore_H()
|
|
|
|
|
|
|
|
#define RECOVER_H() save_H(); H = BK_H
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2004-03-05 15:26:33 +00:00
|
|
|
#if defined(__svr4__)
|
2001-04-09 20:54:03 +01:00
|
|
|
#define BACKUP_B() choiceptr BK_B = B; restore_B()
|
|
|
|
|
|
|
|
#define RECOVER_B() save_B(); B = BK_B
|
|
|
|
#else
|
|
|
|
#define BACKUP_B()
|
|
|
|
|
|
|
|
#define RECOVER_B()
|
|
|
|
#endif
|
|
|
|
|
2006-04-11 17:45:43 +01:00
|
|
|
#define restore_TR()
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#elif defined(__GNUC__) && defined(__alpha)
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
|
|
|
#define YENV Yap_REGS.YENV_ /* current environment (may differ from ENV) */
|
2001-04-09 20:54:03 +01:00
|
|
|
register CELL *H asm ("$9");
|
|
|
|
register CELL *HB asm ("$10");
|
|
|
|
register choiceptr B asm ("$11");
|
|
|
|
register yamop *CP asm ("$12");
|
|
|
|
register CELL *S asm ("$13");
|
2001-11-25 19:48:34 +00:00
|
|
|
register tr_fr_ptr TR asm ("$14");
|
|
|
|
/* gcc+debug chokes if $15 is in use on alphas */
|
|
|
|
#ifdef DEBUG
|
2002-11-18 18:18:05 +00:00
|
|
|
#define CreepFlag Yap_REGS.CreepFlag_
|
2001-11-25 19:48:34 +00:00
|
|
|
#else
|
|
|
|
register CELL CreepFlag asm ("$15");
|
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* Interface with foreign code, make sure the foreign code sees all the
|
|
|
|
registers the way they used to be */
|
|
|
|
EXTERN inline void save_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
|
|
|
Yap_REGS.HB_ = HB;
|
|
|
|
Yap_REGS.B_ = B;
|
|
|
|
Yap_REGS.CP_ = CP;
|
2002-01-14 22:26:53 +00:00
|
|
|
#ifndef DEBUG
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.CreepFlag_ = CreepFlag;
|
2002-01-14 22:26:53 +00:00
|
|
|
#endif
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.TR_ = TR;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
|
|
|
HB = Yap_REGS.HB_;
|
|
|
|
B = Yap_REGS.B_;
|
|
|
|
CP = Yap_REGS.CP_;
|
2002-01-14 22:26:53 +00:00
|
|
|
#ifndef DEBUG
|
2002-11-18 18:18:05 +00:00
|
|
|
CreepFlag = Yap_REGS.CreepFlag_;
|
2002-01-14 22:26:53 +00:00
|
|
|
#endif
|
2002-11-18 18:18:05 +00:00
|
|
|
TR = Yap_REGS.TR_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS() \
|
|
|
|
CELL *BK_H = H; \
|
|
|
|
CELL *BK_HB = HB; \
|
|
|
|
choiceptr BK_B = B; \
|
|
|
|
CELL BK_CreepFlag = CreepFlag; \
|
|
|
|
yamop *BK_CP = CP; \
|
|
|
|
tr_fr_ptr BK_TR = TR; \
|
|
|
|
restore_machine_regs()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS() \
|
|
|
|
save_machine_regs(); \
|
|
|
|
H = BK_H; \
|
|
|
|
HB = BK_HB; \
|
|
|
|
B = BK_B; \
|
|
|
|
CreepFlag = BK_CreepFlag; \
|
|
|
|
CP = BK_CP; \
|
|
|
|
TR = BK_TR
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H() CELL *BK_H = H; restore_H()
|
|
|
|
|
|
|
|
#define RECOVER_H() save_H(); H = BK_H
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_B() choiceptr BK_B = B; restore_B()
|
|
|
|
|
|
|
|
#define RECOVER_B() save_B(); B = BK_B
|
|
|
|
|
2003-02-14 12:20:57 +00:00
|
|
|
EXTERN void restore_TR(void);
|
|
|
|
EXTERN void save_TR(void);
|
|
|
|
|
2001-06-27 16:46:26 +01:00
|
|
|
EXTERN inline void save_TR(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.TR_ = TR;
|
2001-06-27 16:46:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_TR(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
TR = Yap_REGS.TR_;
|
2001-06-27 16:46:26 +01:00
|
|
|
}
|
|
|
|
|
2002-02-06 17:35:26 +00:00
|
|
|
#elif defined(__GNUC__) && defined(mips)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
|
|
|
#define YENV Yap_REGS.YENV_ /* current environment (may differ from ENV) */
|
2001-04-09 20:54:03 +01:00
|
|
|
register CELL *H asm ("$16");
|
|
|
|
register CELL *HB asm ("$17");
|
|
|
|
register choiceptr B asm ("$18");
|
|
|
|
register yamop *CP asm ("$19");
|
|
|
|
register CELL *S asm ("$20");
|
|
|
|
register CELL CreepFlag asm ("$21");
|
|
|
|
register tr_fr_ptr TR asm ("$22");
|
|
|
|
|
|
|
|
EXTERN inline void save_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
|
|
|
Yap_REGS.HB_ = HB;
|
|
|
|
Yap_REGS.B_ = B;
|
|
|
|
Yap_REGS.CP_ = CP;
|
|
|
|
Yap_REGS.CreepFlag_ = CreepFlag;
|
|
|
|
Yap_REGS.TR_ = TR;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
|
|
|
HB = Yap_REGS.HB_;
|
|
|
|
B = Yap_REGS.B_;
|
|
|
|
CP = Yap_REGS.CP_;
|
|
|
|
CreepFlag = Yap_REGS.CreepFlag_;
|
|
|
|
TR = Yap_REGS.TR_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS() \
|
|
|
|
CELL *BK_H = H; \
|
|
|
|
CELL *BK_HB = HB; \
|
|
|
|
choiceptr BK_B = B; \
|
|
|
|
CELL BK_CreepFlag = CreepFlag; \
|
|
|
|
yamop *BK_CP = CP; \
|
|
|
|
tr_fr_ptr BK_TR = TR; \
|
|
|
|
restore_machine_regs()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS() \
|
|
|
|
save_machine_regs(); \
|
|
|
|
H = BK_H; \
|
|
|
|
HB = BK_HB; \
|
|
|
|
B = BK_B; \
|
|
|
|
CreepFlag = BK_CreepFlag; \
|
|
|
|
CP = BK_CP; \
|
|
|
|
TR = BK_TR
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H() CELL *BK_H = H; restore_H()
|
|
|
|
|
|
|
|
#define RECOVER_H() save_H(); H = BK_H
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_B() choiceptr BK_B = B; restore_B()
|
|
|
|
|
|
|
|
#define RECOVER_B() save_B(); B = BK_B
|
|
|
|
|
2006-02-13 16:58:55 +00:00
|
|
|
#define restore_TR()
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#elif defined(__GNUC__) && defined(hppa)
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
|
|
|
#define YENV Yap_REGS.YENV_ /* current environment (may differ from ENV) */
|
2001-04-09 20:54:03 +01:00
|
|
|
register CELL *H asm ("r12");
|
|
|
|
register CELL *HB asm ("r13");
|
|
|
|
register choiceptr B asm ("r14");
|
|
|
|
register yamop *CP asm ("r15");
|
|
|
|
register CELL *S asm ("r16");
|
|
|
|
register CELL CreepFlag asm ("r17");
|
|
|
|
register tr_fr_ptr TR asm ("r18");
|
|
|
|
|
|
|
|
EXTERN inline void save_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
|
|
|
Yap_REGS.HB_ = HB;
|
|
|
|
Yap_REGS.B_ = B;
|
|
|
|
Yap_REGS.CP_ = CP;
|
|
|
|
Yap_REGS.CreepFlag_ = CreepFlag;
|
|
|
|
Yap_REGS.TR_ = TR;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
|
|
|
HB = Yap_REGS.HB_;
|
|
|
|
B = Yap_REGS.B_;
|
|
|
|
CP = Yap_REGS.CP_;
|
|
|
|
CreepFlag = Yap_REGS.CreepFlag_;
|
|
|
|
TR = Yap_REGS.TR_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS() \
|
|
|
|
CELL *BK_H = H; \
|
|
|
|
CELL *BK_HB = HB; \
|
|
|
|
choiceptr BK_B = B; \
|
|
|
|
CELL BK_CreepFlag = CreepFlag; \
|
|
|
|
yamop *BK_CP = CP; \
|
|
|
|
tr_fr_ptr BK_TR = TR; \
|
|
|
|
restore_machine_regs()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS() \
|
|
|
|
save_machine_regs(); \
|
|
|
|
H = BK_H; \
|
|
|
|
HB = BK_HB; \
|
|
|
|
B = BK_B; \
|
|
|
|
CreepFlag = BK_CreepFlag; \
|
|
|
|
CP = BK_CP; \
|
|
|
|
TR = BK_TR
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H() CELL *BK_H = H; restore_H()
|
|
|
|
|
|
|
|
#define RECOVER_H() save_H(); H = BK_H
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_B() choiceptr BK_B = B; restore_B()
|
|
|
|
|
|
|
|
#define RECOVER_B() save_B(); B = BK_B
|
|
|
|
|
2003-02-14 12:20:57 +00:00
|
|
|
EXTERN void restore_TR(void);
|
|
|
|
EXTERN void save_TR(void);
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
EXTERN inline void save_TR(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.TR_ = TR;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_TR(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
TR = Yap_REGS.TR_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
2005-12-23 00:20:14 +00:00
|
|
|
#elif defined(__GNUC__) && (defined(_POWER) || defined(__POWERPC__))
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Because of a bug in GCC, we should always start from the first available
|
|
|
|
general register. According to rs6000.h, this is r13 everywhere
|
|
|
|
except for svr4 machines, where r13 is fixed.
|
|
|
|
|
|
|
|
If we don't do so, GCC will generate move multiple instructions for
|
|
|
|
entering complex functions. These instructions will save and
|
|
|
|
restore the global registers :-(.
|
|
|
|
|
|
|
|
*/
|
2006-03-03 23:11:30 +00:00
|
|
|
#define CreepFlag Yap_REGS.CreepFlag_
|
|
|
|
/*
|
|
|
|
vsc: this MUST start from register 13, otherwise GCC will break down in flames and
|
|
|
|
use the registers for evil purposes. :-(
|
|
|
|
*/
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifndef __svr4__
|
2006-03-03 23:11:30 +00:00
|
|
|
register tr_fr_ptr TR asm ("r13");
|
2001-04-09 20:54:03 +01:00
|
|
|
#else
|
2006-03-03 23:11:30 +00:00
|
|
|
register tr_fr_ptr TR asm ("r21");
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
register CELL *H asm ("r14");
|
|
|
|
register CELL *HB asm ("r15");
|
|
|
|
register choiceptr B asm ("r16");
|
|
|
|
register yamop *CP asm ("r17");
|
|
|
|
register CELL *S asm ("r18");
|
|
|
|
register CELL *YENV asm ("r19");
|
2002-11-18 18:18:05 +00:00
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-01-17 14:10:42 +00:00
|
|
|
#undef YENV2MEM
|
|
|
|
#undef YENV_ADDRESS (&(YENV))
|
|
|
|
#undef MEM2YENV
|
|
|
|
|
|
|
|
#define YENV2MEM { CELL *YENV_MEM = YENV
|
|
|
|
#define YENV_ADDRESS (&YENV_MEM)
|
|
|
|
#define MEM2YENV YENV = YENV_MEM; }
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
EXTERN inline void save_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
|
|
|
Yap_REGS.HB_ = HB;
|
|
|
|
Yap_REGS.B_ = B;
|
|
|
|
Yap_REGS.CP_ = CP;
|
|
|
|
Yap_REGS.YENV_ = YENV;
|
|
|
|
Yap_REGS.TR_ = TR;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
|
|
|
HB = Yap_REGS.HB_;
|
|
|
|
B = Yap_REGS.B_;
|
|
|
|
CP = Yap_REGS.CP_;
|
|
|
|
YENV = Yap_REGS.YENV_;
|
|
|
|
TR = Yap_REGS.TR_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS() \
|
|
|
|
CELL *BK_H = H; \
|
|
|
|
CELL *BK_HB = HB; \
|
|
|
|
choiceptr BK_B = B; \
|
|
|
|
yamop *BK_CP = CP; \
|
|
|
|
tr_fr_ptr BK_TR = TR; \
|
|
|
|
restore_machine_regs()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS() \
|
|
|
|
save_machine_regs(); \
|
|
|
|
H = BK_H; \
|
|
|
|
HB = BK_HB; \
|
|
|
|
B = BK_B; \
|
|
|
|
CP = BK_CP; \
|
|
|
|
TR = BK_TR
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.H_ = H;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
H = Yap_REGS.H_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H() CELL *BK_H = H; restore_H()
|
|
|
|
|
|
|
|
#define RECOVER_H() save_H(); H = BK_H
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
Yap_REGS.B_ = B;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
2002-11-18 18:18:05 +00:00
|
|
|
B = Yap_REGS.B_;
|
2001-04-09 20:54:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_B() choiceptr BK_B = B; restore_B()
|
|
|
|
|
|
|
|
#define RECOVER_B() save_B(); B = BK_B
|
|
|
|
|
2006-02-13 16:58:55 +00:00
|
|
|
EXTERN void restore_TR(void);
|
|
|
|
EXTERN void save_TR(void);
|
|
|
|
|
|
|
|
EXTERN inline void save_TR(void) {
|
|
|
|
Yap_REGS.TR_ = TR;
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_TR(void) {
|
|
|
|
TR = Yap_REGS.TR_;
|
|
|
|
}
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#else
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define CP Yap_REGS.CP_ /* continuation program counter */
|
|
|
|
#define P Yap_REGS.P_ /* prolog machine program counter */
|
|
|
|
#define YENV Yap_REGS.YENV_ /* current environment (may differ from ENV) */
|
|
|
|
#define S Yap_REGS.S_ /* structure pointer */
|
|
|
|
#define H Yap_REGS.H_ /* top of heap (global) stack */
|
|
|
|
#define B Yap_REGS.B_ /* latest choice point */
|
|
|
|
#define TR Yap_REGS.TR_ /* top of trail */
|
|
|
|
#define HB Yap_REGS.HB_ /* heap (global) stack top at time of latest c.p. */
|
|
|
|
#define CreepFlag Yap_REGS.CreepFlag_
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
EXTERN inline void save_machine_regs(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_machine_regs(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_MACHINE_REGS()
|
|
|
|
|
|
|
|
#define RECOVER_MACHINE_REGS()
|
|
|
|
|
|
|
|
EXTERN inline void save_H(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_H(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_H()
|
|
|
|
|
|
|
|
#define RECOVER_H()
|
|
|
|
|
|
|
|
EXTERN inline void save_B(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN inline void restore_B(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
#define BACKUP_B()
|
|
|
|
|
|
|
|
#define RECOVER_B()
|
|
|
|
|
2006-02-13 16:58:55 +00:00
|
|
|
#define restore_TR()
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
|
|
|
|
2004-01-23 02:23:51 +00:00
|
|
|
#define AuxSp Yap_REGS.AuxSp_
|
|
|
|
#define AuxTop Yap_REGS.AuxTop_
|
|
|
|
#define TopB Yap_REGS.TopB_
|
|
|
|
#define DelayedB Yap_REGS.DelayedB_
|
|
|
|
#define EX Yap_REGS.EX_
|
|
|
|
#define DEPTH Yap_REGS.DEPTH_
|
2003-11-05 18:55:03 +00:00
|
|
|
#if defined(SBA) || defined(TABLING)
|
2002-11-18 18:18:05 +00:00
|
|
|
#define H_FZ Yap_REGS.H_FZ_
|
|
|
|
#define B_FZ Yap_REGS.B_FZ_
|
|
|
|
#define TR_FZ Yap_REGS.TR_FZ_
|
2003-11-05 18:55:03 +00:00
|
|
|
#endif /* SBA || TABLING */
|
2002-10-21 23:14:29 +01:00
|
|
|
#if defined(YAPOR) || defined(THREADS)
|
2002-11-18 18:18:05 +00:00
|
|
|
#define worker_id (Yap_REGS.worker_id_)
|
2004-02-05 16:57:02 +00:00
|
|
|
#define PP (Yap_REGS.PP_)
|
|
|
|
#define PREG_ADDR (Yap_REGS.PREG_ADDR_)
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef SBA
|
2002-11-18 18:18:05 +00:00
|
|
|
#define BSEG Yap_REGS.BSEG_
|
|
|
|
#define binding_array Yap_REGS.binding_array_
|
|
|
|
#define sba_offset Yap_REGS.sba_offset_
|
|
|
|
#define sba_end Yap_REGS.sba_end_
|
|
|
|
#define sba_size Yap_REGS.sba_size_
|
|
|
|
#define frame_head Yap_REGS.frame_head_
|
|
|
|
#define frame_tail Yap_REGS.frame_tail_
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* SBA */
|
|
|
|
#endif /* YAPOR */
|
|
|
|
#ifdef COROUTINING
|
2002-11-18 18:18:05 +00:00
|
|
|
#define DelayedVars Yap_REGS.DelayedVars_
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif
|
2002-11-18 18:18:05 +00:00
|
|
|
#define CurrentModule Yap_REGS.CurrentModule_
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
#define REG_SIZE sizeof(REGS)/sizeof(CELL *)
|
|
|
|
|
|
|
|
#define ARG1 XREGS[1]
|
|
|
|
#define ARG2 XREGS[2]
|
|
|
|
#define ARG3 XREGS[3]
|
|
|
|
#define ARG4 XREGS[4]
|
|
|
|
#define ARG5 XREGS[5]
|
|
|
|
#define ARG6 XREGS[6]
|
|
|
|
#define ARG7 XREGS[7]
|
|
|
|
#define ARG8 XREGS[8]
|
|
|
|
#define ARG9 XREGS[9]
|
|
|
|
#define ARG10 XREGS[10]
|
|
|
|
#define ARG11 XREGS[11]
|
|
|
|
#define ARG12 XREGS[12]
|
|
|
|
#define ARG13 XREGS[13]
|
|
|
|
#define ARG14 XREGS[14]
|
|
|
|
#define ARG15 XREGS[15]
|
|
|
|
#define ARG16 XREGS[16]
|
|
|
|
|
|
|
|
#define cut_succeed() return( ( B = B->cp_b, 1 ))
|
|
|
|
#define cut_fail() return( ( B = B->cp_b, 0 ))
|
|
|
|
|
|
|
|
|
|
|
|
/* by default, define HBREG to be HB */
|
|
|
|
|
|
|
|
#define HBREG HB
|
|
|
|
|
2003-11-05 18:55:03 +00:00
|
|
|
#if defined(SBA) || defined(TABLING)
|
2002-11-18 18:18:05 +00:00
|
|
|
#define BB Yap_REGS.BB_
|
2001-04-09 20:54:03 +01:00
|
|
|
#define BBREG BB
|
2003-11-05 18:55:03 +00:00
|
|
|
#endif /* SBA || TABLING */
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-03-25 22:03:14 +00:00
|
|
|
#if !defined(THREADS)
|
2001-04-09 20:54:03 +01:00
|
|
|
/* use actual addresses for regs */
|
|
|
|
#define PRECOMPUTE_REGADDRESS 1
|
|
|
|
#endif /* THREADS */
|
|
|
|
|
|
|
|
|
|
|
|
/* aggregate several abstract machine operations in a single */
|
|
|
|
#define AGGREGATE_OPS 1
|
|
|
|
|
|
|
|
/* make standard registers globally accessible so that they are there
|
|
|
|
when we come from a longjmp */
|
|
|
|
#if PUSH_REGS
|
|
|
|
/* In this case we need to initialise the abstract registers */
|
2002-11-18 18:18:05 +00:00
|
|
|
REGSTORE Yap_standard_regs;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* PUSH_REGS */
|
|
|
|
|
2002-03-08 06:33:16 +00:00
|
|
|
/******************* controlling debugging ****************************/
|
2001-05-21 21:00:05 +01:00
|
|
|
static inline UInt
|
|
|
|
CalculateStackGap(void)
|
|
|
|
{
|
2002-01-03 16:28:17 +00:00
|
|
|
UInt gmin = (LCL0-H0)>>3;
|
2004-09-16 18:29:08 +01:00
|
|
|
|
|
|
|
if (gmin < MinStackGap) gmin = MinStackGap;
|
|
|
|
return gmin;
|
2001-05-21 21:00:05 +01:00
|
|
|
}
|