--- gforth/prim 2012/07/23 13:27:47 1.274 +++ gforth/prim 2012/12/31 15:25:18 1.280 @@ -1,6 +1,6 @@ \ Gforth primitives -\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -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 @@ -1734,11 +1757,11 @@ cache."" 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; -SUPER_END; return (Label *)n; (system) ( c_addr u -- wretval wior ) gforth paren_system @@ -2079,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); @@ -2475,6 +2498,15 @@ if (flag) { 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