version 1.18, 2002/12/28 17:18:27
|
version 1.23, 2003/08/20 09:23:46
|
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 Free Software Foundation, Inc. |
Copyright (C) 1995, 1996,1997,1999,2003 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 92
|
Line 92
|
*/ |
*/ |
|
|
#ifdef DOUBLY_INDIRECT |
#ifdef DOUBLY_INDIRECT |
# define NEXT_P0 ({cfa=*ip;}) |
# ifndef DEBUG_DITC |
|
# define DEBUG_DITC 0 |
|
# endif |
|
/* define to 1 if you want to check consistency */ |
|
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# 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; |
# define NEXT_P1 ({\ |
# define NEXT_P1 ({\ |
if ((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 [%p .. %p]\n", cfa, ip, vm_prims+DOESJUMP, vm_prims+npriminfos); \ |
fprintf(stderr,"NEXT encountered prim %p at ip=%p\n", cfa, ip); \ |
ip++; ca=**cfa;}) |
ip++;}) |
# define NEXT_P2 ({goto *ca;}) |
# define NEXT_P2 ({ca=**cfa; goto *ca;}) |
# define EXEC(XT) ({DEF_CA cfa=(XT);\ |
# define EXEC(XT) ({DEF_CA cfa=(XT);\ |
if ((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;}) |
|
|
Line 144
|
Line 150
|
*/ |
*/ |
#define KILLS asm("":"=X"(cfa)); |
#define KILLS asm("":"=X"(cfa)); |
|
|
|
#ifndef THREADING_SCHEME |
|
#define THREADING_SCHEME 6 |
|
#endif |
|
|
#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 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# 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 160
|
Line 172
|
#if THREADING_SCHEME==2 |
#if THREADING_SCHEME==2 |
#warning direct threading scheme 2: autoinc, long latency, cfa dead |
#warning direct threading scheme 2: autoinc, long latency, cfa dead |
# define NEXT_P0 (ip++) |
# define NEXT_P0 (ip++) |
|
# define CFA cfa |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*(ip-1)) |
# define NEXT_INST (*(ip-1)) |
Line 174
|
Line 187
|
#if THREADING_SCHEME==3 |
#if THREADING_SCHEME==3 |
#warning direct threading scheme 3: autoinc, low latency, cfa live |
#warning direct threading scheme 3: autoinc, low latency, cfa live |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 187
|
Line 201
|
#if THREADING_SCHEME==4 |
#if THREADING_SCHEME==4 |
#warning direct threading scheme 4: autoinc, low latency, cfa dead |
#warning direct threading scheme 4: autoinc, low latency, cfa dead |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 199
|
Line 214
|
|
|
#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 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# 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 213
|
Line 230
|
#if THREADING_SCHEME==6 |
#if THREADING_SCHEME==6 |
#warning direct threading scheme 6: long latency, cfa dead |
#warning direct threading scheme 6: long latency, cfa dead |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 227
|
Line 245
|
#if THREADING_SCHEME==7 |
#if THREADING_SCHEME==7 |
#warning direct threading scheme 7: low latency, cfa live |
#warning direct threading scheme 7: low latency, cfa live |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 240
|
Line 259
|
#if THREADING_SCHEME==8 |
#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 IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*IP) |
# define NEXT_INST (*IP) |
Line 256
|
Line 276
|
this inst and the branch is 5 cycles on a PPC604; so we utilize this |
this inst and the branch is 5 cycles on a PPC604; so we utilize this |
to do some prefetching in between */ |
to do some prefetching in between */ |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP ip |
# define IP ip |
# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); next_cfa=*ip; NEXT_P0;}) |
# define NEXT_INST (next_cfa) |
# define NEXT_INST (next_cfa) |
Line 270
|
Line 291
|
#if THREADING_SCHEME==10 |
#if THREADING_SCHEME==10 |
#warning direct threading scheme 10: plain (no attempt at scheduling) |
#warning direct threading scheme 10: plain (no attempt at scheduling) |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 284
|
Line 306
|
#else |
#else |
/* indirect THREADED */ |
/* indirect THREADED */ |
|
|
|
#ifndef THREADING_SCHEME |
|
#define THREADING_SCHEME 6 |
|
#endif |
|
|
#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 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# 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 299
|
Line 327
|
|
|
#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 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# 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 314
|
Line 344
|
#if THREADING_SCHEME==3 |
#if THREADING_SCHEME==3 |
#warning indirect threading scheme 3: autoinc, low latency, cisc |
#warning indirect threading scheme 3: autoinc, low latency, cisc |
# define NEXT_P0 |
# define NEXT_P0 |
|
# define CFA cfa |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |
Line 326
|
Line 357
|
|
|
#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 ({cfa=*ip++;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip++;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip-1) |
# define IP (ip-1) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip++;}) |
# 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 340
|
Line 373
|
|
|
#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 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# 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 353
|
Line 388
|
|
|
#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 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# 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 366
|
Line 403
|
|
|
#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 ({cfa=*ip;}) |
# define NEXT_P0 ({cfa1=cfa; cfa=*ip;}) |
|
# define CFA cfa1 |
|
# define MORE_VARS Xt cfa1; |
# define IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); cfa=*ip;}) |
# 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 380
|
Line 419
|
#if THREADING_SCHEME==8 |
#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 IP (ip) |
# define IP (ip) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define SET_IP(p) ({ip=(p); NEXT_P0;}) |
# define NEXT_INST (*ip) |
# define NEXT_INST (*ip) |