!!! Sieve of Eratosthenes Benchmark
----------------------------------------
from Sieve of Eratosthenes Benchmark Page
http://www.bagley.org/~doug/shootout/bench/sieve/sieve.gforth
With many annotations
http://www.bagley.org/~doug/shootout/bench/sieve/alt/ann.sieve.forth
gives wrong result in XFORTH, have to investigate
---------------------------------------
{{{
DECIMAL
8192 CONSTANT SIZE
1 VARIABLE FLAGS SIZE 2 - ALLOT
FLAGS SIZE + CONSTANT ENDFLAGS
: FLAGMULTS ( n toaddr fromaddr -- )
DO
0 I C! DUP
+LOOP ;
: PRIMES ( -- n )
FLAGS SIZE -1 FILL
0 2
ENDFLAGS FLAGS
DO
I C@
IF
DUP I + DUP ENDFLAGS <
IF
ENDFLAGS SWAP FLAGMULTS
ELSE
DROP
THEN
SWAP 1+ SWAP
THEN
1+
LOOP
DROP ;
}}}
---------------------------------------------------
Original BYTE FORTH Benchmark
http://www-personal.umich.edu/~williams/archive/forth/utilities/byteprimes.fs.html
{{{
( Eratosthenes sieve benchmark )
( original BYTE benchmark )
8190 CONSTANT SIZE
-1 VARIABLE FLAGS SIZE ALLOT
: PRIMES
FLAGS SIZE -1 FILL
0 SIZE 0 DO
I FLAGS + C@ IF
I 2 * 3 + DUP I + BEGIN
DUP SIZE < WHILE
DUP FLAGS + 0 SWAP C! OVER +
REPEAT DROP DROP 1+
THEN LOOP ;
}}}
---------------------------------------------------
from GNU Forth distribution (Bernd Paysan)
http://www.jwdt.com/~paysan/gforth.html
{{{
( Sieve by bernd paysan )
DECIMAL
-1 VARIABLE FLAGS 8190 ALLOT
FLAGS 8190 + CONSTANT EFLAG
: PRIMES ( -- n )
FLAGS 8190 -1 FILL 0 3 EFLAG FLAGS
DO I C@
IF DUP I + DUP EFLAG <
IF EFLAG SWAP
DO 0 I C! DUP +LOOP
ELSE DROP THEN SWAP 1+ SWAP
THEN 2 +
LOOP DROP ;
}}}