(57)【要約】      （修正有）【課題】少ない回路規模で正規化シフト量の予測値を補正する。【解決手段】浮動小数点フォーマットを内部フォーマットに変換して乗算する乗算器ＭＬＰＬと乗算結果に加算し乗加算結果を出力する加算器１４と、乗加算結果を左シフト量に基づいて左シフトする正規化シフト回路１８と、左シフト量を予測する左シフト量予測回路１７と、乗算結果及び第１キャリー値と第３入力とを加算するキャリー保存加算器１４と、キャリー保存加算器が出力する第２加算値と第２キャリー値とを加算して乗加算結果を出力する全加算器１５とを有する。左シフト量予測回路はゼロカウントを生成するゼロカウント回路と、真のワンカウント判定値の数であるワンカウントを生成するワンカウント回路と、第２加算値と第２キャリー値のＭ個の上位ビットの最下位ビットの否定論理和が真になる補正イネーブルの場合に、ワンカウントをゼロに補正する補正回路とを有する。【選択図】図１
2018195228.tif 000002
【特許請求の範囲】
【請求項１】
第１オペランドと第２オペランドの第１入力と第２入力の浮動小数点フォーマットを、Ｍ個（Ｍは複数）の最上位ビットが０で前記最上位ビットに続くＮ個（Ｎは複数）の下位ビットが仮数である内部フォーマットに変換して、乗算する乗算器と、
第３オペランドの第３入力の浮動小数点フォーマットを、前記内部フォーマットに変換し、前記第３入力を前記乗算器の乗算結果に加算し乗加算結果を出力する加算器と、
前記乗加算結果を左シフト量に基づいて左シフトする正規化シフト回路と、
前記左シフト量を予測する左シフト量予測回路とを有し、
前記加算器が、前記乗算結果である第１加算値及び第１キャリー値と前記第３入力とを加算するキャリー保存加算器と、前記キャリー保存加算器が出力する第２加算値と第２キャリー値とを加算して前記乗加算結果を出力する全加算器とを有し、
前記左シフト量予測回路は、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのゼロカウント判定値を生成し、上位ビット側から降順で連続する真のゼロカウント判定値の数であるゼロカウントを生成するゼロカウント回路と、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのワンカウント判定値を生成し、上位ビット側から降順で連続する真のワンカウント判定値の数であるワンカウントを生成するワンカウント回路と、
前記第２加算値と第２キャリー値の前記Ｍ個の上位ビットの最下位ビットの否定論理和が真になる補正イネーブルの場合に、前記ワンカウントをゼロに補正する補正回路とを有する、演算器。
【請求項２】
第１オペランドと第２オペランドの第１入力と第２入力の浮動小数点フォーマットを、Ｍ個（Ｍは複数）の最上位ビットが０で前記最上位ビットに続くＮ個（Ｎは複数）の下位ビットが仮数である内部フォーマットに変換して、乗算する乗算器と、
第３オペランドの第３入力の浮動小数点フォーマットを、前記内部フォーマットに変換し、前記第３入力を前記乗算器の乗算結果に加算し乗加算結果を出力する加算器と、
前記乗加算結果を左シフト量に基づいて左シフトする正規化シフト回路と、
前記左シフト量を予測する左シフト量予測回路とを有し、
前記加算器が、前記乗算結果である第１加算値及び第１キャリー値と前記第３入力とを加算するキャリー保存加算器と、前記キャリー保存加算器が出力する第２加算値と第２キャリー値とを加算して前記乗加算結果を出力する全加算器とを有し、
前記左シフト量予測回路は、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのゼロカウント判定値を生成し、上位ビット側から降順で連続する真のゼロカウント判定値の数であるゼロカウントを生成するゼロカウント回路と、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのワンカウント判定値を生成し、上位ビット側から降順で連続する真のワンカウント判定値の数であるワンカウントを生成するワンカウント回路と、
前記第１加算値及び第１キャリー値の前記Ｎ個の下位ビットの最上位ビットの排他的論理和と、前記第３入力の前記Ｎ個の下位ビットの最上位ビットの否定との論理積が真になる補正イネーブルの場合に、前記ワンカウントをゼロに補正する補正回路とを有する、演算器。
【請求項３】
前記補正回路は、前記補正イネーブルの場合に、前記ワンカウント回路が出力するワンカウントをゼロに変更するワンカウント補正回路を有する、請求項１または２に記載の演算器。
【請求項４】
前記補正回路は、前記補正イネーブルの場合に、前記ワンカウント判定値の前記N個の下位ビットの最上位ビットをワンカウント判定値を偽に変更するワンカウント判定補正回路を有する、請求項１または２に記載の演算器。
【請求項５】
前記加算器は、更に、前記内部フォーマットに変換された第３入力の桁を、前記乗算結果の桁に合わせる入力シフト回路を有し、
前記入力シフト回路の出力が前記キャリー保存加算器に入力される、請求項１または２に記載の演算器。
【請求項６】
前記乗算器は、前記内部フォーマットに変換された第１入力をデコードするブースデコーダと、前記ブースデコーダのデコード値に対応する前記内部フォーマットに変換された第２入力の部分積を加算するワレスツリー回路とを有し、
前記ワレスツリー回路が前記第１加算値及び第１キャリー値を出力する、請求項１または２に記載の演算器。
【請求項７】
第１オペランドと第２オペランドの第１入力と第２入力の浮動小数点フォーマットを、Ｍ個（Ｍは複数）の最上位ビットが０で前記最上位ビットに続くＮ個（Ｎは複数）の下位ビットが仮数である内部フォーマットに変換して、乗算する乗算器と、
第３オペランドの第３入力の浮動小数点フォーマットを、前記内部フォーマットに変換し、前記第３入力を前記乗算器の乗算結果に加算し乗加算結果を出力する加算器と、
前記乗加算結果を左シフト量に基づいて左シフトする正規化シフト回路と、
前記左シフト量を予測する左シフト量予測回路とを有し、
前記加算器が、前記乗算結果である第１加算値及び第１キャリー値と前記第３入力とを加算するキャリー保存加算器と、前記キャリー保存加算器が出力する第２加算値と第２キャリー値とを加算して前記乗加算結果を出力する全加算器とを有し、
前記左シフト量予測回路は、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのゼロカウント判定値を生成し、上位ビット側から降順で連続する真のゼロカウント判定値の数であるゼロカウントを生成するゼロカウント回路と、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのワンカウント判定値を生成し、上位ビット側から降順で連続する真のワンカウント判定値の数であるワンカウントを生成するワンカウント回路とを有し、
前記第２加算値と第２キャリー値の前記Ｍ個の上位ビットの最下位ビットの否定論理和が真になる補正イネーブルの場合に、前記ワンカウントをゼロに補正する工程を有する、演算器の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算器及び演算器の制御方法に関する。
【背景技術】
【０００２】
演算器の1つとして、第１、第２の入力を乗算する乗算器と、その乗算結果に第３の入力を加算または減算（以下、略して加算と称する。）する加算器を組み合わせた乗加算器がある。一方、浮動小数点の乗加算器は、浮動小数点の入力の小数点の位置を合わせる桁合わせを行って演算し、乗加算結果を正規化シフトする。
【０００３】
正規化シフトは、乗加算結果の小数点位置を左シフトすることで所定の位置に戻す動作であり、乗加算結果を左シフトする正規化シフト回路により行われる。乗加算結果の小数点位置がわかれば左シフト量である正規化シフト量を決定することができるが、加算結果を待って正規化シフト量を決定すると演算時間の遅延になる。そこで、加算器の入力等から正規化シフト量を予測する正規化シフト量予測回路が設けられる。
【０００４】
正規化シフト量予測回路により予測される正規化シフト量は、必ずしも正しいシフト量でない場合がある。正規化シフト量予測回路が、最下位からのキャリー伝播を正確に考慮しないからである。予測されたシフト量が正しいシフト量より少ない場合は、正規化シフト回路が追加の左シフトを行うことで予測誤差を補正する。逆に、予測されたシフト量が正しいシフト量より多い場合は、正規化シフト回路には右シフトの機能を有していないので、正規化シフト回路の出力を右シフトする右シフト補正回路が利用される。
【０００５】
加算器などの加算結果の正規化シフトについては、以下の文献に記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平０６−７５７５２号公報
【特許文献２】特開平０８−８７３９９号公報
【特許文献３】特開平１０−２８９０９６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、右シフト補正回路を設けることは、回路規模の拡大とともに、演算時間の遅延を伴うので好ましくない。
【０００８】
上記の特許文献１では、正規化シフト量予測回路の予測シフト量の誤差の有無を判定して予測シフト量を補正するために、入力のボロー伝播回路が追加される。しかしながら、ボロー伝播回路と予測シフト量の補正回路の回路規模が大きく、回路面積、演算時間の遅延、オーバヘッドの発生などが問題となる。
【０００９】
そこで，一つの実施の形態の目的は，少ない回路規模で正規化シフト量の予測値を補正し追加の右シフト補正回路を必要としない演算器及び演算器の制御方法を提供することにある。
【課題を解決するための手段】
【００１０】
本開示の第１の側面は，第１オペランドと第２オペランドの第１入力と第２入力の浮動小数点フォーマットを、Ｍ個（Ｍは複数）の最上位ビットが０で前記最上位ビットに続くＮ個（Ｎは複数）の下位ビットが仮数である内部フォーマットに変換して、乗算する乗算器と、
第３オペランドの第３入力の浮動小数点フォーマットを、前記内部フォーマットに変換し、前記第３入力を前記乗算器の乗算結果に加算し乗加算結果を出力する加算器と、
前記乗加算結果を左シフト量に基づいて左シフトする正規化シフト回路と、
前記左シフト量を予測する左シフト量予測回路とを有し、
前記加算器が、前記乗算結果である第１加算値及び第１キャリー値と前記第３入力とを加算するキャリー保存加算器と、前記キャリー保存加算器が出力する第２加算値と第２キャリー値とを加算して前記乗加算結果を出力する全加算器とを有し、
前記左シフト量予測回路は、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのゼロカウント判定値を生成し、上位ビット側から降順で連続する真のゼロカウント判定値の数であるゼロカウント（LZC）を生成するゼロカウント回路と、
前記第２加算値と第２キャリー値の前記Ｎ個の下位ビットから各ビットのワンカウント判定値を生成し、上位ビット側から降順で連続する真のワンカウント判定値の数であるワンカウントを生成するワンカウント回路と、
前記第２加算値と第２キャリー値の前記Ｍ個の上位ビットの最下位ビットの否定論理和が真になる補正イネーブルの場合に、前記ワンカウントをゼロに補正する補正回路とを有する、演算器、である。
【発明の効果】
【００１１】
第１の側面によれば，少ない回路規模で正規化シフト量の予測値を補正し追加の右シフト補正回路を必要としない。
【図面の簡単な説明】
【００１２】
【図１】第1の実施の形態における演算回路の一例である乗加算回路を示す図である。
【図２】第１、第２、第３のオペランドOP1,OP2,OP3と結果レジスタ２１内の浮動小数点数のフォーマットを示す図である。
【図３】演算器内の内部フォーマットを示す図である。
【図４】図１の乗加算器内の各データ間の桁を示す図である。
【図５】第1の実施の形態における左シフト量予測回路１７の構成例を示す図である。
【図６】ワンカウント回路（LOC回路）の構成を示す図である。
【図７】LZC回路の構成を示す図である。
【図８】ゼロカウント回路（LZC回路）１７１内のゼロカウント判定回路（LZP回路）と、ワンカウント回路（LOC回）１７２内のワンカウント判定回路（LOP回路）の論理演算を示す図である。
【図９】ワンカウント判定信号LOPの３つの例とワンカウントLOCとの関係を示す図である。
【図１０】[60][59]ビットのS[60:59],C[60:59]と、[59]ビットのキャリーインCI[59]の全組み合わせ（３２通り）でのLOP,LZPと、全加算器１５の全加算値ADD1（RESULTのRES）とを示す図である。
【図１１】図１０の（B）多くカウントするケース（CA5）を抽出した図である。
【図１２】図１１についてLZCに誤りが発生する可能性がある場合とLOCに誤りが発生する可能性がある場合について上下に分けて示す図である。
【図１３】S[63:61] + C[63:61] = 110を満たすS[63:61]とC[63:61]の８つのパターンを示す図である。
【図１４】上記の保証４と保証２を満たすCSAの入力SUM,CRY,RSFTのパターンを示す図である。
【図１５】図１２の（LOC）の４つのパターンに図１４のパターンP_f0を適用した図である。
【図１６】第２の実施の形態における演算回路の一例である乗加算回路を示す図である。
【図１７】第２の実施の形態における左シフト量予測回路１７の構成例を示す図である。
【発明を実施するための形態】
【００１３】
［第1の実施の形態］
［第1の実施の形態の乗加算回路］
図１は、第1の実施の形態における演算回路の一例である乗加算回路を示す図である。乗加算回路は、第1、第２オペランドOP1、OP2の入力を乗算する乗算器MLPLと、乗算結果SUM+CRYに第３オペランドOP3の入力を加算する加算回路１４，１５とを有する。３つのオペランドOP1,OP2,OP3の入力は、例えばIEEE754フォーマットの浮動小数点数または整数であり、それぞれのフォーマット回路FORMATにより、後述する所定のデータフォーマットに変換される。
【００１４】
乗算器MLPLは、一例として、ブースアルゴリズム（Booth Algorism）とワレスツリー（Wallace-Tree）で構成される。即ち、乗算器MLPLは、オペランドOP1の乗数をデコードするブースデコーダ１０と、ブースデコーダのデコード値に対応するオペランドOP2の被乗数の部分積を選択するブースセレクタ１１と、ブースセレクタで選択された被乗数の部分積を加算するワレスツリー１２とを有する。
【００１５】
例えば、２次のブースアルゴリズムであれば、ブースデコーダ１０は、オペランドOP1の乗数を２ビットずつデコードし、ブースセレクタ１１は、オペランドOP2の被乗数の０、±１、±２倍の数（被乗数の部分積）をデコード値に基づいて選択する。
【００１６】
ワレスツリー回路１２は、キャリーセーブアダー（Carry Save Adder: CSA）を逆ツリー状に接続して構成され、最終段のCSAが加算SUMとキャリーCRYとを出力する。
【００１７】
一方、第３オペランドOP3の加数は、入力シフト回路である右シフト回路１３により右シフト量RSA右シフトされ、乗算器の出力SUM,CRYと桁合わせされる。そして、右シフト回路１３の下位側の出力RSFT_Lは、ワレスツリー１２の出力SUM,CRYと共に、CSA１４に入力され、その出力S,C（SはSum、CはCarryだが、ブースツリーのSUM,CRYと区別するためにS,Cとする）は、全加算器１５に入力される。また、右シフト回路１３の上位側の出力RSFT_Hと、全加算器１５のキャリーアウト（桁上げ）COが、キャリー加算器１６により加算される。
【００１８】
また、右シフト回路１３は、第３オペランドOP3の加数が負の場合、２の補数に変換する。また、入力シフト回路は右シフト回路に限定されず左右いずれにもシフト可能な左右シフト回路でも良い。
【００１９】
そして、セレクタSEL1は、キャリー加算器の出力ADD2に全加算器の出力ADD1を連結したビット列のうち、上位側か下位側のいずれかを選択して乗加算値MSを出力する。セレクタSEL1の動作については、後で説明する。
【００２０】
一方、全加算器１５に入力されるCSA１４の出力S,Cが、左シフト量予測回路１７に入力される。左シフト量予測回路１７は、CSA１４の出力S,Cから乗加算値MSの仮数部の先頭の連続する「０」の数（LZC：Leading Zero Count：先頭０数）と、先頭の連続する「１」の数（LOC：Leading One Count：先頭１数）のいずれかである正規化シフト量（左シフト量）LSAを予測する。また、左シフト量予測回路は、予測した正規化シフト量を補正するLOC補正回路を有する。
【００２１】
そして、セレクタSEL1が出力する乗加算値MSは、正規化シフト回路（左シフト回路）１８により、正規化シフト量（左シフト量）LSAだけ左シフトされる。後で説明するが、正規化シフト回路１８は、セレクタSEL1が下位側を選択した場合に、左シフト量予測回路が予測した正規化シフト量LSAに基づいて乗加算値MSを左シフトし、セレクタSEL1が上位側を選択した場合は、右シフト量RSAと同じシフト量だけ乗加算値MSを左シフトする。したがって、セレクタSEL1が下位側を選択した場合のみ、左シフト量予測回路の予測シフト量LSAが使用される。
【００２２】
最後に、正規化シフト回路１８の出力は、丸め回路１９で丸め処理され、フォーマット回路２０で演算器内の所定のフォーマットからIEEE754のフォーマットに変換され、結果レジスタ２１に格納される。
【００２３】
図２は、第１、第２、第３のオペランドOP1,OP2,OP3と結果レジスタ２１内の浮動小数点数のフォーマットを示す図である。このフォーマットはIEEE754に準拠している。IEEE754のフォーマットは、最上位ビットから順に符号部S（Sign）、指数部E（Exponent）、仮数部F（Fraction）で構成される。単精度の場合、符号部Sは１ビット、指数部Eは８ビット、仮数部Fは２３ビットである。倍精度の場合、Sは１ビット、Eは１１ビット、Fは５２ビットである。また、半精度の場合、Sは１ビット、Eは５ビット、Fは１０ビットである。仮数部Fには隠しビット（Hidden Bit）が省略される。また、隠しビットは、正規化数の場合は「１」、非正規化数（極小値）の場合は「０」である。
【００２４】
図３は、演算器内の内部フォーマットを示す図である。演算器内の内部フォーマットは、ワレスツリー１２や右シフト回路１３の入力のデータフォーマットである。図３には、単精度の例である。正規化数と非正規化数は、Ｍ個（３個）の最上位ビット[31:29]に「０」を有し、Ｍ個の最上位ビットに続くＮ個（２４個）の下位ビット［28:5］に最上位に隠しビットを追加した仮数部を有し、さらに[4:0]ビットに「０」を有する。[31:29]と[4:0]の「０」は、単に３２ビット幅にするための詰め物である。したがって、浮動小数点数の場合は、実質的な演算対象の仮数は[28:5]ビットに位置する。一方、整数は、全[31:0]ビットが仮数部になる。
【００２５】
本実施の形態の左シフト量予測回路１７内のLOC補正回路は、図３の内部フォーマットを前提にした構成である。この点は後で詳述する。
【００２６】
図４は、図１の乗加算器内の各データ間の桁を示す図である。前提として、各オペランドOP1,OP2,OP3のデータのビット幅は単精度である。乗算器MLPLの入力である第１オペランドOP1の乗数と第２オペランドOP2の乗数は、いずれも [31:0] ビットのデータである。そして、乗算値であるワレスツリー１２の出力SUM,CRYの和SUM+CRYは、[63:0]ビットのデータとなる。
【００２７】
さらに、加算器の入力である第３オペランドOP3の加数は、[95:64]ビットのデータである。そして、右シフト回路１３が、オペランドOP1,OP2,OP3の浮動小数点の指数ビットに基づいて求めた右シフト量RSAにしたがって第３オペランドOP3のデータを右シフトする。図４には、（１）右シフト量RSA1(＜３２ビット)の場合の右シフト後のデータOP3_R1と、（２）右シフト量RSA2（≧３２ビット）の場合の右シフト後のデータOP3_R2とが示される。
【００２８】
上記の（１）の場合、右シフト後のデータOP3_R1が[95:64]と[63:32]とに分離され、右シフト後のデータOP3_R1の63ビット以下の下位側データRSFT_LがCSA１４に入力され、64ビット以上の上位側データRSFT_Hがキャリー加算器１６に入力される。そして、全加算器１５の出力ADD1が[63:0]ビットのデータとして、キャリー加算器１６の出力ADD2が[95:64]ビットのデータとして、セレクタSELに入力される。この場合、セレクタSELは、上位64ビットの[95:32]ビットのデータSEL_OUT_Hを選択し、乗加算値MSとして出力する。
【００２９】
上記の（２）の場合、右シフト後のデータOP3_R2は[63:0]内まで右シフトされ、下位側データRSFT_LとしてCSA１４に入力される。一方CSA１４には、ワレスツリー回路１２の出力CRY,SUMが入力される。そして、CSA１４がデータOP3_R2とワレスツリー回路の出力CRY,SUMとを加算し、全加算器１５がCSA１４の出力S,Cを加算し、その出力ADD1が[63:0]ビットのデータとなる。この場合、キャリー加算器１６が出力するデータADD2は全て０である。よって、セレクタSELは、[63:0]ビットのデータSEL_OUT_Lを選択し乗加算値MSとして出力する。
【００３０】
図４から明らかなとおり、セレクタSELが上位側SEL_OUT_Hを選択した場合、正規化シフト回路１８は、右シフト量RSAと等しいシフト量だけ左シフトする。一方、セレクタSELが下位側SEL_OUT_Lを選択した場合、正規化シフト回路１８は、左シフト量予測回路１７が予測する左シフト量LSAに従って左シフトする。
【００３１】
［左シフト量予測回路１７］
図５は、第1の実施の形態における左シフト量予測回路１７の構成例を示す図である。左シフト量予測回路は、CSA１４の出力である加算値S[61:0]とキャリー値C[61:0]を入力する。先頭ゼロ「０」の数をカウントするLZC回路１７１は、S[60:0]とC[60:0]とを最下位からのキャリー伝播を完全に考慮することなく疑似的に加算し、各桁の疑似加算結果に基づいて先頭ゼロの数をカウントし、ゼロカウントLZC[5:0]を出力する。具体的な演算式を後で説明する。
【００３２】
同様に、先頭ワン「１」の数をカウントするLOC回路１７２も、S[60:0]とC[60:0]とを最下位からのキャリー伝播を完全に考慮することなく疑似的に加算し、各桁の疑似加算結果に基づいて先頭ワンの数をカウントし、カウント値LOC[5:0]を出力する。この具体的な演算式も後で説明する。
【００３３】
さらに、左シフト量予測回路は、補正判定回路CRCT_1を有する。補正判定回路CRCT_1は、例えばS[61]とC[61]から予測されたLOC[5:0]の誤りを示す補正フラグFLAGを生成し、ワンカウントLOCをゼロに補正するワンカウント補正回路ZERO_Mが、補正フラグFLAGに応答して、ワンカウント予測値LOC[5:0]を全てゼロに補正する。
【００３４】
左シフト量予測回路は、更に、セレクタSEL2を有し、セレクタSEL2は、LZCを選択する選択信号LZC_SELが真（LZC_SEL=１）になればLZC[5:0]を選択し、LOCを選択する選択信号LOC_SELが真（LOC_SEL=１）になればLOC[5:0]を選択し、左シフト量LSA[5:0]として出力する。この左シフト量LSAは、正規化シフト回路１８に入力される。
【００３５】
図６は、ワンカウント回路（LOC回路）の構成を示す図である。LOC回路１７２は、ワンカウント判定回路（LOP回路）LOPとエンコーダENC_2とを有する。LOP回路は、S[60:0]とC[60:0]とを最下位からのキャリー伝播を完全に考慮することなく疑似的に加算し、各桁の疑似加算結果に基づいて先頭ワンカウンタLOCをカウントアップするか否かを示すワンカウント判定値（LOP値）を各桁毎に生成する。つまり、LOP値はLOP[60:0]になり、各桁iでLOP[i]＝１であれば先頭ワンカウンタLOCをカウントアップすることを示し、LOP[i]＝０であればカウントアップしないことを示す。
【００３６】
一方、エンコーダENC_2は、LOPが生成するLOP値LOP[60:0]の60ビットから降順に0ビットまで、図中に示した演算を実行する。即ち、60ビットから順に、LOP[i]＝１であれば先頭ワンカウンタLOCをカウントアップし（LOC=LOC+1）、iをデクリメントし（i=i-1）、LOP[i]＝０であれば演算を終了する。つまり、エンコーダENC_2は、60ビットから連続するLOP[i]＝１をカウントする。また、LOC１７２は、ワンカウントするので、乗加算値MSが負の場合の正規化シフト量を予測する。
【００３７】
図７は、LZC回路の構成を示す図である。LZC回路１７1は、LZP回路とエンコーダENC_1とを有する。LZP回路は、S[60:0]とC[60:0]とを最下位からのキャリー伝播を完全に考慮することなく疑似的に加算し、各桁の疑似加算結果に基づいて先頭ゼロカウンタLZCをカウントアップするか否かを示すLZP値を各桁毎に生成する。つまり、LZP値はLZP[60:0]になり、各桁iでLZP[i]＝１であれば先頭ゼロカウンタLZCをカウントアップすることを示し、LZP[i]＝０であればカウントアップしないことを示す。
【００３８】
一方、エンコーダENC_1は、LZPが生成するLZP値LZP[60:0]の60ビットから降順に0ビットまで、図中に示した演算を実行する。即ち、60ビットから順に、LZP[i]＝１であれば先頭ゼロカウンタLZCをカウントアップし（LZC=LZC+1）、iをデクリメントし（i=i-1）、LZP[i]＝０であれば演算を終了する。つまり、エンコーダENC_1は、60ビットから連続するLZP[i]＝１をカウントする。また、LZC１７１は、ゼロカウントするので、乗加算値MSが正の場合の正規化シフト量を予測する。
【００３９】
[LZP,LOPについて]
図８は、ゼロカウント回路（LZC回路）１７１内のゼロカウント判定回路（LZP回路）と、ワンカウント回路（LOC回）１７２内のワンカウント判定回路（LOP回路）の論理演算を示す図である。LZP回路及びLOP回路の論理式は次のとおりである。
LZP[i] = (S[i]^C[i]) ^ (~S[i-1]&~C[i-1])        式１
LOP[i] = (S[i]^C[i]) ^ (S[i-1]&C[i-1])          式２
ここで、S,CはCSA１４の出力、＾はEOR、~はNOT、&はANDを意味する。
【００４０】
正確なLZC、LOCをカウントするためには、全加算器１５の入力S[60:0]、C[60:0]を全加算した結果に対して先頭のゼロ「０」をまたは先頭のワン「１」をカウントする必要がある。しかし、全加算は最下位からのキャリー伝播を全て考慮する必要があり、論理段数が多くなり演算時間が長くなる。
【００４１】
そこで、LZP回路、LOP回路では、キャリー伝播を正確に考慮せず、その代わりにキャリー伝播の可能性を考慮する疑似的な加算を行った疑似的加算結果に対応するカウント判定値LZP,LOPを生成し、エンコーダが、カウント判定値LZP,LOPの先頭ビットからの連続する「１」をカウントする。つまり、キャリー伝播を正確に考慮しない代わりに、カウント対象ビット[i]の半加算値を、1つ下位のビット[i-1]からのキャリー伝播の可能性に基づいて修正し、LZP[i]、LOP[i]を生成する。なお、ゼロカウント判定値LZPは、加算結果が「０」の場合エンコーダがLZCをカウントアップする必要があるので、ゼロカウント判定値LZPは、加算結果「０」に対してLZP=1になる。
【００４２】
図８には、S[i],S[i-1]とC[i],C[i-1]の全ての組み合わせ９通りについて、半加算値S[i]^C[i]と、[i-1]ビットからのキャリーインCI[i]と、半加算値とキャリーインCI[i]とを加算した全加算値の[i]ビットの値S[i]^C[i]^CI[i]と、LZP[i]、LOP[i]の論理式内のキャリー伝播の可能性~S[i-1]&~C[i-1]、S[i-1]&C[i-1]と、LZP[i]と、LOP[i]とを示す。
【００４３】
S[i],S[i-1]とC[i],C[i-1]の全ての組み合わせは、論理的には１６通りあるが、加算では被加数と加数の可換性があるので、重複する組み合わせを省略してここでは９通りのケースCA1〜CA9が示される。ビット毎の可換性も考慮されている。以下、９通りのケースCA1〜CA9について説明する。
【００４４】
（１）S[i-1],C[i-1]が０,０の場合（ケースCA1,CA4,CA7）、キャリーインCI[i]が発生する可能性はない。したがって、[i]での半加算値S[i]^C[i]と、[i-1]からのキャリーインCI[i]とに基づいて求められるS[i]^C[i]^CI[i]に基づいて、カウント判定値LZP、LOP（ゼロカウント判定値LZP、ワンカウント判定値LOP）を判定することができる。
【００４５】
つまり、ケースCA1では、S[i]^C[i]^CI[i]＝０であるので、ゼロカウント有を示すLZP[i]＝１、ワンカウントを示さないLOP[i]＝０となる。
【００４６】
ケースCA4では、S[i]^C[i]^CI[i]＝１であるので、ゼロカウント無を示すLZP[i]＝０、ワンカウントを示すLOP[i]＝１となる。
【００４７】
同様に、ケースCA7では、S[i]^C[i]^CI[i]＝０であるので、ゼロカウント有を示すLZP[i]＝１、ワンカウントを示さないLOP[i]＝０となる。
【００４８】
（２）次に、S[i-1],C[i-1]が１,１の場合（ケースCA3,CA6,CA9）、キャリーインCI[i]が必ず発生する。したがって、[i]での半加算値S[i]^C[i]と、[i-1]からのキャリーインCI[i]とに基づいて求められるS[i]^C[i]^CI[i]に基づいて、カウント判定値LZP、LOP（ゼロカウント判定値LZP、ワンカウント判定値LOP）を判定することができる。
【００４９】
つまり、ケースCA3では、S[i]^C[i]^CI[i]＝１であるので、ゼロカウント無のLZP[i]＝０、ワンカウント有のLOP[i]＝１となる。
【００５０】
ケースCA6では、S[i]^C[i]^CI[i]＝０であるので、ゼロカウント有のLZP[i]＝１、ワンカウント無のLOP[i]＝０となる。
【００５１】
同様に、ケースCA9では、S[i]^C[i]^CI[i]＝１であるので、ゼロカウント無のLZP[i]＝０、ワンカウント有のLOP[i]＝１となる。
【００５２】
上記のケースCA1,CA4,CA7とCA3,CA6,CA9の場合、LZP[i]、LOP[i]に誤りはない。
【００５３】
（３）そして、S[i-1],C[i-1]が０,１または１,０の場合（ケースCA2,CA5,CA8）、キャリーインCI[i]が発生する可能性があるだけなので、上記のように２ビットのS[i:i-1],C[i:i-1]だけからは、ゼロカウント有かワンカウント有かを判定できない。つまり、下位の[i-2]からキャリーが上がってくれば、[i-1]からキャリーが上がり、キャリーインCI[i]＝１になるが、下位の[i-2]からキャリーが上がってこなければ、[i-1]からキャリーが上がらず、キャリーインCI[i]＝０になる。したがって、図中、キャリーインCI[i]＝0/1と示している。
【００５４】
そこで、半加算値S[i]^C[i]＝０の場合（CA2,CA8）、このビット[i]で必ずキャリー伝播が止まるので、キャリー伝播によるビット反転はビット[i]で止まる。そして、ビット[i]でのゼロカウント判定値LZP及びワンカウント判定値LOPが[i-1]からのキャリー伝播により異なる可能性がある。そこで、LZPもLOPも、ゼロカウント無LZP[i]＝０、ワンカウント無LOP[i]＝０とし、エンコーダがカウント値を少なく数えるようにする。但し、このような論理により各カウントLZC, LOCが少なくなった場合は、図示しない別の回路で生成されるエラー信号LZP_ERROR、LOP_ERRORにより正規化シフトを追加することで補正を行うことができる。
【００５５】
一方、半加算値S[i]^C[i]＝１の場合（CA9）、キャリーインCI[i]＝１の場合に、[i+1]ビットにキャリーが伝播するので、カウント有無の判定は[i+1]ビットに委ねることにして、[i]ビットではゼロカウント有LZP[i]＝１、ワンカウント有LOP[i]＝１とする。つまり、エンコーダがカウント値を多く数える可能性（[i-1]からキャリーイン無ならLZP＝１でLZCが+1誤り,キャリーイン有ならLOP=1でLOCが+1誤り）を許容する。ここで、カウント有無の判定は[i+1]ビットに委ねるとは、エンコーダが最上位ビット[60]から降順にカウントするので、カウント有無の判定が [i+1]ビットで行われることを示唆している。
【００５６】
図８には、９つのケースCA1-CA9の下に、半加算値S[i]^C[i]=0，１とキャリーインCI[i]＝０，０／１，１の６つの組み合わせが、９つのケースCA1-CA9と関連付けて示されている。これを参照して、LZP[i]、LZP[i]の論理式について簡単に説明する。
【００５７】
まず、LOP[i]の論理式（式２）は以下のとおりである。
LOP[i] = (S[i]^C[i]) ^ (S[i-1]&C[i-1])    式２
すなわち、LOP[i]は、半加算値(S[i]^C[i])と、[i-1]ビットだけでキャリーが発生する条件(S[i-1]&C[i-1])のEORである。EORによれば、(S[i]^C[i])=1は、キャリー発生条件(S[i-1]&C[i-1])=0なら1のまま不変だが、(S[i-1]&C[i-1])=1なら0に反転される。同様に、(S[i]^C[i])=0も、(S[i-1]&C[i-1])=0なら0のまま不変だが、(S[i-1]&C[i-1])=1なら1に反転される。
【００５８】
また、 キャリー発生条件(S[i-1]&C[i-1])=1ならキャリーインCI[i]=1と確定するが、 (S[i-1]&C[i-1])＝０ならキャリーインCI[i]＝0/1となり、0,1のいずれになるかは[i-2]ビットからのキャリー発生に依存する。
【００５９】
したがって、LOP[i]の式２によれば、半加算値が(S[i]^C[i])=0の場合（左から３列）、キャリー発生条件が(S[i-1]&C[i-1])=0なら、式２において、半加算値(S[i]^C[i])=0が反転されず、LOP[i]=0となる（CA1,7及びCA2,8）。逆に、(S[i-1]&C[i-1])=1なら、半加算値(S[i]^C[i])=0が反転され、LOP[i]=1となる(CA3,9)。但し、CA2,8では、CI[i]=0/1であり、キャリー発生条件が(S[i-1]&C[i-1])=0は正しくない場合を含むが、式２において、半加算値(S[i]^C[i])=0が(S[i-1]&C[i-1])=0で反転されず、LOP[i]=0となる。つまり、CA2,8は、LOCが少なくカウントされる場合を含む。
【００６０】
また、半加算値が(S[i]^C[i])=1の場合（右から３列）、 (S[i-1]&C[i-1])=0なら、半加算値(S[i]^C[i])=1が反転されず、LOP[i]=1となる(CA4,CA5)。逆に、(S[i-1]&C[i-1])=1なら、半加算値(S[i]^C[i])=1が反転され、LOP[i]=0となる(CA6)。但し、CA5では、CI[i]=0/1であり、キャリー発生条件 (S[i-1]&C[i-1])=0は正しくない場合を含むが、式２において、半加算値(S[i]^C[i])=1が(S[i-1]&C[i-1])=0で反転されず、LOP[i]=1となる。つまり、CA5は、LOCが多くカウントされる場合を含む。
【００６１】
次に、LZP[i]の論理式(式１)は以下のとおりである。
LZP[i] = (S[i]^C[i]) ^ (~S[i-1]&~C[i-1])        式１
すなわち、LZP[i]は、半加算値(S[i]^C[i])はLOP[i]と同じであるが、その半加算値(S[i]^C[i])は、キャリー非発生条件(~S[i-1]&~C[i-1])とEORされている。これは、LOPとは逆に、LZPが先頭ゼロを判定するからである。
【００６２】
つまり、式１において、半加算値(S[i]^C[i])=0の場合（左から３列）、キャリー非発生条件(~S[i-1]&~C[i-1])=1で半加算値=0を反転させてLZP[i]=1（ゼロ有）とし(CA1,7)、キャリー非発生条件(~S[i-1]&~C[i-1])=0では半加算値=0を反転させずLZP[i]=0（ゼロ無）にしている(CA2,8及びCA3,9)。CA2,8ではLZCが少なくカウントされる可能性がある。
【００６３】
逆に、半加算値(S[i]^C[i])=1の場合（右から３列）、キャリー非発生条件(~S[i-1]&~C[i-1])=1で半加算値=1を反転しLZP[i]=0とし(CA4)、キャリー非発生条件(~S[i-1]&~C[i-1])=0では半加算値=1を反転させずLZP[i]=1（ゼロ有）にしている(CA5,6)。CA5ではLZCが多くカウントされる可能性がある。
【００６４】
次に、ケースCA5の場合に、LZP[i]＝LOP[i]=1とLZCとLOCを多くカウントするようにしても、一般に問題がないことを説明する。
【００６５】
図９は、ワンカウント判定信号LOPの３つの例とワンカウントLOCとの関係を示す図である。但し、ゼロカウント判定値LZPとゼロカウントLZCも同様である。図中、３つの例（１）（２）（３）の[i+1][i1][i-1]ビットを見ると、下位側から順にCA5,CA5,CA2/8となっている。これは、LOPもLZPも、[i]がCA5なら [i+1]はCA2,CA5,CA8のいずれかになるからである。このことは、図８の９通りで、CA5ではS[i],C[i]=0,1であるので、[i+1]ではS[i-1],C[i-1]=0,1になりCA2,CA5, CA8しか取り得ないことから理解できる。つまり、[i]がCA5の場合、[i-1]からキャリーが伝播してくれば[i+1]はCA5になり、[i-1]からキャリーが伝播してこなければ[i+1]はCA2,CA8のどれかになるのである。したがって、下位ビットからのキャリー伝播が連続する場合にCA5が連続し、[i-1]からのキャリー伝播が途切れれば、[i]でのCA5は [i+1]でCA2,CA8のいずれかになる。
【００６６】
そして、前述したとおり、CA2,CA8ではLOP,LZP=0とLOC,LZCをカウントしないようにしていたし、CA5ではLOP,LZP=1とLOC,LZCをカウントするようにしていた。
【００６７】
LOC,LZCは上位ビットからLOP=1、LZP=1の連続数をカウントするので、[i+1]でCA2,CA8になりLOP=0,LZP=0になると、そこでカウントが完了する。その結果、[i+1]の下位側のビット[i][i-1]がCA5の場合、CA5のLOP=1,LZP=1は、LOC,LZCにカウントされることはない。つまり、[i][i-1]のCA5の誤る可能性を含むLOP=1,LZP=1は、[i+1]でCA2,CA8になれば、LOC,LZCになんら影響を与えない。一方、[i][i-1]のCA5の誤る可能性を含むLOP=1,LZP=1は、[i+1]でCA5になれば、LOC,LZCに誤りの影響が継続される。
【００６８】
そこで、図６、７で説明したとおり、LOC,LZCは、有効ビットが埋め込まれている可能性がある[60]ビットから下位側のビットのLOP,LZP=1を降順でカウントし、一旦LOP,LZP=0になるとカウントを終了する。そこで、図９の３つの例（１）（２）（３）について検討する。
【００６９】
例（３）の場合、[60]ビットでCA2,CA8であればLOP,LZP=0となるので、LOC,LZCのカウントは終了し予測左シフト量LSAは0になる。例（１）（２）の場合、[60]ビットがCA5であるので、LOC,LZCは[60:58]のCA5によるLOP,LZP=1をカウントし、予測左シフト量LSAは３になる。
【００７０】
しかし、例（２）では、[61]ビットでCA2,CA8のいずれか（実際にはS[61],C[61]=00故、CA2）であり、本来ならここでLOC,LZCのカウントは終了し、[60:58]のCA5によるLOP,LZP=1のカウントLOC,LZC=3は誤りになる。例（１）は、[61]ビットでCA5であるので、[60:58]のCA5によるLOP,LZP=1のカウントLOC,LZC=3は誤りでないことになる。
【００７１】
結局、CA5が最上位ビットまで続く場合、それらCA5のLOP=1,LZP=1のカウントLOC,LZCは正しいことを意味している。[i]ビットでのCA5は、[i+1]以上にCA5が伝播するか否かを確認しないと誤りが含まれるか否か判定できないのである。
【００７２】
[LZC/LOC補正が必要な場合の分析]
本実施の形態では、図８の９通りのようなS,C,CIのあらゆる組み合わせについてLOP,LZPに誤りが含まれるケースを抽出し、さらに、図３のデータフォーマットの制約に基づいて、LOP,LZPに誤りが含まれるケースを絞り込み、適切なLOC,LZC補正回路を提案する。
【００７３】
図６、７の左シフト量予測回路１７は、全加算器１５の加算結果ADD1に基づいて左シフト量LSAを予測せず、全加算器１５の入力S,Cの式１、２の論理演算により各ビット[i]についてのLZP[i], LOP[i]を求め、最上位ビット[60]からLZP[i]=1, LOP[i]=1をカウントする。論理演算式１、２は、該当ビット[i]と一つ下位ビットの[i-1]の入力S,Cだけで判定するので、最下位からのキャリー伝播を待つ必要がなく、正規化シフト量（左シフト量）の予測演算を高速化できる。
【００７４】
しかし、図９のケースCA2,CA5,CA8のように下位ビット[i-2]からのキャリー伝播の有無によりLZC,LOCのカウント値が少なくなったり、多くなったりする。CA2,CA8のようにLZC,LOCのカウント値が少なくなる誤りの場合は、エラー信号LZP_ERRORにより正規化シフト回路にて追加の左シフトを行うことで正規化シフトを修正できる。しかし、CA5のようにLZC,LOCのカウント値が多くなる誤りの場合は、正規化シフト回路が右シフト回路を有していないので、なんらかのLZC,LOCの補正回路が必要になる。
【００７５】
[ゼロカウント判定値LZP,ワンカウント判定値LOPの入力パターンに対するゼロカウントLZC,ワンカウントLOCに誤りがある可能性について]
図９で説明したとおり、ゼロカウントLZC,ワンカウントLOCに誤りがあるか否かを、最上位ビット[60]でのLZP[60],LOP[60]に誤りの可能性があるか否かを分析する。そのためには、[60][59]ビットのS[60:59],C[60:59]と、[58]ビットのS[58],C[58]に基づくキャリーインCI[59]の全ての組み合わせを分析し、LZC,LOCに誤りのある可能性を抽出してLZC/LOC補正回路を検討すればよい。
【００７６】
図１０は、[60][59]ビットのS[60:59],C[60:59]と、[59]ビットのキャリーインCI[59]の全組み合わせ（３２通り）でのLOP,LZPと、全加算器１５の全加算値ADD1（RESULTのRES）とを示す図である。ここで、全加算値RES（＝ADD1）はRES=S[60:59]+C[60:59]+CI[60:59]である。LZP,LOPは前述の式１、２で求められ、図１０中にも式１，２が示されている。
【００７７】
図１０によれば、最上行の２列と５列では、RES[60]=0だがLZP[60]=0とLZCが少なくカウントされることになり、図８のCA2に該当する。また、最上行の４列と７列では、RES[60]=1だがLZP[60]=1とLZCが多くカウントされることになり、図８のCA5に該当する。
【００７８】
２行の２列と５列では、RES[60]=1だがLZP[60]=1とLZCが多くカウントされることになり、図８のCA5に該当する。また、２行の４列と７列では、RES[60]=0だがLZP[60]=0とLZCが少なくカウントされることになり、図８のCA8に該当する。
【００７９】
３行の２列と５列では、RES[60]=1だがLOP[60]=0とLOCが少なくカウントされることになり、図８のCA2に該当する。また、３行の４列と７列では、RES[60]=0だがLOP[60]=1とLOCが多くカウントされることになり、図８のCA5に該当する。
【００８０】
４行の２列と５列では、RES[60]=0だがLOP[60]=1とLOCが多くカウントされることになり、図８のCA5に該当する。また、４行の４列と７列では、RES[60]=1だがLOP[60]=0とLOCが少なくカウントされることになり、図８のCA8に該当する。
【００８１】
以上、図１０によれば、LZP,LOPを誤るケースは、（A）CA2,CA8のようにLZP,LOP=1とすべきところをLZP,LOP=0と判定してLZC,LOCを少なくカウントするケースと、（B）CA5のようにLZP,LOP=0とすべきところをLZP,LOP=1と判定してLZC,LOCを多くカウントするケースとがあることが判明した。
【００８２】
この場合、（A）少なくカウントするケース（CA2,CA8）は、RES[60:59]=10または01のいずれかであり、CA2,CA8が連続するビットで発生することはなく、つまり下位ビットからのキャリー伝播は必ず[60]ビットで止まり、LZC,LOCは高々１少なくカウントするだけである。このような誤りは、エラー信号により正規化シフト回路（左シフト回路）で再左シフトにより補正可能であり、問題はない。
【００８３】
一方、（B）多くカウントするケース（CA5）は、正規化シフト回路の左シフトでは補正できず、新たに補正用の右シフト回路を設ける必要が生じるので、右シフト回路を設ける代わりにLZC/LOC予測回路で補正することが望ましい。そこで、以降、（B）多くカウントするケース（CA5）について、入力パターンの制約から補正すべきパターンを絞り込む。
【００８４】
再度、図１１は、図１０の（B）多くカウントするケース（CA5）を抽出した図である。なお、加算器CSAは、入力SとCに可換性があるので、図１１の１列と４列及び２列と３列はそれぞれ実質的に重複している。また、各ビット[i],[i-1]での入力S,Cも可換性があるので、図１１の１−４列は全て重複している。但し、以降の分析ではこの８つのケースについて検討する。
【００８５】
次に、フォーマットされたオペランドOP1,OP2,OP3のデータフォーマットに基づいて乗加算回路内のデータのパターンを検討する。
【００８６】
[ワレスツリー１２の出力（つまりCSA１４の入力）SUM,CRYのパターン]
図３のデータフォーマットは、浮動小数点数である正規化数と非正規化数と、整数とに対応するが、LZCは浮動小数点数の演算結果の左シフト（正規化シフト）のシフト量を予測するものである。よって、ワレスツリー１２の入力パターンは浮動小数点数の場合に限定できる。その結果、ワレスツリーの入力パターン（OP1,OP2のフォーマット後のパターン）は、[31:28]=0001または0000に限られる。
【００８７】
したがって、ワレスツリーの出力SUM,CRYの加算値SUM+CRY（OP1,OP2の乗算結果）は、正規化数＊正規化数（0001＊0001=0000001）と、正規化数*非正規化数（0001*0000=00000001）と、非正規化数*非正規化数（0000*0000）のいずれかであり、以下が保証される。
[63:57]=0000001または0000000    保証１
つまり、ワレスツリーの出力パターン（SUN+CRY）は、少なくとも以下が保証される。
[63:58]=000000                  保証２
[入力シフト回路RSFTの出力パターン]
右シフト回路RSFTの入力も浮動小数点数に限定すると、[31:28]=0001または0000に限られる。図４にて説明したとおり、正規化シフト回路１８は、セレクタSEL1が上位側６４ビットSEL_OUT_Hを選択した場合、右シフト量RSAに基づいて左シフトを行い、セレクタSELが下位側６４ビットSEL_OUT_Lを選択した場合、LZC/LOC予測シフト量LSAに基づいて左シフトを行う。
【００８８】
そのため、LZC/LOC予測シフト量LSAが利用されるのは、図４の下位側６４ビットSEL_OUT_Lが選択される場合であり、その場合、第３のオペランドOP3[28]が右シフト回路RSFTにより[60]ビット以下まで右シフトされている。つまり、右シフト回路RSFTが第３のオペランドの数を少なくとも32ビット右シフトしている。
【００８９】
さらに、第１、第２オペランドOP1,OP2の符号と第３オペランドOP3の符号に基づいて、TRUE_ADDとTRUE_SUBの判定が行われる。つまり、TRUE_ADDは、乗算結果と加算オペランドOP3の符号に基づき乗加算を行うケースであり、TRUE_SUBは、乗算結果と加算オペランドOP3の符号に基づき乗減算を行うケースである。
【００９０】
そして、TRUE_SUBの場合は最小右シフト量が３２ビットに制御され、一方、TRUE_ADDの場合は最小右シフト量が３３ビットに制御される。
【００９１】
この理由は、TRUE_ADDの場合、全加算器１５で下位側からの桁上げ（キャリーイン）により、[60]ビットの1が0に変更され[61]ビットが1になる可能性がある。その場合、[60]ビット以下の数を見誤ることがある。そこでTRUE_ADDの場合、最小右シフト量をTRUE_SUBより1ビット多く３３ビットにして、右シフト後のHiddenビットの位置が[59]ビットの位置になるよう制御している。
【００９２】
よって、TRUE_ADDの場合の最小右シフト量は３３であり、少なくとも以下が保証される。
RSFT_OUTPUT[63:60]=0000    保証３
また、TRUE_SUBの場合の最小右シフト量は３２であり、少なくとも以下が保証される。
RSFT_OUTPUT[63:61]=000    保証４
[ワレスツリー出力＋RSFT出力のパターン、ADDERの出力RESのパターン]
次に、ワレスツリー出力＋RSFTの出力＝ADDERの出力RESであり、CSA１４の出力S+C＝RESの上位ビットRES[63:58]について検討する。
【００９３】
ワレスツリー出力とRSFTの出力の加算結果RESは、以下のようになる。
RES[63:58] = 
{SUM[63:58] + CRY[63:58] + (SUM+CRY[57:0]のCO)[58]} + {RSFT[63:58] + (RSFT[57:0]のCO)[58]}
前述の保証２のとおり、SUM+CRYの結果は[63:58]=000000が保証されるため、以下となる。
{SUM[63:58] + CRY[63:58] + (SUM+CRY[57:0]のCO)[58]}=000000
したがって、上記２つの式を整理すると、以下のとおりとなる。
RES[63:58] = RSFT[63:58] + RSFT[57:0]のCO[58]
ここで、RSFT[57:0]のCO[58]は、TRUE_SUBの場合にコンプリメント（２の補数化）を行うときに最下位ビットにCI=1を加算した場合にのみ発生し、一方、TRUE_ADDの場合、RSFT[57:0]のCO[58]は常に0となる。よって、以下のとおりである。
TRUE_ADDの場合、RSFT[57:0]のCO[58] = 0
TRUE_SUBの場合、RSFT[57:0]のCO[58] = 1
そして、前述の保証３，４によれば、以下のとおりである。
TRUE_ADDの場合、RSFT_OUTPUT[63:58]=0000xx    保証３
TRUE_SUBの場合、RSFT_OUTPUT[63:58]=000xxx     保証４
上記の保証３，４のRSFT_OUTPUT[63:58]とRSFT[57:0]のCO[58]を、上記のRES[63:58]に代入すると、CSAの出力S+C=RESの上位ビットRES[63:58]は、以下のとおり保証される。
TRUE_ADDの場合、RES[63:60] = 0000              保証５
TRUE_SUBの場合、RES[63:60] = 111または000      保証６
TRUE_SUBの000は、下位からのキャリーで反転した場合である。
【００９４】
[LZCに誤りがある場合とLOCに誤りがある場合]
図１２は、図１１についてLZCに誤りが発生する可能性がある場合とLOCに誤りが発生する可能性がある場合について上下に分けて示す図である。そこで、以下、LZCに誤りが発生する可能性のある上側のパターンについて、LZCが選択される場合があるか否かについて検討する。
【００９５】
[LZCに誤りがある場合]
図５において、セレクタSEL2がLZCを選択する条件は、以下のとおりである。
LZC_SEL = ~TRUE_SUB + CO*HI0
上記の右辺は、第１項の~TRUE_SUBは減算でないことであるから加算、つまりTRUE_ADD=1の場合にLZC_SEL=1になり、第２項のCO*HI0については、CO[63]=1かつHI0=1の場合CO*HI0=1になりLZC_SEL=1になることをそれぞれ意味する。
【００９６】
そこで、右辺の第１項について、~TRUE_SUB=TRUE_ADD=1の場合、上記の保証５からTRUE_ADD=1ならRES[63:60]=0000が保証されるが、図１２のLZC側の４つのケースは全てRES[60] =1であるため、TRUE_ADD=1には該当しないことが明らかである。
【００９７】
次に、右辺の第２項について、CO*HI0=1の場合、CO[63]=1とは全加算器１５からキャリーアウトが発生すること、ハイゼロHI0=1とはCO加算器１６の入力の上位ビットが補数化（コンプリメント）によりALL１であることをそれぞれ意味する。そこで、HI0=1とCO[63]=1とによりCO加算器１６の出力の上位ビットはALL0となり、セレクタSEL1は下位側の６４ビットをセレクトする。つまり、乗算結果から加算オペランドOP3を減算した結果が正であったことを表す。
【００９８】
そこで、図１２のLZC側の４つのケースを見ると、[60]ビットでキャリーアウトは発生していないので、CO[63]=0であることは自明である。したがって、第２項の条件はCO*HI0=0となる。
【００９９】
その結果、上記のLZC_SELの右辺の第１項も第２項も共に0であり、必ずLZC_SEL=0となり、LZCが選択されることはなく、LZCの誤差を補正する必要性がないことが理解できる。
【０１００】
[LOCに誤りがある場合]
次に、図１２のLOCに誤りが発生する可能性のあるパターンについて検討する。図７においてセレクタSEL2がLOCをLSFTのシフト量SAとしてセレクトする条件は、以下のとおりである。
LOC_SEL = TRUE_SUB*~CO
ここで、TRUE_SUBとは減算を、~COとは全加算器１５のキャリーオーバCO[63]の否定を意味する。つまり、LOCがセレクトされる条件は、減算で且つCO[63]=0を意味する。TRUE_SUB=1且つCO[63]=0は、全加算器での減算においてキャリーオーバが発生しなかったことであり、減算結果が負であったことを意味する。
【０１０１】
前述の保証６によれば、TRUE_SUBの場合に全加算器１５の出力RES[63:61]は、次のことが保証されていた。
RES[63:61]=111または000    保証６
したがって、
RES[63:61] = S[63:61] + C[63:61] + CI[61] = 111または000
一方、図１２のLOCに誤りが発生する可能性のある４パターンでは、全てCI[61]=1であるので、上記の式にCI[61]=1を代入して、以下が得られる。
RES[63:61] = S[63:61] + C[63:61] + 1 = 111または000
これを変形すると、以下が得られる。
S[63:61] + C[63:61] = 110または111
ここで、上記のS[63:61] + C[63:61] = 111の場合を検討すると、図１２の下側の４パターンのS,C,CIの組み合わせでは全てCI[61]=1になるので、111が反転され000となりCO[63]=1が発生する。この場合、上記のLOCをセレクトする条件LOC_SEL = TRUE_SUB*~COにおいて、~CO=0となり、LOC_SEL=0となりLOCがセレクトされる条件が成立しない。
【０１０２】
つまり、減算でRES[63:61]=000とは、キャリーオーバCO[63]=1が発生して減算結果が正になったことを意味するので、LOCが選択されることはない。
【０１０３】
一方、上記のS[63:61] + C[63:61] = 110の場合を検討すると、この式を満たすS[63:61]とC[63:61]の組み合わせは、図１３の８パターンである。
【０１０４】
図１３は、S[63:61] + C[63:61] = 110を満たすS[63:61]とC[63:61]の８つのパターンを示す図である。８つのパターンは、S[63:61]+C[63:61]が、6+0, 5+1, 4+2, 3+3, 2+4, 1+5, 0+6, 7+7(但し10進数表記)に対応する。
【０１０５】
ここで、図１３のCSAの入力S[63:61]とC[63:61]の８つのパターンについて、CSAの入力パターンで保証されていること（保証２と保証４）に基づいて、絞り込むことを行う。
【０１０６】
まず、TRUE_SUB=1の場合は、前述の保証４によれば以下のとおりである。
RSFT[63:61]=111    保証４
また、前述の保証２によれば、次のとおりである。
SUM[63:58] + CRY[63:58] = 000000    保証２
図１４は、上記の保証４と保証２を満たすCSAの入力SUM,CRY,RSFTのパターンを示す図である。図１４では、SUMとCRYは可換であり、同じビットでも可換であるので、可換な組み合わせは重複を避けて省略する。RSFTもSUM,CRYと可換であるが、図１４ではSUM,CRYと区別する。６つのパターンP_a〜P_fでは、SUMとCRYの組み合わせは、保証２を満たす組み合わせである。また、RSFTの[60]ビットは0/1のいずれでも良いので"x"としている。そのため、パターンP_fはRSFT[60]=ｘ（不定）であるため、C[60]=ｘ（不定）になっている。また、６つのパターンそれぞれについてのCSAの出力S,Cが示されている。
【０１０７】
図１４のCSAの出力S,Cの６つの組み合わせと、図１３のS[63:61]+C[63:61]=110を満たすCSAの出力S,Cの８つの組み合わせとで重複する組み合わせは、パターンP_fである。
【０１０８】
図１４の下段はパターンP_fをRSFTをRSFT[60]=0と1に分けたパターンP_f0, P_f1を示している。下段の２つのパターンP_f0,P_f1のうち、図１３の組み合わせと重複する組み合わせは、パターンP_f0であることが理解できる。
【０１０９】
パターンP_f0は、CSAへの入力SUM,CRY,RSFTと、CSAの出力S,Cとが含まれる。したがって、このパターンP_f0を他のパターンと区別するためには、CSAの入力SUM,CRY,RSFTの[60]ビットの組み合わせ、または、CSAの出力S,Cの[61]ビットの組み合わせのいずれかを判定すればよい。
【０１１０】
CSAの入力SUM,CRY,RSFTの[60]ビットの組み合わせ（SUM[60],CRY[60],RSFT[60]=100 or 010）で区別する場合は、判別式は以下のとおりである。
P_f0 = (SUM[60] ^ CRY[60]) & ~RSFT[60]      判別式１０
ここで、SUMとCRYが入れ替わることがあるので、SUMとCRYとはEORで0/1,1/0の組み合わせを特定している。
【０１１１】
一方、CSAの出力S,Cの[61]ビットの組み合わせ(S[61],C[60]=00)で区別する場合は、判別式は以下のとおりである。
P_f0 = ~S[61] & ~C[61] = ~(S[61] + C[61])          判別式１１
つまり、~S[61]と~C[61]のＡＮＤ演算か、S[61]とC[61]のＮＯＲ演算結果が真（＝１）であれば補正イネーブル状態を示す補正フラグFLAG=1を生成する回路により判別できる。
【０１１２】
［LZP,LOPが誤る場合のLZC,LOCの補正回路］
図１５は、図１２の（LOC）の４つのパターンに図１４のパターンP_f0を適用した図である。図５，６で説明したとおり、LOPは[60]ビット以下で生成され、LOCはLOP[60]から１をカウントする。したがって、図１５にはLOP=1と誤る例が[60]ビットに,LOP[60]=1と示される。
【０１１３】
図１５のパターンによれば、乗加算結果RES[60]=0であるので、本来ならワンカウント判定はLOP[60]=0となる。そして、LOP[60]=0の場合、エンコーダのカウント値LOCは、LOP[60]=0によりLOC=0となる。したがって、LOC補正処理は、LOC=0にする処理であればよい。LOC=0に補正する処理は、例えば以下の例がある。
（１）LOP[60]を０に補正する。
（２）LOC[5:0]をLOC[5:0]=0に補正する。
【０１１４】
そして、前述の判別式１０または１１が満たされる場合に、上記の（１）（２）の補正処理を行えばよい。そこで、判別式１０または１１が満たされる場合に補正イネーブル状態を示す補正フラグFLAG=1を発生する回路を設け、補正フラグFLAG=1の場合に、LOP[60]=0にするワンカウント判定値補正回路か、LOC=0にするワンカウント値補正回路のいずれかを設ければよい。そのような回路を設けることで、LOP,LZP＝１が誤っている可能性がある場合に、適切にLOC,LZCを補正することができる。但し、前述したとおり、LZP＝１が誤っている可能性がある場合とLZCが選択される場合が同時に満たされる場合がないので、LOP=1が誤っている可能性がある場合（CA5の場合）に、判別式１０または１１が満たされる補正イネーブル状態の時にLOP[60]またはLOCを適切に補正すれば良い。
【０１１５】
補正フラグFLAGを発生する論理式は、前提条件となるLOC_SEL=1の条件TRUE_SUB=1と、パターンP_f0を判別する判別式１０または判別式１１とのANDになる。したがって、補正フラグFLAGを発生する論理式は、次のとおりである。
FLAG = TRUE_SUB & P_f0
= TRUE_SUB & {(SUM[60] ^ CRY[60]) & ~RSFT[60]}    FLAG判定１
or
= TRUE_SUB & (~S[61] & ~C[61]) = TRUE_SUB & ~( S[61] +~C[61])    FLAG判定２
図1、図５に示した第1の実施の形態では、補正判定回路CRCT_1が上記のFLAG判定２を満たす時に補正フラグFLAGを生成し、ワンカウント補正回路であるゼロマスク回路ZERO_MがワンカウントLOCをゼロに補正する演算を行っている。このゼロマスク回路ZERO_Mが、ワンカウント値補正回路である。また、図５には、~S[61] と~C[61]のAND演算器を有する補正判定回路CRCT_1が示されている。この演算器は、S[61] とC[61]のNAND演算器でも良い。なお、セレクタSEL2がLOCを選択する場合はTRUE_SUB=1になるので、図５の補正判定回路CRCT_1ではTRUE_SUB=1を判別していない。
【０１１６】
上記したとおり、LOC=0に補正する別の手段は、LOP[60]=0に変更する手段である。LOP[60]=0に変更する手段を採用する場合は、図６のLOC回路内のLOP回路の出力LOP[60]を補正フラグFLAGによりゼロマスクするゲート（図５のゼロマスクZERO_Mと同じゲート）を設ければよい。つまりLOP[60]=~FLAG & LOP[60]のゲート回路を設ければよい。
【０１１７】
［第２の実施の形態］
図１６は、第２の実施の形態における演算回路の一例である乗加算回路を示す図である。第２の実施の形態における乗加算回路は、左シフト量予測回路１７が全加算器１５の入力S,Cに加えて、CSA１４の入力、つまりワレスツリー１２の出力SUM,CRYと右シフト回路１３の出力RSFT_Lに基づいて、正規化シフト量LSAを補正する。この構成が、図１の第１の実施の形態の乗加算回路と異なる。第２の実施の形態においても、第１の実施の形態と同様に、左シフト量予測回路１７は、全加算器１５の入力、つまりCSAの出力S,Cに基づいてLZCとLOCを予測する。
【０１１８】
図１７は、第２の実施の形態における左シフト量予測回路１７の構成例を示す図である。図中、LZC回路、LOC回路は図５と同等である。一方、補正判定回路CRCT_2は、CSAの入力SUM[60],CRY[60],RSFT[60]を入力し、補正フラグFLAGを生成する補正判定回路CRCT_2が設けられている。補正判定回路CRCT_2は、SUM[60],CRY[60]のEORを演算し、EOR出力とRSFT[60]の反転信号のANDを演算して、補正フラグFLAGを生成する。そして、補正フラグFLAGに応答して、ワンカウント補正回路ZERO_MがワンカウントLOCを０に補正している。
【０１１９】
第1の実施の形態で述べたとおり、LOC=0に補正する別の手段は、LOP[60]=0に変更する手段である。LOP[60]=0に変更する手段を採用する場合は、図１７のLOC回路内のLOP回路の出力LOP[60]を補正フラグFLAGによりゼロマスクするゲート（図５のZERO_Mと同じゲート）を設ければよい。つまりLOP[60]=~FLAG & LOP[60]のゲート回路を設ければよい。
【０１２０】
以上説明したとおり、第1及び第２の実施の形態によれば、LOC回路のLOCカウント値を補正するLOC補正回路を、簡単な回路で構成することができる。
【符号の説明】
【０１２１】
OP1,OP2,OP3：オペランド
FORMAT：フォーマット変換回路
RSFT：入力シフト回路（右シフト回路）
１０：ブースデコーダ
１１：ブースセレクタ
１２：ワレスツリー回路
CSA：キャリー保存加算器
ADDER：全加算器
１７：左シフト量予測回路
１８：正規化シフト回路、左シフト回路
LOP：ワンカウント判定回路、ワンカウント判定値
LOC：ワンカウント回路、ワンカウント
LZP：ゼロカウント判定回路、ゼロカウント判定値
LZC；ゼロカウント回路、ゼロカウント
CRCT：補正判定回路
ZERO_M：ゼロマスク回路、ワンカウント補正回路
【図１】
2018195228.tif 000003
【図２】
2018195228.tif 000004
【図３】
2018195228.tif 000005
【図４】
2018195228.tif 000006
【図５】
2018195228.tif 000007
【図６】
2018195228.tif 000008
【図７】
2018195228.tif 000009
【図８】
2018195228.tif 000010
【図９】
2018195228.tif 000011
【図１０】
2018195228.tif 000012
【図１１】
2018195228.tif 000013
【図１２】
2018195228.tif 000014
【図１３】
2018195228.tif 000015
【図１４】
2018195228.tif 000016
【図１５】
2018195228.tif 000017
【図１６】
2018195228.tif 000018
【図１７】
2018195228.tif 000019