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 ;