Diff for /gforth/Attic/engine.c between versions 1.31 and 1.37

version 1.31, 1995/11/07 18:06:37 version 1.37, 1996/04/17 16:39:40
Line 19 Line 19
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */  */
   
   #include "config.h"
 #include <ctype.h>  #include <ctype.h>
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
Line 44 Line 45
   
 #define IOR(flag)       ((flag)? -512-errno : 0)  #define IOR(flag)       ((flag)? -512-errno : 0)
   
 typedef union {  
   struct {  
 #ifdef WORDS_BIGENDIAN  
     Cell high;  
     Cell low;  
 #else  
     Cell low;  
     Cell high;  
 #endif;  
   } cells;  
   DCell dcell;  
 } Double_Store;  
   
 typedef struct F83Name {  typedef struct F83Name {
   struct F83Name        *next;  /* the link field for old hands */    struct F83Name        *next;  /* the link field for old hands */
   char                  countetc;    char                  countetc;
Line 84  typedef struct F83Name { Line 72  typedef struct F83Name {
   
 Cell *SP;  Cell *SP;
 Float *FP;  Float *FP;
   #if 0
   /* not used currently */
 int emitcounter;  int emitcounter;
   #endif
 #define NULLC '\0'  #define NULLC '\0'
   
 char *cstr(Char *from, UCell size, int clear)  char *cstr(Char *from, UCell size, int clear)
 /* if clear is true, scratch can be reused, otherwise we want more of  /* return a C-string corresponding to the Forth string ( FROM SIZE ).
    the same */     the C-string lives until the next call of cstr with CLEAR being true */
 {  {
   static char *scratch=NULL;    static struct cstr_buffer {
   static unsigned scratchsize=0;      char *buffer;
   static char *nextscratch;      size_t size;
   char *oldnextscratch;    } *buffers=NULL;
     static int nbuffers=0;
     static int used=0;
     struct cstr_buffer *b;
   
     if (buffers==NULL)
       buffers=malloc(0);
   if (clear)    if (clear)
     nextscratch=scratch;      used=0;
   if (scratch==NULL) {    if (used>=nbuffers) {
     scratch=malloc(size+1);      buffers=realloc(buffers,sizeof(struct cstr_buffer)*(used+1));
     nextscratch=scratch;      buffers[used]=(struct cstr_buffer){malloc(0),0};
     scratchsize=size;      nbuffers=used+1;
   }    }
   else if (nextscratch+size>scratch+scratchsize) {    b=&buffers[used];
     char *oldscratch=scratch;    if (size+1 > b->size) {
     scratch = realloc(scratch, (nextscratch-scratch)+size+1);      b->buffer = realloc(b->buffer,size+1);
     nextscratch=scratch+(nextscratch-oldscratch);      b->size = size+1;
     scratchsize=size;    }
   }    memcpy(b->buffer,from,size);
   memcpy(nextscratch,from,size);    b->buffer[size]='\0';
   nextscratch[size]='\0';    used++;
   oldnextscratch = nextscratch;    return b->buffer;
   nextscratch += size+1;  
   return oldnextscratch;  
 }  }
   
 char *tilde_cstr(Char *from, UCell size, int clear)  char *tilde_cstr(Char *from, UCell size, int clear)
Line 196  static Address up0=NULL; Line 190  static Address up0=NULL;
 #define FTOSREG  #define FTOSREG
 #endif  #endif
   
   /* declare and compute cfa for certain threading variants */
   /* warning: this is nonsyntactical; it will not work in place of a statement */
   #ifdef CFA_NEXT
   #define DOCFA
   #else
   #define DOCFA   Xt cfa; GETCFA(cfa)
   #endif
   
 Label *engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  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 220  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 222  Label *engine(Xt *ip0, Cell *sp0, Cell *
     &&dodefer,      &&dodefer,
     &&dofield,      &&dofield,
     &&dodoes,      &&dodoes,
     &&dodoes,  /* dummy for does handler address */      /* the following entry is normally unused;
          it's there because its index indicates a does-handler */
   #ifdef CPU_DEP1
       CPU_DEP1,
   #else
       (Label)0,
   #endif
 #include "prim_labels.i"  #include "prim_labels.i"
       (Label)0
   };    };
 #ifdef CPU_DEP  #ifdef CPU_DEP2
   CPU_DEP;    CPU_DEP2
 #endif  #endif
   
 #ifdef DEBUG  #ifdef DEBUG
Line 241  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 250  Label *engine(Xt *ip0, Cell *sp0, Cell *
 /*  prep_terminal(); */  /*  prep_terminal(); */
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   
   #ifdef CPU_DEP3
     CPU_DEP3
   #endif
       
  docol:   docol:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: col: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));      fprintf(stderr,"%08lx: col: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef CISC_NEXT  #ifdef CISC_NEXT
   /* this is the simple version */      /* this is the simple version */
   *--rp = (Cell)ip;  
   ip = (Xt *)PFA1(cfa);  
   NEXT_P0;  
   NEXT;  
 #else  
   /* this one is important, so we help the compiler optimizing  
      The following version may be better (for scheduling), but probably has  
      problems with code fields employing calls and delay slots  
   */  
   {  
     DEF_CA  
     Xt *current_ip = (Xt *)PFA1(cfa);  
     cfa = *current_ip;  
     NEXT1_P1;  
     *--rp = (Cell)ip;      *--rp = (Cell)ip;
     ip = current_ip+1;      ip = (Xt *)PFA1(cfa);
     NEXT1_P2;      NEXT_P0;
   }      NEXT;
   #else
       /* this one is important, so we help the compiler optimizing
          The following version may be better (for scheduling), but probably has
          problems with code fields employing calls and delay slots
          */
       {
         DEF_CA
         Xt *current_ip = (Xt *)PFA1(cfa);
         cfa = *current_ip;
         NEXT1_P1;
         *--rp = (Cell)ip;
         ip = current_ip+1;
         NEXT1_P2;
       }
 #endif  #endif
 #ifndef CFA_NEXT  
   }    }
 #endif  
   
  docon:   docon:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: con: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa));      fprintf(stderr,"%08lx: con: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;      *sp-- = TOS;
   TOS = *(Cell *)PFA1(cfa);      TOS = *(Cell *)PFA1(cfa);
 #else  #else
   *--sp = *(Cell *)PFA1(cfa);      *--sp = *(Cell *)PFA1(cfa);
 #endif  #endif
 #ifndef CFA_NEXT  
   }    }
 #endif  
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
       
  dovar:   dovar:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: var: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));      fprintf(stderr,"%08lx: var: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;      *sp-- = TOS;
   TOS = (Cell)PFA1(cfa);      TOS = (Cell)PFA1(cfa);
 #else  #else
   *--sp = (Cell)PFA1(cfa);      *--sp = (Cell)PFA1(cfa);
 #endif  #endif
 #ifndef CFA_NEXT  
   }    }
 #endif  
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
       
  douser:   douser:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: user: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));      fprintf(stderr,"%08lx: user: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;      *sp-- = TOS;
   TOS = (Cell)(up+*(Cell*)PFA1(cfa));      TOS = (Cell)(up+*(Cell*)PFA1(cfa));
 #else  #else
   *--sp = (Cell)(up+*(Cell*)PFA1(cfa));      *--sp = (Cell)(up+*(Cell*)PFA1(cfa));
 #endif  #endif
 #ifndef CFA_NEXT  
   }    }
 #endif  
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
       
  dodefer:   dodefer:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: defer: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa));      fprintf(stderr,"%08lx: defer: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa));
 #endif  #endif
   EXEC(*(Xt *)PFA1(cfa));      EXEC(*(Xt *)PFA1(cfa));
 #ifndef CFA_NEXT  
   }    }
 #endif  
   
  dofield:   dofield:
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));      fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
   TOS += *(Cell*)PFA1(cfa);       TOS += *(Cell*)PFA1(cfa); 
 #ifndef CFA_NEXT  
   }    }
 #endif  
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   
Line 381  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 370  Label *engine(Xt *ip0, Cell *sp0, Cell *
      pfa:       pfa:
             
      */       */
 #ifndef CFA_NEXT  
   {    {
     Xt cfa; GETCFA(cfa);      DOCFA;
   
 /*    fprintf(stderr, "Got CFA %08lx at doescode %08lx/%08lx: does: %08lx\n",cfa,(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));*/      /*    fprintf(stderr, "Got CFA %08lx at doescode %08lx/%08lx: does: %08lx\n",cfa,(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));*/
 #endif  
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"%08lx/%08lx: does: %08lx\n",(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));      fprintf(stderr,"%08lx/%08lx: does: %08lx\n",(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));
   fflush(stderr);      fflush(stderr);
 #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);      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
 #ifndef CFA_NEXT      /*    fprintf(stderr,"TOS = %08lx, IP=%08lx\n", TOS, IP);*/
 /*    fprintf(stderr,"TOS = %08lx, IP=%08lx\n", TOS, IP);*/  
   }    }
 #endif  
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   

Removed from v.1.31  
changed lines
  Added in v.1.37


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