Diff for /gforth/prim between versions 1.190 and 1.202

version 1.190, 2006/03/11 22:22:40 version 1.202, 2006/10/30 15:50:52
Line 809  n = n1*n2; Line 809  n = n1*n2;

/       ( n1 n2 -- n )          core    slash  /       ( n1 n2 -- n )          core    slash
n = n1/n2;  n = n1/n2;
if(FLOORED_DIV && ((n1^n2) < 0) && (n1%n2 != 0)) n--;  if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if (FLOORED_DIV && ((n1^n2) < 0) && (n1%n2 != 0))
n--;
:  :
/mod nip ;   /mod nip ;

mod     ( n1 n2 -- n )          core  mod     ( n1 n2 -- n )          core
n = n1%n2;  n = n1%n2;
if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) n += n2;  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) n += n2;
:  :
/mod drop ;   /mod drop ;
Line 822  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) Line 831  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0)
/mod    ( n1 n2 -- n3 n4 )              core            slash_mod  /mod    ( n1 n2 -- n3 n4 )              core            slash_mod
n4 = n1/n2;  n4 = n1/n2;
n3 = n1%n2; /* !! is this correct? look into C standard! */  n3 = n1%n2; /* !! is this correct? look into C standard! */
if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if (FLOORED_DIV && ((n1^n2) < 0) && n3!=0) {  if (FLOORED_DIV && ((n1^n2) < 0) && n3!=0) {
n4--;    n4--;
n3+=n2;    n3+=n2;
Line 836  DCell d = mmul(n1,n2); Line 849  DCell d = mmul(n1,n2);
#else  #else
DCell d = (DCell)n1 * (DCell)n2;  DCell d = (DCell)n1 * (DCell)n2;
#endif  #endif
#ifdef BUGGY_LL_DIV  #ifdef ASM_SM_SLASH_REM
DCell r = fmdiv(d,n3);  ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, n4, n5);
n4=DHI(r);  if (((DHI(d)^n3)<0) && n4!=0) {
n5=DLO(r);    if (CHECK_DIVISION && n5 == CELL_MIN)
#else      throw(BALL_RESULTRANGE);
/* assumes that the processor uses either floored or symmetric division */
n5 = d/n3;
n4 = d%n3;
if (FLOORED_DIV && ((DHI(d)^n3)<0) && n4!=0) {
n5--;    n5--;
n4+=n3;    n4+=n3;
}  }
#else
DCell r = fmdiv(d,n3);
n4=DHI(r);
n5=DLO(r);
#endif  #endif
:  :
>r m* r> fm/mod ;   >r m* r> fm/mod ;
Line 859  DCell d = mmul(n1,n2); Line 872  DCell d = mmul(n1,n2);
#else  #else
DCell d = (DCell)n1 * (DCell)n2;  DCell d = (DCell)n1 * (DCell)n2;
#endif  #endif
#ifdef BUGGY_LL_DIV  #ifdef ASM_SM_SLASH_REM
Cell remainder;
ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, remainder, n4);
if (((DHI(d)^n3)<0) && remainder!=0) {
if (CHECK_DIVISION && n4 == CELL_MIN)
throw(BALL_RESULTRANGE);
n4--;
}
#else
DCell r = fmdiv(d,n3);  DCell r = fmdiv(d,n3);
n4=DLO(r);  n4=DLO(r);
#else
/* assumes that the processor uses either floored or symmetric division */
n4 = d/n3;
if (FLOORED_DIV && ((DHI(d)^n3)<0) && (d%n3)!=0) n4--;
#endif  #endif
:  :
*/mod nip ;   */mod nip ;
Line 889  n2 = n1>>1; Line 906  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_LL_DIV
#ifdef ASM_SM_SLASH_REM  #ifdef ASM_SM_SLASH_REM
#ifdef BUGGY_LL_DIV
ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3);  ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3);
if (((DHI(d1)^n1)<0) && n2!=0) {  if (((DHI(d1)^n1)<0) && n2!=0) {
if (CHECK_DIVISION && n3 == CELL_MIN)
throw(BALL_RESULTRANGE);
n3--;    n3--;
n2+=n1;    n2+=n1;
}  }
#else /* !defined(ASM_SM_SLASH_REM) */
DCell r = fmdiv(d1,n1);
n2=DHI(r);
n3=DLO(r);
#endif /* !defined(ASM_SM_SLASH_REM) */
#else  #else
#ifdef ASM_SM_SLASH_REM4
ASM_SM_SLASH_REM4(d1, n1, n2, n3);  ASM_SM_SLASH_REM4(d1, n1, n2, n3);
if (((DHI(d1)^n1)<0) && n2!=0) {  if (((DHI(d1)^n1)<0) && n2!=0) {
if (CHECK_DIVISION && n3 == CELL_MIN)
throw(BALL_RESULTRANGE);
n3--;    n3--;
n2+=n1;    n2+=n1;
}  }
#else /* !defined(ASM_SM_SLASH_REM4) */
/* assumes that the processor uses either floored or symmetric division */
n3 = d1/n1;
n2 = d1%n1;
/* note that this 1%-3>0 is optimized by the compiler */
if (1%-3>0 && ((DHI(d1)^n1)<0) && n2!=0) {
n3--;
n2+=n1;
}
#endif /* !defined(ASM_SM_SLASH_REM4) */
#endif  #endif
#else /* !defined(ASM_SM_SLASH_REM) */
DCell r = fmdiv(d1,n1);
n2=DHI(r);
n3=DLO(r);
:  :
dup >r dup 0< IF  negate >r dnegate r>  THEN   dup >r dup 0< IF  negate >r dnegate r>  THEN
over       0< IF  tuck + swap  THEN   over       0< IF  tuck + swap  THEN
Line 940  n3=DLO(r); Line 950  n3=DLO(r);
ASM_SM_SLASH_REM4(d1, n1, n2, n3);  ASM_SM_SLASH_REM4(d1, n1, n2, n3);
#else /* !defined(ASM_SM_SLASH_REM4) */  #else /* !defined(ASM_SM_SLASH_REM4) */
/* assumes that the processor uses either floored or symmetric division */  /* assumes that the processor uses either floored or symmetric division */
n3 = d1/n1;  DCell d3 = d1/n1;
n2 = d1%n1;  n2 = d1%n1;
if (CHECK_DIVISION_SW && n1 == 0)
throw(BALL_DIVZERO);
/* note that this 1%-3<0 is optimized by the compiler */  /* note that this 1%-3<0 is optimized by the compiler */
if (1%-3<0 && ((DHI(d1)^n1)<0) && n2!=0) {  if (1%-3<0 && ((DHI(d1)^n1)<0) && n2!=0) {
n3++;    d3++;
n2-=n1;    n2-=n1;
}  }
n3 = d3;
if (CHECK_DIVISION && d3 != n3)
throw(BALL_RESULTRANGE);
#endif /* !defined(ASM_SM_SLASH_REM4) */  #endif /* !defined(ASM_SM_SLASH_REM4) */
#endif  #endif
:  :
Line 996  u3=DLO(r); Line 1011  u3=DLO(r);
#ifdef ASM_UM_SLASH_MOD4  #ifdef ASM_UM_SLASH_MOD4
ASM_UM_SLASH_MOD4(ud, u1, u2, u3);  ASM_UM_SLASH_MOD4(ud, u1, u2, u3);
#else /* !defined(ASM_UM_SLASH_MOD4) */  #else /* !defined(ASM_UM_SLASH_MOD4) */
u3 = ud/u1;  UDCell ud3 = ud/u1;
u2 = ud%u1;  u2 = ud%u1;
if (CHECK_DIVISION_SW && u1 == 0)
throw(BALL_DIVZERO);
u3 = ud3;
if (CHECK_DIVISION && ud3 != u3)
throw(BALL_RESULTRANGE);
#endif /* !defined(ASM_UM_SLASH_MOD4) */  #endif /* !defined(ASM_UM_SLASH_MOD4) */
#endif  #endif
:  :
Line 1646  n=1; Line 1666  n=1;

