117 lines
2.5 KiB
C
117 lines
2.5 KiB
C
/* stack.h
|
|
* tag: stack and stack access functions
|
|
*
|
|
* Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
|
|
*
|
|
* See the file "COPYING" for further information about
|
|
* the copyright and warranty status of this work.
|
|
*/
|
|
|
|
#ifndef __STACK_H
|
|
#define __STACK_H
|
|
|
|
#define dstacksize 512
|
|
extern int dstackcnt;
|
|
extern cell dstack[dstacksize];
|
|
|
|
#define rstacksize 512
|
|
extern int rstackcnt;
|
|
extern cell rstack[rstacksize];
|
|
|
|
extern int dbgrstackcnt;
|
|
|
|
//typedef struct opaque_xt *xt_t;
|
|
//typedef struct opaque_ihandle *ihandle_t;
|
|
//typedef struct opaque_phandle *phandle_t;
|
|
|
|
typedef ucell xt_t;
|
|
typedef ucell ihandle_t;
|
|
typedef ucell phandle_t;
|
|
|
|
|
|
|
|
#ifdef NATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH
|
|
|
|
static inline ucell pointer2cell(const void* x)
|
|
{
|
|
return (ucell)(uintptr_t)x;
|
|
}
|
|
|
|
static inline void* cell2pointer(ucell x)
|
|
{
|
|
return (void*)(uintptr_t)x;
|
|
}
|
|
|
|
#endif
|
|
|
|
static inline void PUSH(ucell value) {
|
|
dstack[++dstackcnt] = (value);
|
|
}
|
|
static inline void PUSH_xt( xt_t xt ) { PUSH( (ucell)xt ); }
|
|
static inline void PUSH_ih( ihandle_t ih ) { PUSH( (ucell)ih ); }
|
|
static inline void PUSH_ph( phandle_t ph ) { PUSH( (ucell)ph ); }
|
|
|
|
static inline ucell POP(void) {
|
|
return (ucell) dstack[dstackcnt--];
|
|
}
|
|
static inline xt_t POP_xt( void ) { return (xt_t)POP(); }
|
|
static inline ihandle_t POP_ih( void ) { return (ihandle_t)POP(); }
|
|
static inline phandle_t POP_ph( void ) { return (phandle_t)POP(); }
|
|
|
|
static inline void DROP(void) {
|
|
dstackcnt--;
|
|
}
|
|
|
|
static inline void DDROP(void) {
|
|
dstackcnt -= 2;
|
|
}
|
|
|
|
static inline void DPUSH(ducell value) {
|
|
#ifdef NEED_FAKE_INT128_T
|
|
dstack[++dstackcnt] = (cell) value.lo;
|
|
dstack[++dstackcnt] = (cell) value.hi;
|
|
#else
|
|
dstack[++dstackcnt] = (cell) value;
|
|
dstack[++dstackcnt] = (cell) (value >> bitspercell);
|
|
#endif
|
|
}
|
|
|
|
static inline ducell DPOP(void) {
|
|
#ifdef NEED_FAKE_INT128_T
|
|
ducell du;
|
|
du.hi = (ucell) dstack[dstackcnt--];
|
|
du.lo = (ucell) dstack[dstackcnt--];
|
|
return du;
|
|
#else
|
|
ducell du;
|
|
du = ((ducell)(ucell) dstack[dstackcnt--]) << bitspercell;
|
|
du |= (ucell) dstack[dstackcnt--];
|
|
return du;
|
|
#endif
|
|
}
|
|
|
|
static inline ucell GETTOS(void) {
|
|
return dstack[dstackcnt];
|
|
}
|
|
|
|
#define GETITEM(number) (dstack[dstackcnt - number])
|
|
static inline void PUSHR(ucell value) {
|
|
rstack[++rstackcnt] = (value);
|
|
}
|
|
|
|
static inline ucell POPR(void) {
|
|
return (ucell) rstack[rstackcnt--];
|
|
}
|
|
static inline ucell GETTORS(void) {
|
|
return rstack[rstackcnt];
|
|
}
|
|
|
|
|
|
#if defined(DEBUG_DSTACK) || defined(FCOMPILER)
|
|
void printdstack(void);
|
|
#endif
|
|
#if defined(DEBUG_RSTACK) || defined(FCOMPILER)
|
|
void printrstack(void);
|
|
#endif
|
|
|
|
#endif
|