version 1.64, 2003/08/15 14:07:04
|
version 1.65, 2003/08/20 09:23:46
|
Line 260 Label *engine(Xt *ip0, Cell *sp0, Cell *
|
Line 260 Label *engine(Xt *ip0, Cell *sp0, Cell *
|
static Label symbols[]= { |
static Label symbols[]= { |
#define MAX_SYMBOLS (sizeof(symbols)/sizeof(symbols[0])) |
#define MAX_SYMBOLS (sizeof(symbols)/sizeof(symbols[0])) |
#endif /* !defined(DOUBLY_INDIRECT) */ |
#endif /* !defined(DOUBLY_INDIRECT) */ |
(Label)&&docol, |
|
(Label)&&docon, |
|
(Label)&&dovar, |
|
(Label)&&douser, |
|
(Label)&&dodefer, |
|
(Label)&&dofield, |
|
(Label)&&dodoes, |
|
/* the following entry is normally unused; |
|
it is there because its index indicates a does-handler */ |
|
CPU_DEP1, |
|
#define INST_ADDR(name) ((Label)&&I_##name) |
#define INST_ADDR(name) ((Label)&&I_##name) |
#include "prim_lab.i" |
#include "prim_lab.i" |
#undef INST_ADDR |
#undef INST_ADDR |
(Label)&&after_last, |
|
(Label)0, |
(Label)0, |
#define INST_ADDR(name) ((Label)&&K_##name) |
#define INST_ADDR(name) ((Label)&&K_##name) |
#include "prim_lab.i" |
#include "prim_lab.i" |
Line 331 Label *engine(Xt *ip0, Cell *sp0, Cell *
|
Line 320 Label *engine(Xt *ip0, Cell *sp0, Cell *
|
#ifdef CPU_DEP3 |
#ifdef CPU_DEP3 |
CPU_DEP3 |
CPU_DEP3 |
#endif |
#endif |
|
|
docol: |
|
{ |
|
#ifdef NO_IP |
|
*--rp = next_code; |
|
goto **(Label *)PFA1(cfa); |
|
#else |
|
#ifdef DEBUG |
|
{ |
|
CFA_TO_NAME(cfa); |
|
fprintf(stderr,"%08lx: col: %08lx %.*s\n",(Cell)ip,(Cell)PFA1(cfa), |
|
len,name); |
|
} |
|
#endif |
|
#ifdef CISC_NEXT |
|
/* this is the simple version */ |
|
*--rp = (Cell)ip; |
|
SET_IP((Xt *)PFA1(cfa)); |
|
SUPER_END; |
|
NEXT; |
|
#else |
|
/* this one is important, so we help the compiler optimizing */ |
|
{ |
|
DEF_CA |
|
rp[-1] = (Cell)ip; |
|
SET_IP((Xt *)PFA1(cfa)); |
|
SUPER_END; |
|
NEXT_P1; |
|
rp--; |
|
NEXT_P2; |
|
} |
|
#endif |
|
#endif |
|
} |
|
|
|
docon: |
|
{ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx: con: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); |
|
#endif |
|
#ifdef USE_TOS |
|
*sp-- = spTOS; |
|
spTOS = *(Cell *)PFA1(cfa); |
|
#else |
|
*--sp = *(Cell *)PFA1(cfa); |
|
#endif |
|
} |
|
#ifdef NO_IP |
|
goto *next_code; |
|
#else |
|
NEXT_P0; |
|
NEXT; |
|
#endif |
|
|
|
dovar: |
|
{ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx: var: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); |
|
#endif |
|
#ifdef USE_TOS |
|
*sp-- = spTOS; |
|
spTOS = (Cell)PFA1(cfa); |
|
#else |
|
*--sp = (Cell)PFA1(cfa); |
|
#endif |
|
} |
|
#ifdef NO_IP |
|
goto *next_code; |
|
#else |
|
NEXT_P0; |
|
NEXT; |
|
#endif |
|
|
|
douser: |
|
{ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx: user: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); |
|
#endif |
|
#ifdef USE_TOS |
|
*sp-- = spTOS; |
|
spTOS = (Cell)(up+*(Cell*)PFA1(cfa)); |
|
#else |
|
*--sp = (Cell)(up+*(Cell*)PFA1(cfa)); |
|
#endif |
|
} |
|
#ifdef NO_IP |
|
goto *next_code; |
|
#else |
|
NEXT_P0; |
|
NEXT; |
|
#endif |
|
|
|
dodefer: |
|
{ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx: defer: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); |
|
#endif |
|
SUPER_END; |
|
EXEC(*(Xt *)PFA1(cfa)); |
|
} |
|
|
|
dofield: |
|
{ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); |
|
#endif |
|
spTOS += *(Cell*)PFA1(cfa); |
|
} |
|
#ifdef NO_IP |
|
goto *next_code; |
|
#else |
|
NEXT_P0; |
|
NEXT; |
|
#endif |
|
|
|
dodoes: |
|
/* this assumes the following structure: |
|
defining-word: |
|
|
|
... |
|
DOES> |
|
(possible padding) |
|
possibly handler: jmp dodoes |
|
(possible branch delay slot(s)) |
|
Forth code after DOES> |
|
|
|
defined word: |
|
|
|
cfa: address of or jump to handler OR |
|
address of or jump to dodoes, address of DOES-code |
|
pfa: |
|
|
|
*/ |
|
#ifdef NO_IP |
|
*--rp = next_code; |
|
IF_spTOS(spTOS = sp[0]); |
|
sp--; |
|
spTOS = (Cell)PFA(cfa); |
|
goto **(Label *)DOES_CODE1(cfa); |
|
#else |
|
{ |
|
/* fprintf(stderr, "Got CFA %08lx at doescode %08lx/%08lx: does: %08lx\n",cfa,(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));*/ |
|
#ifdef DEBUG |
|
fprintf(stderr,"%08lx/%08lx: does: %08lx\n",(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa)); |
|
fflush(stderr); |
|
#endif |
|
*--rp = (Cell)ip; |
|
/* PFA1 might collide with DOES_CODE1 here, so we use PFA */ |
|
#ifdef USE_TOS |
|
*sp-- = spTOS; |
|
spTOS = (Cell)PFA(cfa); |
|
#else |
|
*--sp = (Cell)PFA(cfa); |
|
#endif |
|
SET_IP(DOES_CODE1(cfa)); |
|
SUPER_END; |
|
/* fprintf(stderr,"TOS = %08lx, IP=%08lx\n", spTOS, IP);*/ |
|
} |
|
NEXT; |
|
#endif |
|
|
|
#include "prim.i" |
#include "prim.i" |
after_last: return (Label *)0; |
after_last: return (Label *)0; |