Diff for /gforth/engine/engine.c between versions 1.86 and 1.93

version 1.86, 2005/12/27 09:35:45 version 1.93, 2006/10/22 20:45:34
Line 1 Line 1
 /* Gforth virtual machine (aka inner interpreter)  /* Gforth virtual machine (aka inner interpreter)
   
   Copyright (C) 1995,1996,1997,1998,2000,2003,2004 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 46 Line 46
 #include <unistd.h>  #include <unistd.h>
 #include <pwd.h>  #include <pwd.h>
 #include <dirent.h>  #include <dirent.h>
   #include <wchar.h>
 #include <sys/resource.h>  #include <sys/resource.h>
 #ifdef HAVE_FNMATCH_H  #ifdef HAVE_FNMATCH_H
 #include <fnmatch.h>  #include <fnmatch.h>
Line 96  extern int gforth_memcmp(const char * s1 Line 97  extern int gforth_memcmp(const char * s1
 #endif  #endif
   
 #define NEWLINE '\n'  #define NEWLINE '\n'
   /* set CHECK_DIVISION to 0 if the hardware checks division by zero and
      division overflow.  Note that not all checks are controlled by
      CHECK_DIVISION, in particular not overflow checks in mixed-size
      words implemented by C's double-by-double division, because that
      division does not signal such overflows.  !! make an autoconf test
      that sets CHECK_DIVISION */
   #define CHECK_DIVISION 1
   
 /* conversion on fetch */  /* conversion on fetch */
   
Line 242  extern int gforth_memcmp(const char * s1 Line 250  extern int gforth_memcmp(const char * s1
 #endif  #endif
   
 #if defined(HAS_FFCALL) || defined(HAS_LIBFFI)  #if defined(HAS_FFCALL) || defined(HAS_LIBFFI)
 #define SAVE_REGS IF_fpTOS(fp[0]=fpTOS); SP=sp; FP=fp; RP=rp; LP=lp;  #define SAVE_REGS IF_fpTOS(fp[0]=fpTOS); gforth_SP=sp; gforth_FP=fp; gforth_RP=rp; gforth_LP=lp;
 #define REST_REGS sp=SP; fp=FP; rp=RP; lp=LP; IF_fpTOS(fpTOS=fp[0]);  #define REST_REGS sp=gforth_SP; fp=gforth_FP; rp=gforth_RP; lp=gforth_LP; IF_fpTOS(fpTOS=fp[0]);
 #endif  #endif
   
 #if !defined(ENGINE)  #if !defined(ENGINE)
Line 255  extern int gforth_memcmp(const char * s1 Line 263  extern int gforth_memcmp(const char * s1
 #elif ENGINE==2  #elif ENGINE==2
 /* variant with padding between VM instructions for finding out  /* variant with padding between VM instructions for finding out
    cross-inst jumps (for dynamic code) */     cross-inst jumps (for dynamic code) */
 #define engine engine2  #define gforth_engine gforth_engine2
 #define VARIANT(v)      (v)  #define VARIANT(v)      (v)
 #define JUMP(target)    goto I_noop  #define JUMP(target)    goto I_noop
 #define LABEL(name) H_##name: SKIP16; I_##name:  #define LABEL(name) H_##name: SKIP16; I_##name:
Line 263  extern int gforth_memcmp(const char * s1 Line 271  extern int gforth_memcmp(const char * s1
 #elif ENGINE==3  #elif ENGINE==3
 /* variant with different immediate arguments for finding out  /* variant with different immediate arguments for finding out
    immediate arguments (for native code) */     immediate arguments (for native code) */
 #define engine engine3  #define gforth_engine gforth_engine3
 #define VARIANT(v)      ((v)^0xffffffff)  #define VARIANT(v)      ((v)^0xffffffff)
 #define JUMP(target)    goto K_lit  #define JUMP(target)    goto K_lit
 #define LABEL(name) H_##name: asm(""); I_##name:  #define LABEL(name) H_##name: asm(""); I_##name:
Line 275  extern int gforth_memcmp(const char * s1 Line 283  extern int gforth_memcmp(const char * s1
 #define LABEL2(name) K_##name: asm("");  #define LABEL2(name) K_##name: asm("");
 #define LABEL3(name) J_##name: asm("");  #define LABEL3(name) J_##name: asm("");
   
 Label *engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  Label *gforth_engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)
 /* executes code at ip, if ip!=NULL  /* executes code at ip, if ip!=NULL
    returns array of machine code labels (for use in a loader), if ip==NULL     returns array of machine code labels (for use in a loader), if ip==NULL
 */  */
Line 296  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 304  Label *engine(Xt *ip0, Cell *sp0, Cell *
 #endif  #endif
 #ifdef HAS_FFCALL  #ifdef HAS_FFCALL
   av_alist alist;    av_alist alist;
   extern va_alist clist;    extern va_alist gforth_clist;
   float frv;    float frv;
   int irv;    int irv;
   double drv;    double drv;
Line 304  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 312  Label *engine(Xt *ip0, Cell *sp0, Cell *
   void * prv;    void * prv;
 #endif  #endif
 #ifdef HAS_LIBFFI  #ifdef HAS_LIBFFI
   extern void * ritem;    extern void * gforth_ritem;
   extern void ** clist;    extern void ** gforth_clist;
   extern void ffi_callback(ffi_cif * cif, void * resp, void ** args, Xt * ip);    extern void ffi_callback(ffi_cif * cif, void * resp, void ** args, Xt * ip);
 #endif  #endif
   register Address up UPREG = UP;    register Address up UPREG = gforth_UP;
   register Cell MAYBE_UNUSED spTOS TOSREG;    register Cell MAYBE_UNUSED spTOS TOSREG;
   register Cell MAYBE_UNUSED spb spbREG;    register Cell MAYBE_UNUSED spb spbREG;
   register Cell MAYBE_UNUSED spc spcREG;    register Cell MAYBE_UNUSED spc spcREG;

Removed from v.1.86  
changed lines
  Added in v.1.93


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>