I find the following code sefaults in gc, around N=18.
What am I overlooking...??
Thanks,
Mitchell
.sub _main
.param pmc argv
.sym int argc
argc = argv
.sym int N
N = 24
if argc <= 1 goto noarg
$S0 = argv[1]
N = $S0
noarg:
.sym float start
time start
.local pmc A
.local pmc B
.local pmc obj
newclass A, "A"
subclass B, A, "B"
find_type $I0, "B"
new obj, $I0
.local pmc retc1
newsub retc1, .RetContinuation, label1
.pcc_begin prototyped
.arg N
.invocant obj
.meth_call "fibA", retc1
label1:
.local int r
.result r
.pcc_end
.sym float fin
time fin
print "fib("
print N
print ") = "
print r
print " "
sub fin, start
print fin
print "s\n"
end
.end
.namespace [ "A" ]
.sub fibA method
.param int n
if n >= 2 goto rec
.pcc_begin_return
.return n
.pcc_end_return
rec:
.sym int n1
.sym int n2
.sym int r1
.sym int r2
n1 = n - 1
n2 = n - 2
.local pmc retc2
newsub retc2, .RetContinuation, label2
.pcc_begin prototyped
.arg n1
.invocant self
.meth_call "fibB", retc2
label2:
.result r1
.pcc_end
.local pmc retc3
newsub retc3, .RetContinuation, label3
.pcc_begin prototyped
.arg n2
.invocant self
.meth_call "fibB", retc3
label3:
.result r2
.pcc_end
n = r1 + r2
.pcc_begin_return
.return n
.pcc_end_return
.end
.namespace [ "B" ]
.sub fibB method
.param int n
if n >= 2 goto rec
.pcc_begin_return
.return n
.pcc_end_return
rec:
.sym int n1
.sym int n2
.sym int r1
.sym int r2
n1 = n - 1
n2 = n - 2
.local pmc retc4
newsub retc4, .RetContinuation, label4
.pcc_begin prototyped
.arg n1
.invocant self
.meth_call "fibA", retc4
label4:
.result r1
.pcc_end
.local pmc retc5
newsub retc5, .RetContinuation, label5
.pcc_begin prototyped
.arg n2
.invocant self
.meth_call "fibA", retc5
label5:
.result r2
.pcc_end
n = r1 + r2
.pcc_begin_return
.return n
.pcc_end_return
.end