aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/examples/sieve.frt
blob: 13c45f2290f8467d04a5a8f53ec8be5e2972c3ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
\ sieve benchmark, modified version of
\ marcel hendrix' sources. Uses single bits
\ insted of whole bytes to store the is-prime
\ marker cuts memory footprint to 1/8th.

\ runtime: ATMega644 @ 16MHz 2,3 seconds per DO-PRIME

marker _sieve_

decimal

1000 constant #times
8192 constant size   \ needs 1KB 

variable flags  size 8 / allot

\ highly un-optimized words
: bit-addr ( addr bit -- eff-addr )
    \ every byte has 8 bits. addr = addr + (bit >> 3)
    3 rshift  ( -- addr off)
    +         ( -- eff-addr)
;

: bit? ( addr bit -- f )
    swap over bit-addr swap ( -- eff-addr bit )
    7 and 1 swap lshift     ( -- eff-addr bitmask)
    swap c@ and             ( -- f)
;

: bit-reset ( addr bit -- )
    swap over bit-addr swap ( -- eff-addr bit )
    7 and 1 swap lshift     ( -- eff-addr bitmask)
    invert over c@ and swap c!     
;

: 2drop drop drop ;

: DO-PRIME      flags [ size 8 / ] literal -1 fill
                0  size 0 do 
		         flags i
                         bit? if 
			    i 2*  3 +
                            dup  i +
                            begin  
				dup 
				size u< 
			     while  
			       flags over bit-reset
                               over +
                             repeat
                             2drop 1+
                          then
                        loop ;

: primes        cr #times u. ."  iterations." 
                0 #times 0 do  drop  DO-PRIME  loop
                cr .  ."  primes found, " ;