\g hostos  \g hostos

key-file        ( wfileid -- n )                gforth  paren_key_file  key-file        ( wfileid -- c )                gforth  paren_key_file
""Read one character @i{c} from @i{wfileid}.  This word disables
buffering for @i{wfileid}.  If you want to read characters from a
terminal in non-canonical (raw) mode, you have to put the terminal in
non-canonical mode yourself (using the C interface); the exception is
@code{stdin}: Gforth automatically puts it into non-canonical mode.""
#ifdef HAS_FILE  #ifdef HAS_FILE
fflush(stdout);  fflush(stdout);
n = key((FILE*)wfileid);  c = key((FILE*)wfileid);
#else  #else
n = key(stdin);  c = key(stdin);
#endif  #endif

key?-file       ( wfileid -- n )                gforth  key_q_file  key?-file       ( wfileid -- f )                gforth  key_q_file
""@i{f} is true if at least one character can be read from @i{wfileid}
without blocking.  If you also want to use @code{read-file} or
@code{read-line} on the file, you have to call @code{key?-file} or
@code{key-file} first (these two words disable buffering).""
#ifdef HAS_FILE  #ifdef HAS_FILE
fflush(stdout);  fflush(stdout);
n = key_query((FILE*)wfileid);  f = key_query((FILE*)wfileid);
#else  #else
n = key_query(stdin);  f = key_query(stdin);
#endif  #endif

