(57)【特許請求の範囲】
【請求項１】
複数の命令を含む隣接した命令バイトのグループに対応する分岐予測を選択するための方法であって、
分岐予測ストレージに複数の分岐セレクタをストアするステップを備え、前記複数の分岐セレクタのうちの少なくとも１つは前記複数の命令のうちの第１のものに対応し、前記複数の命令のうちの前記第１のものがフェッチされた場合、前記複数の分岐セレクタのうちの前記１つは、選択されることとなる特定の分岐予測を特定し、複数の分岐セレクタの各々は、隣接した命令バイトのグループ内の命令の位置と、複数の分岐セレクタ内のその分岐セレクタの位置とに応じて、複数の命令の少なくとも１つに対応し、前記方法はさらに、
隣接した命令バイトの前記グループをフェッチし、同時に、隣接した命令バイトの前記グループを特定するフェッチアドレスを用いて前記複数の分岐セレクタをフェッチするステップと、
前記フェッチアドレスに応答して前記複数の分岐セレクタのうちの１つを選択するステップと、
前記複数の前記分岐セレクタのうちの前記１つで特定される、前記複数の分岐予測の前記特定の分岐予測を選択するステップとを備える、方法。
【請求項２】
前記特定の分岐予測は、隣接した命令バイトの前記グループに対して前記分岐予測ストレージにストアされた複数の分岐予測のうちの１つを含む、請求項１に記載の方法。
【請求項３】
分岐予測誤りに応答して前記複数の分岐予測を更新するステップをさらに含む、請求項２に記載の方法。
【請求項４】
前記分岐予測誤りがまだ検出されていない分岐命令の結果である場合、前記更新するステップは、前記分岐予測ストレージにストアされた前記複数の分岐予測のうちの１つを、隣接した命令バイトの前記グループ内の前記まだ検出されていない分岐命令に割当てるステップを含む、請求項３に記載の方法。
【請求項５】
前記まだ検出されていない分岐命令を反映し、かつ前記複数の分岐予測のうちの前記１つによって既に予測されている分岐命令に対応する分岐セレクタを削除するよう、前記複数の分岐セレクタを更新するステップをさらに含む、請求項４に記載の方法。
【請求項６】
前記特定の分岐予測は、既にフェッチされているサブルーチン呼出命令に対応するリターンスタックアドレスを含む、請求項１に記載の方法。
【請求項７】
前記特定の分岐予測は、主メモリ内の隣接した命令バイトの前記グループの直後にある隣接した命令バイトの第２のグループに対応する逐次アドレスを含む、請求項１に記載の方法。
【請求項８】
前記複数の分岐セレクタのうちの１つを選択する前記ステップは、前記フェッチアドレスの複数の最下位ビットをデコーディングするステップを含む、請求項１に記載の方法。
【請求項９】
前記フェッチアドレスの前記複数の最下位ビットは、隣接した命令バイトの前記グループへのオフセットを含み、それにより、隣接した命令バイトの前記グループのうちのいずれか１つが前記オフセットの異なる値によって特定可能である、請求項８に記載の方法。
【請求項１０】
前記複数の命令は、可変バイト長の命令の組に属する、請求項１に記載の方法。
【請求項１１】
前記複数の分岐セレクタの各々は、隣接した命令バイトの前記グループのうちの異なるものに対応する、請求項１に記載の方法。
【請求項１２】
分岐予測装置であって、
命令キャッシュからフェッチされている隣接した命令バイトのグループに対応するフェッチアドレスを受けるよう結合された分岐予測ストレージを備え、前記分岐予測ストレージは、複数の分岐セレクタをストアするよう構成され、前記複数の分岐セレクタのうちの少なくとも１つは、隣接した命令バイトの前記グループ内の複数の命令のうちの第１の命令に対応し、前記第１の命令がフェッチされた場合、前記複数の分岐セレクタのうちの前記１つは、選択されることとなる特定の分岐予測を特定し、複数の分岐セレクタの各々は、隣接した命令バイトのグループ内の命令の位置と、複数の分岐セレクタ内のその分岐セレクタの位置とに応じて、複数の命令の少なくとも１つに対応し、前記装置はさらに、
前記複数の分岐セレクタを受けるよう前記分岐予測ストレージに結合された選択機構を備え、前記選択機構は、隣接した命令バイトの前記グループをフェッチするために用いられるフェッチアドレスの複数の最下位ビットに応答して前記複数の分岐セレクタのうちの特定のものを選択するよう構成される、分岐予測装置。
【請求項１３】
隣接した命令バイトの前記グループは、隣接した命令バイトの前記グループをストアする命令キャッシュのキャッシュラインの一部分を含む、請求項１２に記載の分岐予測装置。
【請求項１４】
前記キャッシュラインの前記部分は、前記キャッシュラインの半分を含む、請求項１３に記載の分岐予測装置。
【請求項１５】
前記特定の分岐予測は、隣接した命令バイトの前記グループに対して前記分岐予測ストレージにストアされた複数の分岐予測のうちの１つを含む、請求項１２に記載の分岐予測装置。
【請求項１６】
前記複数の分岐セレクタのうちの少なくとも１つは、前記特定の分岐予測として逐次アドレスを特定し、前記逐次アドレスは、主メモリ内の隣接した命令バイトの前記グループの直後にある隣接した命令バイトの第２のグループに対応する、請求項１５に記載の分岐予測装置。
【請求項１７】
前記複数の分岐セレクタのうちの前記１つは、隣接した命令バイトの前記グループ内にある対応する分岐命令がサブルーチンリターン命令である場合に、前記特定の分岐予測としてリターンスタックアドレスを特定する、請求項１６に記載の分岐予測装置。
【請求項１８】
前記複数の分岐セレクタのうちの前記特定のものを受けるよう結合され、かつ前記複数の分岐予測、前記逐次アドレスおよび前記リターンスタックアドレスを受けるよう結合された第２の選択機構をさらに含み、前記第２の選択機構は、前記複数の分岐セレクタのうちの前記特定のものに応答して前記分岐予測装置の出力分岐予測を選択するよう構成される、請求項１７に記載の分岐予測装置。
【請求項１９】
前記第２の選択機構は、前記複数の分岐予測のうちの１つと前記複数の分岐予測のうちの別のものとの間での選択を行なうために前記分岐セレクタのうちの前記１つの第１のビットを用いるよう構成され、前記逐次アドレスと前記リターンスタックアドレスとの間での選択をさらに行なう、請求項１８に記載の分岐予測装置。
【請求項２０】
前記第２の選択機構は、前記第１のビットを用いて選択されたアドレス間での選択を行なうために前記分岐セレクタのうちの前記１つの第２のビットを用いるよう構成される、請求項１９に記載の分岐予測装置。
【請求項２１】
マイクロプロセッサであって、
命令バイトの複数のキャッシュラインをストアし、かつフェッチアドレスを受けるのと同時に命令バイトのグループを前記マイクロプロセッサの命令処理パイプラインに与えるよう構成された命令キャッシュと、
前記命令キャッシュに結合され、かつ前記命令キャッシュと同時に前記フェッチアドレスを受けるよう結合された分岐予測ユニットとを含み、前記分岐予測ユニットは、命令バイトの前記グループに対して複数の分岐セレクタをストアするよう構成され、かつ前記フェッチアドレスに応答して前記複数の分岐セレクタのうちの１つを選択するよう構成され、前記複数の分岐セレクタのうちの前記１つは、前記命令キャッシュによって後のフェッチアドレスとして用いられる分岐予測を特定し、複数の分岐セレクタの各々は、隣接した命令バイトのグループ内の命令の位置と、複数の分岐セレクタ内のその分岐セレクタの位置とに応じて、複数の命令の少なくとも１つに対応する、マイクロプロセッサ。
【請求項２２】
前記複数の分岐セレクタのうちの前記１つは、前記フェッチアドレスの複数の最下位ビットをデコーディングすることによって選択される、請求項２１に記載のマイクロプロセッサ。
【発明の詳細な説明】
発明の背景
１．発明の分野
本発明は、マイクロプロセッサの分野に関連し、より詳細には、マイクロプロセッサ内の分岐予測機構に関連する。
２．関連技術の説明
ＥＰ−Ａ０５８６０５７は、命令キャッシュからフェッチされる隣接する命令バイトのグループに対応するフェッチアドレスを使用して分岐予測を選択する分岐予測方法および装置を開示する。
スーパースカラマイクロプロセッサは、クロックサイクル当たり複数の命令を実行しかつその設計に矛盾しない最短のクロックサイクルを選択することにより高性能を発揮する。本明細書中では、「クロックサイクル」という用語は、マイクロプロセッサ内の命令処理パイプラインのさまざまな段に与えられる時間間隔を指す。記憶装置（レジスタおよびアレイ等）は、クロックサイクルにしたがってその値を捕らえる。たとえば、記憶装置は、クロックサイクルを規定するクロック信号の立上りまたは立下り端縁にしたがって値を捕らえ得る。記憶装置は、それから、クロック信号のそれぞれ次の立上りまたは立下り端縁まで、その値を記憶する。「命令処理パイプライン」という用語は、ここでは、パイプライン態様で命令を処理するために採用される論理回路を指す語として使用される。パイプラインは、命令処理の各部分を行ういくつもの段に分割してもよいが、命令処理は、一般に命令のフェッチ、デコード、実行および命令により表される宛先に実行結果を記憶することを含む。
スーパースカラマイクロプロセッサ（およびスーパーパイプラインマイクロプロセッサ）の重要な特徴は、その分岐予測機構にある。分岐予測機構は、分岐命令について予測される方向（分岐するまたは分岐しない）を示し、同分岐予測が示す予測される命令ストリーム内で後の命令のフェッチを続けることができる。分岐命令とは、後の命令が、少なくとも２以上のアドレス、すなわち分岐命令に直接続く命令で始まる命令ストリームを表す逐次アドレスとメモリの任意の場所で始まる命令ストリームを表すターゲットアドレスのうちの１つからフェッチされるようにする命令である。無条件分岐命令は、常にターゲットアドレスに分岐し、条件付分岐命令は、先行する命令の結果に基づいて逐次またはターゲットアドレスのいずれかを選択し得る。予測される命令ストリームからの命令は、分岐命令の実行に先立って投機的に実行されることが可能で、いずれにせよ分岐命令の実行前に命令処理のパイプライン内に置かれる。予測した命令ストリームが正しければ、クロックサイクル当りに実行される命令の数が増加し有利である。しかしながら、予測した命令ストリームが正しくない場合（すなわち、１以上の分岐命令を間違って予測した場合）、間違って予測した命令ストリームからの命令は、命令処理パイプラインから廃棄されるので、クロックサイクル当りに実行される命令の数は減る。
有効性を高めるため、予測した命令ストリームが正確である頻度をできるだけ高めるように、分岐予測機構は、かなり正確である必要がある。一般に、分岐予測機構の精度の向上は、分岐予測機構の複雑性を高めることによって行なわれる。たとえば、分岐予測が命令キャッシュの命令バイトの特定のキャッシュラインで記憶される、キャッシュライン系分岐予測スキームを採用することが可能である。キャッシュラインは、命令キャッシュ内の記憶スペースの割当ておよび割当ての解除の単位として扱ういくつかの隣接するバイトである。キャッシュラインがフェッチされると、対応の分岐予測もフェッチされる。さらに、特定のキャッシュラインが廃棄されると、対応の分岐予測も廃棄される。キャッシュラインはメモリ内で整列する。キャッシュライン系分岐予測スキームは、各キャッシュラインについてより多数の分岐予測を記憶することによってより正確にすることができる。所与のキャッシュラインは、複数の分岐命令を含むことが可能で、その各々がことなる分岐予測により表される。したがって、１つのキャッシュラインにより多数の分岐予測が割当てられれば、分岐予測機構により、より多数の分岐命令が表されかつ予測され得る。分岐予測機構内で表すことができない分岐命令は、予測されず、続いて、分岐が行なわれることがわかれば、「予測誤り」が検出され得る。しなしながら、追加の分岐予測の間で選択を行う必要性から、分岐予測機構の複雑性が増加する。ここで使用する「分岐予測」は、分岐命令が分岐するか分岐しないかの予測として、分岐予測機構により解釈される得る値である。さらに、分岐予測はターゲットアドレスを含み得る。キャッシュライン系分岐予測機構については、キャッシュラインからフェッチされている命令の中に分岐命令がない場合、フェッチされているキャッシュラインに続くラインの予測が、分岐予測である。
分岐予測機構の複雑性が増加することに関する問題は、複雑性が増すと一般に分岐予測を構成する時間を増加させる必要がある点である。たとえば、複数の分岐の中で選択するには、かなりの時間を要する。フェッチアドレスのオフセットは、キャッシュライン内でフェッチされている第１のバイトを表す。オフセットの前の分岐命令の分岐予測を選択するべきでない。どの分岐予測を使用するかを決めるために、キャッシュライン内のフェッチアドレスのオフセットを、キャッシュライン用に記憶された分岐予測により表される分岐命令のオフセットに比較する必要が生じるかもしれない。フェッチアドレスオフセットの後でかつフェッチアドレスオフセットの後の他の分岐命令よりフェッチアドレスオフセットに近い分岐命令に対応する分岐予測を選択する必要がある。分岐予測の数が増えるので、選択論理の複雑性（および必要な時間）が増大する。フェッチアドレスの分岐予測を構成するのに必要な時間がマイクロプロセッサのクロックサイクル時間を超える場合には、マイクロプロセッサの性能は低下するかもしれない。分岐予測は、１つのクロックサイクルでは形成できないので、前回のフェッチアドレスに対応する分岐予測がないために命令がフェッチできないクロックサイクルの間、命令処理パイプライン内に「バブル」を導入する。バブルは、続くクロックサイクルの間、命令処理パイプラインのさまざまな段を占め、バブルには命令が含まれていないので、バブルを含む段では作業が行なわれない。これにより、マイクロプロセッサの性能が低下し得る。
発明の概要
上記に挙げた問題は、大部分が本発明よる分岐予測装置により解決される。分岐予測装置は、命令のキャッシュラインまたはその部分内の命令バイトに対応する複数の分岐セレクタを収容する。対応の命令バイトがキャッシュラインをフェッチするのに使用するフェッチアドレスのオフセットにより表されるバイトである場合、分岐セレクタは、選択される分岐予測を表す。フェッチアドレスのオフセットと分岐命令の比較ポインタを比較する代わりに、フェッチアドレスのオフセットをデコードしかつ対応の分岐セレクタを選択するだけで、分岐予測を選択する。分岐予測装置は、分岐命令のポインタとフェッチアドレスが比較される場合（大きいか小さいかの比較）よりも高い周波数（すなわち低いクロックサイクル）で動作し得る点が有利である。分岐セレクタは、フェッチされている命令にしたがってどの分岐予測が適切であるかを直接的に決定し、それにより分岐予測を選択するために使用される論理の量を減らす。
広義には、本発明は、複数の命令を含む隣接する命令バイトのグループに対応する分岐予測を選択する方法を考慮する。複数の分岐セレクタは、分岐予測記憶部（ストレージ）内に収容され、複数の分岐セレクタのうちの少なくとも１つが複数の命令の内の第１のものに対応する。複数の命令の内の第１のものがフェッチされる場合には、分岐セレクタは、選択される特定の分岐予測を識別する。隣接する命令バイトのグループが、複数の分岐セレクタのフェッチと同時にフェッチされる。フェッチアドレスは、隣接する命令バイトのグループを表す。複数の分岐セレクタの内の１つがフェッチアドレスに応答して選択される。分岐予測は、複数の分岐セレクタの内の１つに応答して選択される。
本発明は、さらに、分岐予測記憶部および選択機構を含む分岐予測装置を考慮する。分岐予測記憶部は、命令キャッシュからフェッチされている隣接する命令バイトのグループに対応するフェッチアドレスを受けるように結合される。分岐予測記憶部は、複数の分岐セレクタの内の少なくとも１つが隣接する命令バイトのグループ内の第１の命令に対応する、複数の分岐セレクタを収容するよう構成される。複数の分岐セレクタの内の少なくとも１つは、第１の命令がフェッチされる場合、選択される特定の分岐予測を表す。複数の分岐セレクタを受ける分岐予測記憶部に結合されて、選択機構は、連続する命令バイトのグループをフェッチするのに使用するフェッチアドレスの複数の最下位ビットに応答して、複数の分岐セレクタの特定の１つを選択するよう構成される。
本発明は、さらに、命令キャッシュおよび分岐予測ユニットを含むマイクロプロセッサを考慮する。命令キャッシュは、命令バイトの複数のキャッシュラインを記憶しかつマイクロプロセッサの命令処理パイプラインへのフェッチアドレスを受けて、命令バイトのグループを提供するよう構成される。命令キャッシュに結合されかつ命令キャッシュと同時にフェッチアドレスを受けるよう結合されて、分岐予測ユニットは、命令バイトのグループに関して複数の分岐セレクタを収容しかつフェッチアドレスに応答して、複数の分岐セレクタの１つを選択するよう構成される。複数の分岐セレクタの１つは、命令キャッシュにより次のフェッチアドレスとして使用される分岐予測を識別する。
【図面の簡単な説明】
本発明の他の目的および利点については、以下の詳細な説明を読みかつ添付の図面を参照することでより明らかになるであろう。
図１は、スーパースカラマイクロプロセッサの一実施例のブロック図である。
図２は、図１のデコードユニット対の一実施例のブロック図である。
図３は、隣接する命令バイトのグループと対応の分岐セレクタのセットの図である。
図４は、図１に示す分岐予測ユニットの一実施例の部分ブロック図である。
図５は、図４に示す分岐予測ユニットに記憶されるような隣接する命令バイトのグループの予測ブロック図である。
図６は、分岐セレクタの符号化の例を示す表である。
図７は、隣接する命令バイトのグループに対応する分岐セレクタのセットを更新するために行なわれるステップを示すフローチャート図である。
図８は、分岐セレクタのセットの更新の第１の例を示す図である。
図９は、分岐セレクタのセットの更新の第２の例を示す図である。
図１０は、分岐セレクタのセットの更新の第３の例を示す図である。
図１１は、図１に示すマイクロプロセッサを含むコンピュータシステムのブロック図である。
本発明には、さまざまな変形例および代替例が可能であり、その特定の実施例について図面に例示し、ここに詳細に説明するものである。しかしながら、図面および詳細な説明は、本発明を開示される特定の形態に限定するものではなく、逆に、添付の請求項が規定する本発明の精神および範囲にあるすべての変形例、等価例および代替例を包含することを意図することを理解されたい。
発明の詳細な説明
図１は、マイクロプロセッサ１０の一実施例のブロック図である。マイクロプロセッサ１０は、プリフェッチ/プリデコードユニット１２と、分岐予測ユニット１４と、命令キャッシュ１６と、命令整列ユニット１８と、複数のデコードユニット２０Ａから２０Ｃと、複数の予約ステーション２２Ａから２２Ｃと、複数の機能ユニット２４Ａから２４Ｃと、ロード/ストアユニット２６と、データキャッシュ２８と、レジスタファイル３０と、リオーダバッファ３２と、ＭＲＯＭユニット３４とを含む。ここで、特定の参照番号の後に文字を続けて表す要素は、参照番号のみの場合は、それを総称するものとする。たとえば、デコードユニット２０Ａから２０Ｃは、デコード２０と総称する。
プリフェッチ/プリデコードユニット１２は、主メモリサブシステム（図示せず）からの命令を受けるように結合され、かつさらに命令キャッシュ１６および分岐予測ユニット１４に結合される。同様に、分岐予測ユニット１４は、命令キャッシュ１６に結合される。分岐予測ユニット１４は、デコードユニット２０と機能ユニット２４に結合される。命令キャッシュ１６は、さらに、ＭＲＯＭユニット３４と命令整列ユニット１８とに結合される。命令整列ユニット１８は、デコードユニット２０に結合される。各デコードユニット２０Ａから２０Ｃは、ロード/ストアユニット２６とそれぞれの予約ステーション２２Ａから２２Ｃとに結合される。予約ステーション２２Ａから２２Ｃは、さらにそれぞれの機能ユニット２４Ａから２４Ｃに結合される。さらに、デコードユニット２０および予約ステーション２２は、レジスタファイル３０およびリオーダバッファ３２に結合される。機能ユニット２４は、ロード/ストア２６と、レジスタファイル３０と、リオーダバッファ３２にも結合される。データキャッシュ２８は、ロード/ストアユニット２６と主メモリサブシステムに結合される。最後に、ＭＲＯＭユニット３４は、デコードユニット２０に結合される。
一般に、分岐予測ユニット１４は、分岐命令を予測するためのキャッシュライン系分岐予測機構を採用する。各キャッシュラインごとに複数の分岐予測を記憶することができる。さらに、分岐セレクタが、キャッシュライン内のバイトごとにストアされる。特定のバイトの分岐セレクタは、キャッシュラインに関連して記憶され得る分岐予測のどれがその特定のバイトをフェッチする命令フェッチアドレスに適切な分岐予測であるかを示す。適切な分岐予測は、その特定のバイトに続いてキャッシュライン内で出会う最初の分岐が予測される分岐命令の分岐予測である。ここで使用する「後の」および「前の」と言う語は、キャッシュライン内のバイトの順序を指す。第２のバイトが記憶されるメモリアドレスより数字的に小さいメモリアドレスに記憶されるバイトは、第２のバイトより前のバイトである。逆に、第２のバイトのメモリアドレスより数字的に大きいメモリアドレスに記憶されるバイトは、第２のバイトの後のバイトである。同様に、プログラムを構成する命令のシーケンスで、一度に１つずつ進む時、第１の命令が第２の命令の前にある場合、第１の命令は、プログラム順では、第２の命令より前である。
一実施例において、マイクロプロセッサ１０は、命令セットが可変のバイト長の命令セットであるマイクロプロセッサアーキテクチャ（たとえば、×８６マイクロプロセッサアーキテクチャ）を採用する。可変バイト長の命令セットを採用する場合、キャッシュライン内のどのバイトも所与のフェッチアドレスによりフェッチされる第１のバイトとして識別され得る。たとえば、分岐命令が、キャッシュライン内のバイト位置２でターゲットアドレスを有し得る。その場合、バイト位置０および１は、現在のキャッシュアクセスにおいてフェッチされていない。さらに、第１のバイトの後で分岐を予測した分岐後のバイトは、現在のキャッシュアクセスにおいてフェッチされない。分岐セレクタは、各バイトについてストアされているので、分岐が予測される分岐の分岐予測は、キャッシュラインからフェッチされることになる第１のバイトの分岐セレクタを選択することにより見つけることができる。分岐セレクタを用いて適切な分岐予測を選択し、これを命令キャッシュ１６内の命令フェッチ論理に与える。次のクロックサイクルでは、分岐予測がフェッチアドレスとして使用される。フェッチされている第１のバイトのバイト位置を分岐が予測される分岐命令と比較するプロセスが、フェチアドレスに応答する分岐予測の発生から省かれる。分岐予測を構成するのにかかる時間が応じて短くなり、より高いクロック周波数で（すなわちより短いクロックサイクルで）分岐予測機構を動作させることができる一方で、依然として単一サイクルの分岐予測が提供される。
なお、先の説明で「キャッシュライン」という用語を使用したが、命令キャッシュ１６のいくつかの実施例は、所与のクロックサイクルの間にその出力に全キャッシュラインを提供しないかもしれない。たとえば、ある実施例では、命令キャッシュ１６は、３２バイトのキャッシュラインを有して構成される。しかしながら、１６バイトのみが所与のクロックサイクルでフェッチされる（キャッシュラインの上半分かまたは下半分）。分岐予測記憶場所および分岐セレクタは、フェッチされているキャッシュラインの部分に割当てられる。ここで使用される「隣接する命令バイトのグループ」という用語は、フェッチアドレスに応答して、特定のクロックサイクルで命令キャッシュにより付与される命令バイトを指すために使用される。隣接する命令バイトのグループは、様々な実施例応じて、キャッシュラインの１部分かもしれないし、全体かもしれない。隣接する命令バイトのグループは、キャッシュラインの一部である場合でも、キャッシュラインの整列した部分である。たとえば、隣接する命令バイトのグループが、キャッシュラインの半分である場合、それはキャッシュラインの上半分か下半分である。いくつかの分岐予測記憶場所が隣接する命令バイトの各グループに割当てられ、分岐セレクタがそのグループに関連する分岐予測記憶場所の一つを示す。さらに、隣接する命令バイトのグループにおける対応のバイトと最後のバイトとの間に分岐命令がなければ、分岐セレクタは、リターンスタック構造からのリターンスタックアドレスまたは逐次アドレスを示し得る。
命令キャッシュ１６は、命令を記憶するために設けられる高速キャッシュメモリである。命令は、命令キャッシュ１６からフェッチされ、デコードユニット２０へディスパッチされる。ある実施例では、命令キャッシュ１６は、３２バイトライン（１バイトは、８ビット）を有する４ウェイセットアソシアティブ構造で、３２キロバイトまでの命令を記憶するよう構成される。命令キャッシュ１６は、さらに命令キャッシュへのアクセス時間を速めるために、ウェイ予測スキームを採用し得る。命令の各ラインを表すタグをアクセスしてタグをフェッチアドレスと比較してウェイを選択する代わりに、命令キャッシュ１６は、アクセスされるウェイを予測する。この方法で、ウェイは、命令記憶部をアクセスする前に選択される。命令キャッシュ１６のアクセス時間は、ダイレクトマッピングのキャッシュと同じくらいが可能である。タグの比較を行い、ウェイ予測が間違っていれば、正しい命令をフェッチし、間違った命令は廃棄される。なお、命令キャッシュ１６は、フルアソシアティブ、セットアソシアティブ、またはダイレクトマッピングのいずれの構成としても実現し得る。
命令は、主メモリからフェッチされ、プリフェッチ/プリデコードユニット１２により命令キャッシュ１６内へ記憶される。命令は、プリフェッチスキームにしたがい、要求される前に、命令キャッシュ１６からプリフェッチされ得る。プリフェッチ/プリデコードユニット１２により、さまざまなプリフェッチスキームを採用することができる。プリフェッチ/プリデコードユニット１２は、命令を主メモリから命令キャッシュ１６へ転送する際、命令の各バイトについて３つのプリデコードビット、すなわち、スタートビット、エンドビットおよび機能ビットを発生する。プリデコードビットは、各命令の境界を表すタグを構成する。プリデコードタグは、以下により詳細に説明する通り、所与の命令がデコードユニット２０によりデコードできるかまたは命令がＭＲＯＭユニット３４により制御されるマイクロコード手続きを呼出すことにより実行されるのか等の付加情報も伝達し得る。さらに、プリフェッチ/プリデコードユニット１２は、分岐命令を検出して、分岐命令に対応する分岐予測情報を分岐予測ユニット１４に記憶するよう構成されてもよい。
×８６命令セットを採用するマイクロプロセッサ１０の実施例のプリデコードタグのある符号化方法について次に説明することにする。所与のバイトが命令の第１のバイトである場合、そのバイトのスタートビットがセットされる。そのバイトが命令の最後のバイトである場合、そのバイトのエンドビットがセットされる。デコードユニット２０により直接デコードされ得る残りの×８６の命令が、一実施例においては、ＭＲＯＭ命令と呼ばれる。高速経路命令については、機能ビットをその命令に含まれる各プリフィックスバイトについてセットし、他のバイトについてはクリアする。代替的には、ＭＲＯＭ命令については、機能ビットを各プリフィックスバイトについてクリアし、他のバイトについてセットする。命令のタイプは、エンドバイトに対応する機能ビットを調べることにより決定され得る。機能ビットがクリアなら、その命令は高速経路命令である。逆に、その機能ビットがセットされているなら、その命令はＭＲＯＭ命令である。命令の操作コードをそれにより、命令中の第１のクリア機能ビットと関連するバイトとしてデコードユニット２０により直接的にデコードされ得る命令の中に見つけることができる。たとえば、２つのプリフィックスバイト、ＭｏｄＲ/ＭバイトおよびＳＩＢバイトを含む高速経路命令は、以下のようなスタート、エンドおよび機能ビットを有するものと考えられる。
スタートビット          １００００
エンドビット            ００００１
機能ビット              １１０００
ＭＲＯＭ命令は、デコードユニット２０によりデコードするには複雑すぎると判断される命令である。ＭＲＯＭ命令は、ＭＲＯＭユニット３４を呼出すことにより実行される。より詳細には、ＭＲＯＭ命令があると、ＭＲＯＭユニット３４は、その命令を定義された高速経路命令のサブセットにパージングして発行し、所望の動作を実現する。ＭＲＯＭユニット３４は、高速経路命令のサブセットをデコードユニット２０へディスパッチする。高速経路命令として分類される例示的×８６命令のリスティングについて以下に説明する。
マイクロプロセッサ１０は、条件付分岐命令の後の命令を投機的にフェッチするために、分岐命令を採用する。分岐予測ユニット１４は、分岐予測動作を実行するために含まれる。ある実施例では、２つまでの分岐ターゲットアドレスを、命令キャッシュ１６の各キャッシュラインの各１６バイト部分に関連して記憶する。プリフェッチ/プリデコードユニット１２は、特定のラインがプリデコードされると初期分岐ターゲットを決定する。キャッシュラインに対応する分岐ターゲットへの次の更新は、キャッシュライン内の命令の実行により発生し得る。命令キャッシュ１６は、フェッチされている命令アドレスの表示を行い、分岐予測ユニット１４が、分岐予測を構成するのにどの分岐ターゲットアドレスを選択すべきかを判断できるようにする。デコードユニット２０および機能ユニット２４は、分岐予測ユニット１４への更新情報を提供する。分岐予測ユニット１４は、キャッシュラインの１６バイトごとに２つのターゲットを記憶するので、そのラインの分岐命令はいくつか分岐予測ユニット１４に記憶されないかもしれない。デコードユニット２０は、分岐予測ユニット１４が予測しなかった分岐命令を検出する。機能ユニット２４は、分岐命令を実行し、予測された分岐方向が間違っているかどうかを決定する。分岐命令が「分岐する」場合、後の命令は、分岐命令のターゲットアドレスからフェッチされる。逆に、分岐命令が「分岐しない」場合、後の命令は、分岐命令に連続する記憶場所からフェッチされる。予測が誤っている分岐命令が検出されると、その予測誤り命令の後の命令はマイクロプロセッサの１０の様々なユニットから廃棄される。様々な適切な分岐予測アルゴリズムが分岐予測ユニット１４により採用され得る。
命令キャッシュ１６からフェッチした命令は、命令整列ユニット１８へ伝達される。命令は命令キャッシュ１６からフェッチされるので、対応のプリデコードデータをスキャンして、フェッチされている命令に関する情報を命令整列ユニット１８（およびＭＲＯＭユニット３４）に与える。命令整列ユニット１８は、スキャンデータを利用してデコードユニット２０の各々に対して命令を整列させる。ある実施例では、命令整列ユニット１８は、８命令バイトの３セットから命令をデコードユニット２０に対して整列させる。命令は、８命令バイトの各セットとは無関係に初期発行位置へ選択される。初期発行位置は、デコードユニット２０に対応する整列した発行位置のセットにマージされ、整列した発行位置がプログラム順に初期発行位置の中で他の命令の前にある３つの命令を含むようにする。デコードユニット２０Ａは、デコードユニット２０Ｂおよび２０Ｃが（プログラム順に）同時に受ける命令の前にある命令を受ける。同様に、デコードユニット２０Ｂは、プログラム順にデコードユニット２０Ｃが同時に受ける命令の前の命令を受ける。
デコードユニット２０は、命令整列ユニット１８から受ける命令をデコードするように構成される。レジスタオペランド情報が検出され、レジスタファイル３０とリオーダバッファ３２へルート決めされる。さらに、命令が１以上の記憶動作の実行を要求する場合、デコードユニット２０は、記憶動作をロード/ストアユニット２６へディスパッチする。各命令は、機能ユニット２４の制御値のセットにデコードされ、これらの制御値がオペランドアドレス情報および命令と一緒に含まれ得る変位または即値データとともに予約ステーション２２へディスパッチされる。
マイクロプロセッサ１０は、アウト・オブ・オーダ実行を支持し、したがってリオーダバッファ３２を使用して、レジスタ読出しおよび書込み動作のための元のプログラムシーケンスの追跡を行い、レジスタのリネーミングを実行し、投機的命令実行および分岐予測誤り回復を図り、かつ正確な例外を容易にする。リオーダバッファ３２内の一時記憶場所がレジスタの更新を含む命令のデコードの際に予約され、それにより投機的レジスタの状態を記憶する。分岐予測が間違っていれば、間違って予測された経路に沿って投機的に実行された命令の結果は、レジスタファイル３０に書きこまれる前にバッファ内で無効にされる。同様に、特定の命令が例外を引き起こす場合、その特定の命令の後の命令が廃棄され得る。このようにして、例外が「正確」になる（すなわち、例外を引き起こす特定の命令の後の命令は、例外の前には完了しない）。なお、特定の命令が、プログラム順においてその特定の命令より前にある命令に先立って実行される場合には、その命令は、投機的に実行される。先行する命令が分岐命令かまたは例外を引起す命令である場合、投機的結果は、リオーダバッファ３２により廃棄され得る。
デコードユニット２０の出力に与えられる命令制御値および即値または変位データは、それぞれの予約ステーション２２へ直接的にルート決めされる。ある実施例において、各予約ステーション２２は、対応の機能ユニットへの発行を待っている３つまでの未処理命令の命令情報（すなわち命令の制御値およびオペランド値、オペランドタグおよび/または即値データ）を保持する能力がある。なお、図１の実施例については、各予約ステーション２２は、専用の機能ユニット２４に関連する。したがって、３つの専用「発行位置」が予約ステーション２２Ａと機能ユニット２４により構成される。言いかえれば、発行位置０は、予約ステーション２２Ａと機能ユニット２４とにより構成される。予約ステーション２２Ａに対し整列しディスパッチされる命令は、機能ユニット２４Ａにより実行される。同様に、発行位置１は、予約ステーション２２Ｂと機能ユニット２４Ｂにより構成され、発行位置２は、予約ステーション２２Ｃと機能ユニット２４Ｃとにより構成される。
特定の命令のデコードに際し、必要とされるオペランドがレジスタ場所なら、レジスタアドレス情報は、同時にリオーダバッファ３２とレジスタファイル３０へルート決めされる。当業者には、×８６レジスタファイルが８つの３２ビットリアルレジスタ（すなわち、一般にＥＡＸ、ＥＢＸ、ＥＣＸ、ＥＤＸ、ＥＢＰ、ＥＳＩ、ＥＤＩおよびＥＳＰとよばれる）を含むことがわかるであろう。×８６マイクロプロセッサアーキテクチャを採用するマイクロプロセッサ１０の実施例では、レジスタファイル３０が、３２ビットリアルレジスタの各々につき記憶場所を含む。ＭＲＯＭユニット３４が使用する、追加の記憶場所をレジスタファイル３０に備えてもよい。リオーダバッファ３２は、これらレジスタの内容を変える結果の一時的記憶場所を含み、それによりアウト・オブ・オーダ実行を可能にする。リオーダバッファ３２の一時記憶場所は、各命令について予約されており、デコードの際にはリアルレジスタの１つの内容を変更するよう決定される。したがって、特定のプログラムの実行の際に様々なポイントでリオーダバッファ３２は、所与のレジスタの投機的に実行した内容を含む１以上の場所を有し得る。所与の命令のデコードに続いて、リオーダバッファ３２が所与の命令内のオペランドとして使用するレジスタに割当てられた以前の場所（単数または複数）を有していると判断される場合には、リオーダバッファ３２は、対応の予約ステーションに、１）最も最近割当てられた場所の値、または２）この以前の命令を最終的に実行することになる機能ユニットによって、値がまだ生成されていない場合には、最も最近割当てられた場所のタグのいずれかを転送する。リオーダバッファ３２が、所与のレジスタについて予約された場所を有している場合には、オペランドの値（またはリオーダバッファのタグ）が、レジスタファイル３０からではなく、リオーダバッファ３２から与えられる。リオーダバッファ３２内に必要とされるレジスタ用に予約された場所がなければ、レジスタファイル３０から値が直接的に取られる。オペランドが記憶場所に対応する場合には、オペランドの値が、ロード/ストアユニット２６により予約ステーションへ与えられる。
ある特定の実施例では、リオーダバッファ３２が同時にデコードされた命令を１単位として記憶しかつ操作するよう構成される。この構成は、ここでは「ライン構成の」と呼ぶことにする。いくつかの命令を一緒に操作することで、リオーダバッファ３２内で採用されるハードウェアを簡略化することができる。たとえば、本実施例に含まれるライン構成のリオーダバッファは、１以上の命令がデコードユニット２０によりディスパッチされるたびに、（各デコーダユニット２０から１つずつ）３つの命令に関連する命令情報に十分な記憶部を割当てる。対照的に、従来技術のリオーダバッファでは、実際にディスパッチされる命令の数に応じて、可変量の記憶が割当てられる。可変量の記憶を割当てるためには、比較的多数の論理ゲートが必要になる。同時にデコードされる命令の各々を実行すると、命令の結果が同時にレジスタファイル３０に記憶される。記憶部は、その後、同時にデコードされた命令のもう１つのセットに自由に割当てられる。また、命令ごとに採用される制御論理回路の量は、制御論理が複数の同時にデコードされた命令について償却されるので、減少する。特定の命令を表すリオーダバッファのタグは２つのフィールド、すなわちラインタグとオフセットタグとに分割され得る。ラインタグは、特定の命令を含む同時にデコードされる命令のセットを表し、オフセットタグは、セットのどの命令が特定の命令に対応するかを表す。なお、命令の結果をレジスタファイル３０に記憶しかつ対応の記憶部を開放することを、その命令を「リタイアさせる」と称する。さらに、マイクロプロセッサ１０の様々な実施例において、どのようなリオーダバッファの構成を採用してもよい。
上述のように、予約ステーション２２は命令が対応の機能ユニット２４によって実行されるまでその命令をストアする。命令が実行のために選択されるのは、（ｉ）命令のオペランドが与えられている場合と、（ii）オペランドが、同じ予約ステーション２２Ａ−２２Ｃ内にあり、かつプログラム順でその命令の前にある命令のために与えられていない場合とである。ここで、命令が機能ユニット２４の１つによって実行される場合、その命令の結果は、結果がリオーダバッファ３２を更新するために渡されるのと同時にその結果を待っているいずれかの予約ステーション２２に直接渡される（この技術は通常「結果送り」と呼ばれる）。命令は、関連の結果が送られるクロックサイクルの間に、実行のために選択され、機能ユニット２４Ａ−２４Ｃに渡され得る。予約ステーション２２は送られた結果をこの場合の機能ユニット２４に送る。
一実施例では、機能ユニット２４の各々が加算および減算の整数算術演算、シフト、回転、論理演算および分岐演算を行なうように構成される。演算はデコードユニット２０によって特定の命令のために復号化される制御値に応答して行なわれる。ここで、浮動小数点ユニット（図示せず）もまた浮動小数点演算に対処するために用いられてもよい。浮動小数点ユニットは、ＭＲＯＭユニット３４からの命令を受取り、その後リオーダバッファ３２と通信して命令を完了するコプロセッサとして動作できる。また、機能ユニット２４はロード／ストアユニット２６によって行なわれるロードおよびストア記憶動作（load and store memory operations）のためのアドレス発生を行なうように構成されてもよい。
各機能ユニット２４はまた、分岐予測ユニット１４への条件付分岐命令の実行に関する情報を与える。分岐予測が正しくなければ、分岐予測ユニット１４は、命令処理パイプラインに入った誤って予測された分岐の後の命令を流し、命令キャッシュ１６または主メモリからの必要とされる命令のフェッチを引き起こす。このような状況では、誤って予測された分岐命令の後に起こる元のプログラムシーケンスにおける命令の結果が破棄され、これには投機的に実行され、ロード／ストアユニット２６およびリオーダバッファ３２に一時的にストアされたものも含まれることに注目される。
機能ユニット２４によって生じる結果は、レジスタ値が更新されるのであればリオーダバッファ３２に送られ、記憶場所の内容が変化されるならばロード／ストアユニット２６に送られる。結果がレジスタにストアされるべきであれば、リオーダバッファ３２はその結果を、命令が復号化されたときにそのレジスタの値のために予約された場所にストアする。複数の結果バス３８が機能ユニット２４およびロード／ストアユニット２６から結果を送るために含まれる。結果バス３８は発生された結果と実行される命令を特定するリオーダバッファタグとを伝える。
ロード／ストアユニット２６は機能ユニット２４とデータキャッシュ２８との間でインターフェイスとなる。一実施例では、ロード／ストアユニット２６は未決のロードまたはストアのためにデータおよびアドレス情報に対して８つの記憶場所を有するロード／ストアバッファで構成される。デコードユニット２０はロード／ストアユニット２６へのアクセスのために調停を行なう。バッファがフルである場合、デコードユニットはロード／ストアユニット２６が未決のロードまたはストア要求情報のための余地を有するようになるまで待機しなければならない。ロード／ストアユニット２６はまた、データの一貫性が保たれることを確実とするために、未決のストア記憶動作に対してロード記憶動作の従属性検査を行なう。記憶動作はマイクロプロセッサ１０と主メモリサブシステムとの間のデータ転送である。記憶動作はメモリにストアされるオペランドを利用する命令の結果であってもよく、データ転送を起こすが他の動作は起こさないロード／ストア命令の結果であってもよい。さらに、ロード／ストアユニット２６はｘ８６マイクロプロセッサアーキテクチャによって規定されるアドレス変換機構に関連したセグメントレジスタおよび他のレジスタのような特殊レジスタのための特殊レジスタストレージを含んでもよい。
一実施例では、ロード／ストアユニット２６がロード記憶動作を投機的に行なうように構成される。ストア記憶動作はプログラム順に行なわれるが、予測されたウェイへと投機的にストアされてもよい。予測されたウェイが正確でなければ、ストア記憶動作の前のデータがその後予測されたウェイに再ストアされ、ストア記憶動作が正しいウェイに行なわれる。別の実施例では、ストアは投機的にも実行され得る。投機的に実行されたストアは、更新前のキャッシュラインのコピーとともにストアバッファに入れられる。投機的に実行されたストアが分岐予測誤りか例外のために後に破棄されれば、キャッシュラインはバッファにストアされる値に回復され得る。ここで、ロード／ストアユニット２６は投機的な実行を含まない何らかの量の投機的実行を行なうよう構成されてもよい。
データキャッシュ２８はロード／ストアユニット２６と主メモリサブシステムとの間で転送されるデータを一時的にストアするために設けられる高速キャッシュメモリである。一実施例では、データキャッシュ２８は８ウェイセットアソシアティブ構造において１６キロバイトまでのデータをストアする能力を有する。命令キャッシュ１６と同様に、データキャッシュ２８はウェイ予測機構を用いることができる。データキャッシュ２８がセットアソシアティブ構成を含むさまざまな具体的メモリ構成で実現され得ることが理解される。
ｘ８６マイクロプロセッサアーキテクチャを用いるマイクロプロセッサ１０のある特定の実施例では、命令キャッシュ１６およびデータキャッシュ２８が線形的にアドレス指定される。線形アドレスは、命令によって特定されるオフセットと、ｘ８６アドレス変換機構のセグメント部分によって特定されるベースアドレスとから形成される。線形アドレスは主メモリにアクセスするために物理アドレスに変換されてもよい。線形から物理への変換はｘ８６アドレス変換機構のページング部分によって特定される。ここで、線形的にアドレス指定されたキャッシュが線形アドレスタグをストアする。１組の物理タグ（図示せず）が線形アドレスを物理アドレスにマッピングし、かつ変換歪みを検出するために用いられ得る。また、物理タグブロックは線形アドレスから物理アドレスへの変換を行なうことができる。
ここで図２を参照すると、デコードユニット２０Ｂおよび２０Ｃの一実施例のブロック図が示される。各デコードユニット２０は命令整列ユニット１８から命令を受取る。また、ＭＲＯＭユニット３４が特定のＭＲＯＭ命令に対応する高速パス命令をディスパッチするために各デコードユニット２０に結合される。デコードユニット２０Ｂは先行（early）デコードユニット４０Ｂ、マルチプレクサ４２Ｂおよび操作コードデコードユニット４４Ｂを含む。同様に、デコードユニット２０Ｃは先行デコードユニット４０Ｃ、マルチプレクサ４２Ｃおよび操作デコードユニット４４Ｃを含む。
ｘ８６命令セットのある命令はかなり複雑化しており、頻繁に用いられる。マイクロプロセッサ１０の一実施例では、このような命令は、特定の機能ユニット２４Ａ−２４Ｃ内に含まれるハードウェアが実行するために構成されるよりも複雑な演算を含む。このような命令は「二重ディスパッチ」命令と呼ばれる特殊なタイプのＭＲＯＭ命令として分離される。これらの命令は１対の操作コードデコードユニット４４にディスパッチされる。ここで、操作コードデコードユニット４４はそれぞれの予約ステーション２２に結合される。操作コードデコードユニット４４Ａ−４４Ｃの各々は対応の予約ステーション２２Ａ−２２Ｃと機能ユニット２４Ａ−２４Ｃとで発行位置を形成する。命令は操作コードデコードユニット４４から対応の予約ステーション２２へと、さらに対応の機能ユニット２４へと渡される。
マルチプレクサ４２ＢはＭＲＯＭユニット３４によって与えられる命令か先行デコードユニット４０Ｂによって与えられる命令かを選択するために含まれる。ＭＲＯＭユニット３４が命令をディスパッチしている時間の間、マルチプレクサ４２ＢはＭＲＯＭユニット３４によって与えられる命令を選択する。他の時間では、マルチプレクサ４２Ｂは先行デコードユニット４０Ｂによって与えられる命令を選択する。同様に、マルチプレクサ４２ＣはＭＲＯＭユニットによって与えられる命令か、先行デコードユニット４０Ｂによって与えられる命令か、先行デコードユニット４０Ｃによって与えられる命令かの選択を行なう。ＭＲＯＭユニット３４からの命令はＭＲＯＭユニット３４が命令をディスパッチしている時間の間に選択される。デコードユニット２０Ａ（図示せず）内の先行デコードユニットが二重ディスパッチ命令を検出する時間の間、先行デコードユニット４０Ｂからの命令がマルチプレクサ４２Ｃによって選択される。さもなければ、先行デコードユニット４０Ｃからの命令が選択される。操作コードデコードユニット４４Ｃへと先行デコードユニット４０Ｂからの命令を選択することによって、デコードユニット２０Ｂによって復号化される高速経路命令がデコードユニット２０Ａによって復号化される二重ディスパッチ命令と同時にディスパッチされる。
ｘ８６命令セットを用いる一実施例に従うと、先行デコードユニット４０は以下の動作を行なう。
（ｉ）  命令のプリフィックスバイトを符号化されたプリフィックスバイトへとマージする。
（ii）  分岐予測の間に検出されなかった（無条件飛越し、呼出しおよびリターンを含み得る）無条件分岐命令を復号化する。
（iii）  出所フラグおよび行先フラグを復号化する。
（iv）  レジスタオペランドであり、オペランドサイズ情報を発生する出所オペランドおよび行先オペランドを復号化する。
（ｖ）  変位および即値データが操作コードデコードユニットに送られるように変位および／または即値サイズを決定する。
操作コードデコードユニット４４は命令の操作コードを復号化するように構成され、機能ユニット２４のための制御値を生じる。変位および即値データは制御値とともに予約ステーション２２に送られる。
先行デコードユニット４０がオペランドを検出するので、マルチプレクサ４２の出力はレジスタファイル３０およびリオーダバッファ３２に送られる。オペランド値またはタグは従って予約ステーション２２に送られ得る。また、メモリオペランドは先行デコードユニット４０によって検出される。したがって、マルチプレクサ４２の出力はロード／ストアユニット２６に送られる。メモリオペランドを有する命令に対応する記憶動作がロード／ストアユニット２６によってストアされる。
ここで図３を参照すると、連続する命令バイト５０の例示的なグループと対応のセットの分岐セレクタ５２との図が示される。図３では、命令内の各バイトが短い垂直線（たとえば、参照番号５４）によって示される。また、グループ５０内の命令を分離する垂直線はバイトの範囲を定める（たとえば、参照番号５６）。図３に示す命令は可変長であり、したがって、図３に示す命令を含む命令セットは可変バイト長の命令セットである。すなわち、可変バイト長命令セット内の第１の命令は、命令セット内の第２の命令によって占められる第２の数のバイトとは異なる第１の数のバイトを占め得る。他の命令セットは、命令セット内の各命令が他の各命令と同じ数のバイトを占めるように固定長であってもよい。
図３に示すように、グループ５０は非分岐命令ＩＮ０−ＩＮ５を含む。命令ＩＮ０、ＩＮ３、ＩＮ４およびＩＮ５は２バイト命令である。命令ＩＮ１は１バイト命令であり、命令ＩＮ２は３バイト命令である。分岐を予測された２つの分岐命令ＰＢ０およびＰＢ１も例示され、各々２バイトを占めるものとして示される。ここで、非分岐命令および分岐命令の両方がさまざまな数のバイトを占めてもよい。
分岐を予測された各分岐ＰＢ０およびＰＢ１のエンドバイトはグループ５０を、第１の領域５８、第２の領域６０および第３の領域６２の３つの領域に分割する。フェッチアドレスを識別するグループ５０が提示され、グループ内のフェッチアドレスのオフセットが第１の領域５８内のバイト位置を識別すれば、遭遇されるべき分岐を予測された第１の分岐命令はＰＢ０であり、したがって、ＰＢ０のための分岐予測が分岐予測機構によって選択される。同様に、フェッチアドレスのオフセットが第２の領域６０内のバイトを識別すれば、適切な分岐予測はＰＢ１のための分岐予測である。最後に、フェッチアドレスのオフセットが第３の領域６２内のバイトを識別すれば、命令バイトのグループ内と識別されたバイトの後には分岐を予測された分岐命令は存在しない。したがって、第３の領域６２のための分岐予測は逐次的である。逐次アドレスが主メモリ内でグループ５０の直後に続く命令バイトのグループを識別する。
ここで用いられる場合、アドレスのオフセットはそのアドレスの多数の最下位ビットを含む。この数は、オフセットが関連するバイトのグループ内の各バイトのためのビットの種々の復号化を与えるのに十分なものである。たとえば、グループ５０は１６バイトである。したがって、グループ内のアドレスの４最下位ビットがアドレスのオフセットを形成する。アドレスの残りのビットが主メモリ内の命令バイトの他のグループからグループ５０を識別する。さらに、残りのビットの多数の最下位ビットが、グループ５０をストアするのに望ましい記憶場所の行を選択するために命令キャッシュ１６によって用いられるインデックスを形成する。
セット５２はグループ５０のための分岐セレクタの例示的なセットである。１つの分岐セレクタがグループ５０内のバイトごとに含まれる。セット５２内の分岐セレクタは以下の図６に示す復号化を用いる。例では、ＰＢ０のための分岐予測が（「３」の分岐セレクタ値によって示すように）グループ５０と関連した２つの分岐予測のうちの第２のものとしてストアされる。したがって、第１の領域５８内の各バイトのための分岐セレクタは「３」にセットされる。同様に、ＰＢ１のための分岐予測は（「２」の分岐セレクタ値によって示すように）分岐予測の第１のものとしてストアされる。したがって、第２の領域６０内の各バイトのための分岐セレクタは「２」にセットされる。最後に、逐次分岐予測が「０」の分岐セレクタ符号化によって第３の領域６０内のバイトのための分岐セレクタによって示される。
ここで、ｘ８６命令セットの可変バイト長の性質のために、分岐命令は連続する命令バイトのあるグループ内で始まり、連続する命令バイトの第２のグループ内で終るかもしれない。このような場合、分岐命令のための分岐予測は連続する命令バイトの第２のグループでストアされる。特に、連続する命令バイトの第２のグループ内にストアされる分岐命令のバイトはフェッチされ、ディスパッチされる必要がある。連続する命令バイトの第１のグループにおいて分岐予測を形成すると、命令バイトの第２のグループ内にある分岐命令のバイトがフェッチされないであろう。
ここで図４を参照すると、分岐予測ユニット１４の一実施例の一部が示される。分岐予測ユニット１４の他の実施例と図４に示す部分とを考える。図４に示すように、分岐予測ユニット１４は分岐予測ストレージ７０、ウェイマルチプレクサ７２、分岐セレクタマルチプレクサ７４、分岐予測マルチプレクサ７６、逐次／リターンマルチプレクサ７８、最終予測マルチプレクサ８０、更新論理ブロック８２およびデコーダ８４を含む。分岐予測ストレージ７０およびデコーダ８４は命令キャッシュ１６からのフェッチアドレスバス８６に結合される。命令キャッシュ１６内の命令バイトストレージに同時に与えられるフェッチアドレスはフェッチアドレスバス８６により伝えられる。デコーダブロック８４は予測セレクタマルチプレクサ７４に選択制御を与える。ウェイマルチプレクサ７２のための予測制御は命令キャッシュ１６からウェイ選択バス８８を介して与えられる。ウェイ選択バス８８は、フェッチアドレスバス８６で与えられるフェッチアドレスに対応するキャッシュラインをストアしている命令キャッシュ１６のウェイを与える。また、選択信号がキャッシュラインのどの部分がフェッチされているかに基づいてデコーダ８４によって与えられる。ウェイマルチプレクサ７２は、フェッチアドレスバス８６上のフェッチアドレスによってインデックス付けされる分岐予測ストレージ７０の行内の各記憶場所の内容を受取るために結合される。分岐セレクタマルチプレクサ７４および分岐予測マルチプレクサ７６はウェイマルチプレクサ７２の出力の部分を入力として受取るよう結合される。また、分岐セレクタマルチプレクサ７４の出力はマルチプレクサ７６、７８および８０のための選択制御を与える。逐次／リターンマルチプレクサ７８は、命令キャッシュ１６からの逐次アドレスバス９０で与えられる逐次アドレスか、リターンスタックからのリターンアドレスバス９２で与えられるリターンアドレスかを選択する。マルチプレクサ７６および７８の出力は最終予測マルチプレクサ８０に与えられ、これは命令キャッシュ１６に分岐予測バス９４を与える。命令キャッシュ１６は分岐予測バス９４で与えられる分岐予測を後のクロックサイクルのためのフェッチアドレスとして用いる。更新論理ブロック８２は、そこでストアされる分岐予測情報を更新するために用いられる更新バス９６を介して分岐予測ストレージ７０に結合される。更新論理ブロック８２は、機能ユニット２４およびデコードユニット２０から予測誤りバス９８を介して信号される予測誤りに応答して更新を行なう。また、更新論理ブロック８２はプリデコードバス１００上のプリフェッチ−プリデコードユニット１２によって示される新たにプリデコードされた命令に応答して更新を行なう。
分岐予測ストレージ７０は命令キャッシュ１６におけるウェイの数と等しい数のウェイを備えて配列される。各ウェイに対して、予測ブロックがキャッシュライン内に存在する連続する命令バイトの各グループのためにストアされる。図４の実施例では、命令バイトの２つのグループが各キャッシュラインに含まれる。したがって、予測ブロックＰ00が第１のウェイの連続する命令バイトの第１のグループに対応する予測ブロックであり、予測ブロックＰ01が第１のウェイの連続する命令バイトの第２のグループに対応する予測ブロックである。同様に、予測ブロックＰ10が第２のウェイの連続する命令バイトの第１のグループに対応する予測ブロックであり、予測ブロックＰ11が第２のウェイの連続する命令バイトの第２のグループに対応する予測ブロックであり、以下同様である。インデックス付けされた行における各予測ブロックＰ00からＰ31が分岐予測ストレージ７０の出力、したがってウェイマルチプレクサ７２の入力として設けられる。インデックス付けされた行はキャッシュへのインデックス付けと類似しており、フェッチアドレスのオフセット部分の一部でない多数のビットが分岐予測ストレージ７０の行の１つを選択するために用いられる。ここで、分岐予測ストレージ７０は命令キャッシュ１６よりも少ない行で構成されてもよい。たとえば、分岐予測ストレージ７０は命令キャッシュ１６の行の数の４分の１の行を含んでもよい。このような場合、命令キャッシュ１６のインデックスビットであるが分岐予測ストレージ７０のインデックスビットでないアドレスビットが分岐予測情報とともにストアされてもよく、分岐予測情報がアクセスされている命令キャッシュ１６の行と関連していることを確かめるためにフェッチアドレスの対応のビットに対して検査されてもよい。
ウェイマルチプレクサ７２は、命令キャッシュ１６から与えられるウェイ選択とフェッチアドレスによって参照される命令バイトのグループとに基づいて分岐予測情報Ｐ00−Ｐ31の組の１つを選択する。図示する実施例では、たとえば、３２バイトキャッシュラインが２つの１６バイトグループに分割される。したがって、アドレスの５番目の最下位ビットが２つのグループのうちのいずれがフェッチアドレスを含むかを選択するために用いられる。５番目の最下位ビットが０であれば、連続する命令バイトの第１のグループが選択される。５番目の最下位ビットが１であれば、連続する命令バイトの第２のグループが選択される。ここで、ウェイ選択バス８８上に与えられるウェイ選択は、一実施例に従うと前のクロックサイクルからの分岐予測によって生み出されるウェイ予測であってもよい。代替的に、ウェイ選択は、フェッチアドレスと命令キャッシュの各ウェイにストアされるキャッシュラインを識別するアドレスタグとの間でのタグ比較により生じてもよい。ここで、アドレスタグはキャッシュライン内のオフセットでも命令キャッシュへのインデックスでもないアドレスの部分である。
ウェイマルチプレクサ７２によって与えられる選択された予測ブロックは、連続する命令バイトのグループにおける各バイトのための分岐セレクタと、分岐予測ＰＰ１およびＰＰ２とを含む。分岐セレクタは分岐セレクタマルチプレクサ７４に与えられ、これはデコーダ８４によって与えられる選択制御に基づいて分岐セレクタのうちの１つを選択する。デコーダ８４はフェッチアドレスのオフセットを連続する命令バイトのグループへと復号化して対応の分岐セレクタを選択する。たとえば、連続する命令バイトのグループが１６バイトであれば、デコーダ８４はフェッチアドレスの４最下位ビットを復号化する。このように分岐セレクタは選択される。
選択された分岐セレクタは選択制御を分岐予測マルチプレクサ７６、逐次／リターンマルチプレクサ７８および最終予測マルチプレクサ８０に与えるために用いられる。一実施例では、分岐セレクタの符号化がマルチプレクサ選択制御として直接的に用いられ得る。他の実施例では、論理ブロックが分岐セレクタマルチプレクサ７４とマルチプレクサ７６、７８および８０との間に挿入され得る。図示する実施例では分岐セレクタは２ビットを含む。選択された分岐セレクタの一方のビットが選択制御を予測マルチプレクサ７６および逐次／リターンセレクタ７８に与える。他方のビットは選択制御を最終予測マルチプレクサ８０に与える。分岐予測はしたがって、フェッチされる連続する命令バイトのグループに対応する分岐予測ストレージ７０にストアされた多数の分岐予測と、フェッチされる連続する命令バイトのグループに続いて起こる連続する命令バイトのグループの逐次アドレスと、リターンスタック構造からのリターンスタックアドレスとから選択される。ここで、マルチプレクサ７６、７８および８０は単一の４対１マルチプレクサに組合されることができ、このマルチプレクサのために、選択された分岐セレクタは選択制御を与えて、分岐予測ストレージ７０、逐次アドレスおよびリターンアドレスからの２つの分岐命令間で選択を行なう。
リターンスタック構造（図示せず）はマイクロプロセッサ１０によって前にフェッチされたサブルーチン呼出命令に対応するリターンアドレスをストアするために用いられる。一実施例では、分岐命令ストレージ７０によってストアされる分岐予測は分岐予測がサブルーチン呼出命令に対応するという指示を含む。サブルーチン呼出命令は、命令ストリームをサブルーチン呼出命令の目標アドレスに再び向けることに加えて逐次命令（リターンアドレス）のアドレスをセーブする分岐命令のサブセットである。たとえば、ｘ８６マイクロプロセッサアーキテクチャでは、サブルーチン呼出命令（ＣＡＬＬ）がリターンアドレスをＥＳＰレジスタによって指示されるスタックへと押出す。
サブルーチンリターン命令は分岐予測の別のサブセットである。サブルーチンリターン命令は目標アドレスとして最も新しく実行されたサブルーチン呼出命令によってセーブされるリターンアドレスを用いる。したがって、分岐予測がそれがサブルーチン呼出命令に対応するという指示を含む場合、サブルーチン呼出命令への逐次アドレスがリターンスタックの先頭に置かれる。サブルーチン呼出命令が（特定の分岐セレクタ符号化によって示されるように）遭遇されると、予測としてこれまでに用いられていないリターンスタックの先頭に最も近いアドレスがアドレスの予測として用いられる。これまでに予測として用いられていないリターンスタックの先頭に最も近いアドレスが（それがウェイ選択バス８８上に設けられるのと類似してリターンスタックに設けられるリターンアドレスの予測されたウェイとともに）リターンスタックによってリターンアドレスバス９２に運ばれる。分岐予測ユニット１４はリターンスタックにリターンアドレスがいつ予測として選択されるかを知らせる。例示的なリターンスタック構造に関する更なる詳細はMahalingaiah他によって１９９５年１０月３０日に提出され、共通の譲受人に譲渡され、同時係属中の特許出願連続番号第０８／５５０，２９６号「スーパースカラマイクロプロセッサのための投機的リターンアドレス予測ユニット」（“Speculative Return Address Prediction Unit for Superscalar Microprocessor”）に見られ得る。引用された特許出願の開示は引用によりここに全体的に援用される。
逐次アドレスは命令キャッシュ１６によって与えられる。逐次アドレスはフェッチアドレスバス８６上のフェッチアドレスによって示される命令バイトのグループに対して主メモリ内の連続する命令バイトの次のグループを識別する。ここで、一実施例に従うとウェイ予測は逐次アドレスが選択されるときに逐次アドレスに供給される。ウェイ予測はフェッチアドレスのために選択されるウェイと同じであるように選択され得る。代替的に、逐次アドレスのウェイ予測が分岐予測ストレージ７０内にストアされてもよい。
上述のように、更新論理ブロック８２が、プリフェッチ／プリデコードユニット１２における連続する命令バイトの対応のグループをプリデコードする間、分岐予測誤りの検出時または分岐命令の検出時に予測ブロックを更新するように構成される。各分岐命令に対応する予測ブロックは予測が行なわれているときに更新論理ブロック８２にストアされる。分岐タグがフェッチされる命令とともに（分岐タグバス１０２によって）運ばれるので、プリデコードの間に予測誤りが検出されるか分岐命令が検出されれば、対応の予測ブロックが分岐タグによって識別され得る。一実施例では、図５に示すような予測ブロックが、予測ブロックをフェッチさせるフェッチアドレスのインデックスと予測ブロックがストアされるウェイとともにストアされる。
分岐予測誤りが検出されると、対応の分岐タグが、分岐命令を実行する機能ユニット２４がデコードユニット２０のいずれかから予測誤りバス９８上に与えられる。デコードユニット２０が分岐タグを与えれば、予測誤りは前に検出されなかったタイプのものである（たとえば、対応の分岐予測を用いて予測できるよりも多くの分岐命令がグループ内にある）。デコードユニット２０は無条件分岐命令（すなわち、常に目標アドレスを選択する分岐命令）の予測誤りを検出する。機能ユニット２４は前に検出されなかった条件付き分岐命令によるか不正確な分岐／非分岐を予測された予測かによる予測誤りを検出できる。更新論理８２は上述のストレージから対応の予測ブロックを選択する。前に検出されなかった分岐命令の場合、予測ブロック内の分岐予測の１つが前に検出されなかった分岐命令に割当てられる。一実施例に従うと、分岐予測の１つを選択して前に検出されなかった分岐命令のための分岐予測をストアするアルゴリズムは以下のとおりである。分岐命令がサブルーチンリターン命令であれば、その命令のための分岐セレクタがリターンスタックを示す値であるように選択される。さもなければ、現在非分岐を予測されている分岐予測が選択される。各分岐予測が現在分岐を予測されていれば、分岐予測はランダムに選択される。新しい予測のための分岐セレクタが選択された分岐予測を示すようにセットされる。また、新たに検出された分岐命令の前の第１の分岐命令と新たに検出された分岐命令との間のバイトに対応する分岐セレクタが新しい予測に対応する分岐セレクタにセットされる。以下の図７は分岐セレクタを更新するための１つの方法を説明する。予測が非分岐を予測されるようにする誤って予測された分岐予測では、誤って予測された予測に対応する分岐セレクタは誤って予測された分岐命令の後のバイトに対応する分岐セレクタにセットされる。このように、後の分岐命令のための予測が用いられるのは命令が後のクロックサイクルで再びフェッチされる場合である。
連続する命令バイトのグループをプリデコードする間にプリフェッチ／プリデコードユニット１２が分岐命令を検出するとき、プリフェッチ／プリデコードユニット１２は、無効なプリデコード情報がキャッシュラインのための命令キャッシュにストアされているのでプリデコードが行なわれるならば連続する命令バイトのグループのために分岐タグを与える（場合（ｉ））。代替的に、主メモリサブシステムからフェッチされるキャッシュライン上でプリデコードが行なわれるならば、プリフェッチ／プリデコードユニット１２はプリデコードされる連続する命令バイトのグループのアドレスと、グループ内の分岐命令の最終バイトのオフセットと、グループをストアするために選択される命令キャッシュのウェイとを与える（場合（ii））。場合（ｉ）では、更新は上の分岐予測誤りの場合と同様に行なわれる。場合（ii）では、命令のグループのために分岐予測ストレージ７０にストアされる有効予測ブロックはまだない。この場合では、更新論理ブロック８２は検出された分岐の前の分岐セレクタを検出された分岐のために選択される分岐セレクタに初期化する。さらに、検出された分岐の後の分岐セレクタが逐次的な値に初期化される。代替的に、分岐セレクタの各々が命令キャッシュ１６における対応のキャッシュラインが割当てられるときに逐次的に初期化されてもよく、場合（ｉ）に類似した態様でプリデコードの間に分岐命令の検出により後に更新されてもよい。
更新が発生すると、更新論理ブロック８２は更新された予測ブロックをフェッチアドレスインデックスおよび対応のウェイとともに分岐予測ストレージ７０にストアするために更新バス９６で運ぶ。ここで、分岐予測ストレージ７０を単一ポートのストレージとして保つために、分岐予測ストレージ７０は分岐保持レジスタを用いてもよい。更新された分岐情報は分岐保持レジスタにストアされ、フェッチアドレスバス８上のアイドルサイクルで分岐予測ストレージへと更新される。例示的なキャッシュ保持レジスタ構造はTran他によって１９９５年６月７日に提出され、共通の譲受人に譲渡され、同時係属中である特許出願連続番号第０８／４８１，９１４号「アレイのための遅延された更新レジスタ」（Delayed Update Register for an Array）に説明される。これは引用によりここに全体的に援用される。
ここで、正しく予測された分岐命令は対応の分岐命令も更新させる。（分岐命令の分岐／非分岐予測を形成するために用いられる）分岐命令の前の実行を示すカウンタがたとえばインクリメントまたはデクリメントされる必要が有り得る。このような更新は対応の分岐予測のリタイア時に行なわれる。リタイアはリオーダバッファ３２からのリタイアタグバス１０４上の分岐タグによって示される。
ここで、図４の構造が予測された分岐セレクタの使用によってさらに加速され得る。予測された分岐セレクタは各予測ブロックでストアされ、連続する命令バイトの連続するグループの前のフェッチにおいて選択された分岐セレクタにセットされる。予測された分岐セレクタは分岐予測を選択するために用いられ、分岐セレクタマルチプレクサ７４を分岐予測発生の経路から除去する。しかしながら、選択された分岐セレクタが予測された分岐セレクタと等しいか確かめるために分岐セレクタマルチプレクサ７４がなお用いられる。選択された分岐セレクタと予測された分岐セレクタとが等しくなければ、選択された分岐セレクタが続くクロックサイクルの間に正しい分岐予測を与えるために用いられ、正しくない分岐予測のフェッチがキャンセルされる。
ここで図５を参照すると、図４に示すような分岐予測ユニット１４の一実施例によって用いられる例示的な予測ブロック１１０が示される。予測ブロック１１０は分岐セレクタ１１２、第１の分岐予測（ＰＰ１）１１４、および第２の分岐予測（ＰＰ２）１１６の組を含む。分岐セレクタ１１２の組は予測ブロック１１０に対応する連続する命令バイトのグループの各バイトのための分岐セレクタを含む。
第１の分岐予測１１４が図５の展開図に示される。第２の分岐予測１１６も同様に構成される。第１の分岐予測１１４は目標アドレスを含むキャッシュラインのためのインデックス１１８とキャッシュラインのためのウェイ選択１２０とを含む。一実施例に従うと、インデックス１１８は目標アドレスのオフセット部分とインデックスとを含む。インデックス１１８はウェイ選択１２０によって示されるウェイのタグと連結されて分岐予測アドレスを形成する。また、予測カウンタ１２２が各分岐予測ごとにストアされる。予測カウンタは、対応の分岐命令が実行され、分岐されるごとにインクリメントされ、対応の分岐命令が実行され、非分岐とされるごとにデクリメントされる。予測カウンタの最上位ビットは分岐／非分岐の予測として用いられる。最上位ビットがセットされれば分岐命令は分岐を予測される。逆に、最上位ビットがクリアであれば分岐命令は非分岐を予測される。一実施例では、予測カウンタは２ビット飽和カウンタである。カウンタは二進数の「１１」でインクリメントされると飽和し、二進数の「０１」でデクリメントされると飽和する。別の実施例では、予測カウンタは強い（二進数１）または弱い（二進数０）分岐予測を示す単一ビットである。強い分岐予測が誤って予測されれば、これは弱い分岐予測となる。弱い分岐予測が誤って予測されれば、分岐は非分岐を予測され、分岐セレクタが更新される（すなわち、非分岐となる誤って予測された分岐の場合）。最後に、呼出ビット１２４が第１の分岐予測１１４に含まれる。セットされると、呼出ビット１２４は対応の分岐命令がサブルーチン呼出命令であることを示す。呼出ビット１２４がセットされれば、現在のフェッチアドレスおよびウェイが上述のリターンスタック構造にストアされる。
次に図６を参照すると、例示的な分岐セレクタ符号化を例示する表１３０が示される。２進数符号化がリストにされ（初めに最上位ビット）、次に分岐セレクタが対応の値で符号化されるときに選択される分岐予測が示される。表１３０が示すように、分岐セレクタの最下位ビットは分岐予測マルチプレクサ７６および逐次／リターンマルチプレクサ７８のための選択制御として用いられ得る。最下位ビットがクリアであれば、第１の分岐予測が分岐予測マルチプレクサ７６によって選択され、逐次アドレスが逐次／リターンマルチプレクサ７８によって選択される。他方、第２の分岐予測は分岐予測マルチプレクサ７６によって選択され、リターンアドレスは最下位ビットがクリアであれば逐次／リターンマルチプレクサによって選択される。更に、分岐セレクタの最上位ビットが最終予測マルチプレクサ８０のための選択制御として用いられ得る。最上位ビットがセットされれば、分岐予測マルチプレクサ７６の出力が選択される。最上位ビットがクリアであれば、逐次／リターンマルチプレクサ７８の出力が選択される。
ここで図７を参照すると、誤って予測された分岐命令に応答して連続する命令バイトのグループの分岐セレクタを更新するために用いられるステップを表わすフローチャートが示される。プリデコードの間に発見される分岐命令による更新も同様に行なわれ得る。予測誤りは、予測情報がそのために分岐予測ストレージ７０にストアされていない分岐命令が検出された結果であるかもしれず、対応の予測カウンタに非分岐を示させる正くない分岐／非分岐予測の結果であるかもしれない。
予測誤りが検出されると、分岐予測ユニット１４は「エンドポインタ」、すなわち、連続する命令バイトの対応のグループ内の誤って予測された分岐命令のエンドバイトのオフセットを用いる。また、予測ブロックが予測誤りに応じて受取られる分岐タグを用いて更新のために選択される。分岐予測ユニット１４はエンドポインタを更新マスクへと復号化する（ステップ１４０）。更新マスクは連続する命令バイトのグループ内の各バイトのための２進数の桁を含む。キャッシュライン内の分岐命令のエンドバイトに先行し、かつそれを含むバイトに対応する桁がセットされ、残りの桁がクリアのままである。
分岐予測ユニット１４は現在の分岐セレクタを識別する。誤って予測された分岐／非分岐予測では、現在の予測セレクタは誤って予測された分岐命令に対応する分岐セレクタである。検出されていない分岐による予測誤りでは、現在の分岐セレクタは検出されていない分岐命令のエンドバイトに対応する分岐セレクタである。現在の分岐セレクタは分岐マスクを生じるために分岐セレクタの各々とで排他的否定論理和を取られる（ステップ１４２）。分岐マスクは、現在の分岐セレクタと一致する分岐セレクタを有した各バイトに対してセットされる２進数の桁と、現在の分岐セレクタと一致しない分岐セレクタを有した各バイトに対してクリアである２進数の桁とを含む。
ステップ１４０で生じる更新マスクとステップ１４２で生じる分岐マスクとは後に論理積を取られ、最終的な更新マスクを作る（ステップ１４４）。最終的な更新マスクは新しい分岐セレクタに更新されるべき連続する命令バイトのグループの各バイトのためにセットされる２進数の桁を含む。誤って予測された分岐の分岐では、新しい分岐セレクタは誤って予測された分岐の分岐命令のエンドバイトの後のバイトの分岐セレクタである。検出されていない分岐では、新しい分岐セレクタは論理ブロック８２を更新することによってこれまでに検出されていない分岐に割当てられる分岐予測ストレージを示す分岐セレクタである。
拡張されたマスクも発生される（ステップ１４６および１４８）。拡張マスクは、どの分岐セレクタが消去されるべきかを示し、これは、分岐セレクタに対応する分岐予測が新たに発見された分岐命令に再び割当てられているか、または分岐予測が今や非分岐を示すためである。拡張マスクは、現在の分岐セレクタの代わりに新しい分岐セレクタを用いることを除き、分岐マスクと同様の第２の分岐マスクを初めに作ることによって発生される（すなわち、マスクはキャッシュラインに対応する分岐セレクタを新しい分岐セレクタと排他的否定論理和を取ることによって生じる（ステップ１４６））。結果として生じるマスクは次に最終的な更新マスクの反転と論理積を取られて拡張マスクを作る（ステップ１４８）。セットされている拡張マスク内のビットに対応する分岐セレクタが更新されて、拡張マスク内のビットがそのためにセットされる最終バイトの直後のバイトの分岐セレクタを示す。このように、分岐セレクタによって前に示された分岐予測が消去され、キャッシュライン内の後続の分岐セレクタと置換えられる。ステップ１５０の間、分岐セレクタは最終更新マスクおよび拡張マスクに応じて更新される。
ここで図８を参照すると、図７のフローチャートに示すステップを用いた分岐セレクタの更新の例が示される。各バイト位置がリストにされ（参照番号１６０）、更新前の分岐セレクタの組が続く。分岐セレクタ１６２の初期の組では、サブルーチン命令がバイト位置１で終わり、同様に、第１の分岐命令が（分岐セレクタ番号３によって示すように）バイト位置８で終わり、第２の分岐命令が（分岐セレクタ番号２によって示すように）バイト位置１１で終わる。
図８の例では、これまでに検出されていない分岐命令が検出されてバイト位置６で終了する。第２の分岐予測が選択されてこれまでに検出されていない分岐命令のための分岐予測を表わす。これまでに検出されていない分岐命令のエンドポインタがバイト位置６であれば、更新マスクが参照番号１６４で示すように発生される。例はこれまでに検出されていない分岐命令による予測誤りの場合であり、バイト位置６の分岐セレクタが「３」であるので、現在の分岐セレクタは「３」である。現在の分岐セレクタと初期分岐セレクタ１６２との排他的否定論理和が参照番号１６６で示す分岐マスクを生む。更新マスクと分岐マスクとの後の論理積によって、参照番号１６８で示す最終的な更新マスクが生じる。最終更新マスク１６８で示すように、バイト位置２から６は新しい分岐セレクタに更新される
第２の分岐マスクは新しい分岐セレクタを初期分岐セレクタ１６２で排他的否定論理和と取ることによって生じる（参照番号１７０）。新しい分岐セレクタは「３」であるので、第２の分岐マスク１７０はこの例の分岐マスク１６６と等しい。分岐マスク１７０を最終更新マスク１６８の論理反転と論理積を取ると、参照番号１７２で示す拡張マスクが生じる。拡張マスク１７２が示すように、バイト位置７および８は第１の分岐予測を示すように更新されるべきであり、これは第２の分岐予測がバイト位置６で終わる分岐命令とバイト１１で終了する第１の分岐命令によって表わされる分岐命令とに割当てられているためである。分岐セレクタの更新された組が参照番号１７４に示される。参照番号１７４における分岐セレクタの更新された組は、これまでに検出されていない分岐命令に対応する分岐予測情報をストアするために、分岐セレクタ「３」に対応する分岐予測が選択されたことを反映している。
次に図９を参照して、図７のフローチャートに示されるステップを用いた分岐セレクタの更新の第２の例が示される。図８の例と同様に、各バイト位置が示され（参照番号１６０）、次に更新前の分岐セレクタの組が示される（参照番号１６２）。分岐セレクタ１６２の最初の組では、サブルーチンリターン命令はバイト位置１で終り、第１の分岐命令は（分岐セレクタ番号３で示される）バイト位置８で終り、第２の分岐命令は（分岐セレクタ番号２で示される）バイト位置１１で終る。
図９の例では、バイト位置６で終るまだ検出されていない分岐命令が再び検出される。しかしながら、（図８に示される第１の分岐命令とは反対に）まだ検出されていない分岐命令に関する分岐予測を表わすために第１の分岐予測が選択される。予測誤りは図８の場合と同じバイト位置であるため、図８の場合と同じ更新マスク、分岐マスクおよび最終更新マスク（参照番号１６４、１６６および１６８）が生成される。
新しい分岐セレクタと最初の分岐セレクタ１６２との排他的否定論理和をとることにより第２の分岐マスク（参照番号１８０）が生成される。新しい分岐セレクタはこの例では「２」であるため、第２の分岐マスク１８０はバイト位置９から１１を示す。分岐マスク１８０と最終更新マスク１６８の論理反転との論理積をとることにより、参照番号１８２で示される拡張マスクがもたらされる。拡張マスク１８２が示すように、バイト位置１１に後続する分岐予測（すなわち逐次分岐予測）を示すようバイト位置９から１１が更新されることとなる。これは、第１の分岐予測がバイト位置６で終る分岐命令に割当てられ、第２の分岐予測によって表わされる分岐命令がバイト８で終るからである。更新された分岐セレクタの組は参照番号１８４で示される。参照番号１８４で示される更新された分岐セレクタの組は、まだ検出されていない分岐命令に対応する分岐予測情報をストアするための、分岐セレクタ「２」に対応する分岐予測の選択を反映する。
次に図１０を参照して、図７のフローチャートに示されるステップを用いた分岐セレクタの更新の第３の例が示される。図８の例と同様に、各バイト位置が示され（参照番号１６０）、次いで更新前の分岐セレクタの組が示される（参照番号１６２）。最初の組の分岐セレクタ１６２では、サブルーチンリターン命令はバイト位置１で終り、第１の分岐命令は（分岐セレクタ番号３で示される）バイト位置８で終り、第２の分岐命令は（分岐セレクタ番号２で示される）バイト位置１１で終る。
図１０の例の場合、バイト位置８で終る分岐命令は分岐すると誤予測され、次いで第２の分岐予測を更新することにより、分岐カウンタが非分岐を示すようになる。分岐予測が非分岐であるため、分岐予測を示す分岐セレクタは後の分岐命令を示すよう更新される（または隣接する命令バイトのグループ内に後の分岐命令がない場合には逐次的であることを示すよう更新される）べきである。分岐予測が非分岐となる場合には、新たに検出された分岐命令がないため「新しい」分岐命令のエンドポインタは無効である。したがって更新マスクはすべて０として生成される（参照番号１９０）。現在の分岐セレクタは「３」であるため、分岐マスクは参照番号１９１で示されるように生成される。したがって最終更新マスク（参照番号１９２）はすべて０である。
新しい分岐セレクタと最初の分岐セレクタ１６２との排他的否定論理和をとることにより第２の分岐マスク（参照番号１９４）が生成される。この例では新しい分岐セレクタは「３」に設定されるため、「３」にコーディングされた分岐セレクタの各々は第２の分岐マスク１９４で示される。分岐マスク１８０と最終更新マスク１９２の論理反転との論理積をとることにより、参照番号１９６で示される拡張マスクがもたらされる。拡張マスク１９６が示すように、バイト位置２から８はバイト位置８に後続する分岐予測（すなわち第１の分岐予測）を示すよう更新されることとなる。これは第１の分岐予測がバイト位置１１で終る分岐命令に割当てられるからである。更新された分岐セレクタの組は参照番号１９８で示される。参照番号１９８で示される更新された分岐セレクタの組は、隣接した命令バイトのグループに対応する分岐セレクタの組から分岐セレクタ「３」を削除することを反映する。これは第１の分岐予測には分岐すると予測された分岐予測がストアされないからである。
図１０に示されるように、非分岐を予測が示すときに分岐セレクタを除去するための手順は分岐予測を再度割当てる手順と似ている。２つの手順の相違点は、分岐セレクタを除去するための更新マスクが常に０として生成され、現在の分岐セレクタは拡張マスクを生成するために「新しい」分岐セレクタとして与えられる点である。
上記の説明では（たとえばｘ８６の命令の組である）可変バイト長命令の組を採用する実施例に焦点を当てたが、分岐セレクタは固定バイト長命令の組に関する分岐予測機構にも採用され得ることに注目されたい。固定バイト長命令の組の実施例では各命令に関する分岐セレクタがストアされ得る。なぜなら、命令は隣接した命令バイトのキャッシュラインまたはグループ内に一定のオフセットでストアされるからである。
さらに、上記の実施例では隣接した命令バイトのグループに対して多数の分岐予測が示されたが、各グループに対して１つしか分岐予測がストアされない場合でも分岐セレクタを採用してもよいことに注目されたい。この場合の分岐セレクタは単一ビットであろう。ビットが設定されると分岐予測が選択される。ビットがクリアされると逐次予測が選択される。
上述のとおり、まだ検出されていない分岐命令は対応する予測ブロック内の分岐予測のうちいずれによっても表わされない分岐命令であることに注目されたい。まだ検出されていない分岐命令はまだ検出されていなくてもよい（すなわち、対応するキャッシュラインが命令キャッシュ１６にストアされているため実行されない）。これに代えて、まだ検出されていない分岐命令に対応する分岐予測は、隣接した命令バイトを有する対応するグループ内の異なった分岐命令に再度割当てられていてもよい。
次に図１１を参照して、マイクロプロセッサ１０を含むコンピュータシステム２００が示される。コンピュータシステム２００は、バスブリッジ（bus bridge）２０２と、主メモリ２０４と、複数の入力／出力（Ｉ／Ｏ）デバイス２０６Ａ−２０６Ｎとをさらに含む。複数のＩ／Ｏデバイス２０６Ａ−２０６ＮをＩ／Ｏデバイス２０６と総称する。マイクロプロセッサ１０、バスブリッジ２０２および主メモリ２０４はシステムバス２０８に結合される。Ｉ／Ｏデバイス２０６はバスブリッジ２０２との通信のためにＩ／Ｏバス２１０に結合される。
バスブリッジ２０２はＩ／Ｏデバイス２０６とシステムバス２０８に結合されたデバイスとの間の通信を補助するために設けられる。典型的にＩ／Ｏデバイス２０６にはマイクロプロセッサ１０およびシステムバス２０８に結合された他のデバイスよりも長いバスクロックサイクルが要求される。したがって、バスブリッジ２０２はシステムバス２０８と入力／出力バス２１０との間にバッファをもたらす。さらに、バスブリッジ２０２は１つのバスプロトコルから別のものにトランザクションを変換する。１つの実施例では、入力／出力バス２１０はエンハンスト産業規格アーキテクチャ（ＥＩＳＡ）バスであり、バスブリッジ２０２はシステムバスプロトコルからＥＩＳＡバスプロトコルへの変換を行なう。別の実施例では、入力／出力バス２１０は周辺コンポーネント相互接続（ＰＣＩ）バスであり、バスブリッジ２０２はシステムバスプロトコルからＰＣＩバスプロトコルへの変換を行なう。多くの種類のシステムバスプロトコルが存在することに注目されたい。マイクロプロセッサ１０は適切ないかなるシステムバスプロトコルを採用してもよい。
Ｉ／Ｏデバイス２０６はコンピュータシステム２００とコンピュータシステムの外部にある他のデバイスとの間にインターフェイスを提供する。例示的なＩ／Ｏデバイスは、モデム、直列または平行ポートおよび音声カードなどを含む。Ｉ／Ｏデバイス２０６は周辺デバイスとも呼ばれ得る。主メモリ２０４はマイクロプロセッサ１０によって用いられるデータおよび命令をストアする。１つの実施例において、主メモリ２０４は少なくとも１つのダイナミックランダムアクセスメモリ（ＤＲＡＭ）およびＤＲＡＭメモリコントローラを含む。
図１１に示されるコンピュータシステム２００には１つのバスブリッジ２０２が含まれるが、コンピュータシステム２００の他の実施例では、類似していないかまたは類似している多数のＩ／Ｏバスプロトコルに変換するための多数のバスブリッジ２０２を含んでもよいことに注目されたい。さらに、高速メモリストレージにマイクロプロセッサ１０が用いる命令およびデータをストアすることによりコンピュータシステム２００の性能を高めるためのキャッシュメモリを含んでもよい。キャッシュメモリはマイクロプロセッサ１０とシステムバス２０８との間に挿入されるか、または「ルックアサイド（lookaside）」構成でシステムバス２０８上に置かれてもよい。
上記のさまざまなコンポーネントはマルチプレクサとして説明されたが、直列または並列の多数のマルチプレクサを採用して、示されるマルチプレクサによって表わされる選択を行なうようにしてもよい。
さらに、この説明はさまざまな信号のアサーションに関連し得ることに注目されたい。ここで用いられるように、特定の条件を示す値を伝える場合には信号は「アサート（assert）」される。これとは逆に、特定の条件の欠如を示す値を伝える場合には信号は「デアサート（deassert）」される。信号は論理０の値を伝える場合はアサートされていると定義され、論理１の値を伝える場合にはこの逆である。さらに、上記の説明ではさまざまな値は破棄されるものとして説明された。値は多くの態様において破棄され得るが、一般には、値を受ける論理回路によって無視されるように値を変形することにかかわる。たとえば、値がビットを含む場合、値を破棄するよう値の論理状態が反転され得る。値がｎビットの値である場合、ｎビットのエンコーディングのうちの１つは、値が無効であることを示し得る。無効なエンコーディングに値を設定することにより値は破棄される。さらに、ｎビットの値は、設定されたときにｎビットの値が有効であることを示す有効ビットを含み得る。有効ビットを再度設定することは値を破棄することを含み得る。値を破棄する他の方法を用いてもよい。
下記の表１は、ｘ８６の命令の組を採用するマイクロプロセッサ１０の１つの実施例に関する高速経路、ダブルディスパッチおよびＭＲＯＭ命令を示す。
0003803723.tif 000002
0003803723.tif 000003
0003803723.tif 000004
注：ＳＩＢバイトを含む命令はダブルディスパッチ命令とも考えられる。
上記のことに従うスーパースカラマイクロプロセッサは、プフラム他（Pflum et al.）による米国特許第５３８１４６２号の「条件付ラッチ機構およびそれを採用するパイプラインマイクロプロセッサ（“Conditional Latching Mechanism and Pipelined Microprocessor Employing the Same”）」と題された、同一人に譲渡された同時係属中の特許出願に開示されているようなラッチ構造をさらに採用してもよいことに注目されたい。
さらに、アレイ回路に関する局面はトラン（Tran）による米国特許第５６１９４６４号の「アレイアクセスを可能にするためのセルフタイムクロックジェネレータを採用する高性能ラムアレイ回路（“High Performance Ram Array Circuit Employing Self-Time Clock Generator for Enabling Array Access”）」と題された、同一人に譲渡された同時係属中の特許出願に見い出されることに注目されたい。
さらに、スーパースカラマイクロプロセッサに関する他の局面は下記の同一人に譲渡された同時係属中の特許出願に見い出されることに注目されたい。これらの特許出願とは、ウイット（Witt）による米国特許第５６２３６１９号の「線形にアドレス指定可能なマイクロプロセッサキャッシュ（“Linearly Addressable Microprocessor Cache”）」、ウィット他（Witt et al.）による米国特許第５８１９０５７号の「高性能な命令整列ユニットを含むスーパースカラマイクロプロセッサ（“Superscalar Microprocessor Including a High Performance Instruction Alignment Unit”）」、ロバート他（Roberts et al.）による米国特許第５８４５５２３号の「ウェイ予測構造（“A Way Prediction Structure”）」、ウイット他（Witt et al.）によって１９９５年８月３１日に出願された連続番号第０８／５２１，６２７号である「単一クロックサイクルでストアアクセスを行なうことが可能がデータキャッシュ（“A Data Cache Capable of Performing Store Accesses in a Single Clock Cycle”）」、ナラヤン（Narayan）によって１９９５年６月７日に出願された連続番号第０８／４７５，４００号である「並列でありかつスケーリング可能な命令スキャンユニット（“A Parallel and Scalable Instruction Scanning Unit”）」、およびトラン他（Tran et al.）による米国特許第５８２２５５９号の「可変バイト長命令を複数の発行位置に整列させるための装置および方法（“An Apparatus and Method for Aligning Variable-Byte Length Instructions to a Plurality of Issue Positions”）」である。
上記の開示によると、分岐セレクタを用いる分岐予測機構が説明された。分岐予測機構は、所与のフェッチアドレスで示されるバイトに対応する分岐セレクタを選択し、その分岐セレクタで示される分岐予測を選択することにより、所与のフェッチアドレスに対応する分岐予測を迅速につきとめる。この分岐予測機構は先行する分岐予測機構よりも高い周波数で動作可能であろう。
上記の開示が十分に認められると当業者には多くの変更および変形が明らかとなるであろう。以下の請求の範囲はこのような変更および変形のすべてを包含するものと解されることが意図される。
【図１】
0003803723.tif 000005
【図２】
0003803723.tif 000006
【図３】
0003803723.tif 000007
【図４】
0003803723.tif 000008
【図５】
0003803723.tif 000009
【図６】
0003803723.tif 000010
【図７】
0003803723.tif 000011
【図８】
0003803723.tif 000012
【図９】
0003803723.tif 000013
【図１０】
0003803723.tif 000014
【図１１】
0003803723.tif 000015