|
|
1.1 root 1: /* stack.h
2: * tag: stack and stack access functions
3: *
4: * Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
5: *
6: * See the file "COPYING" for further information about
7: * the copyright and warranty status of this work.
8: */
9:
10: #ifndef __STACK_H
11: #define __STACK_H
12:
13: #define dstacksize 512
14: extern int dstackcnt;
15: extern cell dstack[dstacksize];
16:
17: #define rstacksize 512
18: extern int rstackcnt;
19: extern cell rstack[rstacksize];
20:
21: extern int dbgrstackcnt;
22:
23: //typedef struct opaque_xt *xt_t;
24: //typedef struct opaque_ihandle *ihandle_t;
25: //typedef struct opaque_phandle *phandle_t;
26:
27: typedef ucell xt_t;
28: typedef ucell ihandle_t;
29: typedef ucell phandle_t;
30:
31:
32:
33: #ifdef NATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH
34:
35: static inline ucell pointer2cell(const void* x)
36: {
37: return (ucell)(uintptr_t)x;
38: }
39:
40: static inline void* cell2pointer(ucell x)
41: {
42: return (void*)(uintptr_t)x;
43: }
44:
45: #endif
46:
47: static inline void PUSH(ucell value) {
48: dstack[++dstackcnt] = (value);
49: }
50: static inline void PUSH_xt( xt_t xt ) { PUSH( (ucell)xt ); }
51: static inline void PUSH_ih( ihandle_t ih ) { PUSH( (ucell)ih ); }
52: static inline void PUSH_ph( phandle_t ph ) { PUSH( (ucell)ph ); }
53:
54: static inline ucell POP(void) {
55: return (ucell) dstack[dstackcnt--];
56: }
57: static inline xt_t POP_xt( void ) { return (xt_t)POP(); }
58: static inline ihandle_t POP_ih( void ) { return (ihandle_t)POP(); }
59: static inline phandle_t POP_ph( void ) { return (phandle_t)POP(); }
60:
61: static inline void DROP(void) {
62: dstackcnt--;
63: }
64:
65: static inline void DDROP(void) {
66: dstackcnt -= 2;
67: }
68:
69: static inline void DPUSH(ducell value) {
70: #ifdef NEED_FAKE_INT128_T
71: dstack[++dstackcnt] = (cell) value.lo;
72: dstack[++dstackcnt] = (cell) value.hi;
73: #else
74: dstack[++dstackcnt] = (cell) value;
75: dstack[++dstackcnt] = (cell) (value >> bitspercell);
76: #endif
77: }
78:
79: static inline ducell DPOP(void) {
80: #ifdef NEED_FAKE_INT128_T
81: ducell du;
82: du.hi = (ucell) dstack[dstackcnt--];
83: du.lo = (ucell) dstack[dstackcnt--];
84: return du;
85: #else
86: ducell du;
87: du = ((ducell)(ucell) dstack[dstackcnt--]) << bitspercell;
88: du |= (ucell) dstack[dstackcnt--];
89: return du;
90: #endif
91: }
92:
93: static inline ucell GETTOS(void) {
94: return dstack[dstackcnt];
95: }
96:
97: #define GETITEM(number) (dstack[dstackcnt - number])
98: static inline void PUSHR(ucell value) {
99: rstack[++rstackcnt] = (value);
100: }
101:
102: static inline ucell POPR(void) {
103: return (ucell) rstack[rstackcnt--];
104: }
105: static inline ucell GETTORS(void) {
106: return rstack[rstackcnt];
107: }
108:
109:
110: #if defined(DEBUG_DSTACK) || defined(FCOMPILER)
111: void printdstack(void);
112: #endif
113: #if defined(DEBUG_RSTACK) || defined(FCOMPILER)
114: void printrstack(void);
115: #endif
116:
117: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.