File:  [gforth] / gforth / Attic / threading.h
Revision 1.2: download - view: text, annotated - select for diffs
Tue Nov 7 18:07:02 1995 UTC (28 years, 4 months ago) by anton
Branches: MAIN
CVS tags: HEAD
added copyright headers
changes to loadfilename & co. to make savesystem transparent to
 assertions and ~~

    1: /* This file defines a number of threading schemes.
    2: 
    3:   Copyright (C) 1995 Free Software Foundation, Inc.
    4: 
    5:   This file is part of Gforth.
    6: 
    7:   Gforth is free software; you can redistribute it and/or
    8:   modify it under the terms of the GNU General Public License
    9:   as published by the Free Software Foundation; either version 2
   10:   of the License, or (at your option) any later version.
   11: 
   12:   This program is distributed in the hope that it will be useful,
   13:   but WITHOUT ANY WARRANTY; without even the implied warranty of
   14:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   15:   GNU General Public License for more details.
   16: 
   17:   You should have received a copy of the GNU General Public License
   18:   along with this program; if not, write to the Free Software
   19:   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   20: 
   21: 
   22:   To organize the former ifdef chaos, each path is separated
   23:   This gives a quite impressive number of paths, but you clearly
   24:   find things that go together.
   25: */
   26: 
   27: #ifndef GETCFA
   28: #  define CFA_NEXT
   29: #endif
   30: 
   31: #if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
   32:     && defined(LONG_LATENCY) && defined(CFA_NEXT)
   33: #warning scheme 1
   34: #  define NEXT_P0	({cfa=*ip++;})
   35: #  define IP		(ip-1)
   36: #  define NEXT_INST	(cfa)
   37: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
   38: #  define DEF_CA
   39: #  define NEXT_P1
   40: #  define NEXT_P2	({goto *cfa;})
   41: #  define EXEC(XT)	({cfa=(XT); goto *cfa;})
   42: #endif
   43: 
   44: #if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
   45:     && defined(LONG_LATENCY) && !defined(CFA_NEXT)
   46: #warning scheme 2
   47: #  define NEXT_P0	(ip++)
   48: #  define IP		(ip-1)
   49: #  define NEXT_INST	(*(ip-1))
   50: #  define INC_IP(const_inc)	({ ip+=(const_inc);})
   51: #  define DEF_CA
   52: #  define NEXT_P1
   53: #  define NEXT_P2	({goto **(ip-1);})
   54: #  define EXEC(XT)	({goto *(XT);})
   55: #endif
   56: 
   57: 
   58: #if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
   59:     && !defined(LONG_LATENCY) && defined(CFA_NEXT)
   60: #warning scheme 3
   61: #  define NEXT_P0
   62: #  define IP		(ip)
   63: #  define NEXT_INST	(*ip)
   64: #  define INC_IP(const_inc)	({ip+=(const_inc);})
   65: #  define DEF_CA
   66: #  define NEXT_P1	({cfa=*ip++;})
   67: #  define NEXT_P2	({goto *cfa;})
   68: #  define EXEC(XT)	({cfa=(XT); goto *cfa;})
   69: #endif
   70: 
   71: #if defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
   72:     && !defined(LONG_LATENCY) && !defined(CFA_NEXT)
   73: #warning scheme 4
   74: #  define NEXT_P0
   75: #  define IP		(ip)
   76: #  define NEXT_INST	(*ip)
   77: #  define INC_IP(const_inc)	({ ip+=(const_inc);})
   78: #  define DEF_CA
   79: #  define NEXT_P1
   80: #  define NEXT_P2	({goto **(ip++);})
   81: #  define EXEC(XT)	({goto *(XT);})
   82: #endif
   83: 
   84: /* without autoincrement */
   85: 
   86: #if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
   87:     && defined(LONG_LATENCY) && defined(CFA_NEXT)
   88: #warning scheme 5
   89: #  define NEXT_P0	({cfa=*ip;})
   90: #  define IP		(ip)
   91: #  define NEXT_INST	(cfa)
   92: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
   93: #  define DEF_CA
   94: #  define NEXT_P1	(ip++)
   95: #  define NEXT_P2	({goto *cfa;})
   96: #  define EXEC(XT)	({cfa=(XT); goto *cfa;})
   97: #endif
   98: 
   99: #if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  100:     && defined(LONG_LATENCY) && !defined(CFA_NEXT)
  101: #warning scheme 6
  102: #  define NEXT_P0
  103: #  define IP		(ip)
  104: #  define NEXT_INST	(*ip)
  105: #  define INC_IP(const_inc)	({ip+=(const_inc);})
  106: #  define DEF_CA
  107: #  define NEXT_P1	(ip++)
  108: #  define NEXT_P2	({goto **(ip-1);})
  109: #  define EXEC(XT)	({goto *(XT);})
  110: #endif
  111: 
  112: 
  113: #if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  114:     && !defined(LONG_LATENCY) && defined(CFA_NEXT)
  115: #warning scheme 7
  116: #  define NEXT_P0
  117: #  define IP		(ip)
  118: #  define NEXT_INST	(*ip)
  119: #  define INC_IP(const_inc)	({ip+=(const_inc);})
  120: #  define DEF_CA
  121: #  define NEXT_P1	({cfa=*ip++;})
  122: #  define NEXT_P2	({goto *cfa;})
  123: #  define EXEC(XT)	({cfa=(XT); goto *cfa;})
  124: #endif
  125: 
  126: #if defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  127:     && !defined(LONG_LATENCY) && !defined(CFA_NEXT)
  128: #warning scheme 8
  129: #  define NEXT_P0
  130: #  define IP		(ip)
  131: #  define NEXT_INST	(*IP)
  132: #  define INC_IP(const_inc)	({ ip+=(const_inc);})
  133: #  define DEF_CA
  134: #  define NEXT_P1	(ip++)
  135: #  define NEXT_P2	({goto **(ip-1);})
  136: #  define EXEC(XT)	({goto *(XT);})
  137: #endif
  138: 
  139: /* common settings for direct THREADED */
  140: 
  141: 
  142: /* indirect THREADED  */
  143: 
  144: #if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
  145:     && defined(LONG_LATENCY) && defined(CISC_NEXT)
  146: #  define NEXT_P0	({cfa=*ip++;})
  147: #  define IP		(ip-1)
  148: #  define NEXT_INST	(cfa)
  149: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  150: #  define DEF_CA
  151: #  define NEXT_P1
  152: #  define NEXT_P2	({goto **cfa;})
  153: #  define EXEC(XT)	({cfa=(XT); goto **cfa;})
  154: #endif
  155: 
  156: #if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
  157:     && defined(LONG_LATENCY) && !defined(CISC_NEXT)
  158: #  define NEXT_P0	({cfa=*ip++;})
  159: #  define IP		(ip-1)
  160: #  define NEXT_INST	(cfa)
  161: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  162: #  define DEF_CA	Label ca;
  163: #  define NEXT_P1	({ca=*cfa;})
  164: #  define NEXT_P2	({goto *ca;})
  165: #  define EXEC(XT)	({DEF_CA cfa=(XT); ca=*cfa; goto *ca;})
  166: #endif
  167: 
  168: 
  169: #if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
  170:     && !defined(LONG_LATENCY) && defined(CISC_NEXT)
  171: #  define NEXT_P0
  172: #  define IP		(ip)
  173: #  define NEXT_INST	(*ip)
  174: #  define INC_IP(const_inc)	({ip+=(const_inc);})
  175: #  define DEF_CA
  176: #  define NEXT_P1	({cfa=*ip++;})
  177: #  define NEXT_P2	({goto **cfa;})
  178: #  define EXEC(XT)	({cfa=(XT); goto **cfa;})
  179: #endif
  180: 
  181: #if !defined(DIRECT_THREADED) && defined(AUTO_INCREMENT)\
  182:     && !defined(LONG_LATENCY) && !defined(CISC_NEXT)
  183: #  define NEXT_P0	({cfa=*ip++;})
  184: #  define IP		(ip-1)
  185: #  define NEXT_INST	(cfa)
  186: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  187: #  define DEF_CA	Label ca;
  188: #  define NEXT_P1	({ca=*cfa;})
  189: #  define NEXT_P2	({goto *ca;})
  190: #  define EXEC(XT)	({DEF_CA cfa=(XT); ca=*cfa; goto *ca;})
  191: #endif
  192: 
  193: 
  194: /* without autoincrement */
  195: 
  196: #if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  197:     && defined(LONG_LATENCY) && defined(CISC_NEXT)
  198: #  define NEXT_P0	({cfa=*ip;})
  199: #  define IP		(ip)
  200: #  define NEXT_INST	(cfa)
  201: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  202: #  define DEF_CA
  203: #  define NEXT_P1	(ip++)
  204: #  define NEXT_P2	({goto **cfa;})
  205: #  define EXEC(XT)	({cfa=(XT); goto **cfa;})
  206: #endif
  207: 
  208: #if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  209:     && defined(LONG_LATENCY) && !defined(CISC_NEXT)
  210: #  define NEXT_P0	({cfa=*ip;})
  211: #  define IP		(ip)
  212: #  define NEXT_INST	(cfa)
  213: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  214: #  define DEF_CA	Label ca;
  215: #  define NEXT_P1	({ip++; ca=*cfa;})
  216: #  define NEXT_P2	({goto *ca;})
  217: #  define EXEC(XT)	({DEF_CA cfa=(XT); ca=*cfa; goto *ca;})
  218: #endif
  219: 
  220: 
  221: #if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  222:     && !defined(LONG_LATENCY) && defined(CISC_NEXT)
  223: #  define NEXT_P0
  224: #  define IP		(ip)
  225: #  define NEXT_INST	(*ip)
  226: #  define INC_IP(const_inc)	({ip+=(const_inc);})
  227: #  define DEF_CA
  228: #  define NEXT_P1	({cfa=*ip;})
  229: #  define NEXT_P2	({ip++; goto **cfa;})
  230: #  define EXEC(XT)	({cfa=(XT); goto **cfa;})
  231: #endif
  232: 
  233: #if !defined(DIRECT_THREADED) && !defined(AUTO_INCREMENT)\
  234:     && !defined(LONG_LATENCY) && !defined(CISC_NEXT)
  235: #  define NEXT_P0	({cfa=*ip;})
  236: #  define IP		(ip)
  237: #  define NEXT_INST	(cfa)
  238: #  define INC_IP(const_inc)	({cfa=IP[const_inc]; ip+=(const_inc);})
  239: #  define DEF_CA	Label ca;
  240: #  define NEXT_P1	({ip++; ca=*cfa;})
  241: #  define NEXT_P2	({goto *ca;})
  242: #  define EXEC(XT)	({DEF_CA cfa=(XT); ca=*cfa; goto *ca;})
  243: #endif
  244: 
  245: #define NEXT ({DEF_CA NEXT_P1; NEXT_P2;})
  246: 
  247: #if defined(CISC_NEXT) && !defined(LONG_LATENCY)
  248: # define NEXT1_P1
  249: # ifdef DIRECT_THREADED
  250: #  define NEXT1_P2 ({goto *cfa;})
  251: # else
  252: #  define NEXT1_P2 ({goto **cfa;})
  253: # endif /* DIRECT_THREADED */
  254: #else /* defined(CISC_NEXT) && !defined(LONG_LATENCY) */
  255: # ifdef DIRECT_THREADED
  256: #  define NEXT1_P1
  257: #  define NEXT1_P2 ({goto *cfa;})
  258: # else /* DIRECT_THREADED */
  259: #  define NEXT1_P1 ({ca = *cfa;})
  260: #  define NEXT1_P2 ({goto *ca;})
  261: # endif /* DIRECT_THREADED */
  262: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>