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

Reply via email to