--- gforth/prim 1999/05/15 20:00:21 1.32 +++ gforth/prim 1999/12/03 18:24:22 1.41 @@ -445,27 +445,28 @@ n = rp[4]; \ digit is high-level: 0/0% move c_from c_to ucount -- core -"" If @i{ucount}>0, copy the contents of @i{ucount} address units -at @i{c-from} to @i{c-to}. @code{move} chooses its copy direction -to avoid problems when @i{c-from}, @i{c-to} overlap."" +""Copy the contents of @i{ucount} address units at @i{c-from} to +@i{c-to}. @code{move} works correctly even if the two areas overlap."" memmove(c_to,c_from,ucount); /* make an Ifdef for bsd and others? */ : >r 2dup u< IF r> cmove> ELSE r> cmove THEN ; -cmove c_from c_to u -- string -"" If @i{u}>0, copy the contents of @i{ucount} characters from -data space at @i{c-from} to @i{c-to}. The copy proceeds @code{char}-by-@code{char} -from low address to high address."" +cmove c_from c_to u -- string c_move +""Copy the contents of @i{ucount} characters from data space at +@i{c-from} to @i{c-to}. The copy proceeds @code{char}-by-@code{char} +from low address to high address; i.e., for overlapping areas it is +safe if @i{c-to}=<@i{c-from}."" while (u-- > 0) *c_to++ = *c_from++; : bounds ?DO dup c@ I c! 1+ LOOP drop ; cmove> c_from c_to u -- string c_move_up -"" If @i{u}>0, copy the contents of @i{ucount} characters from -data space at @i{c-from} to @i{c-to}. The copy proceeds @code{char}-by-@code{char} -from high address to low address."" +""Copy the contents of @i{ucount} characters from data space at +@i{c-from} to @i{c-to}. The copy proceeds @code{char}-by-@code{char} +from high address to low address; i.e., for overlapping areas it is +safe if @i{c-to}>=@i{c-from}."" while (u-- > 0) c_to[u] = c_from[u]; : @@ -767,7 +768,7 @@ d = d1-d2; : dnegate d+ ; -dnegate d1 -- d2 double +dnegate d1 -- d2 double d_negate /* use dminus as alias */ #ifdef BUGGY_LONG_LONG d2 = dnegate(d1); @@ -806,7 +807,7 @@ w = w1|w2; : invert swap invert and invert ; -xor w1 w2 -- w core +xor w1 w2 -- w core x_or w = w1^w2; invert w1 -- w2 core @@ -814,12 +815,12 @@ w2 = ~w1; : MAXU xor ; -rshift u1 n -- u2 core +rshift u1 n -- u2 core r_shift u2 = u1>>n; : 0 ?DO 2/ MAXI and LOOP ; -lshift u1 n -- u2 core +lshift u1 n -- u2 core l_shift u2 = u1< $2 -- f $7 $3different +$1<> $2 -- f $7 $3not_equals f = FLAG($4!=$5); : [ char $1x char 0 = [IF] @@ -844,7 +845,7 @@ f = FLAG($4!=$5); ] xor 0<> [ [THEN] ] ; -$1< $2 -- f $8 $3less +$1< $2 -- f $8 $3less_than f = FLAG($4<$5); : [ char $1x char 0 = [IF] @@ -856,7 +857,7 @@ f = FLAG($4<$5); [THEN] [THEN] ] ; -$1> $2 -- f $9 $3greater +$1> $2 -- f $9 $3greater_than f = FLAG($4>$5); : [ char $1x char 0 = [IF] ] negate [ [ELSE] ] swap [ [THEN] ] @@ -888,21 +889,21 @@ f = FLAG($4.lo==$5.lo && $4.hi==$5.hi); f = FLAG($4==$5); #endif -$1<> $2 -- f $7 $3different +$1<> $2 -- f $7 $3not_equals #ifdef BUGGY_LONG_LONG f = FLAG($4.lo!=$5.lo || $4.hi!=$5.hi); #else f = FLAG($4!=$5); #endif -$1< $2 -- f $8 $3less +$1< $2 -- f $8 $3less_than #ifdef BUGGY_LONG_LONG f = FLAG($4.hi==$5.hi ? $4.lo<$5.lo : $4.hi<$5.hi); #else f = FLAG($4<$5); #endif -$1> $2 -- f $9 $3greater +$1> $2 -- f $9 $3greater_than #ifdef BUGGY_LONG_LONG f = FLAG($4.hi==$5.hi ? $4.lo>$5.lo : $4.hi>$5.hi); #else @@ -1025,7 +1026,7 @@ swap w1 w2 -- w2 w1 core >r (swap) ! r> (swap) @ ; Variable (swap) -dup w -- w w core +dup w -- w w core dupe : sp@ @ ; @@ -1348,11 +1349,14 @@ f_addr = (Float *)((((Cell)c_addr)+(size [ 1 floats 1- ] Literal + [ -1 floats ] Literal and ; >body xt -- a_addr core to_body +"" Get the address of the body of the word represented by @i{xt} (the address +of the word's data field)."" a_addr = PFA(xt); : 2 cells + ; -\+standardthreading +\ threading stuff is currently only interesting if we have a compiler +\fhas? standardthreading has? compiler and [IF] >code-address xt -- c_addr gforth to_code_address ""@i{c-addr} is the code address of the word @i{xt}."" @@ -1414,7 +1418,7 @@ n=1; : 1 ; -\+ +\f[THEN] key-file wfileid -- n gforth paren_key_file #ifdef HAS_FILE @@ -1661,18 +1665,19 @@ else { } \+ -\+file write-file c_addr u1 wfileid -- wior file write_file /* !! fwrite does not guarantee enough */ +#ifdef HAS_FILE { UCell u2 = fwrite(c_addr, sizeof(Char), u1, (FILE *)wfileid); wior = FILEIO(u2f f+ f/ f+ f2/ ; -fcosh r1 -- r2 float-ext +fcosh r1 -- r2 float-ext f_cosh r2 = cosh(r1); : fexp fdup 1/f f+ f2/ ; -ftanh r1 -- r2 float-ext +ftanh r1 -- r2 float-ext f_tan_h r2 = tanh(r1); : f2* fexpm1 fdup 2. d>f f+ f/ ; -fasinh r1 -- r2 float-ext +fasinh r1 -- r2 float-ext f_a_cinch r2 = asinh(r1); : fdup fdup f* 1. d>f f+ fsqrt f/ fatanh ; -facosh r1 -- r2 float-ext +facosh r1 -- r2 float-ext f_a_cosh r2 = acosh(r1); : fdup fdup f* 1. d>f f- fsqrt f+ fln ; -fatanh r1 -- r2 float-ext +fatanh r1 -- r2 float-ext f_a_tan_h r2 = atanh(r1); : fdup f0< >r fabs 1. d>f fover f- f/ f2* flnp1 f2/ @@ -2177,3 +2182,12 @@ UP=up=(char *)a_addr; : up ! ; Variable UP + +wcall u -- gforth +IF_FTOS(fp[0]=FTOS); +FP=fp; +sp=(SYSCALL(Cell(*)(Cell *, void *))u)(sp, &FP); +fp=FP; +IF_TOS(TOS=sp[0];) +IF_FTOS(FTOS=fp[0]); +