スタックの使用での問題
(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 件のコメント:
コメントを投稿