YAP 7.1.0
Tags_32bits.h
1
2
3
4
5
6
7
8/*************************************************************************
9* *
10* YAP Prolog %W% %G% *
11* Yap Prolog was developed at NCCUP - Universidade do Porto *
12* *
13* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
14* *
15**************************************************************************
16* *
17* File: Tags_32bits.h.m4 *
18* Last rev: December 90 *
19* mods: *
20* comments: Original Tag Scheme for machines with 32 bits adresses *
21* version: $Id: Tags_32bits.h,v 1.1 2005-05-27 22:27:06 rslopes Exp $ *
22*************************************************************************/
23
24/* Original version for 32 bit addresses machines,
25 Each term is represented internally as an unsigned 32 bit integer as
26 follows:
27 tag value
28 ints 1m1....00 numeric value
29 atoms 1m0....00 offset of atom entry
30 pairs 1mr....01 ptr to pair
31 aplied functor 1mr....10 ptr to functor followed by args
32 ref 0mr....00 address of cell
33 undefined 0mr....00 address of cell pointing to itself
34
35 functors are represented as ptrs to the functor entry in the atom
36property list
37
38*/
39
40#if FALSE
41
42#define SHIFT_HIGH_TAG 29
43
44#define MKTAG(HI,LO) ((((UInt) (HI))<<SHIFT_HIGH_TAG)|(LO))
45
46#define TagBits /* 0xe0000003L */ MKTAG(0x7,3)
47#define LowTagBits /* 0x00000003L */ MKTAG(0x0,3)
48#define HighTagBits /* 0xe0000000L */ MKTAG(0x7,0)
49#define AdrHiBit /* 0x10000000L */ (((UInt)1) << (SHIFT_HIGH_TAG-1))
50#define MaskAdr /* 0x1ffffffcL */ ((((UInt)1) << SHIFT_HIGH_TAG)-4)
51#define MaskPrim /* 0x0ffffffcL */ ((((UInt)1) << (SHIFT_HIGH_TAG))-4)
52#define NumberTag /* 0xa0000000L */ MKTAG(0x5,0)
53#define AtomTag /* 0x80000000L */ MKTAG(0x4,0)
54#define PairTag /* 0x80000001L */ MKTAG(0x4,1)
55#define ApplTag /* 0x80000002L */ MKTAG(0x4,2)
56#define MAX_ABS_INT /* 0x04000000L */ (1 << (SHIFT_HIGH_TAG-3))
57
58/* bits that should not be used by anyone but us */
59#define YAP_PROTECTED_MASK 0xe0000000L
60
61#define MaskBits 4
62
63#define PairBit /* 0x00000001L */ 1
64#define ApplBit /* 0x00000002L */ 2
65
66#define NonTagPart(X) (Signed(X) & MaskPrim)
67#define TAGGEDA(TAG,V) (TAG | Unsigned(V))
68#define TAGGED(TAG,V) (TAG | NonTagPart(Unsigned(V)<<2))
69#define NONTAGGED(TAG,V) NonTagPart(Unsigned(V)<<2)
70#define BitOn(Bit,V) (Bit & Unsigned(V))
71#define CHKTAG(t,Tag) ((Unsigned(t)&TagBits)==Tag)
72
73#include "inline-only.h"
74INLINE_ONLY EXTERN int IsVarTerm (Term);
75
76INLINE_ONLY EXTERN int
77IsVarTerm (Term t)
78{
79 return (int) (Signed (t) >= 0);
80}
81
82
83
84INLINE_ONLY EXTERN int IsNonVarTerm (Term);
85
86INLINE_ONLY EXTERN int
87IsNonVarTerm (Term t)
88{
89 return (int) (Signed (t) < 0);
90}
91
92
93
94INLINE_ONLY EXTERN Term *RepPair (Term);
95
96INLINE_ONLY EXTERN Term *
97RepPair (Term t)
98{
99 return (Term *) (NonTagPart (t));
100}
101
102
103
104INLINE_ONLY EXTERN Term AbsPair (Term *);
105
106INLINE_ONLY EXTERN Term
107AbsPair (Term * p)
108{
109 return (Term) (TAGGEDA (PairTag, (p)));
110}
111
112
113
114INLINE_ONLY EXTERN Int IsPairTerm (Term);
115
116INLINE_ONLY EXTERN Int
117IsPairTerm (Term t)
118{
119 return (Int) (BitOn (PairBit, (t)));
120}
121
122
123
124INLINE_ONLY EXTERN Term *RepAppl (Term);
125
126INLINE_ONLY EXTERN Term *
127RepAppl (Term t)
128{
129 return (Term *) (NonTagPart (t));
130}
131
132
133
134INLINE_ONLY EXTERN Term AbsAppl (Term *);
135
136INLINE_ONLY EXTERN Term
137AbsAppl (Term * p)
138{
139 return (Term) (TAGGEDA (ApplTag, (p)));
140}
141
142
143
144INLINE_ONLY EXTERN Int IsApplTerm (Term);
145
146INLINE_ONLY EXTERN Int
147IsApplTerm (Term t)
148{
149 return (Int) (BitOn (ApplBit, (t)));
150}
151
152
153
154INLINE_ONLY EXTERN int IsAtomOrIntTerm (Term);
155
156INLINE_ONLY EXTERN int
157IsAtomOrIntTerm (Term t)
158{
159 return (int) (((Unsigned (t) & LowTagBits) == 0));
160}
161
162
163
164
165INLINE_ONLY EXTERN Term AdjustPtr (Term t, Term off);
166
167INLINE_ONLY EXTERN Term
168AdjustPtr (Term t, Term off)
169{
170 return (Term) ((t) + off);
171}
172
173
174
175INLINE_ONLY EXTERN Term AdjustIDBPtr (Term t, Term off);
176
177INLINE_ONLY EXTERN Term
178AdjustIDBPtr (Term t, Term off)
179{
180 return (Term) ((t) + off);
181}
182
183
184
185
186INLINE_ONLY EXTERN Int IntOfTerm (Term);
187
188INLINE_ONLY EXTERN Int
189IntOfTerm (Term t)
190{
191 return (Int) (((Int) (t << 3)) >> (3 + 2));
192}
193
194#endif /* NOT IN USE */