c5e66af5d1
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@507 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
178 lines
3.6 KiB
C
178 lines
3.6 KiB
C
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
* *
|
|
* 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: Tags_24bits.h.m4 *
|
|
* Last rev: December 90 *
|
|
* mods: *
|
|
* comments: Tag Scheme for machines with 24 bits adresses (m68000) *
|
|
* version: $Id: Tags_24bits.h,v 1.9 2002-06-01 04:29:01 vsc Exp $ *
|
|
*************************************************************************/
|
|
|
|
/* Version for 24 bit addresses (68000)
|
|
Each term is represented internally as an unsigned 32 bit integer as
|
|
follows:
|
|
tag value
|
|
ints 1m1000 numeric value
|
|
floats 1m1001 floating point value
|
|
pairs 1mr10. ptr to pair
|
|
aplied functor 1mr01. ptr to functor followed by args
|
|
ref 0mr000 address of cell
|
|
undefined 0mr000 pointing to itself
|
|
|
|
*/
|
|
|
|
#define AllTagBits 0xfc000000L
|
|
#define TagBits 0xbc000000L
|
|
#define MaskAdr 0x03ffffffL
|
|
#define AdrHiBit 0x02000000L
|
|
#define NumberTag 0xa0000000L
|
|
#define FloatTag 0xa4000000L
|
|
#define AtomTag 0x84000000L
|
|
#define PairTag 0x90000000L
|
|
#define ApplTag 0x88000000L
|
|
#define RefTag 0x80000000L
|
|
|
|
#define MaskBits 6
|
|
|
|
#define PairBit 0x10000000L
|
|
#define ApplBit 0x08000000L
|
|
#define CompBits 0x18000000L
|
|
#define NumberMask 0xb8000000L
|
|
#define MAX_ABS_INT /* 0xfe00000LL */ ((((UInt)(1<<7))-1) << SHIFT_HIGH_TAG)
|
|
|
|
#define NonTagPart(X) (Signed(X) & MaskAdr)
|
|
#define TAGGEDA(TAG,V) (TAG | Unsigned(V))
|
|
#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)))
|
|
#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V))
|
|
#define BitOn(Bit,V) (Bit & Unsigned(V))
|
|
#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
|
|
|
|
/* bits that should not be used by anyone but us */
|
|
#define YAP_PROTECTED_MASK 0x00000000L
|
|
|
|
|
|
inline EXTERN int IsVarTerm(Term);
|
|
|
|
inline EXTERN int IsVarTerm(Term t)
|
|
{
|
|
return (int) (Signed(t) >= 0);
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN int IsNonVarTerm(Term);
|
|
|
|
inline EXTERN int IsNonVarTerm(Term t)
|
|
{
|
|
return (int) (Signed(t) < 0);
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Term * RepPair(Term);
|
|
|
|
inline EXTERN Term * RepPair(Term t)
|
|
{
|
|
return (Term *) (NonTagPart(t));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Term AbsPair(Term *);
|
|
|
|
inline EXTERN Term AbsPair(Term * p)
|
|
{
|
|
return (Term) (TAGGEDA(PairTag, (p)));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Int IsPairTerm(Term);
|
|
|
|
inline EXTERN Int IsPairTerm(Term t)
|
|
{
|
|
return (Int) (BitOn(PairBit, (t)));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Term * RepAppl(Term);
|
|
|
|
inline EXTERN Term * RepAppl(Term t)
|
|
{
|
|
return (Term *) (NonTagPart(t));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Term AbsAppl(Term *);
|
|
|
|
inline EXTERN Term AbsAppl(Term * p)
|
|
{
|
|
return (Term) (TAGGEDA(ApplTag, (p)));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Int IsApplTerm(Term);
|
|
|
|
inline EXTERN Int IsApplTerm(Term t)
|
|
{
|
|
return (Int) (BitOn(ApplBit, (t)));
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Int IsAtomOrIntTerm(Term);
|
|
|
|
inline EXTERN Int IsAtomOrIntTerm(Term t)
|
|
{
|
|
return (Int) (!(Unsigned(t) & CompBits));
|
|
}
|
|
|
|
|
|
|
|
|
|
inline EXTERN Term AdjustPtr(Term t, Term off);
|
|
|
|
inline EXTERN Term AdjustPtr(Term t, Term off)
|
|
{
|
|
return (Term) ((t)+off);
|
|
}
|
|
|
|
|
|
|
|
inline EXTERN Term AdjustIDBPtr(Term t, Term off);
|
|
|
|
inline EXTERN Term AdjustIDBPtr(Term t, Term off)
|
|
{
|
|
return (Term) ((t)+off);
|
|
}
|
|
|
|
|
|
|
|
static inline Int
|
|
IntOfTerm(Term t)
|
|
{
|
|
Int n;
|
|
n = (Unsigned(t) & MaskPrim) >> 2;
|
|
|
|
if (Unsigned(t) & AdrHiBit)
|
|
n |= 0xfc000000;
|
|
return (n);
|
|
}
|
|
|