(57)【特許請求の範囲】
【請求項１】
プロセッサが実行すべき命令をフェッチする命令フェッチ部と、
前記命令フェッチ部によりフェッチされた命令が予測対象の命令であった場合に、該予測対象命令の実行結果として得られる値を予測する値予測部と、
前記値予測部から送出された信号に基づいて、前記値予測部により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群の中の前記予測対象命令の後に分岐命令を動的に挿入する分岐命令挿入部と、
フェッチされた命令を保持するとともに前記値予測部により予測された値を用いて、前記予測対象命令に後続する命令を、前記予測対象命令の実行結果を待つことなく演算部に対して投機的に発行する命令発行部と、
命令発行部により発行された命令を実行する演算部と、
分岐命令の分岐先を予測するとともに、該分岐予測の検証を実行する分岐予測制御部と、
前記演算部により実行された命令群中の各命令をコミットするとともに、予測値と実行結果が不一致である場合に、投機的に実行された命令を無効化するとともに再実行するコミット部とを具備し、
前記分岐制御部は、前記値予測部により予測された予測値と、前記演算部により実行された前記予測対象命令の実行結果とを前記挿入された分岐命令で比較することにより、値予測の検証を実行し、前記予測値と前記実行結果とが不一致である場合に、前記コミット部に予測値と実行結果が不一致であることを示す信号を送出する
ことを特徴とする命令の投機的実行制御装置。
【請求項２】
上記命令の投機的実行制御装置は、さらに、
前記値予測部により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群中の命令が使用するレジスタをリネームするレジスタリネーム部を具備し、
前記分岐命令挿入部は、前記レジスタリネーム部によりリネームされた後の前記命令群の中の前記予測対象命令の後に分岐命令を動的に挿入する
ことを特徴とする請求項１に記載の命令の投機的実行制御装置。
【請求項３】
上記命令の投機的実行制御装置は、さらに、
前記命令発行部から発行され、かつ未だ前記コミット部によりコミットされていない命令を、フェッチされた順序に並び替えるリオーダ部を具備する
ことを特徴とする請求項１または２のいずれか記載の命令の投機的実行制御装置。
【請求項４】
前記分岐命令挿入部は、
前記命令群に挿入される分岐命令の分岐先を、前記予測対象命令の次の命令とする
ことを特徴とする請求項１乃至３のいずれか記載の命令の投機的実行制御装置。
【請求項５】
前記分岐命令挿入部は、
前記命令群に挿入される分岐命令の分岐先を、前記予測対象命令自体とする
ことを特徴とする請求項１乃至３のいずれか記載の命令の投機的実行制御装置。
【請求項６】
前記値予測部は、
前記予測対象命令が、予測値と実行結果が不一致であるために再度実行された場合には、前記予測対象命令の実行結果の値の予測を実行しない
ことを特徴とする請求項５に記載の命令の投機的実行制御装置。
【請求項７】
前記値予測部は、
前記予測対象命令が、予測値と実行結果が不一致であるために再度実行された場合には、前記予測対象命令について先の実行結果の値を予測値とする
ことを特徴とする請求項５に記載の命令の投機的実行制御装置。
【請求項８】
前記分岐命令挿入部は、
前記命令群に挿入される分岐命令を、前記予測対象命令の直後、または該予測対象命令と依存を持つ命令の直前とする
ことを特徴とする請求項１乃至７のいずれか記載の命令の投機的実行制御装置。
【請求項９】
前記値予測部は、
前記命令フェッチ部によりフェッチされた命令が予測対象のロード命令であった場合に、該ロード命令がロードする値を予測する
ことを特徴とする請求項１乃至８のいずれか記載の命令の投機的実行制御装置。
【請求項１０】
プロセッサが実行すべき命令をフェッチするステップと、
フェッチされた命令が予測対象の命令であった場合に、該命令の実行結果として得られる値を値予測機構を用いて予測するステップと、
前記値予測機構から送出された信号に基づいて、前記値予測機構により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群の中の前記予測対象命令の後に分岐命令を動的に挿入するステップと、
フェッチされた命令を保持するとともに前記値予測機構により予測された値を用いて、前記予測対象命令に後続する命令を、前記予測対象命令の実行結果を待つことなく演算部に対して投機的に発行するステップと、
命令発行部により発行された命令を演算器により実行するステップと、
前記値予測機構により予測された予測値と、前記演算器により実行された前記予測対象命令の実行結果とを前記挿入された分岐命令で比較することにより、値予測の検証を実行するステップと、
前記演算器により実行された命令群中の各命令をコミットするとともに、前記予測値と前記実行結果とが不一致である場合に、投機的に実行された命令を無効化するとともに再実行するステップとを含む
ことを特徴とする命令の投機的実行制御方法。
【請求項１１】
上記命令の投機的実行制御方法は、さらに、
前記値予測機構により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群中の命令が使用するレジスタをリネームするレジスタリネームステップを含み、
前記分岐命令挿入ステップは、前記レジスタリネームステップによりリネームされた後の前記命令群の中の前記予測対象命令の後に分岐命令を動的に挿入することを特徴とする請求項１０に記載の命令の投機的実行制御方法。
【請求項１２】
上記命令の投機的実行制御方法は、さらに、
発行され、かつ未だコミットされていない命令を、フェッチされた順序に並び替えるリオーダステップを含む
ことを特徴とする請求項１０または１１のいずれか記載の命令の投機的実行制御方法。
【請求項１３】
前記分岐命令挿入ステップでは、
前記命令群に挿入される分岐命令の分岐先を、前記予測対象命令の次の命令とする
ことを特徴とする請求項１０乃至１２のいずれか記載の命令の投機的実行制御方法。
【請求項１４】
前記分岐命令挿入ステップでは、
前記命令群に挿入される分岐命令の分岐先を、前記予測対象命令自体とする
ことを特徴とする請求項１０乃至１２のいずれか記載の命令の投機的実行制御方法。
【請求項１５】
前記値予測ステップでは、
前記予測対象命令が、予測値と実行結果が不一致であるために再度実行された場合には、前記予測対象命令の実行結果の値の予測を実行しない
ことを特徴とする請求項１４に記載の命令の投機的実行制御方法。
【請求項１６】
前記値予測ステップでは、
前記予測対象命令が、予測値と実行結果が不一致であるために再度実行された場合には、前記予測対象命令について先の実行結果の値を予測値とする
ことを特徴とする請求項１４に記載の命令の投機的実行制御方法。
【請求項１７】
前記分岐命令挿入ステップでは、
前記命令群に挿入される分岐命令を、前記予測対象命令の直後、または該予測対象命令と依存を持つ命令の直前とする
ことを特徴とする請求項１０乃至１６のいずれか記載の命令の投機的実行制御方法。
【請求項１８】
前記値予測ステップでは、
前記フェッチされた命令が予測対象のロード命令であった場合に、該ロード命令がロードする値を予測する
ことを特徴とする請求項１０乃至１７のいずれか記載の命令の投機的実行制御方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、命令の投機的実行制御装置およびその方法に関する。特に、処理の高速化を図るべく計算機命令を投機的に実行するための予測機構を備えるプロセッサにおいて、命令の投機的実行のための値予測の検証制御および予測ミスが生じた際のリカバリー制御を、簡易なハードウエア構成で容易に実現するための技術に関する。
【０００２】
【従来の技術】
計算機の高速化、すなわちプロセッサの高速化を図る手法として、命令の投機的実行がある。この投機的実行とは、計算機が備える予測機構による何らかの予測に従って、命令を投機的に実行するものであり、すでに様々な手法が提案されている。一般的に、この投機的実行は、パイプライン化されたプロセッサにおいて用いられる。
【０００３】
この投機的実行の第１の例として、分岐予測、すなわち分岐命令の分岐先命令がどの命令となるかの予測が挙げられる。この分岐予測においては、分岐命令の実行の結果決定される、プロセッサが次に実行すべき（すなわちフェッチすべき）命令が何かが予測され、分岐命令の実行を待つことなく次の命令がフェッチされる。
【０００４】
分岐予測を行わない場合、プロセッサは分岐命令をフェッチしてからこの分岐命令の実行結果が得られるまで、次の命令をフェッチすることができない。したがって、パイプライン化されたプロセッサにおいて、分岐命令と、この分岐命令に後続する命令との間に、バブル、すなわち、処理が行われないサイクルが生じる。このバブルの発生はプロセッサの処理速度低下の要因となる。
【０００５】
一方、分岐予測を行う場合、分岐命令の実行を待つことなく次の命令がフェッチされるので、分岐予測が正しければ、バブルが低減され、プロセッサの処理が高速化される。ただし、分岐予測を行う場合で、分岐予測が誤っていた場合（すなわち、予測ミス）、投機的にフェッチした命令は本来実行されるべき命令ではないため、これらの命令を無効化し、正しい命令をフェッチし直す必要がある。予測ミス時に、これらの命令無効化および正しい命令の再実行に要する時間（サイクル）を、予測ミス・ペナルティーと称する。
【０００６】
この予測ミス・ペナルティーによるオーバーヘッド（プロセッサの処理速度低下）は、しばしば分岐予測を行わなかった場合のオーバーヘッドを上回ることがある。なぜなら、投機的に実行された命令を無効化する際に、よけいなサイクルが必要になることがあるからである。近年のプロセッサは、分岐予測の精度を向上することで、この予測ミスのオーバーヘッドを低減し、処理の高速化を目指している。
【０００７】
投機的実行の第２の例として、ロード値予測、すなわちロード命令によりプロセッサにロードされるデータ値であるロード値の予測が挙げられる。プロセッサの高速化における問題点の一つとして、算術演算や論理演算を行う命令と比較して、データアクセスを行う命令、例えばロード命令やストア命令の遅延時間が大きいという点がある。近年、算術演算や論理演算の処理時間の短縮化が進んだのに対し、メモリー内のデータアクセスに費やされる処理時間の短縮は依然遅れており、両者の差はますます広がっている。なお、ここでいうメモリーとは、プロセッサの外部にあるメインメモリーであってもよく、キャッシュメモリー（または単にキャッシュと称される）を備えるプロセッサにおいては、キャッシュであってもよい。
【０００８】
例えば、ロード命令の結果ロードされるデータを用いる算術演算命令がプログラム中にあると仮定すると、この算術演算命令はこのロード命令と依存を持つので、ロード命令の結果ロードされる値が得られるまで演算を実行することができない。このため、ロード命令の実行に要する時間が長いほど、このロード命令に依存を持つ命令の実行が遅れ、結果としてプロセッサの処理速度が低下される。
【０００９】
ロード値予測においては、ロード命令がロードするデータ値を予測して、このロード命令に後続する命令は、この予測されたデータ値が用いられる（ａ．ロー値予測）。予測されたデータ値を用いることで、ロード命令を実行している間に、このロード命令に依存を持つ後続命令を投機的に実行することができる（ｂ．後続命令の投機的実行）。
【００１０】
ロード値予測が正しかった場合、すなわち予測されたロード値と実際のロード命令の実行結果が等しい場合には、ロード命令が完了した時点で投機的に実行された後続命令も完了することができる。したがって、ロード値予測を実行しない場合と比較して、投機的に実行された後続命令の実行に要するサイクルの分、プロセッサの処理は高速化される。他方、分岐予測などの他の予測機構と同様に、ロード値予測が誤っていた場合には、投機的に実行された後続命令を無効化し、その命令を再実行する必要があるため、予測ミス・ペナルティーが生ずる（ｃ．予測検証、ｄ．命令の無効化・再実行）。
【００１１】
なお、ロード値予測を実行する予測アルゴリズムには、様々なアルゴリズムが提案されている。ロード命令がメモリーからロードする値は、プログラムの実行時にしか判らないので、プログラムのコンパイル時にロードされる値を予測すること、すなわち静的な予測は困難である。このため、もっぱらプログラムの実行時のデータを使用してロード値が予測される（動的な予測）。このロード値予測は、一般に同じロード命令、すなわちプログラム内の同じアドレスにあるロード命令は、統計的に同じ値をロードする確率が高いという知見に基づくものである。すなわち、同じロード命令は、過去にロードした値を再度ロードする確率が高いので、高い確率で正しい予測値を得ることができる。
【００１２】
次に、従来のロード値予測を実行するためのプロセッサの構成の一例を説明する。
【００１３】
図１は、このロード値の予測機構を備えるプロセッサの構成の一例を示す。
【００１４】
メインメモリ１２は、プロセッサ１１の外部にあるメモリーであり、命令（プログラム）とデータはともにメインメモリーに記憶されている。
【００１５】
命令フェッチ部（ＩＦＵ：Ｉｎｓｔｒｕｃｔｉｏｎ  Ｆｅｔｃｈ  Ｕｎｉｔ）１１１は、その内部にプログラムカウンタ（ＰＣ：Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）１１１ｂを備え、プログラムカウンタ１１１ｂの値の指すメインメモリ１２のアドレスからプロセッサ１１に命令（Ｄ１１）をフェッチしてくる（命令フェッチ）。フェッチされた命令は、命令ウインドバッファ（ＩＷＢ：Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｉｎｄｏｗ  Ｂｕｆｆｅｒ）１１２に一時的に保持される。
【００１６】
命令ウインドバッファ１１２は、複数の命令を保持することができる。命令ウインドバッファ１１２は、命令を適切な演算部１１４ａ、１１４ｂ、またはロード・ストア部１１３に発行する。
【００１７】
ロード・ストア部（ＬＳＵ：Ｌｏａｄ  Ｓｔｏｒｅ  Ｕｎｉｔ）１１３、演算部（ＥＸ：Ｅｘｅｃｕｔｉｏｎ  Ｕｎｉｔ）１１４ａ、１１４ｂはそれぞれ演算を実行するユニットである。
【００１８】
ロード・ストア部１１３は、ロード命令またはストア命令を実行する。演算部１１４ａ、１１４ｂは、ロード命令およびストア命令以外の演算処理を行なう。例えば、整数演算、論理演算、剰余演算、浮動小数点演算などを行うが、これらには限定されない。
【００１９】
レジスタファイル（ＲＦ：Ｒｅｇｉｓｔｅｒ  Ｆｉｌｅ）１１７は、プロセッサが備えるレジスタ群である。レジスタファイル１１７は、ロードストア部１１３、演算部１１４ａ、１１４ｂに対して、それぞれ必要なオペランド（演算値）を送出し、また、これらによる演算結果を内部のレジスタに書き込む。
【００２０】
コミット部（ＣＭＴ：Ｃｏｍｍｉｔ  Ｕｎｉｔ）１１８は、比較器１２０から入力される比較結果に基づいて、演算結果がいつレジスタ（または、ストア命令の場合はメモリー）に書き込まれるかを制御する（Ｄ１４）。プログラムの実行結果は、プログラム上の実行順序に従ってレジスタまたはメモリーに書き込まれる必要がある。なぜなら、メモリーの同じアドレスに値が書き込まれる際に、書き込まれる順序によって結果が変わってしまうからである。また、最終的な結果は同じであったとしても、例外が発生した時に、プログラムの実行順序に従った中間結果を得る必要が生ずるからである。
【００２１】
ロード値予測機構（ＬＰＵ：Ｌｏａｄ  Ｐｒｅｄｉｃｔｉｏｎ  Ｕｎｉｔ）１１６は、ロード命令によりロードされる値を予測して、この予測値（Ｄ１２）を値予測バッファ１１９およびレジスタファイル１１７に送出する。このロード値予測アルゴリズムには、様々なアルゴリズムが提案されているが、本発明は特定のロード値予測アルゴリズムを前提とするものではなく、ロード値予測アルゴリズムとは関係なく適用できるものであるため、ここでは特に言及しない。なお、ロード値予測アルゴリズムの一例を挙げるとすると、ロード命令のアドレス（プログラムカウンタの値）に対して、そのロード命令がロードした値を記憶しておき、次のそのロード命令がフェッチされたときには、前回ロードされ、記憶された値を予測値として用いる手法がある。
【００２２】
値予測バッファ（ＶＰＢ：Ｖａｌｕｅ  Ｐｒｅｄｉｃｔｉｏｎ  Ｂｕｆｆｅｒ）１１９は、ロード値予測機構１１６から入力されるロード予測値を記憶するバッファである。この値予測バッファ１１９に記憶された予測値は、後に実際にロード命令の実行によりロードされた値（Ｄ１３）との、比較器１２０による比較に用いられる。
【００２３】
比較器（Ｃｏｍｐａｒａｔｏｒ）１２０は、ロード値予測機構１１６が予測したロード予測値と、実際にロード命令がロードした値とを比較する。
【００２４】
次に、図１のプロセッサにおける、命令実行およびロード値予測の動作を説明する。
【００２５】
（１）ロード値予測を行わない場合の動作
１．命令フェッチ部１１１は、プログラムカウンタ１１１ｂに従って、メインメモリ１２から命令をフェッチする。
【００２６】
２．フェッチされた命令は、命令ウインドバッファ１１２に一時的に保持される。
【００２７】
３．命令ウインドバッファ１１２は、発行可能な命令を、その命令を実行するのに適切なロード・ストア部１１３または演算部１１４ａ、１１４ｂに発行する。
【００２８】
４．レジスタファイル１１７は、命令実行に必要なオペランドをロード・ストア部１１３または演算部１１４ａ、１１４ｂに発行する。
【００２９】
５．ロード・ストア部１１３または演算部１１４ａ、１１４ｂは、命令を実行する。すなわち、命令がロード命令の場合、ロード・ストア部１１３は、メインメモリー１２からデータをロードする。命令がストア命令の場合、ロード・ストア部１１３は、データをメインメモリー１２に書き込む準備をする。それ以外の命令の場合、演算部１１４ａ、１１４ｂは演算を実行する。
【００３０】
６．コミット部１１８は、レジスタファイル１１７またはメインメモリ１２の書込のタイミングを制御する。すなわち、命令がロード命令の場合、ロードされたデータをレジスタファイル１１７のレジスタに書き込む。命令がストア命令の場合、データをメインメモリー１２に書き込む。命令が分岐命令の場合、分岐命令の結果に従って命令フェッチ部１１１内のプログラムカウンタ１１１ｂを更新する。それ以外の命令の場合、演算結果をレジスタファイル１１７のレジスタに書き込む。
【００３１】
なお、ここでは、プロセッサのサイクル毎に上記１．から６．の各処理が実行されるものと仮定する。また、サイクル毎に処理を実行するプロセッサは、一般にパイプライン化されているものが多い。
【００３２】
（２）ロード値予測を行う場合の動作
１．命令フェッチ部１１１は、プログラムカウンタ１１１ｂに従って、メインメモリ１２から命令をフェッチする。
【００３３】
２．ロード値予測機構１１６は、フェッチされた命令が、予測の対象となるロード命令であるか否かを判断し、予測対象のロード命令であれば、ロード予測値を、そのロード命令の結果が書き込まれるレジスタに書き込む。
【００３４】
３．フェッチされた命令は、いったん命令ウインドバッファ１１２に保持される。
【００３５】
４．命令ウインドバッファ１１２は、ロード命令をロード・ストア部１１３に発行する。
【００３６】
５．レジスタファイル１１７は、ロード命令実行に必要なオペランドを、ロード・ストア部１１３に供給する。
【００３７】
６．命令ウインドバッファ１１２は、ロード命令に後続する命令を発行する。
【００３８】
７．比較器１２０は、ロード命令の結果が得られたら、そのロード命令の実行により得られたロード値と、予測値とを比較する。
【００３９】
８．比較器１２０により、予測の検証結果が得られたら、
・予測が正しい場合は、ロード命令と、投機的に実行された後続命令はコミット可能となり、コミット部１１８は、適切なタイミングでこれらの命令の実行結果をレジスタまたはメインメモリ１２に書き込み、命令をコミット（完了）する。
【００４０】
・他方、予測が誤りであった場合は、ロード命令はその実行結果が書き込まれるべきレジスタにロード値を書き込み、コミット（完了）されるが、後続する命令はすべて無効化され、再度その命令がフェッチされて実行される。
【００４１】
なお、上記の、命令を無効化してフェッチからやり直す処理を、フラッシュと称する。また、予測が誤りであった場合に必要となる処理を、リカバリーと称する。
【００４２】
図２は、このロード値予測が誤りであった場合に必要となるリカバリー処理を示すフローチャートである。
【００４３】
ここで、具体的な命令列として、図３の命令群が与えられたと仮定する。なお、図３中において、Ｓ１，Ｓ２，Ｓ３、Ｓ１０はそれぞれレジスタ名（レジスタ番号）を示す。
【００４４】
まず、命令フェッチ部１１１は、ｌｗ（ロードワード），ａｄｄｉ，ａｄｄの順序で命令をフェッチし（ステップＳ２１）、同じ順序で命令ウインドバッファ１１２は命令を保持する。ここで、フェッチされたｌｗ命令が予測対象であった場合（ステップＳ２２Ｙ）、ロード値予測機構１１６は、そのロード予測値をレジスタＳ１（命令中のＳ１に対応するレジスタファイル１１７中のレジスタ）に書き込む（ステップＳ２３）。
【００４５】
命令ウインドバッファ１１２は、命令が発行可能かどうかを判断する。ここで、発行可能、とは、必要なオペランドが利用可能であり、かつ、命令の発行先の演算ユニットが利用可能、すなわち他の命令が使用していない状態をいう。なお、ここでは、命令ウインドバッファ１１２は、イン・オーダー（Ｉｎ−Ｏｒｄｅｒ）発行のメカニズムを採用しているものとする。このイン・オーダー発行とは、命令をフェッチされた順序で発行することをいう。このため、ここでは命令ウィンドバッファ１１２は、命令ウインドバッファ１１２内に保持された命令のうち、最も早くフェッチされた命令が発行可能となったときに、その命令を発行する。発行された命令は、命令ウインドバッファ１１２から削除される。この命令ウインドバッファ１１２内の命令のうち、最も早くフェッチされた命令は、常に命令ウインドバッファ１１２の先頭に位置するように制御されるものとする。
【００４６】
図３の例では、ｌｗ命令が命令ウインドバッファ１１２の先頭にあり、レジスタＳ１０中の値が利用可能であって、かつロード・ストア部１１３が利用可能であれば、ｌｗ命令はロード・ストア部１１３に発行される（ステップＳ２４）。ロード・ストア部１１３は、メインメモリ１２からロードすべき値をロードする。
【００４７】
ロード・ストア部１１３がロード命令を実行している間に、ロード命令の後続命令であるａｄｄｉ命令が演算部１１４ａ、または１１４ｂに発行される。このａｄｄｉ命令は、ロード予測値をレジスタＳ１の値として用いることができるため、ロード命令の実行結果を待つ必要がないためである。同様に、さらに後続するａｄｄ命令も演算部１１４ａ、または１１４ｂに発行される。なお、仮にここでロード値予測が行われない場合には、後続するａｄｄｉ命令，ａｄｄ命令はともに、ｌｗ命令の実行結果が得られるまで命令ウインドバッファ１１２から演算部１１４ａ、または１１４ｂには発行されない。
【００４８】
ロード・ストア部１１３がロード命令の実行結果のロード値を取得すると（ステップＳ２５Ｙ）、比較器１２０は、値予測バッファ１１９内に保持された先に予測されたロード値と、実際にロード命令の実行結果であるロード値とを比較し、比較結果をコミット部１１８に通知する（ステップＳ２７）。
【００４９】
両者が一致した場合、すなわちロード値予測が正しかった場合（ステップＳ２７Ｙ）、ロード命令はコミットされ（完了し）（ステップＳ２８）、後続するａｄｄｉ命令，ａｄｄ命令もそれぞれ演算結果が得られ次第コミットされ（完了し）（ステップＳ２９）、その演算結果がレジスタファイルＳ２，Ｓ３に書き込まれる。
【００５０】
一方、両者が一致しなかった場合、すなわちロード値予測が誤っていた場合（ステップＳ２７Ｎ）、レジスタファイル１１７中のＳ１に対応するレジスタには、実際にロード命令の実行によりロードされた値が上書きされ、ロード命令がコミットされる（ステップＳ３０）とともに、ロード命令に後続するａｄｄｉ命令，ａｄｄ命令は無効化される（ステップＳ３１）。命令フェッチ部１１１は、ａｄｄｉ命令から再びフェッチを開始する（ステップＳ３２）。
【００５１】
【非特許文献１】
Ｍｉｋｋｏ  Ｈ．Ｌｉｐａｓｔｉ、他１名”Ｅｘｃｅｅｄｉｎｇ  ｔｈｅ  Ｄａｔａｆｌｏｗ  Ｌｉｍｉｔ  ｖｉａ  Ｖａｌｕｅ  Ｐｒｅｄｉｃｔｉｏｎ”ＩＥＥＥ，１０７２−４４５１／９６，１９９６，ｐ．２２６−２３７
【００５２】
【発明が解決しようとする課題】
しかしながら、従来のロード値などの命令予測には、以下の解決すべき問題点があった。
【００５３】
第１に、予測検証および予測ミス時のリカバリ動作の制御のために、ハードウエアコストが増加してしまう。すなわち、ロード値予測においては、実際にロード命令の実行によりロードされた値が得られてから、予測された値が正しいか否かを検証し、もし値予測が誤りであった場合には、再度正しい値を用いて、投機的に実行された後続命令を再実行する必要がある。このリカバリー動作のため、図１に示す値予測バッファ１１９や比較器１２０などの専用ハードウエアが必要となる。
【００５４】
図１および図２で説明されたようなイン・オーダー発行のプロセッサであれば、ロード値予測機構１１６がロード命令の値を予測する順序と、ロード・ストア部１１３がロード命令を実行する順序が一致しているため、値予測バッファ１１９は、ファースト・イン・ファースト・アウト（ＦＩＦＯ：Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）の構造を持つバッファであれば足りる。しかし、アウト・オブ・オーダー発行のプロセッサの場合には、ロード値予測機構１１６がロード命令の値を予測する順序と、ロード・ストア部１１３がロード命令を実行する順序が異なるため、この値予測バッファは、例えば連想記憶装置（ＣＡＭ：Ｃｏｎｔｅｎｔ−Ａｄｄｒｅｓｓａｂｌｅ  Ｍｅｍｏｒｙ）の構造など、より複雑な構造のハードウエアを採用せざるを得ない。
【００５５】
第２に、予測検証および予測ミス時のリカバリー動作を実現するために、予測ミスが生じたか否かの判断や、予測ミス時にどの命令から再実行すべきか、など専用の制御すべき項目が必要となってしまう。専用の制御すべき項目が増加すれば、制御機構が複雑化し、この制御機構の実装や検証作業がより困難となってしまう。特に、リカバリー処理は、多くの機能ブロックに影響するため、設計上のクリティカルパスとなる傾向が強く、リカバリー処理を実行する制御機構が複雑化すれば、それだけプロセッサのタイミング制約を満たす妨げとなる。
【００５６】
本発明は、上記の技術的課題を解決するためになされたものであって、その目的とするところは、処理の高速化を図るべく命令を投機的に実行するための予測機構を備えるプロセッサにおいて、予測の検証制御および予測ミスが生じた際のリカバリー制御を、簡易なハードウエア構成で容易に実現することのできる、命令の投機的実行制御装置およびその方法を提供することにある。
【００５７】
【課題を解決するための手段】
本発明においては、例えばロード命令などの値予測における予測の検証および予測ミスが生じた際のフラッシュ（命令の無効化）およびリカバリー（命令の再実行）の制御を、既存の分岐予測の機構を利用して実現する。
【００５８】
本発明のある特徴によれば、プロセッサが実行すべき命令をフェッチする命令フェッチ部と、前記命令フェッチ部によりフェッチされた命令が予測対象の命令であった場合に、該予測対象命令の実行結果の値を予測する値予測部と、前記値予測部から送出された信号に基づいて、前記値予測部により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群の中の前記予測対象命令の後に分岐命令を動的に挿入する分岐命令挿入部と、フェッチされた命令を保持するとともに前記値予測部により予測された値を用いて、前記予測対象命令に後続する命令を、前記予測対象命令の実行結果を待つことなく演算部に対して投機的に発行する命令発行部と、命令発行部により発行された命令を実行する演算部と、分岐命令の分岐先を予測するとともに、該分岐予測の検証を実行する分岐予測制御部と、前記演算部により実行された命令群中の各命令をコミットするとともに、予測値と実行結果が不一致である場合に、投機的に実行された命令を無効化するとともに再実行するコミット部とを具備し、前記分岐制御部は、前記値予測部により予測された予測値と、前記演算部により実行された前記予測対象命令の実行結果とを前記挿入された分岐命令で比較することにより、値予測の検証を実行し、前記予測値と前記実行結果とが不一致である場合に、前記コミット部に予測値と実行結果が不一致であることを示す信号を送出することを特徴とする命令の投機的実行制御装置が提供される。
【００５９】
本発明の他の特徴によれば、プロセッサが実行すべき命令をフェッチするステップと、フェッチされた命令が予測対象の命令であった場合に、該命令の実行結果の値を値予測機構を用いて予測するステップと、前記値予測機構から送出された信号に基づいて、前記値予測機構により値が予測される予測対象命令および該予測対象命令に後続する命令からなる命令群の中の前記予測対象命令の後に分岐命令を動的に挿入するステップと、フェッチされた命令を保持するとともに前記値予測機構により予測された値を用いて、前記予測対象命令に後続する命令を、前記予測対象命令の実行結果を待つことなく演算部に対して投機的に発行するステップと、命令発行部により発行された命令を演算器により実行するステップと、前記値予測機構により予測された予測値と、前記演算器により実行された前記予測対象命令の実行結果とを前記挿入された分岐命令で比較することにより、値予測の検証を実行するステップと、前記演算器により実行された命令群中の各命令をコミットするとともに、前記予測値と前記実行結果とが不一致である場合に、投機的に実行された命令を無効化するとともに再実行するステップとを含むことを特徴とする命令の投機的実行制御方法が提供される。
【００６０】
【発明の実施の形態】
以下、図４乃至図１８を参照して、本発明の第１の実施形態に係る命令の投機的実行制御装置およびその方法を詳細に説明する。
【００６１】
＜第１の実施形態＞
第１の実施形態は、既存のレジスタ・リネーミング機構（後述する）および分岐予測機構を利用して、命令の投機的実行における予測検証および予測ミス時のフラッシュ、リカバリーのための制御機構を実現する。なお、第１の実施形態においては、命令のアウト・オブ・オーダー発行可能であり、レジスタ・リネーミング機構を備え、分岐予測機構を備え、かつロード命令の値を予測する機構を備えたプロセッサを例として説明するが、第１の実施形態はこの構成に限定されるものではない。
【００６２】
図４は、本発明の第１の実施形態に係る命令の投機的実行制御機構を備えたプロセッサの構成の一例を示す。
【００６３】
図４に示すように、第１の実施形態に係る命令の投機的実行制御機構を備えたプロセッサは、命令フェッチ部１１と、プログラム・カウンタ１１ｂと、命令ウインドバッファ１２と、ロード・ストア部１３と、演算部１４ａ，１４ｂと、ロード値予測機構１６と、レジスタファイル１７と、コミット部１８と、リオーダ・バッファ１８ａと、レジスタ・リネーム部１９と、アーキテクチャ・レジスタ・マップ２０と、分岐挿入部２１と、分岐予測機構２３とを具備する。
【００６４】
メインメモリ２は、プロセッサ１の外部にあるメモリーであり、命令（プログラム）とデータはともにメインメモリーに記憶されている。
【００６５】
命令フェッチ部（ＩＦＵ：Ｉｎｓｔｒｕｃｔｉｏｎ  Ｆｅｔｃｈ  Ｕｎｉｔ）１１は、その内部にプログラムカウンタ（ＰＣ：Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）１１ｂを備え、プログラムカウンタ１１ｂの値の指すメインメモリ２のアドレスからプロセッサ１に命令（Ｄ１）をフェッチしてくる（命令フェッチ）。フェッチされた命令は、命令ウインドバッファ（ＩＷＢ：Ｉｎｓｔｒｕｃｔｉｏｎ
Ｗｉｎｄｏｗ  Ｂｕｆｆｅｒ）１２に一時的に保持される。
【００６６】
命令ウインドバッファ１２は、複数の命令を一時的に保持する。命令ウインドバッファ１２は、命令を適切なロード・ストア部１３，演算部１４ａ、１４ｂに発行する。第１の実施形態においては、この命令ウインドバッファ１２は、命令を動的にスケジューリングして発行するアウト・オブ・オーダー発行型の構造を備えたものとするが、これに限定されるものではない。第１の実施形態における命令ウインドバッファ１２の行う命令発行のメカニズムは、発行可能となればフェッチされた順番と異なる順に命令が発行される点を除き、従来におけるイン・オーダー発行型の命令ウインドバッファと同様である。
【００６７】
アウト・オブ・オーダー発行とは、命令の実行順序がプログラム上の順序（フェッチされた順序）と異なる場合でも、最終的な結果が同じであるときに、最終的な実行の終了が速くなるように命令実行順序を並び替えて、この並び替えられた（スケジュールされた）命令を演算ユニットに発行する手法である。例えば、命令ウインドバッファ１２中の先頭にある命令が発行可能ではなく、その次にフェッチされた命令が発行可能であり、かつ両者の命令間に依存関係がない場合、アウト・オブ・オーダー型の命令ウインドバッファ１２は、この発行可能な命令を先に発行する。
【００６８】
ロード・ストア部（ＬＳＵ：Ｌｏａｄ  Ｓｔｏｒｅ  Ｕｎｉｔ）１３、演算部（ＥＸ：Ｅｘｅｃｕｔｉｏｎ  Ｕｎｉｔ）１４ａ、１４ｂはそれぞれ演算を実行するユニットである。これらの演算ユニット（演算ブロック）の種類や個数はプロセッサにより様々なバリエーションがあり、図４に示されるものに限定されないことは言うまでもない。第１の実施形態においては、ロード命令に関連するロード・ストア部１３以外の演算ブロックは任意のものを採用することができる。
【００６９】
ロード・ストア部１３は、ロード命令またはストア命令を実行し、プロセッサ１とメインメモリ２との間でデータの送受信を行う。演算部１４ａ、１４ｂは、ロード命令およびストア命令以外の演算処理を行なう。例えば、整数演算、論理演算、剰余演算、浮動小数点演算、分岐条件の判定などを行うが、これらには限定されない。
【００７０】
レジスタファイル（ＲＦ：Ｒｅｇｉｓｔｅｒ  Ｆｉｌｅ）１７は、プロセッサが参照する物理的なレジスタ群である。レジスタファイル１７は、ロードストア部１３、演算部１４ａ、１４ｂに対して、それぞれ必要なオペランド（演算値）を送出し、また、これらによる演算結果を内部のレジスタに書き込む。
【００７１】
コミット部（ＣＭＴ：Ｃｏｍｍｉｔ  Ｕｎｉｔ）１８は、演算結果がいつレジスタ（または、ストア命令の場合はメモリー）に書き込まれるかを制御する（Ｄ６）。プログラムの実行結果は、プログラム上の実行順序に従ってレジスタまたはメモリーに書き込まれる必要がある。なぜなら、メモリーの同じアドレスに値が書き込まれる際に、書き込まれる順序によって結果が変わってしまうからである。また、最終的な結果は同じであったとしても、例外が発生した時に、プログラムの実行順序に従った中間結果を得る必要が生ずるからである。
【００７２】
ロード値予測機構（ＬＰＵ：Ｌｏａｄ  Ｐｒｅｄｉｃｔｉｏｎ  Ｕｎｉｔ）１６は、ロード命令によりロードされる値を予測して、この予測値（Ｄ４）をレジスタファイル１７に送出する。このロード値予測アルゴリズムには、様々なアルゴリズムが提案されているが、本発明は特定のロード値予測アルゴリズムを前提とするものではなく、ロード値予測アルゴリズムとは関係なく適用できるものであるため、ここでは特に言及しない。なお、ロード値予測アルゴリズムの一例を挙げるとすると、ロード命令のアドレス（プログラムカウンタの値）に対して、そのロード命令がロードした値を記憶しておき、次のそのロード命令がフェッチされたときには、前回ロードされ、記憶された値を予測値として用いる手法がある。
【００７３】
リオーダ・バッファ１８ａは、アウト・オブ・オーダー実行された命令を、フェッチされた順序であるイン・オーダーに並べ直し、イン・オーダーの順序で終了させるための制御を実行する。このリオーダ・バッファ１８ａは、命令ウインドバッファ１２から発行されたがまだコミットされていない（完了していない）命令群を管理し、並べ替える。
【００７４】
レジスタ・リネーム部１９は、レジスタ・リネーミング（後述する）を実行する。
【００７５】
アーキテクチャ・レジスタ・マップ２０は、ソフトウエアが参照できるレジスタであるアーキテクチャ・レジスタと、物理的なレジスタとの対応表である。
【００７６】
分岐挿入部（ＢＩＵ：Ｂｒａｎｃｈ  Ｉｎｓｅｒｔ  Ｕｎｉｔ）２１は、ロード値予測機構１６と連動し、命令ウインドバッファ１２中の、ロード値が予測されるべきロード命令の直後に分岐命令を挿入する。
【００７７】
分岐予測機構（ＢＰＵ：Ｂｒａｎｃｈ  Ｐｒｅｄｉｃｔｉｏｎ  Ｕｎｉｔ）２３は、分岐予測、この分岐予測の検証および分岐予測が誤りであった場合（予測ミス）の処理（分岐ミス・リカバリー）を実行する。
【００７８】
次に、第１の実施形態におけるレジスタ・リネーミングについて説明する。
【００７９】
レジスタ・リネーミングは、命令実行の並列度を向上させる手法である。このレジスタ・リネーミング機構を備えるプロセッサは、ソフトウエアが参照できるレジスタであるアーキテクチャ・レジスタよりも多くの数の物理レジスタを備える。図４におけるレジスタ・リネーム部１９は、アーキテクチャ・レジスタを物理レジスタに割り当てる（マッピング）。この割当の状態は、アーキテクチャ・レジスタ・マップ２０に記憶されている。
【００８０】
レジスタ・リネーム部１９は、レジスタの割当を工夫することで、演算の中間結果を適切なレジスタに保持し、レジスタ番号に起因するハザードを減少させることができる。また、命令の投機的実行を行うプロセッサにおいては、投機実行した結果、すなわち正しくない値である可能性のある結果を、まずソフトウエアから参照できない物理レジスタに書き込み、その投機的実行の結果が正しいと判明したときに、さきに結果が書き込まれた物理レジスタを、ソフトウエアから参照できるアーキテクチャ・レジスタにマッピングする。このマッピングにより、ソフトウエアがアーキテクチャ・レジスタにアクセスすると、実際には当該アーキテクチャ・レジスタにマッピングされた物理レジスタにアクセスすることになる。
【００８１】
ソフトウエア（プログラム）からは、コミットされた（完了した）命令の正しい結果のみが参照される。このため、レジスタ・リネーミング機能の実現には、レジスタの割当を行うレジスタ・リネーム部１９だけでなく、命令の完了を制御するコミット部１８も関与する。さらに、アウト・オブ・オーダー実行型のプロセッサであれば、命令コミット（完了）の順序を管理するリオーダ・バッファ１８ａも関与する。
【００８２】
図５に示す命令列を例として、レジスタ・リネーミングを具体的に説明する。
【００８３】
図５において、Ｓ１，Ｓ２，Ｓ３，Ｓ４，Ｓ１０，Ｓ１１は、それぞれアーキテクチャ・レジスタである。
【００８４】
図５において、４行目のｌｗ命令（ロードワード命令）と５行目のａｄｄｉ命令は、１行目から３行目のｌｗ命令、ａｄｄｉ命令，ａｄｄ命令と同じレジスタＳ１を使用しているため、１行目から３行目の命令が完了するまで、４行目のｌｗ命令を実行することができない。しかし、１行目から３行目までの命令では、レジスタＳ１は中間値を保持するために用いられているに過ぎないため、他のレジスタが利用可能であれば、レジスタＳ１を他のレジスタで代替することができる。すなわち、４行目と５行目の命令は、本来、１行目から３行目の命令には依存していない。
【００８５】
図６は、図５に示した命令列を、第１の実施形態におけるレジスタ・リネーム機構を用いてリネームした命令列を示す。レジスタ・リネーミングによって変換された図６に示す命令列によれば、１行目から３行目の命令の完了を待つことなく、４行目以降の命令を発行することができる。
【００８６】
図６において、Ｒ１，Ｒ２，Ｒ３，Ｒ４，Ｒ１０，Ｒ１１，Ｒ４０は、それぞれ物理レジスタである。図６の命令列においては、図５における１行目から３行目の命令のＳ１レジスタをＲ４０レジスタに、図５における４行目から５行目の命令のＳ１レジスタをＲ１レジスタに、それぞれリネームしている。これにより、１行目から３行目の命令と、４行目から５行目の命令との依存関係が断ち切られている。図６における１行目から５行目の命令が完了した時点で、Ｓ１，Ｓ２，Ｓ３、Ｓ４，Ｓ１０，Ｓ１１レジスタが、それぞれＲ１，Ｒ２，Ｒ３，Ｒ４，Ｒ１０，Ｒ１１レジスタにマッピングされていれば、ソフトウエアは正しい値を参照することができる。
【００８７】
次に、第１の実施形態における分岐予測機構２３の構成および動作を説明する。
【００８８】
図７は、図４に示す分岐予測機構２３の内部構成を示すブロック図である。
【００８９】
図７に示すように、第１の実施形態に係る分岐予測機構２３は、分岐予測部２３１と、分岐予測バッファ２３２と、比較器２３３とを具備する。
【００９０】
分岐予測機構２３は、分岐を予測する部分と、分岐予測結果を検証する部分とを備える。
【００９１】
分岐予測部２３１は、実際に分岐を予測する部分に相当する。第１の実施形態は、分岐予測のアルゴリズムの如何に関係なく適用できるものであって、分岐アルゴリズムの如何は、本発明に直接関連しないため、本明細書では特に詳述しない。
【００９２】
図８は、図７の分岐予測機構２３における分岐予測の制御の一例を示すフローチャートである。
【００９３】
まず、命令フェッチ部１１は、プログラムカウンタ１１ｂをもとに命令をフェッチする（ステップＳ５１）。フェッチされた命令が分岐命令であれば（ステップＳ５２Ｙ）、分岐予測が実行され（ステップＳ５３）、一方、分岐命令でなければ（ステップＳ５２Ｎ）ステップＳ５１に戻る。
【００９４】
分岐予測部２３１が用いる分岐予測アルゴリズムには、例えば、分岐ターゲットバッファ（ＢＴＢ：Ｂｒａｎｃｈ  Ｔａｒｇｅｔ  Ｂｕｆｆｅｒ）がある。このＢＴＢは、分岐命令のプログラムカウンタ（ＰＣ）をタグとして持つキャッシュであり、分岐先のＰＣ（分岐ターゲット）とその分岐命令の履歴をそのキャッシュ内に保持する。フェッチされた分岐命令のプログラムカウンタがＢＴＢにヒットすると、そのヒットしたＢＴＢのエントリーにある履歴が参照される。この参照された履歴から、分岐命令の分岐が成立（Ｔａｋｅｎ）するか、不成立（Ｎｏｔ−Ｔａｋｅｎ）かが判断され、Ｔａｋｅｎの場合はヒットしたエントリーのターゲットの命令を次にフェッチする。Ｎｏｔ−Ｔａｋｅｎの場合は分岐命令の次のアドレスのプログラムカウンタから命令をフェッチする。
【００９５】
分岐予測バッファ２３２と、比較器２３３は、分岐予測を検証する部分に相当する。
【００９６】
分岐予測バッファ２３２は、分岐予測部２３１が予測した結果を一時的に保持する。分岐命令が発行され（ステップＳ５４）、実際に分岐命令を演算した結果が得られると（ステップＳ５５Ｙ）、分岐予測バッファに保持された分岐予測値が読み出される（ステップＳ５６）。比較器２３３は、実際の分岐結果（Ｄ２３３）と予測された結果とを比較する（ステップＳ５７）。この比較結果（Ｄ２３４）は、コミット部１８に通知される。
【００９７】
予測された分岐結果が正しい場合（ステップＳ５７Ｙ）、コミット部１８は、その分岐命令をコミット（完了）し（ステップＳ５８）、この分岐命令に後続する命令を、投機的に実行された命令も含め、通常通りコミットする（ステップＳ５９）。
【００９８】
他方、予測された分岐結果が誤りである場合（ステップＳ５７Ｎ）、その分岐命令はコミットされるが（ステップＳ６０）、この分岐命令に後続する全命令は無効化（フラッシュ）される（ステップＳ６１）。そして、本来の正しい命令のアドレス（すなわち、分岐が成立した場合にはそのターゲットアドレス、分岐が不成立ならその分岐命令の次の命令アドレス）が、命令フェッチ部１１内のプログラムカウンタ１１ｂに設定され、そこから命令のフェッチが再開される（ステップＳ６２）。
【００９９】
第１の実施形態においては、命令ウインドバッファ１２中の、ロード値が予測されるべきロード命令の後に、ハードウエアが分岐命令を挿入する。それに対応し、図７に示すように、分岐挿入部２１から、分岐予測バッファ２３２に、挿入された仮想の分岐命令の情報が追加される。具体的には、この仮想の分岐命令には、常に、分岐不成立（Ｎｏｔ−Ｔａｋｅｎ）と予測されたという情報が書き込まれる。
【０１００】
ロード値が予測されるべきロード命令がフェッチされるとハードウエアにより自動的に挿入されるこの仮想の分岐命令は、その後に「ロード値予測が正しいか否かを判断し、もし正しくなければ投機実行した命令を再実行する」ための分岐命令である。
【０１０１】
次に、第１の実施形態におけるロード値予測の制御機構の動作を説明する。以下では、ロード命令をフェッチした後のプロセッサ１の動作を時系列で説明する。
【０１０２】
図９は、第１の実施形態における、命令をフェッチしてからのロード値予測、命令の投機的実行、予測の検証および予測ミス時のリカバリーまでの一連の動作を説明するフローチャートである。
【０１０３】
図９に示すように、まず、命令フェッチ部１１は、命令をフェッチする（ステップＳ１）。ここで、フェッチされた命令が予測対象であった場合（ステップＳ２Ｙ）、レジスタ・リネーム部１９は、レジスタ・リネーミングを実行する（ステップＳ３）。ロード値予測機構１６は、そのロード予測値をレジスタファイルに書き込む（ステップＳ４）。
【０１０４】
分岐挿入部２１は、命令ウインドバッファ１２に、仮想の分岐命令を挿入し、分岐予測バッファ２３２にエントリーを追加する（ステップＳ５）。
【０１０５】
命令ウインドバッファ１２は、ロード命令をロード・ストア部１３に発行する（ステップＳ６）。ロード・ストア部１３は、メインメモリ２からロードすべき値をロードする。
【０１０６】
ロード・ストア部１３は、ロード命令の実行によるロード値の確定を待ち（ステップＳ７）、ロード命令の実行結果のロード値を取得すると（ステップＳ７Ｙ）、命令ウインドバッファ１２から、挿入された仮想の分岐命令が、演算部１４ａまたは１４ｂに発行される（ステップＳ８）。演算部１４ａまたは１４ｂは、分岐命令の実行結果の確定を待つ（ステップＳ９）。分岐命令の結果が取得されると（ステップＳ９Ｙ）、分岐予測機構２３は、分岐命令の予測結果を読み出し（ステップＳ１０）、読み出された分岐命令の予測結果と、分岐命令の実行により得られた結果とを比較し（ステップＳ１１）、比較結果をコミット部１８に通知する。
【０１０７】
両者が一致した場合、すなわち分岐予測が正しかった場合（ステップＳ１１Ｙ）、コミット部１８は、ロード命令および分岐命令をコミットし（完了し）（ステップＳ１２）、投機的に実行された後続する命令もコミットする（完了する）（ステップＳ１３）。
【０１０８】
一方、両者が一致しなかった場合、すなわち分岐予測が誤っていた場合（ステップＳ１１Ｎ）、コミット部１８は、ロード命令および分岐命令をコミットする（ステップＳ１４）とともに、ロード命令に後続する命令を無効化（フラッシュ）する（ステップＳ１５）。命令フェッチ部１１は、後続する命令から再びフェッチを開始する（ステップＳ１６）。
【０１０９】
なお、上記のレジスタ・リネーミングおよび分岐命令の挿入は、次のように実行される。
【０１１０】
予測されるロード命令の結果が書き込まれる物理レジスタと、この予測値が書き込まれる物理レジスタを別のレジスタとして割り当てる。ここでは、前者の物理レジスタをＲｍ、後者の物理レジスタをＲｎとする。
【０１１１】
命令ウインドバッファ１２内では、予測されたロード命令は、レジスタＲｍにロード結果を書き込む命令となるようにリネームされる。このロード命令の直後に、ＲｍとＲｎ中の値の一致を判断するための分岐命令が挿入される。また、このロード命令の結果を用いる後続命令は、命令ウインドバッファ１２内では、用いられるロード値としてレジスタＲｎの値を用いる命令となるようにリネームされている。
【０１１２】
図１０は、図３に示した命令列に対し、レジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す。
【０１１３】
図１０において、Ｒｍ、Ｒｎ、Ｒ２，Ｒ３，Ｒ１０はそれぞれ、物理レジスタである。Ｒｍには実際にロード命令を実行した結果が格納される。Ｒｎには、ロード値予測機構１６により予測されたロード値が格納されており、ロード命令の実行結果を用いる後続命令が、ロード命令の結果としてＲｎの値を用いるようにリネームされることにより、アウト・オブ・オーダー発行のメカニズムを用いて、ロード命令および挿入された分岐命令の実行結果を待つことなく投機的に発行される。
【０１１４】
図１０の分岐命令（ｂｎｅ命令）は、分岐挿入部２１によって挿入された仮想の分岐命令である。この分岐命令においては、実際のロードの結果（Ｒｍ）とロード予測値（Ｒｎ）とを比較し、両者の値が異なればラベルＬ１に分岐する。この分岐命令は、直前のロード命令の結果（Ｒｍ）に依存を持つため、命令ウインドバッファ１２の命令発行メカニズムを用いて、このロード命令の結果が利用可能になってから発行される。すなわち、図９におけるステップＳ７、Ｓ８は、命令ウインドバッファ１２のアウト・オブ・オーダー型の命令発行メカニズムによって実現される。
【０１１５】
図１０における分岐命令は、分岐の成立、不成立に拘わらず、結果的に同じアドレスに分岐する。しかし、分岐成立、すなわちロード値の予測と結果との不一致の場合は、分岐予測の予測不一致と同じ機構により、後続命令が無効化（フラッシュ）されるのに対し、分岐不成立、すなわちロード値の予測と結果との一致の場合は、分岐予測は一致したこととなるため、投機的に実行された後続命令がそのままコミットされる点が異なる。
【０１１６】
後続する命令を再実行する際には、レジスタＲｍにロード命令の結果がすでに得られているので、ロード命令の結果を用いる命令は、Ｒｍを使用するようにリネームすればよい。
【０１１７】
なお、第１の実施形態において用いるアウト・オブ・オーダー発行（動的スケジューリング）、レジスタ・リネーミング、分岐予測は、それぞれ、ロード値予測とは独立して、プロセッサの高速化手法として一般的に用いられている手法である。このため、第１の実施形態においては、ロード値などの命令の予測機構として、これらの機構に関連するハードウエアである、レジスタ・リネーム部１９，アウト・オブ・オーダー型の命令ウインドバッファ１２，リオーダ・バッファ１８ａ、分岐予測機構２３は、それぞれ既存のものを用いることができる。
【０１１８】
第１の実施形態において、新たに追加される分岐挿入部２１は、ロード値予測機構１６が予測するタイミングで、レジスタ・リネーム部１９のレジスタ・リネーミング処理に従って分岐命令を挿入するだけの単純な機能ユニットである。したがって、図１において説明した従来の値予測バッファ１１９および比較器１２０と比較すると、大幅なハードウエアコストの削減となる。
【０１１９】
また、第１の実施形態において、図９のステップＳ７，Ｓ８は、通常の命令ウインドバッファ１２のアウト・オブ・オーダー発行のメカニズムによって実現され、ステップＳ９からＳ１６は、分岐予測機構２３が提供する予測ミス時のリカバリーのメカニズムによって実現される。
【０１２０】
したがって、図２において説明した従来の制御フローチャートと比較すると、ステップＳ２４のロード命令の発行より後の専用の制御が省略されたものと等価であると考えることができる、すなわち、他の機構が提供する制御機構によって実現されることが理解される。
【０１２１】
またステップＳ２４のロード命令の発行処理より前のフローを比較しても、図９において増えている処理は、レジスタ・リネーミング処理と、分岐命令の挿入、分岐予測のエントリーの追加（ステップＳ３，Ｓ５）であるが、このレジスタ・リネーミング処理に関しては、ロード値予測とは独立した既存の機構を用いることができるので、実質的に増加した処理は、分岐命令の挿入と分岐予測のエントリーの追加のみとなる。
【０１２２】
したがって、第１の実施形態によれば、ロード値予測のリカバリー処理の制御が単純化されることが理解される。
【０１２３】
第１の実施形態によれば、以下の効果が得られる。
【０１２４】
すなわち、第１の実施形態は、上記のレジスタ・リネーム機構（レジスタ・リネーム部１９、アーキテクチャ・レジスタ・マップ２０）および分岐予測機構２３を用いて、容易にロード値の予測の制御機構を実現する。また、これらの既存のハードウエアを利用することにより、ロード値の予測制御機構ひいては予測機構のハードウエアコストを削減する。
【０１２５】
＜第２の実施形態＞
次に、図１１を参照して、本発明の第２の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第１の実施形態と異なる点についてのみ説明する。
【０１２６】
第２の実施形態は、第１の実施形態において説明した図４における分岐挿入部２１が行う分岐命令の分岐先を、「予測されるロード命令の直後の命令のアドレス」ではなく、「予測されるロード命令自身のアドレス」に変更した点において、第１の実施形態と相違する。
【０１２７】
第２の実施形態に係る命令の投機的実行の制御装置を備えるプロセッサの構成は、図４に示した第１の実施形態のプロセッサと同様であり、第２の実施形態に係る分岐予測の制御処理は、図８に示した第１の実施形態の場合と同様であるため、その説明は省略する。
【０１２８】
図１１は、図３に示した命令列に対し、第２の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す。
【０１２９】
図１１において、Ｒｍ、Ｒｎ、Ｒ２，Ｒ３、Ｒ１０はそれぞれ、物理レジスタである。Ｒｍには実際にロード命令を実行した結果が格納される。Ｒｎには、ロード値予測機構１６により予測されたロード値が格納されており、ロード命令の実行結果を用いる後続命令が、ロード命令の結果としてＲｎの値を用いるようにリネームされることにより、アウト・オブ・オーダー発行のメカニズムを用いて、ロード命令および挿入された分岐命令の実行結果を待つことなく投機的に発行される。
【０１３０】
図１１の分岐命令（ｂｎｅ命令）は、第１の実施形態に係る分岐挿入部２１によって挿入された仮想の分岐命令である。この分岐命令においては、実際のロードの結果（Ｒｍ）とロード予測値（Ｒｎ）とを比較し、両者の値が異なればラベルＬ１に分岐する。
【０１３１】
ロード値予測が誤っていた場合には（ロード値予測ミス）、図１１のロード命令（ｌｗ命令）および挿入された分岐命令（ｂｎｅ命令）はコミットされず（完了せず）、ロード命令（ｌｗ命令）から再フェッチされる。
【０１３２】
第２の実施形態においては、再実行される際のロード命令は、すでに直前に同じロード命令が実行されている。このため、キャッシュを備えたプロセッサであれば、ロードされる値はすでにキャッシュに記憶されており、少ない遅延時間でロード命令の正しい実行結果を得ることができる。なお、ロード命令の再実行では、ロード値の予測は実行されないため、分岐挿入部２１は、分岐命令を挿入しない。
【０１３３】
＜第３の実施形態＞
次に、本発明の第３の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第２の実施形態と異なる点についてのみ説明する。
【０１３４】
第３の実施形態は、第２の実施形態において説明したロード命令の再実行の際に、再びロード値予測処理および分岐予測処理を実行する点においてのみ、第２の実施形態と相違する。このため、図９におけるステップＳ３からステップＳ５における分岐命令の挿入処理および分岐予測の追加処理も再び実行される。
【０１３５】
第３の実施形態に係る命令の投機的実行の制御装置を備えるプロセッサの構成は、図４に示した第１の実施形態のプロセッサと同様であり、第２の実施形態に係る分岐予測の制御処理は、図８に示した第１の実施形態の場合と同様であるため、その説明は省略する。
【０１３６】
ロード値予測が再実行される際に、先にロード命令を実行した際の結果であるロード値を、再実行におけるロード予測値として用いることで、正しい予測を実行することができる。
【０１３７】
第３の実施形態によれば、最初のロード命令の実行の際と、再実行の際のいずれでもロード値予測が行われるため、予測をする場合としない場合についての制御が簡略化される。
【０１３８】
また、ロード命令の再実行の際にもロード値予測処理が実行されるので、ロード命令に依存を持つ後続命令を、第２の実施形態の場合より早く発行することができる。
【０１３９】
＜第４の実施形態＞
次に、図１２を参照して、本発明の第４の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第１の実施形態と異なる点についてのみ説明する。
【０１４０】
第４の実施形態は、第１の実施形態において説明した図４における分岐挿入部２１が行う分岐命令の挿入において、ロード命令の実行結果とその予測値が「一致した場合に分岐成立（Ｔａｋｅｎ）」、「不一致だった場合に分岐不成立（Ｎｏｔ−Ｔａｋｅｎ）」とする分岐命令を挿入する点において、第１の実施形態と相違する。
【０１４１】
分岐挿入部２１は、分岐予測バッファ２３２に追加する予測のエントリーに、「分岐成立（Ｔａｋｅｎ）と予測された」という情報を書き込む。
【０１４２】
第４の実施形態に係る命令の投機的実行の制御装置を備えるプロセッサの構成は、図４に示した第１の実施形態のプロセッサと同様であり、第４の実施形態に係る分岐予測の制御処理は、図８に示した第１の実施形態の場合と同様であるため、その説明は省略する。
【０１４３】
図１２は、図３に示した命令列に対し、第４の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す。
【０１４４】
図１２において、Ｒｍ、Ｒｎ、Ｒ２，Ｒ３、Ｒ１０はそれぞれ、物理レジスタである。Ｒｍには実際にロード命令を実行した結果が格納される。Ｒｎには、ロード値予測機構１６により予測されたロード値が格納されており、ロード命令の実行結果を用いる後続命令が、ロード命令の結果としてＲｎの値を用いるようにリネームされることにより、アウト・オブ・オーダー発行のメカニズムを用いて、ロード命令および挿入された分岐命令の実行結果を待つことなく投機的に発行される。
【０１４５】
第４の実施形態によれば、第１の実施形態と同様の動作が実現できる。図１２の分岐命令に従えば、予測ロード値とロード命令の実行結果とが不一致の場合、挿入された分岐命令は不成立となるが、この分岐命令の不成立は、分岐予測における「分岐成立（Ｔａｋｅｎ）」と矛盾するために、分岐ミス・リカバリーが発生するからである。
【０１４６】
＜第５の実施形態＞
次に、図１３および図１４を参照して、本発明の第５の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第１の実施形態と異なる点についてのみ説明する。
【０１４７】
第５の実施形態は、第１の実施形態において説明した図９のステップＳ１４からＳ１６におけるロード値予測ミスの際のリカバリー処理において、ロード値予測されたロード命令に依存関係を持つ最初の命令から再実行をする点において、第１の実施形態と相違する。
【０１４８】
第５の実施形態に係る命令の投機的実行の制御装置を備えるプロセッサの構成は、図４に示した第１の実施形態のプロセッサと同様であり、第５の実施形態に係る分岐予測の制御処理は、図８に示した第１の実施形態の場合と同様であるため、その説明は省略する。
【０１４９】
ロード値予測のリカバリー動作には、様々な手法がある。リカバリー動作は、投機的に実行された命令とその結果を無効化し、これらを再実行する動作である。このリカバリー動作において、投機的に実行されたのではない命令（非投機的命令）は本来無効化する必要はない。しかし、動作制御を単純化するために、非投機的命令の一部または全部も無効化され、再実行されることもある。
【０１５０】
このため、リカバリー動作時に、どの命令を無効化し、無効化された命令をプロセッサのどの段階から再実行するかによって、リカバリー動作には様々なバリエーションが生ずる。これらの動作バリエーションでは、いずれも、計算結果を正しい状態に保つという点では同じ効果を持つが、予測ミス時のペナルティーが異なる。一般に、複雑な動作をするリカバリーではペナルティーが少ない。すなわち、動作の複雑化とペナルティーの削減はトレードオフの関係にある。
【０１５１】
第１の実施形態においては、「予測されたロード命令に後続する命令のすべて」が無効化され、無効化された命令の「命令フェッチ」から再実行されるものである。この第１の実施形態におけるリカバリー動作は、比較的単純な制御で実現できる。一方、第５の実施形態は、予測ミスのペナルティーを減少させるために、リカバリー動作の制御をより複雑化した実施形態である。
【０１５２】
第５の実施形態においては、ロード値予測がミスした場合、ロード命令に後続する命令のうち、「このロード命令に依存を持つ最初の命令と、その後続命令」だけを無効化し、「このロード命令に依存を持つ最初の命令」から再びフェッチを開始する。このため、ロード値が予測されたロード命令と、このロード命令に依存を持つ命令の間に、このロード命令に依存しない命令が実行された場合、このロード命令に依存しない命令は無効化されない。
【０１５３】
具体的な命令列として、図１３の命令群が与えられたと仮定する。なお、図１３中において、Ｓ１，Ｓ２，Ｓ３、Ｓ４，Ｓ５，Ｓ６、Ｓ１０はそれぞれアーキテクチャ・レジスタ名（レジスタ番号）を示す。
【０１５４】
図１３の命令群においては、減算命令（ｓｕｂ命令）はロード命令（ｌｗ命令）に依存を持たない。
【０１５５】
図１４は、図１３に示した命令列に対し、第５の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す。
【０１５６】
図１４において、Ｒｍ、Ｒｎ、Ｒ２，Ｒ３、Ｒ４，Ｒ５，Ｒ６、Ｒ１０はそれぞれ、物理レジスタである。Ｒｍには実際にロード命令を実行した結果が格納される。Ｒｎには、ロード値予測機構１６により予測されたロード値が格納されており、ロード命令の実行結果を用いる後続命令が、ロード命令の結果としてＲｎの値を用いるようにリネームされることにより、アウト・オブ・オーダー発行のメカニズムを用いて、ロード命令および挿入された分岐命令の実行結果を待つことなく投機的に発行される。
【０１５７】
図１４に示す分岐命令の分岐先は、即値加算命令（ａｄｄｉ命令）であるので、ロード値予測が誤りであった場合（予測ミス）、挿入された分岐命令以降の命令のみが、分岐予測ミスのリカバリー動作によって無効化される。
【０１５８】
第５の実施形態においては、分岐挿入部２１は、「予測したロード命令に依存を持つ最初の命令」の直前に分岐命令を挿入する。
【０１５９】
第５の実施形態においては、この「予測したロード命令に依存を持つ最初の命令」を検出する機能が必要となる。このため、分岐挿入部２１は、レジスタ・リネーム部１９から、図１４においてはレジスタＲｎを使用する命令がフェッチされたことを通知されなければならならず、分岐挿入部２１が実行する制御は若干複雑化する。
【０１６０】
しかし、第５の実施形態によれば、ロード命令に依存を持たない命令の再実行を減らすことができるため、予測ミスにおけるペナルティーを減少させることができる。
【０１６１】
＜第６の実施形態＞
次に、図１５を参照して、本発明の第６の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第５の実施形態と異なる点についてのみ説明する。
【０１６２】
第５の実施形態が、説明した図９のステップＳ１４からＳ１６において、ロード値予測されたロード命令に依存を持つ最初の命令とその最初の命令に後続する命令を「命令フェッチ」から再実行するのに対し、第６の実施形態は、ロード値予測されたロード命令に依存を持つ最初の命令とその最初の命令に後続する命令の「命令発行」から再実行する。
【０１６３】
第６の実施形態においては、命令ウインドバッファ２１は、発行された命令を、その命令がコミットされる（完了する）まで保持し、予測ミスのリカバリー時には再発行可能にする必要があり、このような機能を実現する機構が必要となる。
【０１６４】
また、第５の実施形態においては、分岐予測機構２３中のリカバリー制御機構が、ロード値予測ミス時のリカバリーの制御機構と共通化されていた。しかし、第６の実施形態においては、本来の分岐予測ミスは「命令フェッチ」から再実行されるのに対し、ロード値予測ミスにおける仮想の分岐命令の予測ミスは「命令発行」から再実行されるため、分岐予測機構２３中のリカバリー制御機構の一部は、ロード値予測ミス時のリカバリーのために共通使用できなくなる。
【０１６５】
図１５は、第６の形態に係るロード値予測ミス時のリカバリー動作の制御を示すフローチャートである。
【０１６６】
図９に示す第１の実施形態のフローチャートと比較すると、分岐挿入部２１が実行する分岐命令の挿入処理（ステップＳ５）の前に、挿入箇所を判断するために、ロード命令に依存を持つ最初の命令がどれか、を判断するステップ（ステップＳ４ｂ）が追加されている（このステップＳ４ｂは、上記第５の実施形態においても必要となる）。さらに、分岐予測ミスが発生した場合、分岐挿入部２１が挿入した分岐命令の予測ミスの場合か、それ以外の予測ミスの場合かが判断される（ステップＳ１７）。分岐挿入部２１が挿入した分岐命令の予測ミスであった場合には（ステップＳ１７Ｙ）、リオーダ・バッファ１８ａ内の、分岐挿入部２１により挿入された分岐命令に後続する命令が無効化され（ステップ１８）、無効化された後続命令が再発行される（ステップＳ１９）。リオーダ・バッファ１８ａは、「発行済みであり、かつコミットされていない命令」を管理している。このため、再発行すべき命令は、リオーダ・バッファ１８ａ内では無効化され、同時に命令ウインドバッファ２１内で再び発行可能とすることで、適切に再発行される。
【０１６７】
一方、分岐挿入部２１が挿入した分岐命令以外の予測ミスであった場合には（ステップＳ１７Ｎ）、上記各実施形態と同様の、分岐予測ミスのリカバリー動作が実行される（ステップＳ１５，ステップＳ１６）。
【０１６８】
第６の実施形態によれば、第５の実施形態よりも予測ミス時の制御は複雑化するものの、さらに予測ミスペナルティーを減少させることができる。
【０１６９】
＜第７の実施形態＞
次に、本発明の第７の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第６の実施形態と異なる点についてのみ説明する。
【０１７０】
第６の実施形態が、説明した図１５のステップＳ１８およびＳ１９において、「予測したロード命令に依存を持つ最初の命令およびその後続命令」を命令発行から再実行するのに対し、第７の実施形態は、「すでに発行された命令のうち、予測したロード命令に依存を持つ全命令」を命令発行から再実行する。
【０１７１】
第７の実施形態においては、ロード値が予測されたロード命令に依存を持たない命令は再実行されない。
【０１７２】
第７の実施形態に係るリオーダ・バッファ１８ａは、ロード値予測ミスの際には、発行済みの命令のうち、そのロード命令に依存を持つ命令のみを選択し、無効化する。さらに、第７の実施形態に係る命令ウインドバッファ２１は、発行済みの命令のうち、ロード値予測ミスが生じたロード命令に依存を持つ命令のみを発行可能として、これらの命令の再発行を開始する。
【０１７３】
第７の実施形態によれば、第６の実施形態よりも予測ミス時の制御は複雑化するものの、ロード命令に依存を持つ命令のみを選択的に再実行するため、さらに予測ミスペナルティーを減少させることができる。
【０１７４】
＜第８の実施形態＞
次に、図１６および図１７を参照して、本発明の第８の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第１の実施形態と異なる点についてのみ説明する。
【０１７５】
第８の実施形態は、第１の実施形態において説明したロード値予測における予測制御およびリカバリー機能を、ロード命令に限定されない値予測に適用した点において、第１の実施形態と相違する。
【０１７６】
上記各実施形態において説明したロード値予測機構のリカバリー制御は、ロード値予測以外の予測機構のリカバリー制御にも適用することができる。すなわち、ロード値予測には限定されず、分岐命令によって予測が正しいか否かの検証が可能な予測機構（分岐予測以外の予測機構）であれば、上記各実施形態の予測機構のリカバリー制御を適用することができる。
【０１７７】
図１６は、従来における値予測機構を備えたプロセッサの構成の一例を示す。図１に示した従来のロード値予測機構を備えたプロセッサの構成と比較すると、図１におけるロード値予測機構１１６が、図１６においては値予測機構１１６ｂに置き換えられている。さらに、予測値と実際に命令を実行した値の比較の際に、図１においては、ロード・ストア部１１３から出力されるロード命令の結果のみが比較されるのに対し、図１６に示す値予測機構を備えたプロセッサにおいては、ロードストア部１１３，演算部１１４ａ、１１４ｂのすべての演算ユニットから出力される結果が、比較の対象となっている。
【０１７８】
図１７は、第８の実施形態に係る値予測機構を備えたプロセッサの構成の一例を示す。図４に示す第１の実施形態に係るロード値予測機構を備えたプロセッサの構成と比較して、図４におけるロード値予測機構１６が、値予測機構１６ｂに置き換えられている。
【０１７９】
図１７に示すように、図４に示した第１の実施形態に係るロード値予測機構を備えたプロセッサの構成においては、ロード命令のみの値予測を実行していたのに対し、第８の実施形態に係る値予測機構を備えたプロセッサは、任意の命令の値予測を実行する。第８の実施形態に係る分岐挿入部２１は、値予測機構１６ｂから予測対象の命令がフェッチされたことが通知されると、その予測された命令の後に分岐命令を挿入する。
【０１８０】
第８の実施形態によれば、ロード命令のみならず、任意の命令の値予測に基づく後続命令の投機的実行が可能となる。
【０１８１】
＜第９の実施形態＞
次に、図１８を参照して、本発明の第９の実施形態に係る計算機命令の投機的実行の制御装置およびその方法を、第１の実施形態と異なる点についてのみ説明する。
【０１８２】
第９の実施形態は、第１の実施形態において説明したロード値予測機構を備えた、アウト・オブ・オーダー型の命令発行を行うプロセッサを、イン・オーダー型の命令発行を行うプロセッサに置き換えた点において、第１の実施形態と相違する。
【０１８３】
図１８は、第９の実施形態に係るロード値予測機構を備えたプロセッサの構成の一例を示す。図４に示す第１の実施形態に係るロード値予測機構を備えたプロセッサの構成と比較して、図４におけるアウト・オブ・オーダー型の命令発行を行う命令ウインドバッファ１２が、図１８においては、イン・オーダー型の命令発行を行う命令ウインドバッファ１２ｂに置き換えられた点、および図４におけるリオーダ・バッファ１８ａが図１８おいては備えられていない点において、第９の実施形態に係るプロセッサの構成は、第１の実施形態に係るプロセッサの構成と相違する。
【０１８４】
イン・オーダー型の命令発行であっても、分岐挿入部２１が挿入した分岐命令に後続する命令が、予測されたロード命令の実行結果を待つことなく実行されるのであれば、値予測による命令の投機的実行によってプロセッサの処理が高速化される。すなわち、予測されたロード命令の実行結果が得られる前に、挿入された分岐命令が、命令ウインドバッファ１２ｂから発行されることで、後続する命令の投機的実行が可能となる。
【０１８５】
図１０に示す、第１の実施形態において得られる命令列を例とすると、１行目のロード命令の結果が得られる前に、２行目の分岐命令が発行されるのであれば、後続するａｄｄｉ命令，ａｄｄ命令はともに、ロード命令の実行結果を待たずに発行される（実行される）ことができる。
【０１８６】
イン・オーダー型の命令発行であっても、予測されたロード命令の実行結果が得られる前に、挿入された分岐命令が発行される場合が考えられる。
【０１８７】
例えば、ロード命令の実行結果が分岐命令の実行ユニットにバイパスされるシステムの場合、ロード命令の結果が確定する前に分岐命令を発行しても、分岐命令の実行時には必要な値、すなわちロードの結果が必要な演算ユニット、すなわち分岐命令を実行する演算部１４ａ、１４ｂにおいて利用可能となる。このため、予測されたロード命令の結果が得られる前に、挿入された分岐命令を発行することが可能となる。
【０１８８】
他の例を挙げれば、各演算ユニットに、その演算ユニットに発行された命令を、その命令を実行することなく保持する機能を備えるシステムがある。このような命令保持機能を実現する機構は、一般に、予約ステーション（Ｒｅｓｅｒｖａｔｉｏｎ  Ｓｔａｔｉｏｎ）と呼ばれる。この予約ステーションは各演算ユニットに発行された命令を、必要なオペランドが利用可能となり、その演算ユニットで実行可能となるまで保持する。このため、このようなシステムでは、必要なオペランドが利用可能となる前に命令発行が可能となる。
【０１８９】
具体的には、分岐挿入部２１が挿入した分岐命令と、この分岐命令に後続する命令とが、それぞれ異なる演算ユニットに発行された場合、すなわち、異なる予約ステーションに保持される場合には、分岐命令に後続する命令、すなわちロード命令に後続する命令は、投機的に実行可能となる。異なる演算ユニットに発行されることで、分岐命令の実行とは独立に、この分岐命令に後続する命令が実行可能となるからである。
【０１９０】
第９の実施形態によれば、イン・オーダー型の命令発行を行うプロセッサにおいても、上記各実施形態と同様の効果が得られる。
【０１９１】
【発明の効果】
本発明によれば、プロセッサにおける命令の投機的実行において、値予測が正しかったか否かの検証および予測ミス時のリカバリー制御に要するハードウエアコストの増加を抑制することができる。
【０１９２】
また、命令の投機的実行に伴う値予測を実行するために、複雑な制御機構を追加することなく、容易な制御で値予測の検証および予測ミス時のリカバリー制御が実現できる。このため、プロセッサへの制御機構の実装および検証が容易となる。
【図面の簡単な説明】
【図１】ロード値の予測機構を備えるプロセッサの構成の一例を示すブロック図である。
【図２】ロード値予測が誤りであった場合に必要となるリカバリー処理を示すフローチャートである。
【図３】図２のリカバリー処理を説明するための命令列の一例を示す図である。
【図４】本発明の第１の実施形態に係る命令の投機的実行制御機構を備えたプロセッサの構成の一例を示すブロック図である。
【図５】第１の実施形態におけるレジスタ・リネーム機構の動作を説明するための命令列の一例を示す図である。
【図６】図５に示した命令列を、第１の実施形態におけるレジスタ・リネーム機構を用いてリネームした命令列を示す図である。
【図７】図４に示す分岐予測機構２３の内部構成を示すブロック図である。
【図８】図７の分岐予測機構２３における分岐予測の制御の一例を示すフローチャートである。
【図９】第１の実施形態における、命令をフェッチしてからのロード値予測、命令の投機的実行、予測の検証および予測ミス時のリカバリーまでの一連の動作を説明するフローチャートである。
【図１０】図３に示した命令列に対し、第１の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す図である。
【図１１】図３に示した命令列に対し、第２の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す図である。
【図１２】図３に示した命令列に対し、第４の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す図である。
【図１３】第５の実施形態における処理を説明するための命令列の一例を示す図である。
【図１４】図１３に示した命令列に対し、第５の実施形態に係るレジスタ・リネーミング処理と分岐命令の挿入処理を実行して得られた命令列を示す図である。
【図１５】第６の形態に係るロード値予測ミス時のリカバリー動作の制御を示すフローチャートである。
【図１６】従来における値予測機構を備えたプロセッサの構成の一例を示すブロック図である。
【図１７】第８の実施形態に係る値予測機構を備えたプロセッサの構成の一例を示すブロック図である。
【図１８】第９の実施形態に係るロード値予測機構を備えたプロセッサの構成の一例を示すブロック図である。
【符号の説明】
１  プロセッサ
２  メインメモリ
１１  命令フェッチ部
１１ｂ  プログラムカウンタ
１２  命令ウインド・バッファ
１３  ロード・ストア部
１４ａ，１４ｂ  演算部
１６  ロード予測機構
１７  レジスタファイル
１８  コミット部
１８ａ  リオーダ・バッファ
１９  レジスタ・リネーム部
２０  アーキテクチャ・レジスタ・マップ
２１  分岐挿入部
２３  分岐予測機構
【図１】
0003602840.tif 000002
【図２】
0003602840.tif 000003
【図３】
0003602840.tif 000004
【図４】
0003602840.tif 000005
【図５】
0003602840.tif 000006
【図６】
0003602840.tif 000007
【図７】
0003602840.tif 000008
【図８】
0003602840.tif 000009
【図９】
0003602840.tif 000010
【図１０】
0003602840.tif 000011
【図１１】
0003602840.tif 000012
【図１２】
0003602840.tif 000013
【図１３】
0003602840.tif 000014
【図１４】
0003602840.tif 000015
【図１５】
0003602840.tif 000016
【図１６】
0003602840.tif 000017
【図１７】
0003602840.tif 000018
【図１８】
0003602840.tif 000019