Diff for /gforth/prim between versions 1.268 and 1.280

version 1.268, 2012/03/17 22:18:59 version 1.280, 2012/12/31 15:25:18
Line 1 Line 1
 \ Gforth primitives  \ Gforth primitives
   
 \ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011 Free Software Foundation, Inc.  \ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012 Free Software Foundation, Inc.
   
 \ This file is part of Gforth.  \ This file is part of Gforth.
   
Line 1109  if (u1<u2) Line 1109  if (u1<u2)
 else  else
   u = u1;    u = u1;
 :  :
  2dup u< IF swap THEN drop ;   2dup u> select ;
   
 umin    ( u1 u2 -- u )  core  umin    ( u1 u2 -- u )  core
 if (u1<u2)  if (u1<u2)
Line 1117  if (u1<u2) Line 1117  if (u1<u2)
 else  else
   u = u2;    u = u2;
 :  :
  2dup u> IF swap THEN drop ;   2dup u< select ;
   
   mux   ( u1 u2 u3 -- u )    gforth
   ""multiplex @i{u1} for 1 bits in @i{u3}, @i{u2} for 0 bits in @i{u3} into @i{u}""
   u = (u3 & u1) | (~u3 & u2);
   :
    tuck and >r invert and r> ;
   
   select ( u1 u2 f -- u )    gforth
   ""select @i{u1} if @i{f} is true, @i{u2} if false.""
   u = f ? u1 : u2;
   :
    IF swap THEN nip ;
   
 \g compare  \g compare
   
Line 1516  c_addr2 = c_addr1+1; Line 1528  c_addr2 = c_addr1+1;
 :  :
  dup 1+ swap c@ ;   dup 1+ swap c@ ;
   
   cell/ ( n1 -- n2 )      gforth cell_divide
   ""@i{n2} is the number of cells that fit into @i{n1}""
   n2 = n1 / sizeof(Cell);
   :
    [ cell
    2/ dup [IF] ] 2/ [ [THEN]
    2/ dup [IF] ] 2/ [ [THEN]
    2/ dup [IF] ] 2/ [ [THEN]
    2/ dup [IF] ] 2/ [ [THEN]
    drop ] ;
   
 \g compiler  \g compiler
   
 \+f83headerstring  \+f83headerstring
Line 1700  wfileid = (Cell)stderr; Line 1723  wfileid = (Cell)stderr;
   
 \+os  \+os
   
 form    ( -- urows ucols )      gforth  (form)  ( -- urows ucols )      gforth  paren_form
 ""The number of lines and columns in the terminal. These numbers may  ""The number of lines and columns in the terminal. These numbers may
 change with the window size.  Note that it depends on the OS whether  change with the window size.  Note that it depends on the OS whether
 this reflects the actual size and changes with the window size  this reflects the actual size and changes with the window size
Line 1735  FLUSH_ICACHE((caddr_t)c_addr,u); Line 1758  FLUSH_ICACHE((caddr_t)c_addr,u);
   
 (bye)   ( n -- )        gforth  paren_bye  (bye)   ( n -- )        gforth  paren_bye
 SUPER_END;  SUPER_END;
   gforth_FP=fp;
   gforth_SP=sp;
   gforth_RP=rp;
   gforth_LP=lp;
 return (Label *)n;  return (Label *)n;
   
 (system)        ( c_addr u -- wretval wior )    gforth  paren_system  (system)        ( c_addr u -- wretval wior )    gforth  paren_system
