### Diff for /gforth/prim between versions 1.154 and 1.158

version 1.154, 2004/06/19 18:47:26 version 1.158, 2005/01/19 22:11:52
Line 1 Line 1
\ Gforth primitives  \ Gforth primitives

\ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.  \ Copyright (C) 1995,1996,1997,1998,2000,2003,2004 Free Software Foundation, Inc.

\ This file is part of Gforth.  \ This file is part of Gforth.

Line 820  n2 = n1>>1; Line 820  n2 = n1>>1;

fm/mod  ( d1 n1 -- n2 n3 )              core            f_m_slash_mod  fm/mod  ( d1 n1 -- n2 n3 )              core            f_m_slash_mod
""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}.""  ""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}.""
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_DIV
DCell r = fmdiv(d1,n1);  DCell r = fmdiv(d1,n1);
n2=r.hi;  n2=r.hi;
n3=r.lo;  n3=r.lo;
Line 842  if (1%-3>0 && (d1<0) != (n1<0) && n2!=0) Line 842  if (1%-3>0 && (d1<0) != (n1<0) && n2!=0)

sm/rem  ( d1 n1 -- n2 n3 )              core            s_m_slash_rem  sm/rem  ( d1 n1 -- n2 n3 )              core            s_m_slash_rem
""Symmetric division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, sign(@i{n2})=sign(@i{d1}) or 0.""  ""Symmetric division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, sign(@i{n2})=sign(@i{d1}) or 0.""
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_DIV
DCell r = smdiv(d1,n1);  DCell r = smdiv(d1,n1);
n2=r.hi;  n2=r.hi;
n3=r.lo;  n3=r.lo;
Line 863  if (1%-3<0 && (d1<0) != (n1<0) && n2!=0) Line 863  if (1%-3<0 && (d1<0) != (n1<0) && n2!=0)
r>        0< IF  swap negate swap  THEN ;   r>        0< IF  swap negate swap  THEN ;

m*      ( n1 n2 -- d )          core    m_star  m*      ( n1 n2 -- d )          core    m_star
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_MUL
d = mmul(n1,n2);  d = mmul(n1,n2);
#else  #else
d = (DCell)n1 * (DCell)n2;  d = (DCell)n1 * (DCell)n2;
Line 875  d = (DCell)n1 * (DCell)n2; Line 875  d = (DCell)n1 * (DCell)n2;

um*     ( u1 u2 -- ud )         core    u_m_star  um*     ( u1 u2 -- ud )         core    u_m_star
/* use u* as alias */  /* use u* as alias */
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_MUL
ud = ummul(u1,u2);  ud = ummul(u1,u2);
#else  #else
ud = (UDCell)u1 * (UDCell)u2;  ud = (UDCell)u1 * (UDCell)u2;
Line 891  ud = (UDCell)u1 * (UDCell)u2; Line 891  ud = (UDCell)u1 * (UDCell)u2;

um/mod  ( ud u1 -- u2 u3 )              core    u_m_slash_mod  um/mod  ( ud u1 -- u2 u3 )              core    u_m_slash_mod
""ud=u3*u1+u2, u1>u2>=0""  ""ud=u3*u1+u2, u1>u2>=0""
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_DIV
UDCell r = umdiv(ud,u1);  UDCell r = umdiv(ud,u1);
u2=r.hi;  u2=r.hi;
u3=r.lo;  u3=r.lo;
Line 910  u2 = ud%u1; Line 910  u2 = ud%u1;
and >r >r 2dup d+ swap r> + swap r> ;     and >r >r 2dup d+ swap r> + swap r> ;

m+      ( d1 n -- d2 )          double          m_plus  m+      ( d1 n -- d2 )          double          m_plus
d2.lo = d1.lo+n;  DLO_IS(d2, DLO(d1)+n);
d2.hi = d1.hi - (n<0) + (d2.lo<d1.lo);  DHI_IS(d2, DHI(d1) - (n<0) + (DLO(d2)<DLO(d1)));
#else  #else
d2 = d1+n;  d2 = d1+n;
#endif  #endif
Line 920  d2 = d1+n; Line 920  d2 = d1+n;
s>d d+ ;   s>d d+ ;

d+      ( d1 d2 -- d )          double  d_plus  d+      ( d1 d2 -- d )          double  d_plus
d.lo = d1.lo+d2.lo;  DLO_IS(d, DLO(d1) + DLO(d2));
d.hi = d1.hi + d2.hi + (d.lo<d1.lo);  DHI_IS(d, DHI(d1) + DHI(d2) + (d.lo<DLO(d1)));
#else  #else
d = d1+d2;  d = d1+d2;
#endif  #endif
Line 930  d = d1+d2; Line 930  d = d1+d2;
rot + >r tuck + swap over u> r> swap - ;   rot + >r tuck + swap over u> r> swap - ;

