mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-23 20:05:32 +02:00
Implement a correct generation of Fibonacci numbers.
* doc/body.texi: Change documentation to no longer say it is a variant of the Fibonacci sequence, and document a proper implementation. Thanks to Jon Arintok for pointing out that the Fibonacci sequence generation was incorrect. It was documented, but still confusing. * check/fib.tst, check/fib.ok, check/bp.tst, check/bp.ok, doc/ifib.c, doc/rbif.c: Implement a proper Fibonacci sequence implementation.
This commit is contained in:
parent
fd57359498
commit
76876dd7bf
9 changed files with 80 additions and 65 deletions
|
@ -1 +1 @@
|
|||
nfibs(32) = 7049155
|
||||
nfibs(32) = 2178309
|
||||
|
|
16
check/bp.tst
16
check/bp.tst
|
@ -9,9 +9,11 @@ fmt:
|
|||
rfibs:
|
||||
prolog
|
||||
arg $in
|
||||
getarg %v0 $in /* V0 = N */
|
||||
|
||||
blti_u out %v0 2
|
||||
getarg %r0 $in /* R0 = N */
|
||||
beqi out %r0 0
|
||||
movr %v0 %r0 /* V0 = R0 */
|
||||
movi %r0 1
|
||||
blei_u out %v0 2
|
||||
subi %v1 %v0 1 /* V1 = N-1 */
|
||||
subi %v2 %v0 2 /* V1 = N-2 */
|
||||
prepare
|
||||
|
@ -21,12 +23,10 @@ rfibs:
|
|||
prepare
|
||||
pushargr %v2
|
||||
finishi rfibs
|
||||
retval %v2 /* V2 = rfibs(N-2) */
|
||||
addi %v1 %v1 1
|
||||
addr %r0 %v1 %v2
|
||||
retr %r0
|
||||
retval %r0 /* R0 = rfibs(N-2) */
|
||||
addr %r0 %r0 %v1
|
||||
out:
|
||||
reti 1
|
||||
retr %r0
|
||||
epilog
|
||||
|
||||
name main
|
||||
|
|
|
@ -1 +1 @@
|
|||
nfibs(32) = 7049155
|
||||
nfibs(32) = 2178309
|
||||
|
|
|
@ -9,19 +9,21 @@ format:
|
|||
nfibs:
|
||||
prolog
|
||||
arg $in
|
||||
getarg %r2 $in // R2 = n
|
||||
movi %r1 1
|
||||
blti_u ref %r2 2
|
||||
subi %r2 %r2 1
|
||||
getarg %r0 $in // R0 = n
|
||||
beqi ref %r0 0
|
||||
movr %r1 %r0
|
||||
movi %r0 1
|
||||
blti_u ref %r1 2
|
||||
subi %r2 %r1 2
|
||||
movr %r1 %r0
|
||||
loop:
|
||||
subi %r2 %r2 1 // decr. counter
|
||||
addr %v0 %r0 %r1 // V0 = R0 + R1
|
||||
movr %r0 %r1 // R0 = R1
|
||||
addi %r1 %v0 1 // R1 = V0 + 1
|
||||
movr %v0 %r0 // V0 = R0
|
||||
addr %r0 %r0 %r1 // R0 = R0 + R1
|
||||
movr %r1 %v0 // R1 = V0
|
||||
bnei loop %r2 0 // if (R2) goto loop
|
||||
ref:
|
||||
retr %r1 // RET = R1
|
||||
retr %r0 // RET = R0
|
||||
epilog
|
||||
|
||||
name main
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue