演算命令の種類

演算命令は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進で指定したほうがいいでしょう。

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