演算命令はDSPの中核をなす命令です。このページでは、ADSP-2191の演算命令の種類について概要を説明します。
演算命令は大別してMAC、シフター、ALU命令に分かれます。これは以下の図のようにそれらの演算を行うハードウェアに基づく分類です。
図の中で薄オレンジ色で表されるのが演算ハードウェアです。MACユニットは乗算および積和演算をこなします。演算結果はMRかSRに格納します。MR、SRは連結レジスタです。他のレジスタが16ビットであるのに対して、この2本は40ビットからなります。40ビットのレジスタはそのままでは取り扱うことができないため、16bitのレジスタ2本と8ビットのレジスタ1本(MR2, SR2)にばらして転送することができます。この場合、SR2は16ビットレジスタに対して常に右詰で転送が行われます。
シフターユニットはシフト命令の他に正規化命令、指数抽出命令などを実行します。結果はSRに格納されます。
ALUユニットは加減算、論理演算、絶対値操作などを実行します。演算結果はAFあるいはARに格納します。
ADSP-2191の命令はオペランドのとり方によっても分類することができます。この分類方法はマニュアルに説明してある方法では有りませんが、覚えておくと2191の命令セットを理解する上で大きな助けになります。この方法は、演算命令を直交形式、基本形式、即値形式、特殊形式の4種類に分類します。マニュアルに記述されていませんので、当然ですが用語は勝手に作ったものです。
直交形式は一番わかりやすい命令形式です。この形式は上の図で青く塗られたレジスタファイルの中からどれでも自由にオペランドとして取り扱うことができます。ここで注意して欲しいのはAFを除く結果レジスタ(MR2, MR1, MR0, SR2, SR1, SR0, AR)は、いずれもオペランドとして使えるということです。上の図では単にわかりやすくするために結果レジスタが孤立しているように書いているだけで、実際にはレジスタファイルに含まれています。
直交形式命令では、オペランドをdregと表記します。dregはデータ・レジスタを意味します。
なお、シフター直交命令は後で説明する条件実行が可能です。
基本形式は直交形式ほど柔軟性がありません。利用できるレジスタはxop、yopと呼ばれるレジスタファイルの部分集合だけです。このため、基本形式でプログラムを書くと非常に窮屈になります。一方で基本形式には直交形式に無い強みがあります。
なお、シフター基本命令はxopとしてSIレジスタのみを許します。また、yopオペランドをとりません。
即値形式は基本形式の変形です。この形式の命令はオペランドのyopを即値(immediate value)として指定できます。このため、0.5や0.25といった比較的よく現れる値を使った演算の場合、いちいち値をレジスタにロードする必要はありません。即値として使用できる数は別表を参照してください。
命令によっては上記の3種類に分類されない特殊形式をもつものがあります。たとえば、DIVS命令は条件実行も即値使用も許しませんが、直交形式ではありません。また、二乗を計算する命令は、条件実行を許しますが、即値も複合命令での使用も許しません。
これらの上にあげた分類方法を組み合わせたときにどのようなレジスタを使うことができるか、以下の表にまとめます。
ALU命令 | MAC命令 | シフター命令 | ||||||
---|---|---|---|---|---|---|---|---|
直交形式 | 基本形式 | 直交形式 | 基本形式 | 直交形式 | 基本形式 | |||
AX0 | D | X | . | D | . | . | D | . |
AX1 | D | X | . | D | . | . | D | . |
AY0 | D | . | Y | D | . | . | D | . |
AY1 | D | . | Y | D | . | . | D | . |
MX0 | D | . | . | D | X | . | D | . |
MX1 | D | . | . | D | X | . | D | . |
MY0 | D | . | . | D | . | Y | D | . |
MY1 | D | . | . | D | . | Y | D | . |
SI | D | . | . | D | . | . | D | X |
AR | D | X | . | D | X | . | D | . |
AF | . | . | Y | . | . | . | . | . |
MR2 | D | X | . | D | X | . | D | . |
MR1 | D | X | . | D | X | . | D | . |
MR0 | D | X | . | D | X | . | D | . |
SR2 | D | . | . | D | . | . | D | . |
SR1 | D | X | . | D | X | Y | D | . |
SR0 | D | X | . | D | X | . | D | . |
0 | . | . | Y | . | . | Y | . | . |
記号の意味は次の通りです
また、即値形式で使用できるのは次の値です。
16進 | 10進整数 | 10進固定少数 | 16進 | 10進整数 | 10進固定少数 | |
---|---|---|---|---|---|---|
0x0000 | 0 | 0 | 0xFFFF | -1 | -0.000031 | |
0x0001 | 1 | 0.000031 | 0xFFFE | -2 | -0.000061 | |
0x0002 | 2 | 0.000061 | 0xFFFD | -3 | -0.000092 | |
0x0004 | 4 | 0.000122 | 0xFFFB | -5 | -0.000153 | |
0x0008 | 8 | 0.000244 | 0xFFF7 | -9 | -0.000275 | |
0x0010 | 16 | 0.000488 | 0xFFEF | -17 | -0.000519 | |
0x0020 | 32 | 0.000977 | 0xFFDF | -33 | -0.001007 | |
0x0040 | 64 | 0.001953 | 0xFFBF | -65 | -0.001984 | |
0x0080 | 128 | 0.003906 | 0xFF7F | -129 | -0.003937 | |
0x0100 | 256 | 0.007813 | 0xFEFF | -257 | -0.007843 | |
0x0200 | 512 | 0.015625 | 0xFDFF | -513 | -0.015656 | |
0x0400 | 1024 | 0.03125 | 0xFBFF | -1025 | -0.031281 | |
0x0800 | 2048 | 0.0625 | 0xF7FF | -2049 | -0.062531 | |
0x1000 | 4096 | 0.125 | 0xEFFF | -4097 | -0.125031 | |
0x2000 | 8192 | 0.25 | 0xDFFF | -8193 | -0.250031 | |
0x4000 | 16384 | 0.5 | 0xBFFF | -16385 | -0.500031 | |
0x8000 | -32768 | -1.0 | 0x7FFF | 32767 | 0.999969 |
10進->固定少数変換は精度よく行うことができません。したがって、一部の正の数を除いて即値固定小数点数は16進で指定したほうがいいでしょう。