| #ifdef DIRECT_THREADED |
#ifdef DIRECT_THREADED |
| #define NEXT1_P1 |
#define NEXT1_P1 |
| #define NEXT1_P2 ({goto *cfa;}) |
#define NEXT1_P2 ({goto *cfa;}) |
| |
# define DEF_CA |
| #else |
#else |
| #define NEXT1_P1 ({ca = *cfa;}) |
#define NEXT1_P1 ({ca = *cfa;}) |
| #define NEXT1_P2 ({goto *ca;}) |
#define NEXT1_P2 ({goto *ca;}) |
| |
# define DEF_CA Label ca; |
| #endif |
#endif |
| #define NEXT_P1 ({cfa = *ip++; NEXT1_P1;}) |
#define NEXT_P1 ({cfa = *ip++; NEXT1_P1;}) |
| |
|
| #define NEXT1 ({Label ca; NEXT1_P1; NEXT1_P2;}) |
#define NEXT1 ({DEF_CA NEXT1_P1; NEXT1_P2;}) |
| #define NEXT ({Label ca; NEXT_P1; NEXT1_P2;}) |
#define NEXT ({DEF_CA NEXT_P1; NEXT1_P2;}) |
| |
|
| #ifdef USE_TOS |
#ifdef USE_TOS |
| #define IF_TOS(x) x |
#define IF_TOS(x) x |
| #define FTOS (fp[0]) |
#define FTOS (fp[0]) |
| #endif |
#endif |
| |
|
| #define DODOES (symbols[3]) |
/* |
| |
#define CA_DODOES (symbols[DODOES]) |
| |
*/ |
| |
|
| int emitcounter; |
int emitcounter; |
| #define NULLC '\0' |
#define NULLC '\0' |
| { |
{ |
| Xt cfa; |
Xt cfa; |
| Address lp=NULL; |
Address lp=NULL; |
| |
Address up=NULL; |
| static Label symbols[]= { |
static Label symbols[]= { |
| &&docol, |
&&docol, |
| &&docon, |
&&docon, |
| &&dovar, |
&&dovar, |
| |
&&douser, |
| &&dodoes, |
&&dodoes, |
| |
&&docol, /* dummy for does handler address */ |
| #include "prim_labels.i" |
#include "prim_labels.i" |
| }; |
}; |
| #ifndef DIRECT_THREADED |
|
| /* Label ca; */ |
|
| #endif |
|
| IF_TOS(register Cell TOS;) |
IF_TOS(register Cell TOS;) |
| IF_FTOS(Float FTOS;) |
IF_FTOS(Float FTOS;) |
| #ifdef CPU_DEP |
#ifdef CPU_DEP |
| problems with code fields employing calls and delay slots |
problems with code fields employing calls and delay slots |
| */ |
*/ |
| { |
{ |
| Label ca; |
DEF_CA |
| Xt *current_ip = (Xt *)PFA1(cfa); |
Xt *current_ip = (Xt *)PFA1(cfa); |
| cfa = *current_ip; |
cfa = *current_ip; |
| NEXT1_P1; |
NEXT1_P1; |
| |
|
| /* !! user? */ |
/* !! user? */ |
| |
|
| |
douser: |
| |
#ifdef DEBUG |
| |
printf("user: %x\n",(Cell)PFA1(cfa)); |
| |
#endif |
| |
#ifdef USE_TOS |
| |
*sp-- = TOS; |
| |
TOS = up+*(Cell*)PFA1(cfa); |
| |
#else |
| |
*--sp = up+*(Cell*)PFA1(cfa); |
| |
#endif |
| |
NEXT; |
| |
|
| dodoes: |
dodoes: |
| /* this assumes the following structure: |
/* this assumes the following structure: |
| defining-word: |
defining-word: |
| |
|
| */ |
*/ |
| #ifdef DEBUG |
#ifdef DEBUG |
| printf("does: %x\n",(Cell)PFA(cfa)); |
printf("does: %x\n",(Cell)PFA(cfa)); fflush(stdout); |
| #endif |
#endif |
| *--rp = (Cell)ip; |
*--rp = (Cell)ip; |
| /* PFA1 might collide with DOES_CODE1 here, so we use PFA */ |
/* PFA1 might collide with DOES_CODE1 here, so we use PFA */ |