(57)【要約】【課題】レジスタ・キャッシュを有効に活用し、処理性能を好適に向上することのできるプロセッサ及びそのデータ処理方法を提供する。【解決手段】メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、レジスタ・キャッシュのアクセスに係るインデクスを、メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、未使用の物理レジスタ番号のモジュロ・ソートを行って、命令のフェッチ順にインデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する物理レジスタ番号の割り当てるようにした。【選択図】図１
2007304663.tif 000002
【特許請求の範囲】
【請求項１】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
前記レジスタ・キャッシュのインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するインデクス決定手段と、
命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に前記物理レジスタ番号を割り当てる物理レジスタ番号設定手段と、
を備えることを特徴とするプロセッサ。
【請求項２】
前記物理レジスタ番号設定手段は、前記インデクスがラウンド・ロビンとなるように未使用の前記物理レジスタ番号を整列させるとともに、その整列の順に前記物理レジスタ番号の割り当てを行う
請求項１に記載のプロセッサ。
【請求項３】
前記物理レジスタ番号設定手段は、
それぞれ前記インデクスを同一とする未使用の物理レジスタ番号が格納される、前記レジスタ・キャッシュのエントリ数と同数のバッファと、
レジスタ・リネーミング中の命令に割り当てられる前記物理レジスタ番号を読み出す前記バッファを、命令のフェッチ順に切り替える切替手段と、
を備える
ことを特徴とする請求項１に記載のプロセッサ。
【請求項４】
前記インデクス決定手段は、前記レジスタ・キャッシュのエントリ数で前記物理レジスタ番号を除算したときの剰余を前記インデクスとして決定する
請求項１〜３のいずれか１項に記載のプロセッサ。
【請求項５】
命令の分岐予測を行って予測した分岐先の命令を投機実行するとともに、
分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる前記物理レジスタ番号のインデクスの値の順序を巻き戻す巻き戻し手段を備える
ことを特徴とする請求項１〜４のいずれか１項に記載のプロセッサ。
【請求項６】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用されるデータとなるか否かを予測する予測手段と、
前記階層型レジスタへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、
を備えることを特徴とするプロセッサ。
【請求項７】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、
命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測する予測手段と、
前記階層型レジスタ・ファイルへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、
を備えることを特徴とするプロセッサ。
【請求項８】
前記予測手段は、定義したレジスタ値が前記データであったか否かの履歴を命令毎に記録保持するテーブルを備え、そのテーブルに保持された履歴に基づいて前記予測を行う
請求項６または７に記載のプロセッサ。
【請求項９】
前記予測手段は、前記データであったレジスタ値を定義した命令の識別情報を記録保持するテーブルを有し、そのテーブルにおける命令の識別情報の有無に基づき前記予測を行う
請求項６または７に記載のプロセッサ。
【請求項１０】
前記テーブルは、命令のプログラム・カウンタの値を構成するビット列の一部をインデクスとするエントリに同ビット列の残りの部分を前記識別情報として記録保持するように構成されてなる
請求項９に記載のプロセッサ。
【請求項１１】
命令の実行結果に基づいて前記予測手段の予測結果の是非を判定し、レジスタ値が前記データであるとの予測の誤りが判明したときに、該当レジスタ値を定義した命令の前記識別情報の登録を削除する
請求項９または１０に記載のプロセッサ。
【請求項１２】
請求項６〜１１のいずれか１項に記載のプロセッサにおいて、
前記予測手段によって前記データでないと予測されたレジスタ値を使用する命令に対して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止しつつ、命令の発行を行う命令発行手段を備える
ことを特徴とするプロセッサ。
【請求項１３】
請求項６〜１１のいずれか１項に記載のプロセッサにおいて、
前記予測手段によって前記データであると予測されたレジスタ値を使用する命令に限定して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う命令発行手段を更に備える
ことを特徴とするプロセッサ。
【請求項１４】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
前記レジスタ・キャッシュのアクセスに係るインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、
命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する前記物理レジスタ番号の割り当てを行うようにした
ことを特徴とするプロセッサのデータ処理方法。
【請求項１５】
前記物理レジスタ番号の割り当ては、
前記インデクスがラウンド・ロビンとなるように未使用の前記物理レジスタ番号を整列させる工程と、
レジスタ・リネーミング中の命令に対してその整列順に前記物理レジスタ番号の割り当てを行う工程と、
を通じて行われる
請求項１４に記載のプロセッサのデータ処理方法。
【請求項１６】
前記物理レジスタ番号の割り当ては、
前記レジスタ・キャッシュのエントリ数と同数のバッファのそれぞれに、前記インデクスを同一とする未使用の物理レジスタ番号を分別して格納する工程と、
前記バッファを順次切り替えながら前記物理レジスタ番号を順次読み出す工程と、
レジスタ・リネーミング中の命令に対してその読み出された前記物理レジスタ番号を同命令のフェッチ順に割り当てる工程と、
を通じて行われる
請求項１４に記載のプロセッサのデータ処理方法。
【請求項１７】
前記インデクスとして、前記レジスタ・キャッシュのエントリ数で前記物理レジスタ番号を除算したときの剰余を用いる
請求項１４〜１６のいずれか１項に記載のプロセッサのデータ処理方法。
【請求項１８】
命令の分岐予測を行って予測した分岐先の命令を投機実行するとともに、
分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる前記物理レジスタ番号のインデクスの値の順序を巻き戻すようにした
ことを特徴とする請求項１４〜１７のいずれか１項に記載のプロセッサのデータ処理方法。
【請求項１９】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
命令の定義するレジスタ値がクリティカル・パス上の命令に使用されるデータとなるか否かの予測を行うとともに、
前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、前記データとなると予測されたことを条件として同レジスタ値を前記レジスタ・キャッシュに書き込むようにした
ことを特徴とするプロセッサのデータ処理方法。
【請求項２０】
メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行う方法であって、
命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測するとともに、
前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、そのレジスタ値が前記データとなると予測されたことを条件として前記レジスタ・キャッシュに書き込むようにした
ことを特徴とするプロセッサのデータ処理方法。
【請求項２１】
命令の定義したレジスタ値が前記条件に該当するデータであったか否かを命令毎に履歴として記録する工程と、
今回もその履歴と同じ結果となるとして前記データとなるか否かを予測する工程と、
を通じて前記予測を行う
請求項１９または２０に記載のプロセッサのデータ処理方法。
【請求項２２】
前記条件に該当するデータとなったレジスタ値を定義した命令の識別情報を記録する工程と、
レジスタ値を定義した命令の前記識別情報が既に記録されていれば、そのレジスタ値は前記データとなり、記録されていなければ、そのレジスタ値は前記データとならないと予測する工程と、
を通じて前記予測を行う
請求項１９または２０に記載のプロセッサのデータ処理方法。
【請求項２３】
命令の実行結果に基づいて前記予測の結果の是非を判定し、レジスタ値が前記データとなるとの予測結果の誤りが判明したときに、該当レジスタ値を定義した命令の前記識別情報の記録を削除する
ことを特徴とする請求項２２に記載のプロセッサのデータ処理方法。
【請求項２４】
請求項１９〜２３のいずれか１項に記載のプロセッサのデータ処理方法において、
命令の発行に際して、使用するレジスタ値が前記データでないと予測された命令に対しては、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止する
ことを特徴とするプロセッサのデータ処理方法。
【請求項２５】
請求項１９〜２３のいずれか１項に記載のプロセッサのデータ処理方法において、
命令の発行に際して、使用するレジスタ値が前記データであると予測されたことを条件として、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う
ことを特徴とするプロセッサのデータ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、レジスタ・キャッシュとメイン・レジスタ・ファイルとに階層化された階層型レジスタ・ファイルを有するプロセッサ、及びその内部におけるデータ処理を行う方法に関する。
【背景技術】
【０００２】
プロセッサの高性能化に係るアーキテクチャとして、パイプライン処理やスーパスカラが知られている。パイプライン処理は、命令処理の各ステージの処理ユニットを独立して動作可能とした上で、１ステージの処理が終了する毎に命令を順次投入することで、複数命令の異なるステージを同時に実行させる手法である。またスーパスカラは、複数のパイプラインを用意し、複数の命令を同時並行して実行させる手法である。近年、マイクロ・プロセッサの高性能化と共に、パイプライン数及び各パイプラインの段数は、益々増加されており、それに伴いレジスタ・ファイル（ＲＦ：Register File）のエントリ数及びポート数も増加されている。
【０００３】
こうしたレジスタ・ファイルの肥大化は、レジスタ・ファイルのアクセス時間の増加を招き、動作周波数の向上を妨げる要因となっている。レジスタ・ファイルの肥大化によるアクセス時間の増加を抑制するための手段として、階層型レジスタ・ファイルが提案されている。
【０００４】
図２９に、階層型レジスタ・ファイルを備えるプロセッサでの実行ユニットでの命令の実行に係るデータパスの構成を示す。このデータパスにおいて命令は、階層型レジスタ・ファイル１５０へのアクセスを通じて必要なオペランドを取得した上で、実行ユニット（ＥＵ：Execution Unit）１５１，１５２に投入され、実行される。そして実行ユニット１５１，１５２での命令の実行結果は、結果バス１５３を介して階層型レジスタ・ファイル１５０に書き込まれる。
【０００５】
階層型レジスタ・ファイル１５０は、レジスタ・キャッシュ（ＲＣ：Register Cache ）１５４とメイン・レジスタ・ファイル（ＭＲＦ：Main Register File ）１５５とに階層化されている。メイン・レジスタ・ファイル１５５にはすべてのレジスタ値が、レジスタ・キャッシュ１５４には一部のレジスタ値のみが、それぞれ記録保持される。レジスタ・キャッシュ１５４は、エントリ数及びポート数が少ない分、メイン・レジスタ・ファイル１５５よりも高速動作可能となっている。
【０００６】
命令は、階層型レジスタ・ファイル１５０からのオペランドの取得に際して、まずレジスタ・キャッシュ１５４にアクセスし、そこに必要なレジスタ値があればそこからオペランドを取得し、無ければメイン・レジスタ・ファイル１５５からオペランドを取得する。このとき、レジスタ・キャッシュ１５４に必要なレジスタ値が保持されている、すなわち、レジスタ・キャッシュ１５４へのアクセスがヒットした場合には、レジスタ値を高速にアクセス可能となり、レジスタ・ファイルのアクセス時間が動作周波数に与える影響を低減することができる。
【０００７】
しかしながら、必要なレジスタ値がレジスタ・キャッシュ１５４に保持されていない場合、すなわちレジスタ・キャッシュ１５４へのアクセスがミス（以下、ＲＣミスと記載する）した場合には、次のようなペナルティが発生する。まずメイン・レジスタ・ファイル１５５の参照に先立ってレジスタ・キャッシュ１５４が参照される分、レジスタ・ファイルのアクセス・レイテンシが本来よりも増加して、プログラムの実行サイクル数に悪影響を及ぼすようになる。
【０００８】
またＲＣミスの発生は、他の命令の発行を妨げる場合もある。ここでＲＣミスが発生する命令ｉ０とその結果を使用する後続の命令ｉ１とを実行する場合を想定する。この想定では、プロセッサのパイプラインが、フェッチ２段、デコード２段、発行１段、オペランド・アクセス１段、実行１段、ライトバック１段、及びコミット１段によって構成されているものとする。また命令ｉ０の実行前には、レジスタ・キャッシュ上にはまだ何ら値が書き込まれていないものとする。あるサイクルにおいて命令ｉ０が発行されると、その次のサイクルにおいて命令ｉ０がレジスタ・キャッシュにアクセスする。命令ｉ１は、このときのアクセスがヒットするとして、投機的に発行されている。しかしながら、このときの命令ｉ１のレジスタ・キャッシュへのアクセスは必然的にミスとなるため、その次のサイクルでは命令ｉ１のオペランド・アクセスはできないこととなる。そして、この時点で命令ｉ１の発行は誤っていたことが確認されることになる。このように投機的発行に失敗した命令は、プロセッサの限られた命令発行幅を浪費することになり、他に有効な命令が存在した場合にそれらの発行を妨げてしまうことになる。
【０００９】
このように階層型レジスタ・ファイルでは、レジスタ・キャッシュ・ミス（以下、ＲＣミスと記載する）がプログラムの実行に与える悪影響を如何に緩和するかが重要な課題となっており、より効率的なレジスタ・キャッシュの更新方法が求められている。レジスタ・キャッシュの更新方法は大きくは、書き込みポリシーと置き換えポリシーとの２つに分類することができる。書き込みポリシーとは、命令の生成した値の中からレジスタ・キャッシュに書き込む値を選択するための指針のことであり、置き換えポリシーとは、値の書き込まれるレジスタ・キャッシュのエントリを選択するための指針のことである。
【００１０】
従来、レジスタ・キャッシュの置き換えポリシーについて、非特許文献１及び２に記載の技術が提案されている。非特許文献１の手法では、ＬＲＵ（Least Recently Used ）方式でレジスタ・キャッシュの更新を行うようにしている。ＬＲＵ方式とは、レジスタ・キャッシュの各エントリのうちでアクセスされた時期の最も古いエントリを、新規追加するレジスタ値に入れ替える方式である。一方、非特許文献２の手法では、レジスタ・キャッシュの各エントリに保持されたレジスト値のそれぞれについて、後続命令による参照の回数を予測し、その参照回数が少ないエントリを新規追加するレジスタ値に書き換えるようにしている。
【００１１】
なお、非特許文献３及び４は、クリティカル・パスの予測手法に関する従来技術文献である。
【特許文献１】特開平１１−２９６４３１号公報
【特許文献２】特開２００４−１１８３７２号公報
【非特許文献１】Caching Processor General Register (In Proc. Int. Conf. on Circuits Design, pp.307-312, 1995)
【非特許文献２】Use-Base Register Caching with Decoupled Indexing (In Proc. of 31st International Symposium on Computer Architecture, pp.302-313, 2004)
【非特許文献３】Focusing Processor Policies via Critical-Path Prediction (In Proc. ISCA-28, June 2001.)
【非特許文献４】低消費電力プロセッサアーキテクチャ向けクリティカルパス予測器の提案（情報処理学会研究報告  2002-ARC-149、2002年 8月）
【発明の開示】
【発明が解決しようとする課題】
【００１２】
こうした従来の手法では、参照される可能性の低いエントリからレジスタ値が置き換えられていき、参照される可能性の高いエントリについては書き換えられずに長期保持されるため、上記ＲＣミスを効果的に削減することはできる。しかしながら、何れの手法においても、非参照期間の計測や参照回数の推定をすべての命令について行う必要がある。またレジスタ・キャッシュのエントリが物理レジスタ番号から一意に定まらないため、アクセスに際して類推検索を行う必要がある。そのため、レジスタ・キャッシュのハードウェア構成が複雑となってしまい、レジスタ・キャッシュのアクセス時間が増加してしまうという問題があり、プロセッサの処理性能を十分には向上することができないものとなっている。
【００１３】
なお、メモリ階層（階層型主記憶装置）でのデータ・キャッシュ・ミスの削減に係る技術としては、特許文献１及び２に記載のものが提案されている。これらはいずれもキャッシュ・メモリのインデクスの生成方法の工夫により、エントリの競合を避けてキャッシュのヒット率を向上するものであるが、あくまでメモリ階層への適用を想定したものであり、そのまま階層型レジスタ・ファイルに適用することはできないものとなっている。
【００１４】
本発明は、こうした実情に鑑みてなされたものであって、その解決しようとする課題は、レジスタ・キャッシュを有効に活用し、処理性能を好適に向上することのできるプロセッサ及びそのデータ処理方法を提供することにある。
【課題を解決するための手段】
【００１５】
上記課題を解決するため、請求項１に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、前記レジスタ・キャッシュのインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するインデクス決定手段と、命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に前記物理レジスタ番号を割り当てる物理レジスタ番号設定手段と、を備えるようにしている。
【００１６】
また請求項１４に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、前記レジスタ・キャッシュのアクセスに係るインデクスを、前記メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、命令のフェッチ順に前記インデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する前記物理レジスタ番号の割り当てを行うようにしている。
【００１７】
上記プロセッサ及びそのデータ処理方法では、レジスタ・キャッシュのインデクスをメイン・レジスタ・ファイルの物理レジスタ番号から一意に定めるようにしている。そのため、アクセスに際しての類推検索が不要となることから、レジスタ・キャッシュのアクセス時間の短縮、及びハードウェア構成の簡易化が可能となる。ただし、こうした場合に、命令のレジスタ・リネーミング時に未使用の物理レジスタ番号をランダムに割り当てるとすると、物理レジスタのコミット時に書き換えられるレジスタ・キャッシュのエントリもランダムに決定されることになる。そのため、レジスタ・キャッシュの各エントリの書き換えの頻度は必ずしも平均化されず、特定のエントリの書き換えが頻発することがあり、エントリの競合によるＲＣミスが発生し易くなってしまう。
【００１８】
その点、上記構成及びデータ処理方法では、命令のレジスタ・リネーミングに際して、レジスタ・キャシュのインデクスが命令のフェッチ順にラウンド・ロビンとなるように、物理レジスタ番号の割り当てを行うようにしている。ここでのラウンド・ロビンとは、取り得る値のすべてについて、各値が１度ずつ現れるように値が順に交代されることを意味する。この場合、命令に割り当てられた物理レジスタ番号のレジスタ・キャッシュへのインデクスの値は、特定の値に偏ることなく分散されるようになり、レジスタ・キャッシュのエントリの競合が抑制されるようになる。したがって、アクセス時間の増加を招くことなく、ＲＣミスの発生を効果的に削減することができるようになる。
【００１９】
なお請求項１に記載のプロセッサにおけるような物理レジスタ番号の割り当ては、より具体的には、例えば請求項２に記載のように、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させるとともに、その整列の順に物理レジスタ番号の割り当てを行うように上記物理レジスタ番号設定手段を構成することでその実現が可能である。また請求項３に記載のように、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、前記レジスタ・キャッシュのエントリ数と同数のバッファと、レジスタ・リネーミング中の命令に割り当てられる前記物理レジスタ番号を読み出す前記バッファを、命令のフェッチ順に切り替える切替手段と、を備えて上記物理レジスタ番号設定手段を構成することによっても、その実現が可能である。
【００２０】
また、請求項１４に記載のデータ処理方法におけるような物理レジスタ番号の割り当ては、より具体的には、例えば請求項１５に記載のように、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させる工程と、レジスタ・リネーミング中の命令に対してその整列順に前記物理レジスタ番号の割り当てを行う工程と、を通じて行うことができる。また請求項１６に記載のように、レジスタ・キャッシュのエントリ数と同数のバッファのそれぞれに、インデクスを同一とする未使用の物理レジスタ番号を分別して格納する工程と、バッファを順次切り替えながら物理レジスタ番号を順次読み出す工程と、レジスタ・リネーミング中の命令に対してその読み出された物理レジスタ番号を同命令のフェッチ順に割り当てる工程と、を通じても、請求項１４におけるような物理レジスタ番号の割り当てを行うことができる。
【００２１】
また、上記のような物理レジスタ番号から一意に定まるようなインデクスの決定は、例えば請求項４や請求項１７に記載のように、レジスタ・キャッシュのエントリ数で物理レジスタ番号を除算したときの剰余をインデクスとして決定するようにインデクス決定手段を構成することで行うことができる。この場合、上記剰余が順次切り替わるように未使用の物理レジスタ番号を整列させた上で、その整列の順に割り当てを行うことで、レジスタ・キャッシュのインデクスをラウンド・ロビンとすることができる。
【００２２】
ところで多段パイプラインを有するプロセッサでは、命令の分岐予測を行って予測した分岐先の命令を投機実行することがある。この場合、分岐予測ミスが発生すると、投機的にパイプラインに投入された誤った分岐先の命令を破棄し、正しい分岐先の命令を投入しなおすことになる。このときの破棄された命令には既に物理レジスタ番号の割り当てが行われており、その破棄によってインデクスの順番に狂いが生じ、ラウンド・ロビンとならなくなってしまうことがある。こうした場合にも、請求項５及び請求項１８に記載のように、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにすれば、分岐予測ミスの発生時にもインデクスはラウンド・ロビンに維持されるようになる。
【００２３】
一方、上記課題を解決するため、請求項６に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用されるデータとなるか否かを予測する予測手段と、前記階層型レジスタへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、を備えるようにしている。
【００２４】
また請求項１９に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、命令の定義するレジスタ値がクリティカル・パス上の命令に使用されるデータとなるか否かの予測を行うとともに、前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、前記データとなると予測されたことを条件として同レジスタ値を前記レジスタ・キャッシュに書き込むようにしている。
【００２５】
ＲＣミスによるペナルティで命令の実行が遅れると、その命令がクリティカル・パス上の命令であれば、その遅れの分、プログラム全体の実行サイクル数が増加してしまう。これに対して、その命令が非クリティカル・パス上の命令ならば、ＲＣミスのペナルティによるプログラム全体の実行サイクル数の増加は、そのペナルティによる命令の実行の遅れ分よりも少なくなる。したがって、同じ数だけＲＣミスを削減できるとすれば、非クリティカル・パス上の命令のＲＣミスを削減するよりは、クリティカル・パス上の命令のＲＣミスを削減した方が、プロセッサの処理性能は向上するようになる。
【００２６】
その点、上記プロセッサ及びそのデータ処理方法では、クリティカル・パス上の後続命令に使用されるデータとなると予測されるレジスタ値のみがレジスタ・キャッシュに書き込まれるようになる。こうしてレジスタ・キャッシュに書き込まれるデータの種類を制限することで、レジスタ・キャッシュのデータの置き換え頻度が低減されるようになり、クリティカル・パス上の命令によって使用されるデータの受け渡しについてはＲＣミスの発生を大幅に低減することができる。もっとも、この場合には、非クリティカル・パス上の命令に使用されるデータについては、レジスタ・キャッシュへの書き込みがそもそも行われないことから、必然的にＲＣミスが発生するようにはなる。ただし、非クリティカル・パス上の命令のＲＣミスは、クリティカル・パス上の命令のＲＣミスに比べれば、プロセッサの処理性能に与える悪影響は軽微となっている。そのため、非クリティカル・パス上の命令に対するデータの受け渡しに際してＲＣミスがある程度発生しても、クリティカル・パス上の命令に対するデータの受け渡しに際してのＲＣミスの発生を防止しさえすれば、ＲＣミスによるプロセッサ性能の低下を緩和することができる。したがって、上記構成及びデータ処理方法のように、クリティカル・パス上の命令のＲＣミスの発生を低減しさえすれば、ＲＣミスによるプロセッサの処理性能の低下を好適に抑制することが可能となる。
【００２７】
さらに請求項７に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサにおいて、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測する予測手段と、前記階層型レジスタ・ファイルへの前記レジスタ値の書き込みに際して、前記予測手段によって前記データとなると予測されたレジスタ値に限定して前記レジスタ・キャッシュへの書き込みを行う書込手段と、を備えるようにしている。
【００２８】
また請求項２０に記載の発明では、メイン・レジスタ・ファイルとレジスタ・キャッシュとに階層化された階層型レジスタ・ファイルを有するプロセッサの内部におけるデータ処理を行うプロセッサのデータ処理方法として、命令の定義したレジスタ値が、クリティカル・パス上の後続命令に使用され、且つその後続命令にオペランド・バイパスによっては受け渡されないデータとなるか否かを予測するとともに、前記レジスタ値の前記階層型レジスタ・ファイルへの書き込みに際して、そのレジスタ値が前記データとなると予測されたことを条件として前記レジスタ・キャッシュに書き込むようにしている。
【００２９】
命令のデコード時にその命令の必要とするオペランド（データ）が結果バスに存在する場合、レジスタ・ファイルを介さずにそのデータを結果バスから直接取得する、いわゆるオペランド・バイパスによるレジスタ値の受け渡しが行われることがある。クリティカル・パス上の命令によって使用されるレジスタ値であっても、そのレジスタ値がオペランド・バイパスによって得られるのであれば、そのデータの受け渡しにレジスタ・ファイル・アクセスは行われない。そのため、そうしたデータをわざわざレジスタ・キャッシュに書き込んだところで、そのデータのアクセス時間の短縮には寄与しないばかりか、限りあるレジスタ・キャッシュの資源が無駄に消費されることとなり、その書き込みによって必要なデータがレジスタ・キャッシュから追い出されてしまう可能性がある。したがって上記構成及びデータ処理方法のように、クリティカル・パス上の命令によって使用されるデータの中で、オペランド・バイパスによっては得られないデータのみを選択してレジスタ・キャッシュに書き込むこととすれば、クリティカル・パス上の命令のＲＣミスの発生を更に確実に低減することができるようになる。
【００３０】
なお請求項６及び７に記載のプロセッサにおける予測手段は、例えば請求項８に記載のように、定義したレジスタ値が上記データであったか否かの履歴を命令毎に記録保持するテーブルを備え、そのテーブルに保持された履歴に基づいて予測を行うように構成することができる。命令の定義したレジスタ値のその後の使用態様は、先にその命令が実行されたときと同様の結果となる可能性が高いため、上記のように先の命令の実行時におけるレジスタ値の使用態様の履歴を記録し、その履歴を参照することで上記予測を行うことができる。
【００３１】
そうした予測手段は、より具体的には、例えば請求項９に記載のように、上記データであったレジスタ値を定義した命令の識別情報を記録保持するテーブルを有し、そのテーブルにおける命令の識別情報の有無に基づき前記予測を行うように構成することができる。ちなみに請求項９のように予測手段を構成した場合、請求項１０に記載のように、そのテーブルを、命令のプログラム・カウンタの値を構成するビット列の一部をインデクスとするエントリに同ビット列の残りの部分を識別情報として記録保持するように構成することも可能である。
【００３２】
一方、請求項１９及び２０における命令の定義したレジスタ値のその後の使用態様についての予測は、例えば請求項２１に記載のように、命令の定義したレジスタ値が上記条件に該当するデータであったか否かを命令毎に履歴として記録する工程と、今回もその履歴と同じ結果となるとしてデータとなるか否かを予測する工程と、を通じて行うことができる。またそうした予測は、より具体的には、請求項２２に記載のように、上記条件に該当するデータとなったレジスタ値を定義した命令の識別情報を記録する工程と、レジスタ値を定義した命令の識別情報が既に記録されていれば、そのレジスタ値は上記データとなり、記録されていなければ、そのレジスタ値は上記データとならないと予測する工程と、を通じて行うことができる。
【００３３】
なお請求項９及び１０のように予測手段を構成した場合、或いは請求項２２のように予測を行う場合には、プログラムの実行中に命令間のデータ依存関係が変化すると予測結果を誤ってしまうことがある。そうした場合にも、請求項１１や請求項２３に記載のように、命令の実行結果に基づいて予測手段の予測結果の是非を判定し、レジスタ値がデータであるとの予測の誤りが判明したときに、該当レジスタ値を定義した命令の識別情報の登録を削除するようにすれば、上記のようなデータ依存関係の変化に対応することができる。
【００３４】
ところでＲＣミスには、他の命令の発行を妨げてしまうという問題もある。この要因は、オペランドの取得に際してＲＣミスが発生してしまう命令を、オペランドのレジスタ・キャッシュからの取得（ＲＣヒット）を前提として投機的に発行してしまうことにある。したがって、オペランドの取得時にＲＣミスが発生する命令を事前に検出し、そうした命令の投機的に発行を行わないようにすれば、上記問題は回避することができる。
【００３５】
ここで請求項６〜１１に記載のプロセッサ、及び請求項１９〜２３のデータ処理方法では、レジスタ・キャッシュに書き込むレジスタ値の種別を限定しており、それ以外の種別のレジスタ値についてはその受け渡しに際してＲＣミスが発生することが予め分かっている。そこでそうしたＲＣミスの発生が予め分かっているレジスタ値を使用する命令については、ＲＣヒットを前提とした投機的な発行を行わないようにすれば、上記のようなＲＣミスによる他の命令の発行の妨害を回避することができる。
【００３６】
具体的には、請求項６〜１１のプロセッサにおいて、
・  請求項１２に記載のように、予測手段によって上記データでないと予測されたレジスタ値を使用する命令に対して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止しつつ、命令の発行を行う命令発行手段を備えること、
・  請求項１３に記載のように、予測手段によって上記データであると予測されたレジスタ値を使用する命令に限定して、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行う命令発行手段を更に備えること、
或いは、請求項１９〜２３のプロセッサのデータ処理方法において、
・  請求項２４に記載のように、命令の発行に際して、使用するレジスタ値が上記データでないと予測された命令に対しては、レジスタ・キャッシュのヒットを前提とした投機的な発行を禁止すること、
・  請求項２５に記載のように、命令の発行に際して、使用するレジスタ値が前記データであると予測されたことを条件として、前記レジスタ・キャッシュのヒットを前提とした投機的な発行を行うこと、
により、ＲＣミスによる他の命令の発行の妨害を好適に回避することができる。
【発明の効果】
【００３７】
本発明のプロセッサ及びそのデータ処理方法によれば、レジスタ・キャッシュを有効に活用して、処理性能を好適に向上することができる。
【発明を実施するための最良の形態】
【００３８】
（第１実施形態）
以下、本発明に係るプロセッサ及びそのデータ処理方法を具体化した第１実施形態を、図１〜図１８を参照して詳細に説明する。なお、以下の説明では、数値を２進数で表記する場合、その値の前後に”［”、”］”をそれぞれ付して記載し、そうでない数値は１０進数表記によるものとする。
【００３９】
上述のように階層型レジスタの有効活用には、書き込みポリシーや置き換えポリシーといったレジスタ・キャッシュの更新方法が重要な意味を持つ。ここでレジスタ・キャッシュの置き換えポリシーに着目すると、レジスタの参照には時間的局所性があることを考慮した場合、参照の時期が最も古いエントリに新規追加のレジスタ値を書き込むという上述のＬＲＵ方式が、参照の可能性の低いエントリを置き換え対象に選択可能である点で、ＲＣミスの削減に最も効果的であると考えられる。なお、時間的局所性とは、レジスタの再参照率の時間的特性を示す言葉であり、ここでは、先の参照からの時間の経過に従ってレジスタの再参照率が低くなるという一般的傾向がある。すなわち、参照時期がもっと古いエントリは、再参照される可能性が最も低いエントリと見なすことができる。したがってＬＲＵ方式では、参照の可能性の低いと推定されるエントリから順に値が上書きされることとなる。
【００４０】
このようにＬＲＵ方式は、ＲＣミスの削減には確かに有効ではあるが、レジスタ・キャッシュの書き込みが行われる都度、参照時期の最も古いエントリを探す必要がある。また値の格納されるエントリがその物理レジスタ番号とは無関係に決定されることから、レジスタ・キャッシュの参照時に連想検索を行う必要もある。このようにＬＲＵ方式では、レジスタ・キャッシュの読み書きに複雑な処理が必要であり、レジスタ・キャッシュのハードウェア構成の複雑化やアクセス時間の増加を招いてしまう。
【００４１】
従来、こうしたＬＲＵ方式に対して、より簡易な構成で実現可能な方式として、ダイレクト・マップ方式が知られている。レジスタ・キャッシュにおけるダイレクト・マップ方式では、レジスタ値の書き込まれるレジスタ・キャッシュのエントリを、レジスタ・リネーミング時に割り当てられたメイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するようにしている。
【００４２】
次に、こうした従来のダイレクト・マップ方式の詳細を説明する。ダイレクト・マップ方式では、物理レジスタ番号をレジスタ・キャッシュのエントリ数（ＲＣエントリ数）で除算したときの剰余を、レジスタ・キャッシュのアクセスに際してのインデクスとするようにしている。こうしたレジスタ・キャッシュにおけるダイレクト・マップ方式は、メモリ階層のダイレクト・マップ方式と基本的な考え方は同じである。ちなみにメモリ階層のダイレクト・マップ方式では、メモリ・アドレスから抽出したビット列をキャッシュのエントリ数で除算したときの剰余をキャッシュ・メモリのインデクスとして使用する。
【００４３】
実際の階層型レジスタ装置では、エントリ数が「ｎ」のレジスタ・キャッシュでは、２を底とするＲＣエントリ数ｎの対数、すなわちＲＣエントリ数を２進数表記したときのビット長を「Ｂｒ」としたとき、その物理レジスタ番号の下位「Ｂｒビット」をインデクスとして使用するようにしている。例えばＲＣエントリ数が「４」の場合、２を底としたＲＣエントリ数「４」の対数は「２」であることから、物理レジスタ番号の下位２ビットがレジスタ・キャッシュのインデクスとなる。このときの番号「９（＝［1001］）」の物理レジスタに対応付けられるレジスタ・キャッシュのインデクスは、その下位２ビットである「１（＝［01］）」となる。
【００４４】
ところで、従来のダイレクト・マップ方式では、命令のデコード時のレジスタ・リネーミングにおける物理レジスタ番号の割り当ては、以下の態様で行われている。すなわち、従来のプロセッサのレジスタ装置には、フリー・リストと呼ばれるリストが設けられ、そのフリー・リストから物理レジスタ番号を取得して、命令のデスティネーション・レジスタ（命令の実行結果が格納されるレジスタ）に割り当てるようにしている。フリー・リストは、未使用の物理レジスタ番号が格納される、ＦＩＦＯ式のバッファとして構成されている。
【００４５】
命令の実行により、ある物理レジスタに対応する論理レジスタが再定義され、その命令のデスティネーション・レジスタとして新たに割り当てられた物理レジスタが、その再定義された論理レジスタにコミットされると、前者の物理レジスタが解放された状態、すなわち使用可能な状態となる。このとき、解放された物理レジスタの番号がフリー・リストに格納される。通常、各論理レジスタの再定義の頻度にはばらつきがあり、物理レジスタの解放タイミングにもばらつきが生じることから、フリー・リストでの物理レジスタ番号の並び方はランダムとなる。したがって、レジスタ・リネーミング時に物理レジスタ番号はランダムに割り当てられることとなり、割り当てられた物理レジスタのコミット時に書き換えられるレジスタ・キャッシュのエントリもランダムに決定されることになる。そのため、従来のダイレクト・マップ方式では、レジスタ・キャッシュの各エントリの書き換えの頻度は必ずしも平均化されず、特定のエントリの書き換えが頻発するという事態が生じ得る。そうした場合、レジスタ・キャッシュのエントリが競合して、参照される可能性の高いレジスタ・キャッシュのエントリが短時間で上書きされてしまうことから、ＲＣミスが発生し易い状態となってしまう。
【００４６】
そうした従来のダイレクト・マップ方式の問題を、図１（ａ）を用いて説明する。なお同図１（ａ）及び図１（ｂ）には、プログラムにおいて順次実行される各命令ｉ０〜ｉ３について、そのメイン・レジスタ・ファイル（ＭＲＦ）及びレジスタ・キャッシュ（ＲＣ）のエントリ番号の割り当て態様の一例が示されている。同図において、メイン・レジスタ・ファイル及びレジスタ・キャッシュの各エントリの左側に付された数値は、エントリ番号を示している。また同図では、命令、メイン・レジスタ・ファイルのエントリ、レジスタ・キャッシュのエントリの間の対応関係が矢印にて示されている。ちなみに図１（ａ）及び（ｂ）の各例では、ＲＣエントリ数はそれぞれ「４」となっている。
【００４７】
ここでフリー・リストに、「４」、「７」、「９」、及び「１２」〜「１４」の物理レジスタ番号が格納されていたとする。上述したように、従来のダイレクト・マップ方式では、これら物理レジスタ番号のフリー・リストにおける格納の順序はランダムとなっている。図１（ａ）の例では、命令ｉ０〜ｉ３に割り当てられる物理レジスタ番号はフェッチ順に、「１２」（＝［1101］）、「４」（＝［0100］）、「９」（＝［1001］）、「１３」（＝［1101］）となっている。このときには、レジスタ・キャッシュの０番エントリにおいて命令ｉ０と命令ｉ１とが競合し、１番エントリにおいて命令ｉ２と命令ｉ３とが競合する。そしてその結果、レジスタ・キャッシュには４つのエントリがあり、格納すべきレジスタ値の数も４つであるであるにも拘わらず、実際には２つのエントリしか使用されておらず、書き込み直後に２つのレジスタ値が上書きされてレジスタ・キャッシュから消されてしまうことになる。物理レジスタ番号がランダムに割り当てられる従来のダイレクト・マップ方式は、ハードウェア構成が簡易である反面、こうしたエントリの競合の発生について何らの対応も取られていないことから、ＬＲＵ方式のような他の方式に比してＲＣミスの発生頻度は高いものとなっている。
【００４８】
こうした競合の発生は、レジスタ・キャッシュへのインデクスがラウンド・ロビンに決定されるように、すなわち割り当て毎にインデックスが順送りに交代されるように、物理レジスタ番号の割り当てを行うことで、効果的に解消することができる。図１（ｂ）は、そのように物理レジスタ番号の割り当てを行った場合を示している。同図１（ｂ）の例では、命令ｉ０〜ｉ３のデスティネーション・レジスタの物理レジスタ番号をフェッチ順に、「１２」（＝［1100］）、「９」（＝［1001］）、「１４」（＝［1110］）、「７」（＝［0111］）の順に割り当てている。このときの各命令ｉ０〜ｉ３に対応するレジスタ・キャッシュへのインデクスはそれぞれ、「０」（＝［00］）、「１」（＝［01］）、「２」（＝［10］）、「３」（＝［11］）となり、エントリの競合は生じない。すなわち、レジスタ・キャッシュのすべてのエントリが有効に活用されている。このように、レジスタ・キャッシュのインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを実現すれば、レジスタ・キャッシュのエントリの競合を回避し、ＲＣミスの発生を効果的に抑制することができる。
【００４９】
次にそうした物理レジスタ番号の割り当てを実現する、本実施形態の階層型レジスタの利用方法での物理レジスタ番号の供給手法について説明する。上記のような物理レジスタの割り当てを実現するには、レジスタ・リネーミング時に、番号をＲＣエントリ数で除算したときの剰余が順送りとなるように整列された状態で、物理レジスタ番号を供給する必要がある。ここでは、そうした物理レジスタ番号の整列を、モジュロ・ソート（剰余整列）と記載する。
【００５０】
なお物理レジスタ番号の割り当ては一般に、上述したフリー・リストを用いて行われる。よってフリー・リストに対して、格納された物理レジスタ番号のモジュロ・ソートをサイクル毎に行えば、上記のような物理レジスタ番号の供給の実現は可能である。しかしながら、フリー・リストに既に格納された値に対するソート処理を行うには、リスト内のすべての値を外部に一旦取り出し、ソートを行ってから再び格納し直すといった作業が必要で、時間が掛かりすぎるという問題がある。そこで本実施形態では、解放された物理レジスタ番号を予めモジュロ・ソートされた状態としてから、バッファに記憶していくようにしている。
【００５１】
続いて、上記のような物理レジスタ番号のモジュロ・ソートを実現するための、具体的な機構の構成について説明する。この機構は、ＭＳＢ（剰余整列バッファ：Modulo Sorting Buffer ）と呼ばれるバッファによって構成されている。このＭＳＢは、従来の階層型レジスタ装置におけるフリー・リストの代わりとして、物理レジスタ番号の管理を行う機能を担っており、コミット時にリオーダ・バッファから物理レジスタ番号を受け取るとともに、レジスタ・リネーミング時に物理レジスタ番号を供給する。本実施形態では、このＭＳＢが上記インデクス決定手段及び物理レジスタ番号設定手段に相当するこうせいとなっている。
【００５２】
このＭＳＢによる物理レジスタ番号の割り当ては、インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号の整列を行う工程と、レジスタ・リネーミング中の命令に対してその整列順に物理レジスタ番号の割り当てを行う工程と、を通じて行われる。より具体的には、前者の工程は、ＲＣエントリ数と同数のバッファのそれぞれに、インデクスを同一とする物理レジスタ番号を分別して格納する工程を通じて行われる。また後者の工程は、バッファを順次切り替えながら物理レジスタ番号を順次読み出す工程と、レジスタ・リネーミング中の命令に対してその読み出された物理レジスタ番号を命令のフェッチ順に割り当てる工程とを通じて行われる。
【００５３】
まずここでは、単一命令発行の、すなわち単一サイクルに唯一つの命令を発行するプロセッサへの搭載を想定したＭＳＢの構成を説明する。なお、図２に示すように、ここでＭＳＢの搭載を想定するプロセッサは、フェッチ・ユニット１１、デコード・ユニット１２、命令ウィンドウ（Ｉ−ｗｉｎ）１３、実行ユニット（ＥＵ）１４、リオーダ・バッファ（ＲＯＢ）１５を備えている。またプロセッサには、メイン・レジスタ・ファイル（ＭＲＦ）１６及びレジスタ・キャッシュ（ＲＣ）１７からなる階層型レジスタ・ファイルとマップ表１８とが設けられてもいる。フェッチ・ユニット１１は、主記憶装置からの命令の読み込みを行う。デコード・ユニット１２は、読み込まれた命令の内容の解析（デコード）し、命令ウィンドウ１３及びリオーダ・バッファ１５にそれぞれ格納する。またデコード・ユニット１２は、デコード時に定義した物理レジスタと論理レジスタとの対応関係をマップ表１８に記憶する。命令ウィンドウ１３は、実行前の命令を一時的に格納するバッファであり、プロセッサの制御回路は、このバッファから命令を取り出して、実行ユニット１４に順次投入する。一方、リオーダ・バッファ１５は、命令を格納するＦＩＦＯ（First-In First-Out）式のバッファであり、格納された命令の中で格納の順が最も早い命令の実行が終了すると、その命令が取り出される（コミットされる）。なお上述したように、階層型レジスタ・ファイルのメイン・レジスタ・ファイル１６は、すべてのレジスタ値を記憶し、より高速に動作可能なレジスタ・キャッシュ１７は一部のレジスタ値のみを記録する。
【００５４】
こうしたプロセッサに搭載されるＭＳＢ２０は、それぞれインデクスを同一とする物理レジスタ番号が格納される、ＲＣエントリ数と同数のＦＩＦＯ式のバッファ（以下、ＦＩＦＯと記載する）と、物理レジスタ番号の供給を行うＦＩＦＯを指示する供給ポインタとを備えて構成されている。各ＦＩＦＯには、レジスタ・キャッシュ１７のエントリ番号のそれぞれに対応する番号が付されており、ＲＣエントリ数で除算したときの剰余がその番号と一致する物理レジスタ番号がそれぞれ格納される。また供給ポインタには、次に物理レジスタ番号の供給を行うＦＩＦＯの番号が保持される。すなわち、この供給ポインタの指示より、レジスタ・リネーミング中の命令に供給される物理レジスタ番号を読み込むＦＩＦＯの切り替えが行われる。なお以下の説明では、「ｎ番」のＦＩＦＯを「ＦＩＦＯ（ｎ）」と記載する。ただしＦＩＦＯの番号を２進数で表記する場合には、［XXXX］番のＦＩＦＯをＦＩＦＯ［XXXX］と記載する。
【００５５】
このＭＳＢ２０は、次のように動作する。コミット時に物理レジスタが解放されると、その空きとなった物理レジスタの番号がＭＳＢ２０に通知される。ＭＳＢ２０は、通知された物理レジスタ番号をＲＣエントリ数で除算したときの剰余と一致する番号のＦＩＦＯに、その物理レジスタ番号を格納する。例えばＲＣエントリ数が「４」（＝［ 100］）で、通知された物理レジスタ番号が「９」（＝［1001］）の場合、「９」を「４」で除算したときの剰余である「１（＝［01］）番」のＦＩＦＯにその物理レジスタ番号「９」が格納される。なおＲＣエントリ数が「４」の場合、物理レジスタ番号の下位２ビットが上記剰余と一致するため、これを用いて格納するＦＩＦＯを決定することができる。一方、レジスタ・リネーミング時には、ＭＳＢ２０は、供給ポインタに保持された番号のＦＩＦＯの先頭から、物理レジスタ番号を読み出して、これを命令に供給する。そして供給ポインタの値をインクリメントする。ただし、このときの供給ポインタの値が、既にＦＩＦＯ番号の最大値に達しているときには、その値を「０」にリセットする。
【００５６】
図３に、図１（ｂ）と同じ状態におけるＭＳＢ２０の動作態様を示す。すなわち、ＭＳＢ２０には、「４」、「７」、「９」、及び「１２」〜「１４」の６つの物理レジスタ番号が格納され、ＲＣエントリ数は「４」となっている。この場合、ＦＩＦＯ（０）には、ＲＣエントリ数で除算したときの剰余が「０」となる物理レジスタ番号「４」及び「１２」が格納されている。同様に、ＦＩＦＯ（１）には上記剰余が「１」となる物理レジスタ番号「９」及び「１３」が、ＦＩＦＯ（２）には上記剰余が「２」となる物理レジスタ番号「１４」が、ＦＩＦＯ（３）には上記剰余が「３」となる物理レジスタ番号「７」が、それぞれ格納されている。
【００５７】
ここでプログラム開始時の供給ポインタの値が「０」であったとすると、命令ｉ０のレジスタ・リネーミング時には、ＦＩＦＯ（０）の先頭から物理レジスタ番号が供給される。この場合、命令ｉ０のデスティネーション・レジスタには、ＦＩＦＯ（０）の先頭に格納された物理レジスタ番号「１２」が割り当てられる。そしてこの番号「１２（＝［1100］）」の物理レジスタに対応するレジスタ・キャッシュ１７のエントリは「０」となる。またこれとともに供給ポインタの値はインクリメントされて「１」となる。
【００５８】
その後は同様にして、命令ｉ１〜ｉ３に対して物理レジスタ番号「９」（＝［1001］）、「１４」（＝［1110］）、「７」（＝［0111］）が順に割り当てられていく。こうして命令ｉ０〜ｉ３に割り当てられた物理レジスタに対応するレジスタ・キャッシュ１７のエントリは順に、「０」、「１」、「２」、「３」となり、上述したようなモジュロ・ソートされた物理レジスタの割り当てが実現されている。
【００５９】
（ＭＳＢのハードウェア量の削減）
続いて、同等の機能をより少ないハードウェア量で実現可能な上記実施形態のＭＳＢの改良について説明する。
【００６０】
上記のようにＭＳＢの各ＦＩＦＯには、ＲＣエントリ数で除算したときの剰余がＦＩＦＯ番号と一致する物理レジスタ番号がそれぞれ格納される。一方、上記剰余は、物理レジスタ番号の下位「Ｂｒビット」と等しくなる（Ｂｒ：ＲＣエントリ数を２進数表記したときのビット長）。したがって、各ＦＩＦＯに格納される物理レジスタ番号の下位Ｂｒビットはすべて同じとなっている。
【００６１】
そこでここでは、各々に格納される物理レジスタ番号の下位Ｂｒビットを各ＦＩＦＯの番号として用いるとともに、各ＦＩＦＯには、物理レジスタ番号の下位Ｂｒビットを除いたビット列のみを記録するようにする。そしてレジスタ・リネーミング時には、供給ポインタの指定するＦＩＦＯの先頭に記録されたビット列の後ろに、供給ポインタの保持するＦＩＦＯ番号を連結することで、物理レジスタ番号を復元することとする。このようにすれば、ＦＩＦＯの各エントリのビット数をＢｒビット分節約することができる。
【００６２】
図４に、このように構成されたＭＳＢにおける、図３と同様の状態での動作態様を示す。なお図中の数値はいずれも２進数で表記されている。ここでの物理レジスタ番号は４ビットで表され、それをＲＣエントリ数「４」で除算したときの剰余はその下位２ビットと同じとなる。したがって、このＭＳＢの各ＦＩＦＯには、空きレジスタ番号の上位２ビットが格納されることとなる。また各ＦＩＦＯの番号はそれぞれ、［00］（＝０）、［01］（＝１）、［10］（＝２）、［11］（＝３）とされている。同図の状態では、供給ポインタの値が［00］となっているため、レジスタ・リネーミングにあたっては［00］番のＦＩＦＯの先頭エントリの値［11］が取り出され、その後ろに供給ポインタの値［00］を連結した［1100］（＝１２）が、命令のデスティネーション・レジスタの物理レジスタ番号として割り当てられることになる。
【００６３】
（分岐予測ミスへの対応）
次に、分岐予測ミスへの対応を考慮した上記実施形態の改良について説明する。
パイプライン・アーキテクチャを採用するプロセッサでは、複数の命令が流れ作業的に同時に実行されるため、分岐命令によって実行される命令の流れが変わってしまうと、既に処理を開始した後続命令をすべて破棄しなければならず、処理効率の低下を招く。こうした分岐による処理効率の低下を軽減するための手法として、分岐予測が行われる。分岐予測は、命令が分岐するか否かを予測し、その予測に従って後続命令を投機的にパイプラインに投入する。こうした分岐予測は、具体的には、分岐命令のそれぞれについて過去の実行時における分岐の有無の履歴を分岐予測バッファに記憶しておき、次回の分岐命令の実行時には、その履歴をもとに分岐先を決定することで行われる。
【００６４】
こうした分岐予測にミスが発生すると、投機的にパイプラインに投入された分岐命令以降の命令のすべてが無効化（フラッシュ）される。このときに無効化された命令に既に物理レジスタ番号が割り当てられていると、上記モジュロ・ソートされた順で物理レジスタ番号が割り当てられなくなってしまう。
【００６５】
図５（ａ）〜（ｃ）には、分岐予測ミス発生時の上記ＭＳＢの動作態様の一例を示す。ここでは、エントリ数が「４」のレジスタ・キャッシュを備えるプロセッサにて分岐命令ｊ２を含む命令列を実行したときの、同図（ａ）は分岐予測ミスの判明前の、同図（ｂ）は予測ミス判明時の、同図（ｃ）は予測ミス判明後のそれぞれにおける、レジスタ・キャッシュ及びＭＳＢの供給ポインタの状態を示している。なお同図（ａ）〜（ｃ）のレジスタ・キャッシュの各エントリの左側に付された数値は、エントリ番号（インデクス）を示している。また命令とレジスタ・キャッシュのエントリとの間の矢印は、命令に割り当てられた物理レジスタ番号とエントリとの対応関係を示している。ちなみに、上記分岐命令ｊ２は、命令ｊ０，ｊ１に引き続き実行され、その分岐先は命令ｊ３，ｊ４のいずれかであるとする。またプロセッサは、分岐命令ｊ２の分岐先を命令ｊ３と予測してこれを投機的に実行するが、正しい分岐先は命令ｊ４であったとする。
【００６６】
さて同図（ａ）に示すように、予測ミスの判明前には、命令ｊ３が投機的に実行されており、命令ｊ０，ｊ１，ｊ３のデスティネーション・レジスタにモジュロ・ソートされた物理レジスタ番号の割り当てが行われている。すなわち、命令ｊ０，ｊ１，ｊ３のレジスタ・キャッシュのインデクスがそれぞれ「０」、「１」、「２」となるように物理レジスタ番号が割り当てられている。ここで同図（ｂ）において、分岐予測ミスが判明すると、投機的にパイプラインに投入された命令ｊ３の処理結果がすべて破棄される。このとき、上記実施形態のＭＳＢでは、供給ポインタの値は「３」のまま保持されるとすると、同図（ｃ）に示すように、分岐命令ｊ２の正しい分岐先である命令ｊ４，ｊ５にはそれぞれ、レジスタ・キャッシュのインデクスが「３」、「０」となる物理レジスタ番号が割り当てられる。そのため、レジスタ・キャッシュのインデクス「２」のエントリに空きがあるにも拘わらず、インデクス「０」のエントリにて競合が発生するようになる。
【００６７】
このように、分岐予測ミスが発生すると、モジュロ・ソートの順に物理レジスタ番号の割り当てが行われなくなることがある。こうした分岐予測ミス発生時の問題を解決するには、分岐予測ミスが判明した時点で、予測をミスした分岐命令のレジスタ・リネーミング時の値まで供給ポインタの値を巻き戻すようにすれば良い。
【００６８】
図６（ａ）〜（ｃ）は、こうした分岐予測ミスの判明に応じた供給ポインタの値の巻き戻しを行う場合の、図５（ａ）〜（ｃ）と同様の状況におけるＭＳＢの動作態様の一例を示している。図６（ａ）に示すように、このときにも分岐予測ミスの判明前には、図５（ａ）の場合と同様に、命令ｊ０，ｊ１，ｊ３にそれぞれレジスタ・キャッシュのインデクスが「０」、「１」、「２」となる物理レジスタ番号の割り当てが行われ、供給ポインタの値は「３」となっている。ただしこの場合、分岐予測ミスが判明すると、図６（ｂ）に示すように分岐予測ミスが判明すると、供給ポインタの値が、予測をミスした分岐命令ｊ２のレジスタ・リネーミング時の値、すなわち命令ｊ３への物理レジスタ番号の割り当て前の値「２」に巻き戻される。その結果、図６（ｃ）に示すように、正しい分岐先である命令ｊ４，ｊ５にはそれぞれ、レジスタ・キャッシュのインデクスが「２」、「３」となる物理レジスタ番号が割り当てられることとなり、先の場合のようなエントリの競合は発生しないようになる。
【００６９】
（複数命令発行対応型ＭＳＢ）
複数のパイプラインを備え、各パイプラインにそれぞれ命令を同時に発行するスーパスカラ・アーキテクチャを採用するプロセッサでは、複数の命令に対するレジスタ・リネーミングが同時に行われる。そのため、こうしたプロセッサに採用されるＭＳＢは、複数の物理レジスタ番号を同時に供給する必要がある。次にそうした複数命令発行に対応可能なＭＳＢの構成について説明する。
【００７０】
図７に、こうした複数命令発行対応型ＭＳＢの構成を示す。同図は、メイン・レジスタ・ファイルのエントリ数が「３２」、レジスタ・キャッシュのエントリ数が「８」、命令発行幅、すなわち同時発行される命令の最大数が「４」のプロセッサに採用されるＭＳＢの一構成例を模式的に示したものである。この場合、物理レジスタ番号は５ビット、レジスタ・キャッシュのエントリ番号及びインデクスは３ビットでそれぞれ表される。またこの場合、物理レジスタ番号の下位３ビットがレジスタ・キャッシュのインデクスと一致するようになる。
【００７１】
このＭＳＢは大きくは、
・  未使用の物理レジスタ番号を保持するＦＩＦＯ、
・  ＦＩＦＯから命令に物理レジスタ番号を供給する供給機構、
・  アクセスしたＦＩＦＯが空のときの処理を行うリストア機構、
・  分岐予測ミスへの対応を行う巻き戻し機構、
を備えて構成されている。
【００７２】
なおこのＭＳＢでは、供給機構が、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファ（ＦＩＦＯ）を、命令のフェッチ順に切り替える上記切替手段に相当する構成となっている。また巻き戻し機構が、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻す、上記巻き戻し手段に相当する構成となっている。
【００７３】
以下、こうした複数命令発行対応のＭＳＢの各部の構成、及びその動作の概要を説明する。
（１）ＦＩＦＯ
このＭＳＢは、それぞれレジスタ・キャッシュのインデクスを同一とする物理レジスタ番号が格納される、ＲＣエントリ数と同数のＦＩＦＯを備えている。各ＦＩＦＯには、格納される物理レジスタ番号の上記インデクスと同じ番号が付されている。図７の構成例では、０番〜７番までの８つのＦＩＦＯが設けられている。
【００７４】
ここでは、上述のハードウェア量をより削減した単一命令発行対応型のＭＳＢ（図４参照）と同様に、物理レジスタ番号の下位Ｂｒビットを除いたビット列をＦＩＦＯに格納するようにしている。なお上述したように「Ｂｒ」は、ＲＣエントリ数のビット長である。この複数命令発行対応型のＭＳＢでは、ＦＩＦＯの各エントリの最上位に、そのエントリが空であるか否かを示すビットを加えるようにしている。ここでは、エントリの最上位ビットの値が［１］であることをもってそのエントリが空の状態、すなわち物理レジスタ番号が保持されていない状態であることを示し、同値が［０］であることをもってそのエントリに有効な物理レジスタ番号が保持されていることを示すようにしている。以下、この最上位ビットをＥフラグ（Empty Flag）と呼ぶ。これにより、ＦＩＦＯからの物理レジスタ番号の読み出しに際して、取得したビット列の最上位ビット（Ｅフラグ）を調べることで、ＦＩＦＯが空であったか否かを容易に確認可能となる。
【００７５】
このため、物理レジスタ番号のビット長を「Ｂｍ」としたとき、ＦＩＦＯの各エントリのビット数は、「（Ｂｍ−Ｂｒ＋１）ビット」となる。ちなみに命令への物理レジスタ番号の割り当てに際しては、そのビット列の末尾にＢｒビットのＦＩＦＯ番号を連結することで、物理レジスタ番号を復元するようにしている。なお以下では、空のＦＩＦＯから読み出した物理レジスタ番号を「無効な物理レジスタ番号」と、空でないＦＩＦＯから読み出した物理レジスタ番号を「有効な物理レジスタ番号」と、それぞれ記載する。
【００７６】
図８に、図７のＭＳＢの構成例におけるＦＩＦＯの物理レジスタ番号の格納態様の一例を示す。同図では、ＦＩＦＯ（０）の先頭及びその次のエントリにそれぞれ物理レジスタ番号「１６」及び「２４」が格納され、以降のエントリは空となっている。この場合、ＲＣエントリ数のビット長が「３」であるため、上記のようにビット長「５」の物理レジスタ番号のうち、その下位３ビットを除いた上位２ビットの先頭に上記Ｅフラグを付加した３ビットのビット列がＦＩＦＯ（０）の各エントリに格納されることとなる。例えば、物理レジスタ番号「１６」（＝［ 10000］）を保持するＦＩＦＯ（０）の先頭のエントリに格納される値は［ 010］となり、物理レジスタ番号「２４」（＝［ 11000］）を保持する次のエントリに格納される値は［ 011］となる。また無効な物理レジスタ番号を保持するエントリの値は［ 1XX］（ここで［Ｘ］は［０］か［１］のいずれか）となる。なお、こうした０番ＦＩＦＯの有効なエントリの値［ 010］，［ 011］のそれぞれについて、末尾にＦＩＦＯ番号「０」（＝［ 000］）を連結するとともに、上記Ｅフラグであるその最上位ビットを取り除けば、格納した物理レジスタ番号「１６」（＝［ 10000］）、「２４」（＝［ 11000］）が復元されるようになる。
【００７７】
（２）供給機構
ＦＩＦＯから命令に物理レジスタ番号を供給するための供給機構は、ＦＩＦＯからのデータを読み出す処理と、読み出したデータを命令に供給する処理とを複数同時並行して行えるようにパイプライン化されている。具体的には、供給機構は、
・  ＦＩＦＯから物理レジスタ番号を読み出すリード回路３０、
・  ＦＩＦＯから読み出した物理レジスタ番号を保持するパイプライン・レジスタ３１、
・  物理レジスタ番号の供給を開始するパイプライン・レジスタ３１のエントリを指示する先頭ポインタ３２、
・  パイプライン・レジスタ３１に保持された物理レジスタ番号を命令に供給するサプライ回路３３、
を備えて構成されている。
【００７８】
リード回路３０は、命令発行幅と同数のリード・ポートＲＰを備えている。ここではリード回路３０の構成の簡易化のため、各リード・ポートＲＰのアクセス可能なＦＩＦＯを限定するようにしている。具体的には、各リード・ポートＲＰはそれぞれ、リード・ポート数で除算したときの剰余が一致する番号のＦＩＦＯに対してのみアクセス可能とされている。なお以下の説明では、各リード・ポートＲＰに対してそのポートがアクセス可能なＦＩＦＯ番号の上記剰余の値を番号として付すとともに、そのｎ番のリード・ポートを「リード・ポートＲＰｎ」と表記する。例えば図７では、リード・ポートＲＰ０はＦＩＦＯ（０）及びＦＩＦＯ（４）に、リード・ポートＲＰ１はＦＩＦＯ（１）及びＦＩＦＯ（５）に、リード・ポートＲＰ２はＦＩＦＯ（２）及びＦＩＦＯ（６）に、リード・ポートＲＰ３はＦＩＦＯ（３）及びＦＩＦＯ（７）に、それぞれアクセス可能とされている。ちなみに、各リード・ポートＲＰ０〜ＲＰ３は、読み出しが行われる都度に、アクセス可能なＦＩＦＯの中からデータを読み出すＦＩＦＯを順に切り替えるようにしている。
【００７９】
パイプライン・レジスタ３１は、上記リード・ポートＲＰと同数の、すなわち命令発行幅と同数のエントリを備えており、各エントリは各リード・ポートＲＰの出力にそれぞれ接続されている。以下、説明のため、パイプライン・レジスタ３１の各エントリについても、対応するリード・ポートＲＰと同じ番号を付すこととする。各エントリには、上記リード・ポートＲＰによってＦＩＦＯのエントリから読み出された値が格納される。
【００８０】
サプライ回路３３は、同時にレジスタ・リネーミングの行われる各命令に対して物理レジスタ番号をそれぞれ出力する、発行命令数と同数の出力バスＯＢを備えている。そしてサプライ回路３３は、パイプライン・レジスタ３１の各エントリから読み出した物理レジスタ番号をそれぞれ出力バスＯＢのいずれかに渡すようにしている。
【００８１】
出力バスＯＢは、パイプライン・レジスタ３１のエントリから渡された物理レジスタ番号を、レジスタ・リネーミングを行う命令に供給する。なお、以下の説明では、物理レジスタ番号を供給する命令のフェッチの順に各出力バスＯＢに番号を付すとともに、「ｎ番」の出力バスＯＢを「出力バスＯＢｎ」と表記する。例えば図７に示されるＭＳＢの状態では、命令ｊ５，ｊ６，ｊ７，ｊ８の順にフェッチされて、同時にレジスタ・リネーミングの行われる４つの命令に対して、出力バスＯＢ０は命令ｊ５に、出力バスＯＢ１は命令ｊ６に、出力バスＯＢ２は命令ｊ７に、出力バスＯＢ３は命令ｊ８に、物理レジスタ番号をそれぞれ出力する。
【００８２】
ここでは構成の簡易化を図るため、パイプライン・レジスタ３１を上記先頭ポインタ３２によって指定されるエントリを先頭とした循環キューとして用い、その循環キュー内の値が出力バスＯＢ上に順次読み出されるように、パイプライン・レジスタ３１の各エントリ０〜３と各出力バスＯＢ０〜ＯＢ３とを接続するようにしている。なおレジスタ・リネーミング後に先頭ポインタ３２の値は、そのときにレジスタ・リネーミングを行った命令数だけ進められる。より具体的には、先頭ポインタ３２の値にレジスタ・リネーミングを行った命令数を加算したものを命令発行幅で除算したときの剰余が、同先頭ポインタ３２の次の値となる。例えば図７に示されるＭＳＢの状態では、先頭ポインタ３２の値が「１」であるため、パイプライン・レジスタ３１の１番のエントリが出力バスＯＢ０に、２番のエントリが出力バスＯＢ１に、３番のエントリが出力バスＯＢ２に、０番のエントリが出力バスＯＢ３に、それぞれ接続される。またこのときのレジスタ・リネーミングを行った命令数は「４」であるため、先頭ポインタ３２の値は「１」に更新される。
【００８３】
ちなみに、プロセッサの初期状態では、パイプライン・レジスタ３１のエントリはすべて空となっている。そのため、初期化処理として、リード・ポートＲＰに接続されたＦＩＦＯのうちで番号の最も小さいものの先頭エントリから物理レジスタ番号を読み出してパイプライン・レジスタ３１の各エントリに書き込むとともに、先頭ポインタ３２の値を「０」にセットする処理を行う。この状態では、パイプライン・レジスタ３１に格納された各物理レジスタ番号は、先頭ポインタ３２の指す０番のエントリを先頭としてモジュロ・ソートされた状態となっている。その後、レジスタ・リネーミングが行われる都度、パイプライン・レジスタ３１から先頭ポインタ３２の指すエントリを先頭として、必要な数の物理レジスタ番号が同時に読み出され、命令に供給される。そして物理レジスタ番号が読み出されて空となったパイプライン・レジスタ３１のエントリには、対応するリード・ポートＲＰに接続されたＦＩＦＯから読み出された物理レジスタ番号が書き込まれるようになる。
【００８４】
（３）リストア機構
次に、上記サプライ回路３３によるパイプライン・レジスタ３１のエントリへの物理レジスタ番号の書き込みに際して、アクセスされたＦＩＦＯが空のときの処理を行うリストア機構について説明する。この機構は、パイプライン・レジスタ３１から読み出した物理レジスタ番号の中に、最上位ビットが［１］のもの、すなわち空のＦＩＦＯから読み出された上記無効な物理レジスタ番号が含まれていると、その物理レジスタを供給しようとした命令以降のレジスタ・リネーミングの処理をその時点で無効化させる。そして次サイクル以降は、パイプライン・レジスタ３１とバックアップ・レジスタ３４との双方へのアクセスを通じて、最上位ビットが［０］の有効な物理レジスタ番号の読み出しを試みる。
【００８５】
図７に示すように、この機構は、バックアップ・レジスタ３４、ローテーション・バス３５及びサプライ・バス３６を備えて構成されている。
バックアップ・レジスタ３４は、各出力バスＯＢ０〜ＯＢ３に渡された値をそれぞれ格納する、命令発行幅と同数のエントリを備えている。この出力バスＯＢ０〜ＯＢ３からバックアップ・レジスタ３４の各エントリへの値の受け渡しは、命令発行幅と同数設けられたサプライ・バス３６を通じて行われる。以下説明のため、バックアップ・レジスタ３４の各エントリに、対応する出力バスＯＢの番号と同じ番号を付すこととする。
【００８６】
ローテーション・バス３５は、バックアップ・レジスタ３４の各エントリの値を、番号が１つ小さいエントリへと移行するためのバスとなっている。ただしバックアップ・レジスタ３４の「０番」のエントリの値は、番号の最も大きいエントリに移行されるようになっている。
【００８７】
サプライ・バス３６は、バックアップ・レジスタ３４の各エントリの値を、レジスタ・リネーミングされる各命令に渡すためのバスとなっている。なおこのサプライ・バス３６は、フェッチ順に整列された命令列の先頭から、バックアップ・レジスタ３４の１番のエントリから順番に物理レジスタ番号を供給するように構成されている。したがって、サプライ・バス３６の２番エントリからはフェッチ順が２番目の命令に、１番エントリからはフェッチ順が１番の命令にそれぞれ物理レジスタ番号が供給されるようになる。またバックアップ・レジスタ３４の「０番」のエントリからは、フェッチ順で最後の命令に物理レジスタ番号が供給されるようになっている。
【００８８】
こうした機構には、バックアップ状態とリストア状態との２つの状態があり、状態に応じて異なった動作を行う。プロセッサの初期化時には、機構の状態はバックアップ状態にセットされる。
【００８９】
バックアップ状態では、パイプライン・レジスタ３１からフェッチの順に命令へと供給される物理レジスタ番号を、バックアップ・レジスタ３４に順次保存していく。このときに保存される物理レジスタ番号に、空のＦＩＦＯから読み出された無効な番号が含まれていれば、その番号を供給しようとした命令以降のレジスタ・リネーミングの結果を無効化させるとともに、先頭ポインタ３２の値を１つだけ進める。そして機構の動作状態をリストア状態に遷移させる。
【００９０】
リストア状態では、レジスタ・リネーミングを行う命令のうち、フェッチ順で一番後の命令を除くその他の命令には、バックアップ・レジスタ３４から読み出された物理レジスタ番号がサプライ・バス３６を通じて供給される。すなわち、これらの命令には、本来は前サイクルにおいてフェッチ順で次の命令に供給される予定であった物理レジスタ番号が供給されることになる。このとき同時に、ローテーション・バス３５を通じて、ここで物理レジスタ番号を供給したバックアップ・レジスタ３４のエントリの値が１つ前の番号のエントリに、すなわち供給された命令に対応するエントリに書き込まれる。
【００９１】
一方、フェッチ順で一番後の命令には、パイプライン・レジスタ３１から物理レジスタ番号を供給する。ただし、このときには、上述したように先頭ポインタ３２の値が１つ進められていることから、前サイクルで同命令に供給される予定だったパイプライン・レジスタ３１のエントリではなく、その次のエントリから物理レジスタ番号の供給が行われる。この物理レジスタ番号は、それが供給された命令に対応するバックアップ・レジスタ３４のエントリに保存される。
【００９２】
こうして命令に供給された物理レジスタ番号の中に、無効な番号が含まれていなければ、機構の動作状態をバックアップ状態に復帰させる。一方、無効な番号が再び含まれていれば、その無効な番号を供給しようとした命令以降のレジスタ・リネーミングの結果を再度無効化させ、先頭ポインタ３２の値を再び１つ分だけ進める。このときには機構の動作状態はリストア状態にそのまま維持され、再び上記のようなパイプライン・レジスタ３１とバックアップ・レジスタ３４との双方へのアクセスを通じた物理レジスタ番号の供給が行われることになる。
【００９３】
以上のように構成された供給機構及びリストア機構の動作を、図９を併せ参照して説明する。ここでは、ＲＣエントリ数が「８」、命令発行幅が「４」、パイプラインがフェッチ、デコード、実行、ライトバック及びコミットの４ステージ構成のプロセッサで、命令ｊ０〜ｊ７のプログラムを実行する場合のＭＳＢの動作を例として説明する。
【００９４】
・初期状態：  図９（ａ）は、上記プログラムの実行前のＦＩＦＯの状態を示している。同図の状態では、ＦＩＦＯ全体には、「０」〜「４」、「６」、「８」〜「１２」、「１４」の各物理レジスタ番号が保持されている。この状態では、下位３ビットの値が「５」及び「７」となる物理レジスタ番号がＦＩＦＯ全体に存在しないため、５番及び７番のＦＩＦＯは空の状態となっている。
【００９５】
・１サイクル目：  図９（ｂ）に、プログラム開始後の最初のサイクルにおけるＭＳＢの状態を示す。プログラムが開始されると、まずはパイプライン・レジスタ３１及び先頭ポインタ３２の初期化が行われる。この初期化によって先頭ポインタ３２の値は「０」にリセットされる。またリード・ポートＲＰ０〜ＲＰ３毎に、接続されるＦＩＦＯの内で番号の最も小さいＦＩＦＯの先頭エントリから、物理レジスタ番号が読み出され、パイプライン・レジスタ３１の各エントリに書き込まれる。すなわち、リード・ポートＲＰ０では、０番のＦＩＦＯの先頭エントリから物理レジスタ番号「０」が読み出され、パイプライン・レジスタ３１の０番エントリに書き込まれる。同様にリード・ポートＲＰ１〜ＲＰ３ではそれぞれ、１番〜３番のＦＩＦＯの先頭エントリに保持された物理レジスタ番号「１」、「２」、「３」が読み出され、パイプライン・レジスタ３１の１番〜３番のエントリに書き込まれる。
【００９６】
・２サイクル目：  図９（ｃ）に、プログラム開始から２サイクル目におけるＭＳＢの状態が示されている。この２サイクル目には、命令ｊ０〜ｊ２への物理レジスタ番号の供給が行われる。このときの先頭ポインタ３２の値は「０」、レジスタ・リネーミングを行う命令数は「３」であるため、パイプライン・レジスタ３１の０番〜２番のエントリから物理レジスタ番号「０」、「１」、「２」がそれぞれ読み込まれ、命令ｊ０〜ｊ２にそれぞれ供給される。また、このときに読み込まれた物理レジスタ番号「０」、「１」、「２」は、バックアップ・レジスタ３４の０番〜２番のエントリにもそれぞれ書き込まれる。一方、ここで物理レジスタ番号の読み出されたパイプライン・レジスタ３１の０番〜２番のエントリにはそれぞれ、４番〜６番のＦＩＦＯの先頭エントリから読み出された新たな物理レジスタ番号が書き込まれる。ただし、上述しように５番のＦＩＦＯは空であるため、パイプライン・レジスタ３１の１番のエントリには、最上位のビットが「１」の無効な物理レジスタ番号が書き込まれる。同図では、そうした無効な物理レジスタ番号の値を「空」と表記する。なお先頭ポインタ３２の値は、このときに物理レジスタ番号を供給した命令数分、すなわち３つ分進められ、「３」となる。
【００９７】
・３サイクル目：  図９（ｄ）に、プログラム開始から３サイクル目におけるＭＳＢの状態を示す。この３サイクル目には、命令ｊ３及び命令ｊ４への物理レジスタ番号の供給が行われる。このときの先頭ポインタ３２の値は「３」、レジスタ・リネーミングを行う命令数は「２」であるため、パイプライン・レジスタ３１の３番及び０番のエントリから物理レジスタ番号「３」及び「４」が読み出され、命令ｊ３及び命令ｊ４にそれぞれ供給される。またそれらの物理レジスタ番号「３」及び「４」は、バックアップ・レジスタ３４の０番及び１番のエントリにもそれぞれ書き込まれる。更に物理レジスタ番号の読み出されたパイプライン・レジスタ３１の３番及び０番のエントリにはそれぞれ、７番及び０番のＦＩＦＯの先頭エントリから読み出された物理レジスタ番号が書き込まれる。ただし、このときのパイプライン・レジスタ３１の３番のエントリには、空の７番のＦＩＦＯから読み出された無効な物理レジスタ番号が書き込まれることとなる。なお先頭ポインタ３２の値は、２つ分進められ、「１」となる。
【００９８】
・４サイクル目：  図９（ｅ）に、プログラム開始から４サイクル目におけるＭＳＢの状態を示す。この４サイクル目には、命令ｊ５〜ｊ７への物理レジスタ番号の供給が行われる。このときの先頭ポインタ３２の値は「１」、レジスタ・リネーミングを行う命令数は「３」であるため、１番〜３番の各エントリから物理レジスタ番号がそれぞれ命令ｊ５〜ｊ７に供給されるとともに、バックアップ・レジスタ３４の０番〜２番のエントリに書き込まれる。ただし、このときには、命令ｊ５に無効な物理レジスタ番号が出力されるため、バックアップ・レジスタ３４をリストア状態に移行する。これにより、命令ｊ５以降のレジスタ・リネーミングの結果は無効化され、先頭ポインタ３２の値が１つ進められる。なおこのときに物理レジスタ番号の読み出しの行われたパイプライン・レジスタ３１の１番〜３番の各エントリには、１番〜３番のＦＩＦＯの先頭エントリから物理レジスタ番号「９」、「１０」、「１１」がそれぞれ書き込まれる。
【００９９】
・５サイクル目：  図９（ｆ）に、プログラム開始から５サイクル目におけるＭＳＢの状態を示す。この５サイクル目には、先に無効な物理レジスタ番号が供給された命令ｊ５以降に対する物理レジスタ番号が再試行される。同図に示すように、このときの先頭ポインタ３２の値は「２」となっているため、パイプライン・レジスタ３１の０番のエントリから読み出された物理レジスタ番号「１２」が、このときのレジスタ・リネーミングにおける最後尾の命令ｊ７に供給されるとともに、バックアップ・レジスタ３４の２番目のエントリに書き込まれる。一方、残りの命令ｊ５及び命令ｊ６には、バックアップ・レジスタ３４の１番及び２番のエントリから物理レジスタ番号「６」及び「空」がそれぞれ供給される。命令ｊ５及び命令ｊ６に供給された物理レジスタ番号は、バックアップ・レジスタ３４の０番及び１番のエントリに書き込まれる。この結果としてバックアップ・レジスタ３４の１番及び２番のエントリに格納された物理レジスタ番号は、それぞれ番号の１つ前の０番及び１番のエントリに移行されることになる。ただし、このときの命令ｊ６には、無効な物理レジスタ番号が出力されることになるため、バックアップ・レジスタ３４はリストア状態に維持されることとなり、命令ｊ６移行のレジスタ・リネーミングの結果が無効化され、先頭ポインタ３２の値が１つ進められる。
【０１００】
・６サイクル目：  図９（ｇ）に、プログラム開始から６サイクル目におけるＭＳＢの状態を示す。この６サイクル目には、未だ処理の完了していない命令ｊ６及び命令ｊ７に対するレジスタ・リネーミングが再び実行される。同図に示すように、このときの先頭ポインタ３２の値は「３」となっているため、ここでレジスタ・リネーミングを行う最後尾の命令ｊ７には、パイプライン・レジスタ３１の１番のエントリから読み出された物理レジスタ番号「９」が供給される。またその物理レジスタ番号「９」は、バックアップ・レジスタ３４の２番エントリにも書き込まれる。一方、残りの命令ｊ６には、バックアップ・レジスタ３４の２番エントリから物理レジスタ番号「１２」が供給され、その値はバックアップ・レジスタ３４の１番エントリにも書き込まれる。このときには命令に対する無効な物理レジスタ番号の供給は行われなかったため、バックアップ・レジスタ３４をバックアップ状態に復帰させる。なおこのときの先頭ポインタ３２の値は、物理レジスタ番号の供給を行った命令数「３」だけ進められ、「２」となる。
【０１０１】
（４）巻き戻し機構
このＭＳＢでも、分岐予測ミスが発生したときには、ＭＳＢの状態、すなわち先頭ポインタ３２の値や各リード・ポートＲＰが次にアクセスするＦＩＦＯの番号、パイプライン・レジスタ３１の状態を、その発生以前の状態に巻き戻すようにしている。
【０１０２】
ここでは、こうした状態の巻き戻しを行うため、分岐命令のレジスタ・リネーミングを行う都度、その分岐命令に対して再開ポイントを渡すようにしている。再開ポイントの値は、分岐命令の次にフェッチされる命令に対して物理レジスタ番号を供給するＦＩＦＯの番号とされている。この値（ＦＩＦＯ番号）は、分岐命令のレジスタ・リネーミング時において最後に供給の行われた物理レジスタ番号の下位「Ｂｒビット」の値に「１」を加算して得ることができる。こうした再開ポイントの受け渡しは、実際に分岐を実行するまでに処理すれば良いため、プログラムの実行速度に影響を与えることなくその処理を実行することが可能である。
【０１０３】
巻き戻し機構は、分岐予測ミスが発生すると、まずＭＳＢのパイプライン・レジスタ３１のフラッシュと、各リード・ポートＲＰ０〜ＲＰ３の状態のリセットとが行われる。そして、分岐予測をミスした分岐命令の保持する再開ポイントの値を用いて、各リード・ポートＲＰ０〜ＲＰ３の状態と先頭ポインタ３２の値とを巻き戻す。具体的には、再開ポイントの値の指し示す番号から命令発行数分の番号のＦＩＦＯに対して、各リード・ポートＲＰ０〜ＲＰ３のアクセスが再開されるようにそれらの状態をセットする。また、再開ポイントの値の指し示す番号のＦＩＦＯが接続される出力バスＯＢの番号を先頭ポインタ３２の値にセットする。これにより、再開ポイントの指示するＦＩＦＯから、物理レジスタ番号の供給を再開することができる。これらの処理後、ＦＩＦＯから物理レジスタ番号が読み出され、空のパイプライン・レジスタ３１に書き込まれる。
【０１０４】
（５）各部の回路構成の詳細
続いて、以上説明した複数命令発行対応型ＭＳＢの各部の具体的な回路構成について説明する。
【０１０５】
５−１  リード回路
まず、上記供給機構のリード回路３０の詳細な回路構成を、図１０を併せ参照して説明する。図１０は、リード回路３０における０番のリード・ポートＲＰ０の周辺部分の回路構成を示している。上述したようにリード・ポートＲＰ０は、ＦＩＦＯ［ 000］及びＦＩＦＯ［ 100］のいずれかから物理レジスタ番号を受け取り、パイプライン・レジスタ３１の０番エントリに出力する。なお同図に記載の数値はすべて２進数で表記されている。
【０１０６】
各ＦＩＦＯのエントリは、これに格納される物理レジスタ番号の上位（Ｂｍ−Ｂｒ）ビット及びその最上位に付加されるＥフラグの各ビットの値をそれぞれ保持する（Ｂｍ−Ｂｒ＋１）個のメモリ・セル４０をそれぞれ備えて構成されている。ＦＩＦＯの各エントリの同桁のメモリ・セル４０同士は、それぞれパス・トランジスタ４１を介してエントリ順に直列に接続されている。更にＦＩＦＯの先頭エントリでは、各メモリ・セル４０の出力がパス・トランジスタ４２を介してリード・ポートＲＰに接続されている。
【０１０７】
また各ＦＩＦＯには、その各エントリの値を出力側に１段シフトさせるためのシフト・フラグの状態を保持するメモリ・セルＳと、ＦＩＦＯからリード・ポートＲＰに値を読み出させるためのリード・フラグの状態を保持するメモリ・セルＲとがそれぞれ設けられている。メモリ・セルＳの出力はＦＩＦＯのエントリ間の各パス・トランジスタ４１のゲートに、メモリ・セルＲの出力はＦＩＦＯの先頭エントリ＝出力バスＯＢ間の各パス・トランジスタ４２のゲートに、それぞれ接続されている。またメモリ・セルＲの出力はＡＮＤゲート４３にも接続されている。ＡＮＤゲート４３には、メモリ・セルＲの出力に加え、読み出し信号S-readが入力されており、その出力はメモリ・セルＳに入力されている。一方、メモリ・セルＲには、自身のＦＩＦＯのＡＮＤゲート４３の出力を選択制御信号S-selectとし、論理レベルの信号［０］と、同じリード・ポートＲＰに接続された、読み出し順の一つ早いＦＩＦＯのＡＮＤゲート４３の出力と、をそれぞれ入力信号Ａ１，Ａ２とする２入力のマルチプレクサ（ｍｕｘ）４４の出力が入力されている。ちなみにこのマルチプレクサ４４は、選択制御信号S-selectが［１］のとき［０］（入力信号Ａ１）を、同選択制御信号S-selectが［０］のとき上記読み出し順の一つ早いＦＩＦＯのＡＮＤゲート４３の出力（入力信号Ａ２）をそれぞれ選択して出力するよう構成されている。
【０１０８】
さて図１０の構成例では、物理レジスタ番号のビット長Ｂｍが「５」、ＲＣエントリ数のビット長が「３」であるため、物理レジスタ番号の上位２ビットの最上位にＥフラグを付加した３ビットの値が、ＦＩＦＯの各エントリに保持される。そのため、ＦＩＦＯの各エントリは３個のメモリ・セル４０で構成されている。このようなＦＩＦＯの各エントリの保持するビット列の末尾にＦＩＦＯ番号を連結することで、物理レジスタ番号を復元することができる。
【０１０９】
ここで命令発行幅の２進数表記におけるビット長を「Ｂｉ」とすると、ＦＩＦＯ番号の下位Ｂｉビットは、ＦＩＦＯの接続されるリード・ポートＲＰの番号と等しく、パイプライン・レジスタ３１の各エントリに保持される物理レジスタ番号の下位Ｂｉビットはそれぞれ固定されている。そのため、ＦＩＦＯからパイプライン・レジスタ３１へと、ＦＩＦＯ番号の下位Ｂｉビットをわざわざ伝送する必要はない。そこでここでは、ＦＩＦＯ番号の下位Ｂｉビットを除いた値のみを付加することとする。例えば図１０の構成では、ＲＣエントリ数のビット長Ｂｒが「３」、命令発行幅のビット長Ｂｉが「２」のため、ＦＩＦＯ番号の上位１ビットを、ＦＩＦＯの先頭エントリから読み出したビット列の末尾に付加するようにしている。これにより、リード・ポートＲＰの配線数を減らすことができる。具体的には、このときの各リード・ポートＲＰの配線数はそれぞれ「（Ｂｍ−Ｂｉ＋１）本」となる。
【０１１０】
こうした「（Ｂｍ−Ｂｉ＋１）本」の配線のうちの１本は、物理レジスタ番号のＥフラグに、残りは物理レジスタ番号の上位「（Ｂｍ−Ｂｉ）ビット」のビット列における各ビットに、それぞれ対応する。各配線には、その配線がチャージ状態にあるか、ディスチャージ状態にあるかを検出する検出回路４５が設けられており、その検出結果がパイプライン・レジスタ３１の対応するエントリに送られるようになっている。
【０１１１】
ちなみに、ＦＩＦＯ番号の上位「（Ｂｒ−Ｂｉ）ビット」の値は、ＦＩＦＯ毎に固定された定数であるため、数値に応じてパス・トランジスタ４２を電源Ｖｃｃ又はグランドＧＮＤに接続するようにすればよい。例えば図１０の場合、リード・ポートＲＰ０は、４本の配線Ｌ０〜Ｌ３により構成されている。Ｅフラグに対応する配線Ｌ０、物理レジスタ番号の上位２ビットに対応する配線Ｌ１及び配線Ｌ２は、上記パス・トランジスタ４２を介してＦＩＦＯ［ 000］及びＦＩＦＯ［ 100］の先頭エントリの各メモリ・セルの出力にそれぞれ接続されている。一方、物理レジスタ番号の上位から３ビット目、すなわちＦＩＦＯ番号の上位１ビットに対応する配線Ｌ３は、パス・トランジスタ４２を介して、ＦＩＦＯ［ 000］ではグランドＧＮＤに、ＦＩＦＯ［ 100］では電源Ｖｃｃにそれぞれ接続されている。
【０１１２】
次にこうしたリード回路３０の動作を説明する。
そのＦＩＦＯのリード・フラグの値が「１」の場合、パス・トランジスタ４２が導通し、そのＦＩＦＯの先頭エントリの値に応じてリード・ポートＲＰの各配線Ｌ０〜Ｌ３がチャージ或いはディスチャージされる。そして各配線Ｌ０〜Ｌ３のチャージ／ディスチャージ状態が検出回路４５にて検出され、増幅された上でパイプライン・レジスタ３１の対応するエントリに伝送される。なおパス・トランジスタ４２だけでは、配線のチャージ、ディスチャージを十分高速に行えないような場合には、パス・トランジスタ４２のＦＩＦＯ側にインバータを配置すると良い。
【０１１３】
一方、そのＦＩＦＯのリード・フラグの値が「１」であるときに、そのＦＩＦＯの接続されたリード・ポートＲＰに対する読み出し信号S-readがアサートとなると、そのＦＩＦＯのシフト・フラグが「１」にセットされる。これとともに、そのＦＩＦＯのリード・フラグの値が「０」にリセットされるとともに、同じリード・ポートＲＰに接続された、読み出し順が次のＦＩＦＯのリード・フラグが「１」にセットされる。
【０１１４】
シフト・フラグが「１」となると、そのＦＩＦＯのメモリ・セル４０間のパス・トランジスタ４１が導通され、各エントリのメモリ・セルは、保持中の値を次段のメモリ・セルに受け渡す。これにより、ＦＩＦＯの各エントリの値は出力側のエントリに１段シフトされる。なお、シフト・フラグのセット後、そのＦＩＦＯのリード・フラグはリセットされるため、ＦＩＦＯの各エントリの値をシフトした後、シフト・フラグは「０」にリセットされる。
【０１１５】
ちなみに、以上のようなリード回路３０の回路構成では、同じリード・ポートＲＰに接続されるＦＩＦＯのリード・フラグの動作回路（メモリ・セルＲ、ＡＮＤゲート４３、マルチプレクサ４４）を、読み出し順に周巡するように直列接続する必要がある。このとき、ＦＩＦＯを単純に番号順に並べて配置すると、リード・フラグの動作回路間の配線長が不必要に長くなってしまう。例えば、あるリード・ポートＲＰｉに接続されるＦＩＦＯの番号が「ａ＋ｊ・ｂ」で表されるとする。ここで「ａ」は、リード・ポートＲＰｉに接続されるＦＩＦＯのうちで最も番号の小さいＦＩＦＯの番号、「ｂ」はＲＣエントリ数、「ｊ」は、そのリード・ポートＲＰに接続されるＦＩＦＯの総数を「ｎ」としたときの「０」から「ｎ−１」までの整数のいずれかである。
【０１１６】
ここで物理レジスタ番号の読み出しがＦＩＦＯ番号の小さい順に行われるとし、図１１（ａ）に示すように各ＦＩＦＯを単純に番号順に並べて設置すると、番号順で先頭の「ａ」番のＦＩＦＯと末尾の「ａ＋（ｎ−１）・ｂ」番のＦＩＦＯとのリード・フラグの動作回路（メモリ・セルＲ等）同士を繋ぐ配線が他のリード・フラグの動作回路間の配線に比して著しく長くなる。そしてその結果、末尾のＦＩＦＯから先頭のＦＩＦＯへの読み出しの切り替えに遅延が生じる虞がある。
【０１１７】
一方、図１１（ｂ）では、ＦＩＦＯ番号の最小のものから番号順で「ｎ／２」番目までのＦＩＦＯを番号昇順に一つおきに配置するとともに、空きの部分に残りのＦＩＦＯを番号降順で配置するようにしている。このようにすれば、リード・フラグの動作回路（メモリ・セル等）を互いに接続するＦＩＦＯは、１つおきに、或いは互いに隣接して配置されることとなり、配線長が極端に長い部分は形成されないようになる。
【０１１８】
なお、以上説明したリード回路３０の回路構成は、ＦＩＦＯの総数が命令発行幅よりも大きく、各リード・ポートＲＰに複数のＦＩＦＯが接続される場合を示している。ＦＩＦＯの総数と命令発行幅とが一致する場合には、ＦＩＦＯの先頭エントリとパイプライン・レジスタ３１とを直接接続するとともに、ＦＩＦＯの各エントリの物理レジスタ番号をシフトする制御信号として読み出し信号S-readを用いるようにリード回路３０を構成することができる。この場合、リード回路３０の規模は大幅に小さくなる。
【０１１９】
５−２  サプライ回路
図１２は、パイプライン・レジスタ３１に保持された物理レジスタ番号を出力バスＯＢ０〜ＯＢ３に供給するサプライ回路３３の回路構成を示している。同図では、一部の配線やポート・トランジスタ等が省略されている。
【０１２０】
同図に示すようにサプライ回路３３は、先頭ポインタ３２の保持する値を入力とするデコーダ５０を備えている。具体的には、パイプライン・レジスタ３１の各エントリの出力は、それぞれパス・トランジスタ５１を介して各出力バスＯＢ０〜ＯＢ３に接続されており、パス・トランジスタ５１のゲートには、デコーダ５０の出力線が接続されている。出力バスＯＢ０〜ＯＢ３の各配線は、そのチャージ状態を検出する検出回路５２に接続されており、その検出回路５２の検出結果は増幅された上で、命令に物理レジスタ番号を供給するための出力ドライバ（同図では図示略）に渡されるようになっている。
【０１２１】
さて先頭ポインタ３２の値が入力されるとデコーダ５０は、パイプライン・レジスタ３１の各エントリの値がそれぞれ、先頭ポインタ３２の値に応じた適切な出力バスＯＢ０〜ＯＢ３に渡されるように、適切なパス・トランジスタ５１を選択してこれを導通させる。これにより、パイプライン・レジスタ３１の各エントリの値に応じて出力バスＯＢ０〜ＯＢ３の各配線がチャージ／ディスチャージされる。出力バスＯＢ０〜ＯＢ３の各配線のチャージ状態は、検出回路５２にて検出、増幅されて上記出力ドライバに送られる。このとき、出力バスＯＢ０〜ＯＢ３の各配線のチャージ／ディスチャージをパス・トランジスタ５１だけでは十分高速に行えないのであれば、パス・トランジスタ５１のパイプライン・レジスタ３１側にインバータを設置すると良い。
【０１２２】
なお、パイプライン・レジスタ３１の各エントリの下位Ｂｉビットは、パイプライン・レジスタ３１のエントリ番号と同じ値に常に固定されている。そのため、そうしたビット列に対応するパイプライン・レジスタ３１の出力線は省略し、パス・トランジスタ５１をエントリ番号に応じて電源Ｖｃｃ又はグランドＧＮＤに接続するようにすれば、パイプライン・レジスタ３１の出力線数を削減することができる。
【０１２３】
ちなみに、先頭ポインタ３２の値によってデコーダ５０の導通させるパス・トランジスタ５１の組合せは一義的に決まるため、デコーダ５０は１つだけでもサプライ回路３３を十分に機能させることは可能である。ただし、そうした場合には、デコーダ５０の配線が同時に駆動するパス・トランジスタ５１の数が多くなってしまい、パス・トランジスタ５１の動作速度の確保が困難となってしまう虞がある。こうした問題は、出力バスＯＢ毎、或いはパイプライン・レジスタ３１のエントリ毎に先頭ポインタ３２及びデコーダ５０をそれぞれ設置し、駆動するパス・トランジスタ５１をそれぞれに分担させることで解消することができる。
【０１２４】
図１３（ａ）に、このように先頭ポインタ及びデコーダを多重化した場合のサプライ回路３３の構成例を示す。なお同図では、０番以外の出力バスＯＢ１〜ＯＢ３はその図示が省略されている。同図の構成例では、出力バスＯＢ０〜ＯＢ３のそれぞれについて、先頭ポインタ３２Ａ〜３２Ｄ及びデコーダ５０Ａ〜５０Ｄが個別に設置されており、各デコーダ５０Ａ〜５０Ｄは、それぞれ対応する出力バスＯＢに接続されたパス・トランジスタ５１のみを駆動するように構成されている。なお、それぞれの先頭ポインタ３２Ａ〜３２Ｄには、すべて同じ値が供給されるようになっている。このように構成すれば、回路構成が冗長とはなるが、個々のデコーダ５０Ａ〜５０Ｄが同時に駆動するパス・トランジスタ５１の数を抑えることができ、それらの駆動速度を容易に確保することが可能となる。
【０１２５】
図１３（ｂ）には、デコーダ５０ＡをＮＯＲ型デコーダとして構成したときのデコーダ内部の回路構成が示されている。このように多重化したときの各デコーダ５０Ａ〜５０Ｄの構成は極単純なものとすることができる。ちなみにこのときの各デコーダ５０Ａ〜５０Ｄの出力線が同時に駆動するパス・トランジスタは、各出力バスＯＢ０〜ＯＢ３の配線数と同数となる。
【０１２６】
５−３  バックアップ・レジスタ
続いてバックアップ・レジスタ３４の詳細な回路構成について説明する。図１４は、バックアップ・レジスタ３４の３番エントリ及びその周辺部分の回路構成を示している。
【０１２７】
バックアップ・レジスタ３４の各エントリは、物理レジスタ番号の各ビットをそれぞれ記憶・保持する複数のメモリ・セル５５を備えて構成されている。各メモリ・セル５５は、出力バスＯＢから検出回路５２（図１２参照）を介して受け取った値を出力ドライバ５６に受け渡すためのサプライ・バス３６に、パス・トランジスタ５７を介して接続されている。このパス・トランジスタ５７のゲートには、ローテーション信号が入力されており、同ローテーション信号が論理レベルの信号「０」のときにそのソース・ドレインが導通されるようになっている。
【０１２８】
また各エントリのメモリ・セル５５は、ローテーション・バス３５を介して、一つ小さい番号のエントリの同桁のメモリ・セル５５にそれぞれ接続されている。ただし、０番エントリの各メモリ・セル５５は、ローテーション・バス３５を介して最後尾の番号のエントリの同桁のメモリ・セル５５に接続されている。ローテーション・バス３５上には、パス・トランジスタ５８が設けられており、物理レジスタ番号を受け取るエントリのローテーション信号が論理レベルの信号「１」のときに導通される。
【０１２９】
ローテーション信号は、バックアップ・レジスタ３４のエントリ毎に個別に供給されている。このローテーション信号が論理レベルの信号「０」のときには、出力バスＯＢとメモリ・セル５５との間のパス・トランジスタ５７が導通されて、出力バスＯＢ上の値がメモリ・セル５５に書き込まれる。一方、ローテーション信号が論理レベルの信号「１」のときには、ローテーション・バス３５上のパス・トランジスタ５８が導通されて、番号の一つ小さいエントリの値がメモリ・セル５５に書き込まれる。またこのときには、ローテーション・バス３５上の値が出力ドライバ５６にも供給される。なお、バックアップ・レジスタ３４がバックアップ状態で動作しているときには、各エントリのローテーション信号はすべて論理レベルの信号「０」となる。一方、リストア状態で動作しているときには、フェッチ順で一番後の命令に対応するエントリのローテーション信号は論理レベルの信号「０」に、それ以外のエントリのローテーション信号は論理レベルの信号「１」となる。
【０１３０】
５−４  プロセッサの動作周波数への影響
続いて、ＭＳＢがプロセッサの動作周波数に与える影響について検討する。ＭＳＢの導入されたプロセッサには、ＭＳＢとダイレクト・マップ方式のレジスタ・キャッシュとが搭載されている。ここでＭＳＢの遅延時間が、レジスタ・キャッシュの遅延時間よりも短ければ、少なくともプロセッサの動作周波数に対する悪影響は無いと判断することができる。なお、ランダム・アクセルを行うレジスタ・キャッシュに対して、ＭＳＢではＦＩＦＯ順に規則正しいアクセスを行うため、パイプライン化や回路構成の簡易化が容易である。ちなみに上述した回路構成では、ＭＳＢは、ＦＩＦＯからパイプライン・レジスタ３１に値を受け渡す第１ステージと、パイプライン・レジスタ３１から出力ドライバ５６に値を受け渡す第２ステージとの２ステージにパイプライン化されている。またＭＳＢは、保持する値（物理レジスタ番号）のビット長や１命令当たりに必要とされるリード・ポート数がレジスタ・キャッシュよりも少ないため、必要な配線規模が小さくなる。そのため、ＭＳＢの遅延時間をレジスタ・キャッシュの遅延時間よりも短くすることは比較的容易に行える。
【０１３１】
ちなみに、上述した複数命令発行型ＭＳＢを導入したプロセッサについて、ＭＳＢ及びレジスタ・キャッシュの遅延時間を解析的に見積もった結果によれば、ＭＳＢの遅延時間はレジスタ・キャッシュの遅延時間よりも短くなることが確認されている。この遅延時間の解析は、レジスタ・キャッシュ及びＭＳＢのそれぞれについて遅延時間を決定する要素（ゲート段数、配線長、配線に接続されたトランジスタ数）を、それぞれ比較検討することで行われている。この解析結果によれば、ＭＳＢの各ステージにおけるゲート段数、配線長、配線に接続されたトランジスタ数はいずれも、レジスタ・キャッシュのものよりも小さく、ＭＳＢの導入は、プロセッサの動作周波数を低下させる要因にはならないことが確認されている。
【０１３２】
（７）  ＭＳＢの評価
続いて、以上説明した本実施形態のプロセッサの性能評価の結果を説明する。発明者等は、スーパスカラ・プロセッサ用のシミュレータ（Simple Scalar Tool Set）に、階層型レジスタ・ファイルと後述の４つのレジスタ管理方式のいずれかとを組み込んで、表１に示される条件で評価を行っている。この評価には、「MIPS R100000」の拡張命令セットである「Simple Scalar/PISA」が使用されている。またこの評価には、ベンチマーク・プログラムとして、「SPECint2000 」の「bzip2 」、「gcc 」、「gzip」、「mcf 」、「paser 」、「perl」、「votex 」、及び「vpr 」の８つのプログラムが使用されている。なお「gcc 」では、最初の１ギガ個の命令を、他のプログラムでは最初の２ギガ個の命令をスキップさせた後、１００メガ個の命令を実行した。
【０１３３】
【表１】
2007304663.tif 000003
この評価は、レジスタ管理態様のそれぞれ異なる次の４つのプロセッサ・モデルについて行われている。すなわち、
・「ＤＭモデル」：  従来の一般的なダイレクト・マップ方式のレジスタ・キャッシュを採用するモデル、
・「ＭＳＢモデル」：  ダイレクト・マップ方式のレジスタ・キャッシュを用い、上述したＭＳＢによりモジュロ・ソートを行った上で命令への物理レジスタ番号の割り当てを行うモデル、
・「ＭＳＢ−ｒモデル」：  上記ＭＳＢモデルに上述の巻き戻し機構を追加し、分岐予測ミス時にＭＳＢの状態の巻き戻しを行うモデル、
・「ＬＲＵモデル」：  ＬＲＵ方式のレジスタ・キャッシュを用いるモデル、
の４つのモデルを評価対象としている。
【０１３４】
いずれのモデルにおいても、書き込みポリシーとしては、命令の生成した値のすべてをレジスタ・キャッシュに書き込む「All Cache 方式」を採用している。ＬＲＵモデルについては、連想度を「２」、「４」、「full」と変化させた３つのモデル（以下、それぞれ以下、「２-WAY」、「４-WAY」、「ＦＡ」と記載する）を用意した。
【０１３５】
まず各モデルにおけるレジスタ・キャッシュの遅延時間について述べる。ＤＭモデル、ＭＳＢモデル及びＭＳＢ−ｒモデルでは、レジスタ・キャッシュへのアクセスがダイレクト・マップ方式で行われるため、物理レジスタ番号の下位ビットからＲＣエントリが一意に定まる。一方、ＬＲＵモデルでは、ＬＲＵ方式のレジスタ・キャッシュを採用し、且つそのアクセスに連想方式を採用しているため、レジスタ・キャッシュの参照時には連想検索を行い、書き込み時には更新時刻が最も古いエントリを検索する必要がある。これらの検索処理は、連速度やＲＣエントリ数が増加するに従い複雑となり、レジスタ・キャッシュの遅延時間やチップ上での占有面積を増大させる要因となる。更にレジスタ・キャッシュの面積の増大は、命令の出力する値をレジスタ・ファイルに受け渡す結果バスにおける遅延時間の増大も招いてしまう。したがって、ＬＲＵモデルの評価には、後述する評価結果の数値には表れない、そうしたディメリットを考慮する必要がある。これに対して、ＭＳＢ、ＭＳＢ−ｒモデルでは、ダイレクト・マップ方式のレジスタ・キャッシュを特に変更せずにＭＳＢを導入することができ、上述したようにＭＳＢの遅延時間はレジスタ・キャッシュの遅延時間よりも短いため、ＬＲＵモデルのようなディメリットは存在しない。
【０１３６】
図１５に、ＲＣエントリ数をそれぞれ「８」、「１６」、「３２」、「６４」としたときの上記各モデルのＲＣミス率を示す。同図に示されるグラフの縦軸はＲＣミス率のベンチマーク平均を、横軸はＲＣエントリ数をそれぞれ示している。また各ＲＣエントリ数における６本組の縦棒は、図中左側から順にＤＭモデル、ＭＳＢモデル、２-WAY、４-WAY、ＦＡのＬＲＵモデルのものとなっている。
【０１３７】
同図から明らかなように、ＲＣエントリ数「８」、「１６」、「３２」及び「６４」のそれぞれにおけるＭＳＢモデルのＲＣミス率は、ＤＭモデルよりも「2.1%」、「4.3%」、「5.7%」、「4.1%」減少している。また同様にＭＳＢ−ｒモデルのＲＣミス率は、ＤＭモデルよりも「2.2%」、「4.6%」、「6.4%」及び「5.2%」減少している。この結果は、２-WAYのＬＲＵモデルと同程度となっている。一方、ＭＳＢ、ＭＳＢ−ｒモデルのＲＣミス率は、４-WAYやＦＡのＬＲＵモデルよりは高いものの、ＬＲＵモデルでは連想度の増加につれてレジスタ・キャッシュの遅延時間や面積の増大といったディメリットが顕著となる。そのため、ＲＣミス率のみを着目し、ＭＳＢ、ＭＳＢ−ｒモデルよりも、４-WAYやＦＡのＬＲＵモデルの方が優れているとは言えないことに留意する必要がある。
【０１３８】
なおＲＣミス率は、ＭＳＢモデルよりもＭＳＢ−ｒモデルの方が若干低く抑えられてはいるが、その差は各モデルの動作原理から予測されるものよりは軽微となっている。この原因としては、一度の分岐予測ミスの発生でフラッシュされる命令数が多く、レジスタ・キャッシュのほとんどのエントリが無効化されてしまうことが考えられる。そこでそうした仮説の正当性を確認するため、ＭＳＢ、ＭＳＢ−ｒの両モデルについて、分岐予測ミスの発生頻度とその結果として無効化されるＲＣエントリ数とを調査した。分岐予測ミスの発生頻度は、ＲＣエントリ数の多少にほとんど影響を受けず、平均約６８命令の実行毎に１回の分岐予測ミスが発生していることが確認されている。一方、無効化されるＲＣエントリ数については、図１６に示す通りの結果が得られている。同図に示されるグラフの縦軸は１度の分岐予測ミスの発生により無効化されたＲＣエントリ数の平均値を、横軸はＲＣエントリの総数をそれぞれ示している。また各ＲＣエントリ数における２本組の縦棒は、図中左側がＭＳＢモデルのものを、図中右側がＭＳＢ−ｒモデルのものをそれぞれ示している。同図から明らかように、いずれの場合においても、無効化されるＲＣエントリの数は、ＲＣエントリの総数の「50％」に満たず、上記仮定は正しくないことが確かめられた。
【０１３９】
他の原因としては、分岐予測ミス時には、パイプラインのバブルが、すなわち無効化された命令の処理にパイプラインの各ステージがしばらく占有されてしまう現状が発生し、実際には、予測ミスした分岐命令以前の命令と正しい分岐先の命令とはオーバーラップ実行されていないことが考えられる。オーバーラップ実行されていなければ、これらの命令がレジスタ・キャッシュ上で競合することもなく、ＭＳＢの状態の巻き戻しは、あまり効果を奏さない。この仮説の正当性を確かめるため、正しい分岐先の命令が開始された時点において、予測ミスした分岐命令以前の命令の実行状態を調査した。その結果、ＲＣエントリ数に拘わらず、予測ミスした分岐命令以前の命令は、正しい分岐先の命令の実行が開始された時点ではそのほとんどが実行を終了しており、実行待ちとなっている命令数は平均「０．８個」に過ぎないことが確かめられた。したがって、ＭＳＢモデルとＭＳＢ−ｒモデルとの間にＲＣミス率に殆ど差のないのは、これが原因であると考えられる。
【０１４０】
続いて、各モデルがプロセッサの性能に与える影響について説明する。図１７には、ＲＣエントリ数をそれぞれ「８」、「１６」、「３２」、「６４」としたときの各モデルのＩＰＣ（Instruction Per Clock ：１サイクル当たりの命令実行数）の測定結果を示す。同図のグラフの縦軸は、ＤＭモデルのＩＰＣを基準「 100％」としたときの、他のモデルのＩＰＣの向上率のベンチマーク平均値を、横軸はＲＣエントリ数をそれぞれ示している。また各ＲＣエントリ数における５本組の縦棒は、図中左側から順にＭＳＢモデル、２-WAY、４-WAY、ＦＡのＬＲＵモデルのものとなっている。
【０１４１】
同図に示されるように、ＲＣエントリ数によって多少の違いはあるものの、ＭＳＢ、ＭＳＢ−ｒのＩＰＣ向上率は、同程度となっている。これはＲＣミス率が同程度であることからも明らかである。また同じ理由により、ＭＳＢ、ＭＳＢ−ｒの両モデルのＩＰＣ向上率は、４-WAY及びＦＡのＬＲＵモデルよりも低くなっているが、２-WAYのＬＲＵモデルとは同程度となっている。
【０１４２】
以上により、本実施形態におけるレジスタ管理方式は、レジスタ・キャッシュや結果バスの遅延時間の増大を招くことなく、連想度が「２」のＬＲＵ方式と同程度の性能向上を達成していることが分かる。一方、連想度を「４」以上とすれば、同一動作周波数での性能は本実施形態の方式よりも確かに高くはなるが、連想度を増加すれば、上述したディメリットによりプロセッサの動作周波数の向上が困難となるため、両者の優劣は一概には言えない。
【０１４３】
一方、ＲＣエントリ数と性能向上率との関係を見ると、ＭＳＢ、ＭＳＢ−ｒモデルの性能向上率は、ＲＣエントリ数が「３２」のときに最大となり、ＲＣエントリ数が「６４」のときにはそれよりも低くなっている。ちなみにこのときのＤＭモデルに対するＲＣミス率の削減量は平均「 6.4％」、ＩＰＣ向上率は平均「 4.1％」となっている。このようにＩＰＣ向上率がＲＣエントリ数の増加に併せて単調増加しない理由は、ＲＣエントリ数がある程度以上となると、エントリに余裕があるため、レジスタ・リネーミング時に物理レジスタ番号をランダムに供給しても、レジスタ・キャッシュ上でのエントリの競合が発生し難くなることにあると考えられる。なおそうしたレジスタ・キャッシュ上でのエントリの競合の発生頻度は、ＲＣエントリ数よりはむしろ、物理レジスタ番号の供給速度を決める命令発行幅と、供給可能な物理レジスタ番号の総数を決める物理レジスタ数に依存すると考えられる。そこで上記仮説の正当性を確認するため、上記ＭＳＢ−ｒモデルにおいて、命令発行幅と物理レジスタ数とを変化させながらＩＰＣを測定したときのＩＰＣ向上率が最大となるＲＣエントリ数を確認する調査も併せ行った。
【０１４４】
図１８には、そうした調査の結果が示されている。同図に示すグラフの縦軸はＤＭモデルを基準「 100％」としたときのＩＰＣの向上率のベンチマーク平均値を、横軸はＲＣエントリ数をそれぞれ示している。なお同図では、命令発行幅を「ｎ」、物理レジスタ数を「ｍ」としたモデルを（Ｉｎ，Ｐｍ）と表記したものが、測定結果の折れ線にそれぞれ付されている。同図に示されるように、プロセッサ構成によって、ＩＰＣ向上率が最大となるＲＣエントリ数だけではなく、ＲＣエントリ数に対するＩＰＣ向上率の変化傾向も変化している。したがって、本実施形態のレジスタ管理方式の性能向上率は、ＲＣエントリ数だけでなく、命令発行幅や物理レジスタ数にも大きく依存することが確認された。
【０１４５】
以上説明した本実施形態によれば、次の効果を奏することができる。
（１）レジスタ・キャッシュのアクセスに係るインデクスを、メイン・レジスタ・ファイルの物理レジスタ番号から一義的に決定するとともに、命令のフェッチ順にインデクスがラウンド・ロビンとなるように、レジスタ・リネーミング中の命令に対する物理レジスタ番号の割り当てを行うようにしている。そのため、命令に割り当てられた物理レジスタ番号のレジスタ・キャッシュへのインデクスの値を特定の値に偏ることなく分散させることができ、レジスタ・キャッシュのエントリの競合を低減して、ＲＣミスを削減することができる。しかも、インデクスが物理レジスタ番号から一意に定められるため、レジスタ・キャシュのアクセス時間の短縮及びハードウェア構成の簡易化が可能である。したがって、レジスタ・キャッシュのハードウェア資源を有効活用して、プロセッサの処理性能を好適に向上することができる。
【０１４６】
（２）インデクスがラウンド・ロビンとなるように未使用の物理レジスタ番号を整列させるとともに、その整列の順に物理レジスタ番号の割り当てを行うことで、割り当て順にインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを行うようにしている。具体的には、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、ＲＣエントリ数と同数のバッファ（ＦＩＦＯ）を設け、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファを、命令のフェッチ順に切り替えるようにしている。そのため、比較的簡易なハードウェア構成で、割り当て順にインデクスがラウンド・ロビンとなるような物理レジスタ番号の割り当てを行うことができる。
【０１４７】
（３）分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにしているため、分岐予測ミスの発生時にもインデクスをラウンド・ロビンに維持することができる。
【０１４８】
（４）図４に示したＭＳＢの改良構成では、各々に格納される物理レジスタ番号の下位Ｂｒビットを各ＦＩＦＯの番号として用いるとともに、各ＦＩＦＯには、物理レジスタ番号の下位Ｂｒビットを除いたビット列のみを記録するようにしている。そしてレジスタ・リネーミング時には、供給ポインタの指定するＦＩＦＯの先頭に記録されたビット列の後ろに、供給ポインタの保持するＦＩＦＯ番号を連結することで、物理レジスタ番号を復元するようにしている。そのため、ＦＩＦＯの各エントリのビット数をＢｒビット分節約し、より少ないハードウェア量でＭＳＢを具現とすることができる。
【０１４９】
なお、上記実施形態は以下のように変更してもよい。
・上記ＭＳＢに設けられる巻き戻し機構は、分岐予測ミスが判明したときに、予測ミスとなった分岐命令のレジスタ・リネーミングの時点まで、割り当てられる物理レジスタ番号のインデクスの値の順序を巻き戻すようにしている。こうしたインデクスの巻き戻しを行わない場合、分岐予測ミスが発生すると、一時的にモジュロ・ソートの順に物理レジスタ番号の割り当てが行われなくなることがある。もっとも、そうした一時的なモジュロ・ソートの乱れがプロセッサの処理性能に与える悪影響を許容できる場合には、巻き戻し機構を割愛し、その分、ハードウェア量を削減するようにしても良い。
【０１５０】
・上記実施形態では、それぞれインデクスを同一とする未使用の物理レジスタ番号が格納される、ＲＣエントリ数と同数のバッファ（ＦＩＦＯ）を設け、レジスタ・リネーミング中の命令に割り当てられる物理レジスタ番号を読み出すバッファを命令のフェッチ順に切り替えることで、物理レジスタ番号をモジュロ・ソートするようにしていた。こうした物理レジスタ番号のモジュロ・ソートは、これ以外の手法により行うこともできる。例えば、
○  未使用の物理レジスタ番号をモジュロ・ソートした上でフリー・リストに順次蓄積し、そのフリー・リストから命令に供給する物理レジスタ番号を読み出す、
○  未使用の物理レジスタ番号を一旦フリー・リストに保持させた後、フリー・リスト内の物理レジスタ番号をモジュロ・ソートする、
○  未使用の物理レジスタ番号をフリー・リストに保持させ、レジスタ・リネーミングに際して、インデクスが適切な値の物理レジスタ番号をフリー・リストから検索して供給する、
といった手法によっても、命令に供給される物理レジスタ番号のモジュロ・ソートを行うことはできる。
【０１５１】
・上記実施形態では、物理レジスタ番号をＲＣエントリ数で除算したときの剰余をレジスタ・キャッシュのインデクスとして設定するようにしていた。もっとも、物理レジスタ番号から一意に定まるようにインデクスを設定すれば、命令のフェッチ順にインデクスがラウンド・ロビンとなるように物理レジスタ番号の割り当てを行うことは可能であり、それにより特定の値へのインデクスの偏りを抑え、ＲＣミスを削減することはできる。
【０１５２】
（第２の実施形態）
以下、本発明に係るプロセッサ及びそのデータ処理方法を具体化した第２実施形態を、図１９〜図２８を参照して詳細に説明する。以下の説明では、数値を２進数で表記する場合、その値の前後に”［”、”］”をそれぞれ付して記載し、そうでない数値は特に断りの無い限り、１０進数表記によるものとする。
【０１５３】
上述したように、ＲＣミスが発生すると、オペランドのアクセス・レイテンシが増加したり、他の命令の発行が妨げられたりするといったペナルティが生じる。上述したように、従来、レジスタ・キャッシュの書き込みポリシーや書き換えポリシーの改良によってＲＣミスの発生頻度を低減する対策が幾つか提案されている。しかしながら、レジスタ・キャッシュにはすべてのレジスタ値が保持されない以上、ＲＣミスの発生を完全には無くすことができないため、たまたま発生したＲＣミスがプログラムの実行時間に決定的な悪影響を与えてしまう可能性は否めないものとなっている。
【０１５４】
本実施形態のプロセッサ及びそのデータ処理方法では、プログラム全体の実行時間・実行サイクル数を決定するクリティカル・パスに着目したレジスタ・キャッシュの書き込みポリシーを採用することで、レジスタ・キャッシュ・ミス（ＲＣミス）が発生してもプロセッサ性能が低下され難いようにしている。ここでのクリティカル・パスとは、プログラムの実行サイクル数を決定する命令列のことである。クリティカル・パス上にある命令の実行の遅延は、プログラム全体の実行サイクル数の増加に直結する。
【０１５５】
図１９にクリティカル・パスの一例を示す。同図には、命令ｉ１〜ｉ９の９つの命令からなる命令列のデータ・フロー・グラフが示されている。同図において、各命令ｉ０〜ｉ９を表すノード同士を繋ぐ矢印は、命令間のデータ依存関係を示している。実線の矢印はオペランド・バイパスによって、破線の矢印はレジスタ・ファイル・アクセスによって、それぞれデータの受け渡しが行われることを示している。ちなみに「オペランド・バイパス」とは、命令のデコード時にその命令の必要とするオペランド（データ）が結果バスに存在する場合に、レジスタ・ファイルを介さずにそのデータを結果バスから直接取得することをいう。なお各命令ｉ０〜ｉ９の表記において「ｉ」の右に付された数値「１」〜「９」は命令のフェッチ順を示している。同図においてノードが強調して表示された命令列「ｉ１→ｉ３→ｉ４→ｉ８→ｉ９」で構成されるパスがクリティカル・パスとなっている。クリティカル・パスは、命令列のデータ・フロー・グラフにおける最も長いパスとなっている。
【０１５６】
ここでプログラム全体の実行サイクル数を必要最小限に抑えることを考えると、クリティカル・パス上の命令の実行の遅れは許容できないこととなる。これに対して非クリティカル・パス上の命令では、プログラム全体の実行サイクル数を増加させることなく、少なくとも１サイクルの実行の遅延を許容することができる。
【０１５７】
そこで本実施形態では、クリティカル・パス上の命令によって使用されるデータのみをレジスタ・キャッシュに書き込むようにしている。こうしてレジスタ・キャッシュに書き込まれるデータの種類を制限することで、レジスタ・キャッシュのデータの置き換え頻度が低減されるようになり、クリティカル・パス上の命令によって使用されるデータの受け渡しについてはＲＣミスの発生を大幅に低減することができる。もっとも、この場合には、非クリティカル・パス上の命令に使用されるデータについては、レジスタ・キャッシュへの書き込みがそもそも行われないことから、必然的にＲＣミスが発生するようにはなる。ここでＲＣミスのペナルティを「ｎサイクル」とすると、ＲＣミスが発生したときのプログラム全体の実行サイクル数の増加は、クリティカル・パス上の命令ではそのまま「ｎサイクル」となるが、非クリティカル・パス上の命令では「ｎサイクル」未満となる。そのため、非クリティカル・パス上の命令のＲＣミスは、クリティカル・パス上の命令のＲＣミスに比べれば、プロセッサ性能の低下は軽微なものに留まることになる。したがって、非クリティカル・パス上の命令に対するデータの受け渡しに際してＲＣミスがある程度発生しても、クリティカル・パス上の命令に対するデータの受け渡しに際してのＲＣミスの発生を防止しさえすれば、ＲＣミスによるプロセッサ性能の低下を緩和することができる。
【０１５８】
ちなみにクリティカル・パス上の命令によって使用されるデータにおいても、そのデータが上述のオペランド・バイパスによって得られるのであれば、そのデータの受け渡しにレジスタ・ファイル・アクセスは行われない。そのため、そうしたデータをわざわざレジスタ・キャッシュに書き込んだところで、そのデータのアクセス時間の短縮には全く寄与しないことになる。そればかりか、そうしたデータまでもがレジスタ・キャッシュに書き込まれるのであれば、限りあるレジスタ・キャッシュの資源が無駄に消費されることとなり、その書き込みによって必要なデータがレジスタ・キャッシュから追い出されてしまう可能性がある。そこでここでは、クリティカル・パス上の命令によって使用されるデータの中で、オペランド・バイパスによっては得られないデータのみを選択してレジスタ・キャッシュに書き込むこととする。なお以下の説明では、クリティカル・パス上の命令によって使用されるデータをＣデータ（Critical Data ）と記載する。またＣデータの中でオペランド・バイパスでは得られないデータをＮＢＣデータ（Non-Bypassed Critical Data）と記載する。
【０１５９】
図２０を用いて、こうした本実施形態のレジスタ・キャッシュの書き込みポリシーの作用を説明する。同図は、先の図１９のデータ・フロー・グラフに示される命令列について、同図（ａ）はすべてのデータをレジスタ・キャッシュに書き込む場合の、同図（ｂ）はＮＢＣデータに限定してレジスタ・キャッシュに書き込む場合のそれぞれにおける命令の実行態様の例を示している。同図（ａ）（ｂ）の縦軸は、命令の実行されるクロック・サイクルを示している。また各命令を表すノード同士を繋ぐ矢印は、命令間のデータ依存関係をそれぞれ示している。なお実線で示される矢印は、データの受け渡しがオペランド・バイパスで行われることを、破線で示される矢印は、データの受け渡しがレジスタ・ファイル・アクセスを通じて行われることをそれぞれ意味している。
【０１６０】
ちなみに、同図では、ＲＣミスのペナルティが「２サイクル」であると、すなわちデータの取得に際してＲＣミスが発生した場合にその命令の実行がそうでない場合よりも２サイクル遅れるものとしている。また説明を分かり易くするために、レジスタ・キャッシュのエントリは「２」しかないものとする。
【０１６１】
図２０（ａ）は、命令の生成するデータのすべてをレジスタ・キャッシュに随時書き込んでいく場合を示している。命令ｉ２の生成したデータは、後続の命令ｉ４によって使用されるが、そのデータは、その後に実行された命令ｉ３及び命令ｉ５の生成した２つのデータが書き込まれたことで、命令ｉ４の実行時には既にレジスタ・キャッシュ上から追い出されてしまっている。そのため、命令ｉ４にＲＣミスが発生することになる。この命令ｉ４は、クリティカル・パス上にあるため、その実行がＲＣミスにより２サイクル遅れると、プログラム全体の実行サイクル数がその分増加してしまうようになる。
【０１６２】
図２０（ｂ）は、上記ＮＢＣデータのみをレジスタ・キャッシュに書き込む場合を示している。上記命令列では、上記ＮＢＣデータは、命令ｉ２から命令ｉ４に受け渡されるデータのみであるため、命令ｉ２の生成したデータのみがレジスタ・キャッシュに書き込まれる。そのため、クリティカル・パス上の命令ｉ４の実行時まで、命令ｉ２の生成したデータは追い出されることなくレジスタ・キャッシュ上に保持されることになる。したがって、この場合には、クリティカル・パス上の命令ｉ４のＲＣミスは発生しないようになる。一方、非クリティカル・パス上の命令ｉ７では、使用するデータがレジスタ・キャッシュに書き込まれないため、必然的にＲＣミスが発生することにはなる。ただし、そのペナルティによって同命令ｉ７の実行が２サイクル遅れても、プログラム全体の実行サイクル数は増加しない。
【０１６３】
このようにレジスタ・キャッシュに書き込むデータをＮＢＣデータに限定すれば、プログラム全体の実行サイクル数の増加に直結するクリティカル・パス上の命令のＲＣミスを大幅に低減し、ＲＣミスによるプロセッサの性能低下を効果的に緩和することができる。一方、上述したようにＲＣミスには、他の命令の発行を妨げてしまうという問題もある。本実施形態では、この問題についても、対策を講じるようにしている。
【０１６４】
上述したようにＲＣミスの発生が他の命令の発行を妨げてしまう要因は、オペランドの取得に際してＲＣミスが発生してしまう命令を、オペランドのレジスタ・キャッシュからの取得（ＲＣヒット）を前提として投機的に発行してしまうことにある。したがって、オペランドの取得時にＲＣミスが発生する命令を事前に検出し、そうした命令の投機的に発行を行わないようにすれば、上記問題は回避することができる。
【０１６５】
ここで本実施形態では、上述したようにＮＢＣデータに限定してレジスタ・キャッシュに書き込むようにしている。そのため、オペランドがＮＢＣデータ以外の命令は必ずＲＣミスが発生することが分かっている。したがって、オペランドがＮＢＣデータ以外の命令については、ＲＣヒットを前提とした投機的な発行を禁止すれば、ＲＣミスにより他の命令の発行が妨害されないようにすることができる。例えば先の図２０（ｂ）に例示した命令列の実行態様では、ＮＢＣデータである命令ｉ２の生成したデータのみがレジスタ・キャッシュに書き込まれるため、オペランドがＮＢＣデータでない命令ｉ７には必ずＲＣミスが発生することが予め分かっている。そのため、ＲＣヒットを前提として命令ｉ７を投機的に発行しないようにすれば、そのＲＣミスが他の命令の発行を妨げることを事前に防止することができる。
【０１６６】
以上説明したように本実施形態のプロセッサのデータ処理方法では、ＲＣミスがプロセッサの性能に与える悪影響を緩和するために、
（イ）  レジスタ・キャッシュに書き込むデータをＮＢＣデータに限定すること、
（ロ）  ＮＢＣデータをオペランドとする命令に限定して、ＲＣヒットを前提とした投機的な発行を実施すること、
といった２つの対策を採っている。以下、こうしたデータ処理方法を実現するための具体的なプロセッサの構成について説明する。
【０１６７】
（プロセッサの構成）
図２１に、本実施形態のプロセッサの構成例を示す。同図に例示するプロセッサは、フェッチ・ユニット１０１、デコード・ユニット１０２、命令ウィンドウ（Ｉ−ｗｉｎ）１０３、実行ユニット（ＥＵ）１０４、リオーダ・バッファ（ＲＯＢ）１０５を備えている。またプロセッサには、メイン・レジスタ・ファイル（ＭＲＦ）１０６及びレジスタ・キャッシュ（ＲＣ）１０７からなる階層型レジスタ・ファイルとマップ表１０８とが設けられてもいる。フェッチ・ユニット１０１は、主記憶装置からの命令の読み込みを行う。デコード・ユニット１０２は、読み込まれた命令の内容の解析（デコード）し、命令ウィンドウ１０３及びリオーダ・バッファ１０５にそれぞれ格納する。またデコード・ユニット１０２は、デコード時に定義した物理レジスタと論理レジスタとの対応関係をマップ表１０８に記憶する。命令ウィンドウ１０３は、実行前の命令を一時的に格納するバッファであり、プロセッサの制御回路は、このバッファから命令を取り出して、実行ユニット１０４に順次投入する。一方、リオーダ・バッファ１０５は、命令を格納するＦＩＦＯ（First-In First-Out）式のバッファであり、格納された命令の中で格納の順が最も早い命令の実行が終了すると、その命令が取り出される（コミットされる）。なお上述したように、階層型レジスタ・ファイルのメイン・レジスタ・ファイル１０６は、すべてのレジスタ値を記憶し、より高速に動作可能なレジスタ・キャッシュ１０７は一部のレジスタ値のみを記録する。
【０１６８】
また、このプロセッサには、クリティカル・パス予測機構（ＣＰ予測機構１０９）が設けられている。ＣＰ予測機構１０９は、フェッチした命令がクリティカル・パス上にあるか否かを予測する。なおＣＰ予測機構１０９としては、非特許文献３及び４等に見られるように、様々な予測手法に基づくものが提案されている。例えばQold型予測機構は、命令ウィンドウ、又はリオーダ・バッファに存在する命令の中で最も古い命令をクリティカル・パス上の命令と見なすことで予測を行う機構である。またToken 伝搬型予測機構は、実行結果を渡すことで実行可能な状態となる後続命令の数が予め定められた判定値以上となる命令を、クリティカル・パス上の命令と見なすことで予測を行う機構である。これ以外にも、ＣＰ予測機構としては、
・命令ウィンドウに存在する命令の中で最も古い命令に実行結果を渡す命令をクリティカル・パス上の命令と見なす、
・同一のサイクルに実行される命令の中で最も多くの後続命令に実行結果を渡す命令をクリティカル・パス上の命令と見なす、
といったような様々な予測手法を用いるものが提案されている。本実施形態のプロセッサに設けられるＣＰ予測機構１０９としては、どの様な予測手法を用いるものを採用しても良い。勿論、精度の高い予測手法を用いる機構を採用することが望ましいが、一般的な傾向として予測精度の向上に伴って機構の複雑度が増加するため、現実的にはそれらのバランスを考慮して予測方式の選定を行うことになる。
【０１６９】
さらにこのプロセッサには、上記対策（イ）及び（ロ）に対応した動作を行うため、ＮＢＣデータ予測機構とＲＣミス検出機構との２つの機構が設けられている。
ＮＢＣデータ予測機構は、ＲＤＩテーブル（Register definition Information Table ）１１０とＮＢＣデータ・テーブル１１１とを備えて構成されている。このＮＢＣデータ予測機構は、実行結果がＮＢＣデータとなる命令を予測し、その命令の実行結果のみをレジスタ・キャッシュ１０７に書き込むように動作する。
【０１７０】
ＲＣミス検出機構は、その実行によって生成されるオペランドがＮＢＣデータでない命令を検出し、その検出した命令に依存する命令、すなわち非ＮＢＣデータのオペランドを受け取る命令が、ＲＣヒットを前提として投機的に発行されないようにする。こうしたＲＣミス検出機構は、従来一般のプロセッサに採用されるマップ表１０８に簡単な修正を加えることで実現することが可能である。
【０１７１】
次に、これら両機構の詳細を説明する。
（ＮＢＣデータ予測機構）
ＮＢＣデータ予測機構では、過去の実行結果がＮＢＣデータであった命令は、次回の実行時にも実行結果がＮＢＣデータであるとの想定のもとに、実行結果がＮＢＣデータとなる命令を予測する。ＮＢＣデータ予測機構の予測に係る具体的な動作は次の態様で行われる。まずＲＤＩテーブル１１０を用いて、コミットされた命令のうちで、実行結果がＮＢＣデータであった命令のＰＣ（プログラム・カウンタの値）を求める。そしてその結果得られたＰＣを、ＮＢＣデータ・テーブル１１１に登録する。命令のフェッチ時にＮＢＣデータ・テーブル１１１を参照し、その命令のＰＣがそのテーブルに登録されているか否かによって、その命令の実行結果がＮＢＣデータとなるか否かを予測する。
【０１７２】
すなわち、本実施形態では、こうしたＮＢＣデータ予測機構が上記予測手段に相当する構成となっている。そしてこのＮＢＣデータ予測機構は、命令の定義したレジスタ値がレジスタ・ファイルへの書き込み条件を満たしていたか否かを、すなわちＮＢＣデータであったか否かを命令毎に履歴として記録する工程と、今回もその履歴と同じ結果となるとしてＮＢＣデータとなるか否かの予測を行う工程と、を通じてＮＢＣデータの予測を行うようにしている。より具体的には、前者の工程は、上記条件に該当するレジスタ値（ＮＢＣデータ）を定義した命令の識別情報（ＰＣの識別タブ）をＮＢＣデータ・テーブル１１１に記録する工程を通じて行われる。また後者の工程は、レジスタ値を定義した命令の識別情報がＮＢＣデータ・テーブル１１１上にあれば、そのレジスタ値はＮＢＣデータとなり、記録されていなければＮＢＣデータとならないと予測する工程を通じて行われる。
【０１７３】
次に、こうしたＮＢＣデータ予測機構のＲＤＩテーブル１１０及びＮＢＣデータ・テーブル１１１の具体的な構成を説明する。以下では、両テーブルの動作原理がより理解しやすいように、まずは、実行中に命令間の依存関係が変化しないことを前提とした場合のそれらテーブルの基本構成を説明する。そしてその後、実行中の命令間の依存関係の変化に対応可能としたＮＢＣデータ予測機構の改良構成について説明する。
【０１７４】
（１）  ＲＤＩテーブル
図２２に、実行結果がＮＢＣデータとなった命令のＰＣを求めるためのＲＤＩテーブル１１０の構成を示す。同図に示すようにＲＤＩテーブル１１０は、論理レジスタ番号をインデクスとし、その各エントリに各論理レジスタ番号に対応するレジスタを定義した命令のＰＣを保持するように構成されている。ＲＤＩテーブル１１０の更新は、コミットされた命令のデスティネーション・レジスタに対応するエントリに、その命令のＰＣを書き込むことで行われる。すなわち、このＲＤＩテーブル１１０には、各論理レジスタに値を定義した命令のＰＣが記録される。
【０１７５】
したがって、クリティカル・パス上の命令がコミットされるときに、オペランド・バイパスでは得られなかったオペランド、すなわちＮＢＣデータがあれば、そのＮＢＣデータの論理レジスタ番号をインデクスとしてＲＤＩテーブル１１０を参照することで、ＮＢＣデータを定義した命令のＰＣを得ることができる。
【０１７６】
（２）  ＮＢＣデータ・テーブル
図２３に、ＮＢＣデータ・テーブル１１１の構成を示す。ＮＢＣデータ・テーブル１１１は、ＰＣの下位ビットをインデクスとし、その各エントリにＮＢＣデータを定義した命令を識別するためのタグを保持するように構成されている。タグとしては、上記インデクスとして用いる下位のビット列を除いた命令のＰＣを上位ビットが用いられる。例えばＰＣのビット長が「３２ビット」で、インデクスをＰＣの「下位２ビット」とした場合、ＰＣの「上位３０ビット」がタグとして用いられる。
【０１７７】
ＮＢＣデータ・テーブル１１１には、上記ＲＤＩテーブル１１０の参照を通じてＮＢＣデータを定義した命令のＰＣが求められると、そのＰＣを識別するタグが登録される。すなわち、そのＰＣの下位ビットに対応するエントリに、同ＰＣの残りのビット列の値が書き込まれる。
【０１７８】
こうしたＮＢＣデータ・テーブル１１１には、ＮＢＣデータを定義した命令のＰＣの識別タグのみが登録されることになる。したがって、このＮＢＣデータ・テーブル１１１にＰＣの識別タグが登録されていれば、その命令が先に実行されたときにＮＢＣデータを定義したことを確認することができる。よって命令のフェッチ時にＮＢＣデータ・テーブル１１１を参照することで、その命令の実行結果がＮＢＣデータであるか否かの予測を行うことができる。具体的には、命令のフェッチ時にそのＰＣの下位ビットをインデクスとしてＮＢＣデータ・テーブル１１１を参照し、得られたタグとフェッチする命令のＰＣの上位ビットとを比較する。その結果、両者が一致するのであれば、その命令の実行結果はＮＢＣデータであると予測する。
【０１７９】
（３）ＮＢＣデータ予測機構の更新動作
続いて、上記の如く構成されたＲＤＩテーブル１１０及びＮＢＣデータ・テーブル１１１を備えるＮＢＣデータ予測機構の更新動作について説明する。ここでの更新動作とは、ＲＤＩテーブル１１０を用いてＮＢＣデータを定義した命令を特定し、そのＰＣの識別タグをＮＢＣデータ・テーブル１１１に登録するまでの一連の動作を表している。
【０１８０】
ここでは例として、命令ｉ１〜ｉ４の４つの命令からなる命令列が実行されたときのＮＢＣデータ予測機構の更新動作を説明する。図２４（ａ）にそうした命令列のデータ・フロー・グラフを示す。また図２４（ｂ）に、各命令のＰＣ、ソース・レジスタ番号、デスティネーション・レジスタ番号、及び演算の種別を示す。同図（ａ）でのノード及び矢印の表示は、先の図１９での表示態様と同じである。なお、同図中の矢印の添字は、依存元命令から依存先命令に受け渡されるオペランドの論理レジスタ番号を示している。ちなみに、図中の命令列においてＮＢＣデータとなるのは、命令ｉ２から命令ｉ７に受け渡されるオペランドｒ２のみとなっている。
【０１８１】
さらに、ここでは命令長を「３２ビット」とし、ＰＣはバイト単位（ここでは「１バイト」＝「８ビット」）で表している。なお同図では、ＰＣを１６進数表記で示している。この場合、命令長が「４バイト」であるため、各命令に付されるＰＣの値は「４」刻みとなり、いずれのＰＣにおいても下位２ビットの値は［00］となる。そこでここでは、ＰＣから命令長分の下位２ビットを除いた「３０ビット」のビット列について、その下位２ビットを、すなわちＰＣの下位から数えて４ビット目から３ビット目までのビット列を、ＮＢＣデータ・テーブル１１１のインデクスとするようにしている。例えばＰＣが「５４（＝［ 0…01010100］：「 0…0 」の部分には「０」が２５個連続する）」である命令ｉ２の場合、その下位から数えて４ビット目から３ビット目までの値［01］がＮＢＣデータ・テーブル１１１のインデクスとして用いられることになる。
【０１８２】
図２５（ａ）〜（ｃ）に、こうした命令列の実行に際してのＮＢＣデータ予測機構の更新動作の態様を、時系列順に示す。ここでは、ＲＤＩテーブル１１０の内部のうち、更新動作の説明に関係のないエントリについては省略して示している。またここでは、ＮＢＣデータ・テーブル１１１のエントリ数は「４」としている。
【０１８３】
図２５（ａ）は、上記命令列の実行を開始する前のＮＢＣデータ予測機構の初期状態を示している。このときのＲＤＩテーブル１１０及びＮＢＣデータ・テーブル１１１は、何も登録されていない状態となっている。
【０１８４】
図２５（ｂ）は、命令ｉ１〜ｉ３がコミットされた後の状態を示している。命令ｉ１はデスティネーション・レジスタ番号が「１」となる、すなわち論理レジスタｒ１を定義するため、そのコミットに際しては、ＲＤＩテーブル１１０の１番目のエントリに、自身のＰＣである「５０」が書き込まれる。また同様にして命令ｉ２のコミット時にはその２番目のエントリに「５４」が、命令ｉ３のコミット時にはその３番目のエントリに「５４」が、それぞれ書き込まれる。
【０１８５】
図２５（ｃ）は、命令ｉ４がコミットされた後の状態を示している。このときには、上記ＣＰ予測機構１０９により命令ｉ４がクリティカル・パス上にあるとの予測がなされ、またまたオペランド・バイパスの有無を調べることでオペランドｒ２の値がオペランド・バイパスでは得られなかったことの確認がなされており、オペランドｒ２は、ＮＢＣデータであると分かっている。そこで、まずＲＤＩテーブル１１０のオペランドｒ２に対応するエントリを参照し、ＮＢＣデータである同オペランドｒ２を定義した命令ｉ２のＰＣを調べる。これにより、命令ｉ２のＰＣである「５４」が得られる。
【０１８６】
次に得られた命令ｉ２のＰＣから、その下位から数えて４ビット目から３ビット目までの値［01］をＮＢＣデータ・テーブル１１１へのインデクスとして取り出し、そのインデクスに対応する１番のエントリに残りの２８ビットのビット列［ 0…0101］（「 0…0 」の部分には「０」が２５個連続する）をタグとして登録する。こうしてＮＢＣデータを定義した命令ｉ２のＰＣがＮＢＣデータ・テーブル１１１に登録される。
【０１８７】
次回に、この命令ｉ２がフェッチされたときに、そのＰＣの一部をインデクスとしてＮＢＣデータ・テーブル１１１を参照すると、それにより得られるタグと自身の上位ビットとが一致するため、ＮＢＣデータ予測機構により命令ｉ２は、ＮＢＣデータを定義する命令であると予測されることになる。
【０１８８】
（４）  実行結果がＮＢＣデータでなくなった命令への対応
以上説明したＮＢＣ予測機構の基本的な構成では、命令間のデータ依存関係がプログラムの実行中に変化しないとの前提のもとに、ＮＢＣデータ・テーブル１１１に登録された命令は、それ以降も常に実行結果がＮＢＣデータとなると予測するようにしていた。しかしながら、実際のプログラムの実行中には命令間のデータ依存関係が変化することがしばしばある。こうした場合、ＮＢＣデータ・テーブル１１１に登録された命令の実行結果は必ずしもＮＢＣデータとはならないため、ＮＢＣデータの予測結果を誤ることがある。
【０１８９】
こうした実行中の命令間のデータ依存関係の変化に対応するため、上述のＮＢＣデータ予測機構の基本構成に、以下の改良を施す。まずＲＤＩテーブル１１０の各エントリに、ＮＢＣデータの予測を失敗したか否かの履歴を記録するフラグを追加する。以下、このフラグをＰ（Predicted ）ビットと呼ぶ。Ｐビットは、対応するエントリにＰＣの記録された命令がＮＢＣデータを定義する命令であると予測されたときに、その値が「１」にセットされ、その予測が正しいことが確認されたときにその値が「０」にリセットされる。したがって、Ｐビットが「１」のままのエントリにＰＣの記録された命令は、ＮＢＣデータ予測に失敗したと判断することができる。
【０１９０】
このように改良したＮＢＣデータ予測機構でのＰビットの更新動作を説明する。命令のコミット時にその命令の実行結果がＮＢＣデータであると予測されていたのであれば、そのデスティネーション・レジスタに対応するＰビットを「１」にセットし、そうでないのであれば「０」にリセットする。またその命令がクリティカル・パス上の命令であると予測されていた場合、その命令が取得したオペランドにＮＢＣデータがあれば、そのＮＢＣデータの論理レジスタ番号に対応するＰビットを「０」にリセットする。
【０１９１】
次に、ＮＢＣデータ予測失敗時のＮＢＣデータ・テーブル１１１のエントリの削除動作を説明する。命令がコミットされたとき、その命令のデスティネーション・レジスタに対応するＲＤＩテーブル１１０のエントリを参照し、これから上書きするエントリのＰビットを確認する。ここでＰビットが「１」であったのであれば、ＮＢＣデータ予測に失敗しているため、上書き前のＰＣをインデクスとしてＮＢＣデータ・テーブル１１１を参照し、対応するエントリに登録されているタグをクリアする。
【０１９２】
すなわち、ここでは上記ＮＢＣデータ予測機構の予測の是非を命令の実行結果に基づいて判定するようにしている。そしてレジスタ値がＮＢＣデータであるとの予測結果の誤りが判明したときには、そのレジスタ値を定義した命令の識別情報（ＰＣの識別タグ）の記録をＮＢＣデータ・テーブル１１１上から削除するようにしている。
【０１９３】
（ＲＣミス予測機構）
続いて、命令のオペランドの取得に際してＲＣミスが発生するか否かを予測するＲＣミス予測機構について説明する。本実施形態のプロセッサでは、ＮＢＣデータのみがレジスタ・キャッシュに書き込まれるため、レジスタ・ファイル・アクセスを通じて非ＮＢＣデータの取得に際しては必然的にＲＣミスが発生する。ＲＣミス予測機構は、この性質を利用して、オペランドがＮＢＣデータでない命令を、ＲＣミスが発生する命令として検出する。
【０１９４】
上述したように本実施形態では、こうしたＲＣミス予測機構を、マップ表１０８に修正を加えることで実現するようにしている。図２６に、こうしたＲＣミス予測機構としての機能を追加されたマップ表１０８の構成を示す。
【０１９５】
従来の一般的なプロセッサのマップ表の各エントリには、対応する論理レジスタに割り当てられた物理レジスタ番号のみが保持される。ＲＣミス予測機構としての機能を兼ね備えた本実施形態のマップ表１０８のエントリには、これに加え、対応する論理レジスタがＮＢＣデータであるか否かを表すフラグが保持される。以下、このフラグをＮＢＣビットと呼ぶ。ここではＮＢＣビットの値「１」はＮＢＣデータであることを、値「０」は非ＮＢＣデータであることをそれぞれ表すようにしている。
【０１９６】
次にこうしたマップ表１０８でのＮＢＣビットの更新動作、及びこれを利用したＲＣミスの予測動作について説明する。コミット時に命令の実行結果がＮＢＣデータであることが確認されたのであれば、そのデスティネーション・レジスタに対応するエントリのＮＢＣビットの値は「１」にセットされ、そうでなければ「０」にリセットされる。一方、レジスタ・リネーミング時に命令のソース・レジスタ番号をインデクスとしてマップ表１０８を参照し、そのエントリのＮＢＣビットの値が「０」であれば、そのソース・レジスタ番号に対応するオペランドはＮＢＣデータではないため、当該命令はＲＣミスの発生する命令と判定する。一方、そうでなければ、ＲＣミスの発生しない、すなわちレジスタ・キャッシュのアクセスにヒットする命令と判定する。
【０１９７】
例えば先の図１９にデータ・フロー・グラフを示した命令列の実行においては、命令ｉ６の実行結果はＮＢＣデータではないと予測されるため、そのデスティネーション・レジスタに対応するマップ表１０８のＮＢＣビットの値は「０」にリセットされる。命令ｉ７のフェッチ時には、このＮＢＣビットを参照することで、命令ｉ６から受け取るオペランドがＮＢＣデータではないことが確認される。これにより命令ｉ７は、オペランドの取得に際してＲＣミスが発生する命令であることが検出されるようになる。
【０１９８】
プロセッサの制御回路は、こうしたマップ表１０８を参照し、命令のデスティネーション・レジスタに対応するエントリのＮＢＣビットの値が「０」であれば、ＲＣヒットを前提としたその命令の投機的な発行を禁止する。換言すれば、プロセッサの制御回路は、命令のデスティネーション・レジスタに対応するマップ表１０８のエントリのＮＢＣビットの値が「１」であることを条件として、ＲＣヒットを前提とした命令の投機的な発行を実施する。したがって本実施形態では、こうしたプロセッサの制御回路が上記命令発行手段に相当する構成となっている。
【０１９９】
（プロセッサの性能評価）
続いて、以上説明した本実施形態のプロセッサの性能評価の結果を説明する。発明者等は、スーパスカラ・プロセッサ用のシミュレータ（Simple Scalar Tool Set）に、階層型レジスタ・ファイルと後述の４つのモデルのいずれかを組み込んで、表２に示される条件で評価を行っている。この評価には、「MIPS R100000」の拡張命令セットである「Simple Scalar/PISA」が使用されている。またこの評価には、ベンチマーク・プログラムとして、「SPECint2000 」の「bzip2 」、「gcc 」、「gzip」、「mcf 」、「paser 」、「perl」、「votex 」、及び「vpr 」の８つのプログラムが使用されている。なお「gcc 」では、最初の１ギガ個の命令を、他のプログラムでは最初の２ギガ個の命令をスキップさせた後、１００メガ個の命令を実行した。クリティカル・パス予測機構としては、上述のToken 伝搬型の予測機構を用いることとした。
【０２００】
【表２】
2007304663.tif 000004
この評価は、レジスタ・キャッシュの書き込みポリシーのそれぞれ異なる次の４つのプロセッサ・モデルについて行われている。すなわち、
・「ＡＣ（All Cache ）モデル」：  命令の生成したすべての値をレジスタ・キャッシュに書き込むモデル、
・「ＮＢ（Non Bypass）モデル」：  オペランド・バイパスによって後続命令に渡さなかった値のみレジスタ・キャッシュに書き込むモデル、
・「ＣＰ（Critical Path ）モデル」：  クリティカル・パス上の命令に使用され、且つオペランド・バイパスによって後続命令に渡さなかった値のみレジスタ・キャッシュに書き込む、本実施形態における書き込みポリシーを採用するモデル、
・「ideal モデル」：  レジスタ・キャッシュへのアクセスが常にヒットするとした理想的なモデル、
の４つのモデルを評価対象としている。いずれのモデルにおいても、置き換えポリシーとしては、参照の時期が最も古いエントリにレジスタ値を書き込む、上述のＬＲＵ方式を用いている。
【０２０１】
図２７に、ＲＣエントリ数を論理レジスタ数と同数の「３２」とし、ＡＣモデルを基準「 100％」としたときの、各ベンチマーク・プログラムにおけるＮＢ、ＣＰ、ideal の各モデルのＩＰＣ（Instruction Per Clock ）の向上率を示す。ＩＰＣは、１サイクル当たりの命令実行数を意味し、プロセッサ性能の指標値となっている。
【０２０２】
同図に示されるように、ＮＢモデルでは、ＡＣモデルに対して最大で「11.8％」、平均で「 6.4％」のＩＰＣの悪化が認められる。ＮＢモデルでは、オペランド・バイパスによって後続命令に渡されたレジスタ値はレジスタ・キャッシュに書き込まないようにしている。ここで命令の結果値が１度しか参照されないとすると、ＮＢモデルでは、無駄な書き込みの頻度が低下してＲＣミスが削減されるため、ＡＣモデルよりもＩＰＣは向上する筈である。しかしながら、測定結果がこれとは逆となるのは、オペランド・バイパスによって後続命令に渡されたレジスタ値が、その後、再び別の後続命令によって参照される場合が少なからず存在するためであると考えられる。
【０２０３】
一方、本実施形態の書き込みポリシーを採用するＣＰモデルでは、ＡＣモデルに対して、最大で「14.8％」、平均で「 6.2％」のＩＰＣの向上が達成されている。またＮＢモデルに対しては、最大で「22.9％」、平均で「13.5％」のＩＰＣの向上が見られる。このように、この測定結果によって、クリティカル・パスに着目した本実施形態のプロセッサのデータ処理方法の有効性を確認することができる。もっとも、ideal モデルに比べれば、ＩＰＣ向上率に、最大で「36.0％」、平均で「12.5％」の差があり、未だ改善の余地は残されている。
【０２０４】
表３は、ＲＣエントリ数を「３２」とした場合の、ＡＣモデル及びＣＰモデルにおけるレジスタ・キャッシュのヒット精度に関する測定結果を示している。同表には、命令がクリティカル・パス上にある場合（ＣＰ）と非クリティカル・パス上にある場合（ＮＰＣ）とのそれぞれにおける、全実行命令数に対するＲＣミス数及びＲＣヒット数の割合が示されている。更にＲＣミスについては、ＲＣミス検出機構によるＲＣミスの検出が成功した場合と失敗した場合とに分けてその割合が示されている。なお同表の「その他」の欄に分類されるのは、オペランド・バイパスによりオペランドを得た命令や、そもそもオペランドの取得を必要としない命令である。
【０２０５】
【表３】
2007304663.tif 000005
本実施形態では、非クリティカル・パス上の命令のＲＣミスを許容する代わりに、プログラム全体の実行サイクル数にＲＣミスがより直接的な悪影響を与えるクリティカル・パス上の命令のＲＣミスを削減することを狙いとしている。しかしながら、ＲＣエントリ数を「３２」としたこの測定結果では、非クリティカル・パス上の命令に対するＣＰモデルでのＲＣミス率は、狙い通りにＡＣモデルよりも高くなっているものの、クリティカル・パス上の命令に対するＣＰモデルでのＲＣヒット率はＡＣモデルとほぼ同程度に留まっている。一方、ＲＣミス検出機構がＲＣミスの検出に失敗した割合はわずか「 2.2％」であり、ＲＣミスが他の命令の発行を妨げるという問題については、そのほとんどを回避することができている。
【０２０６】
ちなみにクリティカル・パス上の命令、非クリティカル・パス上の命令の双方のＲＣミス率の合計は、ＣＰモデルよりもＡＣモデルの方が低く抑えられている。それにも拘わらず、ＩＰＣはＣＰモデルの方が高くなる。これは、非クリティカル・パス上の命令のＲＣミスがプロセッサの性能に与える悪影響は軽微であること、ＲＣミスによる他の命令の発行妨害の回避がプロセッサの性能向上に大きく寄与していること、を示している。
【０２０７】
なおＣＰモデルにおいて、クリティカル・パス上の命令にＲＣミスが発生する原因としては、レジスタ・キャッシュのエントリの競合と、ＮＢＣデータ予測機構の予測ミスとが考えられる。エントリの競合により発生したＲＣミスについては、ＲＣミス検出機構では検出することができないため、上記測定結果では、クリティカル・パス上の命令のＲＣミス率「 3.0％」のうち、エントリの競合によるものが「 1.4％」、予測ミスによるものが「 1.6％」ということが分かる。
【０２０８】
ＮＢＣデータの予測精度はＲＣエントリ数には殆ど依存しないが、エントリの競合の頻度はＲＣエントリ数に大きく依存する。そこで、そうしたＲＣエントリ数の影響を調べるべく、ＲＣエントリ数を「８」、「１６」、「３２」、「６４」と変化させたときの各モデルのＩＰＣの測定を行っている。図２８は、その測定の結果を示している。同図のグラフの縦軸は、ＡＣモデルに対するＮＢ、ＣＰ、ideal モデルのＩＰＣ向上率を示している。また各ベンチマークにおける３本組の縦棒は、図中左からＮＢ、ＣＰ、ideal の各モデルのものとなっている。
【０２０９】
同図に示されるように、ＣＰモデルのＩＰＣ向上率は、ＲＣエントリ数が少ない場合ほど増加する。これは、ＮＢＣデータのみをレジスタ・キャッシュに書き込むＣＰモデルでは、ＲＣエントリ数が減少しても、エントリの競合はさほどには増加しないためである。ＲＣエントリ数が減少すれば、ＡＣモデルでは、クリティカル・パス上の命令、非クリティカル・パス上の命令の双方についてＲＣミス率は増加する。これに対してＣＰモデルでは、ＲＣエントリ数が減少しても、クリティカル・パス上の命令のＲＣミス率はそれほどには増加しない。したがってＲＣエントリ数が少ない場合には、クリティカル・パス上の命令に対するＣＰモデルでのＲＣヒット率は、ＡＣモデルよりも高くなると考えられる。
【０２１０】
以上説明した本実施形態によれば、以下に列記するような効果を奏することができる。
（１）本実施形態では、クリティカル・パス上の命令に使用され、且つオペランド・バイパスでは得られないデータ（ＮＢＣデータ）であると予測されたレジスタ値のみをレジスタ・キャッシュに書き込むようにしている。こうしてレジスタ・キャッシュに書き込まれるレジスタ値の種別を制限することで、レジスタ・キャッシュの書き込み頻度が低減され、ＮＢＣデータが上書きされ難いようになる。そのため、ＲＣミスがプロセッサの処理性能に与える悪影響の顕著なクリティカル・パス上の命令のＲＣミスを効果的に削減することができる。したがって、レジスタ・キャッシュの資源を有効活用しながら、プロセッサの処理性能を好適に向上することができる。
【０２１１】
（２）本実施形態では、ＮＢＣデータと予測されなかったレジスタ値を使用する命令については、ＲＣヒットを前提とした投機的な発行を禁止する、換言すれば、ＮＢＣデータと予測されたレジスタ値を使用する命令であることを条件に、ＲＣヒットを前提とした投機的な発行を行うようにしている。これにより、ＲＣミスが発生することが予め確定的な命令について、ＲＣヒットを前提とした投機的な発行がなされなくなり、ＲＣミスによる他の命令の発行の妨害を回避することができるようになる。
【０２１２】
（３）本実施形態では、命令の定義したレジスタ値がＮＢＣデータであるか否かの予測を、過去のその命令の実行時に定義したレジスタ値がＮＢＣデータであったか否かの履歴に基づいて行うようにしている。具体的には、ＮＢＣデータであったことが確認されたレジスタ値を定義した命令の識別情報（ＰＣの識別タグ）をＮＢＣデータ・テーブル１１１に記録保持する。そして、命令のフェッチ時にＮＢＣデータ・テーブル１１１を参照して、その命令の識別情報の登録の有無により、上記予測を行う。そのため、ＮＢＣデータの予測を、簡易なハードウェア構成で効果的に行うことができる。
【０２１３】
（４）命令の定義したレジスタ値がＮＢＣデータであるとの予測が誤りであることが確認されたときに、上記ＮＢＣデータ・テーブル１１１における、該当命令の識別情報を削除するようにしている。そのため、プログラム実行中における命令間のデータ依存関係の変化に好適に対応することができる。
【０２１４】
本実施形態は、次のように変形して実施することもできる。
・上記実施形態では、ＲＣ検出機構を設けることで、使用するレジスタ値がＮＢＣデータと予測された命令以外は、ＲＣヒットを前提とした投機的な発行を禁止することで、ＲＣミスによって他の命令の発行が妨害されることを回避するようにしていた。もっとも、こうしたＲＣ検出機構を設けずとも、ＮＢＣデータとなると予測されたレジスタ値のみをレジスタ・キャッシュに書き込むこととすれば、プロセッサの処理性能により顕著な悪影響を与えるクリティカル・パス上の命令のＲＣミスの発生を削減することはできる。よってこうしたクリティカル・パス上の命令のＲＣミスの削減のみで十分なプロセッサの処理性能を確保することができるのであれば、ＲＣ検出機構を割愛するようにしても良い。
【０２１５】
・上記実施形態では、過去の命令の実行時にその命令の定義したレジスタ値がＮＢＣデータであったか否かの履歴に基づいてＮＢＣデータの予測を行うようにしていたが、これ以外の手法でそうした予測が可能であれば、そうした予測手法を採用するようにしても良い。例えばレジスタ値がＮＢＣデータとなる命令のコミット時までの挙動に、そうでない命令とは異なる特定のパターンが見られるのであれば、そうした命令の挙動に基づいてＮＢＣデータの予測するようにすることもできる。
【０２１６】
・上記実施形態では、ＮＢＣデータとなると予測されるレジスタ値のみをレジスタ・キャッシュに書き込むようにしていたが、クリティカル・パス上の命令に使用されると予測されるレジスタ値のみをレジスタ・キャッシュに書き込むようにしても良い。この場合、オペランド・バイパスで得られるレジスタ値も含めて、クリティカル・パス上の命令に使用されるレジスタ値のすべてがレジスタ・キャッシュに書き込むため、書き込みをＮＢＣデータに限定した場合よりは、レジスタ・キャッシュの書き込み頻度は増加する。それでも、非クリティカル・パス上の命令に使用されるレジスタ値についてのレジスタ・キャッシュの書き込みは禁止されるため、クリティカル・パス上の命令のＲＣミスはある程度は削減されるようになる。
【図面の簡単な説明】
【０２１７】
【図１】物理レジスタ番号の割り当てが（ａ）ランダムな順で行われた場合、（ｂ）ラウンド・ロビンにソートされた順で行われた場合のそれぞれにおけるダイレクト・マップ方式のレジスタ・ファイルの動作態様の一例を示す模式図。
【図２】本発明の第１実施形態のプロセッサについてその構成を模式的に示すブロック図。
【図３】同実施形態のプロセッサに搭載されるＭＳＢの動作態様の一例を示す模式図。
【図４】同ＭＳＢのハードウェア量を削減した改良構成についてその動作態様の一例を示す模式図。
【図５】（ａ）〜（ｃ）巻き戻し機構の無いＭＳＢについてその分岐予測ミス発生時の動作態様を各示す模式図。
【図６】（ａ）〜（ｃ）巻き戻し機構を追加したＭＳＢについてその分岐予測ミス発生時の動作態様を各示す模式図。
【図７】複数命令発行対応型ＭＳＢの構成を模式的に示すブロック図。
【図８】同ＭＳＢにおけるＦＩＦＯの物理レジスタ番号の格納態様の一例を示す図。
【図９】同ＭＳＢの動作態様の一例について（ａ）はＦＩＦＯの初期状態を、（ｂ）〜（ｇ）各サイクルにおけるＭＳＢの動作状態をそれぞれ示す模式図。
【図１０】同ＭＳＢのリード回路の詳細な回路構成を示すブロック図。
【図１１】同ＭＳＢについてその各ＦＩＦＯのリード・フラグの動作回路を（ａ）ＦＩＦＯ番号順に接続した場合、（ｂ）配線長を考慮して接続した場合のそれぞれにおけるリード・フラグの接続態様をそれぞれ示す図。
【図１２】同ＭＳＢのサプライ回路の詳細な回路構成を示すブロック図。
【図１３】先頭ポインタ及びデコーダを多重化した構成について（ａ）そのサプライ回路の回路構成、及び（ｂ）デコーダ内部の回路構成をそれぞれ示すブロック図。
【図１４】同ＭＳＢのバックアップ・レジスタの詳細な回路構成を示すブロック図。
【図１５】レジスタ管理方式の異なる複数のプロセッサのモデルにおけるＲＣエントリ数とＲＣミス率との関係を示すグラフ。
【図１６】ＭＳＢモデル及びＭＳＢ−ｒモデルにおけるＲＣエントリ数と分岐予測ミス時に無効化されたＲＣエントリの数との関係を示すグラフ。
【図１７】レジスタ管理方式の異なる複数のプロセッサのモデルにおけるＲＣエントリ数とＩＰＣ向上率との関係を示すグラフ。
【図１８】プロセッサ構成の異なる複数のＭＳＢモデルにおけるＲＣエントリ数とＩＰＣ向上率との関係を示すグラフ。
【図１９】クリティカル・パスの説明に用いるプログラムの一例についてそのデータ・フロー構造を示すグラフ。
【図２０】（ａ）従来のレジスタ管理方式、及び（ｂ）本発明の第２実施形態でのレジスタ管理方式のそれぞれにおける、図１９のプログラムの実行態様をそれぞれ示すタイミングチャート。
【図２１】本発明の第２実施形態のプロセッサの模式的な構成を示すブロック図。
【図２２】同実施形態のプロセッサに採用されるＲＤＩテーブルの構成を模式的に示すブロック図。
【図２３】同実施形態のプロセッサに採用されるＮＢＣデータ・テーブルの構成を模式的に示すブロック図。
【図２４】図２５に示すＮＢＣデータ予測機構の更新動作の説明に用いられる命令列についてその（ａ）データ・フロー・グラフと（ｂ）各命令の内容を一覧して示す表とを併せ示す図。
【図２５】（ａ）〜（ｃ）ＮＢＣデータ予測機構の動作態様の一例を各示すブロック図。
【図２６】プログラムの実行中の命令間のデータ依存関係の変化に対応するための修正を加えたマップ表の構成を模式的に示すブロック図。
【図２７】レジスタ管理方式の異なる複数のプロセッサのモデルにおける各プログラムの実行時におけるＩＰＣ向上率を示すグラフ。
【図２８】上記各モデルにおけるＲＣエントリ数とＩＰＣ向上率との関係を示すグラフ。
【図２９】階層型レジスタ・ファイルを備えるプロセッサでの実行ユニットでの命令の実行に係るデータパスの構成を模式的に示すブロック図。
【符号の説明】
【０２１８】
１１，１０１…フェッチ・ユニット、１２，１０２…デコード・ユニット、１３，１０３…命令ウィンドウ、１４，１５，１０４，１０５，１５１，１５２…実行ユニット、１０５…リオーダ・バッファ、１６，１０６，１５５…メイン・レジスタ・ファイル、１７，１０７，１５４…レジスタ・キャッシュ、１８，１０８…マップ表、２０…ＭＳＢ（剰余整列バッファ：Modulo Sorting Buffer ）、３０…リード回路、３１…パイプライン・レジスタ、３２（３２Ａ〜３２Ｄ）…先頭ポインタ、３３…サプライ回路、３４…バックアップ・レジスタ、３５…ローテーション・バス、３６…サプライ・バス、４０，５５…メモリ・セル、４１，４２，５１，５７，５８…パス・トランジスタ、４３…ＡＮＤゲート、４４…マルチプレクサ、４５，５２…検出回路、５０（５０Ａ〜５０Ｄ）…デコーダ、５６…出力バス、１０９…ＣＰ予測機構、１１０…ＲＤＩテーブル、１１１…ＮＢＣデータ・テーブル、１５０…階層型レジスタ・ファイル、１５３…結果バス。
【図１】
2007304663.tif 000006
【図２】
2007304663.tif 000007
【図３】
2007304663.tif 000008
【図４】
2007304663.tif 000009
【図５】
2007304663.tif 000010
【図６】
2007304663.tif 000011
【図７】
2007304663.tif 000012
【図８】
2007304663.tif 000013
【図９】
2007304663.tif 000014
【図１０】
2007304663.tif 000015
【図１１】
2007304663.tif 000016
【図１２】
2007304663.tif 000017
【図１３】
2007304663.tif 000018
【図１４】
2007304663.tif 000019
【図１５】
2007304663.tif 000020
【図１６】
2007304663.tif 000021
【図１７】
2007304663.tif 000022
【図１８】
2007304663.tif 000023
【図１９】
2007304663.tif 000024
【図２０】
2007304663.tif 000025
【図２１】
2007304663.tif 000026
【図２２】
2007304663.tif 000027
【図２３】
2007304663.tif 000028
【図２４】
2007304663.tif 000029
【図２５】
2007304663.tif 000030
【図２６】
2007304663.tif 000031
【図２７】
2007304663.tif 000032
【図２８】
2007304663.tif 000033
【図２９】
2007304663.tif 000034