Diff for /gforth/engine/engine.c between versions 1.99 and 1.103

version 1.99, 2007/03/18 21:46:17 version 1.103, 2007/07/07 21:46:05
Line 24 Line 24
 #else  #else
 #define USE_TOS  #define USE_TOS
 #endif  #endif
 #define USE_NO_FTOS  
   
 #include "config.h"  #include "config.h"
 #include "forth.h"  #include "forth.h"
Line 236  extern int gforth_memcmp(const char * s1 Line 235  extern int gforth_memcmp(const char * s1
   
 #ifdef GFORTH_DEBUGGING  #ifdef GFORTH_DEBUGGING
 #if DEBUG  #if DEBUG
 #define NAME(string) { saved_ip=ip; asmcomment(string); fprintf(stderr,"%08lx depth=%3ld: "string"\n",(Cell)ip,sp0+3-sp);}  #define NAME(string) { saved_ip=ip; asmcomment(string); fprintf(stderr,"%08lx depth=%3ld tos=%016lx: "string"\n",(Cell)ip,sp0+3-sp,sp[0]);}
 #else /* !DEBUG */  #else /* !DEBUG */
 #define NAME(string) { saved_ip=ip; asm(""); }  #define NAME(string) { saved_ip=ip; asm(""); }
 /* the asm here is to avoid reordering of following stuff above the  /* the asm here is to avoid reordering of following stuff above the
Line 265  extern int gforth_memcmp(const char * s1 Line 264  extern int gforth_memcmp(const char * s1
       }        }
 #endif  #endif
   
   #ifdef STANDALONE
   jmp_buf throw_jmp_buf;
   
   void throw(int code)
   {
     longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */
   }
   #endif
   
 #if defined(HAS_FFCALL) || defined(HAS_LIBFFI)  #if defined(HAS_FFCALL) || defined(HAS_LIBFFI)
 #define SAVE_REGS IF_fpTOS(fp[0]=fpTOS); gforth_SP=sp; gforth_FP=fp; gforth_RP=rp; gforth_LP=lp;  #define SAVE_REGS IF_fpTOS(fp[0]=fpTOS); gforth_SP=sp; gforth_FP=fp; gforth_RP=rp; gforth_LP=lp;
 #define REST_REGS sp=gforth_SP; fp=gforth_FP; rp=gforth_RP; lp=gforth_LP; IF_fpTOS(fpTOS=fp[0]);  #define REST_REGS sp=gforth_SP; fp=gforth_FP; rp=gforth_RP; lp=gforth_LP; IF_fpTOS(fpTOS=fp[0]);
Line 275  extern int gforth_memcmp(const char * s1 Line 283  extern int gforth_memcmp(const char * s1
 #define VARIANT(v)      (v)  #define VARIANT(v)      (v)
 #define JUMP(target)    goto I_noop  #define JUMP(target)    goto I_noop
 #define LABEL(name) H_##name: asm(""); I_##name:  #define LABEL(name) H_##name: asm(""); I_##name:
   #define LABEL3(name) J_##name: asm("");
   
 #elif ENGINE==2  #elif ENGINE==2
 /* variant with padding between VM instructions for finding out  /* variant with padding between VM instructions for finding out
Line 283  extern int gforth_memcmp(const char * s1 Line 292  extern int gforth_memcmp(const char * s1
 #define VARIANT(v)      (v)  #define VARIANT(v)      (v)
 #define JUMP(target)    goto I_noop  #define JUMP(target)    goto I_noop
 #define LABEL(name) H_##name: SKIP16; I_##name:  #define LABEL(name) H_##name: SKIP16; I_##name:
   /* the SKIP16 after LABEL3 is there, because the ARM gcc may place
      some constants after the final branch, and may refer to them from
      the code before label3.  Since we don't copy the constants, we have
      to make sure that such code is recognized as non-relocatable. */
   #define LABEL3(name) J_##name: SKIP16;
   
 #elif ENGINE==3  #elif ENGINE==3
 /* variant with different immediate arguments for finding out  /* variant with different immediate arguments for finding out
Line 291  extern int gforth_memcmp(const char * s1 Line 305  extern int gforth_memcmp(const char * s1
 #define VARIANT(v)      ((v)^0xffffffff)  #define VARIANT(v)      ((v)^0xffffffff)
 #define JUMP(target)    goto K_lit  #define JUMP(target)    goto K_lit
 #define LABEL(name) H_##name: asm(""); I_##name:  #define LABEL(name) H_##name: asm(""); I_##name:
   #define LABEL3(name) J_##name: asm("");
 #else  #else
 #error illegal ENGINE value  #error illegal ENGINE value
 #endif /* ENGINE */  #endif /* ENGINE */
   
 /* the asm(""); is there to get a stop compiled on Itanium */  /* the asm(""); is there to get a stop compiled on Itanium */
 #define LABEL2(name) K_##name: asm("");  #define LABEL2(name) K_##name: asm("");
 #define LABEL3(name) J_##name: asm("");  
   
 Label *gforth_engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0)  Label *gforth_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

Removed from v.1.99  
changed lines
  Added in v.1.103


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