[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / ack.pir
blobbe5f9cdebf535a560d0459e68abf8735d6802924
1 #!./parrot
2 # Copyright (C) 2005-2009, Parrot Foundation.
3 # $Id$
4 # OUTPUT="Ack(3, 9) = 4093\n"
6 # ./parrot -Oc -R cgp-jit
7 # RQ (Karl)
8 # Seems to be an old benchmark, now deprecated by the shootout
10 # ackermann - ack(3, 9) is default
11 # shootout runs ack(3, 11)
12 # time for ack(3,11):  0.8s (AMD X2@2000)
13 # by Leopold Toetsch
15 .sub main :main
16     .param pmc argv
17     .local int argc
18     argc = elements argv
19     .local int x, y, r
20     x = 3
21     y = 7
22     if argc == 1 goto go
23     $S0 = argv[1]
24     if argc == 2 goto xdefault
25     x = $S0
26     $S0 = argv[2]
27     y = $S0
28     goto go
29 xdefault:
30     y = $S0
31 go:
32     $P0 = getinterp
33     $P0.'recursion_limit'(100000)
34     r = ack(x, y)
35     .local pmc args
36     args = new 'ResizableIntegerArray'
37     push args, x
38     push args, y
39     push args, r
40     $S0 = sprintf "Ack(%d, %d) = %d\n", args
41     print $S0
42 .end
44 .sub ack
45     .param int x
46     .param int y
47     if x goto a1
48         $I0 = y + 1
49         .return ($I0)
50 a1:
51     if y goto a2
52         $I0 = x - 1
53         $I1 = 1
54         .tailcall ack($I0, $I1)
55 a2:
56     $I2 = y - 1
57     $I3 = ack(x, $I2)
58     $I4 = x - 1
59     .tailcall ack($I4, $I3)
60 .end
62 # Local Variables:
63 #   mode: pir
64 #   fill-column: 100
65 # End:
66 # vim: expandtab shiftwidth=4 ft=pir: