Diff for /gforth/prim between versions 1.145 and 1.153

version 1.145, 2003/10/09 14:15:19 version 1.153, 2004/04/10 10:09:52
Line 138 Line 138
   
 \ Stack caching setup  \ Stack caching setup
   
 \E register IPTOS Cell  ifdef(`M4_ENGINE_FAST', `include(cache1.vmg)', `include(cache0.vmg)')
 \E register spTOS Cell  
 \E register sp1 Cell  
 \E register sp2 Cell  
 \E register sp3 Cell  
   
 \E create IPregs IPTOS ,  
 \E create regs sp2 , sp1 , spTOS ,  
   
 \E IPregs 1 0 stack-state IPss1  
 \E regs 3 cells + 0 0 stack-state ss0  
 \E regs 2 cells + 1  0 stack-state ss1  
 \E regs 1 cells + 2  1 stack-state ss2  
 \E regs 0 cells + 3  2 stack-state ss3  
   
 \ the first of these is the default state  
 \E state S0  
 \E state S1  
 \E state S2  
 \E state S3  
   
 \E ss0 data-stack S0 set-ss  
 \E ss1 data-stack S1 set-ss  
 \E ss2 data-stack S2 set-ss  
 \E ss3 data-stack S3 set-ss  
   
 \E IPss1 inst-stream S0 set-ss  
 \E IPss1 inst-stream S1 set-ss  
 \E IPss1 inst-stream S2 set-ss  
 \E IPss1 inst-stream S3 set-ss  
   
 \E data-stack to cache-stack  
 \E here 4 cache-states 2! s0 , s1 , s2 , s3 ,  
   
 \ !! the following should be automatic  
 \E S0 to state-default  
 \E state-default to state-in  
 \E state-default to state-out  
   
 \ these m4 macros would collide with identifiers  \ these m4 macros would collide with identifiers
 undefine(`index')  undefine(`index')
Line 189  undefine(`symbols') Line 152  undefine(`symbols')
   
 (docol) ( -- R:a_retaddr )      gforth-internal paren_docol  (docol) ( -- R:a_retaddr )      gforth-internal paren_docol
 ""run-time routine for colon definitions""  ""run-time routine for colon definitions""
   #ifdef NO_IP
   a_retaddr = next_code;
   INST_TAIL;
   goto **(Label *)PFA(CFA);
   #else /* !defined(NO_IP) */
 a_retaddr = (Cell *)IP;  a_retaddr = (Cell *)IP;
 SET_IP((Xt *)PFA(CFA));  SET_IP((Xt *)PFA(CFA));
   #endif /* !defined(NO_IP) */
   
 (docon) ( -- w )        gforth-internal paren_docon  (docon) ( -- w )        gforth-internal paren_docon
 ""run-time routine for constants""  ""run-time routine for constants""
 w = *(Cell *)PFA(CFA);  w = *(Cell *)PFA(CFA);
   #ifdef NO_IP
   INST_TAIL;
   goto *next_code;
   #endif /* defined(NO_IP) */
   
 (dovar) ( -- a_body )   gforth-internal paren_dovar  (dovar) ( -- a_body )   gforth-internal paren_dovar
 ""run-time routine for variables and CREATEd words""  ""run-time routine for variables and CREATEd words""
 a_body = PFA(CFA);  a_body = PFA(CFA);
   #ifdef NO_IP
   INST_TAIL;
   goto *next_code;
   #endif /* defined(NO_IP) */
   
 (douser) ( -- a_user )  gforth-internal paren_douser  (douser) ( -- a_user )  gforth-internal paren_douser
 ""run-time routine for constants""  ""run-time routine for constants""
 a_user = (Cell *)(up+*(Cell *)PFA(CFA));  a_user = (Cell *)(up+*(Cell *)PFA(CFA));
   #ifdef NO_IP
   INST_TAIL;
   goto *next_code;
   #endif /* defined(NO_IP) */
   
 (dodefer) ( -- )        gforth-internal paren_dodefer  (dodefer) ( -- )        gforth-internal paren_dodefer
 ""run-time routine for deferred words""  ""run-time routine for deferred words""
   #ifndef NO_IP
 ip=IP; /* undo any ip updating that may have been performed by NEXT_P0 */  ip=IP; /* undo any ip updating that may have been performed by NEXT_P0 */
   #endif /* !defined(NO_IP) */
 SUPER_END; /* !! probably unnecessary and may lead to measurement errors */  SUPER_END; /* !! probably unnecessary and may lead to measurement errors */
 EXEC(*(Xt *)PFA(CFA));  EXEC(*(Xt *)PFA(CFA));
   
 (dofield) ( n1 -- n2 )  gforth-internal paren_field  (dofield) ( n1 -- n2 )  gforth-internal paren_field
 ""run-time routine for fields""  ""run-time routine for fields""
 n2 = n1 + *(Cell *)PFA(CFA);  n2 = n1 + *(Cell *)PFA(CFA);
   #ifdef NO_IP
   INST_TAIL;
   goto *next_code;
   #endif /* defined(NO_IP) */
   
 (dodoes) ( -- a_body R:a_retaddr )      gforth-internal paren_dodoes  (dodoes) ( -- a_body R:a_retaddr )      gforth-internal paren_dodoes
 ""run-time routine for @code{does>}-defined words""  ""run-time routine for @code{does>}-defined words""
   #ifdef NO_IP
   a_retaddr = next_code;
   a_body = PFA(CFA);
   INST_TAIL;
   goto **(Label *)DOES_CODE1(CFA);
   #else /* !defined(NO_IP) */
 a_retaddr = (Cell *)IP;  a_retaddr = (Cell *)IP;
 a_body = PFA(CFA);  a_body = PFA(CFA);
 SET_IP(DOES_CODE1(CFA));  SET_IP(DOES_CODE1(CFA));
   #endif /* !defined(NO_IP) */
   
 (does-handler) ( -- )   gforth-internal paren_does_handler  (does-handler) ( -- )   gforth-internal paren_does_handler
 ""just a slot to have an encoding for the DOESJUMP,   ""just a slot to have an encoding for the DOESJUMP, 
Line 235  noop ( -- )  gforth Line 229  noop ( -- )  gforth
 call    ( #a_callee -- R:a_retaddr )    new  call    ( #a_callee -- R:a_retaddr )    new
 ""Call callee (a variant of docol with inline argument).""  ""Call callee (a variant of docol with inline argument).""
 #ifdef NO_IP  #ifdef NO_IP
   assert(0);
 INST_TAIL;  INST_TAIL;
 JUMP(a_callee);  JUMP(a_callee);
 #else  #else
Line 254  execute ( xt -- )  core Line 249  execute ( xt -- )  core
 #ifndef NO_IP  #ifndef NO_IP
 ip=IP;  ip=IP;
 #endif  #endif
 IF_spTOS(spTOS = sp[0]);  IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */
 SUPER_END;  SUPER_END;
 EXEC(xt);  EXEC(xt);
   
Line 264  perform ( a_addr -- ) gforth Line 259  perform ( a_addr -- ) gforth
 #ifndef NO_IP  #ifndef NO_IP
 ip=IP;  ip=IP;
 #endif  #endif
 IF_spTOS(spTOS = sp[0]);  IF_spTOS(spTOS = sp[0]); /* inst_tail would produce a NEXT_P1 */
 SUPER_END;  SUPER_END;
 EXEC(*(Xt *)a_addr);  EXEC(*(Xt *)a_addr);
 :  :
Line 329  INST_TAIL; Line 324  INST_TAIL;
 JUMP(a_target);  JUMP(a_target);
 #else  #else
 SET_IP((Xt *)a_target);  SET_IP((Xt *)a_target);
   INST_TAIL;
   NEXT_P2;
 #endif  #endif
   SUPER_CONTINUE;  /* we do our own control flow, so don't append NEXT etc. */
 :  :
  r> @ >r ;   r> @ >r ;
   
Line 438  condbranch((+loop),n R:nlimit R:n1 -- R: Line 436  condbranch((+loop),n R:nlimit R:n1 -- R:
 /* dependent upon two's complement arithmetic */  /* dependent upon two's complement arithmetic */
 Cell olddiff = n1-nlimit;  Cell olddiff = n1-nlimit;
 n2=n1+n;          n2=n1+n;        
 ,if ((olddiff^(olddiff+n))>=0   /* the limit is not crossed */  ,if (((olddiff^(olddiff+n))    /* the limit is not crossed */
     || (olddiff^n)>=0          /* it is a wrap-around effect */) {       &(olddiff^n))             /* OR it is a wrap-around effect */
       >=0) { /* & is used to avoid having two branches for gforth-native */
 ,:  ,:
  r> swap   r> swap
  r> r> 2dup - >r   r> r> 2dup - >r
Line 468  if (n<0) { Line 467  if (n<0) {
     newdiff = -newdiff;      newdiff = -newdiff;
 }  }
 n2=n1+n;  n2=n1+n;
 ,if (diff>=0 || newdiff<0) {  ,if (((~diff)|newdiff)<0) { /* use | to avoid two branches for gforth-native */
 ,)  ,)
   
 \+  \+
Line 2358  av-double ( r -- ) gforth  av_double Line 2357  av-double ( r -- ) gforth  av_double
 av_double(alist, r);  av_double(alist, r);
   
 av-longlong     ( d -- )        gforth  av_longlong  av-longlong     ( d -- )        gforth  av_longlong
   #ifdef BUGGY_LONG_LONG
   av_longlong(alist, d.lo);
   #else
 av_longlong(alist, d);  av_longlong(alist, d);
   #endif
   
 av-ptr  ( c_addr -- )   gforth  av_ptr  av-ptr  ( c_addr -- )   gforth  av_ptr
 av_ptr(alist, void*, c_addr);  av_ptr(alist, void*, c_addr);
Line 2377  lp += sizeof(Float); Line 2380  lp += sizeof(Float);
 av_double(alist, r);  av_double(alist, r);
   
 av-longlong-r   ( R:d -- )      gforth  av_longlong_r  av-longlong-r   ( R:d -- )      gforth  av_longlong_r
   #ifdef BUGGY_LONG_LONG
   av_longlong(alist, d.lo);
   #else
 av_longlong(alist, d);  av_longlong(alist, d);
   #endif
   
 av-ptr-r        ( R:c_addr -- ) gforth  av_ptr_r  av-ptr-r        ( R:c_addr -- ) gforth  av_ptr_r
 av_ptr(alist, void*, c_addr);  av_ptr(alist, void*, c_addr);
Line 2409  av-call-longlong ( -- d ) gforth  av_cal Line 2416  av-call-longlong ( -- d ) gforth  av_cal
 SAVE_REGS  SAVE_REGS
 av_call(alist);  av_call(alist);
 REST_REGS  REST_REGS
   #ifdef BUGGY_LONG_LONG
   d.lo = llrv;
   d.hi = 0;
   #else
 d = llrv;  d = llrv;
   #endif
   
 av-call-ptr     ( -- c_addr )   gforth  av_call_ptr  av-call-ptr     ( -- c_addr )   gforth  av_call_ptr
 SAVE_REGS  SAVE_REGS
Line 2442  va-arg-int ( -- w ) gforth va_arg_int Line 2454  va-arg-int ( -- w ) gforth va_arg_int
 w = va_arg_int(clist);  w = va_arg_int(clist);
   
 va-arg-longlong ( -- d )        gforth  va_arg_longlong  va-arg-longlong ( -- d )        gforth  va_arg_longlong
   #ifdef BUGGY_LONG_LONG
   d.lo = va_arg_longlong(clist);
   d.hi = 0;
   #else
 d = va_arg_longlong(clist);  d = va_arg_longlong(clist);
   #endif
   
 va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr  va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr
 c_addr = (char *)va_arg_ptr(clist,char*);  c_addr = (char *)va_arg_ptr(clist,char*);
Line 2466  va_return_ptr(clist, void *, c_addr); Line 2483  va_return_ptr(clist, void *, c_addr);
 return 0;  return 0;
   
 va-return-longlong ( d -- )     gforth va_return_longlong  va-return-longlong ( d -- )     gforth va_return_longlong
   #ifdef BUGGY_LONG_LONG
   va_return_longlong(clist, d.lo);
   #else
 va_return_longlong(clist, d);  va_return_longlong(clist, d);
   #endif
 return 0;  return 0;
   
 va-return-float ( r -- )        gforth va_return_float  va-return-float ( r -- )        gforth va_return_float
Line 2531  compile_prim1(a_prim); Line 2552  compile_prim1(a_prim);
 finish-code ( -- ) gforth finish_code  finish-code ( -- ) gforth finish_code
 ""Perform delayed steps in code generation (branch resolution, I-cache  ""Perform delayed steps in code generation (branch resolution, I-cache
 flushing).""  flushing).""
   IF_spTOS(sp[0]=spTOS); /* workaround for failing to save spTOS
                             (gcc-2.95.1, gforth-fast --enable-force-reg) */
 finish_code();  finish_code();
   IF_spTOS(spTOS=sp[0]);
   
 forget-dyncode ( c_code -- f ) gforth-internal forget_dyncode  forget-dyncode ( c_code -- f ) gforth-internal forget_dyncode
 f = forget_dyncode(c_code);  f = forget_dyncode(c_code);
Line 2566  a_addr = groups; Line 2590  a_addr = groups;
   
 \g static_super  \g static_super
   
 \C #if !defined(GFORTH_DEBUGGING) && !defined(INDIRECT_THREADED) && !defined(DOUBLY_INDIRECT) && !defined(VM_PROFILING)  ifdef(`M4_ENGINE_FAST',
   `include(peeprules.vmg)')
 include(peeprules.vmg)  
   
 \C #endif  
   
 \g end  \g end

Removed from v.1.145  
changed lines
  Added in v.1.153


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