version 1.4, 2002/08/20 07:59:02
|
version 1.6, 2003/03/09 15:17:11
|
Line 1
|
Line 1
|
/* vm interpreter wrapper |
/* vm interpreter wrapper |
|
|
Copyright (C) 2001 Free Software Foundation, Inc. |
Copyright (C) 2001,2002 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 40
|
Line 40
|
|
|
/* here you select the threading scheme; I have only set this up for |
/* here you select the threading scheme; I have only set this up for |
386 and generic, because I don't know what preprocessor macros to |
386 and generic, because I don't know what preprocessor macros to |
test for (Gforth uses config.guess instead). |
test for (Gforth uses config.guess instead). Anyway, it's probably |
Anyway, it's probably best to build them all and select the fastest |
best to build them all and select the fastest instead of hardwiring |
instead of hardwiring a specific scheme for an architecture. */ |
a specific scheme for an architecture. E.g., scheme 8 is fastest |
|
for Gforth "make bench" on a 486, whereas scheme 5 is fastest for |
|
"mini fib.mini" on an Athlon */ |
#ifndef THREADING_SCHEME |
#ifndef THREADING_SCHEME |
#ifdef i386 |
|
#define THREADING_SCHEME 8 |
|
#else |
|
#define THREADING_SCHEME 5 |
#define THREADING_SCHEME 5 |
#endif |
|
#endif /* defined(THREADING_SCHEME) */ |
#endif /* defined(THREADING_SCHEME) */ |
|
|
#ifdef __GNUC__ |
#ifdef __GNUC__ |
Line 61
|
Line 59
|
# 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 |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P2 ({goto *(cfa.inst);}) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==3 |
#if THREADING_SCHEME==3 |
Line 73
|
Line 71
|
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 ({cfa=*ip++;}) |
# define NEXT_P1 ({cfa=*ip++;}) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P2 ({goto *(cfa.inst);}) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==5 |
#if THREADING_SCHEME==5 |
/* direct threading scheme 5: early fetching (Alpha, MIPS) */ |
/* direct threading scheme 5: early fetching (Alpha, MIPS) */ |
# define CFA_NEXT |
# define CFA_NEXT |
# define NEXT_P0 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa=*ip;}) |
# define IP ((Cell *)ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(Inst *)(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(Inst *)(p); NEXT_P0;}) |
# define NEXT_INST ((Cell)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 |
# define DEF_CA |
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P2 ({goto *(cfa.inst);}) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==8 |
#if THREADING_SCHEME==8 |
Line 113
|
Line 111
|
# 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 |
# define DEF_CA |
# define NEXT_P1 ({cfa=next_cfa; ip++; next_cfa=*ip;}) |
# define NEXT_P1 ({cfa=next_cfa; ip++; next_cfa=*ip;}) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P2 ({goto *(cfa.inst);}) |
# define MORE_VARS Inst next_cfa; |
# define MORE_VARS Cell next_cfa; |
#endif |
#endif |
|
|
#if THREADING_SCHEME==10 |
#if THREADING_SCHEME==10 |
Line 126
|
Line 124
|
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({cfa=*ip++; goto *cfa;}) |
# define NEXT_P2 ({cfa=*ip++; goto *(cfa.inst);}) |
#endif |
#endif |
|
|
|
|
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
#define IPTOS ((Cell)(NEXT_INST)) |
#define IPTOS ((NEXT_INST)) |
|
|
#define INST_ADDR(name) (Label)&&I_##name |
#define INST_ADDR(name) (Label)&&I_##name |
#define LABEL(name) I_##name: |
#define LABEL(name) I_##name: |
Line 170 long engine(Cell *ip0, Cell *sp, char *f
|
Line 168 long engine(Cell *ip0, Cell *sp, char *f
|
{ |
{ |
/* VM registers (you may want to use gcc's "Explicit Reg Vars" here) */ |
/* VM registers (you may want to use gcc's "Explicit Reg Vars" here) */ |
Cell * ip; |
Cell * ip; |
Cell * cfa; |
Cell cfa; |
#ifdef USE_spTOS |
#ifdef USE_spTOS |
Cell spTOS; |
Cell spTOS; |
#else |
#else |