--- gforth/engine/threaded.h 1997/05/21 20:40:12 1.1 +++ gforth/engine/threaded.h 2000/12/24 15:54:18 1.9 @@ -1,6 +1,6 @@ /* This file defines a number of threading schemes. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995, 1996,1997,1999 Free Software Foundation, Inc. This file is part of Gforth. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License 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 @@ -91,13 +91,15 @@ */ -#ifndef GETCFA -# define CFA_NEXT -#endif +/* CFA_NEXT: if NEXT uses cfa, you have to #define CFA_NEXT, to get + * cfa declared in engine. + */ #ifdef DOUBLY_INDIRECT +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip;}) # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA Label ca; @@ -109,11 +111,16 @@ #else /* !defined(DOUBLY_INDIRECT) */ -#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && defined(CFA_NEXT) -#warning scheme 1 +#if defined(DIRECT_THREADED) + +/* note that the "cfa dead" versions only work if GETCFA exists and works */ + +#if THREADING_SCHEME==1 +#warning direct threading scheme 1: autoinc, long latency, cfa live +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip++;}) # define IP (ip-1) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA @@ -122,11 +129,14 @@ # define EXEC(XT) ({cfa=(XT); goto *cfa;}) #endif -#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && !defined(CFA_NEXT) -#warning scheme 2 +#if THREADING_SCHEME==2 +#warning direct threading scheme 2: autoinc, long latency, cfa dead +#ifndef GETCFA +#error GETCFA must be defined for cfa dead threading +#endif # define NEXT_P0 (ip++) # define IP (ip-1) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*(ip-1)) # define INC_IP(const_inc) ({ ip+=(const_inc);}) # define DEF_CA @@ -136,11 +146,12 @@ #endif -#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && defined(CFA_NEXT) -#warning scheme 3 +#if THREADING_SCHEME==3 +#warning direct threading scheme 3: autoinc, low latency, cfa live +# define CFA_NEXT # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ip+=(const_inc);}) # define DEF_CA @@ -149,11 +160,14 @@ # define EXEC(XT) ({cfa=(XT); goto *cfa;}) #endif -#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && !defined(CFA_NEXT) -#warning scheme 4 +#if THREADING_SCHEME==4 +#warning direct threading scheme 4: autoinc, low latency, cfa dead +#ifndef GETCFA +#error GETCFA must be defined for cfa dead threading +#endif # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ ip+=(const_inc);}) # define DEF_CA @@ -162,13 +176,12 @@ # define EXEC(XT) ({goto *(XT);}) #endif -/* without autoincrement */ - -#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && defined(CFA_NEXT) -#warning scheme 5 +#if THREADING_SCHEME==5 +#warning direct threading scheme 5: long latency, cfa live +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip;}) # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA @@ -177,11 +190,14 @@ # define EXEC(XT) ({cfa=(XT); goto *cfa;}) #endif -#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && !defined(CFA_NEXT) -#warning scheme 6 +#if THREADING_SCHEME==6 +#warning direct threading scheme 6: long latency, cfa dead +#ifndef GETCFA +#error GETCFA must be defined for cfa dead threading +#endif # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ip+=(const_inc);}) # define DEF_CA @@ -191,11 +207,12 @@ #endif -#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && defined(CFA_NEXT) -#warning scheme 7 +#if THREADING_SCHEME==7 +#warning direct threading scheme 7: low latency, cfa live +# define CFA_NEXT # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ip+=(const_inc);}) # define DEF_CA @@ -204,11 +221,14 @@ # define EXEC(XT) ({cfa=(XT); goto *cfa;}) #endif -#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && !defined(CFA_NEXT) -#warning scheme 8 +#if THREADING_SCHEME==8 +#warning direct threading scheme 8: cfa dead, i386 hack +#ifndef GETCFA +#error GETCFA must be defined for cfa dead threading +#endif # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*IP) # define INC_IP(const_inc) ({ ip+=(const_inc);}) # define DEF_CA @@ -217,15 +237,48 @@ # define EXEC(XT) ({goto *(XT);}) #endif -/* common settings for direct THREADED */ +#if THREADING_SCHEME==9 +#warning direct threading scheme 9: Power/PPC hack, long latency +/* Power uses a prepare-to-branch instruction, and the latency between + this inst and the branch is 5 cycles on a PPC604; so we utilize this + to do some prefetching in between */ +# define CFA_NEXT +# define NEXT_P0 +# define IP ip +# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) +# define NEXT_INST (next_cfa) +# define INC_IP(const_inc) ({next_cfa=IP[const_inc]; ip+=(const_inc);}) +# define DEF_CA +# define NEXT_P1 ({cfa=next_cfa; ip++; next_cfa=*ip;}) +# define NEXT_P2 ({goto *cfa;}) +# define EXEC(XT) ({cfa=(XT); goto *cfa;}) +# define MORE_VARS Xt next_cfa; +#endif +#if THREADING_SCHEME==10 +#warning direct threading scheme 10: plain (no attempt at scheduling) +# define CFA_NEXT +# define NEXT_P0 +# define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) +# define NEXT_INST (*ip) +# define INC_IP(const_inc) ({ip+=(const_inc);}) +# define DEF_CA +# define NEXT_P1 +# define NEXT_P2 ({cfa=*ip++; goto *cfa;}) +# define EXEC(XT) ({cfa=(XT); goto *cfa;}) +#endif +/* direct threaded */ +#else /* indirect THREADED */ -#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && defined(CISC_NEXT) +#if THREADING_SCHEME==1 +#warning indirect threading scheme 1: autoinc, long latency, cisc +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip++;}) # define IP (ip-1) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA @@ -234,10 +287,12 @@ # define EXEC(XT) ({cfa=(XT); goto **cfa;}) #endif -#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && !defined(CISC_NEXT) +#if THREADING_SCHEME==2 +#warning indirect threading scheme 2: autoinc, long latency +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip++;}) # define IP (ip-1) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA Label ca; @@ -247,10 +302,12 @@ #endif -#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && defined(CISC_NEXT) +#if THREADING_SCHEME==3 +#warning indirect threading scheme 3: autoinc, low latency, cisc +# define CFA_NEXT # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ip+=(const_inc);}) # define DEF_CA @@ -259,10 +316,12 @@ # define EXEC(XT) ({cfa=(XT); goto **cfa;}) #endif -#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && !defined(CISC_NEXT) +#if THREADING_SCHEME==4 +#warning indirect threading scheme 4: autoinc, low latency +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip++;}) # define IP (ip-1) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA Label ca; @@ -272,12 +331,12 @@ #endif -/* without autoincrement */ - -#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && defined(CISC_NEXT) +#if THREADING_SCHEME==5 +#warning indirect threading scheme 5: long latency, cisc +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip;}) # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA @@ -286,10 +345,12 @@ # define EXEC(XT) ({cfa=(XT); goto **cfa;}) #endif -#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && defined(LONG_LATENCY) && !defined(CISC_NEXT) +#if THREADING_SCHEME==6 +#warning indirect threading scheme 6: long latency +# define CFA_NEXT # define NEXT_P0 ({cfa=*ip;}) # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (cfa) # define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) # define DEF_CA Label ca; @@ -298,11 +359,26 @@ # define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) #endif +#if THREADING_SCHEME==7 +#warning indirect threading scheme 7: low latency +# define CFA_NEXT +# define NEXT_P0 ({cfa=*ip;}) +# define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) +# define NEXT_INST (cfa) +# define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) +# define DEF_CA Label ca; +# define NEXT_P1 ({ip++; ca=*cfa;}) +# define NEXT_P2 ({goto *ca;}) +# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) +#endif -#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && defined(CISC_NEXT) +#if THREADING_SCHEME==8 +#warning indirect threading scheme 8: low latency,cisc +# define CFA_NEXT # define NEXT_P0 # define IP (ip) +# define SET_IP(p) ({ip=(p); NEXT_P0;}) # define NEXT_INST (*ip) # define INC_IP(const_inc) ({ip+=(const_inc);}) # define DEF_CA @@ -311,36 +387,10 @@ # define EXEC(XT) ({cfa=(XT); goto **cfa;}) #endif -#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ - && !defined(LONG_LATENCY) && !defined(CISC_NEXT) -# define NEXT_P0 ({cfa=*ip;}) -# define IP (ip) -# define NEXT_INST (cfa) -# define INC_IP(const_inc) ({cfa=IP[const_inc]; ip+=(const_inc);}) -# define DEF_CA Label ca; -# define NEXT_P1 ({ip++; ca=*cfa;}) -# define NEXT_P2 ({goto *ca;}) -# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) +/* indirect threaded */ #endif -#if defined(CISC_NEXT) && !defined(LONG_LATENCY) -# define NEXT1_P1 -# ifdef DIRECT_THREADED -# define NEXT1_P2 ({goto *cfa;}) -# else -# define NEXT1_P2 ({goto **cfa;}) -# endif /* DIRECT_THREADED */ -#else /* !defined(CISC_NEXT) || defined(LONG_LATENCY) */ -# ifdef DIRECT_THREADED -# define NEXT1_P1 -# define NEXT1_P2 ({goto *cfa;}) -# else /* !DIRECT_THREADED */ -# define NEXT1_P1 ({ca = *cfa;}) -# define NEXT1_P2 ({goto *ca;}) -# endif /* !DIRECT_THREADED */ -#endif /* !defined(CISC_NEXT) || defined(LONG_LATENCY) */ - #endif /* !defined(DOUBLY_INDIRECT) */ #define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) - +#define ipTOS NEXT_INST