[gforth] / gforth / prim

# gforth: gforth/prim

### Diff for /gforth/prim between version 1.157 and 1.158

version 1.157, Tue Jan 4 22:09:03 2005 UTC version 1.158, Wed Jan 19 22:11:52 2005 UTC
 Line 820
 Line 820

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
 Line 842

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
 Line 863
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
 Line 875

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
 Line 891

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
 Line 910
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
 Line 920
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
 Line 930
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
 Line 941

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
 Line 951

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
 Line 963
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
 Line 1068
\ 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 1905
 Line 1905
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 1922
 Line 1918
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 2372
 Line 2372
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 2395
 Line 2395
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 2432
 Line 2432
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 2470
 Line 2470

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

Generate output suitable for use with a patch program
Legend:
 Removed from v.1.157 changed lines Added in v.1.158