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

version 1.43, 2002/08/19 07:38:16 version 1.46, 2002/11/24 13:54:01
Line 249  static int ufileattr[6]= { Line 249  static int ufileattr[6]= {
   
 #define vm_Cell2Cell(_x,_y)             (_y=_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
 #define IPREG  #define 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 329  Xt *primtable(Label symbols[], Cell size Line 339  Xt *primtable(Label symbols[], Cell size
   return xts;    return xts;
 }  }
   
   
 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 337  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 373  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 383  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 417  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 428  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 453  define(enginerest, Line 473  define(enginerest,
       NEXT_P2;        NEXT_P2;
     }      }
 #endif  #endif
   #endif
   }    }
   
  docon:   docon:
Line 467  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 482  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 497  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 516  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 537  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 556  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)  #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 570  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.43  
changed lines
  Added in v.1.46


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