version 1.33, 2005/01/26 21:24:16
|
version 1.35, 2005/12/31 15:46: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,2004 Free Software Foundation, Inc. |
Copyright (C) 1995, 1996,1997,1999,2003,2004,2005 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 174 before_goto: goto *real_ca; after_goto:
|
Line 174 before_goto: goto *real_ca; after_goto:
|
*/ |
*/ |
#define KILLS asm("":"=X"(cfa)); |
#define KILLS asm("":"=X"(cfa)); |
|
|
#ifndef THREADING_SCHEME |
|
#define THREADING_SCHEME 7 |
|
#endif |
|
|
|
#if THREADING_SCHEME==1 |
|
#warning direct threading scheme 1: autoinc, long latency, cfa live |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip-1) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==2 |
|
#warning direct threading scheme 2: autoinc, long latency, cfa dead |
|
# define NEXT_P0 (ip++) |
|
# define CFA cfa |
|
# define IP (ip-1) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*(ip-1)) |
|
# define INC_IP(const_inc) do { ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
|
|
#if THREADING_SCHEME==3 |
|
#warning direct threading scheme 3: autoinc, low latency, cfa live |
|
# define NEXT_P0 |
|
# define CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 do {cfa=*ip++;} while(0) |
|
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==4 |
|
#warning direct threading scheme 4: autoinc, low latency, cfa dead |
|
# define NEXT_P0 |
|
# define CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do { ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {KILLS GOTO(*(ip++));} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==5 |
|
#warning direct threading scheme 5: long latency, cfa live |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 (ip++) |
|
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==6 |
|
#warning direct threading scheme 6: long latency, cfa dead |
|
# define NEXT_P0 |
|
# define CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 (ip++) |
|
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
|
|
#if THREADING_SCHEME==7 |
|
#warning direct threading scheme 7: low latency, cfa live |
|
# define NEXT_P0 |
|
# define CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 do {cfa=*ip++;} while(0) |
|
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==8 |
|
#warning direct threading scheme 8: cfa dead, i386 hack |
#warning direct threading scheme 8: cfa dead, i386 hack |
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
Line 292 before_goto: goto *real_ca; after_goto:
|
Line 185 before_goto: goto *real_ca; after_goto:
|
# define NEXT_P1 (ip++) |
# define NEXT_P1 (ip++) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
# define NEXT_P1_5 do {KILLS GOTO(*(ip-1));} while(0) |
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
#endif |
|
|
|
#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 CFA cfa |
|
# define IP ip |
|
# define SET_IP(p) do {ip=(p); next_cfa=*ip; NEXT_P0;} while(0) |
|
# define NEXT_INST (next_cfa) |
|
# define INC_IP(const_inc) do {next_cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 do {cfa=next_cfa; ip++; next_cfa=*ip;} while(0) |
|
# define NEXT_P1_5 do {GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *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 CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {cfa=*ip++; GOTO(cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
/* direct threaded */ |
/* direct threaded */ |
#else |
#else |
/* indirect THREADED */ |
/* indirect THREADED */ |
|
|
#ifndef THREADING_SCHEME |
|
#define THREADING_SCHEME 6 |
|
#endif |
|
|
|
#if THREADING_SCHEME==1 |
|
#warning indirect threading scheme 1: autoinc, long latency, cisc |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip-1) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {GOTO(*cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==2 |
|
#warning indirect threading scheme 2: autoinc, long latency |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip-1) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA Label ca; |
|
# define NEXT_P1 do {ca=*cfa;} while(0) |
|
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
|
# define EXEC1(XT) ({DEF_CA cfa=(XT); ca=*cfa; ca;}) |
|
#endif |
|
|
|
|
|
#if THREADING_SCHEME==3 |
|
#warning indirect threading scheme 3: autoinc, low latency, cisc |
|
# define NEXT_P0 |
|
# define CFA cfa |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); NEXT_P0;} while(0) |
|
# define NEXT_INST (*ip) |
|
# define INC_IP(const_inc) do {ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 |
|
# define NEXT_P1_5 do {cfa=*ip++; GOTO(*cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==4 |
|
#warning indirect threading scheme 4: autoinc, low latency |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip++;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip-1) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip++;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA Label ca; |
|
# define NEXT_P1 do {ca=*cfa;} while(0) |
|
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
|
# define EXEC1(XT) ({DEF_CA cfa=(XT); ca=*cfa; ca;}) |
|
#endif |
|
|
|
|
|
#if THREADING_SCHEME==5 |
|
#warning indirect threading scheme 5: long latency, cisc |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA |
|
# define NEXT_P1 (ip++) |
|
# define NEXT_P1_5 do {GOTO(*cfa);} while(0) |
|
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==6 |
|
#warning indirect threading scheme 6: long latency |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA Label ca; |
|
# define NEXT_P1 do {ip++; ca=*cfa;} while(0) |
|
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
|
# define EXEC1(XT) ({DEF_CA cfa=(XT); ca=*cfa; ca;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==7 |
|
#warning indirect threading scheme 7: low latency |
|
# define NEXT_P0 do {cfa1=cfa; cfa=*ip;} while(0) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
|
# define IP (ip) |
|
# define SET_IP(p) do {ip=(p); cfa=*ip;} while(0) |
|
# define NEXT_INST (cfa) |
|
# define INC_IP(const_inc) do {cfa=IP[const_inc]; ip+=(const_inc);} while(0) |
|
# define DEF_CA Label ca; |
|
# define NEXT_P1 do {ip++; ca=*cfa;} while(0) |
|
# define NEXT_P1_5 do {GOTO(ca);} while(0) |
|
# define EXEC1(XT) ({DEF_CA cfa=(XT); ca=*cfa; ca;}) |
|
#endif |
|
|
|
#if THREADING_SCHEME==8 |
|
#warning indirect threading scheme 8: low latency,cisc |
#warning indirect threading scheme 8: low latency,cisc |
# define NEXT_P0 |
# define NEXT_P0 |
# define CFA cfa |
# define CFA cfa |
Line 452 before_goto: goto *real_ca; after_goto:
|
Line 201 before_goto: goto *real_ca; after_goto:
|
# define NEXT_P1 |
# define NEXT_P1 |
# define NEXT_P1_5 do {cfa=*ip++; GOTO(*cfa);} while(0) |
# define NEXT_P1_5 do {cfa=*ip++; GOTO(*cfa);} while(0) |
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
# define EXEC1(XT) ({cfa=(XT); *cfa;}) |
#endif |
|
|
|
/* indirect threaded */ |
/* indirect threaded */ |
#endif |
#endif |