| /* common header file |
/* common header file |
| |
|
| Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. |
Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011 Free Software Foundation, Inc. |
| |
|
| This file is part of Gforth. |
This file is part of Gforth. |
| |
|
| #define DOFIELD 5 |
#define DOFIELD 5 |
| #define DOVAL 6 |
#define DOVAL 6 |
| #define DODOES 7 |
#define DODOES 7 |
| #define DOESJUMP 8 |
#define DOABICODE 8 |
| |
#define DOSEMIABICODE 9 |
| /* the size of the DOESJUMP, which resides between DOES> and the does-code */ |
#define DOER_MAX 9 |
| #define DOES_HANDLER_SIZE (2*sizeof(Cell)) |
|
| |
|
| #include "machine.h" |
#include "machine.h" |
| |
|
| |
|
| typedef WYDE_TYPE Wyde; |
typedef WYDE_TYPE Wyde; |
| typedef TETRABYTE_TYPE Tetrabyte; |
typedef TETRABYTE_TYPE Tetrabyte; |
| |
typedef OCTABYTE_TYPE Octabyte; |
| typedef unsigned WYDE_TYPE UWyde; |
typedef unsigned WYDE_TYPE UWyde; |
| typedef unsigned TETRABYTE_TYPE UTetrabyte; |
typedef unsigned TETRABYTE_TYPE UTetrabyte; |
| |
typedef unsigned OCTABYTE_TYPE UOctabyte; |
| |
|
| /* Forth data types */ |
/* Forth data types */ |
| /* Cell and UCell must be the same size as a pointer */ |
/* Cell and UCell must be the same size as a pointer */ |
| |
|
| /* shifts by less than CELL_BITS */ |
/* shifts by less than CELL_BITS */ |
| #define DLSHIFT(d,u) ({DCell _d=(d); UCell _u=(u); \ |
#define DLSHIFT(d,u) ({DCell _d=(d); UCell _u=(u); \ |
| (DCell){(_d.hi<<_u)|(_d.lo>>(CELL_BITS-_u)),_d.lo<<_u};}) |
((_u==0) ? \ |
| |
_d : \ |
| |
(DCell){(_d.hi<<_u)|(_d.lo>>(CELL_BITS-_u)), \ |
| |
_d.lo<<_u});}) |
| |
|
| #define UDLSHIFT(ud,u) D2UD(DLSHIFT(UD2D(ud),u)) |
#define UDLSHIFT(ud,u) D2UD(DLSHIFT(UD2D(ud),u)) |
| |
|
| #if SMALL_OFF_T |
#if SMALL_OFF_T |
| ca is the code address */ |
ca is the code address */ |
| #define MAKE_CF(cfa,ca) ((*(Label *)(cfa)) = ((Label)ca)) |
#define MAKE_CF(cfa,ca) ((*(Label *)(cfa)) = ((Label)ca)) |
| /* make a code field for a defining-word-defined word */ |
/* make a code field for a defining-word-defined word */ |
| #define MAKE_DOES_CF(cfa,does_code) ({MAKE_CF(cfa,DOES_CA); \ |
|
| ((Cell *)cfa)[1] = (Cell)(does_code);}) |
|
| |
|
| #define CF(const) (-const-2) |
#define CF(const) (-const-2) |
| |
|
| #define NO_DYNAMIC_DEFAULT 1 |
#define NO_DYNAMIC_DEFAULT 1 |
| #endif |
#endif |
| |
|
| |
#ifndef CHECK_PRIM |
| |
#define CHECK_PRIM(start,len) 0 |
| |
#endif |
| |
|
| #if defined(GFORTH_DEBUGGING) || defined(INDIRECT_THREADED) || defined(DOUBLY_INDIRECT) || defined(VM_PROFILING) |
#if defined(GFORTH_DEBUGGING) || defined(INDIRECT_THREADED) || defined(DOUBLY_INDIRECT) || defined(VM_PROFILING) |
| #define STACK_CACHE_DEFAULT 0 |
#define STACK_CACHE_DEFAULT 0 |
| #else |
#else |
| char name[0]; |
char name[0]; |
| }; |
}; |
| |
|
| #define LONGNAME_COUNT(np) ((np)->countetc & (((~((UCell)0))<<3)>>3)) |
#define LONGNAME_COUNT(np) ((np)->countetc & (((~((UCell)0))<<4)>>4)) |
| |
|
| struct Cellpair { |
struct Cellpair { |
| Cell n1; |
Cell n1; |
| Xt *sr_saved_ip; |
Xt *sr_saved_ip; |
| Cell *sr_rp; |
Cell *sr_rp; |
| } saved_regs; |
} saved_regs; |
| extern saved_regs saved_regs_v, *saved_regs_p; |
extern saved_regs saved_regs_v; |
| |
extern PER_THREAD saved_regs *saved_regs_p; |
| #define saved_ip (saved_regs_p->sr_saved_ip) |
#define saved_ip (saved_regs_p->sr_saved_ip) |
| #define rp (saved_regs_p->sr_rp) |
#define rp (saved_regs_p->sr_rp) |
| /* for use in gforth_engine header */ |
/* for use in gforth_engine header */ |
| #define sr_proto , struct saved_regs *saved_regs_p0 |
#define sr_proto , struct saved_regs *saved_regs_p0 |
| #define sr_call , saved_regs_p |
#define sr_call , saved_regs_p |
| #else /* !defined(GLOBALS_NONRELOC) */ |
#else /* !defined(GLOBALS_NONRELOC) */ |
| extern Xt *saved_ip; |
extern PER_THREAD Xt *saved_ip; |
| extern Cell *rp; |
extern PER_THREAD Cell *rp; |
| #define sr_proto |
#define sr_proto |
| #define sr_call |
#define sr_call |
| #endif /* !defined(GLOBALS_NONRELOC) */ |
#endif /* !defined(GLOBALS_NONRELOC) */ |
| Label *gforth_engine2(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
Label *gforth_engine2(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
| Label *gforth_engine3(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
Label *gforth_engine3(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
| |
|
| |
/* for ABI-CODE and ;ABI-CODE */ |
| |
typedef Cell *abifunc(Cell *sp, Float **fpp); |
| |
typedef Cell *semiabifunc(Cell *sp, Float **fpp, Address body); |
| |
|
| /* engine/prim support routines */ |
/* engine/prim support routines */ |
| Address gforth_alloc(Cell size); |
Address gforth_alloc(Cell size); |
| char *cstr(Char *from, UCell size, int clear); |
char *cstr(Char *from, UCell size); |
| char *tilde_cstr(Char *from, UCell size, int clear); |
char *tilde_cstr(Char *from, UCell size); |
| Cell opencreate_file(char *s, Cell wfam, int flags, Cell *wiorp); |
Cell opencreate_file(char *s, Cell wfam, int flags, Cell *wiorp); |
| DCell timeval2us(struct timeval *tvp); |
DCell timeval2us(struct timeval *tvp); |
| |
DCell timespec2ns(struct timespec *tvp); |
| void cmove(Char *c_from, Char *c_to, UCell u); |
void cmove(Char *c_from, Char *c_to, UCell u); |
| void cmove_up(Char *c_from, Char *c_to, UCell u); |
void cmove_up(Char *c_from, Char *c_to, UCell u); |
| Cell compare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Cell compare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
| UCell hashkey1(Char *c_addr, UCell u, UCell ubits); |
UCell hashkey1(Char *c_addr, UCell u, UCell ubits); |
| struct Cellpair parse_white(Char *c_addr1, UCell u1); |
struct Cellpair parse_white(Char *c_addr1, UCell u1); |
| Cell rename_file(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Cell rename_file(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
| struct Cellquad read_line(Char *c_addr, UCell u1, Cell wfileid); |
struct Cellquad read_line(Char *c_addr, UCell u1, FILE *wfileid); |
| struct Cellpair file_status(Char *c_addr, UCell u); |
struct Cellpair file_status(Char *c_addr, UCell u); |
| Cell to_float(Char *c_addr, UCell u, Float *r_p); |
Cell to_float(Char *c_addr, UCell u, Float *r_p, Char dot); |
| Float v_star(Float *f_addr1, Cell nstride1, Float *f_addr2, Cell nstride2, UCell ucount); |
Float v_star(Float *f_addr1, Cell nstride1, Float *f_addr2, Cell nstride2, UCell ucount); |
| void faxpy(Float ra, Float *f_x, Cell nstridex, Float *f_y, Cell nstridey, UCell ucount); |
void faxpy(Float ra, Float *f_x, Cell nstridex, Float *f_y, Cell nstridey, UCell ucount); |
| UCell lshift(UCell u1, UCell n); |
UCell lshift(UCell u1, UCell n); |
| void gforth_ms(UCell u); |
void gforth_ms(UCell u); |
| UCell gforth_dlopen(Char *c_addr, UCell u); |
UCell gforth_dlopen(Char *c_addr, UCell u); |
| Cell capscompare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Cell capscompare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
| |
int gf_ungetc(int c, FILE *stream); |
| |
void gf_regetc(FILE *stream); |
| |
int gf_ungottenc(FILE *stream); |
| |
|
| /* signal handler stuff */ |
/* signal handler stuff */ |
| void install_signal_handlers(void); |
void install_signal_handlers(void); |
| # define debug 0 |
# define debug 0 |
| #endif |
#endif |
| |
|
| extern Cell *gforth_SP; |
extern PER_THREAD Cell *gforth_SP; |
| extern Cell *gforth_RP; |
extern PER_THREAD Cell *gforth_RP; |
| extern Address gforth_LP; |
extern PER_THREAD Address gforth_LP; |
| extern Float *gforth_FP; |
extern PER_THREAD Float *gforth_FP; |
| extern Address gforth_UP; |
extern PER_THREAD Address gforth_UP; |
| #ifndef HAS_LINKBACK |
|
| extern void * gforth_pointers[]; |
extern void * gforth_pointers(Cell n); |
| #endif |
|
| |
|
| #ifdef HAS_FFCALL |
#ifdef HAS_FFCALL |
| extern Cell *gforth_RP; |
|
| extern Address gforth_LP; |
|
| extern void gforth_callback(Xt* fcall, void * alist); |
extern void gforth_callback(Xt* fcall, void * alist); |
| #endif |
#endif |
| |
|
| |
|
| #define GROUP(x, n) |
#define GROUP(x, n) |
| #define GROUPADD(n) |
#define GROUPADD(n) |
| |
|
| |
#ifdef HAVE_ENDIAN_H |
| |
#include <endian.h> |
| |
#else |
| |
#define BSWAP16(x) ((((x) >> 8) & 0xff | (((x) & 0xff) << 8))) |
| |
#define BSWAP32(x) ((BSWAP16((x) >> 16) | (BSWAP16(x) << 16))) |
| |
#define BSWAP64(x) ((BSWAP32((x) >> 32) | (BSWAP32(x) << 32))) |
| |
#ifdef WORDS_BIGENDIAN |
| |
#define htobe16(x) (x) |
| |
#define htobe32(x) (x) |
| |
#define htobe64(x) (x) |
| |
#define be16toh(x) (x) |
| |
#define be32toh(x) (x) |
| |
#define be64toh(x) (x) |
| |
#define htole16(x) BSWAP16(x) |
| |
#define htole32(x) BSWAP32(x) |
| |
#define htole64(x) BSWAP64(x) |
| |
#define le16toh(x) BSWAP16(x) |
| |
#define le32toh(x) BSWAP32(x) |
| |
#define le64toh(x) BSWAP64(x) |
| |
#else |
| |
#define htobe16(x) BSWAP16(x) |
| |
#define htobe32(x) BSWAP32(x) |
| |
#define htobe64(x) BSWAP64(x) |
| |
#define be16toh(x) BSWAP16(x) |
| |
#define be32toh(x) BSWAP32(x) |
| |
#define be64toh(x) BSWAP64(x) |
| |
#define htole16(x) (x) |
| |
#define htole32(x) (x) |
| |
#define htole64(x) (x) |
| |
#define le16toh(x) (x) |
| |
#define le32toh(x) (x) |
| |
#define le64toh(x) (x) |
| |
#endif |
| |
#endif |