--- gforth/engine/engine.c 2001/12/28 16:51:01 1.36 +++ gforth/engine/engine.c 2002/12/15 17:38:52 1.47 @@ -192,10 +192,6 @@ DCell timeval2us(struct timeval *tvp) #define NEWLINE '\n' -#ifndef HAVE_RINT -#define rint(x) floor((x)+0.5) -#endif - #ifdef HAS_FILE static char* fileattr[6]={"rb","rb","r+b","r+b","wb","wb"}; static char* pfileattr[6]={"r","r","r+","r+","w","w"}; @@ -215,39 +211,45 @@ static int ufileattr[6]= { /* conversion on fetch */ -#define vm_Cell2f(x) ((Bool)(x)) -#define vm_Cell2c(x) ((Char)(x)) -#define vm_Cell2n(x) ((Cell)x) -#define vm_Cell2w(x) ((Cell)x) -#define vm_Cell2u(x) ((UCell)(x)) -#define vm_Cell2a_(x) ((Cell *)(x)) -#define vm_Cell2c_(x) ((Char *)(x)) -#define vm_Cell2f_(x) ((Float *)(x)) -#define vm_Cell2df_(x) ((DFloat *)(x)) -#define vm_Cell2sf_(x) ((SFloat *)(x)) -#define vm_Cell2xt(x) ((Xt)(x)) -#define vm_Cell2f83name(x) ((struct F83Name *)(x)) -#define vm_Cell2longname(x) ((struct Longname *)(x)) -#define vm_Float2r(x) (x) +#define vm_Cell2f(_cell,_x) ((_x)=(Bool)(_cell)) +#define vm_Cell2c(_cell,_x) ((_x)=(Char)(_cell)) +#define vm_Cell2n(_cell,_x) ((_x)=(Cell)(_cell)) +#define vm_Cell2w(_cell,_x) ((_x)=(Cell)(_cell)) +#define vm_Cell2u(_cell,_x) ((_x)=(UCell)(_cell)) +#define vm_Cell2a_(_cell,_x) ((_x)=(Cell *)(_cell)) +#define vm_Cell2c_(_cell,_x) ((_x)=(Char *)(_cell)) +#define vm_Cell2f_(_cell,_x) ((_x)=(Float *)(_cell)) +#define vm_Cell2df_(_cell,_x) ((_x)=(DFloat *)(_cell)) +#define vm_Cell2sf_(_cell,_x) ((_x)=(SFloat *)(_cell)) +#define vm_Cell2xt(_cell,_x) ((_x)=(Xt)(_cell)) +#define vm_Cell2f83name(_cell,_x) ((_x)=(struct F83Name *)(_cell)) +#define vm_Cell2longname(_cell,_x) ((_x)=(struct Longname *)(_cell)) +#define vm_Float2r(_float,_x) (_x=_float) /* conversion on store */ -#define vm_f2Cell(x) ((Cell)(x)) -#define vm_c2Cell(x) ((Cell)(x)) -#define vm_n2Cell(x) ((Cell)(x)) -#define vm_w2Cell(x) ((Cell)(x)) -#define vm_u2Cell(x) ((Cell)(x)) -#define vm_a_2Cell(x) ((Cell)(x)) -#define vm_c_2Cell(x) ((Cell)(x)) -#define vm_f_2Cell(x) ((Cell)(x)) -#define vm_df_2Cell(x) ((Cell)(x)) -#define vm_sf_2Cell(x) ((Cell)(x)) -#define vm_xt2Cell(x) ((Cell)(x)) -#define vm_f83name2Cell(x) ((Cell)(x)) -#define vm_longname2Cell(x) ((Cell)(x)) -#define vm_r2Float(x) (x) +#define vm_f2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_c2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_n2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_w2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_u2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_a_2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_c_2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_f_2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_df_2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_sf_2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_xt2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_f83name2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_longname2Cell(_x,_cell) ((_cell)=(Cell)(_x)) +#define vm_r2Float(_x,_float) (_float=_x) + +#define vm_Cell2Cell(_x,_y) (_y=_x) -#define vm_Cell2Cell(x) (x) +#ifdef NO_IP +#define IMM_ARG(access,value) (VARIANT(value)) +#else +#define IMM_ARG(access,value) (access) +#endif /* if machine.h has not defined explicit registers, define them as implicit */ #ifndef IPREG @@ -282,14 +284,6 @@ static int ufileattr[6]= { # define CPU_DEP1 0 #endif -/* declare and compute cfa for certain threading variants */ -/* warning: this is nonsyntactical; it will not work in place of a statement */ -#ifndef GETCFA -#define DOCFA -#else -#define DOCFA Xt cfa; GETCFA(cfa) -#endif - /* instructions containing these must be the last instruction of a super-instruction (e.g., branches, EXECUTE, and other instructions ending the basic block). Instructions containing SET_IP get this @@ -308,25 +302,39 @@ static int ufileattr[6]= { /* 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; +Xt *saved_ip; Cell *rp; #endif +#ifdef NO_IP +static Label next_code; +#endif + +#ifdef DEBUG +#define CFA_TO_NAME(__cfa) \ + Cell len, i; \ + char * name = __cfa; \ + for(i=0; i<32; i+=sizeof(Cell)) { \ + len = ((Cell*)name)[-1]; \ + if(len < 0) { \ + len &= 0x1F; \ + if((len+sizeof(Cell)) > i) break; \ + } len = 0; \ + name -= sizeof(Cell); \ + } +#endif + Xt *primtable(Label symbols[], Cell size) + /* used in primitive primtable for peephole optimization */ { -#ifdef DIRECT_THREADED - return symbols; -#else /* !defined(DIRECT_THREADED) */ Xt *xts = (Xt *)malloc(size*sizeof(Xt)); Cell i; for (i=0; i=MAX_SYMBOLS) { fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS); exit(1); } - symbols[i] = &routines[i]; + xts[i] = symbols[i] = &routines[i]; } #endif /* defined(DOUBLY_INDIRECT) */ return symbols; @@ -413,10 +426,13 @@ define(enginerest, IF_spTOS(spTOS = sp[0]); IF_fpTOS(fpTOS = fp[0]); /* prep_terminal(); */ +#ifdef NO_IP + goto *(*(Label *)ip0); +#else SET_IP(ip); SUPER_END; /* count the first block, too */ NEXT; - +#endif #ifdef CPU_DEP3 CPU_DEP3 @@ -424,9 +440,16 @@ define(enginerest, docol: { - DOCFA; +#ifdef NO_IP + *--rp = next_code; + goto **(Label *)PFA1(cfa); +#else #ifdef DEBUG - fprintf(stderr,"%08lx: col: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); + { + 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 */ @@ -446,11 +469,11 @@ define(enginerest, NEXT_P2; } #endif +#endif } docon: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: con: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); #endif @@ -461,12 +484,15 @@ define(enginerest, *--sp = *(Cell *)PFA1(cfa); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif dovar: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: var: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif @@ -477,12 +503,15 @@ define(enginerest, *--sp = (Cell)PFA1(cfa); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif douser: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: user: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif @@ -493,12 +522,15 @@ define(enginerest, *--sp = (Cell)(up+*(Cell*)PFA1(cfa)); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif dodefer: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: defer: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); #endif @@ -508,14 +540,17 @@ define(enginerest, dofield: { - DOCFA; #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: @@ -535,9 +570,14 @@ define(enginerest, pfa: */ +#ifdef NO_IP + *--rp = next_code; + IF_spTOS(spTOS = sp[0]); + sp--; + spTOS = (Cell)PFA(cfa); + goto **(Label *)DOES_CODE1(cfa); +#else { - DOCFA; - /* 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)); @@ -556,12 +596,14 @@ define(enginerest, /* fprintf(stderr,"TOS = %08lx, IP=%08lx\n", spTOS, IP);*/ } NEXT; +#endif #ifndef IN_ENGINE2 -#define LABEL(name) I_##name +#define LABEL(name) I_##name: #else -#define LABEL(name) J_##name: asm(".skip 16"); I_##name +#define LABEL(name) J_##name: asm(".skip 16"); I_##name: #endif +#define LABEL2(name) K_##name: #include "prim.i" #undef LABEL after_last: return (Label *)0; @@ -569,8 +611,25 @@ define(enginerest, }' ) +#define VARIANT(v) (v) +#define JUMP(target) goto I_noop + Label *engine enginerest +#ifndef NO_DYNAMIC + +#ifdef NO_IP +#undef VARIANT +#define VARIANT(v) ((v)^0xffffffff) +#undef JUMP +#define JUMP(target) goto K_lit +Label *engine3 enginerest +#endif + +#undef VARIANT +#define VARIANT(v) (v) +#undef JUMP +#define JUMP(target) goto I_noop #define IN_ENGINE2 Label *engine2 enginerest - +#endif