Diff for /gforth/engine/engine.c between versions 1.49 and 1.63

version 1.49, 2002/12/19 20:43:26 version 1.63, 2003/08/04 20:32:36
Line 1 Line 1
 /* Gforth virtual machine (aka inner interpreter)  /* Gforth virtual machine (aka inner interpreter)
   
   Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 19 Line 19
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
 */  */
   
 undefine(`symbols')  
   
 #include "config.h"  #include "config.h"
 #include "forth.h"  #include "forth.h"
 #include <ctype.h>  #include <ctype.h>
Line 61  undefine(`symbols') Line 59  undefine(`symbols')
 #include <dl.h>  #include <dl.h>
 #endif  #endif
   
   #ifdef HAS_FFCALL
   #include <avcall.h>
   #include <callback.h>
   #endif
   
 #ifndef SEEK_SET  #ifndef SEEK_SET
 /* should be defined in stdio.h, but some systems don't have it */  /* should be defined in stdio.h, but some systems don't have it */
 #define SEEK_SET 0  #define SEEK_SET 0
 #endif  #endif
   
 #define IOR(flag)       ((flag)? -512-errno : 0)  #ifndef HAVE_FSEEKO
   #define fseeko fseek
 struct F83Name {  #endif
   struct F83Name *next;  /* the link field for old hands */  
   char          countetc;  
   char          name[0];  
 };  
   
 #define F83NAME_COUNT(np)       ((np)->countetc & 0x1f)  
   
 struct Longname {  
   struct Longname *next;  /* the link field for old hands */  
   Cell          countetc;  
   char          name[0];  
 };  
   
 #define LONGNAME_COUNT(np)      ((np)->countetc & (((~((UCell)0))<<3)>>3))  #ifndef HAVE_FTELLO
   #define ftello ftell
   #endif
   
 #define NULLC '\0'  #define NULLC '\0'
   
Line 168  extern int gforth_memcmp(const char * s1 Line 161  extern int gforth_memcmp(const char * s1
 # define CPU_DEP1 0  # define CPU_DEP1 0
 #endif  #endif
   
 /* instructions containing these must be the last instruction of a  /* instructions containing SUPER_END must be the last instruction of a
    super-instruction (e.g., branches, EXECUTE, and other instructions     super-instruction (e.g., branches, EXECUTE, and other instructions
    ending the basic block). Instructions containing SET_IP get this     ending the basic block). Instructions containing SET_IP get this
    automatically, so you usually don't have to write it.  If you have     automatically, so you usually don't have to write it.  If you have
Line 196  extern int gforth_memcmp(const char * s1 Line 189  extern int gforth_memcmp(const char * s1
       }        }
 #endif  #endif
   
 define(enginerest,  #ifdef HAS_FFCALL
 `(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  #define SAVE_REGS IF_spTOS(sp[0]=spTOS); IF_fpTOS(fp[0]=fpTOS); SP=sp; FP=fp; RP=rp; LP=lp;
   #define REST_REGS sp=SP; fp=FP; rp=RP; lp=LP; IF_spTOS(spTOS=sp[0]); IF_fpTOS(fpTOS=fp[0]);
   #endif
   
   #if !defined(ENGINE)
   /* normal engine */
   #define VARIANT(v)      (v)
   #define JUMP(target)    goto I_noop
   #define LABEL(name) J_##name: asm(""); I_##name:
   
   #elif ENGINE==2
   /* variant with padding between VM instructions for finding out
      cross-inst jumps (for dynamic code) */
   #define engine engine2
   #define VARIANT(v)      (v)
   #define JUMP(target)    goto I_noop
   #define LABEL(name) J_##name: SKIP16; I_##name:
   #define IN_ENGINE2
   
   #elif ENGINE==3
   /* variant with different immediate arguments for finding out
      immediate arguments (for native code) */
   #define engine engine3
   #define VARIANT(v)      ((v)^0xffffffff)
   #define JUMP(target)    goto K_lit
   #define LABEL(name) J_##name: asm(""); I_##name:
   #else
   #error illegal ENGINE value
   #endif /* ENGINE */
   
   #define LABEL2(name) K_##name:
   
   Label *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 215  define(enginerest, Line 240  define(enginerest,
 #ifdef MORE_VARS  #ifdef MORE_VARS
   MORE_VARS    MORE_VARS
 #endif  #endif
   #ifdef HAS_FFCALL
     av_alist alist;
     extern va_alist clist;
     float frv;
     int irv;
     double drv;
     long long llrv;
     void * prv;
   #endif
   register Address up UPREG = UP;    register Address up UPREG = UP;
   IF_spTOS(register Cell spTOS TOSREG;)    IF_spTOS(register Cell spTOS TOSREG;)
   IF_fpTOS(register Float fpTOS FTOSREG;)    IF_fpTOS(register Float fpTOS FTOSREG;)
Line 236  define(enginerest, Line 270  define(enginerest,
     /* the following entry is normally unused;      /* the following entry is normally unused;
        it is there because its index indicates a does-handler */         it is there because its index indicates a does-handler */
     CPU_DEP1,      CPU_DEP1,
 #define INST_ADDR(name) (Label)&&I_##name  #define INST_ADDR(name) ((Label)&&I_##name)
 #include "prim_lab.i"  #include "prim_lab.i"
 #undef INST_ADDR  #undef INST_ADDR
     (Label)&&after_last,      (Label)&&after_last,
     (Label)0,      (Label)0,
 #define INST_ADDR(name) (Label)&&K_##name  #define INST_ADDR(name) ((Label)&&K_##name)
 #include "prim_lab.i"  #include "prim_lab.i"
 #undef INST_ADDR  #undef INST_ADDR
 #ifdef IN_ENGINE2  #define INST_ADDR(name) ((Label)&&J_##name)
 #define INST_ADDR(name) (Label)&&J_##name  
 #include "prim_lab.i"  #include "prim_lab.i"
 #undef INST_ADDR  #undef INST_ADDR
 #endif  
   };    };
 #ifdef CPU_DEP2  #ifdef CPU_DEP2
   CPU_DEP2    CPU_DEP2
Line 275  define(enginerest, Line 307  define(enginerest,
       xts[i] = symbols[i] = (Label)routines[i];        xts[i] = symbols[i] = (Label)routines[i];
     for (; routines[i]!=0; i++) {      for (; routines[i]!=0; i++) {
       if (i>=MAX_SYMBOLS) {        if (i>=MAX_SYMBOLS) {
         fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS);          fprintf(stderr,"gforth-ditc: more than %ld primitives\n",(long)MAX_SYMBOLS);
         exit(1);          exit(1);
       }        }
       xts[i] = symbols[i] = &routines[i];        xts[i] = symbols[i] = &routines[i];
Line 459  define(enginerest, Line 491  define(enginerest,
   NEXT;    NEXT;
 #endif  #endif
   
 #ifndef IN_ENGINE2  
 #define LABEL(name) I_##name:  
 #else  
 #define LABEL(name) J_##name: asm(".skip 16"); I_##name:  
 #endif  
 #define LABEL2(name) K_##name:  
 #include "prim.i"  #include "prim.i"
 #undef LABEL  
   after_last: return (Label *)0;    after_last: return (Label *)0;
   /*needed only to get the length of the last primitive */    /*needed only to get the length of the last primitive */
 }'  }
 )  
   
 #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  

Removed from v.1.49  
changed lines
  Added in v.1.63


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