d-      ( d1 d2 -- d )          double          d_minus  d-      ( d1 d2 -- d )          double          d_minus
d.lo = d1.lo - d2.lo;  DLO_IS(d, DLO(d1) - DLO(d2));
d.hi = d1.hi-d2.hi-(d1.lo<d2.lo);  DHI_IS(d, DHI(d1)-DHI(d2)-(DLO(d1)<DLO(d2)));
#else  #else
d = d1-d2;  d = d1-d2;
#endif  #endif
Line 941  d = d1-d2; Line 941  d = d1-d2;

dnegate ( d1 -- d2 )            double  d_negate  dnegate ( d1 -- d2 )            double  d_negate
/* use dminus as alias */  /* use dminus as alias */
d2 = dnegate(d1);  d2 = dnegate(d1);
#else  #else
d2 = -d1;  d2 = -d1;
Line 951  d2 = -d1; Line 951  d2 = -d1;

d2*     ( d1 -- d2 )            double          d_two_star  d2*     ( d1 -- d2 )            double          d_two_star
""Shift left by 1; also works on unsigned numbers""  ""Shift left by 1; also works on unsigned numbers""
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_SHIFT
d2.lo = d1.lo<<1;  DLO_IS(d2, DLO(d1)<<1);
d2.hi = (d1.hi<<1) | (d1.lo>>(CELL_BITS-1));  DHI_IS(d2, (DHI(d1)<<1) | (DLO(d1)>>(CELL_BITS-1)));
#else  #else
d2 = 2*d1;  d2 = 2*d1;
#endif  #endif
Line 963  d2 = 2*d1; Line 963  d2 = 2*d1;
d2/     ( d1 -- d2 )            double          d_two_slash  d2/     ( d1 -- d2 )            double          d_two_slash
""Arithmetic shift right by 1.  For signed numbers this is a floored  ""Arithmetic shift right by 1.  For signed numbers this is a floored
division by 2.""  division by 2.""
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_SHIFT
d2.hi = d1.hi>>1;  DHI_IS(d2, DHI(d1)>>1);
d2.lo= (d1.lo>>1) | (d1.hi<<(CELL_BITS-1));  DLO_IS(d2, (DLO(d1)>>1) | (DHI(d1)<<(CELL_BITS-1)));
#else  #else
d2 = d1>>1;  d2 = d1>>1;
#endif  #endif
Line 1068  comparisons(u, u1 u2, u_, u1, u2, gforth Line 1068  comparisons(u, u1 u2, u_, u1, u2, gforth
\ dcomparisons(prefix, args, prefix, arg1, arg2, wordsets...)  \ dcomparisons(prefix, args, prefix, arg1, arg2, wordsets...)
define(dcomparisons,  define(dcomparisons,
\$1=     ( \$2 -- f )             \$6      \$3equals  \$1=     ( \$2 -- f )             \$6      \$3equals
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.lo==\$5.lo && \$4.hi==\$5.hi);  f = FLAG(\$4.lo==\$5.lo && \$4.hi==\$5.hi);
#else  #else
f = FLAG(\$4==\$5);  f = FLAG(\$4==\$5);
#endif  #endif

\$1<>    ( \$2 -- f )             \$7      \$3not_equals  \$1<>    ( \$2 -- f )             \$7      \$3not_equals
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.lo!=\$5.lo || \$4.hi!=\$5.hi);  f = FLAG(\$4.lo!=\$5.lo || \$4.hi!=\$5.hi);
#else  #else
f = FLAG(\$4!=\$5);  f = FLAG(\$4!=\$5);
#endif  #endif

\$1<     ( \$2 -- f )             \$8      \$3less_than  \$1<     ( \$2 -- f )             \$8      \$3less_than
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.hi==\$5.hi ? \$4.lo<\$5.lo : \$4.hi<\$5.hi);  f = FLAG(\$4.hi==\$5.hi ? \$4.lo<\$5.lo : \$4.hi<\$5.hi);
#else  #else
f = FLAG(\$4<\$5);  f = FLAG(\$4<\$5);
#endif  #endif

\$1>     ( \$2 -- f )             \$9      \$3greater_than  \$1>     ( \$2 -- f )             \$9      \$3greater_than
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.hi==\$5.hi ? \$4.lo>\$5.lo : \$4.hi>\$5.hi);  f = FLAG(\$4.hi==\$5.hi ? \$4.lo>\$5.lo : \$4.hi>\$5.hi);
#else  #else
f = FLAG(\$4>\$5);  f = FLAG(\$4>\$5);
#endif  #endif

\$1<=    ( \$2 -- f )             gforth  \$3less_or_equal  \$1<=    ( \$2 -- f )             gforth  \$3less_or_equal
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.hi==\$5.hi ? \$4.lo<=\$5.lo : \$4.hi<=\$5.hi);  f = FLAG(\$4.hi==\$5.hi ? \$4.lo<=\$5.lo : \$4.hi<=\$5.hi);
#else  #else
f = FLAG(\$4<=\$5);  f = FLAG(\$4<=\$5);
#endif  #endif

