Next: Assembly Writing Guide, Previous: Assembly Software Pipelining, Up: Assembly Coding [Index]
ループ展開は,複数のリムを各ループで処理するコードを複製することでできるようになります。 ループのオーバーヘッドを展開した分だけ減らすことができるは当然として,他にも例えばレジスタを他と組み合わせて使うことで,もっと有効活用できるようになることも期待できます。
展開する分量は,1回回るごとにN減らされるループカウンタを用いて制御します。停止するのは,残りのループカウンタがNより小さくなった時です。もしくは,開始時にNを差し引き,停止条件はループカウンタCがゼロより小さくなった時とします(残っているリムの数はC+Nになります)。
別のやり方としては,2のべき乗の場合は,ループカウンタや残り数はシフトとマスクの処理だけで計算することもできます。大規模なループの真ん中にジャンプする場合にも便利に使えます。
リムは多重ループ展開ではないので,様々なやり方で制御できます。例えば下記のようにします。
switch
文を使用して,起こりうるケースに対して別々のコードを書く。例えば8リムのループ展開に対しては,あまりなし,1あまり,・・・,7あまり,まで対応したコードを書く。大量のコードが必要になりますが,深くパイプライン化したループを組み合わせたものに対しては,全てのケースに対して最適化を行える最良の方法です。