\+os  \+os

stdin   ( -- wfileid )  gforth  stdin   ( -- wfileid )  gforth
""The standard input file of the Gforth process.""
wfileid = (Cell)stdin;  wfileid = (Cell)stdin;

stdout  ( -- wfileid )  gforth  stdout  ( -- wfileid )  gforth
""The standard output file of the Gforth process.""
wfileid = (Cell)stdout;  wfileid = (Cell)stdout;

stderr  ( -- wfileid )  gforth  stderr  ( -- wfileid )  gforth
""The standard error output file of the Gforth process.""
wfileid = (Cell)stderr;  wfileid = (Cell)stderr;

form    ( -- urows ucols )      gforth  form    ( -- urows ucols )      gforth
Line 2587  alloc-callback ( a_ip -- c_addr ) gforth Line 2619  alloc-callback ( a_ip -- c_addr ) gforth
c_addr = (char *)alloc_callback(gforth_callback, (Xt *)a_ip);  c_addr = (char *)alloc_callback(gforth_callback, (Xt *)a_ip);

va-start-void   ( -- )  gforth  va_start_void  va-start-void   ( -- )  gforth  va_start_void
va_start_void(clist);  va_start_void(gforth_clist);

va-start-int    ( -- )  gforth  va_start_int  va-start-int    ( -- )  gforth  va_start_int
va_start_int(clist);  va_start_int(gforth_clist);

va-start-longlong       ( -- )  gforth  va_start_longlong  va-start-longlong       ( -- )  gforth  va_start_longlong
va_start_longlong(clist);  va_start_longlong(gforth_clist);

va-start-ptr    ( -- )  gforth  va_start_ptr  va-start-ptr    ( -- )  gforth  va_start_ptr
va_start_ptr(clist, (char *));  va_start_ptr(gforth_clist, (char *));

va-start-float  ( -- )  gforth  va_start_float  va-start-float  ( -- )  gforth  va_start_float
va_start_float(clist);  va_start_float(gforth_clist);

va-start-double ( -- )  gforth  va_start_double  va-start-double ( -- )  gforth  va_start_double
va_start_double(clist);  va_start_double(gforth_clist);

