// 直交形式 [ IF <cond> ] SR = [ SR OR ] NORM <dreg> <opt>; // 基本形式 [ IF <cond> ] SR = [ SR OR ] NORM SI <opt>; // 即値形式 SR = [ SR OR ] NORM <dreg> BY <imm> <opt>;
// 直交形式。シフト量はSEで与える SR = NORM AX0 (HI); // SR1基準で正規化。結果は上書き。 SR = SR OR NORM (HI); // SR1基準で正規化。結果はSRの内容とOR。 IF EQ SR = NORM AX0 (HI); // 条件正規化。SR1基準で正規化。結果は上書き。 SR = NORM AX0 (LO); // SR0基準で正規化。結果は上書き。 // 基本形式。シフト量はSEで与える SR = LSHIFT SI (HI); // SR1基準で正規化。結果は上書き。 SR = LSHIFT SI (LO); // SR0基準で正規化。結果は上書き。 // 即値形式 SR = LSHIFT AX0 by 3 (HI); // SR1基準で右に3ビット算術シフト。 SR = LSHIFT AX0 by -3 (HI); // SR1基準で左に3ビット算術シフト。
この命令は固定小数点数をIEEE浮動小数点数に変換する場合に使います。浮動小数点数への変換時にはIEEE浮動小数点数標準の要請により、仮数部を正規化しなければなりません。この作業は固定小数点数の冗長な符号ビットを数え、その数だけ算術シフトを行うことで達成します。正規化命令はこの算術シフト部を受け持ち、冗長な符号ビットの係数は指数部抽出命令で行います。指数部抽出命令の出力は浮動小数点数の指数部にそのまま使える形式です。正規化命令はこれをそのまま利用できるよう、シフト方向が算術シフト、論理シフトとは逆になっています。
正規化命令は16ビット・オペランドを40ビットに拡張し、SEレジスタの値の分だけシフトしてSRレジスタに格納します。シフト量はSEレジスタのほか即値で与えることもできます。また、SRレジスタへの格納は上書きのほかビット単位の論理和とすることもできます。シフトの形式は(HI)オプションを指定したとき符号拡張であり、(LO)オプションを指定したとき0拡張です。
シフト量は正負の値を与えます。値が正のとき、シフトは右方向です。値が負のとき、シフトは左方向です。これは算術シフトや論理シフトとは逆方向になります。シフト量の絶対値は1より大きくてもかまいません。シフト量にかかわらず、命令は1サイクルで動作を完了します。
必須オプションの(HI)、(LO)はシフト時に基準となる位置を決めます。これによって倍精度正規化を簡単に行うことができます。以下に正規化を行うプログラムを示します。
// 単精度正規化。入力は AX1 SE = EXP AX1(HI); SR = NORM AX1 (HI); // 上位ワードを符号拡張して正規化後、上書き代入 // 倍精度正規化。入力は AX1:AX0 SE = EXP AX1(HI); SE = EXP AX0(LO); SR = NORM AX1 (HI); // 上位ワードを符号拡張して正規化後、上書き代入 SR = SR OR NORM AX1 (LO); // 下位ワードを0拡張して正規化後、論理和
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, SI, AR, MR2, MR1, MR0, SR2, SR1, SR0 <opt> ::= (HI), (LO) <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE