ループ命令

昨日、というか今朝のエントリに、もなかさんよりコメントをいただきました。
ループを実装するときにループ命令を使うか条件ジャンプを使うかですが、速度が必要なければもちろんどちらでもいいです。どちらでもいいだけに趣味の時には真剣に考えねば(w
ハードウェア・ループの利点は次の3点に集約できます。

  • 繰り返しオーバーヘッドが0
  • ループ変数用にレジスタを割く必要がない
  • ループ境界条件を考える必要がない

私の場合、もっぱら最後の理由でループ命令を使っています。「えーと、N回のループをまわすときって、ループ変数の初期値はNでよかったんだっけ。デクリメントはループ・トップ?ボトム?」といったことを考え出すと、それだけで混乱するたちなのです。また、信号処理という分野の性質上、ハードウェア・ループを使わなくてもいい場面ではC言語を使うことが多いのも一因かもしれません。はっきりいってハードウェア・ループが不要な場面ではC言語です。そんな風ですので、今回のように速度がいらなくても、ついつい慣れているのでループ命令を使っています。
ループ命令には独特の難点もあります。

  • ループ突入オーバーヘッドは意外に大きい
  • ループ中断・再開オーバーヘッドも意外に大きい
  • 古いアーキテクチャではループ・ボトム周辺に厳しい制限がある*1

こういったことはDSPのハードウェア・ループが実行ユニットではなくプリフェッチ・ユニットに実装されていることからきています。プリフェッチ・ユニットは汎用RISCの場合おまけ的な存在です。しかしDSPにおけるプリフェッチ・ユニットはハードウェア・ループというDSPの存在意義にかかわる命令の実行をゆだねられています。

*1:たとえばDSP56000とか