[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / recursive.pir
blob8a541218c7f18f70f72f964dabd3f8f4804ed478
1 #!./parrot
2 # Copyright (C) 2006-2009, Parrot Foundation.
3 # $Id$
5 # Ack by Leopold Toetsch
6 # Fib and Tak by Joshua Isom
7 # modified default value to n=3. Karl Forner
8 # ./parrot -Oc -R cgp-jit recursive.pir N
10 .sub main :main
11         .param pmc argv
12         .local int argc, n
13         argc = argv
14         n = 3
15         unless argc == 2 goto argsok
16         $S0 = argv[1]
17         n = $S0
18 argsok:
19     $P0 = getinterp
20     $P0.'recursion_limit'(100000)
22         .local pmc array
23         array = new 'FixedFloatArray'
24         array = 11
26         dec n
28         $I0 = n + 1
29         $I1 = ack(3, $I0)
30         array[0] = $I0
31         array[1] = $I1
33         $N0 = 28.0 + n
34         array[2] = $N0
35         $N0 = FibNum($N0)
36         array[3] = $N0
38         $I0 = n * 3
39         $I1 = n * 2
40         array[4] = $I0
41         array[5] = $I1
42         array[6] = n
43         $I0 = TakInt($I0, $I1, n)
44         array[7] = $I0
46         $I0 = FibInt(3)
47         array[8] = $I0
49         $N0 = TakNum(3.0, 2.0, 1.0)
50         array[9] = $N0
52         $S0 = sprintf <<"END", array
53 Ack(3,%d): %d
54 Fib(%.1f): %.1f
55 Tak(%d,%d,%d): %d
56 Fib(3): %d
57 Tak(3.0,2.0,1.0): %.1f
58 END
59         print $S0
60 .end
62 .sub ack
63         .param int x
64         .param int y
65         if x goto a1
66         $I0 = y + 1
67         .return ($I0)
68 a1:
69         if y goto a2
70         $I0 = x - 1
71         $I1 = 1
72         .tailcall ack($I0, $I1)
73 a2:
74         $I2 = y - 1
75         $I3 = ack(x, $I2)
76         $I4 = x - 1
77         .tailcall ack($I4, $I3)
78 .end
80 .sub FibInt
81         .param int n
82         unless n < 2 goto endif
83         .return(1)
84 endif:
85         .local int tmp
86         tmp = n - 2
87         $I0 = FibInt(tmp)
88         tmp = n - 1
89         $I1 = FibInt(tmp)
90         $I0 += $I1
91         .return($I0)
92 .end
94 .sub FibNum
95         .param num n
96         unless n < 2 goto endif
97         .return(1.0)
98 endif:
99         .local num tmp
100         tmp = n - 2
101         $N0 = FibNum(tmp)
102         tmp = n - 1
103         $N1 = FibNum(tmp)
104         $N0 += $N1
105         .return($N0)
106 .end
108 .sub TakNum
109         .param num x
110         .param num y
111         .param num z
112         unless y >= x goto endif
113         .return(z)
114 endif:
115         .local num tmp
116         tmp = x - 1.0
117         $N0 = TakNum(tmp, y, z)
118         tmp = y - 1.0
119         $N1 = TakNum(tmp, z, x)
120         tmp = z - 1.0
121         $N2 = TakNum(tmp, x, y)
122         .tailcall TakNum($N0, $N1, $N2)
123 .end
125 .sub TakInt
126         .param int x
127         .param int y
128         .param int z
129         unless y >= x goto endif
130         .return(z)
131 endif:
132         .local int tmp
133         tmp = x - 1
134         $I0 = TakInt(tmp, y, z)
135         tmp = y - 1
136         tmp = TakInt(tmp, z, x)
137         dec z
138         z = TakInt(tmp, x, y)
139         .tailcall TakInt($I0, tmp, z)
140 .end
143 # Local Variables:
144 #   mode: pir
145 #   fill-column: 100
146 # End:
147 # vim: expandtab shiftwidth=4 ft=pir: