積差

命令形式

          // 直交形式
<dst> = <dst> - <dreg> * <dreg> <opt>;

          // 基本形式
[ IF <cond> ] <dst> = <dst> - <xop> * <yop> <opt>;

          // 特殊形式
[ IF <cond> ] <dst> = <dst> - <xop> * <xop> <opt>;

          // いずれの形式も "=" の両辺の <dst> は
          // 同じレジスタでなければならない

          // 直交形式
MR = MR - AX0 * MY0 (SS);    // 符号付き×符号付き
MR = MR - AX0 * MY0 (SU);    // 符号付き×符号無し
MR = MR - AX0 * MY0 (US);    // 符号無し×符号付き
MR = MR - AX0 * MY0 (UU);    // 符号無し×符号無し
MR = MR - AX0 * MY0 (RND);   // 符号付き×符号付き、丸め
SR = SR - MX0 * AY0 (RND);

          // 基本形式
MR = MR - MX0 * MY0 (RND);
SR = SR - MX0 * MY0 (SS);
IF GE MR = MR - AX0 * AY0 (SS);  // 条件実行

説明

2つの16ビット・オペランドの積をMRまたはSRから引きます。オプション指定によって符号付き数と符号無し数の間で自由に掛け算を行えます。

積は32ビットの値として得られます。固定小数点数モードの場合、積はMR1:MR0(あるいはSR1:SR0)の32ビット・レジスタに左詰めで格納されます。整数モードの場合は右詰めです。いずれの場合もMR2(あるいはSR2)は符号拡張されます。詳しくはMAC命令ページを参照してください。

特別な例として、基本形式は二つの<xop>の積を認めています。これはx2を計算するときに使います。この場合、二つの<xop>は同じレジスタでなければなりません。

(RND)を指定すると符号付き数同士の積を計算し、引いたあとに結果を上位16ビットに丸めます。定義からこのオプションは整数モードでは無意味です。丸め方については丸め命令を参照してください。

なお、アキュームレーターは40ビットありますが、このアキュームレーターで表現できないほど差が大きくなった場合、あふれが発生し、値はラップ・アラウンドします。

文法要素

<dst>  ::= MR, SR
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, 
           SI, AR, MR2, MR1, MR0, SR2, SR1, SR0
<xop>  ::= MX0, MX1, AR, MR2, MR1, MR0, SR1, SR0
<yop>  ::= MY0, MY1, SR1, 0
<opt>  ::= (SS), (SU), (US), (UU), (RND)
<cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, 
           SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |