(57)【要約】    非正規化サポートモードでは、浮動小数点加算器の正規化回路は、浮動小数点乗算器の出力を正規化、あるいは、非正規化するために使用される。各浮動小数点乗算命令は、強制的にゼロにされる加数で、乗算−加算命令へ推論的に変換される。浮動小数点加算器の正規化回路を利用して積を正規化、あるいは、非正規化する一方で、これは積の値を保存する。乗算処理のオペランドが利用可能である場合、それらは検査される。オペランドがアンノーマル中間積、あるいは、非正規化最終積を生成しない場合には、たとえば、オペランド・フォワーディングによって、その加算演算は抑制される。さらに、各融合なしの浮動小数点乗算−加算命令は、ゼロの加数を持つ乗算−加算命令で置き換えられる。そして、元の乗算−加算命令の加数を持つ浮動小数点加算命令は、命令ストリームに挿入される。演算の検査に応じて、アンノーマル中間結果、あるいは、非正規化最終結果が生じない場合には、その加数は乗算−加算命令に戻され、そして加算命令はＮＯＰに変換される。
2009536771.tif 000002
【特許請求の範囲】
【請求項１】
浮動小数点乗算命令を、浮動小数点乗算処理および浮動小数点加算処理を行うように動作する浮動小数点乗算−加算命令へ変換することと、
前記浮動小数点加算処理の１つの加数を強制的にゼロにすることと、
を含む、非正規化入力、および／または、非正規化積を計算するための浮動小数点乗算命令を実行する方法。
【請求項２】
前記方法のステップは、非正規化サポートモードにおいてのみ行われる請求項１の方法。
【請求項３】
前記浮動小数点乗算命令を浮動小数点乗算−加算命令へ変換することは、実行パイプライン段階の前に生じる、請求項１の方法。
【請求項４】
前記浮動小数点乗算命令を浮動小数点乗算−加算命令へ変換することは、デコードパイプライン段階で生じる、請求項３の方法。
【請求項５】
前記浮動小数点乗算−加算命令は融合されておらず、浮動小数点乗算器の出力を浮動小数点加算器の正規化回路に転送することをさらに含む、請求項１の方法。
【請求項６】
浮動小数点乗算器の前記出力を浮動小数点加算器の正規化回路に転送することは、浮動小数点乗算器の前記出力を前記正規化回路に直接、送ることを含む、請求項５の方法。
【請求項７】
浮動小数点乗算器の前記出力を浮動小数点加算器の正規化回路に送ることは、１つ以上のパイプライン記憶要素を通じて前記正規化回路に浮動小数点乗算器の前記出力を送ることを含む、請求項５の方法。
【請求項８】
前記浮動小数点乗算命令の乗数と被乗数を検査すること、
前記検査に基づいて、乗算処理の前記積は非正規化数ではないこと、および前記乗算のオペランドは非正規化ではないことを決定すること、ならびに、
そのような決定に応じて、前記浮動小数点加算処理を抑制すること、
をさらに含む、請求項１の方法。
【請求項９】
前記乗数と被乗数の検査は、実行パイプライン段階で生じる、請求項８の方法。
【請求項１０】
前記浮動小数点加算処理を抑制することは、後続の命令により消費され得るように、浮動小数点乗算器の前記出力のオペランド・フォワーディングを含む、請求項８の方法。
【請求項１１】
前記浮動小数点乗算命令は融合されていない浮動小数点乗算−加算命令であり、
そして、前記浮動小数点乗算命令の変換は、
前記浮動小数点乗算−加算命令の前記加数に対して前記ゼロ値を代入することと、
前記元の浮動小数点乗算−加算命令の前記加数を持つ浮動小数点加算命令を前記浮動小数点乗算−加算命令の後に挿入することと、
を含む、請求項１の方法。
【請求項１２】
前記浮動小数点乗算−加算命令の乗数と被乗数を検査することと、
前記検査に基づいて、前記乗算処理の前記積は非正規化数ではないであろうことを決定することと、
前記検査に基づいて、前記乗算処理への前記入力が非正規化数ではないことを決定することと、
そのような決定に応じて、前記ゼロの加数を前記元の乗算−加算命令の前記加数で置き換えることと、
前記浮動小数点加算命令をＮＯＰに変換することと、
をさらに含む、請求項１１の方法。
【請求項１３】
１つ以上の命令実行パイプラインと、
浮動小数点乗算器と、
正規化回路を持つ浮動小数点加算器と、
前記浮動小数点加算器の前記正規化回路を利用する前記浮動小数点乗算器によって浮動小数点積出力を正規化または非正規化するように動作するパイプライン制御器と、
を含むプロセッサ。
【請求項１４】
前記パイプライン制御器は、非正規化サポートモードにおいてのみ、前記浮動小数点積の正規化を行うか、あるいは、非正規化を行う、請求項１３のプロセッサ。
【請求項１５】
前記パイプライン制御器は、各浮動小数点乗算命令を、浮動小数点乗算処理および浮動小数点加算処理を行うように動作する浮動小数点乗算−加算命令へ変換するように前記パイプラインに指令することによって、ならびに、前記浮動小数点加算処理の１つの加数を強制的にゼロにすることによって、前記浮動小数点積の正規化を行うか、あるいは非正規化を行う、  請求項１３のプロセッサ。
【請求項１６】
前記パイプライン制御器は、実行パイプ段階の前に、各浮動小数点乗算命令を浮動小数点乗算−加算命令へ変換するように前記パイプラインに指令する、請求項１５のプロセッサ。
【請求項１７】
前記パイプライン制御器は、デコードパイプ段階で、各浮動小数点乗算命令を浮動小数点乗算−加算命令へ変換するように前記パイプラインに指令する、請求項１６のプロセッサ。
【請求項１８】
前記パイプライン制御器は、さらに、前記浮動小数点乗算器が前記浮動小数点乗算処理を行う前に、乗数と被乗数の検査によって、アンノーマル中間積または非正規化最終積を生成する可能性があるかどうかを予測するように動作する、および、そうでなければ、前記浮動小数点乗算器出力の正規化または非正規化を抑制するように動作する、請求項１３のプロセッサ。
【請求項１９】
前記パイプライン制御器は、後続の命令により消費され得るように、前記積のオペランド・フォワーディングによって、前記浮動小数点乗算器の出力の正規化または非正規化を抑制する、請求項１８のプロセッサ。  
【請求項２０】
前記パイプラインに、各融合されていない浮動小数点乗算−加算命令を、ゼロの加数を持つ浮動小数点乗算−加算命令に、変換するように指令することと、
前記浮動小数点乗算−加算命令の後に、前記元の浮動小数点乗算−加算命令の前記加数を持つ浮動小数点加算命令を挿入すること、            
によって、前記パイプライン制御器は、前記非正規化浮動小数点積の正規化を行うか、あるいは、非正規化を行う、請求項１３のプロセッサ。
【請求項２１】
前記パイプライン制御器は、さらに、浮動小数点乗算処理を行なう前に、乗数と被乗数の検査によって、前記浮動小数点乗算器がことによるとアンノーマル中間積または非正規化最終積を生成することができるかどうかを予測するように動作する、そして、そうでなければ、浮動小数点乗算器出力の正規化を抑制するように動作する、請求項２０のプロセッサ。
【請求項２２】
前記パイプライン制御器は、前記元の乗算−加算命令の前記加数で前記ゼロの加数を置き換えることによって、および、浮動小数点加算命令をＮＯＰへ変換することによって、前記浮動小数点乗算器の前記出力の正規化または非正規化を抑制する、請求項２１のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、一般にプロセッサ分野に関する、そして、特に、非正規化オペランドを計算するために、浮動小数点乗算命令を浮動小数点乗算−加算命令へ再コード化するモードベースの方法に関する。
【背景技術】
【０００２】
マイクロプロセッサは、幅広い種類の用途において、数値に関する計算処理を行う。高実行スピード、低パワー消費、小サイズは、携帯電子装置のような埋め込み式の用途では特に、プロセッサ設計者にとって重要な目標である。現代のプロセッサは、各々が複数の実行ステップを有する連続命令が実行時に重なるように、パイプライン方式を利用する。パイプライン方式では、各命令は、フェッチ、デコード、実行、書き戻し（Write-Back）のような一連の実行段階で実行されるが、それぞれが複数のパイプラインを備え得る。パイプ段階は、命令実行段階の全部、あるいは部分を実行する記憶要素と論理からなる。命令はパイプラインを通じて連続して流れる。実行段階は、命令によって指定される算術演算、論理演算、あるいは、メモリアクセス動作を行う、そして、特に数値についてさまざまな算術演算を行なうことができる。
【０００３】
デジタルプロセッサは、固定小数点か浮動小数点のいずれかのフォーマットで数値を表す。浮動小数点の数は、基数２の整数指数の累乗（the base 2 raised to an integer exponent）によって乗算される固定小数点の仮数部（significand）（マンチッサ（mantissa）としても知られる）を備える。ＩＥＥＥ７５４標準のような、いくつかのフォーマットでは、引用によりここに取り込まれるように、浮動小数点表示は符号ビットを追加的に含む。２の整数指数の累乗（raised to an integer exponent）によって仮数部を乗算することは、基数１０システムの科学的記数法に対して２進数アナログ化することである。つまり、指数の値は、実際の数値を実現するために、仮数部の２進小数点がシフトされるべき、ビット位置の数および方向を決定する。それ故に、浮動小数点という用語が使われる。
【０００４】
仮数部が、１＜＝仮数部＜２の範囲にあり、指数がその定義される範囲にある場合、浮動小数点の値は、“正規化”数とみなされる。正規化浮動小数点数の仮数部は、このように１．小数部（ 1.fraction）の形式からなる。ここで、“小数部（fraction）”とは、１以上の仮数部の小数部分（fractional  portion）を示す２進数値である。指数の値は、２進数小数点を左（負の指数に対して）または右（正の指数に対して）にシフトする。ＩＥＥＥ７５４標準においては、単精度の浮動小数点数に対する指数の値は、−１２６から１２７までの範囲となる。ＩＥＥＥ７５４単精度フォーマットの数字を符号化する場合には、符号化された指数のすべてが正になるように、１２７のバイアスが未加工の指数に加えられる。
【０００５】
任意の指数を持つ、１より小さい仮数部、つまり、０＜仮数部＜１で示される浮動小数点値は、ここにおいて、“アンノーマル（unnormal）”数と呼ばれる。特別に関心のあるアンノーマル浮動小数点数の部分集合が非正規化（“denormal”）数（サブノーマル（subnormal）数としても知られている。）である。非正規化浮動小数点数（denormal floating-point number）は、０＜仮数部＜１の範囲にある仮数部と、指数−１２６を利用することによって、１．０×２−１２６よりも小さな値を表す。非正規化浮動小数点数は、ゼロから小数部−１の幅までの範囲を持つ小数部において、その数の頭のゼロがある（With the number of leading zeros in the fraction ranging from zero to the width of the fraction-1.）、０．小数部（0.fraction）の形式の仮数部を持つ。数値を正確に表すビットがより少なくなるような、精度の損失を犠牲にして、非正規化数は１２６ビット位置を超える２進数小数点の“左シフト”を達成するために、正規化仮数部の小数部分のビット位置を有効に利用する。非正規化数は、ゼロに非常に近い値を表す、そして、結果が非常に小さい場合に計算がゆっくりと精度を失うことを許容する、緩やかなアンダーフローの実現のために使用され得る。
【０００６】
浮動小数点乗算器回路の場合には、非正規化積（denormal product）はいくつかの方法で発生する。乗数または被乗数のいずれかが、非正規化数であるかもしれない。この場合には、中間積（intermediate product）の仮数部は一般にアンノーマル（つまり、１より小）になるが、オペランドの数値によっては、最終的に丸め（round）が行われた積（product）は、正規化数または非正規化数になる可能性がある。乗数と被乗数の両方が非正規化数である場合には、最終的に丸めが行われた積は、ゼロとなるか、あるいは、最小の表現可能な非正規化数となる。
【０００７】
さらに、指数が小さく、（単精度について）−１２６以下の指数を必要とする正規化数を生じる場合には、２つの正規化数の積は非正規化数になる可能性がある。この場合には、乗算の中間値が“正規ではない（non-normal）”形式  と仮定する通常の状況とは異なることは注意すべきである。正規化仮数部は、範囲［１，２）、つまり、正確に１からほぼ２まで（仮に５ビットの仮数部について１．００００から  １．１１１１）の値を仮定している可能性がある。２つの正規化仮数部の積は、範囲［１，４）、つまり、正確に１からほぼ４までの値を仮定している可能性がある。この中間積の仮数部は、１．小数部、または、１ｘ．小数部の形式を仮定している可能性がある。後者に関しては、２からほぼ４まで（１０．００００から１１．１１１１）の値に対して仮定している。浮動小数点乗算の型どおりの事として、２進数小数点を左方へシフトし、指数を１だけ増加することによって、浮動小数点乗算器はこの中間結果を調整する。そのような“正規ではない（non-normal）”中間結果は、ここにおいて非正規化数であると考えられていないし、本開示によって明示的に扱われない。
【０００８】
いくつかの組み込まれたプロセッサのような、一般的なプロセッサの用途では、非正規化数は必ずしもサポートされる必要はない。たとえば、非正規化値は、精度の大幅な損失なしに、単にゼロとして表わされる可能性がある。しかしながら、Ｊａｖａ（登録商標）プログラミング言語は、非正規化数に対するサポートを明示している。したがって、サポートを行うプロセッサは、少なくともＪａｖａ実行モードの間には、非正規化浮動小数点数に適応するように、Ｊａｖａコードの実行を指令する。
【０００９】
非正規化浮動小数点数は、ソフトウェアルーティンにおいて、非正規化数の検知と非正規化数の処理に関する例外を生成することによって、ソフトウェアでサポートされ得る。このプロセスは遅く、程度の大きいオーバーヘッドを引き起こす。それは、システムパフォーマンスを減少し、パワー消費を増加する。
【００１０】
非正規化数は、各浮動小数点計算用の要素に、非正規化検知と正規化回路を加えることによってハードウェアでサポートされ得る。たとえば、仮数部を正規化位置（つまり、１．小数部）へ移動すること、および、（単精度の場合に対して）−１２６より小さな指数値（非標準）を許容することによって、非正規化数は“正規化され（normalized）”得る。同様に、（単精度の場合に対して）指数が−１２６になるように、仮数部を非正規化位置（つまり、０．小数部）へシフトすることによって、その結果は“非正規化され”得る。しかしながら、そのような追加的回路は、シリコンエリアを増加させ、レイテンシ（latency）を増やし、スループットの遅れを招き、最小サイクル時間を潜在的に増加し、それ故に最大動作周波数を減少する。さらに、非正規化数は滅多に出会うことはなく、通常ケースを犠牲にした稀なケースに対する性能の最適化は、全体的なプロセッサの性能を低下させる。
【発明の開示】
【発明の概要】
【００１１】
浮動小数点加算器は、加数を整列し、その合計を正規化し、丸めを行う回路を含む。一つ以上の実施形態によれば、非正規化サポートモードにおいて、浮動小数点加算器の正規化回路は、浮動小数点乗算器からの結果を正規化するか、あるいは非正規化するために利用される。各乗算命令は、強制的にゼロにされる加数を持つ乗算−加算（乗算−累算としても知られる）命令で推論的に置き換えられる。これは、乗算器の出力が、その値を変えずに、しかし、その積の正規化や非正規化を行なうために加算器の正規化回路を利用するように、加算器回路を通る指示を行う。中間積がアンノーマルではない、または、最終積（final product）が非正規化数ではないことが決定されるならば、加算部分の処理は、たとえば、オペランド・フォワーディング（operand forwarding）によって抑制され（suppress）得る。多くの場合、乗算命令オペランドの指数の処理により、この決定は乗算実行の初期に行うことが可能である。  
一つの実施形態は、アンノーマル中間仮数部または非正規化最終積を計算する浮動小数点乗算命令の実行方法に関係する。浮動小数点乗算命令は、浮動小数点乗算処理と浮動小数点加算処理を行なうように動作する浮動小数点乗算−加算命令に変換される。そして、浮動小数点加算処理の１つの加数は強制的にゼロにされる。
【００１２】
もう一つの実施形態はプロセッサに関係する。プロセッサは、正規化回路を有し、浮動小数点乗算−累算ユニットを含んでいる、一つ以上の命令実行パイプラインを含む。さらに、プロセッサは、浮動小数点加算器の正規化回路を使用する浮動小数点乗算器によって、アンノーマル中間仮数部または非正規化浮動小数点積の出力の正規化または非正規化を行なうように動作するパイプライン制御器を含む。
【詳細な説明】
【００１３】
図１はプロセッサ１０の機能ブロック図を示す。プロセッサ１０は、制御論理１４に従って命令実行パイプライン１２内で命令を実行する。制御論理１４は、さまざまな処理モードを定義するステータスレジスタ１５のような一つ以上のレジスタを含む。パイプライン１２は、１２ａと１２ｂのような多重並行パイプラインを持つスーパースカラー設計であり得る。パイプライン１２ａと１２ｂのそれぞれは、パイプ段階内に構成されるさまざまなレジスタやラッチ１６、そして、一つ以上の論理演算ユニット（Arithmetic Logic Unit）（ＡＬＵ）１８を含む。パイプ段階レジスタまたはラッチ１６およびＡＬＵ１８は、汎用レジスタ（General Purpose Register）ファイル２８のレジスタからオペランドを読み取ることができ、および／または、そのレジスタに結果を書き込むことができる。
【００１４】
パイプライン１２ａと１２ｂは、インストラクション・サイド・トランスレーション・ルックアサイド・バッファ（Instruction-side Translation Lookaside Buffer）（ＩＴＬＢ）２２によって管理されるメモリーアドレッシングと許可（permission）により、命令キャッシュ（ＩキャッシュつまりＩ＄）２０から命令のフェッチを行う。主トランスレーション・ルックアサイド・バッファ（Translation Lookaside Buffer）（ＴＬＢ）２６によって管理されるメモリーアドレッシングと許可により、データキャッシュ（ＤキャッシュつまりＤ＄）２４からデータはアクセスされる。さまざまな実施形態では、ＩＴＬＢ２２は、ＴＬＢ２６の一部のコピーを含む可能性がある。あるいは、ＩＴＬＢ２２  とＴＬＢ２６は統合され得る。同様に、プロセッサ１０のさまざまな実施形態では、Ｉキャッシュ２０とＤキャッシュ２４は統合され得るし、一体化され得る。Ｉキャッシュ２０および／またはＤキャッシュ２４におけるミスは、メモリーインターフェース３４の制御下で、主（オフチップの）メモリー３６へのアクセスを引き起こす原因となる。
【００１５】
プロセッサ１０は、さまざまな周辺装置４０，４２へのアクセスを制御する入力／出力（Ｉ／Ｏ）インターフェース３８を含む可能性がある。当業者はプロセッサ１０の多数の変形が可能であることを認識するだろう。たとえば、プロセッサ１０は、ＩキャッシュかＤキャッシュのいずれか、あるいは、両方に対する第２レベル（Ｌ２）キャッシュを含む可能性がある。さらに、プロセッサ１０において描かれた一つ以上の機能ブロックは、特定の実施形態から省略される可能性がある。
【００１６】
一つ以上の実施形態では、プロセッサ１０は、たとえば、ステータスレジスタ１５における非正規化サポートビットにより示される非正規化サポートモードで動作する。特に、非正規化サポートモードは、プロセッサ１０がＪａｖａコードを直接実行する場合にはいつでも入り込む可能性があり、また、プログラマーが非正規化浮動小数点の数をサポートすることを選択するような別の場合に入り込む可能性がある。
【００１７】
非正規化サポートモードでは、プロセッサ１０は、加数がゼロの状態で、各浮動小数点乗算命令を乗算−加算（multiply-add）（あるいは、乗算−累算（multiply-accumulate））命令へ推論的に変換する。乗算−加算処理は融合されたタイプまたは融合されていないタイプからなる可能性がある。融合された乗算−加算処理の場合には、中間積の全幅（入力の２倍幅）は、中間の丸めなく、加算器に送られる。融合されていない乗算−加算処理の場合には、乗算処理の中間積は、加算処理が行なわれる以前に（しばしば入力精度に）丸めが行われる。
【００１８】
ある実施形態では、各浮動小数点乗算命令は、強制的にゼロにされた加数を持つ融合された乗算−加算命令に推論的に置き換えられる。この命令の流れの変更は、一般に、デコード段階のような関連するパイプライン１２ａ、１２ｂの初期、あるいは、いずれにしても実行段階の前に実行される。正規化プロセッサ処理によって、融合された乗算−加算の実行段階では、図２で示されるように、浮動小数点乗算器の出力は、浮動小数点加算器の入力へ導かれるであろう。融合された乗算−加算命令をサポートする浮動小数点加算器は、浮動小数点乗算器から中間積を受け取るために十分な入力幅を持つ。
【００１９】
図２は、浮動小数点乗算器５０の出力が浮動小数点加算器５２の入力に導かれること示す機能ブロック図である。浮動小数点加算器５２は、浮動小数点加数を整列するための整列回路５４、浮動小数点の合計を計算するための加算回路５６、その合計を正規化（あるいは非正規化）するための正規化回路５８、シフトされた合計に丸めを行うための丸め回路６０を含む。乗算器５０への乗数（ＭＲ）と被乗数（ＭＤ）の入力、そして、浮動小数点加算器５２への加数の入力は、ＧＰＲファイル２８に格納されるような登録値（registered value）となり得る。被加算数３７は、正規化サポートモードで浮動小数点加算器５２を利用するために、浮動小数点加算器５２に多重化する。
【００２０】
浮動小数点乗算器５０の出力値を保存するために、数字の正規化を行ったり、あるいは、非正規化を行う一方で、浮動小数点加算処理の加数は強制的にゼロにされる。これは多くの方法で実現される可能性がある。たとえば、図２に示されるように、ゼロ値は、整列回路５４に多重化される可能性がある。あるいは、正規化実行の一部として浮動小数点乗算−加算命令によって検索（retrieve）されるために、そのゼロ値はＧＰＲレジスタ２９に格納される可能性がある。さらなる例としては、ＧＰＲレジスタ２９の出力は、非正規化サポートモードビットを含む制御論理でゲート制御され、レジスタ値をゲートオフし、非正規化サポートモードでゼロを示す可能性がある。いずれの場合でも、ゼロ値は、１つの加数として浮動小数点加算器５２に適用され、浮動小数点乗算器５０の２倍幅出力は他方の加数として適用される。加算回路５６におけるゼロへの加算は、数値を変更しない。それから、その数値は、正規化回路５８で正規化／非正規化され、丸め回路６０で丸めが行われる。この方式では、プロセッサ１０は、浮動小数点乗算器５０のアンノーマル出力と非正規化最終結果を適合するために、浮動小数点加算器５２の中の既存のハードウェアを利用する。
【００２１】
命令セットの構造が融合されていない乗算−加算処理のみをサポートするような他の実施形態では、各浮動小数点乗算命令は、融合されていない乗算−加算命令で推論的に置き換えられる。この場合には、中間の完全幅積は、丸めなしに加算器の正規化論理５８に送られるはずである。これはいろいろな仕方で実現され得る。たとえば、マルチプレクサ５７に示されるように、その積は加算回路５６をバイパスして、正規化論理５８へ直接、送られる可能性がある。図には示されていないが、浮動小数点加算器５２は、中間レジスタを持つパイプラインユニットとして実現され得る。そのようなケースでは、正規化論理に送られるデータは、整合させるためにパイプラインにすることも可能である。あるいは、浮動小数点加算器入力論理は、完全幅の中間積を受け取るために修正される可能性がある。いずれの場合も、加算回路５６と正規化回路（normalizer）５８は、そのデータに対してすでに十分な幅となっている。同様に、融合されていない乗算−加算処理の場合には、頭のゼロのカウント（leading zero count）は、中間積の上部半分（upper half）で行なわれるはずである。このカウントは、制御のための正規化論理と指数生成のための指数論理へ送られるはずである（示されていない）。
【００２２】
一般的に、乗数（ＭＲ）と被乗数（ＭＤ）の値は、実行段階のように、パイプラインの深さが増してはじめて、知らされることとなる。ＭＲとＭＤの値が知らされるとすぐに、それらすべては、両方が正規化値であるかどうかを決定するために検査され、浮動小数点乗算器から正規化された仮数部を生成することとなる。平行して、最終結果が正規化状態にあるかどうかを決定するために、指数値に基づいて処理が実行される可能性がある。浮動小数点乗算器５０の出力が正規化形式であり、最終結果が正規化浮動小数点数であるならば、加算処理は抑制される可能性がある。この場合には、浮動小数点乗算器５０の出力は、通路６２によって図２に示されるように、オペランド・フォワーディングによって浮動小数点加算器５２をバイパスする可能性がある。これにより、その結果に依存して後続の命令は、加算器を通過するまで待たずに、このデータを消費することが可能になる。結果がほとんど非正規化でないようなケースでは、結果が非正規化であるのかどうかを早期に決定することは困難である。これらのケースでは、最終積が非正規である場合には、非正規化されるように、加算処理が行われるであろう。
【００２３】
乗算−加算命令の浮動小数点乗算処理は、中間積として非正規化数またはアンノーマル数を同様に生成する可能性がある。非正規化サポートモードでは、融合されていない乗算−加算命令は、乗算処理の積にゼロ値を加算するために変更される。そして、加算命令は、元の乗算−加算命令の加数と共に、乗算−加算命令の後で命令ストリームに挿入される。つまり、浮動小数点乗算処理の完全幅積は、元の加数で加算処理を実行する前にゼロに加算される。乗算−加算命令に変換される乗算命令について上記で議論が行われたように、浮動小数点加算器は、より幅の広い中間積を受け取るために修正されるべきであり、あるいは、この積は正規化回路に導かれるはずである。同様に、頭のゼロのカウントは、正規化回路を制御するために使用される積の有効ビット（significant bit）に対して維持されるはずである。このように、乗算−加算命令の加算処理は、別々の浮動小数点加算命令を通じて加算処理を実行する以前に、その値を変えることなく、積の任意の正規化、あるいは非正規化を行なうために使用される。融合された乗算−加算命令を実現する論理は、後続の加算命令を挿入する必要はなく、アンノーマルあるいは非正規化中間積を取り扱うことが可能である。
【００２４】
図２に示されるように、浮動小数点乗算器５０の出力は、浮動小数点加算器５２の１つの入力に導かれる。そして、浮動小数点加算器５２への他の入力では、ゼロが強制される。加算回路５６は、前述のように、中間積の値を変えない、それは、正規化回路５８で正規化／非正規化され、丸め回路６０で丸められる。それから、正規化された（あるいは非正規化された）数は、通路６４に示されるように、浮動小数点加算器５２の１つの入力に送られる。ＧＰＲレジスタ２９に格納された元の乗算−加算命令の加数は、浮動小数点加算器５２の他の入力に導かれる。そして、浮動小数点加算命令が実行される。このように、浮動小数点乗算器５０の出力は、元の融合されていない乗算−加算命令の加算処理を行なう前に、浮動小数点加算器５２の回路を利用して正規化／非正規化される。
【００２５】
ここで、また、加算命令の命令ストリームへの挿入、およびゼロの加数を代入するための乗算−加算命令の変更は、一般に、デコード段階のような、パイプラインの初期に行なわれる。実行段階のように、乗数（ＭＲ）と被乗数（ＭＤ）の値が知らされると、それらは検査される可能性がある。そして、乗算処理が中間アンノーマル出力をおそらく生成し得るかどうか、あるいは、最終結果が非正規化であるかどうかを決定するために、指数は処理される可能性がある。そうでない場合には、乗算−加算命令の変更は、ゼロの加数に対して元の加数を代入することによって、逆にされるか、あるいは、“元に戻される（undone）”可能性がある。さらに、挿入された浮動小数点加算命令は、従来のパイプライン最適化により除去され得るＮＯＰ（オペレーションなし（no operation））へ変換される可能性がある。
【００２６】
図３は、非正規化サポートモードにおいて浮動小数点乗算命令を処理する際のプロセッサ１０の動作を示す。命令はフェッチされ（命令キャッシュ２０からのように）、デコードされる（ブロック７０）。プロセッサが非正規化サポートモード（ブロック７２）で動作していない場合には、従来のパイプライン処理により命令を処理する（ブロック８６）。プロセッサが非正規化サポートモード（ブロック７２）である場合には、デコードされた命令は、それが浮動小数点乗算命令（ブロック７４）であるかどうかを決定するために検査される。そうでなければ、命令は従来どおりに実行される（ブロック８６）。
【００２７】
命令が浮動小数点乗算命令である場合には、プロセッサ１０は浮動小数点乗算命令の代わりに、ゼロの加数を持つ浮動小数点乗算−加算命令を用いる（ブロック７６）。浮動小数点乗算処理に対するオペランドが利用可能な場合には、浮動小数点乗算処理が正規化出力の生成が保証されるかどうかを決定するために、それらは検査される。浮動小数点乗算処理がアンノーマル中間出力を生成するか、あるいは、最終結果が非正規（denormal）となる可能性がある場合には（ブロック８０）、代用された乗算−加算命令は、従来のパイプライン処理によって処理が行われ（ブロック８６）、上記の説明のように、浮動小数点加算器５２の正規化回路５８を使用して中間積を正規化するか、あるいは、非正規化する。融合された乗算−加算命令の場合には、それ以上の制御は必要とされない。融合されていない乗算−加算命令の場合には、加算回路５６は中間積を取り扱うのに十分な幅であるが、浮動小数点加算器５２は加算器にビットを適切に送るために修正される必要がある。あるいは、中間積は、図２に示されるように、浮動小数点加算器５２の正規化回路５８に、調停する状態要素（intervening state elements）を潜在的に含めて、直接送られる。
【００２８】
浮動小数点乗算処理が正規化中間と最終結果を生成すると決定される場合（ブロック８０）、“ゼロへの加算”処理は、たとえばオペランド・フォワーディングによって抑制される可能性がある（ブロック８２）。これは、“ゼロへの加算”処理を実行するという性能ペナルティー（performance penalty）を回避する。その場合には、浮動小数点乗算器５０の出力の正規化／非正規化は必要でなくなる。
【００２９】
図４は、非正規化サポートモードの浮動小数点乗算−加算命令を処理する際のプロセッサ１０の処理を示す。命令はフェッチされ（命令キャッシュ２０からのように）、デコードされる（ブロック９０）。プロセッサが非正規化サポートモードで動作していない場合（ブロック９２）、従来のパイプライン処理による命令が処理される（ブロック１０６）。プロセッサが非正規化サポートモードにある場合（ブロック９２）には、デコードされた命令は、融合されていない浮動小数点乗算−加算命令であるかどうかを決定するために検査される（ブロック９４）。命令が浮動小数点乗算−加算命令でないか、あるいは、融合された乗算−加算命令である場合には、命令は従来のやり方で実行される（ブロック１０６）。
【００３０】
命令が融合されていない浮動小数点乗算−加算命令である場合（ブロック９４）には、浮動小数点加算処理を実行する前に、プロセッサは、浮動小数点乗算処理の中間積を正規化／非正規化する。最初に、値ゼロが、浮動小数点乗算−加算命令における加数に代入される（ブロック９６）。それから、元の加数を持つ浮動小数点加算命令は、修正された浮動小数点乗算−加算命令に続く命令ストリームに挿入される（ブロック９８）。
【００３１】
実行段階のように、浮動小数点乗算処理のオペランドが利用可能である場合、浮動小数点乗算処理が正規化中間と最終結果の生成を保証するかどうかを決定するために、それらは検査される。浮動小数点乗算処理がノンノーマル中間体や非正規化最終結果を生成する可能性がある場合（ブロック１００）には、修正された乗算−加算命令と追加の加算命令は、従来のパイプライン処理によって処理され（ブロック１０６）、上記で説明したように、浮動小数点加算処理を行なう前に、浮動小数点加算器５２の正規化回路６８を使用して積の正規化／非正規化を行う。
【００３２】
浮動小数点乗算処理が正規化中間体と最終積を生成すると決定される場合（ブロック１００）には、積の正規化は抑制される。元の加数は、浮動小数点乗算−加算命令におけるゼロの代わりに使用される（ブロック１０２）。そして、追加の浮動小数点加算処理は、浮動小数点加算命令をＮＯＰに変換することによって抑制される（ブロック１０４）。それから、命令の処理は、従来のパイプライン処理によって継続する（ブロック８６）。
【００３３】
一つ以上の実施形態によれば、浮動小数点乗算処理の中間のアンノーマル出力と非正規化最終結果は、浮動小数点加算器５２の正規化回路５８を利用して正規化／非正規化が行われる。これは、レイテンシ（latency）や遅れを加え、シリコンエリアを拡大し、パワー消費を増加する、浮動小数点乗算器５０の出力へ正規化回路を加える必要性を取り除く。
【００３４】
本発明は、特別の性質、態様、実施形態に関してここで説明されたが、多数の変形、修正、他の実施形態が、本発明の幅広い範囲にわたり可能であること、従って、すべての変形、修正、実施形態は、開示の範囲内であるとみなされることは明らかである。したがって、本実施形態は、例示されるようなすべての態様において解釈されるべきであり、制限されるべきではない。添付された請求項の意味と同等の範囲内で発生するすべての変更は、そこにおいて包含されることを意図するものである。
【図面の簡単な説明】
【００３５】
【図１】プロセッサの機能ブロック図。
【図２】浮動小数点乗算器によって供給される浮動小数点加算器の機能ブロック図。
【図３】浮動小数点乗算の命令を実行する方法の流れ図。
【図４】浮動小数点乗算−加算命令を実行する方法の流れ図。
【図１】
2009536771.tif 000003
【図２】
2009536771.tif 000004
【図３】
2009536771.tif 000005
【図４】
2009536771.tif 000006
【国際調査報告】
2009536771.tif 000007
2009536771.tif 000008
2009536771.tif 000009