Diff for /gforth/Attic/engine.c between versions 1.5 and 1.16

version 1.5, 1994/05/07 14:55:47 version 1.16, 1994/09/26 20:31:10
Line 13 Line 13
 #include <assert.h>  #include <assert.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <time.h>  #include <time.h>
   #include <sys/time.h>
 #include "forth.h"  #include "forth.h"
 #include "io.h"  #include "io.h"
   
 extern unlink(char *);  
 extern ftruncate(int, int);  
   
 typedef union {  typedef union {
   struct {    struct {
 #ifdef BIG_ENDIAN  #ifdef BIG_ENDIAN
Line 43  typedef struct F83Name { Line 41  typedef struct F83Name {
 #define F83NAME_SMUDGE(np)      (((np)->countetc & 0x40) != 0)  #define F83NAME_SMUDGE(np)      (((np)->countetc & 0x40) != 0)
 #define F83NAME_IMMEDIATE(np)   (((np)->countetc & 0x20) != 0)  #define F83NAME_IMMEDIATE(np)   (((np)->countetc & 0x20) != 0)
   
 /* NEXT and NEXT1 are split into several parts to help scheduling */  /* NEXT and NEXT1 are split into several parts to help scheduling,
      unless CISC_NEXT is defined */
   #ifdef CISC_NEXT
   #define NEXT1_P1
   #define NEXT_P1
   #define DEF_CA
 #ifdef DIRECT_THREADED  #ifdef DIRECT_THREADED
 #       define NEXT1_P1   #define NEXT1_P2 ({goto *cfa;})
 #       define NEXT1_P2 ({goto *cfa;})  #else
 #       define DEF_CA  #define NEXT1_P2 ({goto **cfa;})
 #else  #endif /* DIRECT_THREADED */
 #       define NEXT1_P1 ({ca = *cfa;})  #define NEXT_P2 ({cfa = *ip++; NEXT1_P2;})
 #       define NEXT1_P2 ({goto *ca;})  #else /* CISC_NEXT */
 #       define DEF_CA   Label ca;  #ifdef DIRECT_THREADED
 #endif  #define NEXT1_P1
 #define NEXT_P1 ({cfa = *ip++; NEXT1_P1;})  #define NEXT1_P2 ({goto *cfa;})
   #define DEF_CA
   #else /* DIRECT_THREADED */
   #define NEXT1_P1 ({ca = *cfa;})
   #define NEXT1_P2 ({goto *ca;})
   #define DEF_CA  Label ca;
   #endif /* DIRECT_THREADED */
   #define NEXT_P1 ({cfa=*ip++; NEXT1_P1;})
   #define NEXT_P2 NEXT1_P2
   #endif /* CISC_NEXT */
   
 #define NEXT1 ({DEF_CA NEXT1_P1; NEXT1_P2;})  #define NEXT1 ({DEF_CA NEXT1_P1; NEXT1_P2;})
 #define NEXT ({DEF_CA NEXT_P1; NEXT1_P2;})  #define NEXT ({DEF_CA NEXT_P1; NEXT_P2;})
   
 #ifdef USE_TOS  #ifdef USE_TOS
 #define IF_TOS(x) x  #define IF_TOS(x) x
Line 72  typedef struct F83Name { Line 84  typedef struct F83Name {
 #define FTOS (fp[0])  #define FTOS (fp[0])
 #endif  #endif
   
 /*  
 #define CA_DODOES       (symbols[DODOES])  
 */  
   
 int emitcounter;  int emitcounter;
 #define NULLC '\0'  #define NULLC '\0'
   
 #define cstr(to,from,size)\  char *cstr(Char *from, UCell size, int clear)
         {       memcpy(to,from,size);\  /* if clear is true, scratch can be reused, otherwise we want more of
                 to[size]=NULLC;}     the same */
   {
     static char *scratch=NULL;
     static unsigned scratchsize=0;
     static char *nextscratch;
     char *oldnextscratch;
   
     if (clear)
       nextscratch=scratch;
     if (scratch==NULL) {
       scratch=malloc(size+1);
       nextscratch=scratch;
       scratchsize=size;
     }
     else if (nextscratch+size>scratch+scratchsize) {
       char *oldscratch=scratch;
       scratch = realloc(scratch, (nextscratch-scratch)+size+1);
       nextscratch=scratch+(nextscratch-oldscratch);
       scratchsize=size;
     }
     memcpy(nextscratch,from,size);
     nextscratch[size]='\0';
     oldnextscratch = nextscratch;
     nextscratch += size+1;
     return oldnextscratch;
   }
   
 #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"};
   
 Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp, Address lp)  static Address up0=NULL;
   
   /* if machine.h has not defined explicit registers, define them as implicit */
   #ifndef IPREG
   #define IPREG
   #endif
   #ifndef SPREG
   #define SPREG
   #endif
   #ifndef RPREG
   #define RPREG
   #endif
   #ifndef FPREG
   #define FPREG
   #endif
   #ifndef LPREG
   #define LPREG
   #endif
   #ifndef CFAREG
   #define CFAREG
   #endif
   #ifndef UPREG
   #define UPREG
   #endif
   #ifndef TOSREG
   #define TOSREG
   #endif
   #ifndef FTOSREG
   #define FTOSREG
   #endif
   
   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
    This is very preliminary, as the bootstrap architecture is not yet decided  
 */  */
 {  {
   Xt cfa;    register Xt *ip IPREG = ip0;
   Address up=NULL;    register Cell *sp SPREG = sp0;
     register Cell *rp RPREG = rp0;
     register Float *fp FPREG = fp0;
     register Address lp LPREG = lp0;
     register Xt cfa CFAREG;
     register Address up UPREG = up0;
     IF_TOS(register Cell TOS TOSREG;)
     IF_FTOS(register Float FTOS FTOSREG;)
   static Label symbols[]= {    static Label symbols[]= {
     &&docol,      &&docol,
     &&docon,      &&docon,
     &&dovar,      &&dovar,
     &&douser,      &&douser,
       &&dodefer,
     &&dodoes,      &&dodoes,
     &&docol,  /* dummy for does handler address */      &&dodoes,  /* dummy for does handler address */
 #include "prim_labels.i"  #include "prim_labels.i"
   };    };
   IF_TOS(register Cell TOS;)  
   IF_FTOS(Float FTOS;)  
 #ifdef CPU_DEP  #ifdef CPU_DEP
   CPU_DEP;    CPU_DEP;
 #endif  #endif
   
   #ifdef DEBUG
     fprintf(stderr,"ip=%x, sp=%x, rp=%x, fp=%x, lp=%x, up=%x\n",
             ip,sp,rp,fp,lp,up);
   #endif
   
   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 119  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 195  Label *engine(Xt *ip, Cell *sp, Cell *rp
       
  docol:   docol:
 #ifdef DEBUG  #ifdef DEBUG
   printf("col: %x\n",(Cell)PFA1(cfa));    fprintf(stderr,"%08x: col: %08x\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef undefined  #ifdef CISC_NEXT
   /* this is the simple version */    /* this is the simple version */
   *--rp = (Cell)ip;    *--rp = (Cell)ip;
   ip = (Xt *)PFA1(cfa);    ip = (Xt *)PFA1(cfa);
   NEXT;    NEXT;
 #endif  #else
   /* this one is important, so we help the compiler optimizing    /* this one is important, so we help the compiler optimizing
      The following version may be better (for scheduling), but probably has       The following version may be better (for scheduling), but probably has
      problems with code fields employing calls and delay slots       problems with code fields employing calls and delay slots
Line 140  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 216  Label *engine(Xt *ip, Cell *sp, Cell *rp
     ip = current_ip+1;      ip = current_ip+1;
     NEXT1_P2;      NEXT1_P2;
   }    }
   #endif
       
  docon:   docon:
 #ifdef DEBUG  #ifdef DEBUG
   printf("con: %x\n",*(Cell*)PFA1(cfa));    fprintf(stderr,"%08x: con: %08x\n",(Cell)ip,*(Cell*)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;    *sp-- = TOS;
Line 155  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 232  Label *engine(Xt *ip, Cell *sp, Cell *rp
       
  dovar:   dovar:
 #ifdef DEBUG  #ifdef DEBUG
   printf("var: %x\n",(Cell)PFA1(cfa));    fprintf(stderr,"%08x: var: %08x\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;    *sp-- = TOS;
Line 169  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 246  Label *engine(Xt *ip, Cell *sp, Cell *rp
       
  douser:   douser:
 #ifdef DEBUG  #ifdef DEBUG
   printf("user: %x\n",(Cell)PFA1(cfa));    fprintf(stderr,"%08x: user: %08x\n",(Cell)ip,(Cell)PFA1(cfa));
 #endif  #endif
 #ifdef USE_TOS  #ifdef USE_TOS
   *sp-- = TOS;    *sp-- = TOS;
Line 179  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 256  Label *engine(Xt *ip, Cell *sp, Cell *rp
 #endif  #endif
   NEXT;    NEXT;
       
    dodefer:
   #ifdef DEBUG
     fprintf(stderr,"%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 198  Label *engine(Xt *ip, Cell *sp, Cell *rp Line 282  Label *engine(Xt *ip, Cell *sp, Cell *rp
             
      */       */
 #ifdef DEBUG  #ifdef DEBUG
   printf("does: %x\n",(Cell)PFA(cfa)); fflush(stdout);    fprintf(stderr,"%08x/%08x: does: %08x\n",(Cell)ip,(Cell)cfa,DOES_CODE1(cfa));
     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);
 #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.5  
changed lines
  Added in v.1.16


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