24#include "inline-only.h"
26#ifndef SHORT_ADDRESSES
27#define LONG_ADDRESSES 1
29#define LONG_ADDRESSES 0
83#if LONG_ADDRESSES && defined(OLD_TAG_SCHEME)
85#include "Tags_32bits.h"
98#ifndef USE_SYSTEM_MALLOC
99#define USE_SYSTEM_MALLOC 1
104#define USE_LOW32_TAGS 1
107#if SIZEOF_INT_P == 4 && !defined(OLD_TAG_SCHEME) && !defined(USE_LOW32_TAGS)
109#include "Tags_32Ops.h"
111#elif LONG_ADDRESSES && SIZEOF_INT_P == 4 && !defined(OLD_TAG_SCHEME) && \
112 defined(USE_LOW32_TAGS)
114#include "Tags_32LowTag.h"
116#elif SIZEOF_INT_P == 8 && !defined(OLD_TAG_SCHEME)
118#include "Tags_64bits.h"
126#ifdef TAG_LOW_BITS_32
129#define MBIT 0x80000000
130#define RBIT 0x40000000
132#if IN_SECOND_QUADRANT
140#if defined(YAPOR_SBA) && defined(__linux__)
141#define MBIT MKTAG(0x1, 0)
143#define RBIT MKTAG(0x1, 0)
144#define MBIT MKTAG(0x2, 0)
154#define MkVarTerm() MkVarTerm__(PASS_REGS1)
155#define MkPairTerm(A, B) MkPairTerm__(A, B PASS_REGS)
161INLINE_ONLY Term *VarOfTerm(Term t);
163INLINE_ONLY Term *VarOfTerm(Term t) {
return (Term *)(t); }
167#define RESET_VARIABLE(V) (*(CELL *)(V) = 0)
169INLINE_ONLY Term MkVarTerm__(USES_REGS1);
171INLINE_ONLY Term MkVarTerm__(USES_REGS1) {
172 return (Term)((*HR = 0, HR++));
175INLINE_ONLY
bool IsUnboundVar(Term *t) {
return (
int)(*(t) ==
180#define RESET_VARIABLE(V) (*(CELL *)(V) = Unsigned(V))
183INLINE_ONLY Term MkVarTerm__(USES_REGS1) {
184 return (Term)((*HR = (CELL)HR, HR++));
188INLINE_ONLY
bool IsUnboundVar(Term *t) {
189 return *(t) == (Term)(t);
195INLINE_ONLY CELL *PtrOfTerm(Term t) {
196 return (CELL *)(*(CELL *)(t));
199INLINE_ONLY
Functor FunctorOfTerm(Term);
201INLINE_ONLY
Functor FunctorOfTerm(Term t) {
207INLINE_ONLY Term MkAtomTerm(
Atom);
209INLINE_ONLY Term MkAtomTerm(
Atom a) {
210 return (Term)(AtomTag | (CELL)(a));
213INLINE_ONLY
Atom AtomOfTerm(Term t);
215INLINE_ONLY
Atom AtomOfTerm(Term t) {
216 return (
Atom)((~AtomTag & (CELL)(t)));
221INLINE_ONLY Term MkAtomTerm(
Atom);
223INLINE_ONLY Term MkAtomTerm(
Atom at) {
224 return (Term)(TAGGEDA((CELL)AtomTag, (CELL)(at)));
227INLINE_ONLY
Atom AtomOfTerm(Term t);
229INLINE_ONLY
Atom AtomOfTerm(Term t) {
230 return (
Atom)(NonTagPart(t));
235INLINE_ONLY
bool IsAtomTerm(Term);
237INLINE_ONLY
bool IsAtomTerm(Term t) {
238 return CHKTAG((t), AtomTag);
241INLINE_ONLY Term MkIntTerm(Int);
243INLINE_ONLY Term MkIntTerm(Int n) {
244 return (Term)(TAGGED(NumberTag, (n)));
252INLINE_ONLY Term MkIntConstant(Int);
254INLINE_ONLY Term MkIntConstant(Int n) {
255 return (Term)(NONTAGGED(NumberTag, (n)));
258INLINE_ONLY
bool IsIntTerm(Term);
260INLINE_ONLY
bool IsIntTerm(Term t) {
261 return CHKTAG((t), NumberTag);
264INLINE_ONLY Term MkPairTerm__(Term head, Term tail USES_REGS);
266INLINE_ONLY Term MkPairTerm__(Term head, Term tail USES_REGS) {
279#define IntInBnd(X) (TRUE)
282#define IntInBnd(X) (Unsigned(((Int)(X) >> (32 - 7)) + 1) <= 1)
284#define IntInBnd(X) ((X) < MAX_ABS_INT && (X) > -MAX_ABS_INT - 1L)
300#define IsAccessFunc(func) ((func) == FunctorAccess)
304#define MkIntegerTerm(i) __MkIntegerTerm(i PASS_REGS)
306INLINE_ONLY Term __MkIntegerTerm(Int USES_REGS);
308INLINE_ONLY Term __MkIntegerTerm(Int n USES_REGS) {
309 return (Term)(IntInBnd(n) ? MkIntTerm(n) : MkLongIntTerm(n));
313INLINE_ONLY
bool IsIntegerTerm(Term);
315INLINE_ONLY
bool IsIntegerTerm(Term t) {
316 return (
int)(IsIntTerm(t) || IsLongIntTerm(t));
319INLINE_ONLY Int IntegerOfTerm(Term);
321INLINE_ONLY Int IntegerOfTerm(Term t) {
323 return (Int)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
328#define MkAddressTerm(i) __MkAddressTerm(i PASS_REGS)
330INLINE_ONLY Term __MkAddressTerm(
void *USES_REGS);
332INLINE_ONLY Term __MkAddressTerm(
void *n USES_REGS) {
333 return __MkIntegerTerm((Int)n PASS_REGS);
338INLINE_ONLY
bool IsAddressTerm(Term);
340INLINE_ONLY
bool IsAddressTerm(Term t) {
341 return (
bool)IsIntegerTerm(t);
344INLINE_ONLY
void *AddressOfTerm(Term);
346INLINE_ONLY
void *AddressOfTerm(Term t) {
347 return (
void *)(IsIntTerm(t) ? IntOfTerm(t) : LongIntOfTerm(t));
351INLINE_ONLY Int IsPairTermOrNil (Term);
354IsPairOrNilTerm (Term t)
356 return IsPairTerm(t) || t == TermNil;