// 直交形式 [ IF <cond> ] SB = EXPADJ <dreg>; // 基本形式 [ IF <cond> ] SB = EXPADJ SI;
// 直交形式 SB = EXPADJ AX0; // 倍精度数の上位ワードから指数部を抽出 IF EQ SB = EXPADJ AX0; // 条件実行。倍精度数の上位ワードから指数部を抽出 // 基本形式 SE = EXP SI; // 倍精度数の上位ワードから指数部を抽出
この命令はブロック浮動小数点処理を行う場合に、指数部を抽出するために使います。
一般の浮動小数点数が一つの数に対して仮数部と指数部を設けるのに対して、ブロック浮動小数点数は複数の数が一つの指数部を共有します。このため、個々の仮数部は正規化されているとは限らず、全体でもっとも有効数字の桁数が大きくなるように正規化されています。
EXPADJ命令はこのような処理を行う場合に複数の数から「正規化してもあふれない最小の共通な指数」を抽出します。原理は簡単で、EXP命令同様に指数を抽出しますが、抽出した指数がこれまでに抽出した指数より大きければ入れ替え、そうでなければこれまでの指数を使います。具体的にはSBに初期値として-16を設定し、EXPADJ命令をそれぞれのデータに次々と作用させることで、SBを更新します。更新が終わったらSBをSEにコピーし、今度はそれれぞれの数をブロック正規化していきます。
SB = -16; // SB初期化 SB = EXPADJ AR; // SB更新 ... // すべての数に対してSBを更新 SE = SB; // SBをSEにコピーし、今度はすべての数をSEで正規化する。
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, SI, AR, MR2, MR1, MR0, SR2, SR1, SR0 <cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE