DO <ofst12> UNTIL CE; // 回数指定ループ DO <ofst12> UNTIL FOREVER; // 無限ループ DO <ofst12>; // 無限ループの省略形
// 24回まわすループの例 CNTR = 24; // 回数指定 DO loop_bottom UNTIL CE; // CE は "Counter Expired" の略 AX0 = DM( I0+=1 ); // ここからがループ・ボディー AY0 = DM( I4+=1 ); loop_bottom: AR = AX0 + AY0; // ここまでがループ・ボディー
シーケンサーを設定してハードウェア・ループを開始します。
ハードウェア・ループはDSPに特徴的な命令です。一般のCPUではループ・ボトムで以下の命令列を実行してループ終了条件を判断します。
ざっと見積もって3ステップは確実に必要です。しかしながら積和演算を1サイクルでこなすDSPがループの制御に数サイクルかけるようでは本末転倒です。そこで、多くのDSPはハードウェア・ループを実装することで制御オーバーヘッドを回避できるようになっています。
ハードウェア・ループはDO命令で設定します。一旦設定するとDSPのシーケンサーは設定回数分だけ指定区間のコードを繰り返し実行します。シーケンサーはループの状態に応じてプリフェッチまで制御するため、ループ・ボトムからループ・トップに帰るときにも条件ジャンプのようなストールはおきません。ループ繰り返し回数はあらかじめCNTRレジスタに設定しておきます。
DO命令はCNTRの値をループ・カウンタ・スタックにプッシュします。そしてハードウェア・ループの実行中、ADSP-2191のシーケンサーはループ・ボトムに達するたびにループ・カウンタ・スタックにプッシュされた繰り返し回数をデクリメントしていきます。このため、CNTRの値は不変です。
そのほか、DO命令はループ先頭アドレス(DO命令の次の番地)をループ・先頭アドレス・スタックに、ループ・ボトム・アドレス(PC+<ofst12>)をループ・ボトム・アドレス・スタックにプッシュします。
内蔵スタックによって、ハードウェア・ループは8重のネストが可能になっています。
ハードウェア・ループを使う場合、以下の指針に従ってください。
DO命令実行時のオーバーヘッドや制限についての詳細はISRの8-22ページと、HRMの3-21ページ"Loops and Sequencing"を参照してください。
<ofst12> ::= 12ビット即値による、ループ・ボトムへの相対オフセット