--- gforth/prim 2012/03/17 23:38:36 1.269 +++ gforth/prim 2012/10/08 22:45:19 1.279 @@ -1109,7 +1109,7 @@ if (u1 select ; umin ( u1 u2 -- u ) core if (u1 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 @@ -1516,6 +1528,17 @@ c_addr2 = c_addr1+1; : 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 \+f83headerstring @@ -1700,7 +1723,7 @@ wfileid = (Cell)stderr; \+os -form ( -- urows ucols ) gforth +(form) ( -- urows ucols ) gforth paren_form ""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 this reflects the actual size and changes with the window size @@ -1735,6 +1758,10 @@ FLUSH_ICACHE((caddr_t)c_addr,u); (bye) ( n -- ) gforth paren_bye SUPER_END; +gforth_FP=fp; +gforth_SP=sp; +gforth_RP=rp; +gforth_LP=lp; return (Label *)n; (system) ( c_addr u -- wretval wior ) gforth paren_system @@ -2026,7 +2053,7 @@ free(string); newline ( -- c_addr u ) gforth ""String containing the newline sequence of the host OS"" -char newline[] = { +static const char newline[] = { #if DIRSEP=='/' /* Unix */ '\n' @@ -2075,7 +2102,7 @@ clock_gettime(CLOCK_REALTIME,&time1); #else struct timeval time2; gettimeofday(&time2,NULL); -time1.tv_sec = time2.tv_sec;1 +time1.tv_sec = time2.tv_sec; time1.tv_nsec = time2.tv_usec*1000; #endif dtime = timespec2ns(&time1); @@ -2262,7 +2289,7 @@ representation. If the string represents 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); +flag = to_float(c_addr, u, &r, '.'); if (flag) { fp--; fp[0]=r; @@ -2359,8 +2386,7 @@ CLOBBER_TOS_WORKAROUND_END; fsincos ( r1 -- r2 r3 ) float-ext f_sine_cos ""@i{r2}=sin(@i{r1}), @i{r3}=cos(@i{r1})"" CLOBBER_TOS_WORKAROUND_START; -r2 = sin(r1); -r3 = cos(r1); +sincos(r1, &r2, &r3); CLOBBER_TOS_WORKAROUND_END; fsqrt ( r1 -- r2 ) float-ext f_square_root @@ -2458,6 +2484,29 @@ faxpy(ra, f_x, nstridex, f_y, nstridey, fdup dup f@ f* over + 2swap dup f@ f+ dup f! over + 2swap 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 @@ -2780,7 +2829,20 @@ ip=IP; SUPER_END; 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 ifdef(`STACK_CACHE_FILE',