version 1.2, 1998/12/08 22:03:07
|
version 1.3, 1999/02/06 22:28:25
|
Line 93
|
Line 93
|
|
|
#ifndef GETCFA |
#ifndef GETCFA |
# define CFA_NEXT |
# define CFA_NEXT |
|
/* a more appropriate name would be CFA_LIVE, i.e., cfa is live after NEXT */ |
#endif |
#endif |
|
|
#ifdef DOUBLY_INDIRECT |
#ifdef DOUBLY_INDIRECT |
# define NEXT_P0 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa=*ip;}) |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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; |
Line 109
|
Line 111
|
|
|
#else /* !defined(DOUBLY_INDIRECT) */ |
#else /* !defined(DOUBLY_INDIRECT) */ |
|
|
#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if defined(DIRECT_THREADED) |
&& defined(LONG_LATENCY) && defined(CFA_NEXT) |
|
#warning scheme 1 |
/* 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 NEXT_P0 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa=*ip++;}) |
# define IP (ip-1) |
# define IP (ip-1) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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 |
# define DEF_CA |
Line 122
|
Line 128
|
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
#endif |
#endif |
|
|
#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==2 |
&& defined(LONG_LATENCY) && !defined(CFA_NEXT) |
#warning direct threading scheme 2: autoinc, long latency, cfa dead |
#warning scheme 2 |
|
# define NEXT_P0 (ip++) |
# define NEXT_P0 (ip++) |
# define IP (ip-1) |
# define IP (ip-1) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*(ip-1)) |
# define NEXT_INST (*(ip-1)) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 136
|
Line 142
|
#endif |
#endif |
|
|
|
|
#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==3 |
&& !defined(LONG_LATENCY) && defined(CFA_NEXT) |
#warning direct threading scheme 3: autoinc, low latency, cfa live |
#warning scheme 3 |
|
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 149
|
Line 155
|
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
#endif |
#endif |
|
|
#if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==4 |
&& !defined(LONG_LATENCY) && !defined(CFA_NEXT) |
#warning direct threading scheme 4: autoinc, low latency, cfa dead |
#warning scheme 4 |
|
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 162
|
Line 168
|
# define EXEC(XT) ({goto *(XT);}) |
# define EXEC(XT) ({goto *(XT);}) |
#endif |
#endif |
|
|
/* without autoincrement */ |
#if THREADING_SCHEME==5 |
|
#warning direct threading scheme 5: long latency, cfa live |
#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
|
&& defined(LONG_LATENCY) && defined(CFA_NEXT) |
|
#warning scheme 5 |
|
# define NEXT_P0 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa=*ip;}) |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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 |
# define DEF_CA |
Line 177
|
Line 181
|
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
#endif |
#endif |
|
|
#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==6 |
&& defined(LONG_LATENCY) && !defined(CFA_NEXT) |
#warning direct threading scheme 6: long latency, cfa dead |
#warning scheme 6 |
|
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 191
|
Line 195
|
#endif |
#endif |
|
|
|
|
#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==7 |
&& !defined(LONG_LATENCY) && defined(CFA_NEXT) |
#warning direct threading scheme 7: low latency, cfa live |
#warning scheme 7 |
|
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 204
|
Line 208
|
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto *cfa;}) |
#endif |
#endif |
|
|
#if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==8 |
&& !defined(LONG_LATENCY) && !defined(CFA_NEXT) |
#warning direct threading scheme 8: cfa dead, i386 hack |
#warning scheme 8 |
|
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*IP) |
# define NEXT_INST (*IP) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 217
|
Line 221
|
# define EXEC(XT) ({goto *(XT);}) |
# define EXEC(XT) ({goto *(XT);}) |
#endif |
#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 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 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 */ |
/* indirect THREADED */ |
|
|
#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==1 |
&& defined(LONG_LATENCY) && defined(CISC_NEXT) |
#warning indirect threading scheme 1: autoinc, long latency, cisc |
# define NEXT_P0 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa=*ip++;}) |
# define IP (ip-1) |
# define IP (ip-1) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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 |
# define DEF_CA |
Line 234
|
Line 268
|
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
#endif |
#endif |
|
|
#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==2 |
&& defined(LONG_LATENCY) && !defined(CISC_NEXT) |
#warning indirect threading scheme 2: autoinc, long latency |
# define NEXT_P0 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa=*ip++;}) |
# define IP (ip-1) |
# define IP (ip-1) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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; |
Line 247
|
Line 282
|
#endif |
#endif |
|
|
|
|
#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==3 |
&& !defined(LONG_LATENCY) && defined(CISC_NEXT) |
#warning indirect threading scheme 3: autoinc, low latency, cisc |
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 259
|
Line 295
|
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
#endif |
#endif |
|
|
#if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==4 |
&& !defined(LONG_LATENCY) && !defined(CISC_NEXT) |
#warning indirect threading scheme 4: autoinc, low latency |
# define NEXT_P0 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa=*ip++;}) |
# define IP (ip-1) |
# define IP (ip-1) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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; |
Line 272
|
Line 309
|
#endif |
#endif |
|
|
|
|
/* without autoincrement */ |
#if THREADING_SCHEME==5 |
|
#warning indirect threading scheme 5: long latency, cisc |
#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
|
&& defined(LONG_LATENCY) && defined(CISC_NEXT) |
|
# define NEXT_P0 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa=*ip;}) |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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 |
# define DEF_CA |
Line 286
|
Line 322
|
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
#endif |
#endif |
|
|
#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
#if THREADING_SCHEME==6 |
&& defined(LONG_LATENCY) && !defined(CISC_NEXT) |
#warning indirect threading scheme 6: long latency |
# define NEXT_P0 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa=*ip;}) |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# 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; |
Line 298
|
Line 335
|
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
#endif |
#endif |
|
|
|
#if THREADING_SCHEME==7 |
|
#warning indirect threading scheme 7: low latency |
|
# 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)\ |
#if THREADING_SCHEME==8 |
&& !defined(LONG_LATENCY) && defined(CISC_NEXT) |
#warning indirect threading scheme 8: low latency,cisc |
# define NEXT_P0 |
# define NEXT_P0 |
# define IP (ip) |
# define IP (ip) |
|
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define DEF_CA |
# define DEF_CA |
Line 311
|
Line 361
|
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
#endif |
#endif |
|
|
#if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\ |
/* indirect threaded */ |
&& !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;}) |
|
#endif |
#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) */ |
#endif /* !defined(DOUBLY_INDIRECT) */ |
|
|
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |