(57)【特許請求の範囲】
【請求項１】
命令をアウト・オブ・オーダに投機的に発行する命令発行部と、
前記命令発行部により発行された命令と、パイプランの各ステージにあるロード命令を含む複数の命令との直接的な依存関係を検出する第１の検出回路と、
前記第１の検出回路の出力信号と、前記ロード命令のキャッシュ・ミス信号とに基づき、前記命令発行部により発行された命令と、前記パイプランの各ステージにあるキャッシュ・ミスしたロード命令との間接的な依存関係を検出する第２の検出回路と
を具備することを特徴とする命令発行装置。
【請求項２】
前記第１の検出回路は、前記パイプラインステージの数と同数設けられ、命令の実行結果が順次書き込まれるデスティネーション・レジスタの番号を保持する直列接続された第１の記憶部と、
前記第１の記憶部に保持された前記デスティネーション・レジスタの番号と前記ロード命令に続く命令のソース・レジスタの番号とを比較し、前記他の命令が前記ロード命令に直接的に依存関係を有しているかどうかを判定する複数の比較器と
を具備することを特徴とする請求項１記載の命令発行装置。
【請求項３】
前記第２の検出回路は、複数のロード命令に対する依存関係を保持するため、パイプラインステージごとに依存元のロード命令に対する依存関係を保持する第１のラッチ回路と、
前記キャッシュ・ミス信号を前記パイプラインの動作に同期して保持する複数の第２のラッチ回路と、
前記第２のラッチ回路の出力信号と、前記各比較器の出力信号とに応じて、前記ロード命令に直接依存し、前記キャッシュ・ミス信号を含んだ信号を発生する複数の第１の論理回路と、
前記第１のラッチ回路の出力信号と前記比較器の出力信号、及び前記第１の論理回路の出力信号に応じて、前記ロード命令に間接的に依存する命令を検出する第２の論理回路と
を具備することを特徴とする請求項２記載の命令発行装置。
【請求項４】
前記命令発行部は、前記第２の検出回路の出力信号に応じて、前記ロード命令に依存する命令を無効化することを特徴とする請求項３記載の命令発行装置。
【請求項５】
前記命令発行部は、キャッシュがリフィルされた後、前記無効化された命令を再発行することを特徴とする請求項４記載の命令発行装置。
【請求項６】
命令をアウト・オブ・オーダに投機的に発行する命令発行部と、
前記命令発行部により発行された命令と、パイプランの各ステージにあるロード命令を含む複数の命令との直接的な依存関係を検出する第１の検出回路と、
前記第１の検出回路の出力信号と、前記ロード命令のキャッシュ・ミス信号とに基づき、前記命令発行部により発行された命令と、前記パイプランの各ステージにあるキャッシュ・ミスしたロード命令との間接的な依存関係を検出する第２の検出回路と、
パイプラインで実行中の命令の書き込みレジスタに有効なデータが有るか否かを示す情報を保持する第１の記憶部と、
前記第１の記憶部の出力信号に応じて、レジスタが使用可能かどうかを示す情報を記憶する第２の記憶部と、
前記第１、第２の記憶部の出力信号に応じて、前記命令発行部のソースオペランドの有効性を示す情報を更新する更新回路と
を具備することを特徴とする命令発行装置。
【請求項７】
前記第２の記憶部は、前記第２の検出回路の出力信号に応じて、キャッシュ・ミスした前記ロード命令に依存するレジスタに対応するフラグをクリアする第３の論理回路を有することを特徴とする請求項６記載の命令発行装置。
【請求項８】
第１の検出回路でロード命令と後続の命令との直接的な依存関係を検出し、
第２の検出回路で前記ロード命令と後続の命令との間接的な依存関係を検出し、この検出した間接的な依存関係を直接的な依存関係に変換し、
前記ロード命令にキャッシュ・ミスが発生したことを示す信号と変換された前記直接的な依存関係とにより、前記ロード命令と間接的な依存関係を有する命令を検出する
ことを特徴とする命令発行方法。
【請求項９】
前記検出されたロード命令と直接的な依存関係を有する命令、及び前記検出されたロード命令と間接的な依存関係を有する命令を無効化することを特徴とする請求項８記載の命令発行方法。
【請求項１０】
キャッシュがリフィルされた場合、前記無効化された命令を再発行することを特徴とする請求項９記載の命令発行方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、例えばアウト・オブ・オーダ（Ｏｕｔ−ｏｆ−ｏｒｄｅｒ）に命令を発行するマイクロプロセッサに係わり、特に、命令スケジュールユニットに使用される命令発行装置及び命令発行方法に関する。
【０００２】
【従来の技術】
マイクロプロセッサにおける命令の実行方式としてアウト・オブ・オーダ実行がある。このアウト・オブ・オーダ実行は、先行命令と依存関係の無い後続命令を順不同に実行する方式である。アウト・オブ・オーダ実行は、演算器を有効に利用することが可能であり、マイクロプロセッサを高速に動作させることができる。
【０００３】
ところで、アウト・オブ・オーダに命令を発行するマイクロプロセッサは、投機的に命令を発行し実行する。このため、ロード命令にキャッシュ・ミスが発生した場合、このロード命令にデータが依存した幾つかの命令を無効とする必要がある。この後、キャッシュ・メモリがリフィルされると、キャッシュ・ミスしたロード命令に依存関係のある命令群が再発行され、実行される。
【０００４】
図１４は、ロード命令に続いて発行された複数の命令とロード命令との依存関係を示している。ここで、Ｉ、Ｒ、Ｅ、Ｍは、パイプラインの各ステージを示し、Ｉは命令フェッチ、Ｒはレジスタ・リネーミング、Ｅは実行、Ｍはデータ・キャッシュ・アクセスである。ロード命令が発行されてから命令がオペランドを読み出すまでのレイテンシは３サイクルある。このため、ロード命令が発行された次のサイクルと、その次のサイクル（図１４に示すスロット１、２）にロード命令とデータが依存のある命令を発行できないようにスケジュールされる。スロット３とスロット４では、キャッシュがヒットすると仮定してロード命令に依存関係のある命令が投機的に発行される。キャッシュ・ミスが判明するのはＭステージである。このため、命令のスケジューリングによる遅延のため、スロット４の命令発行の時点において、スロット０のキャッシュ・ミスの有無を考慮できない。
【０００５】
ところが、スロット０のロード命令がキャッシュ・ミスしているため、データを得ることができない。このため、スロット３とスロット４の命令は発行されたものの正しく実行できないこととなる。したがって、キャッシュ・ミスしたスロット０のロード命令と、スロット３、４にある命令を全て破棄した後、キャッシュのリフィルを行い、ロード命令を再発行する。さらに、スロット３、４にあった破棄された命令を再発行する。スロット３と４には、ロード命令とデータが依存関係のない命令が配置されることもある。この場合、命令を破棄する必要はない。しかし、依存関係の有無によって破棄するかどうかを決定することは困難である。このため、スロット３、４の命令をとにかく破棄し、後に再実行する。したがって、無駄に命令を破棄してしまい命令実行効率が低下する。
【０００６】
各スロットは、複数の命令を実行できる。近時、１つのスロットにおいて、２つの整数演算命令を同時に実行できるマイクロプロセッサが開発されている。この場合、合計４命令を破棄することになる。４命令が全てロード命令に依存のない場合、全てが無駄に破棄されたことになる。
【０００７】
例えば、文献「Ｒ．Ｅ．  Ｋｅｓｓｌｅｒ、”Ｔｈｅ  Ａｌｐｈａ  ２１２６４  Ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ  Ａｒｃｈｉｔｅｃｔｕｒｅ”、Ｐｒｏｃｅｅｄｉｎｇｓ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｃｏｍｐｕｔｅｒ  Ｄｅｓｉｇｎ：  ＶＬＳＩ  ｉｎ  Ｃｏｍｐｕｔｅｒｓ  ａｎｄ  ｐｒｏｃｅｓｓｏｒｓ、１９９８、ＩＣＣＤ  ”９８、ｐ９０−９５」には、キャッシュ・ミスしたロード命令に依存関係のある命令群を再実行するための方法が開示されている。
【０００８】
上記文献場合、ロード命令がヒットするか否かを予測し、ヒットと予測した場合のみ依存関係のある命令を発行することによって、命令を破棄する確率を下げている。しかし、ロード命令がヒットと予測され、ロード命令と依存関係のない命令が発行された場合においても、実際にはロード命令がミスヒットすることがある。この場合、ロード命令と依存関係のない命令が無駄に破棄されることになる。
【０００９】
【発明が解決しようとする課題】
上記依存関係のない命令を無駄に破棄しないようにするため、スロット３、４の命令がロード命令に依存するかどうかを判定し、依存関係のある命令だけを破棄するようにしたとする。しかし、実際には、ロード命令以降の命令がロード命令の結果に依存するかどうかを判断するだけでは不十分である。すなわち、ロード命令に直接依存しなくとも、例えばロード命令に直接依存するスロット３の命令にスロット４の命令がさらに依存するかどうかも調べる必要がある。つまり、ロード命令に直接依存する命令だけでなく、ロード命令に直接依存する命令に、さらに依存する命令といった多段の間接依存関係にある命令もキャンセルする必要がある。
【００１０】
しかし、一般に、間接的に依存する命令は検出せず、投機的に発行した依存関係を有する全ての命令をキャンセルする。この場合、キャンセルしなくてもよい命令をキャンセルしてしまい、実行効率が低下する。また、多段の間接依存関係を全て検出するためには、データ・フロー・グラフをトレースする必要がある。これを実現しようとする場合、ハードウエアコストが大きくなるとともに、周波数低下の原因にもなる。
【００１１】
本発明は、上記課題を解決するためになされたものであり、その目的とするところは、ロード命令において、キャッシュ・ミスが発生した際、このロード命令と多段の依存関係を有する命令を高速に検出することが可能な命令発行装置及び命令発行方法を提供しようとするものである。
【００１２】
【課題を解決するための手段】
本発明の命令発行装置は、上記課題を解決するため、命令をアウト・オブ・オーダに投機的に発行する命令発行部と、前記命令発行部により発行された命令と、パイプランの各ステージにあるロード命令を含む複数の命令との直接的な依存関係を検出する第１の検出回路と、前記第１の検出回路の出力信号と、前記ロード命令のキャッシュ・ミス信号とに基づき、前記命令発行部により発行された命令と、前記パイプランの各ステージにあるキャッシュ・ミスしたロード命令との間接的な依存関係を検出する第２の検出回路とを具備している。
【００１３】
本発明の命令発行方法は、第１の検出回路でロード命令と後続の命令との直接的な依存関係を検出し、第２の検出回路で前記ロード命令と後続の命令との間接的な依存関係を検出し、この検出した間接的な依存関係を直接的な依存関係に変換し、前記ロード命令にキャッシュ・ミスが発生したことを示す信号と変換された前記直接的な依存関係とにより、前記ロード命令と間接的な依存関係を有する命令を検出することを特徴とする。
【００１４】
【発明の実施の形態】
以下、本発明の実施の形態について図面を参照して説明する。
【００１５】
図１は、命令発行装置と実行ユニットの構成を示している。先ず、図１の構成について概略的に説明する。
【００１６】
命令発行装置は、例えばＴステージ、Ｒステージ、Ｓステージ、Ｄステージ、Ａステージを有している。Ｒステージ以降の各ステージは、整数ユニット（ＩＵ）及び浮動小数点ユニット（ＦＰＵ）からなる２系統の回路を有している。
【００１７】
Ｔステージは、命令フェッチステージであり、命令をフェッチする命令フェッチユニット１１を有している。命令フェッチユニット１１は、例えば２命令を同時にフェッチする。
【００１８】
Ｒステージはレジスタ・リネーミング・ステージである。Ｒステージは、前記命令フェッチユニット１１に接続された命令デコーダ１２、レジスタ・リネーミング・ユニット１３ａ、１３ｂを有している。レジスタ・リネーミング・ユニット１３ａ、１３ｂは、さらに命令デコーダ１２に接続されている。命令デコーダ１２は命令フェッチユニット１１から供給される命令をデコードする。各レジスタ・リネーミング・ユニット１３ａ、１３ｂは、例えばデコードされた２命令の論理レジスタに未使用の物理レジスタをそれぞれ割り当てる。
【００１９】
Ｓステージは、命令スケジューリングステージである。このＳステージは、命令・ウィンドウ・バッファ（命令発行部）１４ａ、１４ｂ、レジスタ・スコア・ボード・ユニット１５ａ、１５ｂを有している。命令・ウィンドウ・バッファ１４ａは、命令デコーダ１２、レジスタ・リネーミング・ユニット１３ａ、及びレジスタ・スコア・ボード・ユニット１５ａに接続されている。また、命令・ウィンドウ・バッファ１４ｂは、命令デコーダ１２、レジスタ・リネーミング・ユニット１３ｂ、及びレジスタ・スコア・ボード・ユニット１５ｂに接続されている。
【００２０】
前記レジスタ・スコア・ボード・ユニット１５ａ、１５ｂは、例えばフリップフロップ回路により構成され、パイプラインで実行中の命令の書き込みレジスタに有効なデータが有るか否かを示す情報（フラグ）を保持する。命令・ウィンドウ・バッファ１４ａ、１４ｂは、レジスタ・リネーミング後の物理レジスタ番号等を保持し、レジスタ・スコア・ボード・ユニット１５ａ、１５ｂからの命令ステータスに基づき、所定の条件を満足した場合、命令を発行する。命令・ウィンドウ・バッファ１４ａは、パイプラインＩ０、Ｉ１に命令を発行する。
【００２１】
前記レジスタ・スコア・ボード・ユニット１５ａは、依存関係検索回路（ＤＬＣ）１６に接続されている。ＤＬＣ１６は、ロード命令に直接的、又は間接的に依存した命令を検索する。ＤＬＣ１６はレジスタ・スコア・ボード・ユニット１５ａに設けられている。これは、一般に、ロード命令が直接データを書き込むのは整数レジスタファイルだからである。しかし、命令セットによっては、浮動小数点レジスタファイルでデータを書き込むこともある。したがって、図１に破線で示すように、ＤＬＣ１６をレジスタ・スコア・ボード・ユニット１５ｂに設けてもよい。
【００２２】
命令・ウィンドウ・バッファ１４ａ、レジスタ・スコア・ボード・ユニット１５ａ及びＤＬＣ１６の詳細については後述する。
【００２３】
Ｄステージは、レジスタ・リード・ステージである。Ｄステージは、レジスタ・ファイル１７ａ、１７ｂを有している。レジスタ・ファイル１７ａは前記命令ウィンドウ・バッファ・１４ａに接続され、レジスタ・ファイル１７ｂは前記命令ウィンドウ・バッファ・１４ｂに接続されている。
【００２４】
Ａステージは、ＡＬＵ演算ステージである。Ａステージは、演算ユニット１８、１９、及び浮動小数点ユニット２０を有している。演算ユニット１８は、整数ユニット１８ａ、ロード・ストア・ユニット１８ｂを有している。演算ユニット１９は、整数ユニット１９ａ、乗算除算ユニット１９を有している。整数ユニット１８ａ、ロード・ストア・ユニット１８ｂ、整数ユニット１９ａ、乗算除算ユニット１９は、レジスタ・ファイル１７ａに接続されている。浮動小数点ユニット２０はレジスタ・ファイル１７ｂに接続されている。
【００２５】
前記ロード・ストア・ユニット１８ｂは、アウト・オブ・オーダ実行を行うプロセッサにおいて、アウト・オブ・オーダに処理されるロード命令、ストア命令に対して、メモリを介したデータ依存関係を維持する。具体的には、ロード・ストア・ユニット１８ｂは、メモリアクセス命令の順番を把握し、アウト・オブ・オーダに発行されるメモリアクセス命令の順序を管理する。さらに、ロード・ストア・ユニット１８ｂは、ロード命令の実行において、図示せぬデータ・キャッシュがミスヒットした場合、キャッシュ・ミス信号Ｌ０Ｍｉｓｓ１ｎ（ｎはパイプラインのステージ）を出力する。このキャッシュ・ミス信号Ｌ０Ｍｉｓｓ１ｎは前記ＤＬＣ１６に供給される。
【００２６】
図２は、本実施例のパイプラインの一例を示すダイアグラムである。各ステージの意味は、次の通りである。
【００２７】
Ｆ：命令フェッチステージ１
Ｉ：命令フェッチステージ２
Ｔ：命令転送
Ｒ：レジスタ・リネーミング
Ｓ：命令スケジューリング
Ｄ：レジスタ・リード
Ａ：ＡＬＵ演算
Ｗ：ライト・バック
Ｘ：Ｗの次
Ｙ：Ｘの次
Ｚ：Ｙの次
Ｃ：完了
Ｍ：データ・キャッシュ・アクセス
図１に示す構成において、Ｔステージは、図２のＦ、Ｉ、Ｔステージに対応している。
【００２８】
次に、図１に示す各部の動作について説明する。
【００２９】
（命令フェッチ）
命令フェッチユニット１１は、実行すべき２命令をフェッチする。この命令フェッチユニット１１によりフェッチされた２命令は、Ｒステージに供給される。
【００３０】
（レジスタ・リネーミング）
命令デコーダ１２は、命令フェッチユニット１１から供給される命令をデコードし、その命令がソースオペランドを必要とするか、及び演算結果はデスティネーション・レジスタに書き込まれるかを判断する。レジスタ・リネーミング・ユニット１３ａ、１３ｂは、命令とデコード情報に基づき、命令のソース・レジスタとデスティネーション・レジスタの論理レジスタ番号に物理レジスタ番号を割り当てる。図示せぬマッピングテーブルには、論理レジスタ番号に対してそれまでに割り当てられた物理レジスタ番号が対応して保存されている。このため、論理レジスタ番号をキーとして最後に割り当てられた物理レジスタ番号を検索することができる。ソース・レジスタを割り当てる場合、命令コードから取り出した論理レジスタ番号（Ｒｓ、Ｒｔ）をマッピングテーブルにインデックスとして入力し、物理レジスタ番号（ＰＲｓ、ＰＲｔ）を検索する。デスティネーション・レジスタ（Ｒｄ）を割り当てる場合、先ず、未使用の物理レジスタ番号を保持しているフリーリストから未使用の物理レジスタ番号を取り出す。この物理レジスタ番号をデスティネーション・レジスタに割り当てる。さらに、割り当てた物理レジスタ番号（ＰＲｄ）を論理レジスタ番号をキーとして参照できるように、マッピングテーブルに書き込む。同じ論理レジスタ番号にそれまで割り当てられていた物理レジスタ番号（マッピングテーブルにおいて上書きされた物理レジスタ番号）は、論理レジスタ番号とあわせてアクティブリストに書き込まれる。アクティブリストは、最大で６４個の命令をキューイングすることができる。アクティブリストには各エントリにインデックス番号が設けられている。このインデックス番号は、ＩＴａｇとして他のユニットにおいて命令をアイデンティファイするために用いられる。
【００３１】
（命令・ウィンドウ・バッファ）
図３は、前記命令・ウィンドウ・バッファ１４ａ、１４ｂの一例を示している。命令・ウィンドウ・バッファ１４ａ、１４ｂは、例えば１６個のエントリを有している。各エントリは命令の古い順に並んでいる。新しい命令が命令フェッチユニット１１から供給された場合、空いているエントリうち、最も古い命令が入っているエントリに近いエントリに書き込まれる。
【００３２】
命令・ウィンドウ・バッファ１４ａ、１４ｂは、命令デコーダ１２から供給される命令デコード情報と、レジスタ・リネーミング・ユニット１３ａ、１３ｂから供給される物理レジスタ番号と、命令フェッチユニット１１から供給される命令コードと、命令バリッド（Ｖａｌｉｄ）信号とを記憶する。すなわち、命令フェッチユニット１１から出力された命令バリッド信号が“１”であるとき、命令・ウィンドウ・バッファ１４ａ、１４ｂは、命令コードと、物理レジスタ番号などを空いたエントリに書き込む。命令・ウィンドウ・バッファに空きエントリが無くなった場合、命令フェッチユニット１１に対してフェッチ停止要求（Ｆｅｔｃｈ  Ｓｔａｌｌ  Ｒｅｑｕｅｓｔ）信号をアサートする。
【００３３】
命令・ウィンドウ・バッファ１４ａ、１４ｂは、コンプレッサ１４ｃを有している。命令を実行ユニットに発行した後、このコンプレッサ１４ｃは、発行された命令のエントリを無効化し、空きエントリを作成する。
【００３４】
前述したように、Ｒステージ以降の各ステージは、整数ユニット（ＩＵ）及び浮動小数点ユニット（ＦＰＵ）からなる２系統の回路を有している。しかし、以下の説明において、ＦＰＵの動作は省略し、ＩＵの動作のみ説明する。
【００３５】
図４は、命令・ウィンドウ・バッファを構成する各エントリのフォーマットを示している。図４に示す各フィールドについて簡単に説明する。
【００３６】
ＩＴａｇ：命令に対してユニークに振られた識別子であり、０〜６３のいずかの値をとる。この値は、アクティブリストのエントリ番号と等しい。
【００３７】
Ｉｎｓｔｒｕｃｔｉｏｎ：３２ｂｉｔ長の命令コードそのもの。
【００３８】
ＦＵ：命令を発行すべきＦｕｎｃｔｉｏｎａｌ  Ｕｎｉｔを示すフィールド。Ｒステージで命令がデコードされ、命令の種類によってＦＵ（ファンクション・ユニット）が決定される。このＦＵは、レジスタ・リネーミング情報とともに命令・ウィンドウ・バッファに書き込まれる。ＦＵは４ビットにより構成されている。ｂｉｔ３は命令がＡＬＵ命令であり、Ｉ０の整数ユニットに発行されるべきものを示す。ｂｉｔ２はロード・ストア・ユニットである。ｂｉｔ１はＩ１の整数ユニットに命令が発行されるべきことを示し、ｂｉｔ０は乗除算ユニットに命令が発行されるべきことを示している。
【００３９】
ＰＲｓ、ＰＲｔ、ＰＲｆ：ソースオペランドの物理レジスタ番号。
【００４０】
ＰＲｄ：デスティネーションの物理レジスタ番号。
【００４１】
ＲｓＲｄｙ、ＲｔＲｄｙ、ＲｆＲｄｙ：ソース・レジスタのＰＲｓ、ＰＲｔ、ＰＲｆが使用可能であることを示すフラグ。すなわち、Ｒｓ、Ｒｔ、Ｒｆと同一番号の物理レジスタに書き込む命令が実行を終了して演算結果が（内部バイパスや、レジスタ・ファイルを通して）使える状態になる３サイクル前にセットされる。この３サイクルは、このＲｄｙビットを参照してから命令を発行し、さらに命令がオペランドを読み出すまでのレイテンシ分に当たる。
【００４２】
ＥｎｔｒｙＲｄｙ：グローバルなエントリＲｅａｄｙビットであり、何らかの理由、例えば命令がイン・オーダーに実行される場合にセットされる。また、ある時点で実行不可能な場合にはクリアされる。
【００４３】
Ｌ１ＭｉｓｓＳＭ：ロード命令又はストア命令である場合、キャッシュ・ミス、非キャッシュ・アクセス等のステートを保持するレジスタ。命令のキャッシュ・ミス後において、再発行（ロールバック）タイミングを決めるためのもの。
【００４４】
ＩｎＦｌｉｇｈｔ：エントリの命令が現在実行中であることを示す。
【００４５】
Ｒｓｖ：エントリが次のサイクルでどのユニット（Ｉ０／Ｉ１）に発行予定であるかを示す。
【００４６】
Ｖａｌｉｄ：有効なエントリであるかどうかを示す。
【００４７】
（命令・ウィンドウ・バッファ・エントリのアップデート）
命令・ウィンドウ・バッファ１４ａは、各エントリをアップデートするためのアップデート回路を有している。
【００４８】
図５は、命令・ウィンドウ・バッファ１４ａのアップデート回路２１の一例を示している。図５において、図１と同一部分には同一符号を付している。
【００４９】
命令・ウィンドウ・バッファ１４ａの各エントリには、アップデート回路２１が接続されている。このアップデート回路２１は、命令・ウィンドウ・バッファ１４ａに蓄えられた命令を、先行する命令の実行進度に応じて各種ステータスビットを更新する。すなわち、アップデート回路２１には、ＲＡＴ（Ｒｅｇｉｓｔｅｒ  Ａｖａｉｌａｂｉｌｉｔｙ  Ｔａｂｌｅ）２２が接続されている。このＲＡＴ２２には、レジスタ・スコア・ボード・ユニット１５ａが接続されている。レジスタ・スコア・ボード・ユニット１５ａ及びＲＡＴ２２は、物理レジスタ番号をキーとして参照する記憶部であり、物理レジスタが使用可能かどうかを示している。このＲＡＴ２２は、データの演算が終了すると、レジスタ・スコア・ボード・ユニット１５ａから供給される信号に応じて、演算結果を格納する物理レジスタにフラグがセットされる。アップデート回路２１は、ＲＡＴ２２から供給されるレジスタのステータス及びレジスタ・スコア・ボード・ユニット１５ａから供給される命令のステータスに基づき、エントリを毎サイクルアップデートする。
【００５０】
さらに、命令・ウィンドウ・バッファ１４ａの各エントリには、前記ＤＬＣ１６が接続されている。このＤＬＣ１６は、ロード・ストア・ユニット１８ｂから出力されるキャッシュ・ミス信号に応じてロード命令に依存する命令を検索する。ＤＬＣ１６から出力される依存関係を示す信号Ｄｐｅｎｄ１Ａは、レジスタ・スコア・ボード・ユニット１５ａ、及びＲＡＴ２２に供給される。ＤＬＣ１６から信号Ｄｅｐｅｎｄ１Ａが出力された場合、レジスタ・スコア・ボード・ユニット１５ａの命令のステータスに基づき、依存関係のある物理レジスタに対するＲＡＴ２２のエントリを無効化する。さらに、アップデート回路２１は、命令・ウィンドウ・バッファ１４ａ内において、依存関係のある物理レジスタを無効状態にリセットする。ロード命令の実行時において、キャッシュ・ミスが発生した時の詳細な動作は後述する。
【００５１】
（命令発行）
前述したように、本実施形態の命令発行装置は、同時に２つの命令を発行する。命令・ウィンドウ・バッファ１４ａの各エントリの命令は、次の条件を満たした時、発行可能な状態となる。
【００５２】
（１）ＲｓＲｄｙ、ＲｔＲｄｙ、ＲｆＲｄｙ、ＨｓＲｄｙ、ＥｎｔｒｙＲｄｙが全てセットされている（発行許可の状態になっている）。
【００５３】
（２）ＦＵで指定される命令実行ユニット（ＩＵ０、ＩＵ１、ＬＳＵ、ＭＡＣ）が以前の演算を終了し、命令を受けられる状態であること。
【００５４】
（３）レジスタ・ファイルのライトポートコンフリクトがないこと（レジスタ・ファイルに結果を書き込むべきタイミングの時、ライトポートが空いていること）。
【００５５】
（４）ＩｎＦｌｉｇｈｔビットがクリアされていること（同一命令が実行中でないこと）。
【００５６】
（５）Ｌ１ＭｉｓｓＳＭが発行停止状態でないこと。
【００５７】
図６は、上記条件を判定するためのディスパッチ決定回路３１の一例を示している。このディスパッチ決定回路３１は、命令・ウィンドウ・バッファ１４ａの各エントリに独立に設けられている。図６は、１つのエントリのディスパッチ・ロジックを示している。ディスパッチ決定回路３１は、命令・ウィンドウ・バッファ１４ａの各エントリとレジスタ・スコアボード・ユニット１５ａに接続されている。ディスパッチ決定回路３１は、命令・ウィンドウ・バッファ１４ａの各エントリとレジスタ・スコアボード・ユニット１５ａから供給される信号に応じて上記条件を判定する。この判定に応じてディスパッチ決定回路３１は、各エントリがそれぞれどの実行ユニットに命令を発行することが可能であるかを示す信号ｄｉｓｐａｔｃｈａｂｌｅ  ｔｏ  Ｉ０、Ｉ１を出力する。
【００５８】
図７は、発行可能なエントリから発行予定エントリを決定する回路の一例を示している。各エントリのディスパッチ決定回路から出力される信号ｄｉｓｐａｔｃｈａｂｌｅ  ｔｏ  Ｉ０、Ｉ１は、プライオリティ・セレクタ４１の入力端に供給される。このプライオリティ・セレクタ４１の出力端は、アップデート回路４２に供給される。
【００５９】
プライオリティ・セレクタ４１は、複数のエントリが同時に同一実行ユニットに対して発行可能であった場合、そのうちの最も古いエントリから出力される信号ｄｉｓｐａｔｃｈａｂｌｅ  ｔｏ  Ｉ０、Ｉ１を選択する。さらに、プライオリティ・セレクタ４１は、選択されたエントリに対して信号ｄｉｓｐａｔｃｈ  ＥｎｔＸ  ｔｏ  ＩＹ  （  Ｘ＝０，１〜１５）、（Ｙ＝０，１）を出力する。この信号ｄｉｓｐａｔｃｈ  ＥｎｔＸ  ｔｏ  ＩＹ  （  Ｘ＝０，１〜１５）、（Ｙ＝０，１）は、アップデート回路４２に供給される。このアップデート回路４２は、信号ｄｉｓｐａｔｃｈ  ＥｎｔＸ  ｔｏ  ＩＹ  （  Ｘ＝０，１〜１５）、（Ｙ＝０，１）がアサートされたエントリに対応するＲｓｖビットをセットする。
【００６０】
（１６−１Ｍｕｘ制御について）
図８は、命令・ウィンドウ・バッファ１４ａの一例を示す構成図である。図８は、１６個のエントリからパイプラインＩ０とパイプラインＩ１に命令を発行する様子を示している。各エントリ０〜１５にはマルチプレクサ（ＭＵＸ）５１、５２の入力端が接続されている。マルチプレクサ５１、５２は、各エントリのＲｓｖビットの内容に応じて制御される。マルチプレクサ５１の出力端は、ラッチ回路５３に接続され、マルチプレクサ５２の出力端は、ラッチ回路５４に接続されている。ラッチ回路５３は、パイプラインＩ０に命令を発行し、ラッチ回路５４は、パイプラインＩ１に命令を発行する。
【００６１】
前述したように、命令・ウィンドウ・バッファ１４ａの各エントリに設けられた命令発行予定を示すＲｓｖビットがセットされている場合、そのエントリは、次のサイクルでディスパッチされる命令である。このため、Ｒｓｖ［１］がセットされている場合、マルチプレクサ５２を介してパイプＩ０に進み、Ｒｓｖ［０］がセットされている場合、マルチプレクサ５１を介してパイプＩ１に進む。すなわち、Ｓステージの最後（Ｒｓｖビットが既にセットされているサイクル）において、Ｒｓｖビットの値に応じて、マルチプレクサ５１、５２によりパイプＩ０とＩ１それぞれに対して、１６個のエントリのうち、１つのエントリが選択される。この選択されたエントリは、ラッチ回路５３、５４にラッチされる。ラッチ回路５３、５４の出力信号はレジスタ・ファイル１７ａを介して各演算ユニットに送られる。ラッチ回路５３の出力信号は、パイプラインＩ０に設けられた整数ユニット１８ａ、及びロード・ストア・ユニット１８ｂに供給される。ラッチ回路５４の出力信号は、パイプラインＩ１に設けられた整数ユニット１９ａ、乗算・除算ユニット１９ｂに供給される。各演算ユニットは、レジスタ・ファイル１７ａからデータを読み出し、決められた演算やメモリアクセスを行う。各演算ユニットの演算結果はレジスタ・ファイル１７ａに書き込まれる。
【００６２】
（ＲＡＴの参照と更新）
図５に示すＲＡＴ２２は、前述したように、物理レジスタ番号をキーにして参照するテーブルであり、その物理レジスタが使用可能かどうかを示している。このＲＡＴ２２はレジスタ・スコア・ボードロジックの一部でもある。ＲＡＴ２２のエントリに例えば“１”がセットされている場合、そのエントリに対応する物理レジスタのデータは既に求められており、参照可能であることを示している。また、ＲＡＴ２２のエントリに例えば“０”がセットされている場合、そのエントリに対応する物理レジスタのデータは参照できない。
【００６３】
アップデート回路２１は、命令・ウィンドウ・バッファ１４ａの各エントリのＲｓ、Ｒｔ、Ｒｆに対応するＲＡＴ２２を参照する。この結果、ＲＡＴ２２のＲｓ、Ｒｔ、Ｒｆに対応するエントリに“１”がセットされている場合、ＲｓＲｄｙ、ＲｔＲｄｙ、ＲｆＲｄｙをセットする。また、アップデート回路２１は、命令・ウィンドウ・バッファ１４ａの各エントリのＲｓ、Ｒｔ、Ｒｆに対応するＲＡＴ２２を参照する。この結果、ＲＡＴ２２のＲｓ、Ｒｔ、Ｒｆに対応するエントリに“０”がセットされている場合、ＲｓＲｄｙ、ＲｔＲｄｙ、ＲｆＲｄｙをクリアする。
【００６４】
データの依存関係をチェックするため、命令ディスパッチ時にＲＡＴ２２を参照するタイミングと、実際にデータを参照する（レジスタ・ファイル１７ａを読み出す、あるいはデータをバイパスする）タイミングにはずれがある。このため、ある命令の実行が終了した時、その物理デスティネーション・レジスタにデータが書き込まれるよりも３サイクル早いタイミングで、その書き込みレジスタのＲＡＴ２２をセットする。
【００６５】
図９は、ＡＬＵ命令の動作タイミングの一例を示している。図９において、ＲＡＴ２２はＳステージでセットされる。一方、データが実際に得られるのは３サイクル後のＷステージである。このため、ＲＡＴ２２のセットタイミングと書き込みタイミングとがずれている。
【００６６】
図１０は、ロード命令の動作タイミングの一例を示している。ロード命令の場合、Ｗステージの３サイクル前であるＤステージでＲＡＴ２２をセットする。
【００６７】
また、その物理レジスタを使用しなくなったとき、その物理レジスタに対応するＲＡＴ２２をクリアする。すなわち、同一論理レジスタに別の物理レジスタが割り当てられ、その使用が終了した場合、以前に割り付けられていた物理レジスタを開放する。このとき、その物理レジスタに対応するＲＡＴ２２をクリアする。
【００６８】
また、通常、ＲＡＴ２２は投機的に実行された命令のデスティネーション・レジスタに対しても即座に更新される。これは依存関係のある命令を最短のレイテンシで実行し、アウト・オブ・オーダのメリットを生かすためである。しかし、分岐予測ミスや、例外が発生した場合、予測ミスした分岐命令や、例外を発生した命令が終了したイン・オーダーの時点にＲＡＴ２２を戻す必要がある。例えば例外が発生した命令の次の命令は実行前で止まる必要がある。このため、その命令が書き込む物理レジスタは、ＲＡＴ内において無効にしなければならない。このようなＲＡＴを便宜上ワーキングＲＡＴと呼ぶ。
【００６９】
ところが、実際は投機的に命令を実行している。このため、既にワーキングＲＡＴはセットされている可能性がある。したがって、命令の実行が完了した時、例外発生や分岐予測ミスを判定し、実行が完了した時のステートを持つイン・オーダーで更新するＲＡＴ（便宜上、イン・オーダーＲＡＴと呼ぶ）を別に１セット設けておく。例外発生、分岐予測ミス時、イン・オーダーＲＡＴの内容をワーキングＲＡＴに一括コピーする。これによって、ワーキングＲＡＴを、分岐予測ミスや例外発生直後の状態にリストアすることができる。
【００７０】
（データ・キャッシュ・ミス時の動作）
図１０に示すロード命令のタイミング図から分かるように、ロード命令のデスティネーション・レジスタＲｄに対応するＲＡＴのセットは、レイテンシを最短にするため、ロード命令のＤステージで行われる。これはロード命令のキャッシュ・ミスが判明するＷステージの３サイクル前である。すなわち、この３サイクル間はロード命令がミスするかもしれない状況にもかかわらず、ロード命令の実行結果にデータが依存した命令を発行してしまう。このような構成とすることにより、仮に、ロード命令がヒットした場合、最短のレイテンシで命令を実行することが可能となる。
【００７１】
本質的には、ＲＡＴの更新のためのサイクル、参照のためのサイクルと、ディスパッチのためのサイクルの３サイクルがこれに当たる。しかし、これを０サイクルとすることはできない。このため、そのサイクル分だけ、投機実行となる期間が確実に存在する。
【００７２】
キャッシュがヒットした場合、何も問題は生じない。したがって、命令の実行を続ければよい。しかし、キャッシュ・ミスが発生した場合、次のような処理を行う必要がある。すなわち、
（１）キャッシュ・ミスしたロード命令、ならびに、ロード命令に依存しスケジュールが完了し、又は実行中の命令を無効化する。
【００７３】
（２）ＲＡＴにおけるロード命令のデスティネーション・レジスタ、及びロード命令に依存した命令のデスティネーション・レジスタをクリアする。
【００７４】
（３）無効化された命令をキャッシュがリフィルされた後、再実行する。
【００７５】
上記処理を行うため、先ず、ロード命令に依存した実行中の命令と、ロード命令と無関係な命令とを区別しなければならない。また、上述したように、ロード命令は、３サイクルの投機的実行期間がある。このため、ロード命令に直接的に依存した命令だけでなく、ロード命令に依存した第１の命令に、依存する第２の命令、さらに第２の命令に依存する第３の命令といった３重の依存関係まで検出する必要がある。また、ある命令のソース・レジスタＲｓは第１のロード命令に依存し、ソース・レジスタＲｔは第２のロード命令に依存するというように、複数のロード命令に並列した依存関係も検出する必要がある。さらに、それらが複合した依存関係も検出する必要がある。
【００７６】
図１１は、上記ロード命令と他の命令との依存関係の例を示すパイプライン・ダイアグラム、及びデータ・フロー・グラフを示している。図１１（ａ）（ｂ）（ｃ）に示す例は、全てキャッシュ・ミスが判明する前に命令発行しなければならないケースである。これらの例において、レジスタ番号は論理レジスタではなく物理レジスタを示すものとする。
【００７７】
図１１（ｃ）に示す２並列２重間接依存の場合を例に説明する。データ・フロー・グラフにおいて、○印で示すレジスタはキャッシュ・ミスが判別される前のロード命令の結果である。ロード命令に着目すると、ｒ４はｒ１に依存し，ｒ７はｒ２に依存する。さらに、ｒ８はｒ４、ｒ７に依存し、ｒ１０はｒ４に依存する。
【００７８】
図１１（ｃ）において、（１）のｌｗ（ロード）命令がキャッシュ・ミスし、（２）のｌｗ（ロード）命令がキャッシュ・ヒットした場合、次のように処理する。
【００７９】
先ず、（１）のロード命令に対応するｒ１に依存するものは全て無効化する。しかし、（２）のロード命令に対応するｒ２に依存するものは有効である。このため、ＲＡＴのｒ４、ｒ１０、ｒ８を無効化する。さらに、これらｒ４、ｒ１０、ｒ８を使用する（３）、（５）、（６）の命令を無効化し、再発行する。ただし、ＲＡＴのｒ７と（４）のｓｕｂ命令は無効化しない。
【００８０】
上記一連の動作を実行するため、次の処理を行う。
【００８１】
（１）依存関係検索回路（ＤＬＣ）１６による間接依存の検出。
【００８２】
（２）ＲＡＴの更新。
【００８３】
（３）命令・ウィンドウ・バッファでのロールバック動作。
【００８４】
（ＤＬＣによる間接依存の検出）
先ず、ＤＬＣ１６によるロード命令と依存した命令の検出について説明する。
【００８５】
図１２は、ＤＬＣ１６の一実施例を示している。図１２において、第１の検出回路１６ａは、ロード命令と直接的に依存したレジスタを検出する。また、第２の検出回路１６ｂは、多段の間接的な依存関係を検出する。
【００８６】
第１の検出回路１６ａは、パイプラインステージの数と同数のレジスタＲ１〜Ｒ６、比較器Ｃ１〜Ｃ６、Ｃ１１〜Ｃ１６オア回路ＯＲ１〜ＯＲ６を有している。前記レジスタＲ１〜Ｒ６は、直列接続され、所謂シフトレジスタを構成している。これらレジスタＲ１〜Ｒ６は、Ｄステージの命令・ウィンドウ・バッファ１４ａから命令の実行に応じて順次出力されるデスティネーション・レジスタ（Ｒｄ）の番号を保持する。前記比較器Ｃ１〜Ｃ６の一方入力端には、命令・ウィンドウ・バッファ１４ａから順次出力されるソース・レジスタ（Ｒｔ）の番号が供給される。これら比較器Ｃ１〜Ｃ６の他方入力端には、前記レジスタＲ１〜Ｒ６の出力信号がそれぞれ供給される。また、前記比較器Ｃ１１〜Ｃ１６の一方入力端には、命令・ウィンドウ・バッファ１４ａから順次出力されるソース・レジスタ（Ｒｓ）の番号が供給される。これら比較器Ｃ１１〜Ｃ１６の他方入力端には、前記レジスタＲ１〜Ｒ６の出力信号がそれぞれ供給される。前記比較器Ｃ１〜Ｃ６の出力端はオア回路ＯＲ１〜ＯＲ６の一方入力端に供給される。前記比較器Ｃ１１〜Ｃ１６の出力端は前記オア回路ＯＲ１〜ＯＲ６の他方入力端に供給される。
【００８７】
一方、第２の検出回路１６ｂは、アンドオア回路ＡＯＲ１〜ＡＯＲ６、アンド回路Ａ１〜Ａ４、ラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡ、ＹＭ、ＺＭ、ＺＷ、Ｌ０Ｍｉｓｓ１Ｘ、Ｌ０Ｍｉｓｓ１Ｙ、Ｌ０Ｍｉｓｓ１Ｚ、及びオア回路ＯＲ７により構成されている。アンドオア回路ＡＯＲ１〜ＡＯＲ６は、アンド回路とオア回路が直列接続されている。アンドオア回路ＡＯＲ１〜ＡＯＲ６は、ロード命令に間接的に依存する命令を検出し、この検出した依存関係を直接依存にマッピングする。
【００８８】
前記オア回路ＯＲ１の出力信号ＥｑＡは、アンドオア回路ＡＯＲ１、ＡＯＲ２、ＡＯＲ３を構成するアンド回路の一方入力端に供給される。前記オア回路ＯＲ２の出力信号ＥｑＭは、アンドオア回路ＡＯＲ４、ＡＯＲ５を構成するアンド回路の一方入力端に供給される。前記オア回路ＯＲ３の出力信号ＥｑＷは、アンドオア回路ＡＯＲ６を構成するアンド回路の一方入力端、及びアンド回路Ａ１の一方入力端に供給される。前記オア回路ＯＲ４の出力信号ＥｑＸは、アンド回路Ａ２の一方入力端に供給される。前記オア回路ＯＲ５の出力信号ＥｑＹは、アンド回路Ａ３の一方入力端に供給される。前記オア回路ＯＲ６の出力信号ＥｑＺは、アンド回路Ａ４の一方入力端に供給される。
【００８９】
一方、ロード・ストア・ユニット１８ｂから供給されるキャッシュ・ミス信号Ｌ０Ｍｉｓｓ１Ｗは、前記アンド回路Ａ１の他方入力端に供給されるとともに、ラッチ回路Ｌ０Ｍｉｓｓ１Ｘに供給される。ラッチ回路Ｌ０Ｍｉｓｓ１Ｘの出力信号は、前記アンド回路Ａ２の他方入力端に供給されるとともに、ラッチ回路Ｌ０Ｍｉｓｓ１Ｙに供給される。ラッチ回路Ｌ０Ｍｉｓｓ１Ｙの出力信号は、前記アンド回路Ａ３の他方入力端に供給されるとともに、ラッチ回路Ｌ０Ｍｉｓｓ１Ｚに供給される。ラッチ回路Ｌ０Ｍｉｓｓ１Ｚの出力信号は、前記アンド回路Ａ４の他方入力端に供給される。
【００９０】
前記アンド回路Ａ４、Ａ３、Ａ２の出力信号ＤＤＺ、ＤＤＹ、ＤＤＸは、前記アンドオア回路ＡＯＲ６、ＡＯＲ５、ＡＯＲ３を構成するオア回路の一方入力端にそれぞれ供給される。前記アンドオア回路ＡＯＲ６を構成するオア回路の出力信号は、前記アンドオア回路ＡＯＲ４を構成するオア回路の一方入力端に供給される。前記アンドオア回路ＡＯＲ４を構成するオア回路の出力信号は、前記アンドオア回路ＡＯＲ１を構成するオア回路の一方入力端に供給される。前記アンドオア回路ＡＯＲ５を構成するオア回路の出力信号は、前記アンドオア回路ＡＯＲ２を構成するオア回路の一方入力端に供給される。
【００９１】
前記アンド回路Ａ１の出力信号ＤＤＷは、ラッチ回路ＸＡに供給される。前記アンドオア回路ＡＯＲ１、ＡＯＲ２、ＡＯＲ３を構成するオア回路の出力信号は、前記ラッチ回路ＺＺＡ、ＺＡ、ＹＡの入力端に供給される。これらラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡの出力信号は、オア回路ＯＲ７の入力端に供給される。また、ラッチ回路ＸＡ、ＹＡ、ＺＡの出力信号は、前記アンドオア回路ＡＯＲ３、ＡＯＲ２、ＡＯＲ１を構成するアンド回路の他方入力端にそれぞれ供給される。
【００９２】
前記ラッチ回路ＸＡの出力信号は、ラッチ回路ＹＭに供給され、前記ラッチ回路ＹＡの出力信号は、ラッチ回路ＺＭに供給される。前記ラッチ回路ＹＭの出力信号はラッチ回路ＺＷに供給される。前記ラッチ回路ＺＭ、ＹＭの出力信号は、前記アンドオア回路ＡＯＲ４、ＡＯＲ５を構成するアンド回路の他方入力端にそれぞれ供給される。前記ラッチ回路ＺＷの出力信号は、前記アンドオア回路ＡＯＲ６を構成するアンド回路の他方入力端に供給される。前記オア回路ＯＲ７の出力端から、後述する依存関係の有無を示す信号Ｄｅｐｅｎｄ１Ａが出力される。
【００９３】
上記構成のＤＬＣ１６は、次のステップで依存関係を検出する。
【００９４】
（１）物理レジスタ番号比較。
【００９５】
（２）直接依存の検出。
【００９６】
（３）間接依存を検出し、検出した間接依存を直接依存へ写像。
【００９７】
（４）依存信号の生成。
【００９８】
（５）直接依存のステージング。
【００９９】
図１１（ｃ）を参照して、上記ＤＬＣ１６の動作について説明する。図１１（ｃ）において、（１）のｌｗ（ロード）命令がキャッシュ・ミスを発生するものとする。
【０１００】
命令・ウィンドウ・バッファ１４ａからは、図１１（ｃ）に（１）〜（６）で示す順序に従って、各命令のデスティネーション・レジスタ番号、ソース・レジスタＲｓ、Ｒｔの番号が出力される。デスティネーション・レジスタ番号はＤＬＣ１６のレジスタＲ１に供給される。レジスタＲ１に保持されたデスティネーション・レジスタ番号は、パイプラインの各ステージの実行に従ってレジスタＲ１〜Ｒ６に順次シフトされる。また、各命令のソース・レジスタＲｔの番号は、比較器Ｃ１〜Ｃ６に同時に供給され、ソース・レジスタＲｓの番号は、比較器Ｃ１１〜Ｃ１６に同時に供給される。
【０１０１】
時刻ｔ４において、（３）のａｄｄ命令がＤステージにある。このため、ａｄｄ命令の２つのソース・レジスタＲｓ、Ｒｔの番号が、実行状態（ｉｎ−ｆｌｉｇｈｔ）のロード命令のデスティネーション・レジスタ番号と一致するかどうかが検索される。同時に、ａｄｄ命令の２つのソース・レジスタＲｓ、Ｒｔの番号が、実行状態のロード命令に依存する別の命令のデスティネーション・レジスタ番号と一致するかどうかが検索される。具体的には、比較器Ｃ１〜Ｃ６、Ｃ１１〜Ｃ１６により、ソース・レジスタＲｓ、Ｒｔの番号と、Ａ、Ｍ、Ｗ、Ｘ、Ｙ、Ｚの各ステージのデスティネーション・レジスタ番号Ｒｄとを比較する。
【０１０２】
すなわち、時刻ｔ４において、Ｄステージのソース・レジスタＲｓの番号と、（１）のｌｗ命令のＷステージに対応するレジスタＲ３に保持されたデスティネーション・レジスタＲｄの番号が共にレジスタ番号“ｒ１”である。このため、比較器Ｃ１３から一致信号が出力され、オア回路ＯＲ３の出力信号ＥｑＷが“１”となる。比較器Ｃ１３以外の比較器から一致信号が出力されないため、オア回路ＯＲ３以外のオア回路の出力信号は“０”となる。
【０１０３】
一方、キャッシュ・ミスは（１）のｌｗ命令のＷステージで判明する。このため、時刻ｔ４において、キャッシュ・ミス信号Ｌ０Ｍｉｓｓ１Ｗは“１”となり、このキャッシュ・ミス信号Ｌ０Ｍｉｓｓ１Ｗと、オア回路ＯＲ３の出力ＥｑＷがアンド回路Ａ１に供給される。このため、ＡＮＤ回路Ａ１の出力信号ＤＤＷは“１”となる。この信号ＤＤＷは、Ｗステージのロード命令にＤステージの命令が直接依存するかどうかを示す信号である。さらに、この信号ＤＤＷが“１”である場合、Ｗステージのロード命令にＤステージの命令が直接依存し、且つキャッシュ・ミスが発生していることを示している。
【０１０４】
また、ラッチ回路Ｌ０Ｍｉｓｓ１Ｘは、前記キャッシュ・ミス信号Ｌ０Ｍｉｓｓ１Ｗを１サイクル遅らせた信号を保持する。このため、ラッチ回路Ｌ０Ｍｉｓｓ１Ｘは、Ｘステージのロード命令がキャッシュ・ミスしているとき“１”となる。同様に、ラッチ回路Ｌ０ＭｉｓｓＹ、Ｌ０ＭｉｓｓＺは、Ｙステージ、Ｚステージのロード命令がキャッシュ・ミスしているとき“１”となる。ラッチ回路Ｌ０Ｍｉｓｓ１Ｘ、Ｌ０ＭｉｓｓＹ、Ｌ０ＭｉｓｓＺの出力信号は、オア回路ＯＲ４、ＯＲ５、ＯＲ６の出力信号ＥｑＸ、ＥｑＹ、ＥｑＺとともにアンド回路Ａ２、Ａ３、Ａ４にそれぞれ供給される。このため、アンド回路Ａ２、Ａ３、Ａ４の出力信号ＤＤＸ、ＤＤＹ、ＤＤＺが“１”である場合、Ｘステージ、Ｙステージ、及びＺステージのロード命令にＤステージの命令が直接依存し、且つキャッシュ・ミスが発生していることとなる。
【０１０５】
次に、時刻ｔ５において、信号ＤＤＷが前のサイクルで“１”であったため、ラッチ回路ＸＡが“１”となる。ラッチ回路ＸＡの信号は、信号ＤＤＷを１サイクル遅らせたことになる。このため、ラッチ回路ＸＡ信号は、Ａステージの命令がＸステージのロード命令に依存することを意味している。ラッチ回路ＸＡの出力信号に応じてオア回路ＯＲ７の出力信号Ｄｅｐｅｎｄ１Ａが“１”となる。信号Ｄｅｐｅｎｄ１Ａは、ラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡのオアである。このため、信号Ｄｅｐｅｎｄ１Ａは、パイプラインのＸステージ、Ｙステージ、Ｚステージ、ＺＺステージのいずれかのロード命令にＡステージの命令が依存しており、且つそのロード命令がキャッシュ・ミスしていることを示している。ラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡは、キャッシュ・ミスの情報を含んだ信号を保持する。したがって、ラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡの出力信号は、キャッシュ・ミスの確認済みの信号となる。
【０１０６】
また、図１１（ｃ）に示す（２）のｌｗ（ロード）命令と（４）のｓｕｂ命令が依存関係を有している。（２）のｌｗ命令はキャッシュ・ヒットするとの仮定であるため、アンド回路Ａ１の出力信号ＤＤＷは“０”となる。
【０１０７】
次に、時刻ｔ６において、図１１（ｃ）に示す（５）のｘｏｒ命令がＤステージにある。このため、ｘｏｒ命令が依存するロード命令の有無が検索される。すなわち、Ｄステージにあるｘｏｒ命令のソース・レジスタＲｓ、Ｒｔの番号“ｒ４”“ｒ７”と、各ステージのレジスタＲ１〜Ｒ６に保持されたデスティネーション・レジスタの番号とが比較される。この場合、Ｍステージのデスティネーション・レジスタの番号が（３）のａｄｄ命令に使用されるレジスタ番号“ｒ４”となっている。さらに、Ａステージのラッチ回路Ｒ１に保持された（４）のｓｕｂ命令のデスティネーション・レジスタ番号は“ｒ７”である。このため、比較器Ｃ１２、Ｃ１の出力信号が“１”となる。したがって、オア回路ＯＲ２の出力信号ＥｑＭが“１”となり、オア回路ＯＲ１の出力信号ＥｑＡが“１”となる。
【０１０８】
また、時刻ｔ６において、前記レジスタＸＡの出力信号“１”が、レジスタＹＭにセットされる。このため、レジスタＹＭの出力信号が“１”となる。このレジスタＹＭの出力信号は、オア回路ＯＲ２の出力信号ＥｑＭとともに、アンドオア回路ＡＯＲ５に供給される。このため、アンドオア回路ＡＯＲ５から信号“１”が出力される。この信号はアンドオア回路ＡＯＲ２を介してラッチ回路ＺＡに信号ＹＤとして供給される。
【０１０９】
さらに、前記ＯＲ回路ＯＲ１の出力信号は、アンドオア回路ＡＯＲ１、ＡＯＲ２、ＡＯＲ３を構成するアンド回路の一方入力端に供給される。しかし、このとき、ラッチ回路ＸＡ、ＹＡ、ＺＡ、ＺＺＡの出力信号は、いずれも“０”である。このため、アンドオア回路ＡＯＲ１、ＡＯＲ２、ＡＯＲ３を構成する各アンド回路の入力条件は成立しない。このため、Ａステージにある（４）のｓｕｂ命令との間の依存関係は保持されない。この理由は、（４）のｓｕｂ命令が依存関係を有する（２）のｌｗ命令がキャッシュ・ヒットしている。このため、時刻ｔ６において、ラッチ回路ＸＡの出力信号が“０”となっているためである。このようにして、キャッシュ・ミスが発生したロード命令に直接的、及び間接的に依存した命令を検出することができる。
【０１１０】
すなわち、第２の検出回路１６ｂは、実行状態にある全ての命令の依存関係をＡ〜Ｚステージにあるキャッシュ・ミスした全てのロード命令との間で依存関係を検出している。換言すると、第２の検出回路１６ｂは、多段の間接的な依存関係を検出して直接依存関係に変化し、このうちのキャッシュ・ミスの場合だけ依存関係を検出する。第２の検出回路１６ｂにより、キャッシュ・ミスしたロード命令に依存する全ての命令がどのステージに存在するかを、複雑なリストを用いることなく、直接検出することができる。
【０１１１】
上記説明において、ロード命令のキャッシュ・ミスは、Ｗステージで判明すると仮定した。しかし、ロード命令のキャッシュ・ミスがＸステージ、又はＹステージにおいて判明するような場合も考えられる。このような場合、投機的実行期間が長くなるため、投機命令数が増加し、間接依存の段数が増える。しかし、上記構成のＤＬＣ１６を用いることにより、最小限のハードウェア構成により、直接的及び間接的な依存関係を検出することが可能である。
【０１１２】
上記のように、ＤＬＣ１６によりキャッシュ・ミスが発生したロード命令に依存した命令が検出されると、第２の検出回路１６ｂを構成するＯＲ回路ＯＲ７から依存関係の有無を示す信号Ｄｅｐｅｎｄ１Ａが出力される。この信号Ｄｅｐｅｎｄ１Ａは、図５に示すレジスタ・スコア・ボード・ユニット１５ａ、及びＲＡＴ２２に供給される。レジスタ・スコア・ボード・ユニット１５ａ、及びＲＡＴ２２は、信号Ｄｅｐｅｎｄ１Ａに応じて内容が更新される。
【０１１３】
（キャッシュ・ミスによるＲＡＴの更新）
図１３は、ＲＡＴ２２の更新回路２２ａの一例を示している。この更新回路２２ａは、例えば複数のアンド回路Ａ２１〜Ａ２５、複数の比較器Ｃ２１〜Ｃ２４、オア回路ＯＲ１１、ＯＲ１２、ノア回路ＮＲ１により構成されている。
【０１１４】
通常、ＡＬＵ命令の最後のＳステージ、又はロード命令のＤステージにおいて、その命令が書き込むデスティネーション・レジスタＲｄに対応するＲＡＴのエントリがセットされる。これはその物理レジスタを参照する命令の発行遅延を考慮したものである。
【０１１５】
図１３において、ＡＬＵ命令の場合、比較器Ｃ２１により最後のＳステージにおけるデスティネーション・レジスタ（物理レジスタ）Ｒｄの番号と、ＲＡＴ２２のエントリ番号（ｎ）とを比較する。また、ロード命令の場合、比較器Ｃ２２により、Ｄステージにおけるデスティネーション・レジスタＲｄの番号と、ＲＡＴ２２のエントリ番号とを比較する。これらデスティネーション・レジスタＲｄの番号とＲＡＴ２２のエントリ番号が一致し、かつ有効な命令がそのステージに存在する場合はＲＡＴ２２がセットされる。
【０１１６】
尚、図１３は、ワーキングＲＡＴであり、分岐予測ミスを回復するためのイン・オーダーＲＡＴからのリストアと、物理レジスタが開放された場合にＲＡＴをクリアするパスは含んでいない。
【０１１７】
一方、ロード命令にキャッシュ・ミスが発生した場合において、ロード命令に依存した命令がＡステージにある時、そのデスティネーション・レジスタＲｄの番号と、ＲＡＴ２２のエントリ番号とが比較器Ｃ２３により比較される。この比較の結果、これらが一致し、且つ、ＤＬＣ１６から供給される信号Ｄｅｐｅｎｄ１Ａが“１”のとき、ロード命令に依存する命令の結果を書き込むデスティネーション・レジスタに対するＲＡＴ２２のフラグがクリアされる。前述したように、信号Ｄｅｐｅｎｄ１Ａが“１”であることは、Ａステージにある命令がロード命令に依存関係を有し、且つロード命令がキャッシュ・ミスしたことを意味する。すなわち、Ａステージにある命令は、正しいソースオペランドを得ることができなくなる。したがって、この命令の実行結果も正しくないため、ＲＡＴ２２のその命令のデスティネーション・レジスタのフラグをクリアする。
【０１１８】
また、キャッシュ・ミスしたロード命令の実行結果が供給されるデスティネーション・レジスタＲｄもクリアする。すなわち、ロード命令においてキャッシュ・ミスが発生した場合、Ｘステージにあるロード命令のデスティネーション・レジスタＲｄと、ＲＡＴ２２のエントリ番号が比較器Ｃ２４により比較される。この比較の結果、両者が一致し、且つキャッシュ・ミス信号Ｌ０Ｍｉｓｓ１Ｘが“１”である場合、ＲＡＴ２２のキャッシュ・ミスしたロード命令の実行結果が供給されるデスティネーション・レジスタＲｄのフラグがクリアされる。
【０１１９】
このようにキャッシュ・ミスしたロード命令のデスティネーション・レジスタＲｄと、それに依存した命令のデスティネーション・レジスタＲｄであって、既にＲＡＴ２２の対応するレジスタのエントリにセットされているフラグは全てクリアされる。
【０１２０】
また、ＲＡＴ２２のフラグをクリアすることにより、キャッシュ・ミスが判明したロード命令のＸステージ以降のタイミングでは、多重間接依存を含めてＲｄを参照できなくなる。さらに、図５に示すアップデート回路２１は、ＲＡＴ２２の内容に基づいて命令ウィンドウ・バッファ１４ａのＲｓＲｄｙ、ＲｔＲｄｙ、ＲｆＲｄｙをクリアする。このため、キャッシュ・ミスが発生したロード命令と依存関係を有する命令は発行できなくなる。
【０１２１】
上記のような動作が、毎サイクル実行されることにより、キャッシュ・ミスを起こしたロード命令と直接的、及び間接的に依存するレジスタが無効化され、且つキャッシュ・ミスが発生したロード命令と依存関係を有する命令が無効される。
【０１２２】
（ＩＷＢでのロールバック動作）
ロード命令がキャッシュ・ミスを発生した場合、キャッシュ・ミスしたロード命令と、それに依存した全ての命令を再実行する。この動作をロールバックと呼ぶ。ここでは、そのロールバック方法について述べる。
【０１２３】
命令・ウィンドウ・バッファ１４ａから命令を発行したあと、キャッシュ・ミスの判明しない実行中のロード命令、又はストア命令と、それ以降の全ての命令を命令・ウィンドウ・バッファ１４ａに保持したままにする。その際、命令・ウィンドウ・バッファ１４ａのＩｎＦｌｉｇｈｔビットをセットしておく。ロード命令、又はストア命令は、キャッシュがヒットした場合、Ｘステージで命令・ウィンドウ・バッファ１４ａのＶａｌｉｄビットをクリアして命令・ウィンドウ・バッファから消去する。キャッシュ・ミスが発生した場合、ＩｎＦｌｉｇｈｔビットをクリアするとともにＶａｌｉｄビットはセットしたままとする。同時にＬ１ＭｉｓｓＳＭビットをキャッシュ・ミスの状態に変更する。キャッシュのリフィルが終了すると、Ｌ１ＭｉｓｓＳＭビットが初期状態にリセットされる。この後、ロード命令、又はストア命令が再度スケジューリングされ発行される。
【０１２４】
一方、ロード命令に依存した命令と、ロード命令に対して間接的に依存した命令について、命令がＡステージに到達した時に、信号Ｄｅｐｅｎｄ１Ａが“１”である場合、間接的な依存関係も含めて依存元であるロード命令がキャッシュ・ミスしている。このため、命令・ウィンドウ・バッファからこの命令を消去せずに残しておく。また、信号Ｄｅｐｅｎｄ１Ａが“０”である場合、依存するロード命令はヒットしているので命令・ウィンドウ・バッファからこの命令をクリアする。
【０１２５】
上記実施形態によれば、ＤＬＣ１６は、ロード命令に直接的に依存する命令を検出する第１の検出回路１６ａと、ロード命令に間接的に依存する命令を検出する第２の検出回路１６ｂとを有し、第２の検出回路１６ｂは、実行状態にある全ての命令とＡ〜Ｚステージにある全てロード命令との間で多段の間接的な依存関係を検出し、このうち、キャッシュ・ミスが発生している場合だけ、間接的な依存関係を検出している。このため、このＤＬＣ１６は、キャッシュ・ミスが発生したロード命令に対して直接的、又は間接的に依存する命令を高速に検出することができる。
【０１２６】
しかも、このＤＬＣ１６は、キャッシュ・ミスしたロード命令に依存する全ての命令がどのステージに存在するかを、複雑なリストを用いたり、データ・フロー・グラフを全てトレースしたりすることなく、直接検出することができる。したがって、回路規模の増大を防止できる利点を有している。
【０１２７】
さらに、このＤＬＣ１６は、キャッシュ・ミスしたロード命令に対して直接的、及び間接的に依存する命令のみ無効化している。このため、キャッシュ・ミスしたロード命令以降の全ての命令を無効化する場合に比べて、命令の無駄な無効化を防止できる。したがって、再発行する命令の数を削減できるため、命令発行効率を向上できる。
【０１２８】
また、ＤＬＣ１６の出力信号に基づき、レジスタ・スコア・ボード１５ａ、及びＲＡＴ２２の内容は毎サイクル変更されている。このため、ＤＬＣ１６により検出されたロード命令に依存するレジスタ、及び命令を効率よく破棄することができる。さらに、命令・ウィンドウ・バッファ１４ａの内容は、レジスタ・スコア・ボード１５ａ、及びＲＡＴ２２の内容に従って毎サイクル更新されている。このため、キャッシュがリフィルされた後、破棄された命令を確実に再発行することができる。
【０１２９】
本発明は、上記実施形態に限定されるものではなく、その他、本発明の要旨を変えない範囲において種々変形実施可能なことは勿論である。
【０１３０】
【発明の効果】
以上、詳述したように本発明によれば、ロード命令において、キャッシュ・ミスが発生した際、このロード命令と多段の依存関係を有する命令を高速に検出することが可能な命令発行装置を提供できる。
【図面の簡単な説明】
【図１】本発明の命令発行装置の実施形態を示す構成図。
【図２】本実施例のパイプラインの一例を示すダイアグラム。
【図３】命令・ウィンドウ・バッファの一例を示す構成図。
【図４】命令・ウィンドウ・バッファを構成する各エントリの一例を示す構成図。
【図５】命令・ウィンドウ・バッファのアップデート回路の一例を示す構成図。
【図６】ディスパッチ決定回路の一例を示す構成図。
【図７】発行予定エントリを決定する回路の一例を示す構成図。
【図８】命令・ウィンドウ・バッファの一例を示す構成図。
【図９】ＡＬＵ命令の動作タイミングの一例を示す図。
【図１０】ロード命令の動作タイミングの一例を示す図。
【図１１】図１１（ａ）（ｂ）（ｃ）は、ロード命令と他の命令との依存関係の例を示すパイプライン・ダイアグラム及びデータ・フロー・グラフ。
【図１２】ＤＬＣ（依存関係検索回路）の一実施例を示す回路図。
【図１３】ＲＡＴの更新回路の一例を示す回路図。
【図１４】ロード命令に続いて発行された複数の命令との依存関係を示す図。
【符号の説明】
１１…命令フェッチユニット、
１２…命令デコーダ、
１４ａ、１４ｂ…命令・ウィンドウ・バッファ、
１５ａ、１５ｂ…レジスタ・スコア・ボード・ユニット、
１６…ＤＬＣ、
１６ａ…第１の検出回路、
１６ｂ…第２の検出回路、
Ｒ１〜Ｒ６…レジスタ、
Ｃ１〜Ｃ６、Ｃ１１〜Ｃ１６…比較器、
ＯＲ１〜ＯＲ６…オア回路、
ＡＯＲ１〜ＡＯＲ６…アンドオア回路、
Ａ１〜Ａ４…アンド回路、
ＸＡ、ＹＡ、ＺＡ、ＺＺＡ、ＹＭ、ＺＭ、ＺＷ…ラッチ回路。
【図１】
0003577052.tif 000002
【図２】
0003577052.tif 000003
【図３】
0003577052.tif 000004
【図４】
0003577052.tif 000005
【図５】
0003577052.tif 000006
【図６】
0003577052.tif 000007
【図７】
0003577052.tif 000008
【図８】
0003577052.tif 000009
【図９】
0003577052.tif 000010
【図１０】
0003577052.tif 000011
【図１１】
0003577052.tif 000012
【図１２】
0003577052.tif 000013
【図１３】
0003577052.tif 000014
【図１４】
0003577052.tif 000015