(57)【特許請求の範囲】
【請求項１】
乗算−加算（Ｍａｄｄ）中間演算を実行するように構成されている浮動小数点ユニット（ＦＰＵ）であって、
前記ＦＰＵは、
第１および第２の浮動小数点オペランドの小数部を受け取り、乗算することにより、前記第１の浮動小数点オペランドと前記第２の浮動小数点オペランドとの浮動小数点積の乗算器出力小数部を生成するように構成されている乗算器ユニットと、
前記乗算器ユニットに結合された加算器ユニットであって、前記浮動小数点積の前記乗算器出力小数部と第３の浮動小数点オペランドの小数部とを受け取り、結合することにより、浮動小数点Ｍａｄｄ結果のＦＰＵ出力小数部を生成するように構成されている加算器ユニットと
を含み、
前記乗算器ユニットは、前記乗算器出力小数部を正規化または非正規化することではなく、前記乗算器出力小数部を丸めることによって特徴付けられる第１の演算モードで演算するように構成されており、前記乗算器出力小数部は、正規化された小数部より広い範囲を有する擬正規化フォーマットを有し、
前記乗算器出力小数部は、２進小数点の左側に対する２つのビットの精度を含み、前記擬正規化フォーマットは、前記２つのビットのうちの少なくとも一つのビットが１の値を有することによって特徴付けられ、
前記乗算器ユニットは、前記第１の演算モードおよび第２の演算モードを含む複数の演算モードのうちの一つで演算するように構成されており、前記第２の演算モードはＩＥＥＥ標準に適合する前記乗算器出力小数部によって定義され、
前記乗算器ユニットは、前記第２の演算モードで演算するときに、ＩＥＥＥ標準に従って、前記乗算器出力小数部を、必要に応じて正規化または非正規化し、丸めるようにさらに構成されており、
前記乗算器ユニットは、非正規化乗算器出力が検出され、前記乗算器ユニットが第３の演算モードで演算される場合に、前記乗算器出力小数部をゼロにフラッシュするか、または前記乗算器出力小数部を特定の値に設定するようにさらに構成されている、ＦＰＵ。
【請求項２】
前記乗算器出力小数部は、２進浮動小数点算術のためのＩＥＥＥ７５４標準によって定義されるビット位置で丸められる、請求項１に記載のＦＰＵ。
【請求項３】
前記乗算器出力小数部は、前記浮動小数点積の乗算器出力指数部とは独立して丸められる、請求項１に記載のＦＰＵ。
【請求項４】
前記乗算器出力小数部は、前記第１および第２の浮動小数点オペランドの小数部の範囲のおよそ２倍の範囲を有する、請求項１に記載のＦＰＵ。
【請求項５】
前記第１および第２の浮動小数点オペランドの小数部を前記乗算器ユニットによる処理前に格納フォーマットから内部フォーマットへアンパックするように構成されている浮動小数点パイプファイル（ＰＩＰ）をさらに備える、請求項１に記載のＦＰＵ。
【請求項６】
前記格納フォーマットは、ＩＥＥＥ標準に適合する、請求項５に記載のＦＰＵ。
【請求項７】
前記内部フォーマットは、前記格納フォーマットを上回る増加した分解能を有し、前記ＰＩＰは、前記第１および第２の浮動小数点オペランドの小数部を、前記乗算器ユニットによる処理前に内部の正規化された表示へ変換するように構成されている、請求項５に記載のＦＰＵ。
【請求項８】
前記ＰＩＰは、前記ＦＰＵ出力小数部を格納のために戻される前に、前記内部フォーマットから前記格納フォーマットへパックするようにさらに構成されている、請求項５に記載のＦＰＵ。
【請求項９】
前記乗算器ユニットは、前記乗算器出力小数部と、前記浮動小数点積の乗算器出力指数部とをチェックすることによって、非正規化された乗算器出力を検出するように構成されている、請求項１に記載のＦＰＵ。
【請求項１０】
請求項１に記載のＦＰＵを含むプロセッサであって、前記ＦＰＵは、ある数の逆数を近似するように設計された一組の演算を実行する、プロセッサ。
【請求項１１】
請求項１に記載のＦＰＵを含むプロセッサであって、前記ＦＰＵは、ある数の逆数平方根を近似するように設計された一組の演算を実行する、プロセッサ。
【請求項１２】
請求項１に記載のＦＰＵを含むプロセッサであって、前記ＦＰＵは、Ｎｅｗｔｏｎ−Ｒａｐｈｓｏｎアルゴリズムをインプリメントするように設計された一組の演算を実行する、プロセッサ。
【請求項１３】
前記ＦＰＵは、前記Ｎｅｗｔｏｎ−Ｒａｐｈｓｏｎアルゴリズムをインプリメントするとき、少なくとも一つのＭａｄｄ演算を実行する、請求項１２に記載のプロセッサ。
【請求項１４】
乗算−加算（Ｍａｄｄ）中間演算を実行するように構成されている浮動小数点プロセッサであって、前記プロセッサは、乗算器ユニットおよび加算器ユニットを含み、
前記乗算器ユニットは、
第１および第２の浮動小数点オペランドの小数部を受け取り、乗算するように構成されている乗算器アレイと、
前記乗算器アレイに作動可能に結合された第１の丸めユニットであって、前記第１の丸めユニットは、前記乗算器アレイからの出力を丸めて、前記第１の浮動小数点オペランドと前記第２の浮動小数点オペランドとの浮動小数点積の乗算器出力小数部を生成するように構成されており、前記乗算器出力小数部は、正規化または非正規化されずに丸められ、正規化された小数部よりも広い範囲を有する擬正規化フォーマットを有する、第１の丸めユニットと
を含み、
前記乗算器出力小数部は、２進小数点の左側に対する２つのビットの精度を含み、前記擬正規化フォーマットは、前記２つのビットのうちの少なくとも一つのビットが１の値を有することによって特徴付けられ、
前記乗算器ユニットは、第１の演算モードおよび第２の演算モードを含む複数の演算モードのうちの一つで演算するように構成されており、前記乗算器ユニット中の前記第１の丸めユニットは、前記乗算器ユニットが前記第１の演算モードで演算されるときに、前記擬正規化フォーマットで前記乗算器出力小数部を丸めるように構成されており、前記第１の丸めユニットは、前記乗算器ユニットが前記第２の演算モードで演算されるときに、ＩＥＥＥ標準に従って前記乗算器出力小数部を丸めるようにさらに構成されており、
前記乗算器ユニット中の前記第１の丸めユニットは、非正規化乗算器出力が検出され、前記乗算器ユニットが第３の演算モードで演算される場合に、前記乗算器出力小数部をゼロにフラッシュするか、または前記乗算器出力小数部を特定の値に設定するようにさらに構成されており、
前記加算器ユニットは前記乗算器ユニットに結合され、前記加算器ユニットは、
前記浮動小数点積の前記乗算器出力小数部と、第３の浮動小数点オペランドの小数部とを受け取り、結合するように構成されている桁上げ伝播加算器（ＣＰＡ）と、
前記ＣＰＡに結合された第２の丸めユニットであって、前記ＣＰＡからの小数部を受け取り、丸めるように構成されている第２の丸めユニットと、
前記第２の丸めユニットに結合された正規化ユニットであって、前記第２の丸めユニットからの丸められた小数部を受け取り、正規化するように構成されている正規化ユニットと
を含む、プロセッサ。
【請求項１５】
前記乗算器出力小数部は、２進浮動小数点算術のためのＩＥＥＥ７５４標準によって定義されたビット位置で丸められる、請求項１４に記載のプロセッサ。
【発明の詳細な説明】
【０００１】
（発明の背景）
本発明は、浮動小数点プロセッサに関し、より詳細には、乗算−加算（Ｍａｄｄ）演算用高精度浮動小数点プロセッサに関する。
【０００２】
デジタル処理システムにおいて、数字データは、典型的には整数表示または浮動小数点表示を用いて表される。浮動小数点表示は多くの用途において好ましい。その理由は、浮動小数点表示は広範囲の数値を表示することができ、そしていくつかの特定の演算の操作が容易だからである。浮動小数点表示は、典型的には次の３つの構成要素を含む：サインビット（ｓｉｇｎ）、しばしば有効（ｓｉｇｎｉｆｉｃａｎｄ）と称される小数部（ｍａｎｔ）、および指数（ｅｘｐ）。示された浮動小数点の数は、（−１）sign・ｍａｎｔ・２expと表され得る。浮動小数点の表示はまた、“ＩＥＥＥ  Ｓｔａｎｄａｒｄ  ｆｏｒ  Ｂｉｎａｒｙ  Ｆｌｏａｔｉｎｇ−Ｐｏｉｎｔ  Ａｒｉｔｈｍｅｔｉｃ”によって定義される。これは本明細書中でＩＥＥＥ７５４標準（または単にＩＥＥＥ標準）と称され、そして本明細書中においてすべての目的でその全体が参照として援用される。
【０００３】
多くの演算（加算、減算、および乗算のような算術演算を含む）が浮動小数点の数で実行され得る。算術演算のために、ＩＥＥＥ標準は、各浮動小数点演算についての独自の解を生成するために従うべきガイドラインを提供する。特に、ＩＥＥＥ標準は、特定の演算（例えば、乗算、加算）、得られた出力の精度、および使用されるべきデータフォーマットからの結果を基に実行されるべき処理を説明する。例えば、ＩＥＥＥ標準は、加算および乗算演算からの結果に適用可能ないくつかの丸めモード、および丸めが実行されるビット位置を定義する。この要求は、ＩＥＥＥ準拠浮動小数点プロセッサの異なるインプリメンテーションからの同一の結果を保証する。
【０００４】
多くの用途は、２つのオペランドでの乗算、および第３のオペランドとの得られた積の加算（または減算）を実行する。この乗算−加算（すなわち、Ｍａｄｄ）演算は、例えば、フィルタ関数、たたみこみ関数、相関関数、マトリックス変換、および他の関数を演算するためにしばしば使用されるデジタル信号処理において共通である。Ｍａｄｄ演算はまた、（３−Ｄ）グラフィック用途のための幾何学的演算に共通して使用される。
【０００５】
従来は、Ｍａｄｄ演算は、乗算（ＭＵＬ）演算に続いて加算（ＡＤＤ）演算を連続的に実行することにより達成され得る。この連続的な演算の実行により、長期の処理遅延が引き起こされる。性能の向上は、従来の浮動小数点乗算および加算をまたサポートする特別に指定されたユニットを使用して、Ｍａｄｄ演算を実行することで、しばしば達成することができる。
【０００６】
Ｍａｄｄ演算のために、後処理が、乗算部分からの途中の結果を基に典型的に実行される。ＩＥＥＥ丸め要求を満たす最終のＭａｄｄ出力を得るために、後処理は、可能な非正規化（ｄｅｎｏｒｍａｌｉｚａｔｉｏｎ）、およびＩＥＥＥ標準によって定義される丸めモードの一つに従う途中結果の丸めを含む。非正規化は非正規化された数（すなわち、最小の正の表示可能な正規化された数（＋ａmin）と最小の負の表示可能な正規化された数（−ａmin）との間のゼロでない数）で実行され、丸めがＩＥＥＥ標準によって特定されるビット位置で実行され得るような適切なフォーマットの非正規化された数を設定する。ＩＥＥＥ準拠Ｍａｄｄ結果を生成するための後処理（すなわち、より詳細には、非正規化および丸め）は、典型的には精度の低下（非正規化および丸めの間に、いくつかのビットが放棄されるため）、ハードウェアの複雑性の増加、および処理時間の増加をもたらす。ハードウェアの複雑性を減少させ、処理時間を改善するために、いくつかのＭａｄｄアーキテクチャは、最小の表示可能な正規化された数よりも小さい数（例えば、途中結果）がゼロまたはａminのような何か他の値に設定またはフラッシュ（ｆｌｕｓｈ）されるさらなる演算モードを提供する。しかし、フラッシュトゥーゼロモードは、小数部がゼロまたは何か他のあらかじめ定義された最小値で置換されるために精度のより大きいロスを受ける。
【０００７】
従って、Ｍａｄｄ演算に関して、出力結果の精度を向上させ、途中結果の後処理を簡単にし、そして全体の処理時間を減少させる技術が非常に望まれる。
【０００８】
（発明の要旨）
本発明は、乗算加算（Ｍａｄｄ）演算の実行が可能であり、高精度で、回路複雑性が低く、可能な限り演算速度を向上させた浮動小数点プロセッサを提供する。向上した性能は、特定の様式での特定の演算モードでの演算時に、乗算器ユニットからの途中結果を処理することで達成される。具体的には、途中結果は、以下で詳細に説明するように、正規化または非正規化されず、丸められる。
【０００９】
本発明の実施形態は、乗算−加算（Ｍａｄｄ）演算を実行するように構成可能な浮動小数点ユニット（ＦＰＵ）を提供する。ＦＰＵは、加算器ユニットに接続された乗算器ユニットを含む。乗算器ユニットは、乗算器出力小数部を生成するために、第１および第２のオペランドに関する小数部を受け取り、そして乗算する。乗算器ユニットは、丸められそして擬正規化フォーマットを有する乗算器出力小数部によって定義される第１の演算モードで演算するように構成可能である。加算器ユニットは乗算器ユニットに接続し、そしてＦＰＵ出力小数部を生成するために、乗算器出力小数部と第３のオペランドの小数部とを受け取り、そしてそれらを結合する。
【００１０】
一つの実施形態では、擬正規化フォーマットは、一の値を有する２進小数点の左側に対する少なくとも一つのビットによって特徴付けられる。乗算器出力小数部は、ＩＥＥＥ標準によって定義されたビット位置で丸められ得、そしてさらにその関連する指数部とは無関係に丸められ得る。
【００１１】
乗算器ユニットは、複数の演算モードうちの一つで選択的に演算するように指定され得る。上記の第１の演算モードに加えて、第２の演算モードがＩＥＥＥ標準に適合する乗算器出力小数部によって定義され得る。このモードでは、乗算器出力小数部は、必要に応じて正規化または非正規化され、ＩＥＥＥ標準に従って丸められる。第３の演算モードが、非正規化乗算器出力が検出される場合にゼロまたは他のあらかじめ定義された値にフラッシュされる乗算器出力小数部によって定義され得る。演算モードは、制御レジスタ、制御信号、または何か他の機構に格納された値によって選択され得る。
【００１２】
ＦＰＵは、相互の数または相互の平方根の数を近似するように指定された一組の演算を実行するように構成される場合に向上した性能を提供し得る。これらの近似は、Ｎｅｗｔｏｎ−Ｒａｐｈｓｏｎアルゴリズムに従って実行され得る。
【００１３】
本発明のさらに別の実施形態は、Ｍａｄｄ演算を実行するように構成可能な浮動小数点プロセッサを提供する。浮動小数点プロセッサは、加算器ユニットに接続された乗算器ユニットを含む。乗算器ユニットは、第１の丸めユニットに作動可能に接続された乗算器アレイを含む。乗算器アレイは、２つのオペランドの小数部を受け取り、そして乗算する。第１の丸めユニットは、乗算器アレイからの出力を丸めるように構成可能であり、擬正規化フォーマットを有する丸められた乗算器出力小数部を生成する。加算器ユニットは、桁上げ伝播加算器（ＣＰＡ）、第２の丸めユニット、および正規化ユニットを含む。ＣＰＡは乗算器出力小数部および第３のオペランドの小数部を受け取り、そしてそれらを結合する。第２の丸めユニットはＣＰＡと結合し、そしてＣＰＡからの小数部を受け取り、丸める。正規化ユニットは第２の丸めユニットと結合し、そして丸められた小数部を受け取り、正規化する。乗算器ユニット内では、別のＣＰＡが乗算器アレイと第１の丸めユニットとの間で接続可能であり、合計出力と乗算器アレイからの桁上げ出力とを受け取り、結合する。
【００１４】
上記のＦＰＵおよび浮動小数点プロセッサは、典型的にはオペランドの指数部を処理するためのさらなるユニットを含む。ＦＰＵおよび浮動小数点プロセッサは、マイクロプロセッサまたは他のハードウェア構造物内に組み込まれ得、さらにハードウェア設計言語（例えば、Ｖｅｒｉｌｏｇ）を使用して記載および／またはインプリメントされ得る。
【００１５】
本発明のさらに別の実施形態は、浮動小数点Ｍａｄｄ演算を実行する方法を提供する。この方法によれば、２つのオペランドに関する小数部は第３の小数部を生成するために乗算され、次いでこれは第４の小数部を生成するために丸められる。第４の小数部は、擬正規化フォーマットおよび正規化された小数部より大きな範囲を有する。第４の小数部は第３のオペランドの小数部と結合されて、出力小数部を生成する。出力小数部はさらに丸められ、そして正規化され、ＩＥＥＥ標準に適合する表示を生成し得る。
【００１６】
本発明はまた、上記の実施形態をインプリメントするコンピュータプログラム製品を提供する。
【００１７】
本発明の他の局面とともに、上記の事項は、以下の明細書、特許請求の範囲、および添付の図面を参照してより明らかとなる。
【００１８】
（特定の実施形態の説明）
図１は、本発明の浮動小数点ユニット（ＦＰＵ）１１０を組み込んだプロセッサ１００の実施形態の簡略化した図を示す。図１の特定の実施形態に示されるように、プロセッサ１００は、命令ディスパッチユニット（ＩＤＵ）１２０、ロード格納ユニット（ＬＳＵ）１３０および整数実行ユニット（ＩＸＵ）１４０をさらに含む。ＩＤＵ１２０は、命令のシーケンスを復号し、ＦＰＵ１１０への浮動小数点命令をディスパッチし、ディスパッチされた各浮動小数点命令の状態、リソースおよびレジスタ依存性、ならびに得られたオペランドを次のＦＰＵ命令へバイパスする確率を追跡する。ＦＰＵ１１０は、ＩＤＵ１２０によって指示される浮動小数点計算を実行する。ＬＳＵ１３０は、他のエレメント（すなわち、プロセッサ１００の内部または外部）とインターフェイスし、データをＦＰＵ１１０へ提供し、ＦＰＵ１１０からデータを受け取る。例えば、オペランドがＬＳＵ１３０からＦＰＵ１１０へとロードされ、結果がＦＰＵ１１０からＬＳＵ１３０へ提供される。ＩＸＵ１４０は、整数計算を実行し、データをＦＰＵ１１０へ送信し、ＦＰＵ１１０からデータを受け取ることができる。
【００１９】
図１はまた、ＦＰＵ１１０の実施形態のブロック図を示す。ＦＰＵ１１０は、ＬＳＵ１３０とインターフェイスする浮動小数点レジスタファイル（ＦＰＲ）１５２を含む。ＦＰＲ１５２は、複数のリードポート（すなわち、各算術演算あたり最大３つのオペランドおよび蓄積演算あたり１つのオペランドを読み出すためのリードポート）、および複数のライトポート（すなわち、各算術演算およびロード演算あたり１つのオペランドを書き込むためのライトポート）を含む。
【００２０】
浮動小数点パイプファイル（ＰＩＰ）１５４はＦＰＲ１５２に接続し、さらにＬＳＵ１３０およびＩＸＵ１４０とインターフェイスする。各命令について、ＰＩＰ１５４は、ＦＰＲ１５２、ロードパイプファイル、結果パイプファイルまたはＲＯＭからオペランドを選択し受け取る。次いで、ＰＩＰ１５４は、受け取られたオペランドを（すなわち、ＩＥＥＥ準拠フォーマットから）ＦＰＵ１１０内のプロセシングユニットによって認識される内部データフォーマットにアンパックする。ＰＩＰ１５４はまた、ＦＰＵ１１０からの結果を外部回路によって必要とされるデータフォーマット（すなわち、ＩＥＥＥ準拠フォーマット）にパックして、パックされた結果をＦＰＲ１５２に提供する。
【００２１】
浮動小数点乗算器（ＭＵＬ）１５６はＰＩＰ１５４に接続し、浮動小数点乗算命令および乗算−加算（ＭＡＤＤ）命令のような複合命令の乗算部分を実行する。ＭＵＬ１５６は、ＰＩＰ１５４から２つのオペランドの小数部を受け取る。１実施形態において、ＭＵＬ１５６は、完全な精度を有する１組の和出力および桁上げ出力を生成する乗算器アレイとインプリメントされる。和出力および桁上げ出力は、桁上げ伝播加算器（ＣＰＡ）に提供されて、この桁上げ伝播加算器（ＣＰＡ）で結合されて、正確な丸められていない合成小数部を生成する。合成小数部の下位ビットは、論理的に結合されて、「スティッキー」ビットを形成する。このスティッキービットは、丸めビットおよび現在の丸めモードと組み合わせて用いて、ＭＵＬ１５６内の次の丸めユニットへと送信される丸め情報を生成する。ＭＵＬ１５６は、以下に詳述する。
【００２２】
浮動小数点加算器（ＡＤＤ）１５８は、ＰＩＰ１５４およびＭＵＬ１５６に接続する。ＡＤＤ１５８は、浮動小数点加算および減算命令、ならびにＭＡＤＤのような複合命令の加算部分を実行する。ＡＤＤ１５８は、２つのオペランドを受け取って、例えば、大量相殺加算器（ＭＣＡ）と同時に動作するプリスケール加算器（ＰＳＡ）を用いて、浮動小数点絶対値加算／減算を実行する。最終的な出力は、加算器のうちの１つから選択され、ＰＩＰ１５４へと提供されて格納される。１実施形態において、加算器の選択は、主オペランドとこのようなオペランドの小数部である第１のわずかなビット（すなわち、整数ビットと端数部分のうちの最上位ビット）との間の指数差に基づいているので、（１）ＰＳＡは常に加算に用いられ、丸めおよび正規化を行う前に、結果が０．１００００００以上であると保証される場合には、ＰＳＡは選択的に減算に用いられ、（２）丸めおよび正規化を行う前に、結果が１．０未満であると保証され、かつ多くの先頭のゼロを有し得る場合には、ＭＣＡは選択的に減算に用いられる。両方の条件を満たすオペランドは、ＰＳＡまたはＭＣＡのいずれかによって処理され得る。しばしば、この選択基準では、オペランド指数間の差が２より大きい場合には、ＰＳＡを選択して加算および減算を行い、オペランド指数間の差が２以下である場合には、ＭＣＡを選択して減算する。
【００２３】
浮動小数点指数ユニット（ＥＸＰ）１６０は、ＰＩＰ１５４およびＡＤＤ１５８に接続する。ＥＸＰ１６０は、ＰＩＰ１５４からオペランドの指数を受け取り、実行される演算に基づく出力指数およびオペランドの指数を推定して、小数部に関して実行される丸めおよび正規化に基づく評価された出力指数を（例えば、ＭＵＬ１５６およびＡＤＤ１５８によって）調整する。ＥＸＰ１６０はまた、オーバーフロー／アンダーフロー予測および検査等の他の関数を実行する。
【００２４】
浮動小数点除算／平方根ユニット（ＤＳＱ）１６２はＭＵＬ１５６に接続し、小数部について除算および平方根命令を行う。ＤＳＱ１６２は、特定のアルゴリズム（例えば、基数−２ＳＲＴアルゴリズムまたは基数−４ＳＲＴアルゴリズム）を実行するように設計されている。
【００２５】
浮動小数点制御ユニット（ＣＴＬ）１６４は、ＦＰＵ１１０のための制御ユニットである。ＣＴＬ１６４は、浮動小数点命令を受け取り、ＦＰＵ１１０内の種々のユニットの演算を指示し、適切な出力を生成する。
【００２６】
図２は、加算演算、乗算演算、および加算−乗算（Ｍａｄｄ）演算を実行することが可能な浮動小数点ユニット（ＦＰＵ）２００の実施形態のブロック図である。ＦＰＵ２００は、図１に示されるＦＰＵ１００の一部を表す。ＦＰＵ２００は、加算器ユニットに接続された乗算器ユニットを含む。簡略化のため、図１に示される回路等のサポート回路は、図２には示していない。乗算器ユニットは、乗算器アレイ２１０と、桁上げ伝播加算器（ＣＰＡ）２１２と、丸めユニット２１６と、指数結合ユニット２２０とを含む。加算器ユニットは、図２に示されるように残りのユニットを含む。ＦＰＵ２００は、以下に記載されるように、精度を増加させる、ハードウェアの設計を簡略化する、演算パフォーマンスを向上するといったいくつかの特徴を含む。
【００２７】
どの時点においても、ＦＰＵ２００は、加算、乗算およびＭａｄｄを含む少なくとも３つの異なる演算のうちの１つを実行するように構成され得る。これらの演算は以下の式
Ｆｄ＝Ｆｓ±Ｆｔ、
Ｆｄ＝Ｆｓ・Ｆｔ、
Ｆｄ＝±（（Ｆｓ・Ｆｔ）±Ｆｒ）、
によって表される。ここでＦｄは合成出力であり、Ｆｒ、ＦｓおよびＦｔは３つの入力オペランドである。Ｍａｄｄ演算は、以下の演算へとさらに分けることができ、それらの対応する名前は、
Ｆｄ＝（Ｆｓ・Ｆｔ）＋Ｆｒ、      ＭＡＤＤ
Ｆｄ＝（Ｆｓ・Ｆｔ）−Ｆｒ、      ＭＳＵＢ
Ｆｄ＝−（（Ｆｓ・Ｆｔ）＋Ｆｒ）  Ｎ  ＭＡＤＤ
Ｆｄ＝−（（Ｆｓ・Ｆｔ）−Ｆｒ）  Ｎ  ＭＳＵＢ
である。
【００２８】
図２に示されるように、２つのオペランドの小数部（Ｍａｎｔ  ＳおよびＭａｎｔ  Ｔ）が、乗算器アレイ２１０に提供される。アレイ２１０は、例えば、ブースアルゴリズムまたは修正ブースアルゴリズムを実行し得、部分積生成ロジックおよび複数の桁上げ保存加算器を含み得る。部分積生成ロジックは、小数部に基づいて部分積を生成する。桁上げ保存加算器は複数の部分積をまとめて加算し、２つの数（最終的な和および桁上げ）だけが残るまで、その出力をツリー方式で他の桁上げ保存加算器に送信する。特定のインプリメンテーションでは、桁上げ保存加算器は、４つの項を取り上げ、それらを結合させて２つにするが、他の構成も可能である。
【００２９】
従って、アレイ２１０は、２つのオペランドを乗算し、その積を和および桁上げフォーマットでＣＰＡ２１２に提供する。ＣＰＡ２１２は、和と桁上げとを結合させて、得られた小数部を丸めユニット２１６に提供する。この丸めユニット２１６は、ＦＰＵの特定の演算モードに基づいて小数部を処理する。丸めユニット２１６の演算についてはさらに後述される。処理された小数部は、乗算器ユニットからの出力小数部を含む。
【００３０】
２つのオペランドの指数（Ｅｘｐ  ＳおよびＥｘｐ  Ｔ）が、指数結合ユニット２２０に提供される。この指数結合ユニット２２０は、乗算演算を行うためにこれらの指数を結合する。ユニット２２０からの結合された指数は、乗算器ユニットからの出力指数を含む。
【００３１】
１実施形態において、パフォーマンスが改善される（すなわち、演算速度がより高速になる）場合には、加算器ユニットは、同時に動作するプリスケール加算器（ＰＳＡ）と大量相殺加算器（ＭＣＡ）とを含む。オペランドの特性に応じて、ＰＳＡまたはＭＣＡのいずれかからの出力が選択される。
【００３２】
浮動小数点加算を実行するために、２つのオペランドの小数部は、典型的には、２つのオペランドの指数が等しくなるまで一方の小数部をシフトさせ、その指数を調節することによって合わせられる。次いで、小数部が結合（例えば、加算または減算）され、その合成小数部が正規化される。結合前のシフト数は、（例えば、大きな数を小さな数に加算する場合には）大きくなり得、結合後のシフト数もまた、（例えば、同じ大きさを有する２つのオペランドを減算する場合には）大きくなり得る。ＰＳＡおよびＭＣＡは、これらの２つの極端な条件を含む大抵の入力条件を効率的に処理するように設計されている。
【００３３】
ＰＳＡの場合、丸めユニット２１６からの小数部が、ＭＵＸ２３２ａおよび２３２ｂに提供される。オペランドＲおよびＴの小数部は、実行される演算に基づいて、これら小数部のうちの一方を選択し、選択された小数部をＭＵＸ２３２ａおよび２３２ｂへ提供するＭＵＸ２３０に提供される。ＭＵＸ２３２ａは、小さい方のオペランドの小数部を選択し、選択された小数部を右シフトユニット２３４に提供する。ＭＵＸ２３２ｂは、大きい方のオペランドの小数部を選択し、選択された小数部をＣＰＡ２３６に提供する。
【００３４】
オペランドＲおよびＴの指数は、実行される演算に基づいて指数のうちの一方を選択するＭＵＸ２２６に提供される。ＭＵＸ２２６から選択された指数およびユニット２２０からの結合された指数が、２つの指数間の差および予備的な結果の指数を決定する指数計算ユニット２５２に提供される。予備的な結果の指数は、実行される算術式に応じて決定され、このことは、１９９９年７月３０日に出願され、本発明の譲渡人に譲渡された米国特許出願第０９／３６３，６３８号に記載されており、同出願を本明細書中において参考として援用する。予備的な結果の指数（例えば、加算演算が実行される際の大きい方の指数）は、指数調整ユニット２５６に提供され、指数差は、小さい方のオペランドの小数部を示される指数差だけ右にシフトさせる右シフトユニット２３４に提供される。シフトされた小数部は、２つの小数部を結合するＣＰＡ２３６に提供され、結合された小数部を丸めユニット２４２に提供する。丸めユニット２４２は、その結合された小数部を丸め、丸められた小数部を正規化ユニット２４４に提供する。
【００３５】
ＣＰＡ２３６からの小数部は、０１．ｘｘｘ−−ｘｘｘｘ、１ｘ．ｘｘｘ−−ｘｘｘｘ、または（減算による）０．１ｘｘｘ−−ｘｘｘｘフォーマットであり得る。正規化ユニット２４４は、必要ならば１ビット右シフトまたは左シフトを実行することによって、その結果を０１．ｘｘｘ−−ｘｘフォーマットに正規化する。指数は、正規化ユニット２４４によって実行される正規化に基づいて、必要に応じて指数調整ユニット２５６により調整される。
【００３６】
ＦＰＵ２００のＭＣＡ部は、ＣＰＡ２６２と、先頭ゼロ予測器（ＬＺＡ）２６４と、左シフトユニット２６６とを含む。ＭＣＡの場合、丸めユニット２１６およびＭＵＸ２３０からの小数部は、ＭＵＸ２３２ｃおよび２３２ｄに提供される。ＭＵＸ２３２は、指数差に基づいて小数部の一方を容易にわずかにシフトさせ、小数部を合わせる。ＭＵＸ２３２はまた、減算演算において小数部の一方を選択して反転させるために用いられる（簡略化のため、インバータは図２に示さない）。ＭＵＸ２３２ｃおよび２３２ｄからの出力は、ＣＰＡ２６２およびＬＺＡ２６４に提供される。ＣＰＡ２６２は、２つの小数部を結合して、結合された小数部を左シフトユニット２６６に提供する。ＬＺＡ２６４は、入力オペランドに基づいて、合成小数部の先頭ゼロの数を予測する。ＬＺＡ２６４からの出力は、左シフトユニット２６６のシフト数を規定する制御信号へとコード化される。制御信号はまた、指数を調整するために指数調整２５６へ提供される。
【００３７】
正規化ユニット２４４および左シフトユニット２６６の出力はＭＵＸ２４６に提供される。このＭＵＸ２４６は、ＰＳＡまたはＭＣＡからの出力をＦＰＵ２００からの出力小数部として選択する。ユニット２５６からの調整された指数は、ＦＰＵ２００からの出力指数を含む。ＦＰＵ２００の演算については、１９９９年７月２０日に出願され、本発明の譲渡人に譲渡された米国特許出願第０９／３６４，５１４号にさらに記載され、同出願を本明細書中において参考のため援用する。
【００３８】
図２は、２つの丸め演算が実行され得るＭａｄｄアーキテクチャを示す。一方の丸め演算は乗算演算後に実行され、他方の丸め演算は加算演算後に実行される。このＭａｄｄアーキテクチャは、乗算および加算が別個に実行されるかのように、ＩＥＥＥ丸め要件を満たすＭａｄｄ結果を生成し得る。
【００３９】
図３Ａは、正規化された浮動小数点数の表示を示す。この表示には、符号ビット３１０と、小数部３１２と、指数３１４とが含まれる。正規化された浮動小数点数は、２進小数点（すなわち、小数部の整数部分）の左側に１を有する小数部によって１．ｘｘｘ−−ｘｘフォーマットと表される。ここで、「ｘ」はそれぞれ１または０のいずれかである１ビットを表す。ＩＥＥＥ標準によって規定されているように、端数部分「ｘｘｘ−−ｘｘ」は、正規化された単倍精度の数の場合には２進小数点の後ろに２３ビットを表し、正規化された二倍精度の数の場合には５２ビットを表す。正規化された小数部は、１．０〜２．０（すなわち、１．０≦小数部＜２．０）の範囲を有する。
【００４０】
ＩＥＥＥ標準は、浮動小数点数の表示を規定する。正規化された数の場合には、ＩＥＥＥ標準は、小数部の端数部分のみ（すなわち、図３Ａの「ｘｘｘ−−ｘｘ」部分）を格納するように指定する。２進小数点の左側の先頭１は、陰であり格納されない。
【００４１】
図３Ｂは、ＩＥＥＥ標準によって規定される単倍精度および二倍精度の浮動小数点数の表示を示す。ＩＥＥＥ標準は、単倍（３２ビット）精度および二倍（６４ビット）精度の浮動小数点数について、指数および小数部の端数部分に用いられるビット数を規定する。図３Ｂに示されるように、単倍精度表示は３つの要素を含む。すなわち、１つの符号ビット（ｓｉｇｎ）、８ビットの指数（ｅｘｐ）および２３ビットの小数部（ｍａｎｔ）である。二倍精度表示は、１つの符号ビット（ｓｉｇｎ）、１１ビットの指数（ｅｘｐ）および５２ビットの小数部（ｍａｎｔ）を含む。浮動小数点数（ｙ）は、次のように表され得る。
【００４２】
ｙ＝（−１）sign・ｍａｎｔ・２exp    式（１）
図４Ａは、すべての実数を図式的に表す線図を示す。この線図は一定の比率で描かれていないことに留意されたい。一般に、実数は、負の無限遠（−∝）から正の無限遠（＋∝）の範囲である。図４Ａに示される線図において、式（１）に示される浮動小数点式については、０．０より大きな数（すなわち、ｙ＞０．０）が正の符号ビット（すなわちｓｉｇｎ＝０）によって表され、０．０より小さな数（すなわち、ｙ＜０．０）が負の符号ビット（すなわち、ｓｉｇｎ＝１）によって表される。１．０より大きな絶対値を有する数（すなわち、｜ｙ｜＞１．０）は、正の指数（すなわち、ｅｘｐ≧０）によって表され、１．０より小さい絶対値を有する数（すなわち、｜ｙ｜＜１．０）は、負の指数（すなわち、ｅｘｐ＜０）によって表される。
【００４３】
（単倍精度の場合に３２ビットを有し、二倍精度の場合に６４ビットを有する図３Ｂに示されるような）有限分解を有する浮動小数点表示については、特定の値域内の数のみが、式（１）に示される式を用いて正規化された数として表示され得る。この値域は、最大正規化値ａmaxと最小正規化値ａminによって定義される。単倍精度数については、ａmaxは、２+128よりもわずかに小さく、ａmin＝２-126である。０〜最小正規化値の間のいくつかの数（すなわち、ａmin＞ｙ＞０．０）は、以下に説明される非正規化された数として表示され得る。ゼロ（０．０）および最大正規化値（例えば、無限遠）よりも大きないくつかの数については特別な表示が用いられる。
【００４４】
図４Ｂは、ＩＥＥＥ標準による単倍精度数の指数表示の図を示す。バイナリ表示を有する正の指数値と負の指数値との両方を得るために、表示された指数がバイアス値でオフセットされる。単倍精度数の場合、ＩＥＥＥ標準は、１２７となる指数バイアス値を規定する。従って、実際の（すなわち、バイアスされていない）指数値は、表示された（すなわち、バイアスされた）指数値（すなわち、図３Ｂに示される指数部に格納された値）から指数バイアス値１２７を引いたものに等しい。例えば、バイアスされた指数値２５４、１２７および１は、バイアスされていない指数値＋１２７、０および−１２６にそれぞれ対応する。ＩＥＥＥ標準によれば、すべて１の指数値（例えば、２５５）およびすべてゼロ（例えば、０）の指数値は、以下に説明されるように特別な場合を表示するために用いられる。従って、表示され得る正規化された数は、＋１２７〜−１２６の範囲内の指数を有する。
【００４５】
図５Ａは、いくつかの正規化された数の表示を示す。上述のように、正規化された数は、１．ｘｘｘ−−ｘｘフォーマットに適合する小数部を有する。ここで、２進小数点の左側のビットは１であり、２進小数点の右側の各「ｘ」は、１またはゼロ（０）のいずれかであり得る単一ビットを表す。一般に、正規化された数は、規定の範囲内（例えば、単倍精度については、＋１２７〜−１２６のバイアスされた指数にそれぞれ相当する２５４〜１）であるバイアスされた指数を有する。バイアスされた指数値０は、以下に説明するように、ゼロ（すなわち、ｙ＝０．０）および非正規化された数を表示するために保存される。
【００４６】
正規化された最大数（すなわち、ａmax）は、１１１．．．１１０のバイアスされた指数（これは、単倍精度のバイアスされていない指数＋１２７に相当する）と、すべて１の小数部（これは、２進小数点の左側の「１」が正規化された数の場合には陰であるので、小数部の値１．１１１．．．１１に相当する）とを有する。すべて１の指数は、特別な表示のために保存されることに留意されたい。表示され得る次に大きな数は、同じ指数値（例えば、単倍精度の場合のバイアスされていない指数＋１２７）と、正規化された最大値（すなわち、１．１１１．．．１０）よりも小さな１つの最小桁ビット（ＬＳＢ）である小数部値とを有する。一般に、漸減的に小さくなる数に対して、小数部の端数部分は、すべて１からすべて０へと１だけデクリメントされる。端数部分がすべて０の場合には、次に小さな数が、端数部分をすべて１へと戻してリセットし、１だけ指数値をデクリメントすることによって表示される。このプロセスは、指数０００．．．００１および端数部分がすべて０で表示される最小値に到達するまで続く。
【００４７】
図５Ｂは、いくつかの非正規化された数および０の表示を示す。上述のように、ゼロ実数（すなわち、ｙ＝０．０）は、すべてゼロの指数およびすべてゼロの小数部とによって表示される。表示され得る数の範囲を広げるために、ＩＥＥＥ標準は、すべてゼロの指数およびすべてゼロの小数部を用いて非正規化された数の表示を規定する。非正規化された小数部は、０．ｘｘｘ−−ｘｘのフォーマットを有し、ここで２進小数点の左側のビットは、ゼロ（０）であり、２進小数点の右側の各「ｘ」は、１またはゼロ（０）のいずれかである。非正規化された最大数は、小数部値０．１１１．．．１１（これは、単倍精度の２-126よりもわずかに小さな値に相当する）を有し、非正規化された最小数は、小数部値０．０００．．．０１（すなわち、これは単倍精度の２-149に相当する）を有する。従って、非正規化された数は、正規化された最小数ａmin〜ゼロの間の範囲（すなわち、単倍精度の２-126から２-149の範囲）を網羅する。
【００４８】
非正規化された数は、図４Ａにおいて線図で示されるように表示可能な数の範囲を広げるが、一般的にはＦＰＵで処理するのはより困難とされる。これは、指数および小数部を操作するためにはさらなる処理が必要とされるためである。処理を容易にし、非正規化された数の処理を簡略化するためには、ＦＰＵは、典型的には、内部正規化表示を用いてＩＥＥＥに準拠した非正規化された数の表示を可能にするように、さらなる分解によって設計される。例えば、さらに１ビットだけ指数を増加させることによって、分解は大きく増加し、非正規化された数は、処理の前に内部表示を用いて正規化され得る。特定の例として、単倍精度の場合には、＋２５５〜−２５４の範囲のバイアスされていない指数を有する９ビット指数が、ＩＥＥＥによる非正規化された最小数２-149を容易に表すことができる。
【００４９】
一般的に、ＩＥＥＥフォーマットにしたがって、数がメモリまたは格納部に格納される。このように、これらの数は、正規化された数、非正規化された数、または特定の数（例えば、ゼロまたは無限遠）であり得る。多くのＦＰＵアーキテクチャに対して、格納部から数が検索され、ＦＰＵによって処理される前に、内部の正規化表記に「アンパック」される。ＦＰＵからのその結果の出力は、格納部に戻されるように転送される前に、ＩＥＥＥフォーマットに「パック」され得る。
【００５０】
ＩＥＥＥ標準は、ガイドラインを規定し、後に加算および乗算などの、浮動小数点演算に対する一意の結果を生成する。ＩＥＥＥ標準は、Ｍａｄｄ演算の処理を規定しない。Ｍａｄｄ演算は、基本的に、乗算後の加算という連鎖である。ＩＥＥＥに準拠するＭａｄｄ結果を生成するために、Ｍａｄｄ演算の乗算器からの途中の結果を処理して、ＩＥＥＥに準拠する途中の結果を生成することが必要があり、そのＩＥＥＥに準拠する途中の結果は、ＩＥＥＥ乗算演算からの結果と同一である。
【００５１】
図６Ａは、乗算演算から生じ得る２つの小数部表記を示す。各々が、１．０と２．０の範囲内であり（すなわち、１．ｘｘｘ−−ｘｘフォーマットに対応する）、Ｎビットの精度を有する２つの正規化された小数部（すなわち、内部表記を用いて）の乗算を行なう場合、その結果の小数部は、１．０から４．０の範囲内にあり得、０１．ｘｘｘ−−ｘｘｘｘ、または、１ｘ．ｘｘｘ−−ｘｘｘｘフォーマットを有し得る。端数部「ｘｘｘ−−ｘｘｘｘ」は、丸めこまない乗算器の結果に対する精度の２Ｎビットの（または、単倍精度の２３ビットより多いビット、および、二倍精度数の５２ビットより多いビット）までを表す。２進小数点の左の２ビットは、１．０から４．０の範囲を表すのに使用される。その結果のオペランドが、１．０と２．０の範囲内の小数部を維持するように、２．０以上であるか否かの正規化（例えば、１ビット位置の右シフト）を行ない得る。指数は、シフトが行なわれるかどうか（すなわち、それぞれ１ビット位置だけ右にシフトするように、１つだけ指数を増加させることにより）に従って調整される。
【００５２】
図６Ｂは、丸めこまない小数部を除いて正規化された表示を示す。乗算器アレイからの結果である小数部は、２Ｎビットまでの精度を有し得るので、丸めこみは、Ｎビットの精度を有し、入力される小数部と同じ精度を有する、小数部を提供するように行なわれ得る。ＩＥＥＥ標準は、利用可能な丸めこみモードと同様に丸めこまれるべきビットの位置を規定する。本質的に、小数部は、矢印６２０によって示される規定されたビット位置の右まで切り捨てられ、おそらくこのビット位置で増加される。増加ビットは、丸めこみビットと「スティッキー」ビットと現在の丸めこみモードとに基づいて生成される。この丸めこみビットは、矢印６２０の右までのビットであり、スティッキービットは丸めこみビットの右までの全てのビットの論理和である。丸めこみは、再正規化を必要とする小数部を生成し得る。これが生じる場合、第２の正規化が行なわれる。
【００５３】
図６Ｃは、ＩＥＥＥ標準に適合する正規化された小数部の表示を示す。正規化された小数部は、１．０と２．０の範囲で、Ｎビットの精度を有する。
【００５４】
図６Ａ〜図６Ｃに示されるフォーマットは、「擬正規化」フォーマットの変形例として見なされ得る。本明細書で使用されるように、擬正規化フォーマットは、２進小数点の左に位置する一の値（１）を有する少なくとも１つのビットの存在によって規定される。したがって、擬正規化フォーマットは、０１．ｘｘｘ−−ｘｘ、１０．ｘｘｘ−−ｘｘ、１１．ｘｘｘ−−ｘｘおよび他のフォーマットを含む。擬正規化フォーマットは、２進小数点の右までのバイナリデジットの任意の数を含有する。
【００５５】
上記のように、２つのＮビットの数の乗算の結果は、２Ｎビットまでの精度を有する積である。入力オペランドに応じて、積は、最大の正規化値ａmaxを超え得、または、ＩＥＥＥ非正規化の範囲内に入り得る。乗算演算後の後処理の一部として、ＩＥＥＥに準拠する乗算結果を生成するために、途中の結果が正規化された数または非正規化された数であるか否かを判定する。途中の結果が非正規化された数であるとみなされる場合、非正規化後の丸めこみが、ＩＥＥＥに準拠する乗算結果を生成するために、行なわれ、これは、ＩＥＥＥに準拠するＭａｄｄ結果の生成するための必須条件である。
【００５６】
途中の結果の非正規化は、以下の様に、行なわれ得る。第１に、途中の結果に関連する途中の指数は、最小の正規化された指数未満（例えば、単倍精度の−１２６未満）かどうか判定されるようにチェックされる。この状況は、２つの小さな数を乗算する場合に生じ得、内部指数表示の加算精度は、小さな結果をキャプチャし得る。途中の指数は、最小の正規化された指数未満である場合、小数部は右にシフトされ、指数は各ビットの右シフトで１つだけ増加される。小数部の右シフトおよび指数の増加は、更新された指数が最小の正規化された指数に等しくなるまで、続く。次いで、小数部は、ＩＥＥＥ標準によって示されるビット位置で丸めこまれる。丸めこみがＩＥＥＥ標準によって規定されるような正しいビット位置で行われ得るように、非正規化が必要である。
【００５７】
ＩＥＥＥに準拠する乗算結果を生成するための途中の結果の非正規化は、ビットが非正規化プロセスの間、捨てられるので、一般に、正確度の低下が生じる。さらに、非正規化は、インプリメントするためのさらなるハードウェアを必要とする時間消費プロセスである。さまざまなアプローチが、非正規化の数の処理を単純化し、ハードウェア要件を減らすためにインプリメントされている。これらのアプローチのうちの２つを以下に説明する。
【００５８】
あるアプローチにおいて、ＦＰＵは非正規化された数を検出するが、実際の非正規化は、ある他の機構（例えば、ソフトウェア）によって行なわれる。非正規化された数の検出は、指数および小数部の値に基づいた従来の技術を用いて為され得る。非正規化された数の検出の際に、例外が生じ（すなわち、フラッグが生じ）、正しい処置がソフトウェアによって実行される。ハードウェアによる検出およびソフトウェアによる処理のアプローチは、入力オペランドおよび乗算器ユニットからの途中の結果に適用され得る。ＩＥＥＥに準拠する乗算結果を生成するために非正規化された数を取り扱うこのアプローチは、典型的には、より単純化されたハードウェア設計のためにパフォーマンスを犠牲にする（すなわち、より遅い演算速度）。
【００５９】
別のアプローチにおいて、ＦＰＵは非正規化された数をゼロにフラッシュするための性能を有するように設計される。この「フラッシュ・ツゥ・ゼロ」アプローチのある具体的なインプリメンテーションにおいて、オペランドが最小の正規化された数の正および負の範囲内にあると決定される（すなわち、＋ａminと―ａminとの間）場合、ゼロ（０．０）にセットされる。フラッシュ・ツゥ・ゼロアプローチの他の変形例もまた、インプリメントされ得る。例えば、正の無限遠に丸めこむ丸めこみモードにおいて、オペランドは、ゼロ（０、０）とａminの範囲内にある場合、最小の規格された数ａminにフラッシュされ、−ａminとゼロ（０、０）の範囲内にある場合、ゼロ（０、０）にフラッシュされる。負の無限遠に丸めこむ丸めこみモードにおいて、オペランドは、−ａminとゼロ（０、０）の範囲内にある場合、−ａminにフラッシュされ、ゼロ（０、０）とａminの範囲内にある場合、ゼロ（０、０）にフラッシュされる。フラッシュ・ツゥ・ゼロ演算は、非正規化された入力オペランド、途中オペランド、出力オペランドに関して実行され得る。このアプローチは、向上した演算速度を提供し、途中の結果をゼロにフラッシュするために最小のさらなるハードウェアを必要とする。しかし、Ｍａｄｄ結果はＩＥＥＥに準拠せず、正確度は低下する。なぜなら、小数部がゼロまたはある他の値にフラッシュされる場合、ビットが捨てられるからである。
【００６０】
多くのアプリケーションは、Ｍａｄｄ演算からのＩＥＥＥに準拠する結果を必要としない。これらのアプリケーションに対して、Ｍａｄｄ演算の乗算器からの途中の結果は、上記のように、ゼロにフラッシュされ得る。しかし、途中の結果をゼロにフラッシュすることは、関連するＭａｄｄ結果の正確度を低下させる。
【００６１】
本発明によれば、Ｍａｄｄ演算の乗算器からの途中の結果の正規化または非正規化ではなく、丸めこみを引き起こす新たなアプローチが提供される。この「Ｍａｄｄフラッシュオーバーライド」アプローチにおいて、途中の結果は、正確度を向上させるために、内部の正規化されたフォーマットに維持される。このアプローチは、独占的に使用され得るか、または、コンピュータシステムのいくつかの演算モードの１つとして構成され得る。そのような演算モードの各々は、例えば、制御レジスタに保持される１つ以上のビットによって特定され得る。
【００６２】
図８は、特定の演算モードを特定するビットを格納するように構成された浮動小数点制御ステータスレジスタ（「ＦＣＳＲ」）の表示を示す。このＦＣＳＲは、ＦＰＵの浮動小数点演算を制御するビットの値を含む。特定の実施形態において、ＦＣＳＲは、ぞれぞれ、ビット位置２４、２２に配置されるフラッシュ「ＦＳ」ビットおよびＭａｄｄフラッシュオーバーライド（ＦＯ）ビットを含み、ＩＥＥＥ準拠モードとフラッシュ・ツゥ・ゼロモードとＭａｄｄフラッシュオーバーライドモードを特定する。ＦＳビットが１である場合（すなわち、論理ハイ）、フラッシュ・ツゥ・ゼロモードが活性化され、ＦＳビットが０である場合（すなわち、論理ロー）、ＩＥＥＥ準拠モードが活性化される。ＦＯビットが１である場合、Ｍａｄｄフラッシュオーバーライドモードが活性化され、Ｍａｄｄ演算の非正規化された途中の結果が、ＦＳビットにしたがってフラッシュも非正規化もされない。ＦＣＳＲは、本発明の譲受人に譲渡され、本明細書において参考として援用される、１９９９年７月２０日に出願した米国特許出願第０９／３６４，７８７号にさらに記載される。
【００６３】
表１は、ＦＳおよびＦＯビットに対する演算モードおよび指定を要約する。
【００６４】
【表１】
0004691294.tif 000002
一般に、ＦＰＵは表１に示されるモードおよびリストに示されない他のモードの任意の組み合わせをサポートするように設計され得る。例えば、ＦＰＵは、Ｍａｄｄフラッシュオーバーライドモード、ＩＥＥＥ準拠モード、Ｍａｄｄフラッシュオーバーライドモードのみ、表１にリストに示される３つのすべてのモード、または、他のモードの組み合わせをサポートするように設計され得る。ＩＥＥＥ準拠モードにおいて、ＩＥＥＥに準拠する途中の結果を生成するための処理は、ハードウェア、ソフトウェア、または、ハードウェアとソフトウェアとの組み合わせにおいて実行され得る。表１のリストに示されるモードは、以下に示すように説明される。
【００６５】
ＩＥＥＥ準拠モードにおいて、ＦＰＵの乗算器ユニットからの途中の結果は、ハードウェアまたはソフトウェアに必要な場合、正規化されるか、または、非正規化され、かつ、丸めこまれる。図６Ａを参照すると、ＣＰＡ２１２からの途中の結果は、０１．ｘｘｘ−−ｘｘｘｘまたは１ｘ．ｘｘｘ−−ｘｘｘｘフォーマットのいずれかであり得る。始めに、途中の結果の指数は、途中の結果が正規化された数または非正規化された数の範囲内にあるかどうかを判定するようにチェックされる。これは、最大指数値ｅｘｐmaxおよび最小指数値ｅｘｐmin（例えば、単倍精度に対して、ｅｘｐmax＝＋１２７、ｅｘｐmin＝−１２６）と、指数を比較することによって、達成され得る。途中の結果が正規化された数であると決定される場合、小数部は０１．ｘｘｘ−−ｘｘｘｘフォーマットと正規化される。あるいは、途中の結果が非正規化された数であると決定される場合、小数部は上記の態様で非正規化される。正規化された小数部または非正規化された小数部は、次いで、図６Ｂの矢印６２０によって示される位置で丸めこまれる。正規化／非正規化および丸めこまれた途中の結果は、加算器ユニットに提供される。
【００６６】
フラッシュ・ツゥ・ゼロモードにおいて、ＦＰＵの乗算器ユニットからの小数部は、途中の結果が非正規化された数である場合、ゼロにフラッシュされる。また、この非正規化は、途中の結果および小数部値に対する指数をチェックすることにより達成され得る。具体的には、指数がｅｘｐminより小さく、小数部がゼロに等しくない（例えば、ｍａｎｔ≠０）場合、途中の結果は、非正規化された数とみなされ、ゼロにフラッシュされる。
【００６７】
Ｍａｄｄフラッシュオーバーライドモードにおいて、乗算器ユニットからの途中の結果は、丸めこまれるが、正規化および非正規化されない。ある実施形態において、丸めこみは、途中の結果に関連する指数をチェックすることなく行なわれる。ある実施形態において、丸めこみユニット２１６からの小数部は、ａmaxおよびａminによって規定される範囲内の非正規化された数または数であるかどうかにかかわらず、丸めこまれる。
【００６８】
図７Ａは、乗算器ユニットのＣＰＡ２１２からの小数部の２つの小数部表示を示す。乗算器アレイ２１０からの出力は、２進小数点の右の２Ｎビットまでの精度、かつ、２進小数点の左の２ビットの精度を有し得る。丸めこみユニット２１６は、始めに、最上位ビット（ＭＳＢ）位置７０８のビットがゼロ（０）または一（１）であるか否かを判定する。丸めこまれるべきビットの位置は、小数部が０１．ｘｘｘ−−ｘｘｘｘまたは１ｘ．ｘｘｘ−−ｘｘｘｘフォーマットを有するか否かに応じて、１ビット位置だけ異なる。０１．ｘｘｘ−−ｘｘｘｘフォーマットを有する小数部に対して、丸めこみユニット２１６は、矢印７１０ａによって示される位置におけるビットを丸めこむ。あるいは、１ｘ．ｘｘｘ−−ｘｘｘｘフォーマットを有する小数部に対して、丸めこみユニット２１６は、矢印７１０ｂによって示される位置におけるビットを丸めこむ。
【００６９】
図７Ｂは、丸めこみユニット２１６からの小数部の２つの小数部表示を示す。丸めこまれた小数部は１．０と４．０との間の範囲にあり、これは、正規化された小数部の範囲の約２倍である。追加のビットを用いて、小数部内の追加の範囲を表す。次のユニット（例えば、右シフトユニット２３４、ＣＰＡ２３６、丸めこみユニット２４２、ＰＳＡの正規化ユニット２４４、ＣＰＡ２６２、ＭＣＡの左シフトユニット２６６）は、小数部の追加のビットを適切に処理するように設計される。
【００７０】
ＭＡＤＤフラッシュオーバーライドモードに従って、正規化および非正規化を行なわずに、丸めこみを行なうことによって、幾つかの利点が得られる。第１に、ビットを捨てる非正規化が行なわれないので、正確度が向上する。ＭＡＤＤフラッシュオーバーライドモードにおいて、途中の結果は、内部の正規化されたフォーマットを正確度が向上するように維持する。
【００７１】
第２に、ハードウェアのいくつか、または、全ては、２Ｎビットより小さい精度で設計され得る。なぜなら、精度の幾つかは、乗算器ユニット内の丸めこみを放棄する確率が高いからである。例えば、乗算器アレイ２１０およびＣＰＡ２１２は、２Ｎビットより小さい精度でインプリメントされ得る。加算器ユニットの次のユニットは、また、２Ｎビットより小さい精度を有する数で演算するように設計され得る。これは、また、ハードウェア設計を単純化する。
【００７２】
第３に、より小さい精度内のこれらのユニットのインプリメンテーションは、ＦＰＵの演算速度を向上し得る。上述したように、乗算器アレイは、一般的には、順に演算する桁上げ保存加算器のセットでインプリメントされる。処理遅延を小さくすること、および、それにより演算速度を速くすることは、フルの２Ｎビットの結果より小さく結果を計算することにより、得られ得る。
【００７３】
上述したように、Ｍａｄｄ演算を行なうことが可能な浮動小数点プロセッサは多くのアプリケーション（例えば、デジタル信号処理およびグラフィック）において所望されている。Ｍａｄｄ演算は、また、算術アルゴリズムにおいて一般に用いられる。例えば、Ｎｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムは、逆数および逆数の平方根を近似するために使用される収束アルゴリズムである。このアルゴリズムは、多くの乗算器およびＭａｄｄ演算を行なう。アルゴリズムのパフォーマンス（例えば、収束の速度および正確度）はＭａｄｄ演算の正確度に依存する。さらに、そのアルゴリズムは、一般的に、多くのＭａｄｄ演算を含むので、アルゴリズムの速度は、また、Ｍａｄｄ演算の速度に依存する。本発明を組みこんだ浮動小数点プロセッサは、Ｎｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムをインプリメントするために使用される場合、向上したパフォーマンス（すなわち正確度および速度）を提供し得る。
【００７４】
数Ｒの逆数を近似するためのＮｅｗｔｏｎ―Ｒａｐｈｓｏｎ逆数アルゴリズムは、
１／Ｒ≒Ｘi+1＝Ｘi・（２−Ｒ・Ｘi）
として規定される。ここで、ｉは１以上の整数（すなわち、ｉ＝１，２，３，．．．）であり、Ｘiはｉ回目の反復からの近似であり、Ｘi+1は（ｉ＋１）回目の反復におけるより正確な近似である。
【００７５】
数（Ｒ）の逆数平方根を近似するためのＮｅｗｔｏｎ―Ｒａｐｈｓｏｎ逆数平方根アルゴリズムは、
１／√（Ｒ）≒Ｘi+1＝（３−Ｒ・Ｘi・Ｘi）・Ｘi／２、
として規定され、ここで、Ｘiはｉ回目の反復からの数Ｒの逆数平方根の近似であり、Ｘi+1は（ｉ＋１）回目の反復におけるより正確な近似である。
【００７６】
浮動小数点プロセッサを用いたＮｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムおよびそのインプリメンテーションは、本発明の譲受人に譲渡され、本明細書において参考として援用される、１９９９年７月２０日に出願した米国特許出願第０９／３６３，６３７号にさらに記載される。
【００７７】
ＦＰＵ１１０の浮動小数点命令セットアーキテクチャ（ＩＳＡ）は、Ｎｅｗｔｏｎ―Ｒａｐｈｓｏｎ逆数アルゴリズムおよび逆数平方根アルゴリズムをインプリメントするための命令を含む。ある実施形態において、ＩＳＡは、Ｎｅｗｔｏｎ―Ｒａｐｈｓｏｎ逆数アルゴリズムの反復をインプリメントするための３つの命令を含む。３つの命令は、ＲＥＣＩＰ１（オペランド１）、ＲＥＣＩＰ２（オペランド１、オペランド２）、ＭＡＤＤ（オペランド１、オペランド２、オペランド３）である。
【００７８】
ＲＥＣＩＰ１（オペランド１）命令により、ＦＰＵ１１０はオペランド１の逆数の推定である結果を生成することができる。推定を生成するには多様な方法がある。ある実施形態において、ルックアップテーブルが使用される。ＲＥＣＩＰ２（オペランド１、オペランド２）命令により、ＦＰＵ１１０が、（オペランド１−オペランド２・オペランド３）に等しい結果を生成することができる。ＭＡＤＤ命令は、ＦＰＵ１１０が、（オペランド１＋オペランド２・オペランド３）に等しい結果を生成することが可能な乗算−加算命令である。ＲＥＣＩＰ１およびＲＥＣＩＰ２命令は、上記の米国特許出願第０９／３６４，７８７号にさらに記載される。
【００７９】
数（Ｒ）の逆数を近似するためのＮｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムは、以下のシーケンスにおいて上記の命令を実行するようにＦＰＵ１１０を構成することにより、インプリメントされ得る。
【００８０】
（１）  Ｘi＝ＲＥＣＩＰ１（Ｒ）
（２）  ＩＲ＝ＲＥＣＩＰ２（Ｒ，Ｘi）
（３）  Ｘi+1＝ＭＡＤＤ（Ｘi，Ｘi，ＩＲ）
ＦＰＵ１１０が上の所与のシーケンスにおける上の３つの命令を実行した後、以下の量が得られる。
【００８１】
Ｘi+1＝Ｘi＋Ｘi・ＩＲ＝Ｘi＋Ｘi（１−Ｒ・Ｘi）＝２Ｘi−Ｒ・Ｘi・Ｘi＝Ｘi（２−Ｒ・Ｘi），
これは、数Ｒの逆数に対するＮｅｗｔｏｎ―Ｒａｐｈｓｏｎ近似である。
【００８２】
ある実施形態において、浮動小数点ＩＳＡは、逆数平方根を近似するためのＮｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムの反復を行なうための４つの命令を含む。４つの命令は、ＲＳＱＲＴ１（オペランド１）、ＲＳＱＲＴ２（オペランド１、オペランド２）、ＭＵＬ（オペランド１、オペランド２）、ＭＡＤＤ（オペランド１、オペランド２、オペランド３）である。
【００８３】
ＲＳＱＲＴ１（オペランド１）命令により、ＦＰＵ１１０が、オペランドの逆数平方根の推定である結果を生成することができる。その推定を生成するには多様な方法がある。ある実施形態において、ルックアップテーブルが使用される。ＲＳＱＲＴ２（オペランド１、オペランド２）命令により、ＦＰＵ１１０が（１−オペランド１・オペランド２）／２に等しい結果を生成することができる。ＭＡＤＤ（オペランド１、オペランド２、オペランド３）命令は、上述している。ＭＵＬ（オペランド１、オペランド２）命令は、ＦＰＵ１１０がオペランド１・オペランド２に等しい結果を生成可能な乗算命令である。ＲＳＱＲＴ１およびＲＳＱＲＴ２命令は、上述した米国特許出願第０９／３６４，７８７号にさらに記載される。
【００８４】
数（Ｒ）の逆数平方根を近似するためのＮｅｗｔｏｎ―Ｒａｐｈｓｏｎアルゴリズムは、以下のシーケンスにおいて上記の命令を実行するようにＦＰＵ１１０を構成することにより、インプリメントされ得る。
【００８５】
（１）  Ｘi＝ＲＳＱＲＴ１（Ｒ）
（２）  ＩＲ１＝ＭＵＬ（Ｒ，Ｘi）
（３）  ＩＲ２＝ＲＳＱＲＴ２（ＩＲ１，Ｘi）
（４）  Ｘi+1＝ＭＡＤＤ（Ｘi，Ｘi，ＩＲ２）
ＦＰＵ１１０が上記の所与のシーケンスの上の４つの命令を実行した後、Ｘi+1＝（３−Ｒ・Ｘi・Ｘi）・Ｘi／２であり、これは、数Ｒの逆数平方根のＮｅｗｔｏｎ―Ｒａｐｈｓｏｎ近似である。
【００８６】
上で示した命令のセットの各々は、ＭＡＤＤ命令を含む。ＭＡＤＤ命令は、上記のＭＡＤＤフラッシュオーバーライドモードを用いて実行される場合、向上した正確度を有する。ＲＥＣＩＰ２（Ｒ，Ｘi）命令によって生成されるＩＲ値およびＲＳＱＲＴ２（ＩＲ１，Ｘi）命令によって生成されるＩＲ２値は、通常小さな数である。これらの数は図６Ａに示される擬正規化フォーマットで内部的に表される場合、大きな精度が得られ、それにより、近似の正確度が向上する。さらに、，ＸiおよびＩＲ（またはＩＲ２）が小さい数である場合、ＭＡＤＤ命令の実行の間（上記のシーケンスにおいて提供されるように）ＸiとＩＲ（またはＩＲ２）との乗算の結果、非正規化された数が生じ得る。しかし、これらの値が擬正規化フォーマットで維持される場合、非正規化処理が一般的に避けられるので、正確度は維持される。
【００８７】
明瞭にするために、本発明は、ＩＥＥＥフォーマットに適合する単倍精度浮動小数点表示および二倍精度浮動小数点表示のコンテキストで記載される。しかし、本発明は、他の浮動小数点表示で用いられるように適応されてもよく、これは、本発明の範囲内である。
【００８８】
ＦＰＵ２００は、様々な態様でインプリメントされ得る。例えば、ＦＰＵ２００は、デジタル信号プロセッサ内のハードウェア、アプリケーション専用集積回路（ＡＳＩＣ）、マイクロプロセッサおよび他のハードウェア構造でインプリメントされ得る。
【００８９】
ハードウェアを用いた本発明のインプリメンテーションに加えて、本発明は、また、コンピュータ読み出し可能なプログラムコードを格納するために構成されたコンピュータ使用可能媒体を含む製造品で実施され得る。プログラムコードにより、本明細書において開示されるハードウェアの、機能、製造およびその両方が可能になる。例えば、これは、当業者に利用可能な、汎用プログラム言語（例えば、Ｃ、Ｃ＋＋など）、ハードウェア記述子言語（ＨＤＬ）、レジスタ転送言語（ＲＴＬ）、Ｖｅｒｉｌｏｇ  ＨＤＬ、ＶＨＤＬ、ＡＨＤＬ（Ａｌｔｅｒａハードウェア記述子言語）、または、他のプログラムおよび／または回路（すなわち、スキマティク（ｓｃｈｅｍａｔｉｃ））キャプチャツールによって達成され得る。具体例として、Ｓｎｙｏｐｓｙｓ，Ｉｎｃ．によるＶｅｒｉｌｏｇシミュレータ「ＶＣＳ  ｖ．４．１．１」は、本発明をシュミレートするために使用された。Ｊ．Ｂｈａｓｋｅｒ，Ｓｔａｒ  Ｇａｌａｘｙ  Ｐｒ．１９９７による名称「Ａ  Ｖｅｒｉｌｏｇ  ＨＤＬ  Ｐｒｉｎｔｅｒ」の書籍は、Ｖｅｒｉｌｏｇ  ＨＤＬの詳細を提供し、全ての目的でその全体を本明細書の参考として援用する。プログラムコードインプリメンテーションにおいて、図２はフロー図の実施形態として機能し得る。
【００９０】
上記のように本発明によって達成される機能は、プログラムコードで使用され得るコアで表され得、集積回路の製造物の一部としてハードウェアに変換され得ることが理解される。また、ハードウェアおよびソフトウェアの組み合わせを用いた本発明の他のインプリメンテーション（例えば、ＦＰＵ２００）も可能である。したがって、上記の実施形態は、本発明の範囲内であり、この特許によって保護されると考慮されるべきである。
【００９１】
好適な実施形態の上記記載は、任意の当業者が、本発明を行なう、または、本発明を使用することができるように提供されている。これらの実施形態の様々な改変が当業者にとって容易に明らかであり、本明細書で規定される一般原理は、発明力を使用することなく他の実施形態に適用され得る。したがって、本発明は、本明細書で使用された実施形態に限定することを意図するものではなく、本明細書で開示された原理および新規な特徴と矛盾しない最も広い範囲に一致するべきである。
【図面の簡単な説明】
【図１】  図１は、本発明の浮動小数点ユニット（ＦＰＵ）を導入するプロセッサの一実施形態の簡略化した図を示す。
【図２】  図２は、本発明に従って、加算、乗算、および乗算−加算演算を実行可能なＦＰＵの一実施形態のブロック図を示す。
【図３Ａ】  図３Ａは、浮動小数点数の表示を示す。
【図３Ｂ】  図３Ｂは、ＩＥＥＥ標準によって定義されるような信号および二倍精度浮動小数点数の表示を示す。
【図４Ａ】  図４Ａは、すべての実数を図式的に表示するラインの図を示す。
【図４Ｂ】  図４Ｂは、ＩＥＥＥ標準による単倍精度数の指数部表示の図を示す。
【図５Ａ】  図５Ａは、いくつかの正規化された数の表示を示す。
【図５Ｂ】  図５Ｂは、いくつかの非正規化された数およびゼロ（０）の表示を示す。
【図６Ａ】  図６Ａは、乗算演算から生じ得る２つの小数部表示を示す。
【図６Ｂ】  図６Ｂは、丸められていないが正規化された小数部の表示を示す。
【図６Ｃ】  図６Ｃは、ＩＥＥＥ標準に適合する正規化された小数部の表示を示す。
【図７Ａ】  図７Ａは、図２のＦＰＵの乗算器ユニット内の桁上げ伝播加算器（ＣＰＡ）からの小数部の２つの小数部の表示を示す。
【図７Ｂ】  図７Ｂは、乗算器ユニット内の丸めユニットからの小数部の２つの小数部表示を示す。
【図８】  図８は、特定の演算モードを識別するビットを格納するように構成された浮動小数点制御ステータスレジスタ（“ＦＣＳＲ”）の表示を示す。
【図１】
0004691294.tif 000003
【図２】
0004691294.tif 000004
【図３Ａ】
0004691294.tif 000005
【図３Ｂ】
0004691294.tif 000006
【図４Ａ】
0004691294.tif 000007
【図４Ｂ】
0004691294.tif 000008
【図５Ａ】
0004691294.tif 000009
【図５Ｂ】
0004691294.tif 000010
【図６Ａ】
0004691294.tif 000011
【図６Ｂ】
0004691294.tif 000012
【図６Ｃ】
0004691294.tif 000013
【図７Ａ】
0004691294.tif 000014
【図７Ｂ】
0004691294.tif 000015
【図８】
0004691294.tif 000016