-
Notifications
You must be signed in to change notification settings - Fork 138
/
oofib.pir
122 lines (110 loc) · 1.84 KB
/
oofib.pir
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# $Id$
.sub bench :main
.param pmc argv
.local int argc
argc = argv
.local pmc N
N = new 'Integer'
N = 28
if argc <= 1 goto noarg
$S0 = argv[1]
N = $S0
noarg:
.local num start
time start
.local pmc A
.local pmc B
.local pmc b
A = newclass "A"
B = subclass A, "B"
b = new "B"
.local pmc r
r = b."fib"(N)
.local num fin
time fin
print "fib("
print N
print ") = "
print r
print " "
sub fin, start
print fin
print "s\n"
end
.end
.namespace ["A"]
.sub fib :method
.param pmc n
if n >= 2 goto rec
.begin_return
.return n
.end_return
rec:
.local pmc n1
.local pmc n2
.local pmc r1
.local pmc r2
n1 = new 'Integer'
n2 = new 'Integer'
n1 = n - 1
n2 = n - 2
r1 = self."fibA"(n1)
r2 = self."fibB"(n2)
n = new 'Integer'
n = r1 + r2
.begin_return
.return n
.end_return
.end
.sub fibA :method
.param pmc n
if n >= 2 goto rec
.begin_return
.return n
.end_return
rec:
.local pmc n1
.local pmc n2
.local pmc r1
.local pmc r2
n1 = new 'Integer'
n2 = new 'Integer'
n1 = n - 1
n2 = n - 2
r1 = self."fib"(n1)
r2 = self."fibB"(n2)
n = new 'Integer'
n = r1 + r2
.begin_return
.return n
.end_return
.end
.namespace ["B"]
.sub fibB :method
.param pmc n
if n >= 2 goto rec
.begin_return
.return n
.end_return
rec:
.local pmc n1
.local pmc n2
.local pmc r1
.local pmc r2
n1 = new 'Integer'
n2 = new 'Integer'
n1 = n - 1
n2 = n - 2
r1 = self."fib"(n1)
r2 = self."fibA"(n2)
n = new 'Integer'
n = r1 + r2
.begin_return
.return n
.end_return
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: