(57)【要約】【課題】固定精度の浮動小数点数同士の加減算値に対する補正値を求める処理を効率的に実現する演算方式を提供する。【解決手段】演算回路は、第１の指数部から第２の指数部と第１の仮数部の先行ゼロ計数値とを減算した値をシフト量として生成するとともに、第１の指数部から第１の仮数部の先行ゼロ計数値と第１の所定値とを減算した第３の指数部を生成する演算部と、シフト量に基づき第１の仮数部をシフトしたシフト後仮数部を生成するシフト部と、シフト後仮数部と第２の仮数部の一部を加算した加算値を生成するとともに、加算により生じたキャリーを生成する加算部と、シフト後仮数部とシフト量とキャリーとを入力し、桁溢れ及び桁落ちが生じる旨をそれぞれ表すフラグを生成する予測部と、加算値と第３の指数部とフラグとに基づいて、補正値仮数部と補正値指数部を生成する生成部を有する。【選択図】図２３
2014041563.tif 000002
【特許請求の範囲】
【請求項１】
Ｎ進法（Ｎは２以上の整数）による第１の浮動小数点数と前記Ｎ進法による前記第１の浮動小数点数以下の第２の浮動小数点数を加減算した値である加減算値に対する補正値を算出する演算回路において、
前記第１の浮動小数点数の符号部である第１の符号部と、前記第１の浮動小数点数の仮数部である第１の仮数部と、前記第１の浮動小数点数の指数部である第１の指数部を保持する第１の入力レジスタと、
前記第２の浮動小数点数の符号部である第２の符号部と、前記第２の浮動小数点数の仮数部である第２の仮数部と、前記第２の浮動小数点数の指数部である第２の指数部を保持する第２の入力レジスタと、
前記第１の指数部から前記第２の指数部を減算した値からさらに前記第１の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した値から第１の所定値を減算した第３の指数部を生成する演算部と、
生成された前記シフト量に基づき、前記第１の仮数部をシフトしたシフト後仮数部を生成するシフト部と、
生成された前記シフト後仮数部と前記第２の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、
前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、
前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した第１の値と前記第２の指数部から前記第２の仮数部の先行ゼロ計数値を減算した第２の値との差が第２の所定値以上の場合、前記第２の入力レジスタに保持される前記第２の符号部と前記第２の仮数部と前記第２の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第２の所定値未満の場合、前記加算値と前記第３の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部
を有することを特徴とする演算回路。
【請求項２】
前記演算回路において、前記演算部は、前記第１の仮数部の先行ゼロ計数値が奇数の場合、前記第１の指数部から前記第２の指数部を減算した値からさらに前記第１の仮数部の先行ゼロ計数値を減算した値を１減分した値を前記シフト量として生成することを特徴とする請求項１記載の演算回路。
【請求項３】
前記演算回路において、前記予測部は、前記シフト後仮数部と前記シフト量と前記キャリー情報を入力し、前記シフト後仮数部の先頭桁から前記Ｎ進法による計数した１桁の所定数が連続する個数が前記シフト量以上であり、かつ、前記キャリー情報が１であり、かつ、演算が加算の場合、前記桁溢れを示す前記フラグを生成するとともに、前記シフト後仮数部の先頭桁から計数した０が連続する個数が前記シフト量以上であり、かつ、前記キャリー情報が１であり、かつ、演算が減算の場合、前記桁落ちを示す前記フラグを生成することを特徴とする請求項１記載の演算回路。
【請求項４】
前記演算回路において、前記予測部は、前記シフト後仮数部の先頭桁から０が連続する個数を計数する場合に、１が出現したときは１回だけ出現した前記１を０として計数することを特徴とする請求項３記載の演算回路。
【請求項５】
前記演算回路において、前記生成部は、前記第１の仮数部の桁幅と前記シフト量と前記フラグに基づきマスク量を生成し、生成された前記マスク量に基づき前記第２の仮数部又は前記加算値の上位桁を０でマスクし、前記第２の仮数部がマスクされたマスク後仮数部又は前記加算値がマスクされたマスク後加算値の先行ゼロ計数値である第３の先行ゼロ計数値を生成し、前記第３の指数部から前記第３の先行ゼロ計数値を減算した値を前記補正値指数部として生成するとともに、前記マスク後加算値の先行ゼロ計数値に基づいて前記マスク後仮数部又は前記マスク後加算値をシフトした値を前記補正値仮数部として生成することを特徴とする請求項１記載の演算回路。
【請求項６】
Ｎ進法（Ｎは２以上の整数）による第１の浮動小数点数と前記第１の浮動小数点数以下である前記Ｎ進法による第２の浮動小数点数の加減算値に対する補正値を算出する演算回路と、前記補正値を算出する修正値演算命令をデコードする命令制御部とを有する演算処理装置において、
前記演算回路は、
前記第１の浮動小数点数の符号部である第１の符号部と、前記第１の浮動小数点数の仮数部である第１の仮数部と、前記第１の浮動小数点数の指数部である第１の指数部を保持する第１の入力レジスタと、
前記第２の浮動小数点数の符号部である第２の符号部と、前記第２の浮動小数点数の仮数部である第２の仮数部と、前記第２の浮動小数点数の指数部である第２の指数部を保持する第２の入力レジスタと、
前記第１の指数部から前記第２の指数部を減算した値からさらに前記第１の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した値から第１の所定値を減算した第３の指数部を生成する演算部と、
生成された前記シフト量に基づき、前記第１の仮数部をシフトしたシフト後仮数部を生成するシフト部と、
生成された前記シフト後仮数部と前記第２の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、
前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、
前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した第１の値と前記第２の指数部から前記第２の仮数部の先行ゼロ計数値を減算した第２の値との差が第２の所定値以上の場合、前記第２の入力レジスタに保持される前記第２の符号部と前記第２の仮数部と前記第２の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第２の所定値未満の場合、前記加算値と前記第３の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部
を有することを特徴とする演算処理装置。
【請求項７】
Ｎ進法（Ｎは２以上の整数）による第１の浮動小数点数の符号部である第１の符号部と、前記第１の浮動小数点数の仮数部である第１の仮数部と、前記第１の浮動小数点数の指数部である第１の指数部を保持する第１の入力レジスタと、前記Ｎ進法による第２の浮動小数点数の符号部である第２の符号部と、前記第２の浮動小数点数の仮数部である第２の仮数部と、前記第２の浮動小数点数の指数部である第２の指数部を保持する第２の入力レジスタを有し、前記第１の浮動小数点数と前記第１の浮動小数点数以下である前記第２の浮動小数点数の加減算値に対する補正値を算出する演算回路と、前記補正値を算出する補正値演算命令をデコードする命令制御部とを有する演算処理装置の制御方法において、
前記命令制御部が、補正値演算命令をデコードし、
前記演算回路が有する演算部が、前記第１の指数部から前記第２の指数部を減算した値からさらに前記第１の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した値から第１の所定値を減算した第３の指数部を生成し、
前記演算回路が有するシフト部が、生成された前記シフト量に基づき、前記第１の仮数部をシフトしたシフト後仮数部を生成し、
前記演算回路が有する加算部が、生成された前記シフト後仮数部と前記第２の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成し、
前記演算回路が有する予測部が、前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成し、
前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した第１の値と前記第２の指数部から前記第２の仮数部の先行ゼロ計数値を減算した第２の値との差が第２の所定値以上の場合、前記演算回路が有する生成部が、前記第２の入力レジスタに保持される前記第２の符号部と前記第２の仮数部と前記第２の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成し、
前記第１の絶対値が前記第２の所定値未満の場合、前記生成部が、前記加算値と前記第３の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成することを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本願開示は、演算回路、演算処理装置、及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
銀行システムなどの勘定系や、一部の科学技術計算などでは、数値表現や演算における誤差を小さくするために、単精度の数値表現形式のビット幅の数倍のビット幅を有する多倍長、または、可変長の数値表現形式が採用されることがある。このような場合、符号と指数をひとつの整数で表現し、仮数については、それとは別の整数の列で表現することが多い。また、このような数値表現を採用した場合には、数値同士の計算を、整数演算を利用して実現することも多い。
【０００３】
しかし、多倍長、可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する方法も提案されている（例えば非特許文献１及び非特許文献２）。固定精度の浮動小数点演算はハードウェアが高速な処理手段を提供している場合が多いため、このような方法をもちいることで、処理の高速化をはかることができる。多倍長の二進浮動小数点演算を、二倍長の浮動小数点演算をもちいて行うようなライブラリも存在する（例えば非特許文献３）。
【０００４】
これらの方法は、ひとつの数を、固定精度浮動小数点数の組（要素同士の足し算を実行せず、組のまま用いることから「未評価の和」とも呼ばれる）で表現し、その組同士の算術を適切に設計することで、大きな精度の算術を実現している。
【０００５】
これら先行研究においては、固定精度の浮動小数点演算として、通常用意されている算術演算のみを前提として、各種算術が設計されている。それに対し、専用の命令を追加することによって、より効率のよい処理を行う方法が提案されている（例えば特許文献１）。そのアルゴリズムは次のようになる。固定精度の浮動小数点数同士の正確な和を実現するために、計算結果を２つの固定精度の浮動小数点数ｚ及びｚｚに格納している。
【０００６】
Two-sum-fast(x, y)
z = fi(x + y)
zz = get_zz(x, y)
return(z, zz)
ｆｉ（ｘ＋ｙ）と書かれた演算は、固定精度浮動小数点演算としての加算である。ｇｅｔ＿ｚｚが新たに追加された命令である。
【０００７】
このＴｗｏ−ｓｕｍ演算によって得られる２つの数ｚ及びｚｚは、ｚ＋ｚｚ＝ｘ＋ｙを満たす。ｚはｘ＋ｙの最重要部（most significant part）を固定精度浮動小数点の精度内で表現した値である。ｚｚは固定精度浮動小数点の精度で表現しきれなかった残余分（加減算値に対する補正値）を表す。図１にその模式図を示す。図１（ａ）には、第１の固定精度浮動小数点数が示され、図１（ｂ）には、第２の固定精度浮動小数点数が示される。図１（ｃ）には、第１の固定精度浮動小数点数の仮数部と第２の固定精度浮動小数点数の仮数部とを桁を合わせて並べ、加算したときのｚとｚｚとを示している。
【０００８】
上記のアルゴリズムを実現するためには、ｆｉ（ｘ＋ｙ）の結果が桁溢れ或いは桁落ちした時、それをｇｅｔ＿ｚｚ処理（加減算値に対する補正値を求める処理）の結果に反映させなければならない。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特願２０１１−０８５８８２号
【非特許文献】
【００１０】
【非特許文献１】T. Dekker, A Floating-Point Technique for Extending the Available Precision, Number. Math. vol. 18, pp.224-242, 1971.
【非特許文献２】D. Priest, On Property of Floating Point Arithmetics: Numerical Stability and the Cost of Accurate Computations, PhD thesis, University of California, Berkeley, November 1992.
【非特許文献３】Yozo Hida, Xiaoye S. Li, David H. Bailey, Library for Double-Double and Quad-Double Arithmetic, 29 December 2007.
【発明の概要】
【発明が解決しようとする課題】
【００１１】
以上を鑑みると、浮動小数点数同士の加減算値に対する補正値を求める処理を、効率的に実現する演算方式が望まれる。
【課題を解決するための手段】
【００１２】
Ｎ進法（Ｎは２以上の整数）による第１の浮動小数点数と前記Ｎ進法による前記第１の浮動小数点数以下の第２の浮動小数点数を加減算した値である加減算値に対する補正値を算出する演算回路は、前記第１の浮動小数点数の符号部である第１の符号部と、前記第１の浮動小数点数の仮数部である第１の仮数部と、前記第１の浮動小数点数の指数部である第１の指数部を保持する第１の入力レジスタと、前記第２の浮動小数点数の符号部である第２の符号部と、前記第２の浮動小数点数の仮数部である第２の仮数部と、前記第２の浮動小数点数の指数部である第２の指数部を保持する第２の入力レジスタと、前記第１の指数部から前記第２の指数部を減算した値からさらに前記第１の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した値から第１の所定値を減算した第３の指数部を生成する演算部と、生成された前記シフト量に基づき、前記第１の仮数部をシフトしたシフト後仮数部を生成するシフト部と、生成された前記シフト後仮数部と前記第２の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、前記第１の指数部から前記第１の仮数部の先行ゼロ計数値を減算した第１の値と前記第２の指数部から前記第２の仮数部の先行ゼロ計数値を減算した第２の値との差が第２の所定値以上の場合、前記第２の入力レジスタに保持される前記第２の符号部と前記第２の仮数部と前記第２の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第２の所定値未満の場合、前記加算値と前記第３の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部を有することを特徴とする。
【発明の効果】
【００１３】
少なくとも１つの実施例によれば、浮動小数点数同士の加減算値に対する補正値を、上位桁側の加算の結果の桁溢れ又は桁落ちを予測して計算することで、上位桁側加算処理とは独立の処理により効率的に補正値を計算することができる。
【図面の簡単な説明】
【００１４】
【図１】浮動小数点同士の加算において浮動小数点の精度内で表現した加算値及び表現しきれなかった残余分を模式的に示す図である。
【図２】Ｏｒａｃｌｅ−ｎｕｍｂｅｒの具体例の表を示す図である。
【図３】ｇｅｔ＿ｚｚのアルゴリズムの例として第１のアルゴリズムを示す図である。
【図４】８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第１のアルゴリズムの演算器の構成例である。
【図５】図４に示す演算器における指数仮数演算器の構成の一例を示す図である。
【図６】図４に示す演算器における正規化回路の構成の一例を示す図である。
【図７】ｆｉ（ｘ＋ｙ）のアルゴリズムの一例を示す図である。
【図８】ｇｅｔ＿ｚｚのアルゴリズムの一例を示す図である。
【図９】８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第２のアルゴリズムのｆｉ（ｘ＋ｙ）演算器の構成例である。
【図１０】８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第２のアルゴリズムのｇｅｔ＿ｚｚ演算器の構成例である。
【図１１】図９に示すｆｉ（ｘ＋ｙ）演算器における指数仮数演算器の構成の一例を示す図である。
【図１２】図９に示すｆｉ（ｘ＋ｙ）演算器における正規化回路の構成の一例を示す図である。
【図１３】図１０に示すｇｅｔ＿ｚｚ演算器における指数仮数演算器の構成の一例を示す図である。
【図１４】図１０に示すｇｅｔ＿ｚｚ演算器における重複桁追い出し回路の構成の一例を示す図である。
【図１５】図１０に示すｇｅｔ＿ｚｚ演算器における正規化回路の構成の一例を示す図である。
【図１６】ｇｅｔ＿ｚｚのアルゴリズムの一例を示す図である。
【図１７】（ａ）は、桁溢れ予測処理の流れの一例を示すフローチャートであり、（ｂ）は桁溢れ予測処理の流れの一例を示すフローチャートである。
【図１８】先行ゼロ計数処理の例を示す図である。
【図１９】（ａ）及び（ｂ）はそれぞれ、２進表現において桁溢れの発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。
【図２０】（ａ）及び（ｂ）はそれぞれ、２進表現において桁落ちが１桁発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。
【図２１】（ａ）及び（ｂ）はそれぞれ、２進表現において桁落ちが３桁発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。
【図２２】コンピュータシステムの構成の一例を示す図である。
【図２３】８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算するｇｅｔ＿ｚｚ演算器の構成の一例を示す図である。
【図２４】図２３に示すｇｅｔ＿ｚｚ演算器における指数仮数演算器の構成の一例を示す図である。
【図２５】図２３に示すｇｅｔ＿ｚｚ演算器におけるＯＶＦ・ＵＤＦ予測回路の構成の一例を示す図である。
【図２６】図２３に示すｇｅｔ＿ｚｚ演算器における重複桁追い出し回路の構成の一例を示す図である。
【図２７】８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算するｆｉ（ｘ＋ｙ）演算器の構成例である。
【図２８】ｇｅｔ＿ｚｚ演算とｆｉ（ｘ＋ｙ）演算との両方を実行可能な演算器の構成の一例を示す図である。
【図２９】図２８に示す演算器における指数仮数演算器の構成の一例を示す図である。
【図３０】図２８に示す演算器における重複桁追い出し回路の構成の一例を示す図である。
【発明を実施するための形態】
【００１５】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。なお各図面において、同一又は対応する構成要素は同一又は対応する名称又は番号で参照し、その説明は適宜省略する。
【００１６】
以下の説明では、オラクルデータベース（商標）で用いられる数値型であるＯｒａｃｌｅ−ｎｕｍｂｅｒ（商標）形式１０進浮動小数点数を数値表現の一例として用いる。Ｏｒａｃｌｅ−ｎｕｍｂｅｒは、最大２１バイトの可変長データ形式である。第１バイトに符号及び指数が格納され、後続バイトに仮数が格納される。仮数部は最大で２０バイトである。
【００１７】
Ｏｒａｃｌｅ−ｎｕｍｂｅｒは、１０進浮動小数点数を表現するためのデータ形式である。主にメモリ使用効率上の理由から、仮数部は、１バイトあたり１０進２桁分のデータを保持する。またそれにあわせて、指数部は、基数１００に対する指数が格納される。Ｏｒａｃｌｅ−ｎｕｍｂｅｒで表現される数は、以下の形式で表すことができる。
【００１８】
number = ± （M00 . M01 M02 ...) * 100^(exp)
ここでＭ００、Ｍ０１、Ｍ０２、・・・は、最大２０バイトで表現される仮数部における第１バイト、第２バイト、第３バイト、・・・の各バイトの格納データを示す。仮数部は１０進２桁毎に区切られているため、１００進２０桁とみなすこともできる。Ｏｒａｃｌｅ−ｎｕｍｂｅｒは、この１００進表現でみなしたときに必ず正規化されており、Ｍ００部（仮数部第１バイト）が０になることはない。
【００１９】
Ｏｒａｃｌｅ−ｎｕｍｂｅｒ表現の第１バイト（全体の第１バイト）は、符号及び指数部であり、次のように符号化される。
【００２０】
number > 0 の場合：第１バイト = exp + 193
number == 0 の場合：第１バイト = 128
それ以外の場合：第１バイト = 62 - exp
第２バイト以降の仮数部は、バイト毎にＭ００、Ｍ０１、・・・を保持する。各バイトにおいては、表現する数値の符号に応じて、以下に示すように異なった符号化がもちいられる。
【００２１】
number > 0 の場合：仮数部の第ｎバイト = M(n-1) + 1
number == 0 の場合：仮数部はない
それ以外の場合：仮数部の第ｎバイト = 101 - M(n-1)
上記の符号化において、Ｍｎは０以上且つ９９以下であるので、仮数部バイトの値に０Ｘ００が出現することがない。表現対象の数が短い仮数部で表現可能な場合には、Ｏｒａｃｌｅ−ｎｕｍｂｅｒは２１バイトよりも短く切り詰められる。即ち、Ｏｒａｃｌｅ−ｎｕｍｂｅｒの仮数部には後続ゼロは許されていない。なお負数の表現においては、仮数部が ２０バイトよりも短い場合には、仮数の終端を示すため、最後のバイトにターミネータとして１０２（０Ｘ６６）が格納される。
【００２２】
Ｏｒａｃｌｅ−ｎｕｍｂｅｒでは、上記のような符号化方式を採用することで、バイト列としてみたときの大小関係、即ちＣ標準関数ｍｅｍｃｍｐによる比較に基づく大小関係と、Ｏｒａｃｌｅ−ｎｕｍｂｅｒの数値としての大小関係とが等しくなる。
【００２３】
図２は、Ｏｒａｃｌｅ−ｎｕｍｂｅｒの具体例の表を示す図である。例えば１０Ｅ＋０（＝１０×１０００）の表現において、指数部は１９３（＝０＋１９３）であり、仮数部は１１（＝１０＋１）である。また例えば１０Ｅ＋１（＝１×１００１）の表現において、指数部は１９４（＝１＋１９３）であり、仮数部は２（＝１＋１）である。また例えば負の数−１０Ｅ−１３０（＝−１０×１００−６５）の表現において、指数部は１２７（＝６２−（−６５））であり、仮数部は９１（＝１０１−１０）である。また例えば負の数−１０Ｅ−１２９（＝−１×１００−６４）の表現において、指数部は１２６（＝６２−（−６４））であり、仮数部は１００（＝１０１−１）である。なお負の数には、最後のバイトにターミネータとして１０２が付加されている。更に、正の無限大Ｉｎｆ及び負の無限大−Ｉｎｆには、表中に示すような特別なバイト列が割り当てられている。
【００２４】
ｇｅｔ＿ｚｚ命令を実現する一つの方法として、倍幅の中間値、倍幅の加算処理を用いる手法が考えられる。
【００２５】
図３にｇｅｔ＿ｚｚのアルゴリズムの例として第１のアルゴリズムを示す。その手順は以下の通りである。
【００２６】
浮動小数点数で表現されたデータであるＯＰ１とＯＰ２が入力される（ステップＳ１）。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１（Ｎは入力の桁の最大桁幅）以上である時（ステップＳ２でＹＥＳ）、入力を正規化回路へバイパスする特別処理を行う。この時、ｆｉ（ｘ＋ｙ）処理ならば指数の大きいほうを、ｇｅｔ＿ｚｚ処理ならば小さいほうの指数と仮数、そして符号部の組み合わせを正規化回路へバイパスする（ステップＳ３〜Ｓ５）。
【００２７】
ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１未満である時（ステップＳ２でＮＯ）、通常ケースとして桁合わせ処理を行う。ＯＰ１とＯＰ２の指数差を求め、シフトにより桁合わせを行う（ステップＳ６）。加減算処理を行う（ステップＳ７）。この時加算は入力値の有効桁をカバーするため、２Ｎ桁の幅を必要とする。正規化処理を行う（ステップＳ８）。入力をバイパスする特別処理がなされていたならば、そちらを選択する。ｆｉ（ｘ＋ｙ）処理であるならば結果の上位Ｎ桁を、ｇｅｔ＿ｚｚ処理であるならば結果の下位Ｎ桁を選択して出力する（ステップＳ９〜Ｓ１１）。
【００２８】
図４は８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第１のアルゴリズムの演算器の構成例である。図４に示す演算器は、入力Ｘレジスタ１０、入力Ｙレジスタ１１、デコーダ１２及び１３、指数仮数演算器１４、セレクタ１５乃至１７、左シフタ１８、倍長加算器１９、セレクタ２０及び２１、正規化回路２２、エンコーダ２３、出力Ｚレジスタ２４を含む。
【００２９】
図５は、図４に示す演算器における指数仮数演算器１４の構成の一例を示す図である。指数仮数演算器１４は、比較器３１、ＬＺＣ計数器３２及び３３、セレクタ３４乃至３７、絶対値減算器３８乃至４２、比較器４３を含む。図６は、図４に示す演算器における正規化回路２２の構成の一例を示す図である。正規化回路２２は、ＡＮＤ回路５１、絶対値加算器５２、ＬＺＣ計数器５３、ＬＺＣ補正器５４、絶対値減算器５５、左シフタ５６、セレクタ５７及び５８を含む。
【００３０】
以下に、図４乃至図６に示す演算器の動作について説明する。なお８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を例として説明に用いるが、デコード回路とエンコード回路を工夫することで、中身の構成はそのままでＯｒａｃｌｅ−ｎｕｍｂｅｒ形式とその他の形式の両方に対応させることも可能である。
【００３１】
入力と出力とを同精度の浮動小数点数とする。入力データは正規化されていなくともよいが、出力データは必ず正規化される。Ｏｒａｃｌｅ−ｎｕｍｂｅｒの形式として指数部は必ず偶数であるため、前述のアルゴリズムがそれに対応するように改変されている。例えば指数仮数演算器１４において先行ゼロ計数を行った時、結果が必ず偶数になるようにしている。なお図４及び以降の図において、各信号及びデータの表記は、指数ｅｘｐ、仮数Ｔ、先行ゼロ計数値ＬＺＣ、左シフト量Ｌｓｈｉｆｔ、右シフト量Ｒｓｈｉｆｔ、指数比較信号ｃｏｍｐ、バイパスセレクト信号ｂｙｐａｓｓ、桁溢れＯＶＦ、桁落ちＵＤＦである。
【００３２】
まず入力Ｘレジスタ１０と入力Ｙレジスタ１１より、データがデコーダ１２及びデコーダ１３にそれぞれ入力される。デコーダ１２及び１３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力Ｘ及び入力Ｙの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、及び、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【００３３】
指数仮数演算器１４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器１４の比較器３１は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【００３４】
指数仮数演算器１４の絶対値加算器４２及び比較器４３は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路２２へバイパスする演算を行う。指数仮数演算器１４は、仮数Ｔ２とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
【００３５】
指数仮数演算器１４の絶対値減算器４１は、左シフタ１８にシフト量ＲＳＡとして（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を出力する。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１するとする。
【００３６】
指数仮数演算器１４の絶対値減算器４０は、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ計数値を減算した値を指数ｅｘｐ３とし、正規化回路２２に出力する。
【００３７】
左シフタ１８が入力されたシフト量ＲＳＡに基づき、入力された仮数を左シフトする。左シフトされた仮数Ｔ１とシフトされていない仮数Ｔ２とが２Ｎの幅を持つ絶対値加算器１９に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、倍長加算器１９にキャリーとして１を入力する。倍長加算器１９は、入力を加算し、結果を正規化回路２２に出力する。
【００３８】
正規化回路２２へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数が正規化回路２２に入力される。また正規化回路２２へのバイパスセレクト信号が０であるならば加算結果と指数ｅｘｐ３が仮数と指数として正規化回路２２に入力される。
【００３９】
正規化回路２２のＡＮＤ回路５１、絶対値加算器５２、セレクタ５７、及び絶対値減算器５５により、指数から仮数の先行ゼロ計数値を減算し、ｆｉ（ｘ＋ｙ）演算であるか或いはバイパスセレクト信号が１ならば、その結果を指数Ｚとする。またバイパスセレクト信号が０であり且つｇｅｔ＿ｚｚ演算の時は、上記結果から１４をさらに減算して指数Ｚとする。
【００４０】
正規化回路２２の左シフタ５６により、仮数の先行ゼロ計数値だけ仮数を左シフトし、ｆｉ（ｘ＋ｙ）演算であるか又はバイパスされているならば、左シフトの結果の上位１４桁を仮数Ｚとする。またｇｅｔ＿ｚｚ演算であるならば、左シフトの結果の下位１４桁を仮数Ｚとする。
【００４１】
符号、指数Ｚ、仮数Ｚがエンコーダ２３により外部形式に変換され、出力Ｚレジスタ２４に出力される。
【００４２】
以上に第１のアルゴリズムを説明したが、ｇｅｔ＿ｚｚ命令を実現するための第２のアルゴリズムとして、ｆｉ（ｘ＋ｙ）処理で桁溢れと桁落ちの情報を出力し、その情報に基づいてｇｅｔ＿ｚｚ処理を制御するという手法が考えられる。
【００４３】
図７はｆｉ（ｘ＋ｙ）のアルゴリズムの一例を示す図である。図８はｇｅｔ＿ｚｚのアルゴリズムの一例を示す図である。その手順はそれぞれ以下の通りである。
【００４４】
ｆｉ（ｘ＋ｙ）処理においては、まず浮動小数点数で表現されたデータであるＯＰ１とＯＰ２が入力される（ステップＳ２１）。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１以上である時（ステップＳ２２でＹＥＳ）、入力を正規化回路へバイパスする特別処理を行う。この時、指数の大きいほうを結果にバイパスする（ステップＳ２３）。
【００４５】
ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１未満である時（ステップＳ２２でＮＯ）、通常ケースとして桁合わせ処理を行う（ステップＳ２４）。即ち、ＯＰ１とＯＰ２の指数差を求め、シフトにより桁合わせを行う。入力の上位側Ｎ桁の加減算処理を行う（ステップＳ２５）。加算結果から桁溢れ量を出力する（ステップＳ２６）。
【００４６】
正規化処理を行う（ステップＳ２７）。入力をバイパスする特別処理がなされていたならば、そちらを選択する。正規化処理時の先行ゼロ計数値を桁落ち量として出力する（ステップＳ２８）。加算の結果と桁溢れ、桁落ちの個数を出力する（ステップＳ２９）。
【００４７】
ｇｅｔ＿ｚｚ処理においては、まず浮動小数点数で表現されたデータであるＯＰ１とＯＰ２が入力される（ステップＳ３１）。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１以上である時（ステップＳ３２でＹＥＳ）、入力を正規化回路へバイパスする特別処理を行う。この時、指数の小さいほうを結果にバイパスする（ステップＳ３３）。
【００４８】
ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１未満である時（ステップＳ３２でＮＯ）、通常ケースとして桁合わせ処理を行う（ステップＳ３４）。即ちＯＰ１とＯＰ２の指数差を求め、シフトにより桁合わせを行う。入力の下位側Ｎ桁の加減算処理を行う（ステップＳ３５）。上位側加算と下位側加算の結果で重複している桁を追い出す処理を行う（ステップＳ３６）。この際、「Ｎ−桁合わせシフト量」を追い出しシフト量とする。ｆｉ（ｘ＋ｙ）側で桁溢れが発生しているならば溢れた桁を吸収するため、追い出しシフト量から桁溢れ量を減算する。あるいはｆｉ（ｘ＋ｙ）側で桁落ちが発生している場合、ｆｉ（ｘ＋ｙ）に吸収される桁を追い出すため、追い出しシフト量に桁落ち量を加算する。仮数を追い出しシフト量だけ左シフトする。ｆｉ（ｘ＋ｙ）側で桁溢れが発生している時、入力された指数に桁溢れ量を加算する。あるいはｆｉ（ｘ＋ｙ）側で桁落ちが発生している時、桁落ち量を減算する。
【００４９】
正規化処理を行う（ステップＳ３７）。入力をバイパスする特別処理がなされていたならば、バイパスされた指数と仮数を、なされていないならば追い出し処理から得た指数と仮数を正規化する。加算の結果を出力する（ステップＳ３８）。
【００５０】
図９は８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第２のアルゴリズムのｆｉ（ｘ＋ｙ）演算器の構成例である。図９に示すｆｉ（ｘ＋ｙ）演算器は、入力Ｘレジスタ６０、入力Ｙレジスタ６１、デコーダ６２及び６３、指数仮数演算器６４、セレクタ６５及び６６、左シフタ６７、右シフタ６８、絶対値加算器６９、セレクタ７０及び７１、正規化回路７２を含む。ｆｉ（ｘ＋ｙ）演算器は更に、エンコーダ７３、出力Ｚレジスタ７４、出力ＯＶＦ・ＵＤＦ計数レジスタ７５を含む。
【００５１】
図１０は８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算する第２のアルゴリズムのｇｅｔ＿ｚｚ演算器の構成例である。図１０に示すｇｅｔ＿ｚｚ演算器は、入力Ｘレジスタ８０、入力Ｙレジスタ８１、デコーダ８２及び８３、指数仮数演算器８４、セレクタ８５及び８６、左シフタ８７、絶対値加算器８８、ＯＶＦ・ＵＤＦ計数レジスタ８９、重複桁追い出し回路９０を含む。ｇｅｔ＿ｚｚ演算器は更に、セレクタ９１及び９２、正規化回路９３、エンコーダ９４、出力Ｚレジスタ９５を含む。
【００５２】
図１１は、図９に示すｆｉ（ｘ＋ｙ）演算器における指数仮数演算器６４の構成の一例を示す図である。指数仮数演算器６４は、比較器１０１、ＬＺＣ計数器１０２及び１０３、セレクタ１０４乃至１０６、絶対値減算器１０７乃至１１１、比較器１１２を含む。図１２は、図９に示すｆｉ（ｘ＋ｙ）演算器における正規化回路７２の構成の一例を示す図である。正規化回路７２は、ＬＺＣ計数器１２１、ＬＺＣ補正器１２２、絶対値減算器１２３、左シフタ１２４を含む。
【００５３】
図１３は、図１０に示すｇｅｔ＿ｚｚ演算器における指数仮数演算器８４の構成の一例を示す図である。指数仮数演算器８４は、比較器１３１、ＬＺＣ計数器１３２及び１３３、セレクタ１３４乃至１３６、絶対値減算器１３７乃至１４２、比較器１４３を含む。図１４は、図１０に示すｇｅｔ＿ｚｚ演算器における重複桁追い出し回路９０の構成の一例を示す図である。重複桁追い出し回路９０は、セレクタ１５１及び１５２、減算器１５３、加算器１５４及び１５５、左シフタ１５６を含む。図１５は、図１０に示すｇｅｔ＿ｚｚ演算器における正規化回路９３の構成の一例を示す図である。正規化回路９３は、ＬＺＣ計数器１６１、ＬＺＣ補正器１６２、絶対値減算器１６３、左シフタ１６４を含む。
【００５４】
以下に、図９、図１１、及び図１２に示すｆｉ（ｘ＋ｙ）演算器の動作について説明する。
【００５５】
まず入力Ｘレジスタ６０と入力Ｙレジスタ６１より、データがデコーダ６２及びデコーダ６３にそれぞれ入力される。デコーダ６２及び６３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力ＸＹの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【００５６】
指数仮数演算器６４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器６４の比較器１０１は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【００５７】
指数仮数演算器６４の絶対値減算器１１１及び比較器１１２は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路７２へバイパスする演算を行う。指数仮数演算器６４は、仮数Ｔ１とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、指数を選択する。
【００５８】
指数仮数演算器６４の絶対値減算器１０７は、（指数ｅｘｐ１−指数ｅｘｐ２）を、シフト量ＬＳＡ１とする。セレクタ１０５は、仮数Ｔ１の先行ゼロ計数を、シフト量ＬＳＡ２とする。ただし値が奇数の時はその値を−１する。絶対値減算器１１０が、（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を計算し、計算値をシフト量ＲＳＡとして出力する。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１する。絶対値減算器１１０によりＬＳＡ１とＬＳＡ２との大小比較を行う。この比較結果に応じて、セレクタ１０６が、ＬＳＡ１のほうが小さい時はＬＳＡ２を、ＬＳＡ１のほうが大きい時はＬＳＡ１を選択し、ＬＳＡとして出力する。指数仮数演算器６４の絶対値減算器１０９が、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ値を減算した値を指数ｅｘｐ３とし、正規化回路７２へ出力する。
【００５９】
指数仮数演算器６４は、右シフタ６８へシフト量ＲＳＡを、左シフタ６７へシフト量ＬＳＡを出力する。左シフタ６７が、入力されたシフト量にもとづき、入力された仮数を左シフトする。右シフタ６８が、入力されたシフト量にもとづき、入力された仮数を右シフトする。左シフトされた仮数Ｔ１と右シフトされた仮数Ｔ２とが、絶対値加算器６９に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、絶対値加算器６９にキャリーとして１を入力する。絶対値加算器６９は、入力を加算し、結果を出力する。また絶対値加算器６９のキャリーアウトが、出力ＯＶＦ・ＵＤＦ計数レジスタ７５に出力する。
【００６０】
正規化回路７２へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数とが正規化回路７２に入力される。また正規化回路７２へのバイパスセレクト信号が０であるならば加算結果と指数ｅｘｐ３が仮数と指数として正規化回路７２に入力される。
【００６１】
正規化回路７２の絶対値減算器１２３により、指数から仮数の先行ゼロ計数値を減算し、結果を指数Ｚとする。正規化回路７２の左シフタ１２４により、仮数の先行ゼロ計数値だけ加算結果を左シフトし、結果を仮数Ｚとする。
【００６２】
指数仮数演算器６４において、先行ゼロ計数値が正規化回路７２から出力ＯＶＦ・ＵＤＦ計数レジスタ７５に出力される。符号、指数Ｚ、仮数Ｚがエンコーダ７３により外部形式に変換され、出力Ｚレジスタ７４に出力される。
【００６３】
以下に、図１０、図１３、図１４、及び図１５に示すｇｅｔ＿ｚｚ演算器の動作について説明する。
【００６４】
入力Ｘレジスタ８０と入力Ｙレジスタ８１より、データがデコーダ８２及びデコーダ８３にそれぞれ入力される。またＯＶＦ・ＵＤＦ計数レジスタ８９（図９の出力ＯＶＦ・ＵＤＦ計数レジスタ７５と同一のレジスタでよい）から、値が重複桁追い出し回路９０に入力される。
【００６５】
デコーダ８２及び８３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力ＸＹの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【００６６】
指数仮数演算器８４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器８４の比較器１３１は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【００６７】
指数仮数演算器８４の絶対値減算器１４１及び比較器１４３は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路９３へバイパスする演算を行う。指数仮数演算器８４は、仮数Ｔ２とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
【００６８】
指数仮数演算器８４の絶対値減算器１４０は、（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を計算し、その結果をシフト量ＲＳＡとする。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１する。指数仮数演算器８４の絶対値減算器１３９により、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ計数値を減算し、更に絶対値減算器１４２により１４を減算した値を指数ｅｘｐ３とし、重複桁追い出し回路９０へ出力する。
【００６９】
指数仮数演算器８４は、左シフタ８７と重複桁追い出し回路９０にシフト量ＲＳＡを出力する。左シフタ８７が、入力されたシフト量にもとづき、入力された仮数を左シフトする。左シフトされた仮数Ｔ１とシフトされなかった仮数Ｔ２の下位１４桁（５６ｂｉｔ）が絶対値加算器８８に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、絶対値加算器８８にキャリーとして１を入力する。絶対値加算器８８は、入力を加算し、結果を出力する。
【００７０】
重複桁追い出し回路９０に、絶対値加算器８８からの加算結果と、指数仮数演算器８４からの指数ｅｘｐ３及びシフト量ＲＳＡと、ＯＶＦ・ＵＤＦ計数レジスタ８９からの桁溢れ量及び桁落ち量とが入力される。重複桁追い出し回路９０の減算器１５３は、（Ｎ−桁合わせシフト量）を追い出しシフト量とする。桁溢れ量が１の時（０か１しかとりえない）、重複桁追い出し回路９０の減算器１５５は、追い出しシフト量を−２する。あるいは桁落ち量が０以上である時、重複桁追い出し回路９０の減算器１５５は、桁落ち量だけ追い出しシフト量を減算する。桁溢れ量が１の時、重複桁追い出し回路９０の減算器１５４は、指数ｅｘｐ３に２を加算する。あるいは桁落ち量が０以上である時、重複桁追い出し回路９０の減算器１５４は、指数ｅｘｐ３から桁落ち量を減算する。重複桁追い出し回路９０の左シフタ１５６は、仮数を追い出しシフト量だけ左シフトする。重複桁追い出し回路９０は、正規化回路９３に対して、結果の指数と仮数とを出力する。
【００７１】
正規化回路９３へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数とが正規化回路９３に入力される。また正規化回路９３へのバイパスセレクト信号が０であるならば重複桁追い出し回路９０から出力された仮数と指数とが正規化回路９３に入力される。
【００７２】
正規化回路９３のＬＺＣ計数器１６１により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、ＬＺＣ補正器１６２により先行ゼロ計数値が−１される。正規化回路９３の絶対値減算器１６３が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Ｚとする。正規化回路９３の左シフタ１６４が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Ｚとする。
【００７３】
符号、指数Ｚ、仮数Ｚがエンコーダ９４により外部形式に変換され、出力Ｚレジスタ９５に出力される。
【００７４】
上記の第１のアルゴリズムの場合、入力データに対して倍幅の中間値、倍幅の加算処理を用いることは資源的、性能的に問題がある。ソフトウェアの場合には倍幅の型を使用しなければならないことからメモリへの圧迫が大きくなる、またハードウェア上に実装する場合には面積資源が倍必要となってしまう。そしてどちらの場合においてもビット幅が倍となるため加算などの処理がディレイクリティカルとなりうる。
【００７５】
上記の第２のアルゴリズム、即ちｆｉ（ｘ＋ｙ）の桁溢れ及び桁落ちの情報を伝達してｇｅｔ＿ｚｚ処理を制御する手法の場合、通常のビット幅の加算器が使え、資源の制約は小さくなる。しかしながら、ｆｉ（ｘ＋ｙ）処理を最初に実行し次にｇｅｔ＿ｚｚ処理を実行するという順番で処理する必要があり、命令の処理順についての制約が発生してしまう。
【００７６】
固定精度の浮動小数点数同士の正確な和を、従来資源に大きな変更を加えることなく、高速に実行できるようにするために、多倍長精度加減算のアルゴリズムとして、上位ビットの値からの桁溢れ及び桁落ちを予測することが考えられる。これにより、ｆｉ（ｘ＋ｙ）に依存せずにｇｅｔ＿ｚｚを得ることができる。なお本願の説明において、Ｎは仮数の最大幅を表わし、Ｍは進数の基数を表わす。
【００７７】
図１６は、ｇｅｔ＿ｚｚのアルゴリズムの一例を示す図である。その手順は以下の通りである。
【００７８】
浮動小数点数で表現されたデータであるＯＰ１とＯＰ２が入力される（ステップＳ４１）。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１以上である時（ステップＳ４２でＹＥＳ）、入力を正規化回路へバイパスする特別処理を行う。この時、指数が小さいほうを正規化回路にバイパスする（ステップＳ４３）。
【００７９】
ＯＰ１とＯＰ２の正規化後の指数差がＮ＋１未満である時（ステップＳ４２でＮＯ）、通常ケースとして桁合わせ処理を行う。ＯＰ１とＯＰ２の指数差を求め、指数の大きい側の仮数を指数差だけ左シフトする（ステップＳ４４）。加減算処理を行う（ステップＳ４５）。この時、ＬＳＢからＮ桁幅分だけを抽出し、加減算の結果と桁溢れ又は桁落ちが起きたか否かを示すフラグとを生成する。このフラグは加減算のキャリーアウトで判定できる。
【００８０】
処理が加算である時（ステップＳ４６でａｄｄ）、桁溢れ予測処理を行う（ステップＳ４７）。
【００８１】
図１７（ａ）は、桁溢れ予測処理の流れの一例を示すフローチャートである。
【００８２】
この桁溢れ予測処理では、以下の処理が実行される。ＯＰ１とＯＰ２のうち指数が大きい側の仮数と、下位側加減算処理で桁溢れが発生したかというフラグＣＯと、桁合わせ時のシフト量ＳＡとが入力される（ステップＳ６１）。先行Ｍ−１計数処理を行う（ステップＳ６２）。ここで述べたＭ−１とは桁上がりしない限界の数のことを指す（２進数ならば１２、２進化１０進数ならば１００１２）。先行Ｍ−１計数値が桁合わせシフト量以上であり、且つ下位側加減算処理で桁溢れが発生していれば（ステップＳ６３でＹＥＳ）、桁溢れを示す値１を桁溢れフラグに設定し（ステップＳ６４）、桁溢れフラグを出力する（ステップＳ６５）。
【００８３】
また処理が減算である時（ステップＳ４６でｓｕｂ）、桁落ち予測処理を行う（ステップＳ４８）。
【００８４】
図１７（ｂ）は、桁溢れ予測処理の流れの一例を示すフローチャートである。
【００８５】
この桁落ち予測処理では、以下の処理が実行される。ＯＰ１とＯＰ２のうち指数が大きい側の仮数と、下位側加減算処理で桁落ちが発生したかというフラグＢＯと、桁合わせ時のシフト量ＳＡとが入力される（ステップＳ７１）。特殊先行ゼロ計数処理を行う（ステップＳ７２）。これは初めに立っている１ではカウントを止めず、２番目に立っている１でカウントを止める先行ゼロ計数処理である。
【００８６】
図１８は先行ゼロ計数処理の例を示す図である。図１８の（ａ）乃至（ｅ）に示されるように、特殊先行ゼロ計数処理においては、仮数の先行ゼロを計数する際に、最上位ビット側から各ビットをチェックしていき、最初に現れる１については０であると見なして０の数を計数する。図１８において、ＳｐｅｃｉａｌｔｙＬＺＣが、特殊先行ゼロ計数処理の計数結果を示す。
【００８７】
図１７（ｂ）に戻り、特殊先行ゼロ計数値が桁合わせシフト量以上であり、且つ下位側加減算処理で桁落ちが発生していれば（ステップＳ７３でＹＥＳ）、桁落ちを示す値１を桁落ちフラグに設定し（ステップＳ７４）、桁落ちフラグを出力する（ステップＳ７５）。
【００８８】
図１６に戻り、上位側加算と下位側加算の結果で重複している桁を追い出す処理を行う（ステップＳ４９）。この追い出し処理では、以下の処理を実行する。「N−桁合わせシフト量」を追い出しシフト量とする。桁溢れフラグが立っているならば、追い出しシフト量から１を減算する。桁落ちフラグが立っているならば、追い出しシフト量に１を加算する。また桁溢れフラグが立っているならば、指数に２を加算する。桁落ちフラグが立っているならば、指数から２を減算する。更に、仮数を追い出しシフト量だけ左シフトする。
【００８９】
正規化処理を行う（ステップＳ５０）。この正規化処理では、バイパスセレクト信号が生成されているならば、バイパスされた指数と仮数とを正規化する。またバイパスセレクト信号が生成されていないならば、追い出し処理から得た指数と仮数とを正規化する。最後に、結果を出力する（ステップＳ５１）。
【００９０】
桁溢れ予測のアルゴリズムは。桁溢れが発生する条件を利用したアルゴリズムである。その条件とは以下となる。
（ａ）演算が加算である（ＯＰ１とＯＰ２の符号が等しい）。
（ｂ）ｇｅｔ＿ｚｚにおける加算処理が桁溢れをする。
（ｃ）指数が大きいほうの仮数部のＭＳＢからＭ−１（２進数ならば１２、２進化１０進数ならば１００１２）が連続する数を計数し、その値が桁合わせシフト値以上である。
この条件ならば下位の桁上げ信号が伝搬して、ｆｉ（ｘ＋ｙ）側で桁溢れが発生する条件の全てを包含することが可能であり、非正規化数がＯＰ１及びＯＰ２として入力された場合も包含できる。
【００９１】
ｆｉ（ｘ＋ｙ）で桁溢れが発生する時、それは必ず１桁しか起こらない。従って桁溢れが起こった場合はｇｅｔ＿ｚｚ側における重複桁を追い出す量を−１すれば、あらゆる桁溢れの条件下においても正しい結果を出力することができる。何故ならば、重複桁の追い出しを１桁減らせば、ｇｅｔ＿ｚｚの結果がｆｉ（ｘ＋ｙ）側のＭＳＢを受け取ったことに等しい為である。
【００９２】
指数が大きいほうの桁合わせ後の仮数部をＴ１、小さいほうの仮数部をＴ２とし、Ｎを入力の仮数の桁幅、ＳＡを桁合わせシフト量とする。さらにＧをジェネレート（キャリーを生成するフラグ）、Ｐをプロパゲート（キャリーを伝搬するフラグ）とし、Ｃをキャリーとし、Ｌ（Ｍ−１）ＣをＭＳＢからＭ−１（２進数ならば１２、２進化１０進数ならば１００１２）が連続する数のこととする。そしてＮを入力の仮数の最大桁幅、Ｍを基数、ｉを連続する自然数とし、前述の桁溢れが発生する条件の証明を以下に行う。
【００９３】
桁溢れとは一般的に加算器の幅以上の桁に０以外の値が入った場合のことを指す。加算のキャリーの生成式は、
【００９４】
【数１】
2014041563.tif 000003
となるため、
【００９５】
【数２】
2014041563.tif 000004
とすると、上位側加算のキャリーアウトの生成式は、
【００９６】
【数３】
2014041563.tif 000005
となり、このキャリーアウトが１となれば１桁の桁溢れが発生する。この時、必ず
【００９７】
【数４】
2014041563.tif 000006
が満たされるため、
【００９８】
【数５】
2014041563.tif 000007
となる。さらに下位側加算のキャリーアウト生成式、
【００９９】
【数６】
2014041563.tif 000008
を用いて、生成式を整理すると、
【０１００】
【数７】
2014041563.tif 000009
という生成式を得ることができる。
【０１０１】
上位側加算のキャリーアウトの生成式に含まれる、
【０１０２】
【数８】
2014041563.tif 000010
とはすなわち、
【０１０３】
【数９】
2014041563.tif 000011
の時に１となる。この時に必要な０の個数はＮ'−Ｎ＝ＳＡ個であるため、
【０１０４】
【数１０】
2014041563.tif 000012
となれば条件を満たす。条件が≧で良いのは、Ｐ［Ｎ−１］以下の値は下位側加算のキャリーアウト生成式に包含されるためである。
【０１０５】
さらに桁溢れは演算が加算である時（符号が一致する時）しか起こりえないため、前述の３つの条件、
（ａ）演算が加算である、
（ｂ）下位側加算処理で桁溢れが発生する（ＣＬＯ＝1）、
（ｃ）指数部が大きいほうの仮数部のＭＳＢからＭ−１の個数を計数し、その値が桁合わせシフト以上である（Ｌ（Ｍ−１）Ｃ｛Ｔ１｝＞ＳＡ）、
を満たせば桁溢れが発生する。
【０１０６】
図１９（ａ）及び（ｂ）はそれぞれ、２進表現において桁溢れの発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。仮数Ｔ１が指数の大きいほうの仮数であるとし、仮数の最大幅Ｎ＝６、指数差（alignment shift）＝４、仮数部をそれぞれ１１１１１０２及び１１０１０１２としている。
【０１０７】
図１９（ａ）にはｆｉ（ｘ＋ｙ）の計算例が示される。まず仮数Ｔ１を指数差分だけ左シフトする（１１１１１０００００）。仮数Ｔ１（１１１１１０００００）と仮数Ｔ２（００００１１０１０１）の上位Ｎ桁（６桁）を加算し、加算結果（１０００００１）を得る。加算の結果、桁溢れが発生しＮ（６）桁以上に値がはみ出てしまった為、溢れた１桁分だけ右シフトして値をＮ（６）桁幅に収める。この時、結果だけ見るとｆｉ（ｘ＋ｙ）から追い出されたＬＳＢ（１）はｇｅｔ＿ｚｚのＭＳＢに収まるように見えることになる。加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（１０００００）を得る。この例では先行ゼロ計数値が０となるため、シフト量は０となっている。
【０１０８】
図１９（ｂ）にはｇｅｔ＿ｚｚの計算例が示される。まず符号部を見て演算が加算であるか否かを判定する（上位側桁溢れ条件（ａ））。仮数Ｔ１を指数差分だけ左シフトする（１１１１１０００００）。仮数Ｔ１（１１１１１０００００）と仮数Ｔ２（００００１１０１０１）の下位Ｎ桁（６桁）を加算し、加算結果（１０１０１０１）を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。加算の結果、下位側にキャリーアウトが発生した為、条件に合致する（上位側桁溢れ条件（ｂ））。
【０１０９】
上位側桁溢れが発生するには、条件（ｂ）の桁溢れが上位側の最上位桁まで伝搬していかなければならない。従って下位側桁溢れが発生した桁から、最上位桁までＭ−１が詰まっていれば桁溢れが発生する。言い換えれば仮数Ｔ１のＭＳＢから桁合わせシフト分の桁にＭ−１が詰まっていれば条件に合致する（Ｌ（Ｍ−１）Ｃ＝５＞桁合わせシフト量）（条件（ｃ））。
【０１１０】
下位Ｎ桁の加算は上位Ｎ桁の加算と重複する桁が存在するため、『仮数の最大幅−桁合わせシフト量』だけ左シフトし、重複する桁を捨てる処理を行う。しかし条件（ａ）、（ｂ）、（ｃ）が満たされているため、上位側で桁溢れが発生していると判定できる。そのため上位側から下位側に値を落としてくる必要がある。その値は上位側と下位側の加算で重複する桁のＬＳＢに該当する。従って先ほどの左シフト量を−１して帳尻を合わせて結果を得る（１０１０１０）。
【０１１１】
加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（１０１０１０）を得る。この例では先行ゼロ計数値が０となるため、シフト量は０となっている。
【０１１２】
桁落ち予測のアルゴリズムは桁落ちが発生する条件を利用したアルゴリズムである。その条件とは以下となる。
（ａ）演算が減算である（ＯＰ１とＯＰ２の符号が異なる）。
（ｂ）ｇｅｔ＿ｚｚにおける減算処理が桁落ちをする。
（ｃ）指数が大きいほうの仮数部の先行ゼロ計数（ただし初めに現れた１は０としてカウントする）をし、その値が桁合わせシフト値以上である。
この条件ならば下位の桁落ち信号が伝搬して、ｆｉ（ｘ＋ｙ）側で少なくとも1桁が桁落ちする条件の全てを包含することが可能であり、非正規化数がＯＰ１、ＯＰ２として入力された場合も包含できる。
【０１１３】
ｆｉ（ｘ＋ｙ）で桁落ちが発生する時、それは１桁しか起こらないとは限らない。しかし桁落ちの量に関わらず重複桁の追い出し量を＋１することによって、あらゆる桁落ちの条件下においても正しい結果を出力することが可能である。これは、何故ならば、桁落ちが２桁以上発生する条件は上記に加えて以下の条件の時に発生する為である。
（ｄ）桁合わせシフト値は指数が大きいほうの仮数部の先行ゼロ計数値（ただし初めに現れた１は０としてカウントする）に１を加算した値に等しい。
即ち、桁落ちが２桁以上発生した場合はｇｅｔ＿ｚｚからそれに応じた桁数を追い出さなければならないように思えるが、（ｄ）の条件が絶対条件であるため、この処理はｇｅｔ＿ｚｚの結果から桁を全て追い出す処理に等しい。しかし（ｄ）の条件が合致する時、桁落ちを考慮せずとも、ｇｅｔ＿ｚｚ側に残るべき桁は１桁しか残っていない。従って１桁だけ追い出せばｇｅｔ＿ｚｚの結果から全ての桁を追い出す処理を行ったことになる。これは少なくとも1桁が桁落ちするケースと処理が同様となる。
【０１１４】
従って、２桁以上桁落ちというケースを予測する必要はなく、少なくとも１桁が桁落ちするケースだけを予測すれば良いという結論になる。
【０１１５】
指数が大きいほうの桁合わせ後の仮数部をＴ１、小さいほうの仮数部をＴ２とし、Ｎを入力の仮数の桁幅、ＳＡを桁合わせシフト量とする。さらにＧをジェネレート（ボローを生成するフラグ）、Ｐをプロパゲート（ボローを伝搬するフラグ）とし、Ｂをボローとし、ｓｐｅｃｉａｌｉｔｙＬＺＣを先行ゼロ計数（ただし初めに現れた１は０としてカウントする）とする。そしてｉは連続する自然数とし、前述の少なくとも１桁の桁落ちが発生する条件、そして２桁以上の桁落ちが発生する条件の証明を以下に行う。
【０１１６】
桁落ちとは一般的に入力を加算器に入力した時、有効桁の最上位の桁が０となった場合のことを指す。
【０１１７】
【数１１】
2014041563.tif 000013
となる。この時、Ｔ１の先行ゼロ計数を行い、その結果をＬＺＣ｛Ｔ１｝とし、
【０１１８】
【数１２】
2014041563.tif 000014
とすると、ＭＳＢから初めて０以外の値が入った桁の結果は、
【０１１９】
【数１３】
2014041563.tif 000015
となる。この結果が０となれば桁落ちが少なくとも１桁発生する。この時、必ず、
【０１２０】
【数１４】
2014041563.tif 000016
が満たされる為、
【０１２１】
【数１５】
2014041563.tif 000017
となる。さらに下位側減算のボローアウトアウト生成式、
【０１２２】
【数１６】
2014041563.tif 000018
を用いて、生成式を整理すると、
【０１２３】
【数１７】
2014041563.tif 000019
という生成式を得ることができる。
【０１２４】
さらにＢ［Ｎ″−２］は０か１の値しかとりえない為、Ｓ［Ｎ″−１］＝０となるには
Ｔ［Ｎ″−１］＝1である必要がある。従って桁落ちの条件は、
【０１２５】
【数１８】
2014041563.tif 000020
の両方を満たす必要がある。上位側減算のボローアウト生成式に含まれる
【０１２６】
【数１９】
2014041563.tif 000021
とは即ち、
【０１２７】
【数２０】
2014041563.tif 000022
の時に１となる。この時に必要な０の個数はＮ″−Ｎ−１＝ＳＡ−ＬＺＣ｛Ｔ１｝−１個である。
【０１２８】
【数２１】
2014041563.tif 000023
という２つの条件は計数中に始めに現れた１を一度だけ０として計数する特殊な先行ゼロ計数値をｓｐｅｃｉａｌｉｔｙＬＺＣ｛Ｔ１｝とすると、
【０１２９】
【数２２】
2014041563.tif 000024
という条件でまとめることができる。
【０１３０】
条件が≧で良いのは、Ｐ［Ｎ−１］以下の値は下位側減算のキャリーアウト生成式に包含されるためである。さらに桁落ちは演算が減算である時（符号が不一致する時）しか起こりえないため、前述の３つの条件、
（ａ）演算が減算である、
（ｂ）下位側減算処理で桁落ちが発生する（ＢＬ０＝1）、
（ｃ）指数部が大きいほうの仮数部のＭＳＢから０の個数を計数し（ただし計数中に１が出現したならば１回だけ０としてカウントする）、その値が桁合わせシフト以上である（ｓｐｅｃｉａｌｉｔｙＬＺＣ｛Ｔ１｝≧ＳＡ）、
を満たせば桁落ちが発生する。
【０１３１】
上位側減算がＤ（Ｄは１以上の自然数）桁落ちするためには、
【０１３２】
【数２３】
2014041563.tif 000025
である必要がある。この時、前述した少なくとも１桁桁落ちの条件により、
【０１３３】
【数２４】
2014041563.tif 000026
を既知とする。従ってＤ桁桁落ちは、
【０１３４】
【数２５】
2014041563.tif 000027
より、
【０１３５】
【数２６】
2014041563.tif 000028
を満たせば良いと導ける。すなわち、
【０１３６】
【数２７】
2014041563.tif 000029
がＤ桁桁落ちの条件である。
【０１３７】
桁合わせシフト量ＳＡとＴ２との関係は、
【０１３８】
【数２８】
2014041563.tif 000030
であるため、ＳＡ＞ＬＺＣ｛Ｔ１｝＋２となるとＴ２［Ｎ″−２］＝０となってしまう。これは、Ｍ−１の条件に合致しなくなる。ＳＡ＜ＬＺＣ｛Ｔ１｝＋２となると、Ｔ２［Ｎ″−１］＝０の時しか減算が成り立たなくなり、かつＢＬ０が発生しないため、条件が成り立たない。従ってＳＡ＝ＬＺＣ｛Ｔ１｝＋２が２桁以上桁落ちの条件となる。この時、Ｔ１［Ｎ″−１］＝１である。従ってＳＡ＝ＬＺＣ｛Ｔ１｝＋２という条件はＳＡ＝ｓｐｅｃｉａｌｉｔｙＬＺＣ｛Ｔ１｝＋１と書き換えることができる。
【０１３９】
図２０（ａ）及び（ｂ）はそれぞれ、２進表現において桁落ちが１桁発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。仮数の最大幅Ｎ＝６、指数差（alignment shift）＝４、仮数部をそれぞれ１００００１２と１００１０１２としている。
【０１４０】
図２０（ａ）にはｆｉ（ｘ＋ｙ）の計算例が示される。まず仮数Ｔ１を指数差分だけ左シフトする（１００００１００００）。仮数Ｔ１(１００００１００００)と仮数Ｔ２（００００１００１０１）の上位Ｎ桁（６）を加算し、加算結果（０１１１００）を得る。
【０１４１】
加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（１１１００１）を得る。この例では、先行ゼロ計数値が１となるため、１桁左シフトして正規化を行っている。ここで得た結果のＬＳＢは、ｇｅｔ＿ｚｚ側から追い出されてきた桁であり、ｇｅｔ＿ｚｚ演算では帳尻を合わせるためにこれを考慮しなければならない。
【０１４２】
図２０（ｂ）にはｇｅｔ＿ｚｚの計算例が示される。まず符号部を見て演算が減算であるか否かを判定する（上位側桁落ち条件（ａ））。仮数Ｔ１を指数差分だけ左シフトする（１００００１００００）。仮数Ｔ１（１００００１００００）と仮数Ｔ２（００００１００１０１）の下位Ｎ（６）桁を加算し、加算結果（１００１０１１）を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。この加算の結果、下位側にボローアウトが発生した為、条件に合致する（上位側桁落ち条件（ｂ））。
【０１４３】
上位側桁落ちが発生するには、条件（ｂ）の桁落ちが上位側の最上位桁まで伝搬していかなければならない。従って有効桁の最上位桁の値が1であり、下位側桁落ちが発生した桁から、有効桁のＭＳＢまで０が詰まっていれば桁落ちが発生する。言い換えれば仮数Ｔ１のＭＳＢから桁合わせシフト分の桁に０が詰まっていれば（ただし初めに現れた１は０としてカウントする）、条件に合致する（ｓｐｅｃｉａｌｉｔｙＬＺＣ＝５＞桁合わせシフト量（上位側桁落ち条件（ｃ））。
【０１４４】
下位Ｎ桁の加算は上位Ｎ桁の加算と重複する桁が存在するため、『仮数の最大幅−桁合わせシフト量』だけ左シフトし、重複する桁を捨てる処理を行う。しかし、条件（ａ）、（ｂ）、（ｃ）が満たされているため、上位側で桁落ちが発生していると判定できる。そのため下位側から値を追い出す必要がある。その値は下位側のＭＳＢに該当する。従って先ほどの左シフト量を＋１して帳尻を合わせて結果を得る（０１１０００）。
【０１４５】
加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（１１００００）を得る。この例では先行ゼロ計数値が１となるため、１桁左シフトをしている。
【０１４６】
また、図２１（ａ）及び（ｂ）はそれぞれ、２進表現において桁落ちが３桁発生する場合におけるｆｉ（ｘ＋ｙ）の計算例とｇｅｔ＿ｚｚの計算例とを示した図である。仮数の最大幅Ｎ＝６、指数差（alignment shift）＝４、仮数部をそれぞれ１００００１２と１１０１０１２としている。
【０１４７】
図２１（ａ）にはｆｉ（ｘ＋ｙ）の計算例が示される。まず仮数Ｔ１を指数差分だけ左シフトする（１００００１０）。仮数Ｔ１（１００００１０）と仮数Ｔ２（０１１０１０１）の上位Ｎ桁（６）を加算し、加算結果（０００１００）を得る。
【０１４８】
加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（１００１００）を得る。この例では先行ゼロ計数値が３となるため、３桁左シフトして正規化を行っている。ここで得た結果のＬＳＢは、ｇｅｔ＿ｚｚ側から追い出されてきた桁であり、ｇｅｔ＿ｚｚ演算では帳尻を合わせるために、これを考慮しなければならない。
【０１４９】
図２１（ｂ）にはｇｅｔ＿ｚｚの計算例が示される。まず符号部を見て演算が減算であるか否かを判定する（上位側桁落ち条件（ａ））。仮数Ｔ１を指数差分だけ左シフトする（１００００１０）。仮数Ｔ１（１００００１０）と仮数Ｔ２（０１１０１０１）の下位Ｎ（６）桁を加算し、加算結果（１００１００１）を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。加算の結果、下位側にボローアウトが発生した為、条件に合致する（上位側桁落ち条件（ｂ））。
【０１５０】
上位側桁落ちが発生するには条件（ｂ）の桁落ちが上位側の最上位桁まで伝搬していかなければならない。従って有効桁の最上位桁の値が１であり、下位側桁落ちが発生した桁から、有効桁のＭＳＢまで０が詰まっていれば桁落ちが発生する。言い換えれば仮数Ｔ１のＭＳＢから桁合わせシフト分の桁に０が詰まっていれば（ただし初めに現れた１は０としてカウントする）、条件に合致する（ｓｐｅｃｉａｌｉｔｙＬＺＣ＝５＞桁合わせシフト量（上位側桁落ち条件（ｃ））。
【０１５１】
上位側が３桁桁落ちしているため、本来であれば、下位側も３桁追い出さなければならない。しかし指数差が１しかないため、下位側の結果にはＭＳＢの１桁以外が０の値である。従って下位側のＭＳＢの１桁だけを追い出せば３桁追い出すことと同等となる。条件（ａ）、（ｂ）、（ｃ）が満たされているため、『仮数の最大幅−桁合わせシフト量＋１』を左シフトして結果を得る（００００００）。
【０１５２】
加算結果の正規化を行い（加算結果の先行ゼロ計数値だけ左シフトする）、正規化後の結果（００００００）を得る。この例では結果の桁が全て０である為、シフトしても結果は全ての桁が０となる。
【０１５３】
上記の演算手法により、固定精度の浮動小数点数同士の正確な和を、従来資源に大きな変更を加えることなく、高速に実行できるようになる。また、正確な和アルゴリズムは、多倍長や可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する場合に頻繁に用いられるため、この演算手法による高速化により、浮動小数点演算一般をより高速に実行できるようになる。
【０１５４】
図２２は、コンピュータシステムの構成の一例を示す図である。図２２に示すコンピュータシステムは、プロセッサ１７０及びメモリ１７１を含む。演算処理装置としてのプロセッサ１７０は、２次キャッシュ部１７２、１次キャッシュ部１７３、制御部１７４、及び演算部１７５を含む。１次キャッシュ部１７３は、命令キャッシュ１７３Ａ及びデータキャッシュ１７３Ｂを含む。演算部１７５は、レジスタ１７６、演算制御部１７７、及び演算器１７８を含む。演算器１７８には演算回路１７９が含まれる。なお図２２及び以降の同様の図において、各ボックスで示される各機能ブロックと他の機能ブロックとの境界は、基本的には機能的な境界を示すものであり、物理的な位置の分離、電気的な信号の分離、制御論理的な分離等に対応するとは限らない。各機能ブロックは、他のブロックと物理的にある程度分離された１つのハードウェアモジュールであってもよいし、或いは他のブロックと物理的に一体となったハードウェアモジュール中の１つの機能を示したものであってもよい。各機能ブロックは、他のブロックと論理的にある程度分離された１つのモジュールであってもよいし、或いは他のブロックと論理的に一体となったモジュール中の１つの機能を示したものであってもよい。
【０１５５】
上記コンピュータシステムはＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を用いた情報処理装置を模式化したものであり、このコンピュータシステムによりＯｒａｃｌｅ−ｎｕｍｂｅｒ等を演算するハードウェアを実現する。プロセッサ１７０では、１次キャッシュ部１７３及び２次キャッシュ部１７２を設けることにより、キャッシュメモリを多階層化した構成となっている。具体的には、１次キャッシュ部１７３と主記憶（メモリ１７１）との間に、主記憶よりも高速にアクセスできる２次キャッシュ部１７２を設けている。これにより、１次キャッシュ部１７３においてキャッシュミスが発生した場合に、主記憶にアクセスが必要になる頻度を低くして、キャッシュミス・ペナルティーを軽減することができる。
【０１５６】
制御部１７４は、命令フェッチアドレスと命令フェッチリクエストとを１次命令キャッシュ１７３Ａに発行し、この命令フェッチアドレスから命令をフェッチする。制御部１７４は、フェッチした命令をデコードした結果に従い演算部１７５を制御して、フェッチされた命令を実行する。演算制御部１７７は、制御部１７４の制御下で動作し、演算対象のレジスタ１７６からのデータを演算器１７８に供給したり、演算結果のデータを指定されたレジスタ１７６に格納したりする。また演算制御部１７７は、演算器１７８が実行する演算のタイプを指定する。更に演算制御部１７７は、アクセス先のアドレスを指定し、１次キャッシュ部１７３の当該アドレスに対してロード命令やストア命令を実行する。ロード命令により、指定アドレスから読み出されたデータは、指定されたレジスタ１７６に格納される。またストア命令により、指定されたレジスタ１７６のデータが、指定されたアドレスに書き込まれる。演算器１７８に含まれる演算回路１７９が、前述の浮動小数点数同士の正確な和を実現するための回路である。
【０１５７】
図２３は、８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算するｇｅｔ＿ｚｚ演算器の構成の一例を示す図である。なお８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を例として説明に用いるが、デコード回路とエンコード回路を工夫することで、中身の構成はそのままでＯｒａｃｌｅ−ｎｕｍｂｅｒ形式とその他の形式の両方に対応させることも可能である。図２３に示すｇｅｔ＿ｚｚ演算器は、入力Ｘレジスタ１８０、入力Ｙレジスタ１８１、デコーダ１８２及び１８３、指数仮数演算器１８４、セレクタ１８５及び１８６、左シフタ１８７、絶対値加算器１８８、ＯＶＦ・ＵＤＦ予測回路１８９、重複桁追い出し回路１９０を含む。ｇｅｔ＿ｚｚ演算器は更に、セレクタ１９１及び１９２、正規化回路１９３、エンコーダ１９４、出力Ｚレジスタ１９５を含む。
【０１５８】
図２４は、図２３に示すｇｅｔ＿ｚｚ演算器における指数仮数演算器１８４の構成の一例を示す図である。指数仮数演算器１８４は、比較器２０１、ＬＺＣ計数器２０２及び２０３、セレクタ２０４乃至２０６、絶対値減算器２０７乃至２１２、比較器２１３を含む。図２５は、図２３に示すｇｅｔ＿ｚｚ演算器におけるＯＶＦ・ＵＤＦ予測回路１８９の構成の一例を示す図である。ＯＶＦ・ＵＤＦ予測回路１８９は、先行する９の個数を計数するＬ９Ｃ回路２２１、ＬＺＣ計数器２２２、比較器２２３及び２２４、ＡＮＤ回路２２５及び２２６を含む。図２６は、図２３に示すｇｅｔ＿ｚｚ演算器における重複桁追い出し回路１９０の構成の一例を示す図である。重複桁追い出し回路１９０は、セレクタ２３１及び２３２、減算器２３３、加算器２３４及び２３５、ゼロマスク回路２３６を含む。
【０１５９】
図２３において入力と出力とは同精度の浮動小数点数とする。入力データは正規化されていなくともよいが、出力データは必ず正規化される。Ｏｒａｃｌｅ−ｎｕｍｂｅｒの形式として指数部は必ず偶数であるため、前述のアルゴリズムがそれに対応するように改変されている。例えば桁溢れ及び桁落ち時の追い出し処理量の加減算が、＋１及び−１ではなく、＋２及び−２となっている。
【０１６０】
また、前述のアルゴリズムの説明では、下位側加算が桁溢れ又は桁落ちしたかを示すフラグを設定していた。しかしながら、ハードウェア実装上では減算の際には除数側を２の補数に変換して、加算で処理を行う為、桁溢れ又は桁落ちを示すフラグは、両者共にキャリーアウトという表現で統一する。
【０１６１】
また、前述のアルゴリズムの説明では、重複桁追い出し処理をシフトで行っており、正規化処理と合わせて２回のシフトを行っていた。実施例では、２回のシフトではなく、1回の０マスクと１回のシフトで同等の処理を行うことにより、論理段数の低減を図っている。
【０１６２】
以下に、図２３乃至２６に示すｇｅｔ＿ｚｚ演算器の動作について説明する。
【０１６３】
入力Ｘレジスタ１８０と入力Ｙレジスタ１８１より、データがデコーダ１８２及びデコーダ１８３にそれぞれ入力される。デコーダ１８２及び１８３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力ＸＹの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【０１６４】
指数仮数演算器１８４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器１８４の比較器２０１は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【０１６５】
指数仮数演算器１８４の絶対値減算器２１１及び比較器２１３は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路１９３へバイパスする演算を行う。指数仮数演算器１８４は、仮数Ｔ２とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
【０１６６】
指数仮数演算器１８４の絶対値減算器２１０は、（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を計算し、その結果をシフト量ＲＳＡとする。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１する。指数仮数演算器１８４の絶対値減算器２０９により、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ計数値を減算し、更に絶対値減算器２１２により１４を減算した値を指数ｅｘｐ３とし、重複桁追い出し回路１９０へ出力する。
【０１６７】
指数仮数演算器１８４は、左シフタ１８７と重複桁追い出し回路１９０にシフト量ＲＳＡを出力する。左シフタ１８７が、入力されたシフト量にもとづき、入力された仮数を左シフトする。左シフトされた仮数Ｔ１とシフトされなかった仮数Ｔ２の下位１４桁（５６ｂｉｔ）が絶対値加算器１８８に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、絶対値加算器１８８にキャリーとして１を入力する。絶対値加算器１８８は、入力の下位１４桁（５６ビット）を加算し、結果を重複桁追い出し回路１９０に出力する。またキャリーアウトが、絶対値加算器１８８からＯＶＦ・ＵＤＦ予測回路１８９に供給される。
【０１６８】
ＯＶＦ・ＵＤＦ予測回路１８９に仮数Ｔ１、シフト量ＲＳＡ、加算結果のキャリーアウトが入力される。ＯＶＦ・ＵＤＦ予測回路１８９が、桁溢れ予測を行う。ＯＶＦ・ＵＤＦ予測回路１８９のＬ９Ｃ回路２２１が、仮数Ｔ１の先頭桁から９（１００１２）が連続する個数を計数する。比較器２２３及びＡＮＤ回路２２５により、９の計数値がシフト量ＲＳＡ以上であり、且つキャリーアウトが発生しており、且つ演算が加算である時に、桁溢れの発生を示すフラグを生成し、フラグを重複桁追い出し回路１９０に出力する。
【０１６９】
またＯＶＦ・ＵＤＦ予測回路１８９が、桁落ち予測を行う。ＯＶＦ・ＵＤＦ予測回路１８９のＬＺＣ計数器２２２が特殊先行ゼロ計数を行う。比較器２２４及びＡＮＤ回路２２６により、ゼロ計数値がシフト量ＲＳＡ以上であり、且つキャリーアウトが発生しており、且つ演算が減算である時に桁落ちの発生を示すフラグを生成し、フラグを重複桁追い出し回路１９０に出力する。
【０１７０】
重複桁追い出し回路１９０に、絶対値加算器１８８からの加算結果と、指数仮数演算器１８４からの指数ｅｘｐ３及びシフト量ＲＳＡと、ＯＶＦ・ＵＤＦ予測回路１８９からの桁溢れフラグ及び桁落ちフラグとが入力される。重複桁追い出し回路１９０の減算器２３３は、（１４（仮数部桁幅）−シフト量ＲＳＡ）を計算し、その値をマスク量とする。但し、加算器２３４により、桁溢れフラグが立っている時はマスク量を−２し、桁落ちフラグが立っている時はマスク量を＋２する。またマスク量が負の数となった時にはマスク量を０とする。また重複桁追い出し回路１９０の加算器２３５により、桁溢れフラグが立っている時に指数ｅｘｐ３を＋２し、桁落ちフラグが立っている時に指数ｅｘｐ３を−２する。
【０１７１】
重複桁追い出し回路１９０のゼロマスク回路２３６が、仮数の上位側をマスク量桁分だけ０でマスクする。
【０１７２】
正規化回路１９３へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数とが正規化回路１９３に入力される。また正規化回路１９３へのバイパスセレクト信号が０であるならば重複桁追い出し回路１９０から出力された仮数と指数とが正規化回路１９３に入力される。
【０１７３】
正規化回路１９３（図１５と同様の構成であってよい）により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、補正器により先行ゼロ計数値が−１される。正規化回路１９３が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Ｚとする。正規化回路１９３が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Ｚとする。
【０１７４】
符号、指数Ｚ、仮数Ｚがエンコーダ１９４により外部形式に変換され、出力Ｚレジスタ１９５に出力される。
【０１７５】
図２７は８バイト幅Ｏｒａｃｌｅ−ｎｕｍｂｅｒ形式１０進浮動小数点数を演算するｆｉ（ｘ＋ｙ）演算器の構成例である。図２７に示すｆｉ（ｘ＋ｙ）演算器は、入力Ｘレジスタ２４０、入力Ｙレジスタ２４１、デコーダ２４２及び２４３、指数仮数演算器２４４、セレクタ２４５及び２４６、左シフタ２４７、右シフタ２４８、絶対値加算器２４９、セレクタ２５０及び２５１、正規化回路２５２を含む。ｆｉ（ｘ＋ｙ）演算器は更に、エンコーダ２５３及び出力Ｚレジスタ２５４を含む。なお図２７に示すｆｉ（ｘ＋ｙ）演算器は、図９に示すｆｉ（ｘ＋ｙ）演算器から、桁溢れと桁落ちの計数に関わる回路部分（出力ＯＶＦ・ＵＤＦ計数レジスタ７５とそれに関わるパス）が削除されたものに等しい。図２７に示すｆｉ（ｘ＋ｙ）演算器の各部の構成及び動作は、図９に示すｆｉ（ｘ＋ｙ）演算器の対応する各部の構成及び動作に等しい。その動作について以下に説明する。
【０１７６】
まず入力Ｘレジスタ２４０と入力Ｙレジスタ２４１より、データがデコーダ２４２及びデコーダ２４３にそれぞれ入力される。デコーダ２４２及び２４３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力ＸＹの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【０１７７】
指数仮数演算器２４４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器２４４は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【０１７８】
指数仮数演算器２４４は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路２５２へバイパスする演算を行う。指数仮数演算器２４４は、仮数Ｔ１とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
【０１７９】
指数仮数演算器２４４は、（指数ｅｘｐ１−指数ｅｘｐ２）を、シフト量ＬＳＡ１とする。指数仮数演算器２４４は、仮数Ｔ１の先行ゼロ計数を、シフト量ＬＳＡ２とする。ただし値が奇数の時はその値を−１する。指数仮数演算器２４４が、（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を計算し、計算値をシフト量ＲＳＡとして出力する。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１する。指数仮数演算器２４４は、ＬＳＡ１とＬＳＡ２との大小比較を行う。この比較結果に応じて、ＬＳＡ１のほうが小さい時はＬＳＡ２を、ＬＳＡ１のほうが大きい時はＬＳＡ１を選択し、ＬＳＡとして出力する。指数仮数演算器２４４は、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ値を減算した値を指数ｅｘｐ３とし、正規化回路２５２へ出力する。
【０１８０】
指数仮数演算器２４４は、右シフタ２４８へシフト量ＲＳＡを、左シフタ２４７へシフト量ＬＳＡを出力する。左シフタ２４７が、入力されたシフト量にもとづき、入力された仮数を左シフトする。右シフタ２４８が、入力されたシフト量にもとづき、入力された仮数を右シフトする。左シフトされた仮数Ｔ１と右シフトされた仮数Ｔ２とが、絶対値加算器２４９に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、絶対値加算器２４９にキャリーとして１を入力する。絶対値加算器２４９は、入力を加算し、結果を正規化回路２５２に出力する。
【０１８１】
正規化回路２５２へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数とが正規化回路２５２に入力される。また正規化回路２５２へのバイパスセレクト信号が０であるならば加算結果と指数ｅｘｐ３が仮数と指数として正規化回路２５２に入力される。
【０１８２】
正規化回路２５２は、指数から仮数の先行ゼロ計数値を減算し、結果を指数Ｚとする。正規化回路２５２は、仮数の先行ゼロ計数値だけ加算結果を左シフトし、結果を仮数Ｚとする。
【０１８３】
符号、指数Ｚ、仮数Ｚがエンコーダ２５３により外部形式に変換され、出力Ｚレジスタ２５４に出力される。
【０１８４】
上述の図２３及び図２７には、ｇｅｔ＿ｚｚ演算器とｆｉ（ｘ＋ｙ）演算器とを別個に設けた場合の回路構成を示したが、回路構成を適宜工夫することにより、ｇｅｔ＿ｚｚ演算器とｆｉ（ｘ＋ｙ）演算器とで回路を共有化することが可能である。
【０１８５】
図２８は、ｇｅｔ＿ｚｚ演算とｆｉ（ｘ＋ｙ）演算との両方を実行可能な演算器の構成の一例を示す図である。図２８に示す演算器は、入力Ｘレジスタ２６０、入力Ｙレジスタ２６１、デコーダ２６２及び２６３、指数仮数演算器２６４、セレクタ２６５及び２６６、左シフタ２６７Ａ、右シフタ２６７Ｂ、絶対値加算器２６８、ＯＶＦ・ＵＤＦ予測回路２６９を含む。演算器は更に、重複桁追い出し回路２７０、セレクタ２７１及び２７２、正規化回路２７３、エンコーダ２７４、出力Ｚレジスタ２７５を含む。
【０１８６】
図２９は、図２８に示す演算器における指数仮数演算器２６４の構成の一例を示す図である。指数仮数演算器２６４は、比較器２８１、ＬＺＣ計数器２８２及び２８３、セレクタ２８４乃至２８６、絶対値減算器２８７乃至２９２、比較器２９３、セレクタ２９４乃至２９８を含む。図３０は、図２８に示す演算器における重複桁追い出し回路２７０の構成の一例を示す図である。重複桁追い出し回路２７０は、セレクタ３０１及び３０２、減算器３０３、加算器３０４及び３０５、ゼロマスク回路３０６、セレクタ３０７及び３０８を含む。図２８に示す演算器は、図２９の指数仮数演算器２６４及び重複桁追い出し回路２７０の構成が図２３の演算器と異なるが、その他の対応する回路部分の構成及び動作は、図２３の演算器と同様であってよい。
【０１８７】
以下に、図２８乃至３０に示す演算器の動作について説明する。
【０１８８】
入力Ｘレジスタ２６０と入力Ｙレジスタ２６１より、データがデコーダ２６２及びデコーダ２６３にそれぞれ入力される。デコーダ２６２及び２６３により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力ＸＹの符号、指数、仮数をそれぞれ、符号Ｘ、指数Ｘ（ｅｘｐＸ）、仮数Ｘ（ＴＸ）、符号Ｙ、指数Ｙ（ｅｘｐＹ）、仮数Ｙ（ＴＹ）とする。
【０１８９】
指数仮数演算器２６４に指数Ｘ、仮数Ｘ、指数Ｙ、仮数Ｙが入力される。指数仮数演算器２６４の比較器２８１は、指数Ｘ及び指数Ｙの大小比較を行い、指数の大きい側を指数ｅｘｐ１とし、対応する仮数が仮数Ｔ１となり、指数の小さい側を指数ｅｘｐ２とし、対応する仮数が仮数Ｔ２となるようにセレクト信号を生成する。
【０１９０】
指数仮数演算器２６４の絶対値減算器２９１及び比較器２９３は、（指数Ｘ−仮数Ｘの先行ゼロ計数値）−（指数Ｙ−仮数Ｙの先行ゼロ計数値）の絶対値が１６以上である場合、入力から正規化回路２７３へバイパスする演算を行う。指数仮数演算器２６４は、固定精度加減算の時は仮数Ｔ１とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、ｇｅｔ＿ｚｚ演算の時には仮数Ｔ２とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
【０１９１】
指数仮数演算器２６４の絶対値減算器２８７は、（指数ｅｘｐ１−指数ｅｘｐ２）を、シフト量ＬＳＡ1とする。セレクタ２８６は、仮数Ｔ１の先行ゼロ計数を、シフト量ＬＳＡ２とする。ただし値が奇数の時はその値を−１する。指数仮数演算器２６４の絶対値減算器２９０は、（指数ｅｘｐ１−指数ｅｘｐ２−仮数Ｔ１の先行ゼロ計数値）を計算し、その結果をシフト量ＲＳＡとする。ただし仮数Ｔ１の先行ゼロ計数値が奇数の時はその値を−１する。絶対値減算器２９０によりＬＳＡ１とＬＳＡ２との大小比較を行い、その結果に応じてセレクタ２９４が、ＬＳＡ１のほうが小さい時はＬＳＡ２をＬＳＡとし、ＬＳＡ１のほうが大きい時はＬＳＡ２をＬＳＡとする。
【０１９２】
指数仮数演算器２６４の絶対値減算器２８９により、指数ｅｘｐ１から仮数Ｔ１の先行ゼロ計数値を減算した値を指数ｅｘｐ３とする。但し演算がｇｅｔ＿ｚｚ演算である場合には、この減算結果から更に絶対値減算器２９２により１４を減算した値を指数ｅｘｐ３とする。求めた指数ｅｘｐ３を、セレクタ２９５から重複桁追い出し回路２７０へ出力する。
【０１９３】
演算が固定精度加減算である場合、指数仮数演算器２６４は、右シフタ２６７Ｂへシフト量ＲＳＡを、左シフタ２６７Ａへシフト量ＬＳＡを出力する。ｇｅｔ＿ｚｚ演算である場合、指数仮数演算器２６４は、右シフタ２６７Ｂへ０を、左シフタ２６７Ａへシフト量ＲＳＡを出力する。
【０１９４】
左シフタ２６７Ａが、入力されたシフト量に基づき、入力された仮数を左シフトする。右シフタ２６７Ｂが、入力されたシフト量に基づき、入力された仮数を右シフトする。
左シフトされた仮数Ｔ１と右シフトされた仮数Ｔ２の下位１４桁（５６ｂｉｔ）が絶対値加算器２６８に入力される。減算の場合は、減数の仮数を反転することで１の補数を生成して入力し、絶対値加算器２６８にキャリーとして１を入力する。絶対値加算器２６８は、入力の下位１４桁（５６ビット）を加算し、結果を重複桁追い出し回路２７０に出力する。またキャリーアウトが、絶対値加算器２６８からＯＶＦ・ＵＤＦ予測回路２６９に供給される。
【０１９５】
ＯＶＦ・ＵＤＦ予測回路２６９に仮数Ｔ１、シフト量ＲＳＡ、加算結果のキャリーアウトが入力される。ＯＶＦ・ＵＤＦ予測回路２６９は、桁溢れ予測を行う。ＯＶＦ・ＵＤＦ予測回路２６９は、仮数Ｔ１の先頭桁から９（１００１２）が連続する個数を計数する。ＯＶＦ・ＵＤＦ予測回路２６９は、９の計数値がシフト量ＲＳＡ以上であり、且つキャリーアウトが発生しており、且つ演算が加算である時に、桁溢れの発生を示すフラグを生成し、フラグを重複桁追い出し回路２７０に出力する。
【０１９６】
またＯＶＦ・ＵＤＦ予測回路１８９が、桁落ち予測を行う。まずＯＶＦ・ＵＤＦ予測回路１８９は、仮数Ｔ１の先頭桁から０が連続する個数を計数し、但し初めて出現した１は０として計数を行うことにより、特殊先行ゼロ計数を行う。ＯＶＦ・ＵＤＦ予測回路１８９は、このゼロ計数値がシフト量ＲＳＡ以上であり、且つキャリーアウトが発生しており、且つ演算が減算である時に桁落ちの発生を示すフラグを生成し、フラグを重複桁追い出し回路２７０に出力する。
【０１９７】
重複桁追い出し回路２７０に、絶対値加算器２６８からの加算結果Ｔと、指数仮数演算器２６４からの指数ｅｘｐ３及びシフト量ＲＳＡと、ＯＶＦ・ＵＤＦ予測回路２６９からの桁溢れフラグＯＶＦ及び桁落ちフラグＵＤＦとが入力される。重複桁追い出し回路２７０の減算器３０３は、（１４（仮数部桁幅）−シフト量ＲＳＡ）を計算し、その値をマスク量とする。但し、加算器３０４により、桁溢れフラグが立っている時はマスク量を−２し、桁落ちフラグが立っている時はマスク量を＋２する。またマスク量が負の数となった時にはマスク量を０とする。また重複桁追い出し回路２７０の加算器３０５により、演算がｇｅｔ＿ｚｚ演算であり、桁溢れフラグが立っている時に指数ｅｘｐ３を＋２し、桁落ちフラグが立っている時に指数ｅｘｐ３を−２する。
【０１９８】
重複桁追い出し回路２７０のゼロマスク回路３０６が、仮数の上位側をマスク量桁分だけ０でマスクする。
【０１９９】
演算がｆｉ（ｘ＋ｙ）である時、重複桁追い出し回路２７０は、指数ｅｘｐ３と加算結果とをそのまま正規化回路２７３へ出力する。演算がｇｅｔ＿ｚｚである時、重複桁追い出し回路２７０は、加減算された指数とマスクされた仮数とを正規化回路２７３へ出力する。
【０２００】
正規化回路２７３へのバイパスセレクト信号が１であるならばバイパスされた仮数と指数とが正規化回路２７３に入力される。また正規化回路２７３へのバイパスセレクト信号が０であるならば重複桁追い出し回路２７０から出力された仮数と指数とが正規化回路２７３に入力される。
【０２０１】
正規化回路２７３（図１５と同様の構成であってよい）により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、補正器により先行ゼロ計数値が−１される。正規化回路２７３が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Ｚとする。正規化回路２７３が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Ｚとする。
【０２０２】
符号、指数Ｚ、仮数Ｚがエンコーダ２７４により外部形式に変換され、出力Ｚレジスタ２７５に出力される。
【０２０３】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【符号の説明】
【０２０４】
１７０  プロセッサ
１７１  メモリ
１７２  ２次キャッシュ部
１７３  １次キャッシュ部
１７３Ａ  命令キャッシュ
１７３Ｂ  データキャッシュ
１７４  制御部
１７５  演算部
１７６  レジスタ
１７７  演算制御部
１７８  演算器
１７９  演算回路
【図１】
2014041563.tif 000031
【図２】
2014041563.tif 000032
【図３】
2014041563.tif 000033
【図４】
2014041563.tif 000034
【図５】
2014041563.tif 000035
【図６】
2014041563.tif 000036
【図７】
2014041563.tif 000037
【図８】
2014041563.tif 000038
【図９】
2014041563.tif 000039
【図１０】
2014041563.tif 000040
【図１１】
2014041563.tif 000041
【図１２】
2014041563.tif 000042
【図１３】
2014041563.tif 000043
【図１４】
2014041563.tif 000044
【図１５】
2014041563.tif 000045
【図１６】
2014041563.tif 000046
【図１７】
2014041563.tif 000047
【図１８】
2014041563.tif 000048
【図１９】
2014041563.tif 000049
【図２０】
2014041563.tif 000050
【図２１】
2014041563.tif 000051
【図２２】
2014041563.tif 000052
【図２３】
2014041563.tif 000053
【図２４】
2014041563.tif 000054
【図２５】
2014041563.tif 000055
【図２６】
2014041563.tif 000056
【図２７】
2014041563.tif 000057
【図２８】
2014041563.tif 000058
【図２９】
2014041563.tif 000059
【図３０】
2014041563.tif 000060