// 直交形式 [ IF <cond> ] SE = EXP <dreg> <opt>; // 基本形式 [ IF <cond> ] SE = NORM SI <opt>;
// 直交形式 SE = EXP AX0 (HI); // 倍精度数の上位ワードから指数部を抽出 IF EQ SE = EXP AX0 (HI); // 条件実行。倍精度数の上位ワードから指数部を抽出 SE = EXP AX0 (LO); // 倍精度数の下位ワードから指数部を抽出 // 基本形式 SE = EXP SI (HI); // 倍精度数の上位ワードから指数部を抽出 SE = EXP SI (LO); // 倍精度数の下位ワードから指数部を抽出
この命令は固定小数点数をIEEE浮動小数点数に変換する場合に使います。浮動小数点数への変換時にはIEEE浮動小数点数標準の要請により、仮数部を正規化しなければなりません。この作業は固定小数点数の冗長な符号ビットを数え、その数だけ算術シフトを行うことで達成します。正規化命令はこの算術シフト部を受け持ち、冗長な符号ビットの係数は指数抽出命令で行います。指数抽出命令の出力は浮動小数点数の指数部にそのまま使える形式です。正規化命令はこれをそのまま利用できるよう、シフト方向が算術シフト、論理シフトとは逆になっています。
必須オプションの(HI)、(LO)はソースオペランドが倍精度データの上位下位いずれのワードかを指定します。(LO)を指定する場合は必ず(HI)側ワードの指数部抽出命令を実行した直後でなければなりません。また、単精度の場合には(HI)を用います。
(HI)の代わりに(HIX)を使うこともできます。(HIX)オプションはALU命令のあふれ補正を行う特殊オプションです。ALU命令は足し算や引き算の結果としてあふれを起こす可能性があります。しかし、あふれを起こした結果も1ビットシフトして使えば正規化命令の入力として正しく使用することができます。(HIX)オプションはこのようなことがおきうる場合に使います。(HIX)オプションは直前の演算でALUあふれが起きなかった場合、(HI)オプションと同等です。なお、あふれ補正に関してはABS(-1)も参考にしてください。
指数部抽出命令と正規化命令は正規化という特殊なアルゴリズムでだけ使われる命令です。したがって、実際のプログラムは下に示すプログラムと同じ流れをたどる場合がほとんどで、これ以外の使い方は皆無といっても結構です。
// 単精度正規化。入力は 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拡張して正規化後、論理和 // 単精度正規化。ALU命令のあふれ補正を行う AX0=0.75r; AY0=0.25r; AR=AX0+AY0; // あふれがおきる SE = EXP AR (HIX); // あふれ補正付き指数部抽出 SE⇒1 SR = NORM AR (HI); // 正規化 SR⇒0.5 // 結果⇒0.5 * 2^1。結局1.0だから正しい結果になっている。
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, SI, AR, MR2, MR1, MR0, SR2, SR1, SR0 <opt> ::= (HI), (LO), (HIX) <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE