version 1.4, 1999/05/04 12:51:35
|
version 1.13, 2002/01/14 08:40:24
|
Line 1
|
Line 1
|
/* This file defines a number of threading schemes. |
/* This file defines a number of threading schemes. |
|
|
Copyright (C) 1995, 1996,1997 Free Software Foundation, Inc. |
Copyright (C) 1995, 1996,1997,1999 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 16
|
Line 16
|
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, write to the Free Software |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
|
|
|
This files defines macros for threading. Many sets of macros are |
This files defines macros for threading. Many sets of macros are |
Line 91
|
Line 91
|
|
|
*/ |
*/ |
|
|
/* CFA_NEXT: a more appropriate name would be CFA_LIVE, i.e., cfa is live after NEXT */ |
/* CFA_NEXT: if NEXT uses cfa, you have to #define CFA_NEXT, to get |
|
* cfa declared in engine. |
|
*/ |
|
|
#ifdef DOUBLY_INDIRECT |
#ifdef DOUBLY_INDIRECT |
# define CFA_NEXT |
# define CFA_NEXT |
Line 101
|
Line 103
|
# define NEXT_INST (cfa) |
# define NEXT_INST (cfa) |
# define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) |
# define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({ip++; ca=**cfa;}) |
# define NEXT_P1 ({\ |
|
if (cfa<=vm_prims+DOESJUMP || cfa>=vm_prims+sizeof(routines)) \ |
|
fprintf(stderr,"NEXT encountered prim %p at ip=%p\n", cfa, ip); \ |
|
ip++; ca=**cfa;}) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P2 ({goto *ca;}) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=**cfa; goto *ca;}) |
# define EXEC(XT) ({DEF_CA cfa=(XT);\ |
# define NEXT1_P1 ({ca = **cfa;}) |
if (cfa>vm_prims+DOESJUMP && cfa<vm_prims+sizeof(routines)) \ |
# define NEXT1_P2 ({goto *ca;}) |
fprintf(stderr,"EXEC encountered xt %p at ip=%p\n", cfa, ip); \ |
|
ca=**cfa; goto *ca;}) |
|
|
#else /* !defined(DOUBLY_INDIRECT) */ |
#else /* !defined(DOUBLY_INDIRECT) */ |
|
|
Line 246
|
Line 252
|
# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) |
# define NEXT_INST (next_cfa) |
# define NEXT_INST (next_cfa) |
# define INC_IP(const_inc) ({next_cfa=IP[const_inc]; ip+=(const_inc);}) |
# define INC_IP(const_inc) ({next_cfa=IP[const_inc]; ip+=(const_inc);}) |
# define DEF_CA Label ca; |
# define DEF_CA |
# define NEXT_P1 ({ca=next_cfa; cfa=next_cfa; ip++; next_cfa=*ip;}) |
# define NEXT_P1 ({cfa=next_cfa; ip++; next_cfa=*ip;}) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P2 ({goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define MORE_VARS Xt next_cfa; |
# define MORE_VARS Xt next_cfa; |
#endif |
#endif |
Line 391
|
Line 397
|
#endif /* !defined(DOUBLY_INDIRECT) */ |
#endif /* !defined(DOUBLY_INDIRECT) */ |
|
|
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
|
#define IPTOS NEXT_INST |