MAC命令

MAC(Multiply and ACcumulation)命令はハードウェアMACユニットを使って乗算や積和演算を実行するものです。

MAC命令の形式

MAC命令には単純な乗算、積和演算のほかに丸めや飽和演算命令があります。乗算および積和演算は3項命令です。オペランドのとり方は直交形式と基本形式のみが許されます。

下の図は基本形式で使うことのできるオペランドの分類を表しています。薄青はxopとして使うことができます。薄緑はyopとして使うことができます。SR1はyopと記されていますが、xopとしても使用することができる特例です。

MAC関連レジスタ

三項命令

三項命令は次のような形式を持っています

dst = src1 * src2;
dst = dst + src1 * src2;
dst = dst - src1 * src2;

三項命令は右辺の乗算と左辺のデスティネーションの組み合わせです。具体例を挙げれば次のようなものがあります。

MR = MX0 * MY1;
SR = SR + MX1 * MY0;

ALU命令同様に高級言語の演算/代入命令によく似ています。上の例ではMRおよびSRがデスティネーションです。MAC命令がとることのできるデスティネーションはこれだけです。

オペランドsrc1, src2に何をとるかは、その命令が直交形式、基本形式のいずれであるかで決まります。普通は直交形式で自由にプログラムを組み、がちがちに最適化するときだけ基本形式にすればいいでしょう。

基本形式の強みは並列転送を使える点です。とくに、積和命令はデュアル並列転送と組み合わせると1サイクルで積和を完了することができますので、信号処理の心臓部では最適化の要となります。

固定小数点数とアキュームレーター

DSPは前提として固定小数点数を扱います。固定小数点数を使用する合理的な理由があるからですが、それは別に説明します。いずれにせよ固定小数点演算を行う場合、乗算は整数演算とは異なるものになります。そこで、ADSP-2191は固定小数点演算をハードウェアで提供しています。

乗算ハードウェアが使うレジスタ構成を下の図に示します。上全命令のオペランドは16ビットです。二つの16ビット固定小数点数の積を40ビット固定小数点数としてアキュームレーターMRに代入します。ADSP-2191はMRのほかにアキュームレーターとしてSRを使うこともできます。固定小数点数は多くの場合符号付で扱われますので、ここでは符号付固定小数点数のみについて説明します。

符号付き16ビット固定小数点数は符号ビットとして1ビットを使用し、残り15ビットを数として使用します。ここで数の部分があらわすことのできる範囲はおおむね0から1の範囲です。そのような二つの数を掛け合わせると、結果のビット数はいくつ必要でしょうか。直感的に16ビット数の積は32ビットになりそうですが、実は31ビットにしかなりません。なぜなら、数の部分は15ビット同士の積で30ビットとなりますが、符合部の積は1ビットにしかならないからです。符号付き16ビット固定小数点数では積を左詰で格納するため、積を32ビットレジスタに格納するときにはLSBを0とします。

実際にはADSP-2191のアキュームレーターは40ビットです。左側の8ビットは積算時のあふれ防止用ガードビットですが、単純な乗算の場合にはこれらは符号拡張された値を格納します。ガードビットが8ビットあるため、積和の結果はおおよそ±128まで表現可能になっています。この結果を比較的安全に取り出せるよう、飽和命令も用意されています。

固定小数点乗算

整数乗算

固定小数点数の乗算に関しては先に説明したようにハードウェアの支援があります。これは信号処理を行うDSPとしては当然のことです。では、整数乗算はどうでしょう。ADSP-2191は整数乗算もハードウェアで行います(下図)。

整数乗算

整数演算の方法については特に説明の必要はありませんが、注意すべき点として固定小数点演算と整数演算の切り替え方法があります。ADSP-2191は固定小数点乗算、整数乗算を命令レベルでは区別しません。その代わりにモードビットを用意して演算モードを切り替えます。

このモードはMSTATレジスタのM_MODE( Multiply Resut Mode )ビットで決まります。M_MODE=0なら固定小数点乗算、M_MODE=1なら整数乗算です。モードビット変更ははレジスタを直接操作してもかまいませんが、ENA M_MODE;およびDIS M_MODE;という専用命令が用意されています。このようなモード切替はあまりよい方法ではありません。ADSP-2191の先祖にあたるADSP-2101あたりの古い設計を引きずっているわけですが、命令ビット数の不足などもあったのかもしれません。

蛇足ですがこのM_MODEという名前は、I_MODE( Integer Mode )のようなもっとわかりやすい名前にすべきでしょう。このあたりの名前のセンスのなさはAnalog DevicesのDSP全般にいえる事です。

符号

ADSP-2191は符号付き数と符号無し数の間の乗算を自由に行えます。この指定は命令単位で行うことが可能で、オプションを(SS) (US) (SU) (UU)のように指定することで、符号付き×符号付き、符号付き×符号無し、符号無し×符号付き、符号無し×符号無しの演算を行えます。

符号無し固定小数点数は、符号付き固定小数点数とは小数点の位置が同じで符合がありません。そのけっか、符号無し固定小数点数の扱える値の範囲は、2.0 >x>=0 となります。

2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |