--- gforth/engine/engine.c 1998/12/20 23:17:56 1.9 +++ gforth/engine/engine.c 1999/05/12 19:30:30 1.12 @@ -213,25 +213,38 @@ static int ufileattr[6]= { /* declare and compute cfa for certain threading variants */ /* warning: this is nonsyntactical; it will not work in place of a statement */ -#ifdef CFA_NEXT +#ifndef GETCFA #define DOCFA #else #define DOCFA Xt cfa; GETCFA(cfa) #endif +#ifdef GFORTH_DEBUGGING +/* define some VM registers as global variables, so they survive exceptions; + global register variables are not up to the task (according to the + GNU C manual) */ +Xt *ip; +Cell *rp; +#endif + Label *engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0) /* executes code at ip, if ip!=NULL returns array of machine code labels (for use in a loader), if ip==NULL */ { - register Xt *ip IPREG = ip0; +#ifndef GFORTH_DEBUGGING + register Xt *ip IPREG; + register Cell *rp RPREG; +#endif register Cell *sp SPREG = sp0; - register Cell *rp RPREG = rp0; register Float *fp FPREG = fp0; register Address lp LPREG = lp0; #ifdef CFA_NEXT register Xt cfa CFAREG; #endif +#ifdef MORE_VARS + MORE_VARS +#endif register Address up UPREG = UP; IF_TOS(register Cell TOS TOSREG;) IF_FTOS(register Float FTOS FTOSREG;) @@ -258,6 +271,8 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * CPU_DEP2 #endif + ip = ip0; + rp = rp0; #ifdef DEBUG fprintf(stderr,"ip=%x, sp=%x, rp=%x, fp=%x, lp=%x, up=%x\n", (unsigned)ip,(unsigned)sp,(unsigned)rp, @@ -288,9 +303,10 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * IF_TOS(TOS = sp[0]); IF_FTOS(FTOS = fp[0]); /* prep_terminal(); */ - NEXT_P0; + SET_IP(ip); NEXT; + #ifdef CPU_DEP3 CPU_DEP3 #endif @@ -304,22 +320,17 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #ifdef CISC_NEXT /* this is the simple version */ *--rp = (Cell)ip; - ip = (Xt *)PFA1(cfa); - NEXT_P0; + SET_IP((Xt *)PFA1(cfa)); NEXT; #else - /* this one is important, so we help the compiler optimizing - The following version may be better (for scheduling), but probably has - problems with code fields employing calls and delay slots - */ + /* this one is important, so we help the compiler optimizing */ { DEF_CA - Xt *current_ip = (Xt *)PFA1(cfa); - cfa = *current_ip; - NEXT1_P1; - *--rp = (Cell)ip; - ip = current_ip+1; - NEXT1_P2; + rp[-1] = (Cell)ip; + SET_IP((Xt *)PFA1(cfa)); + NEXT_P1; + rp--; + NEXT_P2; } #endif } @@ -387,7 +398,7 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #ifdef DEBUG fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif - TOS += *(Cell*)PFA1(cfa); + TOS += *(Cell*)PFA1(cfa); } NEXT_P0; NEXT; @@ -420,16 +431,15 @@ Label *engine(Xt *ip0, Cell *sp0, Cell * #endif *--rp = (Cell)ip; /* PFA1 might collide with DOES_CODE1 here, so we use PFA */ - ip = DOES_CODE1(cfa); #ifdef USE_TOS *sp-- = TOS; TOS = (Cell)PFA(cfa); #else *--sp = (Cell)PFA(cfa); #endif + SET_IP(DOES_CODE1(cfa)); /* fprintf(stderr,"TOS = %08lx, IP=%08lx\n", TOS, IP);*/ } - NEXT_P0; NEXT; #include "prim.i"