\$1>=    ( \$2 -- f )             gforth  \$3greater_or_equal  \$1>=    ( \$2 -- f )             gforth  \$3greater_or_equal
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_CMP
f = FLAG(\$4.hi==\$5.hi ? \$4.lo>=\$5.lo : \$4.hi>=\$5.hi);  f = FLAG(\$4.hi==\$5.hi ? \$4.lo>=\$5.lo : \$4.hi>=\$5.hi);
#else  #else
f = FLAG(\$4>=\$5);  f = FLAG(\$4>=\$5);
Line 1601  SUPER_END; Line 1601  SUPER_END;
return (Label *)n;  return (Label *)n;

(system)        ( c_addr u -- wretval wior )    gforth  paren_system  (system)        ( c_addr u -- wretval wior )    gforth  paren_system
#ifndef MSDOS  wretval = gforth_system(c_addr, u);
int old_tp=terminal_prepped;
deprep_terminal();
#endif
wretval=system(cstr(c_addr,u,1)); /* ~ expansion on first part of string? */
wior = IOR(wretval==-1 || (wretval==127 && errno != 0));  wior = IOR(wretval==-1 || (wretval==127 && errno != 0));
#ifndef MSDOS
if (old_tp)
prep_terminal();
#endif

""The string @i{c-addr1 u1} specifies an environment variable. The string @i{c-addr2 u2}  ""The string @i{c-addr1 u1} specifies an environment variable. The string @i{c-addr2 u2}
Line 1856  char * string = cstr(c_addr1, u1, 1); Line 1848  char * string = cstr(c_addr1, u1, 1);
char * pattern = cstr(c_addr2, u2, 0);  char * pattern = cstr(c_addr2, u2, 0);
flag = FLAG(!fnmatch(pattern, string, 0));  flag = FLAG(!fnmatch(pattern, string, 0));

set-dir ( c_addr u -- wior )    gforth set_dir
""Change the current directory to @i{c-addr, u}.
Return an error if this is not possible""

""Store the current directory in the buffer specified by @{c-addr1, u1}.
If the buffer size is not sufficient, return 0 0""
} else {
u2 = 0;
}

\+  \+

newline ( -- c_addr u ) gforth  newline ( -- c_addr u ) gforth
Line 1898  dsystem = timeval2us(&usage.ru_stime); Line 1905  dsystem = timeval2us(&usage.ru_stime);
struct timeval time1;  struct timeval time1;
gettimeofday(&time1,NULL);  gettimeofday(&time1,NULL);
duser = timeval2us(&time1);  duser = timeval2us(&time1);
#ifndef BUGGY_LONG_LONG  dsystem = DZERO;
dsystem = (DCell)0;
#else
dsystem=(DCell){0,0};
#endif
#endif  #endif

\+  \+
Line 1915  comparisons(f, r1 r2, f_, r1, r2, gforth Line 1918  comparisons(f, r1 r2, f_, r1, r2, gforth
comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth)  comparisons(f0, r, f_zero_, r, 0., float, gforth, float, gforth)

d>f     ( d -- r )              float   d_to_f  d>f     ( d -- r )              float   d_to_f
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LL_D2F
extern double ldexp(double x, int exp);  extern double ldexp(double x, int exp);
if (d.hi<0) {  if (DHI(d)<0) {
DCell d2=dnegate(d);    DCell d2=dnegate(d);
r = -(ldexp((Float)d2.hi,CELL_BITS) + (Float)d2.lo);  #else
DCell d2=-d;
#endif
r = -(ldexp((Float)DHI(d2),CELL_BITS) + (Float)DLO(d2));
} else  } else
r = ldexp((Float)d.hi,CELL_BITS) + (Float)d.lo;    r = ldexp((Float)DHI(d),CELL_BITS) + (Float)DLO(d);
#else  #else
r = d;  r = d;
#endif  #endif
Line 2365  av-double ( r -- ) gforth  av_double Line 2372  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  #ifdef BUGGY_LL_SIZE
av_longlong(alist, d.lo);  av_longlong(alist, DLO(d));
#else  #else
av_longlong(alist, d);  av_longlong(alist, d);
#endif  #endif
Line 2388  lp += sizeof(Float); Line 2395  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  #ifdef BUGGY_LL_SIZE
av_longlong(alist, d.lo);  av_longlong(alist, DLO(d));
#else  #else
av_longlong(alist, d);  av_longlong(alist, d);
#endif  #endif
Line 2425  SAVE_REGS Line 2432  SAVE_REGS
av_call(alist);  av_call(alist);
REST_REGS  REST_REGS
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
d.lo = llrv;  DLO_IS(d, llrv);
d.hi = 0;  DHI_IS(d, 0);
#else  #else
d = llrv;  d = llrv;
#endif  #endif
Line 2463  w = va_arg_int(clist); Line 2470  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  #ifdef BUGGY_LONG_LONG
d.lo = va_arg_longlong(clist);  DLO_IS(d, va_arg_longlong(clist));
d.hi = 0;  DHI_IS(d, 0);
#else  #else
d = va_arg_longlong(clist);  d = va_arg_longlong(clist);
#endif  #endif

 Removed from v.1.154 changed lines Added in v.1.158

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