フィボナッチ数列

レポートとは関係なく、対数時間でフィボナッチ数列を計算するプログラムをPPCアセンブリで書いてみた。
PPCアセンブリがあまりにも読みにくくて、ちょっと好きになれなかったのだけどまあまあ書けるようになった。

	.text
	.align 2
	.globl _fib_fast
_fib_fast:
	mflr r0
	stw r0, 8(r1)
	mfcr r0
	stw r0, 4(r1)

	stwu r1, -64(r1)

	mr r8, r3
	li r3, 1
	li r4, 0
	li r5, 1
	li r6, 1
	li r7, 0

fib_iter:
	cmpi cr7, r8, 0
	beq cr7, RET
	andi. r9, r8, 0x00000001
	cmpi cr7, r9, 1
	beq cr7, call_odd	# if r9%2 == 1
	b call_even

call_even:
	mullw r9, r5, r5
	mullw r10, r6, r6
	add r11, r9, r10
	add r9, r5, r7
	mullw r6, r9, r6
	mullw r9, r7, r7
	add r7, r9, r10
	mr r5, r11
	srawi r8, r8, 1
	b fib_iter

call_odd:
	mullw r9, r3, r5
	mullw r10, r4, r6
	add r11, r9, r10
	mullw r9, r3, r6
	mullw r10, r4, r7
	add r4, r9, r10
	mr r3, r11
	subi r8, r8, 1
	b fib_iter

RET:
	mr r3, r4

	la r1, 64(r1)
	lwz r0, 4(r1)
	mtcr r0
	lwz r0, 8(r1)
	mtlr r0
	blr