--- gforth/Attic/forth.h 1995/11/09 19:37:02 1.20 +++ gforth/Attic/forth.h 1997/03/04 17:49:48 1.28 @@ -19,7 +19,24 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "config.h" + +#if defined(DOUBLY_INDIRECT) +# undef DIRECT_THREADED +# define INDIRECT_THREADED +#endif + +#include + +#if defined(NeXT) +# include +#endif /* NeXT */ + +#if defined(DOUBLY_INDIRECT) +typedef void **Label; +#else /* !defined(DOUBLY_INDIRECT) */ typedef void *Label; +#endif /* !defined(DOUBLY_INDIRECT) */ /* symbol indexed constants */ @@ -32,9 +49,16 @@ typedef void *Label; #define DODOES 6 #define DOESJUMP 7 +/* the size of the DOESJUMP, which resides between DOES> and the does-code */ +#define DOES_HANDLER_SIZE (2*sizeof(Cell)) + #include "machine.h" /* Forth data types */ +/* Cell and UCell must be the same size as a pointer */ +typedef CELL_TYPE Cell; +typedef unsigned CELL_TYPE UCell; +#define CELL_BITS (sizeof(Cell) * CHAR_BIT) typedef Cell Bool; #define FLAG(b) (-(b)) #define FILEIO(error) (FLAG(error) & -37) @@ -47,16 +71,76 @@ typedef unsigned char Char; typedef double Float; typedef char *Address; +#ifdef BUGGY_LONG_LONG +typedef struct { + Cell hi; + UCell lo; +} DCell; + +typedef struct { + UCell hi; + UCell lo; +} UDCell; + +#define FETCH_DCELL(d,lo,hi) ((d)=(typeof(d)){(hi),(lo)}) +#define STORE_DCELL(d,low,high) ({ \ + typeof(d) _d = (d); \ + (low) = _d.lo; \ + (high)= _d.hi; \ + }) + +#define LONG2UD(l) ({UDCell _ud; _ud.hi=0; _ud.lo=(Cell)(l); _ud;}) +#define UD2LONG(ud) ((long)(ud.lo)) +#define DZERO ((DCell){0,0}) + +#else /* ! defined(BUGGY_LONG_LONG) */ + +/* DCell and UDCell must be twice as large as Cell */ +typedef DOUBLE_CELL_TYPE DCell; +typedef unsigned DOUBLE_CELL_TYPE UDCell; + +typedef union { + struct { +#ifdef WORDS_BIGENDIAN + Cell high; + UCell low; +#else + UCell low; + Cell high; +#endif; + } cells; + DCell dcell; +} Double_Store; + +#define FETCH_DCELL(d,lo,hi) ({ \ + Double_Store _d; \ + _d.cells.low = (lo); \ + _d.cells.high = (hi); \ + (d) = _d.dcell; \ + }) + +#define STORE_DCELL(d,lo,hi) ({ \ + Double_Store _d; \ + _d.dcell = (d); \ + (lo) = _d.cells.low; \ + (hi) = _d.cells.high; \ + }) + +#define LONG2UD(l) ((UDCell)(l)) +#define UD2LONG(ud) ((long)(ud)) +#define DZERO ((DCell)0) + +#endif /* ! defined(BUGGY_LONG_LONG) */ + #ifdef DIRECT_THREADED typedef Label Xt; #else typedef Label *Xt; #endif -Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp); -#ifndef DIRECT_THREADED -/* i.e. indirect threaded */ +#if !defined(DIRECT_THREADED) +/* i.e. indirect threaded our doubly indirect threaded */ /* the direct threaded version is machine dependent and resides in machine.h */ /* PFA gives the parameter field address corresponding to a cfa */ @@ -64,20 +148,34 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp /* PFA1 is a special version for use just after a NEXT1 */ #define PFA1(cfa) PFA(cfa) /* CODE_ADDRESS is the address of the code jumped to through the code field */ -#define CODE_ADDRESS(cfa) (*(Label *)(cfa)) - /* DOES_CODE is the Forth code does jumps to */ -#define DOES_CODE(cfa) (cfa[1]) -#define DOES_CODE1(cfa) DOES_CODE(cfa) +#define CODE_ADDRESS(cfa) (*(Xt)(cfa)) + +/* DOES_CODE is the Forth code does jumps to */ +#if !defined(DOUBLY_INDIRECT) +# define DOES_CA (symbols[DODOES]) +#else /* defined(DOUBLY_INDIRECT) */ +# define DOES_CA ((Label)&symbols[DODOES]) +#endif /* defined(DOUBLY_INDIRECT) */ + + + +#define DOES_CODE(cfa) ({Xt _cfa=(Xt)(cfa); \ + (Xt *)(_cfa[0]==DOES_CA ? _cfa[1] : NULL);}) +#define DOES_CODE1(cfa) ((Xt *)(cfa[1])) /* MAKE_CF creates an appropriate code field at the cfa; ca is the code address */ #define MAKE_CF(cfa,ca) ((*(Label *)(cfa)) = ((Label)ca)) /* make a code field for a defining-word-defined word */ -#define MAKE_DOES_CF(cfa,does_code) ({MAKE_CF(cfa,symbols[DODOES]); \ - ((Cell *)cfa)[1] = (Cell)does_code;}) +#define MAKE_DOES_CF(cfa,does_code) ({MAKE_CF(cfa,DOES_CA); \ + ((Cell *)cfa)[1] = (Cell)(does_code);}) /* the does handler resides between DOES> and the following Forth code */ -#define DOES_HANDLER_SIZE (2*sizeof(Cell)) -#define MAKE_DOES_HANDLER(addr) 0 /* do nothing */ -#endif +/* not needed in indirect threaded code */ +#if defined(DOUBLY_INDIRECT) +#define MAKE_DOES_HANDLER(addr) MAKE_CF(addr, ((Label)&symbols[DOESJUMP])) +#else /* !defined(DOUBLY_INDIRECT) */ +#define MAKE_DOES_HANDLER(addr) 0 +#endif /* !defined(DOUBLY_INDIRECT) */ +#endif /* !defined(DIRECT_THREADED) */ #ifdef DEBUG # define NAME(string) fprintf(stderr,"%08lx: "string"\n",(Cell)ip); @@ -94,8 +192,37 @@ Label *engine(Xt *ip, Cell *sp, Cell *rp # define FLUSH_ICACHE(addr,size) #endif -#ifdef DIRECT_THREADED +#if defined(DIRECT_THREADED) #define CACHE_FLUSH(addr,size) FLUSH_ICACHE(addr,size) #else #define CACHE_FLUSH(addr,size) #endif + +#ifdef USE_TOS +#define IF_TOS(x) x +#else +#define IF_TOS(x) +#define TOS (sp[0]) +#endif + +#ifdef USE_FTOS +#define IF_FTOS(x) x +#else +#define IF_FTOS(x) +#define FTOS (fp[0]) +#endif + +Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp); +Address my_alloc(Cell size); + +/* dblsub routines */ +DCell dnegate(DCell d1); +UDCell ummul (UCell a, UCell b); +DCell mmul (Cell a, Cell b); +UDCell umdiv (UDCell u, UCell v); +DCell smdiv (DCell num, Cell denom); +DCell fmdiv (DCell num, Cell denom); + +int memcasecmp(const char *s1, const char *s2, long n); + +extern int offset_image;