version 1.24, 2003/08/27 12:13:49
|
version 1.29, 2005/01/23 09:55:13
|
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,1999,2003 Free Software Foundation, Inc. |
Copyright (C) 1995, 1996,1997,1999,2003,2004 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 91
|
Line 91
|
|
|
*/ |
*/ |
|
|
|
#ifdef GCC_PR15242_WORKAROUND |
|
#define DO_GOTO goto before_goto |
|
#else |
|
#define DO_GOTO goto *real_ca |
|
#endif |
|
|
|
#define GOTO(target) do {(real_ca=(target));} while(0) |
|
#define NEXT_P2 do {NEXT_P1_5; DO_GOTO;} while(0) |
|
#define EXEC(XT) do { EXEC1(XT); DO_GOTO;} while (0) |
|
#define NEXT do {DEF_CA NEXT_P1; NEXT_P2;} while(0) |
|
#define IPTOS NEXT_INST |
|
|
|
|
#ifdef DOUBLY_INDIRECT |
#ifdef DOUBLY_INDIRECT |
# ifndef DEBUG_DITC |
# ifndef DEBUG_DITC |
# define DEBUG_DITC 0 |
# define DEBUG_DITC 0 |
# endif |
# endif |
/* define to 1 if you want to check consistency */ |
/* define to 1 if you want to check consistency */ |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({\ |
# define NEXT_P1 do {\ |
if (DEBUG_DITC && (cfa<=vm_prims+DOESJUMP || cfa>=vm_prims+npriminfos)) \ |
if (DEBUG_DITC && (cfa<=vm_prims+DOESJUMP || cfa>=vm_prims+npriminfos)) \ |
fprintf(stderr,"NEXT encountered prim %p at ip=%p\n", cfa, ip); \ |
fprintf(stderr,"NEXT encountered prim %p at ip=%p\n", cfa, ip); \ |
ip++;}) |
ip++;} while(0) |
# define NEXT_P2 ({ca=**cfa; goto *ca;}) |
# define NEXT_P1_5 do {ca=**cfa; GOTO(ca);} while(0) |
# define EXEC(XT) ({DEF_CA cfa=(XT);\ |
# define EXEC1(XT) do {DEF_CA cfa=(XT);\ |
if (DEBUG_DITC && (cfa>vm_prims+DOESJUMP && cfa<vm_prims+npriminfos)) \ |
if (DEBUG_DITC && (cfa>vm_prims+DOESJUMP && cfa<vm_prims+npriminfos)) \ |
fprintf(stderr,"EXEC encountered xt %p at ip=%p, vm_prims=%p, xts=%p\n", cfa, ip, vm_prims, xts); \ |
fprintf(stderr,"EXEC encountered xt %p at ip=%p, vm_prims=%p, xts=%p\n", cfa, ip, vm_prims, xts); \ |
ca=**cfa; goto *ca;}) |
ca=**cfa; GOTO(ca);} while(0) |
|
|
#elif defined(NO_IP) |
#elif defined(NO_IP) |
|
|
#define NEXT_P0 |
#define NEXT_P0 |
|
# define CFA cfa |
#define SET_IP(target) assert(0) |
#define SET_IP(target) assert(0) |
#define INC_IP(n) ((void)0) |
#define INC_IP(n) ((void)0) |
#define DEF_CA |
#define DEF_CA |
#define NEXT_P1 |
#define NEXT_P1 |
#define NEXT_P2 ({goto *next_code;}) |
#define NEXT_P1_5 do {goto *next_code;} while(0) |
/* set next_code to the return address before performing EXEC */ |
/* set next_code to the return address before performing EXEC */ |
#define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
#define EXEC1(XT) do {cfa=(XT); goto **cfa;} while(0) |
|
|
#else /* !defined(DOUBLY_INDIRECT) && !defined(NO_IP) */ |
#else /* !defined(DOUBLY_INDIRECT) && !defined(NO_IP) */ |
|
|
Line 156
|
Line 170
|
|
|
#if THREADING_SCHEME==1 |
#if THREADING_SCHEME==1 |
#warning direct threading scheme 1: autoinc, long latency, cfa live |
#warning direct threading scheme 1: autoinc, long latency, cfa live |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==2 |
#if THREADING_SCHEME==2 |
Line 174
|
Line 188
|
# define NEXT_P0 (ip++) |
# define NEXT_P0 (ip++) |
# define CFA cfa |
# define CFA cfa |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*(ip-1)) |
# define NEXT_INST (*(ip-1)) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) do { ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({KILLS goto **(ip-1);}) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
|
|
Line 189
|
Line 203
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 ({cfa=*ip++;}) |
# define NEXT_P1 do {cfa=*ip++;} while(0) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==4 |
#if THREADING_SCHEME==4 |
Line 203
|
Line 217
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) do { ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({KILLS goto **(ip++);}) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip++));} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==5 |
#if THREADING_SCHEME==5 |
#warning direct threading scheme 5: long latency, cfa live |
#warning direct threading scheme 5: long latency, cfa live |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==6 |
#if THREADING_SCHEME==6 |
Line 232
|
Line 246
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P2 ({KILLS goto **(ip-1);}) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
|
|
Line 247
|
Line 261
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 ({cfa=*ip++;}) |
# define NEXT_P1 do {cfa=*ip++;} while(0) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==8 |
#if THREADING_SCHEME==8 |
Line 261
|
Line 275
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*IP) |
# define NEXT_INST (*IP) |
# define INC_IP(const_inc) ({ ip+=(const_inc);}) |
# define INC_IP(const_inc) do { ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P2 ({KILLS goto **(ip-1);}) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==9 |
#if THREADING_SCHEME==9 |
Line 278
|
Line 292
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP ip |
# define IP ip |
# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); next_cfa=*ip; NEXT_P0;} while(0) |
# 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) do {next_cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 ({cfa=next_cfa; ip++; next_cfa=*ip;}) |
# define NEXT_P1 do {cfa=next_cfa; ip++; next_cfa=*ip;} while(0) |
# define NEXT_P2 ({goto *cfa;}) |
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
# define MORE_VARS Xt next_cfa; |
# define MORE_VARS Xt next_cfa; |
#endif |
#endif |
|
|
Line 293
|
Line 307
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({cfa=*ip++; goto *cfa;}) |
# define NEXT_P1_5 do {cfa=*ip++; GOTO(cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
/* direct threaded */ |
/* direct threaded */ |
Line 312
|
Line 326
|
|
|
#if THREADING_SCHEME==1 |
#if THREADING_SCHEME==1 |
#warning indirect threading scheme 1: autoinc, long latency, cisc |
#warning indirect threading scheme 1: autoinc, long latency, cisc |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({goto **cfa;}) |
# define NEXT_P1_5 do {GOTO(*cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==2 |
#if THREADING_SCHEME==2 |
#warning indirect threading scheme 2: autoinc, long latency |
#warning indirect threading scheme 2: autoinc, long latency |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({ca=*cfa;}) |
# define NEXT_P1 do {ca=*cfa;} while(0) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
# define EXEC1(XT) do {DEF_CA cfa=(XT); ca=*cfa; GOTO(ca);} while(0) |
#endif |
#endif |
|
|
|
|
Line 346
|
Line 360
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({cfa=*ip++; goto **cfa;}) |
# define NEXT_P1_5 do {cfa=*ip++; GOTO(*cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==4 |
#if THREADING_SCHEME==4 |
#warning indirect threading scheme 4: autoinc, low latency |
#warning indirect threading scheme 4: autoinc, low latency |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({ca=*cfa;}) |
# define NEXT_P1 do {ca=*cfa;} while(0) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
# define EXEC1(XT) do {DEF_CA cfa=(XT); ca=*cfa; GOTO(ca);} while(0) |
#endif |
#endif |
|
|
|
|
#if THREADING_SCHEME==5 |
#if THREADING_SCHEME==5 |
#warning indirect threading scheme 5: long latency, cisc |
#warning indirect threading scheme 5: long latency, cisc |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P2 ({goto **cfa;}) |
# define NEXT_P1_5 do {GOTO(*cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==6 |
#if THREADING_SCHEME==6 |
#warning indirect threading scheme 6: long latency |
#warning indirect threading scheme 6: long latency |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({ip++; ca=*cfa;}) |
# define NEXT_P1 do {ip++; ca=*cfa;} while(0) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
# define EXEC1(XT) do {DEF_CA cfa=(XT); ca=*cfa; GOTO(ca);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==7 |
#if THREADING_SCHEME==7 |
#warning indirect threading scheme 7: low latency |
#warning indirect threading scheme 7: low latency |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
# define CFA cfa1 |
# define CFA cfa1 |
# define MORE_VARS Xt cfa1; |
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
# 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) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
# define DEF_CA Label ca; |
# define DEF_CA Label ca; |
# define NEXT_P1 ({ip++; ca=*cfa;}) |
# define NEXT_P1 do {ip++; ca=*cfa;} while(0) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
# define EXEC(XT) ({DEF_CA cfa=(XT); ca=*cfa; goto *ca;}) |
# define EXEC1(XT) do {DEF_CA cfa=(XT); ca=*cfa; GOTO(ca);} while(0) |
#endif |
#endif |
|
|
#if THREADING_SCHEME==8 |
#if THREADING_SCHEME==8 |
Line 421
|
Line 435
|
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
# define INC_IP(const_inc) ({ip+=(const_inc);}) |
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
# define DEF_CA |
# define DEF_CA |
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P2 ({cfa=*ip++; goto **cfa;}) |
# define NEXT_P1_5 do {cfa=*ip++; GOTO(*cfa);} while(0) |
# define EXEC(XT) ({cfa=(XT); goto **cfa;}) |
# define EXEC1(XT) do {cfa=(XT); GOTO(*cfa);} while(0) |
#endif |
#endif |
|
|
/* indirect threaded */ |
/* indirect threaded */ |
Line 435
|
Line 449
|
|
|
#endif /* !defined(DOUBLY_INDIRECT) && !defined(NO_IP) */ |
#endif /* !defined(DOUBLY_INDIRECT) && !defined(NO_IP) */ |
|
|
#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;}) |
|
#define IPTOS NEXT_INST |
|