1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        .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