Diff for /gforth/Attic/engine.c between versions 1.6 and 1.13

version 1.6, 1994/05/18 17:29:52 version 1.13, 1994/08/31 19:42:44
Line 17 Line 17
 #include "forth.h"  #include "forth.h"
 #include "io.h"  #include "io.h"
   
 #ifndef unlink  
         extern unlink(char *);  
 #endif  
 #ifndef ftruncate  
         extern ftruncate(int, int);  
 #endif  
   
 typedef union {  typedef union {
   struct {    struct {
 #ifdef BIG_ENDIAN  #ifdef BIG_ENDIAN
Line 50  typedef struct F83Name { Line 43  typedef struct F83Name {
   
 /* NEXT and NEXT1 are split into several parts to help scheduling */  /* NEXT and NEXT1 are split into several parts to help scheduling */
 #ifdef DIRECT_THREADED  #ifdef DIRECT_THREADED
 #       define NEXT1_P1   #       define NEXT1_P1
 #       define NEXT1_P2 ({goto *cfa;})  #       ifdef i386
   #               define NEXT1_P2 ({cfa=*ip++; goto *cfa;})
   #       else
   #               define NEXT1_P2 ({goto *cfa;})
   #       endif
 #       define DEF_CA  #       define DEF_CA
 #else  #else
 #       define NEXT1_P1 ({ca = *cfa;})  #       define NEXT1_P1 ({ca = *cfa;})
 #       define NEXT1_P2 ({goto *ca;})  #       define NEXT1_P2 ({goto *ca;})
 #       define DEF_CA   Label ca;  #       define DEF_CA   Label ca;
 #endif  #endif
 #define NEXT_P1 ({cfa = *ip++; NEXT1_P1;})  #if defined(i386) && defined(DIRECT_THREADED)
   #       define NEXT_P1
   #       define NEXT1 ({goto *cfa;})
   #else
   #       define NEXT_P1 ({cfa = *ip++; NEXT1_P1;})
   #       define NEXT1 ({DEF_CA NEXT1_P1; NEXT1_P2;})
   #endif
   
 #define NEXT1 ({DEF_CA NEXT1_P1; NEXT1_P2;})  
 #define NEXT ({DEF_CA NEXT_P1; NEXT1_P2;})  #define NEXT ({DEF_CA NEXT_P1; NEXT1_P2;})
   
 #ifdef USE_TOS  #ifdef USE_TOS
Line 80  typedef struct F83Name { Line 82  typedef struct F83Name {
 int emitcounter;  int emitcounter;
 #define NULLC '\0'  #define NULLC '\0'
   
 #define cstr(to,from,size)\  #ifdef copycstr
   #   define cstr(to,from,size)\
         {       memcpy(to,from,size);\          {       memcpy(to,from,size);\
                 to[size]=NULLC;}                  to[size]=NULLC;}
   #else
   char scratch[1024];
   int soffset;
   #   define cstr(from,size) \
              ({ char * to = scratch; \
                 memcpy(to,from,size); \
                 to[size] = NULLC; \
                 soffset = size+1; \
                 to; \
              })
   #   define cstr1(from,size) \
              ({ char * to = scratch+soffset; \
                 memcpy(to,from,size); \
                 to[size] = NULLC; \
                 soffset += size+1; \
                 to; \
              })
   #endif
   
 #define NEWLINE '\n'  #define NEWLINE '\n'
   
   
 static char* fileattr[6]={"r","rb","r+","r+b","w+","w+b"};  static char* fileattr[6]={"r","rb","r+","r+b","w+","w+b"};
   
 #if ~defined(select) && defined(DOS)  static Address up0=NULL;
 /* select replacement for DOS computers for ms only */  
 void select(int n, int a, int b, int c, struct timeval * timeout)  #if defined(i386) && defined(FORCE_REG)
   #  define REG(reg) __asm__(reg)
   
   Label *engine(Xt *ip0, Cell *sp0, Cell *rp, Float *fp, Address lp)
 {  {
    struct timeval time1;     register Xt *ip REG("%esi")=ip0;
    struct timeval time2;     register Cell *sp REG("%edi")=sp0;
    struct timezone zone1;  
   #else
    gettimeofday(&time1,&zone1);  #  define REG(reg)
    time1.tv_sec += timeout->tv_sec;  
    time1.tv_usec += timeout->tv_usec;  
    while(time1.tv_usec >= 1000000)  
      {  
         time1.tv_usec -= 1000000;  
         time1.tv_sec++;  
      }  
    do  
      {  
         gettimeofday(&time2,&zone1);  
      }  
    while(time2.tv_usec < time1.tv_usec || time2.tv_sec < time1.tv_sec);  
 }  
 #endif  
   
 Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp)  Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp)
   {
   #endif
 /* 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
 */  */
 {    register Xt cfa
   Xt cfa;  #ifdef i386
   Address up=NULL;  #  ifdef USE_TOS
      REG("%ecx")
   #  else
      REG("%edx")
   #  endif
   #endif
      ;
     Address up=up0;
   static Label symbols[]= {    static Label symbols[]= {
     &&docol,      &&docol,
     &&docon,      &&docon,
     &&dovar,      &&dovar,
     &&douser,      &&douser,
       &&dodefer,
     &&dodoes,      &&dodoes,
     &&dodoes,  /* dummy for does handler address */      &&dodoes,  /* dummy for does handler address */
 #include "prim_labels.i"  #include "prim_labels.i"
Line 135  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 157  Label *engine(Xt *ip, Cell *sp, Cell *rp
   
   if (ip == NULL)    if (ip == NULL)
     return symbols;      return symbols;
     
   IF_TOS(TOS = sp[0]);    IF_TOS(TOS = sp[0]);
   IF_FTOS(FTOS = fp[0]);    IF_FTOS(FTOS = fp[0]);
   prep_terminal();    prep_terminal();
Line 145  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 167  Label *engine(Xt *ip, Cell *sp, Cell *rp
 #ifdef DEBUG  #ifdef DEBUG
   printf("%08x: col: %08x\n",(Cell)ip,(Cell)PFA1(cfa));    printf("%08x: col: %08x\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef undefined  #ifdef i386
   /* this is the simple version */    /* this is the simple version */
   *--rp = (Cell)ip;    *--rp = (Cell)ip;
   ip = (Xt *)PFA1(cfa);    ip = (Xt *)PFA1(cfa);
Line 203  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 225  Label *engine(Xt *ip, Cell *sp, Cell *rp
 #endif  #endif
   NEXT;    NEXT;
       
    dodefer:
   #ifdef DEBUG
     printf("%08x: defer: %08x\n",(Cell)ip,(Cell)PFA1(cfa));
   #endif
     cfa = *(Xt *)PFA1(cfa);
     NEXT1;
   
  dodoes:   dodoes:
   /* this assumes the following structure:    /* this assumes the following structure:
      defining-word:       defining-word:
Line 227  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 256  Label *engine(Xt *ip, Cell *sp, Cell *rp
 #endif  #endif
   *--rp = (Cell)ip;    *--rp = (Cell)ip;
   /* PFA1 might collide with DOES_CODE1 here, so we use PFA */    /* PFA1 might collide with DOES_CODE1 here, so we use PFA */
     ip = DOES_CODE1(cfa);
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;    *sp-- = TOS;
   TOS = (Cell)PFA(cfa);    TOS = (Cell)PFA(cfa);
 #else  #else
   *--sp = (Cell)PFA(cfa);    *--sp = (Cell)PFA(cfa);
 #endif  #endif
   ip = DOES_CODE1(cfa);  
   NEXT;    NEXT;
       
 #include "primitives.i"  #include "primitives.i"

Removed from v.1.6  
changed lines
  Added in v.1.13


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