Diff for /gforth/engine/engine.c between versions 1.48 and 1.54

version 1.48, 2002/12/19 20:14:57 version 1.54, 2002/12/28 17:18:27
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 66  undefine(`symbols') Line 64  undefine(`symbols')
 #define SEEK_SET 0  #define SEEK_SET 0
 #endif  #endif
   
   #ifndef HAVE_FSEEKO
   #define fseeko fseek
   #endif
   
   #ifndef HAVE_FTELLO
   #define ftello ftell
   #endif
   
 #define IOR(flag)       ((flag)? -512-errno : 0)  #define IOR(flag)       ((flag)? -512-errno : 0)
   
 struct F83Name {  struct F83Name {
Line 84  struct Longname { Line 90  struct Longname {
   
 #define LONGNAME_COUNT(np)      ((np)->countetc & (((~((UCell)0))<<3)>>3))  #define LONGNAME_COUNT(np)      ((np)->countetc & (((~((UCell)0))<<3)>>3))
   
 Cell *SP;  
 Float *FP;  
 Address UP=NULL;  
   
 #if 0  
 /* not used currently */  
 int emitcounter;  
 #endif  
 #define NULLC '\0'  #define NULLC '\0'
   
 #ifdef MEMCMP_AS_SUBROUTINE  #ifdef MEMCMP_AS_SUBROUTINE
Line 101  extern int gforth_memcmp(const char * s1 Line 99  extern int gforth_memcmp(const char * s1
   
 #define NEWLINE '\n'  #define NEWLINE '\n'
   
 #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"};  
   
 #ifndef O_BINARY  
 #define O_BINARY 0  
 #endif  
 #ifndef O_TEXT  
 #define O_TEXT 0  
 #endif  
   
 static int ufileattr[6]= {  
   O_RDONLY|O_BINARY, O_RDONLY|O_BINARY,  
   O_RDWR  |O_BINARY, O_RDWR  |O_BINARY,  
   O_WRONLY|O_BINARY, O_WRONLY|O_BINARY };  
 #endif  
   
 /* conversion on fetch */  /* conversion on fetch */
   
 #define vm_Cell2f(_cell,_x)             ((_x)=(Bool)(_cell))  #define vm_Cell2f(_cell,_x)             ((_x)=(Bool)(_cell))
Line 207  static int ufileattr[6]= { Line 188  static int ufileattr[6]= {
 #endif  #endif
 #define SUPER_CONTINUE  #define SUPER_CONTINUE
   
 #ifdef GFORTH_DEBUGGING  
 /* 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 *saved_ip;  
 Cell *rp;  
 #endif  
   
 #ifdef NO_IP  
 static Label next_code;  
 #endif  
   
 #ifdef DEBUG  #ifdef DEBUG
 #define CFA_TO_NAME(__cfa) \  #define CFA_TO_NAME(__cfa) \
       Cell len, i; \        Cell len, i; \
Line 233  static Label next_code; Line 202  static Label next_code;
       }        }
 #endif  #endif
   
 define(enginerest,  #if !defined(ENGINE)
 `(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  /* 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 273  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 496  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.48  
changed lines
  Added in v.1.54


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