フィボナッチ数列
レポートとは関係なく、対数時間でフィボナッチ数列を計算するプログラムを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