.machine ppc .globl _profile ;; unsigned int profile(void (*fp)(int), int arg) ;; r3->r0: fp: 関数ポインタ ;; r4: int arg _profile: mr r0, r3 ; ポインタを別のレジスタにコピー mr r3, r4 ; 計測する関数の第一引数にする ;; レジスタをスタックに退避 mftb r4 ; タイムベースレジスタ stwu r0, -4(r1) stwu r3, -4(r1) stwu r4, -4(r1) mflr r12 ; リンクレジスタ stwu r12, -4(r1) ;; 関数呼び出し mtctr r0 ; カウントレジスタに関数ポインタをコピー bctrl ;; レジスタをスタックから復帰 lwz r12, 0(r1) mtlr r12 lwzu r4, 4(r1) lwzu r3, 4(r1) lwzu r0, 4(r1) addi r1, r1, 4 ;; 実行時間を返す mftb r3 ; 関数呼び出し後のタイムベースレジスタ sub r3, r3, r4 blr