2001-04-09 20:54:03 +01:00
|
|
|
/*************************************************************************
|
2006-10-10 15:08:17 +01:00
|
|
|
* *
|
|
|
|
* YAP Prolog @(#)amidefs.h 1.3 3/15/90 *
|
|
|
|
* *
|
|
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
|
|
* *
|
|
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* File: amidefs.h *
|
|
|
|
* comments: Abstract machine peculiarities *
|
|
|
|
* *
|
2008-07-23 00:34:50 +01:00
|
|
|
* Last rev: $Date: 2008-07-22 23:34:49 $ *
|
2006-10-10 15:08:17 +01:00
|
|
|
* $Log: not supported by cvs2svn $
|
2008-07-23 00:34:50 +01:00
|
|
|
* Revision 1.33 2007/11/26 23:43:09 vsc
|
|
|
|
* fixes to support threads and assert correctly, even if inefficiently.
|
|
|
|
*
|
2007-11-26 23:43:10 +00:00
|
|
|
* Revision 1.32 2006/10/10 14:08:17 vsc
|
|
|
|
* small fixes on threaded implementation.
|
|
|
|
*
|
2006-10-10 15:08:17 +01:00
|
|
|
* Revision 1.31 2006/09/20 20:03:51 vsc
|
|
|
|
* improve indexing on floats
|
|
|
|
* fix sending large lists to DB
|
|
|
|
*
|
|
|
|
* Revision 1.30 2005/12/17 03:25:39 vsc
|
|
|
|
* major changes to support online event-based profiling
|
|
|
|
* improve error discovery and restart on scanner.
|
|
|
|
*
|
|
|
|
* Revision 1.29 2005/07/06 15:10:15 vsc
|
|
|
|
* improvements to compiler: merged instructions and fixes for ->
|
|
|
|
*
|
|
|
|
* Revision 1.28 2005/05/30 06:07:35 vsc
|
|
|
|
* changes to support more tagging schemes from tabulation.
|
|
|
|
*
|
|
|
|
* Revision 1.27 2005/04/10 04:01:13 vsc
|
|
|
|
* bug fixes, I hope!
|
|
|
|
*
|
|
|
|
* Revision 1.26 2004/09/30 21:37:41 vsc
|
|
|
|
* fixes for thread support
|
|
|
|
*
|
|
|
|
* Revision 1.25 2004/09/27 20:45:04 vsc
|
|
|
|
* Mega clauses
|
|
|
|
* Fixes to sizeof(expand_clauses) which was being overestimated
|
|
|
|
* Fixes to profiling+indexing
|
|
|
|
* Fixes to reallocation of memory after restoring
|
|
|
|
* Make sure all clauses, even for C, end in _Ystop
|
|
|
|
* Don't reuse space for Streams
|
|
|
|
* Fix Stream_F on StreaNo+1
|
|
|
|
*
|
|
|
|
* Revision 1.24 2004/04/14 19:10:40 vsc
|
|
|
|
* expand_clauses: keep a list of clauses to expand
|
|
|
|
* fix new trail scheme for multi-assignment variables
|
|
|
|
*
|
|
|
|
* Revision 1.23 2004/03/31 01:03:10 vsc
|
|
|
|
* support expand group of clauses
|
|
|
|
*
|
|
|
|
* Revision 1.22 2004/03/10 14:59:55 vsc
|
|
|
|
* optimise -> for type tests
|
|
|
|
* *
|
|
|
|
* *
|
|
|
|
*************************************************************************/
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
#if ALIGN_LONGS
|
|
|
|
/* */ typedef Int DISPREG;
|
|
|
|
/* */ typedef CELL SMALLUNSGN;
|
|
|
|
/* */ typedef Int OPREG;
|
|
|
|
/* */ typedef CELL UOPREG;
|
|
|
|
|
|
|
|
#else
|
|
|
|
/* */ typedef Short DISPREG;
|
|
|
|
/* */ typedef BITS16 SMALLUNSGN;
|
|
|
|
/* */ typedef SBITS16 OPREG;
|
|
|
|
/* */ typedef SBITS16 UOPREG;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2002-12-27 16:53:09 +00:00
|
|
|
|
|
|
|
typedef Int (*CPredicate)(void);
|
|
|
|
|
|
|
|
typedef Int (*CmpPredicate)(Term, Term);
|
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#define OpRegSize sizeof(OPREG)
|
|
|
|
|
|
|
|
/*
|
2006-10-10 15:08:17 +01:00
|
|
|
Possible arguments to YAP emulator:
|
|
|
|
wamreg describes an A or X register;
|
|
|
|
yslot describes an Y slot
|
|
|
|
COUNT is a small number (eg, number of arguments to a choicepoint,
|
|
|
|
number of permanent variables in a environment
|
2001-04-09 20:54:03 +01:00
|
|
|
*/
|
|
|
|
|
2002-11-11 17:38:10 +00:00
|
|
|
typedef OPREG wamreg;
|
|
|
|
typedef OPREG yslot;
|
2001-04-09 20:54:03 +01:00
|
|
|
typedef OPREG COUNT;
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2006-10-10 15:08:17 +01:00
|
|
|
This is a table with the codes for YAP instructions
|
2001-04-09 20:54:03 +01:00
|
|
|
*/
|
|
|
|
typedef enum {
|
|
|
|
#define OPCODE(OP,TYPE) _##OP
|
|
|
|
#include "YapOpcodes.h"
|
|
|
|
#undef OPCODE
|
|
|
|
} op_numbers;
|
|
|
|
|
2008-08-21 13:38:25 +01:00
|
|
|
#define _std_top _or_last
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2005-07-06 16:10:18 +01:00
|
|
|
/* use similar trick for keeping instruction names */
|
|
|
|
#if defined(ANALYST) || defined(DEBUG)
|
|
|
|
extern char *Yap_op_names[_std_top + 1];
|
|
|
|
#endif
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
typedef enum {
|
2006-10-10 15:08:17 +01:00
|
|
|
_atom,
|
|
|
|
_atomic,
|
|
|
|
_integer,
|
|
|
|
_compound,
|
|
|
|
_float,
|
|
|
|
_nonvar,
|
|
|
|
_number,
|
|
|
|
_var,
|
|
|
|
_cut_by,
|
|
|
|
_db_ref,
|
|
|
|
_primitive,
|
|
|
|
_dif,
|
|
|
|
_eq,
|
|
|
|
_equal,
|
|
|
|
_plus,
|
|
|
|
_minus,
|
|
|
|
_times,
|
|
|
|
_div,
|
|
|
|
_and,
|
|
|
|
_or,
|
|
|
|
_sll,
|
|
|
|
_slr,
|
|
|
|
_arg,
|
|
|
|
_functor
|
2001-04-09 20:54:03 +01:00
|
|
|
} basic_preds;
|
|
|
|
|
|
|
|
#if USE_THREADED_CODE
|
|
|
|
|
|
|
|
#if ALIGN_LONGS
|
|
|
|
/* */ typedef CELL OPCODE;
|
|
|
|
#else
|
|
|
|
|
|
|
|
#if LOW_ABSMI
|
|
|
|
/* */ typedef BITS16 OPCODE;
|
|
|
|
#else
|
|
|
|
/* */ typedef CELL OPCODE;
|
|
|
|
#endif
|
|
|
|
#endif /* ALIGN_LONGS */
|
|
|
|
#else /* if does not USE_THREADED_CODE */
|
|
|
|
/* */ typedef op_numbers OPCODE;
|
|
|
|
#endif
|
|
|
|
#define OpCodeSize sizeof(OPCODE)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
Types of possible YAAM instructions.
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
The meaning of the symbols in a abstract machine instruction is:
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-08-22 03:01:27 +01:00
|
|
|
c: constant, is a Term
|
2008-08-21 13:38:25 +01:00
|
|
|
b: bitmap (CELL *)
|
|
|
|
d: double (functor + unaligned double)
|
|
|
|
f: functor
|
|
|
|
F: Function, CPredicate
|
|
|
|
i: large integer (functor + long)
|
2008-08-22 03:01:27 +01:00
|
|
|
l: label, yamop *
|
2008-08-21 13:38:25 +01:00
|
|
|
L: logic upd clause, logic_upd_clause *
|
|
|
|
m: module, Term
|
|
|
|
o: opcode, OPCODE
|
|
|
|
s: small integer, COUNT
|
|
|
|
x: wam register, wamreg
|
2008-08-22 03:01:27 +01:00
|
|
|
|
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
d: predicate definition
|
|
|
|
n: small number
|
|
|
|
x: argument or temporary register
|
|
|
|
y: environment slot
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
*/
|
|
|
|
typedef struct yami {
|
|
|
|
OPCODE opc;
|
|
|
|
union {
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
CELL next;
|
|
|
|
} e;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} c;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c1;
|
|
|
|
Term c2;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} cc;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c1;
|
|
|
|
Term c2;
|
|
|
|
Term c3;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} ccc;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c1;
|
|
|
|
Term c2;
|
|
|
|
Term c3;
|
|
|
|
Term c4;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} cccc;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c1;
|
|
|
|
Term c2;
|
|
|
|
Term c3;
|
|
|
|
Term c4;
|
|
|
|
Term c5;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} ccccc;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c1;
|
|
|
|
Term c2;
|
|
|
|
Term c3;
|
|
|
|
Term c4;
|
|
|
|
Term c5;
|
|
|
|
Term c6;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} cccccc;
|
|
|
|
struct {
|
2008-08-22 03:01:27 +01:00
|
|
|
Term c;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
CELL next;
|
|
|
|
} clll;
|
|
|
|
struct {
|
|
|
|
CELL d[1+SIZEOF_DOUBLE/SIZEOF_INT_P];
|
|
|
|
CELL next;
|
|
|
|
} d;
|
|
|
|
struct {
|
|
|
|
struct logic_upd_clause *ClBase;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} L;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
Functor f;
|
|
|
|
Int a;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} fa;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
CELL i[2];
|
|
|
|
CELL next;
|
|
|
|
} i;
|
|
|
|
struct {
|
|
|
|
struct logic_upd_index *I;
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
COUNT s;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} Ills;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
struct yami *l;
|
|
|
|
CELL next;
|
|
|
|
} l;
|
|
|
|
struct {
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef YAPOR
|
2006-10-10 15:08:17 +01:00
|
|
|
unsigned int or_arg;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* YAPOR */
|
|
|
|
#ifdef TABLING
|
2006-10-10 15:08:17 +01:00
|
|
|
struct table_entry *te; /* pointer to table entry */
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* TABLING */
|
2008-08-21 13:38:25 +01:00
|
|
|
Int s;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct pred_entry *p;
|
|
|
|
struct yami *d;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} apl;
|
|
|
|
/* The next two instructions are twin: they both correspond to the old ldd.
|
|
|
|
The first one, aLl, handles try_logical and retry_logical,
|
|
|
|
Ill handles trust_logical.
|
|
|
|
They must have the same fields.
|
|
|
|
*/
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef YAPOR
|
2006-10-10 15:08:17 +01:00
|
|
|
unsigned int or_arg;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* YAPOR */
|
2006-09-20 21:03:51 +01:00
|
|
|
#ifdef TABLING
|
2006-10-10 15:08:17 +01:00
|
|
|
struct table_entry *te; /* pointer to table entry */
|
2006-09-20 21:03:51 +01:00
|
|
|
#endif /* TABLING */
|
2008-08-21 13:38:25 +01:00
|
|
|
/* number of arguments */
|
|
|
|
COUNT s;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct logic_upd_clause *d;
|
|
|
|
struct yami *n;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} aLl;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
2006-09-20 21:03:51 +01:00
|
|
|
#ifdef YAPOR
|
2008-08-21 13:38:25 +01:00
|
|
|
unsigned int or_arg;
|
2006-09-20 21:03:51 +01:00
|
|
|
#endif /* YAPOR */
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef TABLING
|
2008-08-21 13:38:25 +01:00
|
|
|
struct table_entry *te; /* pointer to table entry */
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* TABLING */
|
2008-08-21 13:38:25 +01:00
|
|
|
/* number of arguments */
|
|
|
|
struct logic_upd_index *block;
|
|
|
|
struct logic_upd_clause *d;
|
|
|
|
struct yami *n;
|
|
|
|
CELL next;
|
|
|
|
} ILl;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef YAPOR
|
2006-10-10 15:08:17 +01:00
|
|
|
unsigned int or_arg;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* YAPOR */
|
|
|
|
#ifdef TABLING
|
2006-10-10 15:08:17 +01:00
|
|
|
struct table_entry *te; /* pointer to table entry */
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* TABLING */
|
2008-08-21 13:38:25 +01:00
|
|
|
Int s;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct pred_entry *p;
|
|
|
|
CPredicate f;
|
|
|
|
COUNT extra;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} apFs;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
CELL next;
|
|
|
|
} lll;
|
|
|
|
struct {
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
struct yami *l4;
|
|
|
|
CELL next;
|
|
|
|
} llll;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
struct yami *l4;
|
|
|
|
CELL next;
|
|
|
|
} xllll;
|
|
|
|
struct {
|
|
|
|
COUNT s;
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
struct yami *l4;
|
|
|
|
CELL next;
|
|
|
|
} sllll;
|
|
|
|
struct {
|
|
|
|
struct pred_entry *p;
|
|
|
|
struct yami *f;
|
|
|
|
wamreg x1;
|
|
|
|
wamreg x2;
|
2008-08-21 13:38:25 +01:00
|
|
|
COUNT flags;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} plxxs;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
struct pred_entry *p;
|
|
|
|
struct yami *f;
|
|
|
|
wamreg x;
|
|
|
|
yslot y;
|
2008-08-21 13:38:25 +01:00
|
|
|
COUNT flags;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} plxys;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
struct pred_entry *p;
|
|
|
|
struct yami *f;
|
|
|
|
wamreg y1;
|
|
|
|
yslot y2;
|
2008-08-21 13:38:25 +01:00
|
|
|
COUNT flags;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} plyys;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
OPCODE pop;
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
struct yami *l3;
|
|
|
|
struct yami *l4;
|
|
|
|
CELL next;
|
|
|
|
} ollll;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
CELL next;
|
|
|
|
} o;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
2008-08-21 13:38:25 +01:00
|
|
|
Term c;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
|
|
|
} oc;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
CELL d[1+SIZEOF_DOUBLE/SIZEOF_INT_P];
|
|
|
|
CELL next;
|
|
|
|
} od;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
Functor f;
|
|
|
|
Int a;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} ofa;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
CELL i[2];
|
|
|
|
CELL next;
|
|
|
|
} oi;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
COUNT s;
|
|
|
|
CELL c;
|
|
|
|
CELL next;
|
|
|
|
} osc;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
COUNT s;
|
|
|
|
CELL next;
|
|
|
|
} os;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
wamreg x;
|
|
|
|
CELL next;
|
|
|
|
} ox;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
wamreg xl;
|
|
|
|
wamreg xr;
|
|
|
|
CELL next;
|
|
|
|
} oxx;
|
|
|
|
struct {
|
|
|
|
OPCODE opcw;
|
|
|
|
yslot y;
|
|
|
|
CELL next;
|
|
|
|
} oy;
|
|
|
|
struct {
|
|
|
|
struct pred_entry *p;
|
|
|
|
CELL next;
|
|
|
|
} p;
|
|
|
|
struct {
|
|
|
|
struct pred_entry *p;
|
|
|
|
struct pred_entry *p0;
|
|
|
|
CELL next;
|
|
|
|
} pp;
|
|
|
|
struct {
|
|
|
|
COUNT s;
|
|
|
|
CELL next;
|
|
|
|
} s;
|
2008-08-21 13:38:25 +01:00
|
|
|
/* format of expand_clauses */
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
COUNT s1;
|
|
|
|
COUNT s2;
|
|
|
|
COUNT s3;
|
|
|
|
struct yami *sprev, *snext;
|
|
|
|
struct pred_entry *p;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} sssllp;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
COUNT s;
|
|
|
|
CELL c;
|
|
|
|
CELL next;
|
|
|
|
} sc;
|
|
|
|
struct {
|
|
|
|
COUNT s;
|
|
|
|
CPredicate d;
|
|
|
|
struct yami *l;
|
|
|
|
struct pred_entry *p;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} sdlp;
|
|
|
|
/* the next 3 instructions must have same size and have fields in same order! */
|
|
|
|
/* also check env for yes and trustfail code before making any changes */
|
|
|
|
struct {
|
|
|
|
#ifdef YAPOR
|
|
|
|
unsigned int or_arg;
|
|
|
|
#endif /* YAPOR */
|
|
|
|
COUNT s;
|
|
|
|
CELL *bmap;
|
|
|
|
struct yami *l;
|
|
|
|
struct pred_entry *p0;
|
|
|
|
CELL next;
|
|
|
|
} sblp;
|
|
|
|
struct {
|
|
|
|
#ifdef YAPOR
|
|
|
|
unsigned int or_arg;
|
|
|
|
#endif /* YAPOR */
|
|
|
|
COUNT s;
|
|
|
|
CELL *bmap;
|
|
|
|
struct pred_entry *p;
|
|
|
|
struct pred_entry *p0;
|
|
|
|
CELL next;
|
|
|
|
} sbpp;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifdef YAPOR
|
2006-10-10 15:08:17 +01:00
|
|
|
unsigned int or_arg;
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* YAPOR */
|
2006-10-10 15:08:17 +01:00
|
|
|
COUNT s;
|
|
|
|
CELL *bmap;
|
2008-08-21 13:38:25 +01:00
|
|
|
Term mod;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct pred_entry *p0;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} sbmp;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
COUNT s; /* size of table */
|
|
|
|
COUNT e; /* live entries */
|
|
|
|
COUNT w; /* pending suspended blocks */
|
|
|
|
struct yami *l;
|
|
|
|
CELL next;
|
|
|
|
} sssl;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
CELL next;
|
|
|
|
} x;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
CELL c;
|
|
|
|
CELL next;
|
|
|
|
} xc;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
CELL d[1+SIZEOF_DOUBLE/SIZEOF_INT_P];
|
|
|
|
CELL next;
|
|
|
|
} xd;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
Functor f;
|
|
|
|
Int a;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} xfa;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
struct yami *F;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} xl;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
CELL i[2];
|
|
|
|
CELL next;
|
|
|
|
} xi;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
struct yami *l1;
|
|
|
|
struct yami *l2;
|
|
|
|
CELL next;
|
|
|
|
} xll;
|
|
|
|
struct {
|
|
|
|
wamreg xl;
|
|
|
|
wamreg xr;
|
|
|
|
CELL next;
|
|
|
|
} xx;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
wamreg x1;
|
|
|
|
wamreg x2;
|
|
|
|
CELL next;
|
|
|
|
} xxx;
|
|
|
|
struct {
|
|
|
|
wamreg xl1;
|
|
|
|
wamreg xl2;
|
|
|
|
wamreg xr1;
|
|
|
|
wamreg xr2;
|
|
|
|
CELL next;
|
|
|
|
} xxxx;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
wamreg xi;
|
2008-08-21 13:38:25 +01:00
|
|
|
COUNT c;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} xxc;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
yslot y;
|
|
|
|
CELL next;
|
|
|
|
} xy;
|
|
|
|
struct {
|
|
|
|
wamreg x;
|
|
|
|
wamreg x1;
|
2008-08-21 13:38:25 +01:00
|
|
|
yslot y2;
|
2006-10-10 15:08:17 +01:00
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} xxy;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
yslot y;
|
|
|
|
CELL next;
|
|
|
|
} y;
|
|
|
|
struct {
|
|
|
|
yslot y;
|
|
|
|
struct yami *F;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} yl;
|
2006-10-10 15:08:17 +01:00
|
|
|
struct {
|
|
|
|
yslot y;
|
|
|
|
wamreg x;
|
|
|
|
CELL next;
|
|
|
|
} yx;
|
|
|
|
struct {
|
|
|
|
yslot y;
|
|
|
|
wamreg x1;
|
|
|
|
wamreg x2;
|
|
|
|
CELL next;
|
|
|
|
} yxx;
|
|
|
|
struct {
|
|
|
|
yslot y1;
|
|
|
|
yslot y2;
|
|
|
|
wamreg x;
|
|
|
|
CELL next;
|
|
|
|
} yyx;
|
|
|
|
struct {
|
|
|
|
yslot y;
|
|
|
|
yslot y1;
|
|
|
|
yslot y2;
|
|
|
|
CELL next;
|
|
|
|
} yyy;
|
|
|
|
struct {
|
2008-08-21 13:38:25 +01:00
|
|
|
wamreg xi;
|
2006-10-10 15:08:17 +01:00
|
|
|
yslot y;
|
|
|
|
Int c;
|
|
|
|
CELL next;
|
2008-08-21 13:38:25 +01:00
|
|
|
} yxc;
|
2006-10-10 15:08:17 +01:00
|
|
|
} u;
|
2001-04-09 20:54:03 +01:00
|
|
|
} yamop;
|
|
|
|
|
|
|
|
typedef yamop yamopp;
|
|
|
|
|
|
|
|
#define OPCR opc
|
|
|
|
#define OPCW u.ox.opcw
|
|
|
|
|
|
|
|
|
|
|
|
#define NEXTOP(V,TYPE) ((yamop *)(&((V)->u.TYPE.next)))
|
|
|
|
|
2003-04-30 18:46:05 +01:00
|
|
|
#define PREVOP(V,TYPE) ((yamop *)((CODEADDR)(V)-(CELL)NEXTOP((yamop *)NULL,TYPE)))
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#if defined(TABLING) || defined(SBA)
|
|
|
|
typedef struct trail_frame {
|
|
|
|
Term term;
|
|
|
|
CELL value;
|
|
|
|
} *tr_fr_ptr;
|
|
|
|
|
|
|
|
#define TrailTerm(X) ((X)->term)
|
|
|
|
#define TrailVal(X) ((X)->value)
|
|
|
|
#else
|
|
|
|
typedef Term *tr_fr_ptr;
|
|
|
|
|
|
|
|
#define TrailTerm(X) (*(X))
|
|
|
|
#define TrailVal(X) OOOOOOPS: this program should not compile
|
|
|
|
#endif /* TABLING || SBA */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2006-10-10 15:08:17 +01:00
|
|
|
Choice Point Structure
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
6 fixed fields (TR,AP,H,B,ENV,CP) plus arguments
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
*/
|
|
|
|
typedef struct choicept {
|
|
|
|
tr_fr_ptr cp_tr;
|
|
|
|
CELL *cp_h;
|
|
|
|
struct choicept *cp_b;
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
CELL cp_depth;
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
yamop *cp_cp;
|
|
|
|
#ifdef YAPOR
|
|
|
|
int cp_lub; /* local untried branches */
|
|
|
|
struct or_frame *cp_or_fr; /* or-frame pointer */
|
|
|
|
#endif /* YAPOR */
|
|
|
|
yamop *cp_ap;
|
|
|
|
#if MIN_ARRAY == 0
|
|
|
|
CELL *cp_env;
|
|
|
|
/* GNUCC understands empty arrays */
|
|
|
|
CELL cp_args[MIN_ARRAY];
|
|
|
|
#define cp_a1 cp_args[0]
|
|
|
|
#define cp_a2 cp_args[1]
|
|
|
|
#define cp_a3 cp_args[2]
|
|
|
|
#define cp_a4 cp_args[3]
|
|
|
|
#define cp_a5 cp_args[4]
|
|
|
|
#define cp_a6 cp_args[5]
|
|
|
|
#define cp_a7 cp_args[6]
|
|
|
|
#define cp_a8 cp_args[7]
|
|
|
|
#define EXTRA_CBACK_ARG(Arity,Offset) B->cp_args[(Arity)+(Offset)-1]
|
|
|
|
#else
|
|
|
|
/* Otherwise, we need a very dirty trick to access the arguments */
|
|
|
|
union {
|
|
|
|
CELL *cp_uenv;
|
|
|
|
CELL cp_args[1];
|
|
|
|
} cp_last;
|
|
|
|
#define cp_env cp_last.cp_uenv
|
|
|
|
#define cp_a1 cp_last.cp_args[1]
|
|
|
|
#define cp_a2 cp_last.cp_args[2]
|
|
|
|
#define cp_a3 cp_last.cp_args[3]
|
|
|
|
#define cp_a4 cp_last.cp_args[4]
|
|
|
|
#define cp_a5 cp_last.cp_args[5]
|
|
|
|
#define cp_a6 cp_last.cp_args[6]
|
|
|
|
#define cp_a7 cp_last.cp_args[7]
|
|
|
|
#define cp_a8 cp_last.cp_args[8]
|
|
|
|
#define EXTRA_CBACK_ARG(Arity,Offset) B->cp_last.cp_args[(Arity)+(Offset)]
|
|
|
|
#endif
|
|
|
|
} *choiceptr;
|
|
|
|
|
|
|
|
/* This has problems with \+ \+ a, !, b. */
|
|
|
|
#define SHOULD_CUT_UP_TO(X,Y) ((X) != (Y))
|
|
|
|
/* #define SHOULD_CUT_UP_TO(X,Y) ((X) (Y)) */
|
|
|
|
|
|
|
|
#ifdef SBA
|
|
|
|
#define SHARED_CP(CP) ((CP) >= B_FZ || (CP) < (choiceptr)H_FZ)
|
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
#define YOUNGER_CP(CP1, CP2) \
|
|
|
|
(SHARED_CP(CP1) ? \
|
|
|
|
(SHARED_CP(CP2) ? OrFr_depth((CP1)->cp_or_fr) > OrFr_depth((CP2)->cp_or_fr) : FALSE) \
|
|
|
|
: \
|
|
|
|
(SHARED_CP(CP2) ? TRUE : CP1 < CP2) \
|
|
|
|
)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-10-10 15:08:17 +01:00
|
|
|
#define EQUAL_OR_YOUNGER_CP(CP1, CP2) \
|
|
|
|
(SHARED_CP(CP1) ? \
|
|
|
|
(SHARED_CP(CP2) ? OrFr_depth((CP1)->cp_or_fr) >= OrFr_depth((CP2)->cp_or_fr) : FALSE) \
|
|
|
|
: \
|
|
|
|
(SHARED_CP(CP2) ? TRUE : CP1 <= CP2) \
|
|
|
|
)
|
2005-05-30 07:07:35 +01:00
|
|
|
|
|
|
|
#define YOUNGER_H(H1, H2) FIXMEE!!!!
|
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#else /* ENV_COPY || ACOW */
|
|
|
|
#define YOUNGER_CP(CP1, CP2) ((CP1) < (CP2))
|
|
|
|
#define EQUAL_OR_YOUNGER_CP(CP1, CP2) ((CP1) <= (CP2))
|
2005-05-30 07:07:35 +01:00
|
|
|
|
|
|
|
#define YOUNGER_H(H1, H2) ((CELL *)(H1) > (CELL *)(H2))
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* SBA */
|
|
|
|
|
2005-05-30 07:07:35 +01:00
|
|
|
#define YOUNGEST_CP(CP1, CP2) (YOUNGER_CP(CP1,CP2) ? (CP1) : (CP2))
|
|
|
|
|
|
|
|
#define YOUNGEST_H(H1, H2) (YOUNGER_H(H1,H2) ? (CELL *)(H1) : (CELL *)(H2))
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/*
|
2006-10-10 15:08:17 +01:00
|
|
|
Environment Structure (CP, E, and CUT_B). Yap always saves the B
|
|
|
|
where to cut to, even if not needed.
|
2001-04-09 20:54:03 +01:00
|
|
|
*/
|
|
|
|
#define E_CP -1
|
|
|
|
#define E_E -2
|
|
|
|
#define E_CB -3
|
|
|
|
#ifdef TABLING
|
|
|
|
#define E_B -4
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
#define E_DEPTH -5
|
|
|
|
#define EnvSizeInCells 5
|
|
|
|
#else
|
|
|
|
#define EnvSizeInCells 4
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
#else /* TABLING */
|
|
|
|
#ifdef DEPTH_LIMIT
|
|
|
|
#define E_DEPTH -4
|
|
|
|
#define EnvSizeInCells 4
|
|
|
|
#else
|
|
|
|
#define EnvSizeInCells 3
|
|
|
|
#endif /* DEPTH_LIMIT */
|
|
|
|
#endif /* TABLING */
|
|
|
|
|
|
|
|
#if MSHIFTOFFS
|
|
|
|
#define FixedEnvSize EnvSizeInCells
|
|
|
|
#else
|
|
|
|
#define FixedEnvSize (EnvSizeInCells*sizeof(CELL))
|
|
|
|
#endif
|
|
|
|
#define RealEnvSize (EnvSizeInCells*sizeof(CELL))
|
|
|
|
|
2008-08-21 13:38:25 +01:00
|
|
|
#define ENV_Size(cp) (((yamop *)((CODEADDR)(cp) - (CELL)NEXTOP((yamop *)NULL,sbpp)))->u.sbpp.s)
|
|
|
|
#define ENV_ToP(cp) (((yamop *)((CODEADDR)(cp) - (CELL)NEXTOP((yamop *)NULL,sbpp)))->u.sla.p)
|
|
|
|
#define ENV_ToOp(cp) (((yamop *)((CODEADDR)(cp) - (CELL)NEXTOP((yamop *)NULL,sbpp)))->opc)
|
2001-04-09 20:54:03 +01:00
|
|
|
#define EnvSize(cp) ((-ENV_Size(cp))/(OPREG)sizeof(CELL))
|
2008-08-21 13:38:25 +01:00
|
|
|
#define EnvBMap(p) (((yamop *)((CODEADDR)(p) - (CELL)NEXTOP((yamop *)NULL,sbpp)))->u.sbpp.bmap)
|
|
|
|
#define EnvPreg(p) (((yamop *)((CODEADDR)(p) - (CELL)NEXTOP((yamop *)NULL,sbpp)))->u.sbpp.p0)
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* access to instructions */
|
|
|
|
|
|
|
|
#if USE_THREADED_CODE
|
2002-11-18 18:18:05 +00:00
|
|
|
extern void **Yap_ABSMI_OPCODES;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
#define absmadr(i) ((OPCODE)(Yap_ABSMI_OPCODES[(i)]))
|
2001-04-09 20:54:03 +01:00
|
|
|
#else
|
|
|
|
#define absmadr(i) ((OPCODE)(i))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* used to find out how many instructions of each kind are executed */
|
|
|
|
#ifdef ANALYST
|
2005-07-06 16:10:18 +01:00
|
|
|
extern YAP_ULONG_LONG Yap_opcount[_std_top + 1];
|
|
|
|
|
|
|
|
extern YAP_ULONG_LONG Yap_2opcount[_std_top + 1][_std_top + 1];
|
2001-04-09 20:54:03 +01:00
|
|
|
#endif /* ANALYST */
|
|
|
|
|
|
|
|
#if DEPTH_LIMIT
|
|
|
|
/*
|
|
|
|
Make this into an even number so that the system will know
|
2006-10-10 15:08:17 +01:00
|
|
|
it should ignore the depth limit
|
2001-04-09 20:54:03 +01:00
|
|
|
*/
|
|
|
|
#define RESET_DEPTH() DEPTH = MkIntTerm(MAX_ABS_INT-1)
|
|
|
|
#else
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|