va-arg-int      ( -- w )        gforth  va_arg_int  va-arg-int      ( -- w )        gforth  va_arg_int
w = va_arg_int(clist);  w = va_arg_int(gforth_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
DLO_IS(d, va_arg_longlong(clist));  DLO_IS(d, va_arg_longlong(gforth_clist));
DHI_IS(d, 0);  DHI_IS(d, 0);
#else  #else
d = va_arg_longlong(clist);  d = va_arg_longlong(gforth_clist);
#endif  #endif

va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr  va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr

va-arg-float    ( -- r )        gforth  va_arg_float  va-arg-float    ( -- r )        gforth  va_arg_float
r = va_arg_float(clist);  r = va_arg_float(gforth_clist);

va-arg-double   ( -- r )        gforth  va_arg_double  va-arg-double   ( -- r )        gforth  va_arg_double
r = va_arg_double(clist);  r = va_arg_double(gforth_clist);

va-return-void ( -- )   gforth va_return_void  va-return-void ( -- )   gforth va_return_void
va_return_void(clist);  va_return_void(gforth_clist);
return 0;  return 0;

va-return-int ( w -- )  gforth va_return_int  va-return-int ( w -- )  gforth va_return_int
va_return_int(clist, w);  va_return_int(gforth_clist, w);
return 0;  return 0;

va-return-ptr ( c_addr -- )     gforth va_return_ptr  va-return-ptr ( c_addr -- )     gforth va_return_ptr
return 0;  return 0;

va-return-longlong ( d -- )     gforth va_return_longlong  va-return-longlong ( d -- )     gforth va_return_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
va_return_longlong(clist, d.lo);  va_return_longlong(gforth_clist, d.lo);
#else  #else
va_return_longlong(clist, d);  va_return_longlong(gforth_clist, d);
#endif  #endif
return 0;  return 0;

va-return-float ( r -- )        gforth va_return_float  va-return-float ( r -- )        gforth va_return_float
va_return_float(clist, r);  va_return_float(gforth_clist, r);
return 0;  return 0;

va-return-double ( r -- )       gforth va_return_double  va-return-double ( r -- )       gforth va_return_double
va_return_double(clist, r);  va_return_double(gforth_clist, r);
return 0;  return 0;

\+  \+
Line 2686  w = ffi_prep_closure((ffi_closure *)a_cl Line 2718  w = ffi_prep_closure((ffi_closure *)a_cl

ffi-2@ ( a_addr -- d )  gforth ffi_2fetch  ffi-2@ ( a_addr -- d )  gforth ffi_2fetch
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
DHI_IS(d, 0);  DHI_IS(d, 0);
#else  #else
Line 2700  ffi-2! ( d a_addr -- ) gforth ffi_2store Line 2732  ffi-2! ( d a_addr -- ) gforth ffi_2store
#endif  #endif

ffi-arg-int ( -- w )    gforth ffi_arg_int  ffi-arg-int ( -- w )    gforth ffi_arg_int
w = *(int *)(*clist++);  w = *(int *)(*gforth_clist++);

ffi-arg-long ( -- w )   gforth ffi_arg_long
w = *(long *)(*gforth_clist++);

ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong  ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
DLO_IS(d, (Cell*)(*clist++));  DLO_IS(d, *(Cell*)(*gforth_clist++));
DHI_IS(d, 0);  DHI_IS(d, -(*(Cell*)(*gforth_clist++)<0));
#else
d = *(DCell*)(*gforth_clist++);
#endif

ffi-arg-dlong ( -- d )  gforth ffi_arg_dlong
#ifdef BUGGY_LONG_LONG
DLO_IS(d, *(Cell*)(*gforth_clist++));
DHI_IS(d, -(*(Cell*)(*gforth_clist++)<0));
#else  #else
d = *(DCell*)(*clist++);  d = *(Cell*)(*gforth_clist++);
#endif  #endif

ffi-arg-ptr ( -- c_addr )       gforth ffi_arg_ptr  ffi-arg-ptr ( -- c_addr )       gforth ffi_arg_ptr

ffi-arg-float ( -- r )  gforth ffi_arg_float  ffi-arg-float ( -- r )  gforth ffi_arg_float
r = *(float*)(*clist++);  r = *(float*)(*gforth_clist++);

ffi-arg-double ( -- r ) gforth ffi_arg_double  ffi-arg-double ( -- r ) gforth ffi_arg_double
r = *(double*)(*clist++);  r = *(double*)(*gforth_clist++);

ffi-ret-void ( -- )     gforth ffi_ret_void  ffi-ret-void ( -- )     gforth ffi_ret_void
return 0;  return 0;

ffi-ret-int ( w -- )    gforth ffi_ret_int  ffi-ret-int ( w -- )    gforth ffi_ret_int
*(int*)(ritem) = w;  *(int*)(gforth_ritem) = w;
return 0;  return 0;

ffi-ret-longlong ( d -- )       gforth ffi_ret_longlong  ffi-ret-longlong ( d -- )       gforth ffi_ret_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
*(Cell*)(ritem) = DLO(d);  *(Cell*)(gforth_ritem) = DLO(d);
#else
*(DCell*)(gforth_ritem) = d;
#endif
return 0;

ffi-ret-dlong ( d -- )  gforth ffi_ret_dlong
#ifdef BUGGY_LONG_LONG
*(Cell*)(gforth_ritem) = DLO(d);
#else  #else
*(DCell*)(ritem) = d;  *(Cell*)(gforth_ritem) = d;
#endif  #endif
return 0;  return 0;

ffi-ret-long ( n -- )   gforth ffi_ret_long
*(Cell*)(gforth_ritem) = n;
return 0;

ffi-ret-ptr ( c_addr -- )       gforth ffi_ret_ptr  ffi-ret-ptr ( c_addr -- )       gforth ffi_ret_ptr
return 0;  return 0;

ffi-ret-float ( r -- )  gforth ffi_ret_float  ffi-ret-float ( r -- )  gforth ffi_ret_float
*(float*)(ritem) = r;  *(float*)(gforth_ritem) = r;
return 0;  return 0;

ffi-ret-double ( r -- ) gforth ffi_ret_double  ffi-ret-double ( r -- ) gforth ffi_ret_double
*(double*)(ritem) = r;  *(double*)(gforth_ritem) = r;
return 0;  return 0;

\+  \+

 Removed from v.1.190 changed lines Added in v.1.202

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