--- gforth/engine/threaded.h 1998/12/08 22:03:07 1.2 +++ gforth/engine/threaded.h 1999/05/04 12:51:35 1.4 @@ -91,13 +91,13 @@ */ -#ifndef GETCFA -# define CFA_NEXT -#endif +/* CFA_NEXT: a more appropriate name would be CFA_LIVE, i.e., cfa is live after NEXT */ #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 +109,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 +127,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 +144,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 +158,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 +174,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 +188,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 +205,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 +219,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 +235,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 Label ca; +# define NEXT_P1 ({ca=next_cfa; cfa=next_cfa; ip++; next_cfa=*ip;}) +# define NEXT_P2 ({goto *ca;}) +# 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 +285,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 +300,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 +314,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 +329,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 +343,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 +357,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,35 +385,9 @@ # 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;})