2016年1月7日木曜日

[gcc, spu] spu版gcc最適化問題(6)

2004年作成

スタックの使用での問題


(a) 使用するレジスタ数が多くなってくるとスタックに一旦ストアしますが、その読み込んだ後のレジスタ効率が悪化します。

                               lqd $21,32($sp)
    absdb $28,$108,$78         lqd $2,32($sp)
                               lqd $15,160($sp)
                               shufb $107,$17,$105,$101
    absdb $105,$58,$76         stqd $94,1648($sp)
    absdb $17,$55,$81          stqd $102,2544($sp)
    absdb $81,$50,$81          shufb $94,$7,$35,$101
    absdb $40,$21,$107         shufb $102,$31,$12,$101
    absdb $33,$2,$11           stqd $162,2560($sp)

$21も$2も同じメモリから読み込んでいるので、別のレジスタに割り当てる必要はありません。
以下のように$21に統合可能です。

                               lqd $21,32($sp)
    absdb $28,$108,$78         lqd $15,160($sp)
                               shufb $107,$17,$105,$101
    absdb $105,$58,$76         stqd $94,1648($sp)
    absdb $17,$55,$81          stqd $102,2544($sp)
    absdb $81,$50,$81          shufb $94,$7,$35,$101
    absdb $40,$21,$107         shufb $102,$31,$12,$101
    absdb $33,$21,$11          stqd $162,2560($sp)

(b) ストア-ロード処理ではなくコピーで済ませることができる命令がある。

    absdb $124,$71,$116        stqd $6,1856($sp)
    absdb $59,$36,$82          stqd $72,1536($sp)
                               shufb $72,$61,$75,$84
                               lqd $12,240($sp)
                               lqd $20,32($sp)
                               lqd $21,1856($sp) ← (*)
    absdb $87,$44,$72          stqd $74,592($sp)  
    nop                        shufb $74,$31,$102,$111
(*)のロード命令は以下のようにコピー命令に置換できます。

    absdb $124,$71,$116        stqd $6,1856($sp)
    absdb $59,$36,$82          stqd $72,1536($sp)
    ori $21,$72,0              shufb $72,$61,$75,$84
                               lqd $12,240($sp)
                               lqd $20,32($sp)
    absdb $87,$44,$72          stqd $74,592($sp)  
    nop                        shufb $74,$31,$102,$111

(c) 無駄なストア処理が存在する。

    il $43, 0                  lqd $56,0($88)
        :
                               stqd $43,112($sp)  ← 意味なし
        :
    ah $119,$120,$12           stqd $63,112($sp)
    andi $57,$115,15           lqd $18,112($sp)

(d)一つのレジスタで済ませられるものがある。

                               stqd $32,4816($sp)
    nop                        lqd $27,4816($sp)
    clgth $20,$24,$25          lqd $23,4816($sp)
                        :
                               shlqbyi $22,$27,2
                               shufb $14,$15,$79,$16
    selb $17,$23,$22,$20       shlqbyi $19,$26,2

$27,$23共に$32に置き換えることが可能です。

    clgth $20,$24,$25
                        :
                               shlqbyi $22,$32,2
                               shufb $14,$15,$79,$16
    selb $17,$32,$22,$20       shlqbyi $19,$26,2


0 件のコメント:

コメントを投稿