[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / pidigits.pir
blob613136a76b980ec06d7d0cbe518e62365eaafc75
1 #!./parrot -R cgp
2 # Copyright (C) 2005-2009, Parrot Foundation.
3 # $Id$
5 # pidigits N  (N = 1000 for shootout)
7 # this requires libgmp (GMP) on the machine
9 # by Leopold Toetsch
10 # not really optimized yet
11 # modified by Karl Forner to set a default value of N=27 (shootout test default)
13 #def gen_x():
14 #    return imap(lambda k: (k, 4*k + 2, 0, 2*k + 1), count(1))
16 .sub count
17     .param pmc start
18 loop:
19     .yield(start)
20     inc start
21     goto loop
22 .end
24 .sub gen_x
25     .param pmc start
26     .local pmc k
27 loop:
28     k = count(start)
29     $P0 = k + 0
30     $P1 = k * 4
31     inc $P1
32     inc $P1
33     $P2 = new 'Integer'
34     $P3 = k * 2
35     inc $P3
36     .yield ($P0, $P1, $P2, $P3)
37     goto loop
38 .end
40 #def compose((aq, ar, as_, at), (bq, br, bs, bt)):
41 #    return (aq * bq,
42 #            aq * br + ar * bt,
43 #            as_ * bq + at * bs,
44 #            as_ * br + at * bt)
46 .sub "compose"
47     .param pmc aq
48     .param pmc ar
49     .param pmc as
50     .param pmc at
51     .param pmc bq
52     .param pmc br
53     .param pmc bs
54     .param pmc bt
55     $P0 = aq * bq
56     $P1 = aq * br
57     $P12 = ar * bt
58     $P1 = $P1 + $P12
59     $P2 = as * bq
60     $P22 = at * bs
61     $P2 = $P2 + $P22
62     $P3 = as * br
63     $P32 = at * bt
64     $P3 =  $P3 + $P32
65     .return ($P0, $P1, $P2, $P3)
66 .end
68 #def extract((q, r, s, t), j):
69 #    return (q*j + r) // (s*j + t)
71 .sub extract
72     .param pmc q
73     .param pmc r
74     .param pmc s
75     .param pmc t
76     .param pmc j
77     $P0 = q * j
78     $P0 = $P0 + r
79     $P1 = s * j
80     $P1 = $P1 + t
81     $P0 = $P0 // $P1
82     .return ($P0)
83 .end
85 #def pi_digits():
87 #    z = (1, 0, 0, 1)
88 #    x = gen_x()
90 .sub pi_digits
91     .local pmc x0,x1,x2,x3, y, z0,z1,z2,z3, one, three, four
92     z0 = new 'Integer'
93     z0 = 1
94     z1 = new 'Integer'
95     z2 = new 'Integer'
96     z3 = new 'Integer'
97     z3 = 1
98     one = new 'Integer'
99     one = 1
100     three = new 'Integer'
101     three = 3
102     four = new 'Integer'
103     four = 4
104 #    while 1:
105 #        y = extract(z, 3)
106 loop1:
107         y = extract(z0, z1, z2, z3, three)
109 #        while y != extract(z, 4):
110 loop2:
111             $P0 = extract(z0, z1, z2, z3, four)
112             if y == $P0 goto end_loop2
114 #            z = compose(z, x.next())
115             ($P1, $P2, $P3, $P4) = gen_x(one)
116             (z0, z1, z2, z3) = "compose"(z0, z1, z2, z3, $P1, $P2, $P3, $P4)
118 #            y = extract(z, 3)
119             y = extract(z0, z1, z2, z3, three)
120         goto loop2
121 end_loop2:
122 #        z = compose((10, -10*y, 0, 1), z)
123 #        yield y
124         $P5 = new 'Integer'
125         $P5 = 10
126         $P6 = new 'Integer'
127         $P6 = -10
128         $P6 = $P6 * y
129         $P7 = new 'Integer'
130         $P8 = new 'Integer'
131         $P8 = 1
132         (z0, z1, z2, z3) = "compose"($P5, $P6, $P7, $P8, z0, z1, z2, z3)
133         .yield (y)
134     goto loop1
135 .end
137 #def main():
138 #    n = int(sys.argv[1])
139 #    digits = pi_digits()
140 #    width = 10
141 #    for i in xrange(width, n+1, width):
142 #        print "%s\t:%d" % ("".join(imap(str, islice(digits, width))), i)
143 #    if n % width > 0:
144 #        print "%s\t:%d" % ("".join(imap(str, islice(digits, n % width))).ljust(width), n)
146 #main()
148 .sub main :main
149         .param pmc argv
150         .local int argc, i, N, width
152         N = 27
153         argc = argv
154         if argc == 1 goto default
155         $S0 = argv[1]
156         N = $S0
157 default:
158      width = 10
159     null i
160 loop:
161     $P0 = pi_digits()
162     print $P0
163     inc i
164     $I0 = i % width
165     if $I0 goto n
166     print "\t:"
167     print i
168     print "\n"
170     if i < N goto loop
171     $I0 = i % width
172     unless $I0 goto done
173     $I0 = width - $I0
174 rest:
175         print " "
176         dec $I0
177         if $I0 goto rest
178     print "\t:"
179     print N
180     print "\n"
181 done:
182 .end
185 # Local Variables:
186 #   mode: pir
187 #   fill-column: 100
188 # End:
189 # vim: expandtab shiftwidth=4 ft=pir: