[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / nsieve.pir
blobed901859c97cf1a99b2f7e4bbe3cea6c45ae660b
1 #!./parrot
2 # Copyright (C) 2006-2009, Parrot Foundation.
3 # $Id$
5 # ./parrot -R jit nsieve.pir N  (N = 9 for shootout)
6 # by Leopold Toetsch
7 # modified by Joshua Isom
8 # modified by Karl Forner to accept shootout default value of N=2
10 .sub primes_in_range
11         .param int M
12         .param pmc flags
13     .local int i, count
14         flags."fill"(1)
15         i = 2
16         count = 0
17 lp1:
18      $I0 = flags[i]
19      unless $I0 goto not_p
20      .local int j
21      j = i + i
22      if j >= M goto done
23 lp2:
24      flags[j] = 0
25      j += i
26      if j < M goto lp2
27 done:
28      inc count
29 not_p:
30          inc i
31      if i < M goto lp1
32     .return (count)
33 .end
35 .sub main :main
36     .param pmc argv
37         .local pmc flags
38         .local int argc, i, j, N, M, count
40         flags = new 'FixedBooleanArray'
41         N = 2
42         argc = argv
43         if argc == 1 goto default
44     $S0 = argv[1]
45         N = $S0
46 default:
47     M = 1 << N
48     M *= 10000
49         flags = M
50     null i
51     null j
52 loop:
53     $I0 = N - j
54     inc j
55     $I1 = 1 << $I0
56     M = $I1 * 10000
57         count = primes_in_range(M, flags)
58     $P0 = new 'FixedIntegerArray'
59     $P0 = 2
60     $P0[0] = M
61     $P0[1] = count
62     $S0 = sprintf "Primes up to %8u %8u\n", $P0
63     print $S0
64     inc i
65         if i < 3 goto loop
66 .end
69 # Local Variables:
70 #   mode: pir
71 #   fill-column: 100
72 # End:
73 # vim: expandtab shiftwidth=4 ft=pir: