Diff for /gforth/engine/engine.c between versions 1.39 and 1.46

version 1.39, 2002/01/20 19:04:11 version 1.46, 2002/11/24 13:54:01
Line 215  static int ufileattr[6]= { Line 215  static int ufileattr[6]= {
   
 /* conversion on fetch */  /* conversion on fetch */
   
 #define vm_Cell2f(x)            ((Bool)(x))  #define vm_Cell2f(_cell,_x)             ((_x)=(Bool)(_cell))
 #define vm_Cell2c(x)            ((Char)(x))  #define vm_Cell2c(_cell,_x)             ((_x)=(Char)(_cell))
 #define vm_Cell2n(x)            ((Cell)x)  #define vm_Cell2n(_cell,_x)             ((_x)=(Cell)(_cell))
 #define vm_Cell2w(x)            ((Cell)x)  #define vm_Cell2w(_cell,_x)             ((_x)=(Cell)(_cell))
 #define vm_Cell2u(x)            ((UCell)(x))  #define vm_Cell2u(_cell,_x)             ((_x)=(UCell)(_cell))
 #define vm_Cell2a_(x)           ((Cell *)(x))  #define vm_Cell2a_(_cell,_x)            ((_x)=(Cell *)(_cell))
 #define vm_Cell2c_(x)           ((Char *)(x))  #define vm_Cell2c_(_cell,_x)            ((_x)=(Char *)(_cell))
 #define vm_Cell2f_(x)           ((Float *)(x))  #define vm_Cell2f_(_cell,_x)            ((_x)=(Float *)(_cell))
 #define vm_Cell2df_(x)          ((DFloat *)(x))  #define vm_Cell2df_(_cell,_x)           ((_x)=(DFloat *)(_cell))
 #define vm_Cell2sf_(x)          ((SFloat *)(x))  #define vm_Cell2sf_(_cell,_x)           ((_x)=(SFloat *)(_cell))
 #define vm_Cell2xt(x)           ((Xt)(x))  #define vm_Cell2xt(_cell,_x)            ((_x)=(Xt)(_cell))
 #define vm_Cell2f83name(x)      ((struct F83Name *)(x))  #define vm_Cell2f83name(_cell,_x)       ((_x)=(struct F83Name *)(_cell))
 #define vm_Cell2longname(x)     ((struct Longname *)(x))  #define vm_Cell2longname(_cell,_x)      ((_x)=(struct Longname *)(_cell))
 #define vm_Float2r(x)   (x)  #define vm_Float2r(_float,_x)           (_x=_float)
   
 /* conversion on store */  /* conversion on store */
   
 #define vm_f2Cell(x)            ((Cell)(x))  #define vm_f2Cell(_x,_cell)             ((_cell)=(Cell)(_x))
 #define vm_c2Cell(x)            ((Cell)(x))  #define vm_c2Cell(_x,_cell)             ((_cell)=(Cell)(_x))
 #define vm_n2Cell(x)            ((Cell)(x))  #define vm_n2Cell(_x,_cell)             ((_cell)=(Cell)(_x))
 #define vm_w2Cell(x)            ((Cell)(x))  #define vm_w2Cell(_x,_cell)             ((_cell)=(Cell)(_x))
 #define vm_u2Cell(x)            ((Cell)(x))  #define vm_u2Cell(_x,_cell)             ((_cell)=(Cell)(_x))
 #define vm_a_2Cell(x)           ((Cell)(x))  #define vm_a_2Cell(_x,_cell)            ((_cell)=(Cell)(_x))
 #define vm_c_2Cell(x)           ((Cell)(x))  #define vm_c_2Cell(_x,_cell)            ((_cell)=(Cell)(_x))
 #define vm_f_2Cell(x)           ((Cell)(x))  #define vm_f_2Cell(_x,_cell)            ((_cell)=(Cell)(_x))
 #define vm_df_2Cell(x)          ((Cell)(x))  #define vm_df_2Cell(_x,_cell)           ((_cell)=(Cell)(_x))
 #define vm_sf_2Cell(x)          ((Cell)(x))  #define vm_sf_2Cell(_x,_cell)           ((_cell)=(Cell)(_x))
 #define vm_xt2Cell(x)           ((Cell)(x))  #define vm_xt2Cell(_x,_cell)            ((_cell)=(Cell)(_x))
 #define vm_f83name2Cell(x)      ((Cell)(x))  #define vm_f83name2Cell(_x,_cell)       ((_cell)=(Cell)(_x))
 #define vm_longname2Cell(x)     ((Cell)(x))  #define vm_longname2Cell(_x,_cell)      ((_cell)=(Cell)(_x))
 #define vm_r2Float(x)   (x)  #define vm_r2Float(_x,_float)           (_float=_x)
   
 #define vm_Cell2Cell(x)         (x)  #define vm_Cell2Cell(_x,_y)             (_y=_x)
   
   #ifdef NO_IP
   #define IMM_ARG(access,value)           (VARIANT(value))
   #else
   #define IMM_ARG(access,value)           (access)
   #endif
   
 /* if machine.h has not defined explicit registers, define them as implicit */  /* if machine.h has not defined explicit registers, define them as implicit */
 #ifndef IPREG  #ifndef IPREG
Line 300  static int ufileattr[6]= { Line 306  static int ufileattr[6]= {
 /* define some VM registers as global variables, so they survive exceptions;  /* define some VM registers as global variables, so they survive exceptions;
    global register variables are not up to the task (according to the      global register variables are not up to the task (according to the 
    GNU C manual) */     GNU C manual) */
 Xt *ip;  Xt *saved_ip;
 Cell *rp;  Cell *rp;
 #endif  #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 321  Cell *rp; Line 331  Cell *rp;
 Xt *primtable(Label symbols[], Cell size)  Xt *primtable(Label symbols[], Cell size)
      /* used in primitive primtable for peephole optimization */       /* used in primitive primtable for peephole optimization */
 {  {
 #ifdef DIRECT_THREADED  
   return symbols;  
 #else /* !defined(DIRECT_THREADED) */  
   Xt *xts = (Xt *)malloc(size*sizeof(Xt));    Xt *xts = (Xt *)malloc(size*sizeof(Xt));
   Cell i;    Cell i;
   
   for (i=0; i<size; i++)    for (i=0; i<size; i++)
     xts[i] = &symbols[i];      xts[i] = &symbols[i];
   return xts;    return xts;
 #endif /* !defined(DIRECT_THREADED) */  
 }  }
   
   
 define(enginerest,  define(enginerest,
 `(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  `(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)
 /* executes code at ip, if ip!=NULL  /* executes code at ip, if ip!=NULL
Line 341  define(enginerest, Line 346  define(enginerest,
 */  */
 {  {
 #ifndef GFORTH_DEBUGGING  #ifndef GFORTH_DEBUGGING
   register Xt *ip IPREG;  
   register Cell *rp RPREG;    register Cell *rp RPREG;
 #endif  #endif
   #ifndef NO_IP
     register Xt *ip IPREG = ip0;
   #endif
   register Cell *sp SPREG = sp0;    register Cell *sp SPREG = sp0;
   register Float *fp FPREG = fp0;    register Float *fp FPREG = fp0;
   register Address lp LPREG = lp0;    register Address lp LPREG = lp0;
Line 377  define(enginerest, Line 384  define(enginerest,
 #undef INST_ADDR  #undef INST_ADDR
     (Label)&&after_last,      (Label)&&after_last,
     (Label)0,      (Label)0,
   #define INST_ADDR(name) (Label)&&K_##name
   #include "prim_lab.i"
   #undef INST_ADDR
 #ifdef IN_ENGINE2  #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"
Line 387  define(enginerest, Line 397  define(enginerest,
   CPU_DEP2    CPU_DEP2
 #endif  #endif
   
   ip = ip0;  
   rp = rp0;    rp = rp0;
 #ifdef DEBUG  #ifdef DEBUG
   fprintf(stderr,"ip=%x, sp=%x, rp=%x, fp=%x, lp=%x, up=%x\n",    fprintf(stderr,"ip=%x, sp=%x, rp=%x, fp=%x, lp=%x, up=%x\n",
           (unsigned)ip,(unsigned)sp,(unsigned)rp,            (unsigned)ip0,(unsigned)sp,(unsigned)rp,
           (unsigned)fp,(unsigned)lp,(unsigned)up);            (unsigned)fp,(unsigned)lp,(unsigned)up);
 #endif  #endif
   
   if (ip == NULL) {    if (ip0 == NULL) {
 #if defined(DOUBLY_INDIRECT)  #if defined(DOUBLY_INDIRECT)
 #define CODE_OFFSET (26*sizeof(Cell))  #define CODE_OFFSET (26*sizeof(Cell))
 #define XT_OFFSET (22*sizeof(Cell))  #define XT_OFFSET (22*sizeof(Cell))
Line 421  define(enginerest, Line 430  define(enginerest,
   IF_spTOS(spTOS = sp[0]);    IF_spTOS(spTOS = sp[0]);
   IF_fpTOS(fpTOS = fp[0]);    IF_fpTOS(fpTOS = fp[0]);
 /*  prep_terminal(); */  /*  prep_terminal(); */
   #ifdef NO_IP
     goto *(*(Label *)ip0);
   #else
   SET_IP(ip);    SET_IP(ip);
   SUPER_END; /* count the first block, too */    SUPER_END; /* count the first block, too */
   NEXT;    NEXT;
   #endif
   
 #ifdef CPU_DEP3  #ifdef CPU_DEP3
   CPU_DEP3    CPU_DEP3
Line 432  define(enginerest, Line 444  define(enginerest,
       
  docol:   docol:
   {    {
   #ifdef NO_IP
       *--rp = next_code;
       goto **(Label *)PFA1(cfa);
   #else
 #ifdef DEBUG  #ifdef DEBUG
     {      {
       CFA_TO_NAME(cfa);        CFA_TO_NAME(cfa);
Line 457  define(enginerest, Line 473  define(enginerest,
       NEXT_P2;        NEXT_P2;
     }      }
 #endif  #endif
   #endif
   }    }
   
  docon:   docon:
Line 471  define(enginerest, Line 488  define(enginerest,
     *--sp = *(Cell *)PFA1(cfa);      *--sp = *(Cell *)PFA1(cfa);
 #endif  #endif
   }    }
   #ifdef NO_IP
     goto *next_code;
   #else
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   #endif
       
  dovar:   dovar:
   {    {
Line 486  define(enginerest, Line 507  define(enginerest,
     *--sp = (Cell)PFA1(cfa);      *--sp = (Cell)PFA1(cfa);
 #endif  #endif
   }    }
   #ifdef NO_IP
     goto *next_code;
   #else
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   #endif
       
  douser:   douser:
   {    {
Line 501  define(enginerest, Line 526  define(enginerest,
     *--sp = (Cell)(up+*(Cell*)PFA1(cfa));      *--sp = (Cell)(up+*(Cell*)PFA1(cfa));
 #endif  #endif
   }    }
   #ifdef NO_IP
     goto *next_code;
   #else
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   #endif
       
  dodefer:   dodefer:
   {    {
Line 520  define(enginerest, Line 549  define(enginerest,
 #endif  #endif
     spTOS += *(Cell*)PFA1(cfa);      spTOS += *(Cell*)PFA1(cfa);
   }    }
   #ifdef NO_IP
     goto *next_code;
   #else
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   #endif
   
  dodoes:   dodoes:
   /* this assumes the following structure:    /* this assumes the following structure:
Line 541  define(enginerest, Line 574  define(enginerest,
      pfa:       pfa:
             
      */       */
   #ifdef NO_IP
     *--rp = next_code;
     IF_spTOS(spTOS = sp[0]);
     sp--;
     spTOS = (Cell)PFA(cfa);
     goto **(Label *)DOES_CODE1(cfa);
   #else
   {    {
     /*    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));*/
 #ifdef DEBUG  #ifdef DEBUG
Line 560  define(enginerest, Line 600  define(enginerest,
     /*    fprintf(stderr,"TOS = %08lx, IP=%08lx\n", spTOS, IP);*/      /*    fprintf(stderr,"TOS = %08lx, IP=%08lx\n", spTOS, IP);*/
   }    }
   NEXT;    NEXT;
   #endif
   
 #ifndef IN_ENGINE2  #ifndef IN_ENGINE2
 #define LABEL(name) I_##name  #define LABEL(name) I_##name:
 #else  #else
 #define LABEL(name) J_##name: asm(".skip 16"); I_##name  #define LABEL(name) J_##name: asm(".skip 16"); I_##name:
 #endif  #endif
   #define LABEL2(name) K_##name:
 #include "prim.i"  #include "prim.i"
 #undef LABEL  #undef LABEL
   after_last: return (Label *)0;    after_last: return (Label *)0;
Line 573  define(enginerest, Line 615  define(enginerest,
 }'  }'
 )  )
   
   #define VARIANT(v)      (v)
   #define JUMP(target)    goto I_noop
   
 Label *engine enginerest  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  #define IN_ENGINE2
 Label *engine2 enginerest  Label *engine2 enginerest
   #endif

Removed from v.1.39  
changed lines
  Added in v.1.46


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