Line 2026  free(string); Line 2053  free(string);
   
 newline ( -- c_addr u ) gforth  newline ( -- c_addr u ) gforth
 ""String containing the newline sequence of the host OS""  ""String containing the newline sequence of the host OS""
 char newline[] = {  static const char newline[] = {
 #if DIRSEP=='/'  #if DIRSEP=='/'
 /* Unix */  /* Unix */
 '\n'  '\n'
Line 2075  clock_gettime(CLOCK_REALTIME,&time1); Line 2102  clock_gettime(CLOCK_REALTIME,&time1);
 #else  #else
 struct timeval time2;  struct timeval time2;
 gettimeofday(&time2,NULL);  gettimeofday(&time2,NULL);
 time1.tv_sec = time2.tv_sec;1  time1.tv_sec = time2.tv_sec;
 time1.tv_nsec = time2.tv_usec*1000;  time1.tv_nsec = time2.tv_usec*1000;
 #endif  #endif
 dtime = timespec2ns(&time1);  dtime = timespec2ns(&time1);
Line 2262  representation. If the string represents Line 2289  representation. If the string represents
 true. Otherwise, @i{flag} is false. A string of blanks is a special  true. Otherwise, @i{flag} is false. A string of blanks is a special
 case and represents the floating-point number 0.""  case and represents the floating-point number 0.""
 Float r;  Float r;
 flag = to_float(c_addr, u, &r);  flag = to_float(c_addr, u, &r, '.');
 if (flag) {  if (flag) {
   fp--;    fp--;
   fp[0]=r;    fp[0]=r;
Line 2325  CLOBBER_TOS_WORKAROUND_END; Line 2352  CLOBBER_TOS_WORKAROUND_END;
   
 flnp1   ( r1 -- r2 )    float-ext       f_l_n_p_one  flnp1   ( r1 -- r2 )    float-ext       f_l_n_p_one
 ""@i{r2}=ln(@i{r1}+1)""  ""@i{r2}=ln(@i{r1}+1)""
   CLOBBER_TOS_WORKAROUND_START;
 #ifdef HAVE_LOG1P  #ifdef HAVE_LOG1P
 extern double  extern double
 #ifdef NeXT  #ifdef NeXT
Line 2335  r2 = log1p(r1); Line 2363  r2 = log1p(r1);
 #else  #else
 r2 = log(r1+1.);  r2 = log(r1+1.);
 #endif  #endif
   CLOBBER_TOS_WORKAROUND_END;
   
 flog    ( r1 -- r2 )    float-ext       f_log  flog    ( r1 -- r2 )    float-ext       f_log
 ""The decimal logarithm.""  ""The decimal logarithm.""
Line 2357  CLOBBER_TOS_WORKAROUND_END; Line 2386  CLOBBER_TOS_WORKAROUND_END;
 fsincos ( r1 -- r2 r3 ) float-ext       f_sine_cos  fsincos ( r1 -- r2 r3 ) float-ext       f_sine_cos
 ""@i{r2}=sin(@i{r1}), @i{r3}=cos(@i{r1})""  ""@i{r2}=sin(@i{r1}), @i{r3}=cos(@i{r1})""
 CLOBBER_TOS_WORKAROUND_START;  CLOBBER_TOS_WORKAROUND_START;
 r2 = sin(r1);  sincos(r1, &r2, &r3);
 r3 = cos(r1);  
 CLOBBER_TOS_WORKAROUND_END;  CLOBBER_TOS_WORKAROUND_END;
   
 fsqrt   ( r1 -- r2 )    float-ext       f_square_root  fsqrt   ( r1 -- r2 )    float-ext       f_square_root
Line 2456  faxpy(ra, f_x, nstridex, f_y, nstridey, Line 2484  faxpy(ra, f_x, nstridex, f_y, nstridey,
      fdup dup f@ f* over + 2swap dup f@ f+ dup f! over + 2swap       fdup dup f@ f* over + 2swap dup f@ f+ dup f! over + 2swap
  LOOP 2drop 2drop fdrop ;   LOOP 2drop 2drop fdrop ;
   
   >float1 ( c_addr u c -- f:... flag )    gforth  to_float1
   ""Actual stack effect: ( c_addr u c -- r t | f ).  Attempt to convert the
   character string @i{c-addr u} to internal floating-point
   representation. If the string represents a valid floating-point number
   @i{r} is placed on the floating-point stack and @i{flag} is
   true. Otherwise, @i{flag} is false. A string of blanks is a special
   case and represents the floating-point number 0.""
   Float r;
   flag = to_float(c_addr, u, &r, c);
   if (flag) {
     fp--;
     fp[0]=r;
   }
   
   float/ ( n1 -- n2 )     gforth  float_divide
   n2 = n1 / sizeof(Float);
   
   dfloat/ ( n1 -- n2 )    gforth  sfloat_divide
   n2 = n1 / sizeof(DFloat);
   
   sfloat/ ( n1 -- n2 )    gforth  dfloat_divide
   n2 = n1 / sizeof(SFloat);
   
 \+  \+
   
 \ The following words access machine/OS/installation-dependent  \ The following words access machine/OS/installation-dependent
Line 2778  ip=IP; Line 2829  ip=IP;
 SUPER_END;  SUPER_END;
 VM_JUMP(EXEC1((Xt)a_addr));  VM_JUMP(EXEC1((Xt)a_addr));
   
   \+objects
   \g object_pointer
   
   >o ( c_addr -- r:c_old )        new     to_o
   c_old = op;
   op = c_addr;
   
   o> ( r:c_addr -- )              new     o_restore
   op = c_addr;
   
   o#+ ( #w -- c_addr )            new     o_lit_plus
   c_addr = op + w;
   
   \+
 \g static_super  \g static_super
   
 ifdef(`STACK_CACHE_FILE',  ifdef(`STACK_CACHE_FILE',

Removed from v.1.268  
changed lines
  Added in v.1.280


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