(57)【特許請求の範囲】
【請求項１】
レジスタリネーミングを行なうための装置であって、
レジスタリネームを命令に割当てる前に前記命令をスキャンして、アーキテクチャ上の第１のレジスタをソースレジスタとしアーキテクチャ上の第２のレジスタをデスティネーションレジスタとする転送命令を検出するように構成されたルックアヘッドユニットと、
前記ルックアヘッドユニットに結合されたリネームタグユニットとを含み、前記リネームタグユニットは、前記アーキテクチャ上の第１のレジスタに対応する第１のリネームタグおよび前記アーキテクチャ上の第２のレジスタに対応する第２のリネームタグを含む複数のリネームタグを格納するように構成され、前記第１のリネームタグは前記アーキテクチャ上の第１のレジスタに割当てられた第１のリネームレジスタを識別し、前記第２のリネームタグは前記アーキテクチャ上の第２のレジスタに割当てられた第２のリネームレジスタを識別し、
前記ルックアヘッドユニットは、前記転送を検出すると前記リネームタグユニットに信号で知らせるように構成され、前記リネームタグユニットは、前記信号に応答して前記第１のリネームレジスタを前記アーキテクチャ上の第２のレジスタに割当てるように構成され、前記リネームタグユニットはさらに、前記転送命令に応答して第３のリネームレジスタを割当てるように構成され、第３のリネームタグは前記第３のリネームレジスタを識別し、前記第３のリネームレジスタは前記転送命令の実行時に前記転送命令によりデスティネーションレジスタとして用いられる、レジスタリネーミングを行なうための装置。
【請求項２】
前記リネームタグユニットはさらに、前記第３のリネームレジスタを前記アーキテクチャ上の第１のレジスタに割当てるように構成される、請求項１に記載の装置。
【請求項３】
前記リネームタグユニットは、前記転送命令のためのマッピングオペランドに続いて、前記第１のリネームレジスタを前記アーキテクチャ上の第２のレジスタに割当て前記第３のリネームレジスタを前記アーキテクチャ上の第１のレジスタに割当てるように構成され、これにより、前記転送命令は前記第１のリネームタグをソースオペランド識別子として受け前記第３のリネームタグをデスティネーション識別子として受ける、請求項２に記載の装置。
【請求項４】
前記第１のリネームレジスタ、前記第２のリネームレジスタおよび前記第３のリネームレジスタを含むリネームレジスタファイルをさらに含む、請求項１に記載の装置。
【請求項５】
前記ルックアヘッドユニットは、前記第１のリネームレジスタ内の値がペンディングであれば前記転送命令に続く命令をストールするように構成される、請求項４に記載の装置。
【請求項６】
前記アーキテクチャ上の第２のレジスタに対応するルックアヘッド記憶部をさらに含み、前記装置は、前記第１のリネームレジスタが有効であれば前記ルックアヘッド記憶部を前記第１のリネームレジスタからの値で更新するように構成される、請求項４に記載の装置。
【請求項７】
前記装置は、前記値を用いて前記転送命令に続く前記命令のためのルックアヘッド値を発生するように構成される、請求項６に記載の装置。
【請求項８】
レジスタリネーミングを行なうための方法であって、
アーキテクチャ上の第１のレジスタをデスティネーションとする第１の命令のディスパッチに応答して第１のリネームレジスタを前記アーキテクチャ上の第１のレジスタに割当てるステップと、
アーキテクチャ上の第２のレジスタをデスティネーションとする第２の命令のディスパッチに応答して第２のリネームレジスタを前記アーキテクチャ上の第２のレジスタに割当てるステップと
前記アーキテクチャ上の第１のレジスタから前記アーキテクチャ上の第２のレジスタに値を転送するよう定められた転送命令を検出するステップと、
前記検出に応答して前記第１のリネームレジスタを前記アーキテクチャ上の第２のレジスタに割当てるステップと、
前記検出に応答して前記転送命令のデスティネーションとして第３のリネームレジスタを割当てるステップとを含む、レジスタリネーミングを行なうための方法。
【請求項９】
前記検出に応答して前記第３のリネームレジスタを前記アーキテクチャ上の第１のレジスタに割当てるステップをさらに含む、請求項８に記載の方法。
【請求項１０】
前記転送命令を実行のためにスケジューリングするステップをさらに含む、請求項９に記載の方法。
【請求項１１】
前記スケジューリングに応答して前記第１のリネームレジスタを読出すステップをさらに含む、請求項１０に記載の方法。
【請求項１２】
前記転送命令を実行し、前記実行に応答して前記第３のリネームレジスタを更新するステップをさらに含む、請求項１１に記載の方法。
【請求項１３】
前記第１のリネームレジスタの前記アーキテクチャ上の第２のレジスタへの割当に応答して、前記第１のリネームレジスタを読出し前記アーキテクチャ上の第２のレジスタに対応する値を与えるステップをさらに含む、請求項８に記載の方法。
【請求項１４】
前記第１の命令の実行に応答して前記第１のリネームレジスタが更新されていない場合、前記転送命令に続く命令をストールするステップをさらに含む、請求項１３に記載の方法。
【請求項１５】
プロセッサであって、
前記プロセッサがフェッチした命令を受けるように結合されたリネーム／スケジュールユニットを含み、前記リネーム／スケジュールユニットは、前記命令の受取りに応答してレジスタリネーミングを行ない前記命令を実行のためにスケジュールするように構成され、前記プロセッサはさらに、
前記リネーム／スケジュールユニットに結合され複数のリネームレジスタを含むリネームレジスタファイルを含み、
前記リネーム／スケジュールユニットは、アーキテクチャ上のレジスタ各々と前記複数のリネームレジスタのうち少なくとも１つとの間のマッピングを保持するように構成され、前記リネーム／スケジュールユニットは、アーキテクチャ上の第１のレジスタをソースオペランドとしアーキテクチャ上の第２のレジスタをデスティネーションとする転送命令を検出すると、前記アーキテクチャ上の第１のレジスタに割当てられた前記複数のリネームレジスタのうち１つを前記アーキテクチャ上の第２のレジスタに再割当するように構成され、前記リネーム／スケジュールユニットはさらに、前記複数のリネームレジスタのうち別の１つを前記転送命令の前記デスティネーションに割当てるように構成される、プロセッサ。
【請求項１６】
前記リネーム／スケジュールユニットはさらに、前記マッピングを更新して前記複数のリネームレジスタのうちの別の１つを前記アーキテクチャ上の第１のレジスタ割当てるように構成される、請求項１５に記載のプロセッサ。
【請求項１７】
前記リネーム／スケジュールユニットはさらに、前記転送命令を実行のためにスケジュールするように構成される、請求項１５に記載のプロセッサ。
【請求項１８】
前記リネームレジスタファイルは、前記リネーム／スケジュールユニットによる前記転送命令のスケジュールに応答して前記複数のリネームレジスタのうち前記１つ内の値を与えるように構成される、請求項１７に記載のプロセッサ。
【請求項１９】
前記リネームレジスタファイルに結合された実行ユニットをさらに含み、前記実行ユニットは前記転送命令を実行するように構成され、前記実行ユニットは前記転送命令の実行時に前記値を前記リネームレジスタファイルに与えるように構成され、前記実行ユニットはさらに、前記複数のリネームレジスタのうち前記別の１つを前記デスティネーションとして識別するように構成され、これにより、前記複数のリネームレジスタのうち前記別の１つは前記値で更新される、請求項１８に記載のプロセッサ。
【発明の詳細な説明】
【０００１】
【発明の分野】
本発明は、プロセッサの分野に関し、より特定的には、プロセッサ内でのレジスタリネーミングメカニズムに関する。
【０００２】
【関連技術の説明】
スーパースカラプロセッサは、１クロックサイクル当り複数の命令をディスパッチして実行し、設計に合った、可能な最短クロックサイクル時間で動作することによって、高性能を得ようとするものである。所与のプロセッサにおいて１クロックサイクル当り複数の命令のディスパッチおよび／または実行が可能である限りの範囲において、高性能が実現できる。
【０００３】
並行して実行し得る命令の数を増やすために、プロセッサでよく用いられる技術のひとつは、投機的実行である。（たとえば、命令をプログラムが示す実行順序に対しアウトオブオーダで実行する、または、予測された分岐に続く命令を実行する。）特定の命令のすぐ後に続く命令は、その特定の命令に依存することが多い。（すなわち特定の命令の結果をそのすぐ後に続く命令が用いる。）したがって、こういった直後の命令は特定の命令と並行して実行できない可能性がある。しかしながら、プログラム順において特定の命令のさらに後に続く命令は、その特定の命令に対する依存性がないかもしれず、そうであれば特定の命令と並行して実行し得る。さらに、予測誤りのあった分岐に続く命令の投機的実行は、分岐が正しく予測された場合、並行して実行する命令の数を増大し得る。
【０００４】
アウトオブオーダの実行は、「逆依存性」と呼ばれることの多い別のタイプの従属性を招く。一般的に、逆依存性は、特定の命令に続く命令が、その特定の命令がアクセスする（読出す）または更新する（書込む）レジスタを更新する場合に生じる。特定の命令は、プログラムの適切動作のために、後続の命令がレジスタ書込を行なう前に、レジスタの読出または書込を行なわなければならない。命令は一般に、メモリまたはレジスタに格納される１以上のソースオペランド（命令が演算する入力値）を有する。命令はまた、これもまたメモリまたはレジスタに格納される１以上のデスティネーション（命令の実行結果を格納するためのロケーション）を有する。
【０００５】
命令のソースおよびデスティネーションレジスタ間の逆依存性を解消してアウトオブオーダの実行をより多くできるようにする技術は、レジスタリネーミングである。レジスタリネーミングでは、プロセッサが一群の予備の「リネームレジスタ」を実現する。リネームレジスタの予備の数は、プロセッサが用いる命令セットアーキテクチャが定めるレジスタ（「アーキテクチャ上のレジスタ」）より多い。特定の命令のためのデスティネーションレジスタ（すなわち命令の実行結果が書込まれるアーキテクチャ上のレジスタ）は、リネームレジスタのうちの１つをアーキテクチャ上のレジスタに割当てることにより「リネームされる」。この特定の命令の実行前のアーキテクチャ上のレジスタの値は、以前にアーキテクチャ上のレジスタに割当てられたリネームレジスタに格納されたままである。以前の命令がアーキテクチャ上のレジスタを読出す場合、以前に割当てられたリネームレジスタが読出される。以前の命令がアーキテクチャ上のレジスタに書込む場合、以前に割当てられたリネームレジスタに書込まれる。このように、リネームレジスタはいかなる順でも更新できる。
【０００６】
レジスタリネーミングでは、予測された分岐命令に続く命令実行のために、投機的なレジスタ更新も可能である。以前のリネームは、分岐命令が解決するまで維持される。分岐命令が誤って予測された場合、以前のリネームを用いて、誤って予測された分岐命令までプロセッサの状態を回復できる。
【０００７】
レジスタリネーミングは逆依存性を解消するのに役立つが、真の依存性（特定命令の結果を後続命令が用いる）は、レジスタリネーミングを用いても解消できない。コードシーケンスにおいて、特定のアーキテクチャ上のレジスタを、デスティネーションレジスタとして繰返し用い、続いてソースレジスタとして用いる場合、レジスタリネーミングは、命令を並行して実行するのにあまり役に立たない。たとえば、ｘ８６命令セットアーキテクチャ（ＩＡ−３２またはＡＰＸとも呼ばれる）は、種々の命令のソースおよびデスティネーション双方として用いることの多いスタックポインタレジスタ（ＥＳＰ）を定めている。このスタックポインタは、メインメモリ内に保持されるスタックのトップを定め、その中に命令が演算する多数のオペランドが格納される。ｘ８６命令セットアーキテクチャに設けられるレジスタの数は比較的少ないため、スタックの参照およびスタックの操作は典型的にはかなり頻繁に行なわれる。したがって、スタックポインタレジスタは、命令のソースレジスタでもデスティネーションレジスタでもあることが多い。
【０００８】
加えて、ｘ８６命令セット内のアーキテクチャ上の第２のレジスタは、ベースポインタ（ＥＢＰ）レジスタである。ベースポインタレジスタは、特定のプログラムルーチンが用いる種々のオペランドのためのベースアドレスである、スタック内のメモリロケーションを定めるのに用いることが多い。言い換えれば、このルーチンが用いるオペランドは、ベースポインタが識別するメモリロケーションとスタックポインタが識別するメモリロケーションとの間のメモリロケーションに格納される。したがって、プログラム内でベースポインタおよびスタックポインタレジスタ間の転送が（たとえばプログラム内の種々のサブルーチンの入口および出口で）頻繁に起こる。
【０００９】
それ故に、レジスタリネーミングを用いるスーパースカラプロセッサにおいて並列性を高めるためのさらに効果的な方法が望まれる。
【００１０】
本発明の概要に先立ち、２つの背景先行技術文献を以下に示す。
ＥＰ−Ａ−０  ５１８  ４６９に記載のシステムでは、転送命令を、物理および論理レジスタ間を対応付けるメモリテーブル内のレジスタマップを変更することにより、実際にレジスタ間でデータを転送せずに、実行する。データ処理装置は、物理レジスタおよび物理レジスタを論理レジスタと可変に対応付けるためのデバイスを含む。物理レジスタおよびメモリアドレス間の対応付けのマップを格納するための別のテーブルが設けられる。命令を、そのレジスタ利用および依存性について分析し、レジスタからレジスタへの転送を含む命令を、物理レジスタおよび論理レジスタ間の対応関係を変更することによって実行する。転送の場合、デスティネーションレジスタを、ソースレジスタ識別子と同じ物理レジスタ上にマッピングする。
ＥＰ−Ａ−０  ８５１  ３４３に記載の浮動小数点命令のためのプロセッサは、スタックレジスタファイルおよび仮想レジスタから物理レジスタへのマッピングのための参照テーブルを備える。２つの浮動小数点レジスタの内容のスワッピングのための浮動小数点交換命令が提案されている。このシステムは、命令ユニットから命令を受けるためのデコードユニットを含む。デコードユニットは、命令をデコードし、交換を含む命令のタイプを決定する。この命令を、レジスタの内容を転送するのではなく、論理および物理レジスタ間の対応関係を変更することにより実行する。論理ユニットは、参照テーブルおよびデコードユニットに結合される。論理ユニットは、デコードユニットから受けた各交換命令について参照テーブルを更新する。物理レジスタは、各交換命令に対し同じ内容を保持する。スタックポインタは、仮想レジスタの１つを、スタックである、物理レジスタのトップとして示す。参照テーブルは、仮想レジスタを物理レジスタにマッピングする。制御ユニットは、論理ユニットから更新後のテーブルを受け、この更新後のテーブルで参照テーブルを更新する。
【発明の概要】
本発明の第１の局面に従い、請求項１に定められたレジスタリネーミングを行なうための装置が提供される。定められたこの装置は、
命令を、レジスタリネームをこの命令に割当てる前にスキャンして、アーキテクチャ上の第１のレジスタをソースレジスタとしアーキテクチャ上の第２のレジスタをデスティネーションレジスタとする転送命令を検出するように構成されたルックアヘッドユニットを含み、アーキテクチャ上のレジスタは命令セットアーキテクチャにより定められ、上記装置はさらに、
ルックアヘッドユニットに結合されたリネームタグユニットを含み、リネームうタグユニットは、アーキテクチャ上の第１のレジスタに対応する第１のリネームタグおよびアーキテクチャ上の第２のレジスタに対応する第２のリネームタグを含む複数のリネームタグを格納するように構成され、第１のリネームタグはアーキテクチャ上の第１のレジスタに割当てられた第１のリネームレジスタを識別し、第２のリネームタグはアーキテクチャ上の第２のレジスタに割当てられた第２のリネームレジスタを識別し、リネームレジスタは上記装置により実現され、
ルックアヘッドユニットは、上記転送を検出するとリネームタグユニットに信号で知らせるように構成され、リネームタグユニットは、この信号に応答して第１のリネームレジスタをアーキテクチャ上の第２のレジスタに割当てるように構成され、リネームタグユニットはさらに、転送命令に応答して第３のリネームレジスタを割当てるように構成され、第３のリネームタグは第３のリネームレジスタを識別し、転送命令は、転送命令の実行時に第３のリネームレジスタをデスティネーションレジスタとして用いる。
したがって、先に概要を示した問題は主として、転送動作を加速するための本発明の装置によって解決する。この装置は、転送命令をこの転送命令の実行前に（たとえば転送動作がプロセッサ内でのディスパッチのために選択されたときに）検出するルックアヘッドユニットを含む。ルックアヘッドユニットは、転送命令を検出すると、レジスタリネームユニットに信号で知らせ、レジスタリネームユニットは、ソースレジスタと関連するリネームレジスタをデスティネーションレジスタに再割当する。この再割当は、ソースレジスタに割当てられたリネームレジスタを識別するリネームタグをデスティネーションレジスタに再割当することを含む。デスティネーションレジスタが後続命令のソースとして頻繁に用いられるレジスタでありソースリネームレジスタが転送検出時に既に更新されているのであれば、並列性は、ソースレジスタのリネームレジスタをデスティネーションレジスタに再割当することによって高まる。再割当が行なわれると、ソースリネームレジスタが再割当の前に有効であったならば、頻繁に用いられるレジスタは有効値を有する。したがって、後続の依存命令は、頻繁に用いられるレジスタからより迅速に値を受けるであろう（すなわち転送動作の実行前に）。並列性を高めることができるため、この装置を用いるプロセッサの性能は向上するであろう。
【００１１】
ある特定の実施例において、ルックアヘッドユニットは、ベースポインタレジスタからスタックポインタレジスタへの（およびこの逆の）転送の加速を試みる。スタックポインタレジスタはソースオペランド（たとえばアドレスオペランド）として用いられることが多い、というのも、多くの命令がスタックトップのオペランドを操作するからである。加えて、ベースポインタレジスタは、コードシーケンス内で一定に保たれてスタック内のアドレスのためのソースとして用いられることが多い。したがって、ベースポインタレジスタに関連するリネームレジスタは、ベースポインタからスタックポインタへの転送の検出時に有効であることが多い。故に、スタックポインタレジスタのためのルックアヘッド値は、ベースポインタリネームレジスタをスタックポインタに再割当することにより、ベースポインタからスタックポインタへの転送命令の実行前に得られる。
【００１２】
さらに、転送以外のスタックポインタレジスタの操作の多くは、スタックポインタレジスタに格納された値の一定のインクリメントまたはデクリメントである。したがって、ルックアヘッドユニットのある実施例は、以前にディスパッチされた命令のインクリメントおよびデクリメントの累積効果を保持することにより、スタックポインタレジスタに対するルックアヘッド値を発生する。特定命令に先立つインクリメントおよびデクリメントの累積効果を、以前に発生したスタックポインタレジスタの値に加算し、その特定命令に対するルックアヘッド値を発生する。こうした実施例については、上記のようなリネームレジスタの再割当により、スタックポインタレジスタに対する有効値を迅速に得ることができ、したがって、転送命令に続く命令のためのルックアヘッドスタックポインタ値の発生を転送命令の実行前に続行できる。
【００１３】
転送の検出時にソースレジスタのリネームレジスタをデスティネーションレジスタに割当てることに加え、このレジスタリネームユニットの実施例は、転送命令のために選択されたデスティネーションリネームレジスタを転送命令のソースレジスタに割当てる（すなわちソースおよびデスティネーションのためのリネームタグが「スワップされる」）。転送命令の実行時に、ソースリネームレジスタは、そのソースレジスタに以前に割当てられていたリネームレジスタに格納された値で更新される。したがって、転送命令の前にソースレジスタはそこに格納された値に復元され、そのソースレジスタに依存する命令（もしあれば）がその値を受ける。
【００１４】
本発明の第２の局面に従い、請求項７に定められたレジスタリネーミングを行なうための方法が提供される。
定められたこの方法は、
アーキテクチャ上の第１のレジスタをデスティネーションとする第１の命令のディスパッチに応答して第１のリネームレジスタをアーキテクチャ上の第１のレジスタに割当てることを含み、アーキテクチャ上のレジスタは命令セットアーキテクチャにより定められ、リネームレジスタはこの方法を行なうプロセッサにより実現され、この方法はさらに、
アーキテクチャ上の第２のレジスタをデスティネーションとする第２の命令のディスパッチに応答して第２のリネームレジスタをアーキテクチャ上の第２のレジスタに割当てることと、
アーキテクチャ上の第１のレジスタからアーキテクチャ上の第２のレジスタに値を転送するよう定められた転送命令を検出することと、
この検出に応答して第１のリネームレジスタをアーキテクチャ上の第２のレジスタに割当てることと、
この検出に応答して転送命令のデスティネーションとして第３のリネームレジスタを割当てることとを含み、転送命令は、転送命令の実行時に第３のリネームレジスタをデスティネーションレジスタとして用いる。
本発明の他の目的および利点は、以下の詳細な説明を読み添付の図面を参照すれば明らかになるであろう。
【００１７】
本発明の他の目的および利点は、以下の詳細な説明を読み添付の図面を参照すれば明らかになるであろう。
【００１９】
【詳細な説明】
図１を参照すると、スーパースカラプロセッサ１０の一実施例のブロック図が示されている。他の実施例が可能であり意図される。図１に示した実施例において、プロセッサ１０は、プリデコードユニット１２、Ｌ１  Ｉ−キャッシュ１４、Ｌ０  Ｉ−キャッシュ１６、フェッチ／スキャンユニット１８、命令キュー２０、アライメントユニット２２、リネーム／スケジュールユニット２４、第１のリネームレジスタファイル３０Ａ、第２のリネームレジスタファイル３０Ｂ、複数の機能ユニット３２Ａ、３２Ｂ、３２Ｃ、３２Ｄ、３２Ｅおよび３２Ｆ、複数のアドレス発生ユニット３４Ａ、３４Ｂ、３４Ｃおよび３４Ｄ、ロード／ストアユニット３６、Ｌ１  Ｄ−キャッシュ３８、ならびに外部インターフェイスユニット４２を含む。本明細書において特定の参照番号およびこれに続く種々の文字によって参照する構成要素はまとめてこの参照番号のみを用いて示す。たとえば、機能ユニット３２Ａ−３２Ｆはまとめて機能ユニット３２として示す。
【００２０】
図１の実施例において、外部インターフェイスユニット４２は、プリデコードユニット１２、ロード／ストアユニット３６、Ｌ２インターフェイス４４およびバスインターフェイス４６に結合される。プリデコードユニット１２はさらにＬ１  Ｉ−キャッシュ１４に結合される。Ｌ１  Ｉ−キャッシュ１４は、Ｌ０  Ｉ−キャッシュ１６およびフェッチ／スキャンユニット１８に結合される。フェッチ／スキャンユニット１８もＬ０  Ｉ−キャッシュ１６および命令キュー２０に結合される。命令キュー２０はアライメントユニット２２に結合されこれはさらにリネーム／スケジュールユニット２４に結合される。リネーム／スケジュールユニット２４はさらに、第１のリネームレジスタファイル３０Ａ、第２のリネームレジスタファイル３０Ｂおよびロード／ストアユニット３６に結合される。ロード／ストアユニット３６はＬ１  Ｄ−キャッシュ３８に結合される。第１のリネームレジスタファイル３０Ａは、機能ユニット３２Ａ−３２Ｃおよびアドレス発生ユニット３４Ａ−３４ＢならびにＬ１  Ｄ−キャッシュ３８に結合される。同様に、第２のリネームレジスタファイル３０Ｂは、機能ユニット３２Ｄ−３２Ｆおよびアドレス発生ユニット３４Ｃ−３４ＤならびにＬ１  Ｄ−キャッシュ３８に結合される。アドレス発生ユニット３４Ａ−３４ＤはＬ１  Ｄ−キャッシュ３８に結合される。
【００２１】
一般的に言えば、プロセッサ１０は、スタックポインタレジスタのためのルックアヘッド値を発生してスタックポインタレジスタから生まれる依存性を取除くことを試みる。多くの命令はスタックポインタレジスタを固定値だけまたは命令に含まれる値だけ（例として即値フィールド）インクリメントまたはデクリメントする。プロセッサ１０は、これら操作の累積効果の計算を、特定の命令に先立ち、その特定の命令に対応するスタックポインタレジスタのためのルックアヘッド値を計算するために行なう。好都合なことに、そのスタックポインタの値についてのみ他の命令に依存する命令は並列に実行される。プロセッサ１０は、スタックポインタレジスタへの更新を見分けられないことがある。プロセッサ１０は、このような更新を検出すると、見分けられない更新が完了するまで後続の命令をストールする。その後、ルックアヘッド値の発生が続けられる。
【００２２】
スタックポインタレジスタへの更新のひとつのタイプとして、レジスタのインクリメントでもデクリメントでもなく、多くのコードシーケンスでよくあるものに、ベースポインタからスタックポインタへの（およびその逆の）転送命令がある。一般に、転送は、ソースロケーションからデスティネーションロケーションへの値のコピーである。このコピーに続いて、ソースロケーションおよびデスティネーションロケーション双方は、当初ソースロケーションに格納されていた値を格納する。プロセッサ１０は、スタックポインタレジスタのためのルックアヘッド値発生を続行するまでに経過する時間を減じるために、上記の転送の性能を加速するように構成される。
【００２３】
より具体的には、ベースポインタレジスタからスタックポインタレジスタへの転送が検出されると、プロセッサ１０は、そのレジスタリネーミングメカニズムに信号で知らせ、ベースポインタおよびスタックポインタレジスタのためのリネームタグをスワップする（転送命令のデスティネーションのためのリネームレジスタの割当後）。（転送命令より前の）ベースポインタレジスタに対応するリネームレジスタが有効であれば（すなわちリネームレジスタがデスティネーションレジスタとして割当てられた命令が実行済み）、転送に続く更新されたスタックポインタレジスタの値はリネームレジスタから読出され、スタックポインタレジスタのためのルックアヘッド値発生は転送命令の実行前に続けられる。ベースポインタレジスタは一定に保たれ転送前にスタックアドレスを発生するためにベースとして用いられることが多いため、リネームレジスタ内の値は有効であることが多い。好都合なことに、性能は、転送命令の加速および転送命令に続くスタックポインタ依存命令の加速を通して向上する。
【００２４】
転送命令はまだプロセッサ１０内で実行される。しかしながら、転送命令のデスティネーションに割当てられたリネームレジスタは、当初の命令のソースレジスタに関連付けられている（タグがスワップされるため）。一般に、転送命令は、ソースリネームレジスタ（スワッピング後の当初の命令のデスティネーションアーキテクチャ上レジスタに関連する）を読出し、デスティネーションリネームレジスタ（スワッピング後の当初の命令のソースアーキテクチャ上レジスタに関連する）を更新することにより、完了する。転送命令の実行後、双方のリネームレジスタは同じ値を格納する。本明細書で述べる態様で転送命令を加速することは、ルックアヘッド値を発生しないプロセッサ１０の実施例においてさえ有利である。ベースポインタが既に有効であることが多いため、転送に続く命令の早期スケジュールが可能である。（タグスワッピングのため。これは転送の実行前にスタックポインタレジスタが有効であることを示す。）本明細書では便宜上リネームタグの「スワッピング」という用語を用いる。一般に、レジスタリネームメカニズムは、ソースリネームレジスタをデスティネーションリネームレジスタに再割当することにより転送命令を加速する。この実施例では、転送命令のデスティネーションのために割当てられたリネームレジスタは、ソースレジスタに割当てられ（すなわちタグがスワップされる）、ソースレジスタを更新する。他の実施例では他のやり方でソースレジスタに対する更新を行なう。（たとえば転送に続いて同じリネームをソースおよびデスティネーションレジスタ双方に割当ててもよい。）
プリデコードユニット１２は、外部インターフェイスユニット４２がフェッチした命令バイトを受け、この命令バイトを、Ｌ１  Ｉ−キャッシュ１４に格納する前にプリデコードする。プリデコードユニット１２が発生するプリデコード情報も、Ｌ１  Ｉ−キャッシュ１４に格納される。一般に、プリデコード情報は、命令の特徴の識別を助けるために与えられ、命令のフェッチおよび発行中は役立つが、フェッチおよび発行動作中迅速に発生することが難しい。本明細書で用いる「プリデコード」という用語は、命令をデコードし、命令キャッシュ（たとえばＬ１  Ｉ−キャッシュ１４および／またはＬ０  Ｉ−キャッシュ１６）においてデコードされている命令バイトともに後で格納されるプリデコード情報を発生することを指す。
【００２５】
ある実施例において、プロセッサ１０は、１命令バイトにつき２ビットのプリデコード情報を用いる。「スタートビット」と呼ばれる、これらビットのうち一方は、命令バイトが命令の最初のバイトかどうかを示す。命令バイトのグループがフェッチされたとき、対応するスタートビットの組は、命令バイトのグループ内の命令間の境界を識別する。したがって、複数命令を、対応するスタートビットをスキャンすることにより、命令バイトのグループから同時に選択できる。スタートビットは、各命令の最初のバイトを識別することによって命令の境界の場所を示すのに用いられるが、その代わりにエンドビットを用いて各命令の最終バイトを識別することによって命令の境界の場所を示すことができる。
【００２６】
この実施例で用いる、「制御転送」ビットと呼ばれる第２のプリデコードビットは、どの命令が分岐命令かを識別する。命令の先頭バイトに対応する制御転送ビットは、命令が分岐命令かどうかを示す。命令の後続バイトに対応する制御転送ビットは、小偏位フィールドの相対分岐命令を除き、ドントケアである。ある特定の実施例に従うと、小偏位フィールドは８ビットフィールドである。一般に、「小偏位フィールド」とは、分岐命令が発生するターゲットアドレスよりもビットの少ない偏位フィールドのことをいう。小偏位フィールドの相対分岐命令に対し、偏位バイトに対応する制御転送ビットを以下で述べるように用いる。
【００２７】
プリデコードユニット１２は、命令バイトに対応するプリデコード情報の発生に加え、この実施例においては相対分岐命令の偏位フィールドを再コード化して実際にターゲットアドレスを格納するように構成される。言い換えれば、プリデコードユニット１２は、相対分岐命令の偏位を、プロセッサ１０が用いる命令セットが定める相対分岐命令に対応するアドレスに加える。その結果得たターゲットアドレスは、偏位に置換わるものとして偏位フィールドにエンコードされ、更新された偏位フィールドは、元の偏位フィールドの代わりにＬ１  Ｉ−キャッシュ１４に格納される。ターゲットアドレス発生は相対ターゲットアドレスを予め計算することにより簡略化され、こうして分岐予測メカニズムはより効率的に働く。
【００２８】
ｘ８６命令セットを用いるプロセッサ１０のある実施例において、プリデコードユニット１２は、８ビットおよび３２ビットの偏位フィールドを再コード化するように構成される。３２ビット偏位フィールドは、ターゲットアドレスの全体を格納する。他方、８ビット偏位フィールドはエンコードされる。より具体的には、８ビット偏位フィールドおよび対応の制御転送プリデコードビットは、キャッシュラインオフセット部および相対キャッシュライン部に分割される。キャッシュラインオフセット部は、ターゲットアドレスのキャッシュラインオフセット部である。相対キャッシュライン部は、相対分岐命令を格納するキャッシュラインの上または下にあるキャッシュラインの数に関し、ターゲットアドレス（「ターゲットキャッシュライン」）が識別するキャッシュラインを定める。第１のキャッシュラインが第２のキャッシュラインよりも上にあるとは、第１のキャッシュライン内の各バイトが、第２のキャッシュライン内のバイトが格納されるアドレスよりも数値的に大きなアドレスに格納されている場合のことをいう。逆に、第１のキャッシュラインが第２のキャッシュラインよりも下にあるとは、第１のキャッシュライン内の各バイトが、第２のキャッシュライン内のバイトが格納されるアドレスよりも数値的に小さなアドレスに格納されている場合のことをいう。符号付き８ビット偏位は、分岐命令に対応するアドレスの＋／−１２８バイトであるアドレスを特定する。したがって、８ビット偏位を有する相対分岐命令が到達可能な上下キャッシュライン数は限定される。相対キャッシュライン部は、この限定された上下キャッシュラインの組をエンコードする。
【００２９】
以下の表１および２は、プロセッサ１０のある実施例に従う、１バイトに対応するプリデコード情報のエンコードの例を示す。
【００３０】
【表１】
0003977015.tif 000002
【００３１】
【表２】
0003977015.tif 000003
【００３２】
プリデコードユニット１２は、受けた命令バイトおよび対応するプリデコード情報を格納するためにＬ１  Ｉ−キャッシュ１４に送る。Ｌ１  Ｉ−キャッシュ１４は、命令バイトおよびプリデコード情報を格納するための高速キャッシュメモリである。Ｌ１  Ｉ−キャッシュ１４は、ダイレクトマップトおよびセットアソシアティブ構成を含む、何らかの適切な構成を用いる。ある特定の実施例では、Ｌ１  Ｉ−キャッシュ１４は、１２８ＫＢのツーウェイセットアソシアティブキャッシュであり６４バイトのキャッシュラインを用いる。Ｌ１  Ｉ−キャッシュ１４は、格納された命令バイトに対応するプリデコード情報のためのさらなる記憶部を含む。さらなる記憶部は、命令バイト記憶部と同様に編成される。本明細書で用いる「キャッシュライン」という用語は、特定のキャッシュ内の記憶部の割当の単位のことである。一般に、１キャッシュライン内のバイトをそのキャッシュは１単位として操作する（すなわち割当および割当解除を行なう）。
【００３３】
ある実施例において、Ｌ１  Ｉ−キャッシュ１４は、線形的にアドレス指定されかつ物理的にタグ付けされる。キャッシュが線形的にアドレス指定されるとは、キャッシュをインデックスするために用いるアドレスビットのうち少なくとも１つが、後に物理アドレスビットに変換される線形アドレスビットであることをいう。線形的にアドレス指定され／物理的にタグ付けされるキャッシュのタグは、インデックスに使用しないビットに加え変換された各ビットを含む。ｘ８６アーキテクチャで定められているように、命令は、セグメンテーション変換メカニズムを通して線形アドレスに変換されさらにページ変換メカニズムを通して物理アドレスに変換される論理アドレスを発生するように定められる。フラットアドレスモードを採用することがより一般的になりつつある。このフラットアドレスモードでは、論理アドレスおよび対応する線形アドレスは等しい。プロセッサ１０はフラットアドレスモードを備えるように構成できる。したがって、命令の実行により発生するフェッチアドレス、ターゲットアドレスなどは線形アドレスである。Ｌ１  Ｉ−キャッシュ１４においてヒットの検出があるかどうかを判断するために、フェッチ／スキャンユニット１８が提示する線形アドレスを、トランスレーションルックアサイドバッファ（ＴＬＢ）を用いて対応する物理アドレスに変換し、これをインデックスされたキャッシュラインからの物理タグと比較してヒット／ミスを判断する。フラットアドレスモードを用いないとき、プロセッサ１０は依然としてコードを実行するが、さらなるクロックサイクルを用いて論理アドレスから線形アドレスを発生することができる。
【００３４】
Ｌ０  Ｉ−キャッシュ１６も、命令バイトを格納するための高速キャッシュメモリである。Ｌ１  Ｉ−キャッシュ１４は大きいため、Ｌ１  Ｉ−キャッシュ１４のアクセスタイムも長い。ある特定の実施例において、Ｌ１  Ｉ−キャッシュ１４は２クロックサイクルのアクセスタイムを用いる。単一サイクルフェッチアクセスができるように、Ｌ０  Ｉ−キャッシュ１６を用いる。Ｌ０  Ｉ−キャッシュ１６は、Ｌ１  Ｉ−キャッシュ１４と比較して小さく、したがってより高速のアクセスタイムをサポートできる。ある特定の実施例では、Ｌ０  Ｉ−キャッシュ１６は、５１２バイトのフルアソシアティブキャッシュである。Ｌ１  Ｉ−キャッシュ１４と同様、Ｌ０  Ｉ−キャッシュ１６は、命令バイトのキャッシュラインおよび対応するプリデコード情報を格納するように構成される。（たとえば５１２バイトは８つの６４バイトキャッシュラインを格納し、対応するプリデコードデータはさらなる記憶部に格納される。）ある実施例において、Ｌ０  Ｉ−キャッシュ１６は、線形的にアドレス指定されかつ線形的にタグ付けされる。
【００３５】
フェッチ／スキャンユニット１８は、Ｌ０  Ｉ−キャッシュ１６のためのフェッチアドレスおよびＬ１  Ｉ−キャッシュ１４のためのプリフェッチアドレスを発生するように構成される。Ｌ０  Ｉ−キャッシュ１６からフェッチされた命令をフェッチ／スキャンユニット１８がスキャンすることにより、ディスパッチのための命令を識別し、かつ、分岐命令の場所を示し、場所が示された分岐命令に対応する分岐予測を形成する。命令スキャン情報および対応する命令バイトを、フェッチ／スキャンユニット１８が命令キュー２０に格納する。さらに、識別された分岐命令および分岐予測を用いて、Ｌ０  Ｉ−キャッシュ１６のための後続フェッチアドレスを発生する。
【００３６】
フェッチ／スキャンユニット１８は、プリフェッチアルゴリズムを用いて、Ｌ１  Ｉ−キャッシュ１４からＬ０  Ｉ−キャッシュ１６へのキャッシュラインのプリフェッチを、フェッチ／スキャンユニット１８がプロセッサ１０へのディスパッチのためにプリフェッチされたキャッシュラインをフェッチする前に、行なおうとする。いかなる適切なプリフェッチアルゴリズムを用いてもよい。ある実施例において、フェッチ／スキャンユニット１８は、特定のクロックサイクル中、（ｉ）分岐予測誤りが信号で知らされる、（ii）Ｌ０  Ｉ−キャッシュミスが検出される、または（iii）Ｌ０  Ｉ−キャッシュ１６でミスが発生すると想定されるターゲットアドレスが発生される、といった事態が発生しない限りは、Ｌ０  Ｉ−キャッシュ１６からフェッチしたキャッシュラインに対してシーケンシャルな次のキャッシュラインをプリフェッチするように構成される。ある特定の実施例において、３２ビット偏位を用いる相対分岐命令および間接ターゲットアドレス発生を用いる分岐命令は、Ｌ０  Ｉ−キャッシュ１６でミスを発生させると想定される。（ｉ）の場合、フェッチ／スキャンユニット１８は、訂正済のフェッチアドレスに対してシーケンシャルなキャッシュラインをプリフェッチする。（ii）および（iii）の場合、フェッチ／スキャンユニット１８は、対応するミスまたはターゲットアドレスをプリフェッチする。
【００３７】
フェッチ／スキャンユニット１８は、１クロックサイクル中に、より大きな命令の「ラン」をフェッチしようと、攻撃的な分岐予測メカニズムを用いる。本明細書で用いる、命令の「ラン」とは、１以上の命令の組であり、この組内で特定されるシーケンス内で実行されると予測される。たとえば、フェッチ／スキャンユニット１８は、Ｌ０  Ｉ−キャッシュ１６から２４命令バイトのランをフェッチする。各ランは、数個のセクションに分割され、これをフェッチ／スキャンユニット１８が並列にスキャンして、分岐命令を識別し、命令キュー２０のための命令スキャン情報を発生する。ある実施例に従うと、フェッチ／スキャンユニット１８は、大きな命令のランをサポートするために、１クロックサイクル当たり２つまでの分岐命令を予測しようとする。
【００３８】
命令キュー２０は、後続のディスパッチのためにフェッチ／スキャンユニット１８が与える命令バイトを格納するように構成される。命令キュー２０は、先入れ先出し（ＦＩＦＯ）バッファとして動作する。ある実施例において、命令キュー２０は、複数のエントリを格納するように構成される。各エントリは、命令のラン、ランの各セクション内の５つまでの命令を識別するスキャンデータ、および、ランの各セクションに対応するアドレスを含む。さらに、命令キュー２０は、アライメントユニット２２に提示するために、４つまでの連続ランセクション内の６つまでの命令を選択するように構成される。命令キュー２０は、例として２から３のエントリを用いる。命令キュー２０の一実施例に関する詳細をさらに以下で示す。
【００３９】
アライメントユニット２２は、命令キュー２０が識別した命令を、リネームスケジュールユニット２４内の１組の発行位置まで送るように構成される。言い換えれば、アライメントユニット２２は、命令キュー２０が与えるスキャン情報に応答し、命令キュー２０が与えるランセクションから、各命令を形成するバイトを選択する。命令は、プログラム順で発行位置に与えられる。（すなわちプログラム順で最初の命令は第１の発行位置に与えられ、プログラム順で２番目の命令は第２の発行位置に与えられるというふうに行なわれる。）
リネーム／スケジュールユニット２４は、レジスタリネーミングおよび命令スケジューリング機能をもたらす。より具体的には、リネーム／スケジュールユニット２４は、各命令のソースレジスタのための現在のリネームタグを与え、かつ、リネームタグを各命令のデスティネーションレジスタに割当てる。リネームタグは、リネームレジスタファイル３０Ａ−３０Ｂ内のリネームレジスタを識別する。
【００４０】
さらに、リネーム／スケジュールユニット２４は、あるタイプの命令のためのルックアヘッド値を発生しようとする。ルックアヘッド値発生は、ｘ８６命令セットを用いる実施例にとっては特に有益である。ｘ８６命令セットの性質のため、典型的なコードシーケンス内の命令の多くは、単純な転送の類である。この特徴の理由のひとつは、ｘ８６命令は２つのオペランドを含み、そのどちらもソースオペランドであり、このうち一方がデスティネーションオペランドだということである。したがって、各命令のソースオペランドのうち一方が実行結果で上書される。さらに、ｘ８６命令セットが特定する、レジスタオペランドの格納のためのレジスタはほとんどない。したがって、多くの命令はメモリ内に保持されるスタックへのまたこのスタックからのオペランドの転送である。さらに、多くの命令依存性はＥＳＰ／ＥＢＰレジスタに対する依存性であるが、これらレジスタに対する更新の多くは以前に格納された値のインクリメントおよびデクリメントである。これらの命令の実行を加速するために、リネーム／スケジュールユニット２４は、１クロックサイクル中にデコードされる各命令に対しＥＳＰレジスタのルックアヘッドコピーを発生する。
【００４１】
命令および割当てられたリネームは、リネーム／スケジュールユニット２４内のスケジューラに格納される。命令のためのソースオペランドが利用できるようになると（すなわちリネームレジスタファイル３０Ａ−３０Ｂに書込まれる）、命令は特定の機能ユニット３２Ａ−３２Ｆによる実行のためにスケジュールされる。
【００４２】
リネームレジスタファイル３０Ａ−３０Ｂは、命令が実行のためにスケジュールされると、これらの命令をリネーム／スケジュールユニット２４から受ける。リネームレジスタファイル３０Ａ−３０Ｂは、各命令のソースリネームタグに従いリネームレジスタを読出し、ソース値を、各命令の実行のために選択された機能ユニット３２Ａ−３２Ｆまたはアドレス発生ユニット３４Ａ−３４Ｄに与える。リネームレジスタファイル３０Ａ−３０Ｂは、各機能ユニットからの実行結果（およびＤ−キャッシュ３８からのロードメモリ演算結果）を、デスティネーションに割当てられたリネームタグとともに受ける。リネームレジスタファイル３０Ａ−３０Ｂは、識別されたリネームレジスタに実行結果を格納する。リネームレジスタファイル３０Ａ−３０Ｂは複数のリネームレジスタを含む。たとえば、リネームレジスタファイル３０Ａ−３０Ｂは各々、１００から２００のリネームレジスタを含む。
【００４３】
リネームレジスタファイル３０Ａ−３０Ｂはミラーイメージとして保持される。リネームレジスタファイル３０Ａ−３０Ｂは、単一のリネームレジスタファイルの代わりに設けられて、各レジスタファイルに設けられる読出ポートの数を減じる。書込ポートの数は同じままでよい（結果は一方のレジスタファイルから他方のレジスタファイルに伝搬されるため）。しかしながら、読出ポートの減少のためインプリメンテーションにおいてかなりの節約となる。（たとえば読出ポートの数は書込ポートの数の約２倍であることが多い。）これに応じて、リネームレジスタファイル３０Ａは、オペランドを機能ユニット３２Ａ−３２Ｃおよびアドレス発生ユニット３４Ａ−３４Ｂに与え、結果を機能ユニット３２Ａ−３２ＣおよびＤ−キャッシュ３８から受取る。同様に、リネームレジスタファイル３０Ｂは、オペランドを機能ユニット３２Ｄ−３２Ｆおよびアドレス発生ユニット３４Ｃ−３４Ｄに与え、結果を機能ユニット３２Ｄ−３２ＦおよびＤ−キャッシュ３８から受取る。リネームレジスタファイル３０Ａに与えられた結果はリネームレジスタファイル３０Ｂに伝搬され、リネームレジスタファイル３０Ｂに与えられた結果はリネームレジスタファイル３０Ａに伝搬される。ある実施例では、反対側のリネームレジスタファイルへの結果の伝搬は１クロックサイクルの遅延を伴う。
【００４４】
ｘ８６命令セットを用いるプロセッサ１０の実施例において、命令は、アドレス発生ユニット３４およびロード／ストアユニット３６のための暗黙のメモリ演算および機能ユニット３２のための明示的な機能的演算を含む。メモリオペランドのない命令は、メモリ演算を含まず、機能ユニット３２が処理する。ソースメモリオペランドおよびレジスタデスティネーションオペランドを有する命令は、アドレス発生ユニット３４およびロード／ストアユニット３６が処理する暗黙のロードメモリ演算ならびに機能ユニット３２が処理する明示的な機能的演算を含む。メモリソース／デスティネーションオペランドを有する命令は、アドレス発生ユニット３４およびロード／ストアユニット３６が処理する暗黙のロードおよびストアメモリ演算ならびに機能ユニット３２が処理する明示的機能演算を含む。最後に、明示的機能演算のない命令は、ロード／ストアユニット３６が処理する。各メモリ演算により、アドレス発生ユニット３４が扱うアドレス発生が生じる。本明細書ではメモリ演算および命令（すなわち機能演算）に別の呼称を与えているが、単一の命令から生じることもある。
【００４５】
アドレス発生ユニット３４は、アドレス発生演算を行なってメモリ演算のためのアドレスを発生するように構成される。発生したアドレスは、Ｌ１  Ｄ−キャッシュ３８およびロード／ストアユニット３６に転送される。ある実施例に従うと、アドレス発生ユニット３４Ａおよび３４Ｃをロードメモリ演算のために用い、アドレス発生ユニット３４Ｂおよび３４Ｄをストアメモリ演算のために用いる。機能ユニット３２Ａおよび３２Ｄは、整数算術／論理演算を行ないかつ分岐命令を実行するように構成された整数機能ユニットである。機能ユニット３２Ｂおよび３２Ｅは、マルチメディア命令を実行するように構成されたマルチメディア実行ユニットであり、機能ユニット３２Ｃおよび３２Ｆは、浮動小数点命令を実行するように構成された浮動小数点ユニットである。図示の実施例において、各機能ユニット３２は、１クロックサイクル当たり適切なタイプの２つまでの命令を実行するように構成される。何らかの制限を適用してもよい（たとえば１クロックサイクル当たり整数乗算は１つのみ、１つの浮動小数点超越数など）。
【００４６】
ロード／ストアユニット３６は、Ｌ１  Ｄ−キャッシュ３８のインターフェイスとなりストアメモリ動作のデータ記憶部分を実行しかつロード／ストア依存性チェックを処理するように構成される。メモリ演算は、データをプロセッサ１０と外部メモリとの間で転送することである。このメモリ演算は、明示的な命令、または、機能ユニット３２が実行する演算も含む命令の暗黙的な部分である。ロードメモリ演算は、外部メモリからプロセッサ１０へのデータ転送を特定し、ストアメモリ演算は、プロセッサ１０から外部メモリへのデータ転送を特定する。Ｌ１  Ｄ−キャッシュ３８内でメモリ演算に対するヒットが検出された場合、メモリ動作は外部メモリへのアクセスなしでその中で終了する。
【００４７】
Ｌ１  Ｄ−キャッシュ３８は、データを格納するための高速キャッシュメモリである。Ｌ１  Ｄ−キャッシュ３８に、セットアソシアティブおよびダイレクトマップト構成を含め何らかの適切な構成を用いることができる。ある特定の実施例において、Ｌ１  Ｄ−キャッシュ３８は、６４バイトラインを用いる１２８ＫＢのツーウェイセットアソシアティブキャッシュである。Ｌ１  Ｄ−キャッシュ３８をたとえば１ウェイ当たり３２バンクのキャッシュメモリとして編成できる。加えて、Ｌ１  Ｄ−キャッシュ３８は、Ｌ１  Ｉ−キャッシュ１４と同様のＴＬＢを用いる、線形的にアドレス指定され／物理的にタグ付けされるキャッシュでもよい。
【００４８】
外部インターフェイスユニット４２は、命令バイトおよびデータバイトのキャッシュラインを、キャッシュミスに応答してプロセッサ１０に転送するように構成される。命令キャッシュラインはプリデコードユニット１２に送られ、データキャッシュラインはＬ１  Ｄ−キャッシュ３８に送られる。加えて、外部インターフェイスユニット４２は、Ｌ１  Ｄ−キャッシュ３８が廃棄したキャッシュラインを、廃棄されたキャッシュラインが既にプロセッサ１０に修正されているならばメモリに転送するように構成される。図１に示すように、外部インターフェイスユニット４２は、Ｌ２インターフェイス４４を介して外部インターフェイスＬ２キャッシュへのインターフェイスとなり、バスインターフェイス４６を介してコンピュータシステムへのインターフェイスとなるように構成される。ある実施例では、バスインターフェイスユニット４６はＥＶ／６バスインターフェイスを含む。
【００４９】
次に図２を参照して、フェッチ／スキャンユニット１８の一実施例のブロック図が示される。他の実施例が可能であり意図される。図２に示すように、フェッチ／スキャンユニット１８は、プリフェッチ制御ユニット５０、複数の次選択ブロック５２Ａ−５２Ｃ、命令選択マルチプレクサ（ｍｕｘ）５４、命令スキャナ５６、分岐スキャナ５８、分岐履歴テーブル６０、分岐選択マルチプレクサ６２、リターンスタック６４、間接アドレスキャッシュ６６、および転送まとめユニット６８を含む。プリフェッチ制御ユニット５０は、Ｌ１  Ｉ−キャッシュ１４、Ｌ０  Ｉ−キャッシュ１６、間接アドレスキャッシュ６６、リターンスタック６４、分岐履歴テーブル６０、分岐スキャナ５８、および命令選択マルチプレクサ５４に結合される。次選択ブロック５２ＡはＬ１  Ｉ−キャッシュ１４に結合され、次選択ブロック５２Ｂ−５２ＣはＬ０  Ｉ−キャッシュ１６に結合される。各次選択ブロック５２は命令選択マルチプレクサ５４に結合され、これはさらに分岐スキャナ５８および命令スキャナ５６に結合される。命令スキャナ５６は命令キュー２０に結合される。分岐スキャナ５８は、分岐履歴テーブル６０、リターンスタック６４および分岐選択マルチプレクサ６２に結合される。分岐選択マルチプレクサ６２は間接アドレスキャッシュ６６に結合される。分岐履歴テーブル６０および分岐スキャナ５８は転送まとめユニット６８に結合され、これは命令キュー２０に結合される。
【００５０】
プリフェッチ制御ユニット５０は、分岐スキャナ５８、分岐履歴テーブル６０、リターンスタック６４および間接アドレスキャッシュ６６から、（ターゲットアドレスおよびテイクン／ノットテイクン予測を含む）分岐予測情報を受ける。プリフェッチ制御ユニット５０は、分岐予測情報に応答して、Ｌ０  Ｉ−キャッシュ１６のためのフェッチアドレスおよびＬ１  Ｉ−キャッシュ１４のためのプリフェッチアドレスを発生する。ある実施例において、プリフェッチ制御ユニット５０は、Ｌ０  Ｉ−キャッシュ１６のための２つのフェッチアドレスを発生する。第１のフェッチアドレスは、分岐スキャナ５８が識別した第１の分岐命令（もしあれば）に対応するターゲットアドレスとして選択される。第２のフェッチアドレスは、以前のクロックサイクルにおいて選択されたフェッチアドレス（すなわち命令選択マルチプレクサ５４が選択したランに対応するフェッチアドレス）に対するシーケンシャルアドレスである。
【００５１】
Ｌ０  Ｉ−キャッシュ１４は、この２つのフェッチアドレスに対応するキャッシュライン（およびプリデコード情報）ならびにこれらキャッシュライン各々に対してシーケンシャルなキャッシュライン（およびプリデコード情報）を与えて、次のブロック５２Ｂ−５２Ｃを選択する。より具体的には、次選択ブロック５２Ｂはシーケンシャルアドレスに対応するシーケンシャルキャッシュラインおよびこのシーケンシャルキャッシュラインの次に続くキャッシュラインを受ける。次選択ブロック５２Ｃは、ターゲットアドレスに対応するターゲットキャッシュラインおよびこのターゲットキャッシュラインにシーケンシャルなキャッシュラインを受ける。加えて、次選択ブロック５２Ｂ−５２Ｃは、対応するフェッチアドレスのオフセット部分を受ける。次選択ブロック５２Ｂ−５２Ｃは各々、受けたキャッシュラインから、命令バイトのラン（および対応するプリデコード情報）を選択する。これは、対応するフェッチアドレスのオフセット部分を含むランセクションで始まる。各フェッチアドレスのオフセット部分はキャッシュライン内のどこからでも始まり得るため、選択されたランは、フェッチされたキャッシュラインおよびフェッチされたキャッシュラインにシーケンシャルなキャッシュラインの一部を含むことがある。したがって、次選択ブロック５２Ｂ−５２Ｃは、フェッチされたキャッシュラインおよびシーケンシャルなキャッシュライン双方を受ける。
【００５２】
同様に、次選択ブロック５２Ａは、Ｌ１  Ｉ−キャッシュ１４からプリフェッチされたキャッシュライン（および対応するプリデコード情報）を受け、ここから命令ランを選択する。１つのキャッシュラインがＬ１  Ｉ−キャッシュ１４からプリフェッチされるため、ここから選択されるランは、プリフェッチアドレスのオフセット部分がキャッシュラインの終端に近ければ、ラン全体よりも小さいかもしれない。なお、Ｌ０  Ｉ−キャッシュ１６からのフェッチキャッシュラインは、プリフェッチ制御ユニット５０が対応するアドレスを発生するのと同じクロックサイクルで与えられるが、プリフェッチキャッシュラインは、Ｌ１  Ｉ−キャッシュ１４のサイズが大きくアクセスタイムが遅いために１クロックサイクル遅延するかもしれない。Ｌ１  Ｉ−キャッシュ１４は、プリフェッチされたキャッシュラインを次選択ブロック５２Ａに与えることに加えて、プリフェッチされたキャッシュラインをＬ０  Ｉ−キャッシュ１６に与える。プリフェッチされたキャッシュラインが既にＬ０  Ｉ−キャッシュ１６内に格納されている場合、Ｌ０  Ｉ−キャッシュ１６はプリフェッチされたキャッシュラインを廃棄する。しかしながら、プリフェッチされたキャッシュラインが既にＬ０  Ｉ−キャッシュ１６に格納されているのでなければ、プリフェッチされたキャッシュラインはＬ０  Ｉ−キャッシュ１６に格納される。この態様で、現在アクセスされているキャッシュラインは、Ｌ０  Ｉ−キャッシュ１６にここからの高速アクセスのために与えられる。なお、ある特定の実施例で、Ｌ０  Ｉ−キャッシュ１６はフルアソシアティブキャッシュとして編成される。所望に応じて他の編成を用いてもよい（たとえばダイレクトマップト、セットアソシアティブなど）。
【００５３】
プリフェッチ制御ユニット５０は、命令選択マルチプレクサ５４を制御することにより、分岐予測情報に応答して、次選択ブロック５２の１つから与えられる命令ランを選択する。以下でさらに詳細に説明するように、プリフェッチ制御ユニット５０は、クロックサイクルの初期に分岐スキャナ５８、リターンスタック６４および間接アドレスキャッシュ６６からターゲットアドレスを受け、かつ分岐スキャナ５８が識別する第１の分岐命令のオペコードバイトの少なくとも一部を受ける。プリフェッチ制御ユニット５０は、このオペコードバイトの一部をデコードし、種々のターゲットアドレスソースから、Ｌ０  Ｉ−キャッシュ１６からフェッチされたターゲットアドレスを選択し、選択したターゲットアドレスをＬ０  Ｉ−キャッシュ１６に与える。並行して、以前のクロックサイクルで選択されたフェッチアドレスに対するシーケンシャルアドレス（以前のクロックサイクルからの分岐予測次第で以前のクロックサイクルからのターゲットアドレスまたはシーケンシャルアドレスのいずれか）を計算してＬ０  Ｉ−キャッシュ１６に与える。分岐予測情報（すなわちテイクンまたはノットテイクン）は、このクロックサイクルの後期に分岐履歴テーブル６０が与える。Ｌ０  Ｉ−キャッシュ１６からフェッチしたターゲットアドレスに対応する分岐命令がテイクンと予測されたならば、プリフェッチ制御ユニット５０は、次選択ブロック５２Ｃが提供する命令ランを選択する。逆に、分岐命令がノットテイクンと予測されたならば、次選択ブロック５２Ｂが選択する命令ランが選択される。次選択ブロック５２Ａが提供する命令ランは、予測されたフェッチアドレスが以前のクロックサイクルにおいてＬ０  Ｉ−キャッシュ１６でミスしＬ１  Ｉ−キャッシュ１４からフェッチされた場合に選択される。加えて、分岐命令に応答してプリフェッチされた命令ランが３２ビット偏位もしくは間接ターゲットアドレス発生を備える場合またはＬ０  Ｉ−キャッシュミスがフェッチされた場合に、Ｌ１  Ｉ−キャッシュ１４からの命令ランが選択される。
【００５４】
選択された命令ランは、命令スキャナ５６および分岐スキャナ５８に与えられる。命令スキャナ５６は、選択された命令ランに対応するプリデコード情報をスキャンして、命令ラン内の命令を識別する。より具体的には、ある実施例において、命令スキャナ５６は各ランセクションに対応するスタートビットを並列にスキャンし、各ランセクション内の５つまでの命令を識別する。識別された命令（ランセクション内のオフセット）へのポインタが発生される。ポインタ、命令バイトおよびアドレス（１ランセクションにつき１つ）は、命令スキャナ５６によって命令キュー２０に運ばれる。特定のランセクションが５を上回る命令を含む場合、その特定のランセクションに続くランセクションに対応する情報は無効化され、この特定のランセクションおよび後続のランセクションは次のクロックサイクル中に再スキャンされる。
【００５５】
マイクロコードを用いる実施例については、マイクロコード命令が命令のデコード中に識別される（たとえば命令が発行された発行位置において直接デコードされた命令がないことにより）。
【００５６】
分岐スキャナ５８は、命令スキャナ５６と並列に命令ランをスキャンする。分岐スキャナ５８は、命令ランのスタートビットおよび制御転送ビットをスキャンして命令ラン内の最初の２つの分岐命令を識別する。上記のように、分岐命令は、セットされた命令のスタートバイト（スタートビットで識別される）に対応する制御転送ビットにより識別される。分岐スキャナ５８は、最初の２つの分岐命令の場所がわかると、命令を相対分岐命令と仮定し、対応のエンコードされたターゲットアドレスを、分岐命令のスタートバイトに続く命令バイトから選択する。ｘ８６命令セットを用いる実施例については、９ビットターゲットアドレス（偏位バイトおよび対応する制御転送ビット）が選択され、３２ビットターゲットアドレスも選択される。さらに、スタートおよび制御転送ビットが識別するオプコードバイトの少なくとも一部が選択される。ターゲットアドレスおよびオプコードバイトは、Ｌ０  Ｉ−キャッシュ１６からのフェッチのためにターゲットアドレスを選択するのに用いるため、プリフェッチ制御ユニット５０に送られる。各分岐命令のフェッチアドレス（各分岐命令を含むランセクションのフェッチアドレスおよびそのセクション内の分岐命令の位置から求められる）は、各分岐命令に対応するテイクン／ノットテイクン予測を選択するために分岐履歴テーブル６０に送られる。さらに、各分岐命令に対応するフェッチアドレスは、分岐選択マルチプレクサ６２に送られ、さらに間接アドレスキャッシュ６６に送られる。各分岐命令のターゲットアドレスは、転送まとめユニット６８に送られる。ある実施例に従うと、分岐スキャナ５８は、最初の２つの分岐命令に対し各ランセクションを並列にスキャンし、スキャン結果を組合せてラン内の最初の２つの分岐命令を選択するように構成される。
【００５７】
分岐スキャナ５８はさらに、１クロックサイクル中にサブルーチン呼出命令がスキャンされるかどうかを判断するように構成される。分岐スキャナ５８は、検出されたサブルーチン呼出命令に続く命令のフェッチアドレスを、リターンスタック６４に、ここに格納するために転送する。
【００５８】
ある実施例において、１つのラン内に２を上回る分岐命令がある場合、このランを再び後続のクロックサイクル中にスキャンして後続の分岐命令を識別する。
【００５９】
識別された分岐命令のフェッチアドレスを分岐履歴テーブル６０に与えて、各命令についてテイクン／ノットテイクン予測を判断する。分岐履歴テーブル６０は、以前に検出された分岐命令の振舞いに対応する複数のテイクン／ノットテイクン予測子を含む。予測子のうち１つを、最新の予測の履歴を保存し、これら最新の予測と、分岐命令に対応するフェッチアドレスの一部との排他的論理和を計算することにより、選択する。最新から最も遠い（最も古い）予測と、フェッチアドレスの一部内の最上位ビットとの排他的論理和を計算し、同様の計算を続け、最新の予測とフェッチアドレスの一部内の最下位ビットとの排他的論理和の計算も含まれる。１クロックサイクルにつき２つの予測子が選択されるため、第２の分岐命令に対応する予測子は、第１の分岐命令の予測に依存する（対応するフェッチアドレスの最下位ビットとの排他的論理和のため）。分岐履歴テーブル６０は、選択され得る予測子双方を選択し（すなわち第１の分岐命令がノットテイクンと予測された場合に選択されるであろう予測子および第１の分岐命令がテイクンと予測された場合に選択されるであろう予測子）、次に第１の分岐命令について選択された実際の予測に基づき２つの予測子のうち１つを選択することによって、第２の予測子を提供する。
【００６０】
分岐履歴テーブル６０は、分岐命令の実行に関する情報を、機能ユニット３２Ａ−３２Ｄから受ける。実行された分岐命令に対応する最近の予測の履歴および実行された分岐命令のフェッチアドレスは、更新する予測子を選択するために与えられ、実行された分岐命令のテイクン／ノットテイクン結果も与えられる。分岐履歴テーブル６０は、対応する予測子を選択し、テイクン／ノットテイクン結果に基づき予測子を更新する。ある実施例において、分岐履歴テーブルはバイモーダルカウンタを格納する。このバイモーダルカウンタは、最大および最小値で飽和する飽和カウンタである。（すなわちカウンタは最小値の後のデクリメントおよび最大値の後のインクリメントでは何ら変化しない。）分岐命令がテイクンの度に、対応するカウンタがインクリメントされ、分岐命令がノットテイクンの度に、対応するカウンタがデクリメントされる。カウンタの最上位ビットは、テイクン／ノットテイクン予測を示す（たとえば、セットならテイクン、クリアならノットテイクン）。ある実施例において、分岐履歴テーブル６０は、６４Ｋの予測子を格納し、１６の最新予測の履歴を保持する。各クロックサイクルで、そのクロックサイクル中に選択された予測は履歴にシフトされ、最も古い予測が履歴から追出される。
【００６１】
リターンスタック６４を用いて、検出されたサブルーチン呼出命令に対応するリターンアドレスを格納する。リターンスタック６４は、分岐スキャナ５８からサブルーチン呼出命令のフェッチアドレスを受ける。呼出命令に続くバイトのアドレス（リターンスタック６４に与えられるフェッチアドレスから計算される）は、リターンスタック６４のトップに置かれる。リターンスタック６４は、リターンスタックのトップに格納されたアドレスを、リターン命令が分岐スキャナ５８およびプリフェッチ制御ユニット５０によって検出された場合に、ターゲットアドレスとして選択するためにプリフェッチ制御ユニット５０に与える。この態様で、各リターン命令は、ターゲットアドレスとして最も最近検出された呼出命令に対応するアドレスを受ける。一般に、ｘ８６命令セットにおいて、呼出命令は、呼出命令に対するシーケンシャルアドレスがｘ８６アーキテクチャが定めるスタックの上に置かれることを特定する制御転送命令である。リターン命令は、スタックのトップからターゲットアドレスを選択する命令である。一般に、呼出およびリターン命令がコードシーケンス内のサブルーチンへの（それぞれ）進入および退出のために用いられる。呼出命令に対応するアドレスをリターンスタック６４に置き、リターンスタック６４のトップのアドレスをリターン命令のターゲットアドレスとして用いることにより、リターン命令のターゲットアドレスを正確に予測できる。ある実施例において、リターンスタック６４は１６のエントリを含み得る。
【００６２】
間接アドレスキャッシュ６６は、以前の間接分岐命令の実行に対応するターゲットアドレスを格納する。間接分岐命令に対応するフェッチアドレスおよび間接分岐命令の実行に対応するターゲットアドレスは、機能ユニット３２Ａ−３２Ｄにより間接アドレスキャッシュ６６に与えられる。間接アドレスキャッシュ６６は、対応するフェッチアドレスが指示するターゲットアドレスを格納する。間接アドレスキャッシュ６６は、分析選択マルチプレクサ６２が（間接分岐命令の検出に応答して）選択したフェッチアドレスを受け、このフェッチアドレスが間接アドレスキャッシュ６６にヒットした場合、対応するターゲットアドレスをプリフェッチ制御ユニット５０に与える。ある実施例において、間接アドレスキャッシュ６６は３２のエントリを含み得る。ある特定の実施例に従うと、フェッチアドレスが間接アドレスキャッシュ６６でヒットした場合、間接アドレスキャッシュ６６からはターゲットアドレスは与えられない。その代わりとして、所望されればそこに格納されたターゲットアドレスの１つが「推測された」ターゲットアドレスとして選択される。
【００６３】
ある実施例に従うと、プリフェッチ制御ユニット５０は、Ｌ０  Ｉ−キャッシュ１６からのフェッチのためのターゲットアドレスを、（ｉ）分岐スキャナ５８が識別する第１の分岐命令に対応する第１のエンコードされたターゲットアドレス、（ii）リターンスタック６４が与えるリターンスタックアドレス、および（iii）シーケンシャルアドレスから選択する。プリフェッチ制御ユニット５０は、第１の命令に対応するオペコードのデコードが命令が相対分岐命令であることを示す場合、第１のエンコードされたターゲットアドレスを選択する。デコードが命令がリターン命令であることを示す場合、リターンスタックアドレスが選択される。それ以外の場合、シーケンシャルアドレスが選択される。間接ターゲットアドレスおよび３２ビット相対ターゲットアドレスは、Ｌ１  Ｉ−キャッシュ１４からプリフェッチされる。これらのタイプのターゲットアドレスは、ターゲットアドレスがメモリ内の分岐命令近くにないときに用いられることが多いため、こうしたタイプのターゲットアドレスがＬ０  Ｉ−キャッシュ１６内でヒットすることは稀である。加えて、第２の分岐命令がテイクンと予測され第１の分岐命令がノットテイクンと予測される、または、第１の分岐命令が命令ランにおいて第２の分岐命令を排除しない前方分岐の場合、ある実施例に従うと、第２の分岐予測に対応する第２のターゲットアドレスを、後続のクロックサイクル中ターゲットフェッチアドレスとして用いる。
【００６４】
なお、エンコードされたターゲットアドレスが選択された場合、実際のターゲットアドレスはＬ０  Ｉ−キャッシュ１６に提示される。プリフェッチ制御ユニット５０は、可能な上／下ターゲットアドレス各々を予め計算し、エンコードされたターゲットアドレスに基づき正しいアドレスを選択するよう構成される。その代わりとして、プリフェッチ制御ユニット５０は、どのＬ０  Ｉ−キャッシュ記憶場所が上および下キャッシュラインを格納しているかを記録し、タグ比較なしで記憶場所を直接選択してもよい。
【００６５】
転送まとめユニット６８は、選択された各分岐命令の命令ラン内のターゲットアドレスおよび位置、およびテイクン／ノットテイクン予測を受ける。転送まとめユニット６８は、受けた予測に基づき、そのラン内のどの命令を削除すべきかを決定する。第１の分岐命令がテイクンと予測され後方分岐の場合（すなわち偏位が負である）、第１の分岐命令に続くすべての命令が削除される。第１の分岐命令がテイクンと予測され前方分岐であるが偏位が小さい場合（たとえば命令ラン内）、第１の分岐命令とターゲットアドレスとの間の命令が削除される。第２の分岐命令は、第１の分岐命令の予測に従うとまだそのラン内にあるならば、同じように処理される。ラン内の命令についての削除表示は、命令キュー２０にセットされる。
【００６６】
プリフェッチ制御ユニット５０はさらに、Ｌ１  Ｉ−キャッシュ１４から与えられるキャッシュラインで置換するためにＬ０  Ｉ−キャッシュ１６内のキャッシュラインを選択するよう構成される。ある実施例では、プリフェッチ制御ユニット５０は、最長時間未使用（ＬＲＵ）置換アルゴリズムを用いる。
【００６７】
次に図３を参照して、リネーム／スケジュールユニット２４のある実施例のブロック図が示される。他の実施例が可能であり意図される。図３の実施例において、リネーム／スケジュールユニット２４は、ＦＰスタック−絶対変換ユニット７０、ＦＰマップ７２、ＥＳＰルックアヘッドユニット７４、フューチャファイルリネームタグユニット７６、アーキテクチャリネームタグユニット７８、ルックアヘッド加算器８０、スケジューラ８２、結果キュー８４、スケジューラ制御ユニット８６、第１のピックコアユニット８８、および第２のピックコアユニット９０を含む。ＦＰスタック−絶対変換ユニット７０およびＥＳＰルックアヘッドユニット７４は、アライメントユニット２２に結合される。ＦＰスタック−絶対変換ユニット７０は、ＦＰマップ７２およびマルチプレクサ９２に結合され、これはさらにアライメントユニット２２およびフューチャファイルリネームタグユニット７６に結合される。ＥＳＰルックアヘッドユニット７４は、ルックアヘッド加算器８０に結合され、これはさらに累積ＥＳＰ更新を受けるようにスケジューラ８２に結合される。ルックアヘッド加算器８０およびフューチャファイルリネームタグユニット７６は、スケジューラ８２に結合される。フューチャファイルリネームタグユニット７６はさらに、スケジューラ制御ユニット８６およびアーキテクチャリネームタグユニット７８に結合される。アーキテクチャリネームタグユニット７８は、結果キュー８４に結合され、これはさらにスケジュール制御ユニット８６に結合される。第１および第２のピックコアユニット８８および９０は、スケジューラ８２および第１および第２のリネームレジスタファイル３０Ａおよび３０Ｂそれぞれに結合される。なお、１以上のデコードユニット（図示せず）を、並列にＦＰスタック−絶対変換ユニット７０およびＥＳＰルックアヘッドユニット７４に結合してもよく、または、これらユニットの前後に直列に結合して命令デコード動作を行なうようにしてもよい。
【００６８】
上記のように、アライメントユニット２２は、命令をリネーム／スケジュールユニット２４内の１組の発行位置に整地する。発行位置は、スケジューラ８２および結果キュー８４内に保持される。命令を、スケジューラ８２および結果キュー８４に格納する前に、ＦＰスタック−絶対変換ユニット７０およびＥＳＰルックアヘッドユニット７４に提示する。
【００６９】
ＦＰスタック−絶対変換ユニット７０は、プロセッサ１０の、浮動小数点レジスタがスタックとして動作する実施例のために与えられる（たとえばｘ８６浮動小数点アーキテクチャ）。浮動小数点レジスタの１つは、浮動小数点状態レジスタにおけるスタックポインタのトップにより、スタックのトップとして識別され、他の浮動小数点レジスタは、スタックのトップが識別するレジスタからの相対距離に応じた、スタック内の位置にある。浮動小数点命令の中には、スタック内の１以上のエントリ上の演算を特定することに加えまたはその代わりに、ある値をスタックにプッシュすることまたはある値をスタックからポップすることを特定するものがある。ＦＰスタック−絶対変換ユニット７０は、浮動小数点命令に含まれるスタック相対レジスタ指定子を、絶対レジスタ指定子に変換する（すなわち浮動小数点レジスタファイルをアドレス指定するレジスタ番号）。ＦＰスタック−絶対変換ユニット７０は、変換を行なうために、以前にディスパッチされた浮動小数点命令に対応するスタックポインタの投機的トップを保持する。加えて、ＦＰスタック−絶対変換ユニット７０は、スタックポインタのトップに対する各浮動小数点命令の効果を、次の浮動小数点命令のためのレジスタ指定子を変換するために、求める。
【００７０】
ｘ８６浮動小数点アーキテクチャはまた、２つのレジスタ内の値を交換する交換命令を特定する。ＦＰスタック−絶対変換ユニット７０は、レジスタ内の値を実際に交換する代わりに、２つの命令に対応する絶対レジスタ指定子をスワップすることにより、交換命令（およびそれに続く命令）を高速化する。ＦＰマップ７２はこのために設けられる。ＦＰマップ７２は、最初に、ゼロからＮ−１（たとえばｘ８６アーキテクチャの０から７）の順で、絶対レジスタ番号を記録する。交換命令が実施されると、命令の影響を受ける絶対レジスタ指定子は、ＦＰマップ７２内でスワップされる。所与の浮動小数点命令に対する絶対レジスタ番号は、スタックポインタの現在の投機的なトップおよび特定されたレジスタのスタック内の位置により選択された、浮動小数点マップ７２内のエントリを読出すことによって求められる（たとえば交換命令がない場合に絶対レジスタ指定子であったもの）。
【００７１】
ＦＰスタック−絶対変換ユニット７０の出力は、マルチプレクサ（ｍｕｘ）９２の一方入力に与えられる。元のレジスタ指定子は、マルチプレクサ９２の他方入力に与えられる。各命令について、ＦＰスタック−絶対変換ユニット７０は、その出力または元の命令いずれかを、その命令が浮動小数点かどうかに基づき選択する。なお、交換命令は絶対レジスタ番号の順を変更するので、マルチメディア命令のレジスタ番号（絶対値である）は、ｘ８６マイクロプロセッサアーキテクチャを用いる実施例においてもＦＰスタック−絶対変換ユニット７０により変換される。なお、さらに、オペコードおよび他の命令情報（たとえば即値フィールドおよび偏位フィールド）は、修正なしでマルチプレクサ８２ならびにフューチャファイルおよびリネームタグユニット７６を通して送られ、スケジューラ８２に格納される。
【００７２】
ＥＳＰルックアヘッドユニット７４をルックアヘッド加算器８０と組合せて用い、ＥＳＰをソースオペランドとする各命令についてＥＳＰレジスタのための投機的な値を発生する（ｘ８６アーキテクチャを用いるプロセッサ１０の実施例で）。ｘ８６アーキテクチャが特定するレジスタは比較的少ないため、これらの多くは汎用ではなく、多くのｘ８６命令はスタックオペランドを操作する。スタックオペランドの場所は、ＥＳＰレジスタをアドレスオペランドとして用いて求める。加えて、多くの命令はＥＳＰレジスタを修正する（たとえばプッシュおよびポップ値）。プッシュおよびポップ値は結果としてＥＳＰレジスタのインクリメントまたはデクリメントをもたらす。したがって、ＥＳＰレジスタに対する多くの修正は、予め、ＥＳＰレジスタに加算またはＥＳＰレジスタから減算する一定値として行なわれる。
【００７３】
ＥＳＰルックアヘッドユニット７４は、発行位置の組内にある命令をスキャンし、ＥＳＰルックアヘッドユニット７４に与えられる発行位置の組内の第１の命令の実行前に存在するＥＳＰレジスタ値に加算される定数を発生する。これらの定数を、ＥＳＰレジスタの投機的ルックアヘッド値に加算し（プロセッサ１０が以前にディスパッチした命令に対応する）、各命令についてＥＳＰ値を発生する。言い換えれば、第１の発行位置（プログラム順で）に対して発生した定数は、第１の発行位置の命令の効果を含む（命令がＥＳＰをアドレスオペランドたとえばプッシュとして用いる前にそのＥＳＰを修正する場合）。第２の発行位置に対して発生した定数は、第１の発行位置の命令の効果および第２の発行位置の命令の効果を含む（命令がＥＳＰをアドレスオペランドたとえばプッシュとして用いる前にそのＥＳＰを修正する場合）。一般に、発行位置Ｎに対して発生した定数は、第１の発行位置から発行位置Ｎ−１における命令のＥＳＰに対する効果、および、発行位置Ｎにおける命令の効果を含む（命令がＥＳＰをアドレスオペランドたとえばプッシュとして用いる前にそのＥＳＰを修正する場合）。
【００７４】
ＥＳＰルックアヘッドユニット７２が発生する定数は、ルックアヘッド加算器８０に与えられる。ルックアヘッド加算器８０は、確定できない最後の更新以来投機的にディスパッチされた命令に従うＥＳＰレジスタに対する累積投機更新を示す累積ＥＳＰ更新値を、保持する。ルックアヘッド加算器８０は、ＥＳＰルックアヘッドユニット７４から受けた定数を、ルックアヘッド加算器８０が保持する累積ＥＳＰ値に加算して、各命令についてルックアヘッドＥＳＰ値を発生する。ＥＳＰルックアヘッドユニット７４は、ＥＳＰに対するいくつかの更新（たとえば別のレジスタからＥＳＰへの転送、登録された値のＥＳＰへの加算など）を確定できない。ＥＳＰルックアヘッドユニット７４は、このような確定不能の更新を検出した場合、この確定不能の更新を実行する命令の実行まで、この命令に続く命令をストールする。この更新をＥＳＰ加算器８０が受けて、投機的ルックアヘッドＥＳＰ値の次の発生が行なえるようにする。ある実施例に従うと、ＥＳＰルックアヘッドユニット７４は以下のｘ８６命令のＥＳＰに対する更新を確定できる。すなわちＣＡＬＬ、ＲＥＴ  ０，Ｎ、ＰＵＳＨ、ＰＯＰ、ＡＤＤ  ＥＳＰ，ＩＭＭ、ＥＮＴＥＲ  ０，Ｎ、ＬＥＡＶＥ  ０，Ｎ、ＭＯＶ  ＥＢＰ，ＥＳＰ、およびＭＯＶ  ＥＳＰ，ＥＢＰである。
【００７５】
マルチプレクサ９２が選択したレジスタ指定子は、リネーミングのためにフューチャファイルリネームタグユニット７６に送られる。フューチャファイルリネームタグユニット７６は、各ソースレジスタに現在のリネームタグを与え、使用していないリネームレジスタのリストからの新規リネームレジスタを各デスティネーションレジスタに割当てる。フューチャファイルリネームタグユニット７６はまた、並行してディスパッチされる命令間の依存性を解決する。最後に、フューチャファイルリネームタグユニット７６は、リネームタグのフューチャファイルを更新して、新たに割当てられたリネームレジスタを表わす。
【００７６】
リネームレジスタタグおよびルックアヘッド加算器８０からのルックアヘッドＥＳＰ値を含む命令は、格納のためにスケジューラ８２に与えられる。ある実施例において、スケジューラ８２は「ライン指向型」であり、ここには、命令および各発行位置からの関連情報を格納できる記憶ラインが、命令が各発行位置を占めていなくても、割当てられる。加えて、記憶部は、デスティネーションレジスタリネームタグを格納するために結果キュー８４に割当てられる。
【００７７】
命令は、スケジューラ８２に格納されると、そのソースオペランドの有効性を待つ。有効になった時がその命令が実行のために選択されるのにふさわしい（「スケジュールされる」）時である。フューチャファイルリネームタグユニット７６は、現在のリネームレジスタ（すなわち現在特定のアーキテクチャ上のレジスタに割当てられているレジスタ）である各リネームレジスタに対する有効表示を保持し、既に有効であるソースオペランドを有する命令は、スケジューラ８２に格納されるとそれらのソースオペランドの有効性を示すであろう。無効であるリネームレジスタは、ソースオペランドがまだ有効でないことを示す（すなわちリネームレジスタを更新する命令の実行に応答して更新されていない）ため、命令はまだスケジュールに適していない。
【００７８】
第１および第２のピックコアユニット８８および９０は、スケジュールに適したスケジューラ８２内の命令、および、対応する第１および第２のコアへのスケジュール命令をそれぞれ調べる。第１のコアは、リネームレジスタファイル３０Ａに結びつけられた機能ユニットおよびアドレス発生ユニットを含み、同様に、第２のコアは、リネームレジスタファイル３０Ｂに結びつけられた機能ユニットおよびアドレス発生ユニットを含む。第１および第２のピックコアユニット８８および９０が選択する命令は、オペランド読出のためにリネームレジスタファイル３０Ａおよび３０Ｂに与えられ、スケジューラ制御ユニット８６にも与えられる。
【００７９】
スケジューラ制御ユニット８６は、スケジュールされた各命令についてデスティネーションリネームレジスタを記録し、いつリネームレジスタが有効になるかを判断する。リネームレジスタが有効であると判断すると、リネームレジスタに対応するリネームタグはスケジューラにブロードキャストされる。ブロードキャストタグに合う各ソースレジスタリネームタグは有効であると示される。この実施例に従う整数、浮動小数点およびマルチメディア機能ユニットについて、リネームレジスタが有効になるまでのクロックサイクル数は、命令のタイプおよび命令により決まる定数である（たとえば乗算は加算よりも多くのクロックサイクルを含むなど）。メモリ演算は、キャッシュミスを含みしたがってスケジュールからリネーム有効までの可変の遅延を含むため、データキャッシュ３８によりスケジューラ制御ユニット８６に対し有効であるまたは有効でないと示される。スケジューラ制御ユニット８６は、メモリ動作に対応するリネームタグの有効を、データキャッシュ３８が有効と示すまで保留してもよい。
【００８０】
スケジューラ制御ユニット８６はまた、有効とされたレジスタリネームタグを、フューチャファイルリネームタグユニット７６にブロードキャストし（フューチャファイルリネームタグユニット７６はリネームタグをもしまだフューチャファイル内の現在のレジスタリネームならば有効と示す）、かつ、結果キュー８４にブロードキャストする（結果キュー８４は対応する命令の実行に成功したことを示す）。
【００８１】
結果キュー８４は、分岐予測誤り、ならびに他の例外処理および命令のインオーダリタイアを扱うために設けられる。命令のリタイアは、命令のデスティネーションに割当てられたリネームレジスタを識別するリネームタグを、アーキテクチャリネームタグユニット７８に格納することにより行なう。結果キュー８４は、命令のデスティネーションレジスタに割当てられたリネームタグおよびアーキテクチャ上のデスティネーションレジスタ番号を格納する。この態様で、リネームタグは、アーキテクチャリネームタグユニット７８内の対応するアーキテクチャ上のレジスタと関連付けられる。このアーキテクチャ上のレジスタに対応する以前のリネームタグを未使用リストに戻す。加えて、結果キュー８４は、機能ユニットから予測誤りリダイレクション／例外情報を受け、どの命令に例外が起こったのか判断する。誤って予測され別のタイプの例外が生じた命令のリタイアの際、結果キュー８４は、アーキテクチャリネームタグ７８に信号で知らせ、その内容をフューチャファイルリネームタグユニット７６にコピーする。こうしてリネームタグのフューチャファイルは例外から回復する。なお、命令が、訂正された経路からフェッチされ、フューチャファイルリネームからアーキテクチャリネームへの復元前にフューチャファイルリネームタグユニット７６に達するならば、命令は、例外発生命令および以前の命令のリタイアならびにフューチャファイルタグの回復までストールされる。なお、さらに、タグをスワップした転送命令のリタイアの際、転送命令に含まれる２つのレジスタのアーキテクチャ上のタグもスワップされる。
【００８２】
ある実施例に従うと、命令ラインのスケジューラ８２からの割当解除は、ライン内の全命令のスケジュールに成功したとき、または、予測誤りもしくは例外のためにラインの無効化が生じたときに行なわれる。命令のラインの結果キュー８４からの割当解除は、リタイアの選択に際し、または予測誤りもしくは例外のための無効化に際して行なわれる。
【００８３】
なお、種々の記憶デバイスが図２および３に示される（例としてデバイス７９Ａ、７９Ｂおよび図２の同様のデバイス、デバイス７９Ｃ、７９Ｄおよび図３の同様のデバイス）。この記憶デバイスは、ラッチ、レジスタ、フリップフロップなどを表わしこれらを用いてパイプライン段を分離する。しかしながら、図２および３に示した特定のパイプライン段は、プロセッサ１０の一実施例に適したパイプライン段の一実施例にすぎない。他の実施例では他のパイプライン段を用いることができる。
【００８４】
次に図４を参照して、ＥＳＰルックアヘッドユニット７４の一実施例のブロック図が示される。他の実施例が可能であり意図される。図４の実施例において、ＥＳＰルックアヘッドユニット７４は、複数の定数発生器１００Ａ−１００Ｆおよび分割移動検出ユニット１０２を含む。定数発生器１００は、アライメントユニット２２から命令を受けるように結合され、かつルックアヘッド加算器８０に定数を与えるように結合される。加えて、分割移動検出ユニット１０２は、アライメントユニット２２から命令を受けるように結合される。分割移動検出ユニット１０２は、分割制御バス１０４を介して分割制御情報を与え、かつスワップタグライン１０６を介してスワップタグ信号を与える。さらに、分割移動検出ユニット１０２は、ＥＳＰペンディングライン１０８でＥＳＰペンディング信号を受けるように結合される。
【００８５】
分割移動検出ユニット１０２は、アライメントユニット２２から与えられる命令をスキャンし、ベースポインタレジスタからスタックポインタレジスタへの（およびこの逆の）転送命令を検出するように構成される。このような命令を検出すると、分割移動検出ユニット１０２は、フューチャファイルタグユニット７６へのスワップタグライン１０６上のスワップタグ信号をアサートする。フューチャファイルタグユニット７６は、ＥＳＰルックアヘッドユニット７４が処理している命令についてのリネームレジスタの割当に続いて、スタックポインタおよびベースポインタタグをスワップするように構成される。分割移動検出ユニット１０２は、タグのスワッピング後のＥＳＰペンディングラインの状態から、リネームレジスタファイル３０におけるスタックポインタレジスタの新規の値が有効かどうか判断する。スタックポインタがまだペンディングの場合（すなわち有効でない）、分割移動制御ユニット１０２は、スタックポインタレジスタが有効になるまで後続の命令ディスパッチをストールする。スタックポインタレジスタが有効になると、ルックアヘッド加算器８０は、スタックポインタレジスタの新規の値を、定数発生器１００が発生する定数とともに用いるために読出す。
【００８６】
この実施例において、分割移動検出ユニット１０２はさらに、定数発生器１００が確定できないスタックポインタレジスタに対する更新を検出するように構成される。上記のある特定の実施例において、以下の命令に従うスタックポインタレジスタに対する更新は確定可能である。すなわちＣＡＬＬ、ＲＥＴ  ０，Ｎ、ＰＵＳＨ、ＰＯＰ、ＡＤＤ  ＥＳＰ，ＩＭＭ、ＥＮＴＥＲ  ０，Ｎ、ＬＥＡＶＥ  ０，Ｎ、ＭＯＶ  ＥＢＰ，ＥＳＰ、およびＭＯＶ  ＥＳＰ，ＥＢＰである。スタックポインタレジスタに対する他の更新は、分割移動検出ユニット１０２により検出される。このような確定不能の更新を検出すると、分割移動検出ユニット１０２は、確定不能の更新で、アライメントユニット２２が与える１組の命令（「ライン」）を分割する。確定不能の更新を有する命令以前の命令は、ルックアヘッド加算器８０およびフューチャファイルリネームタグユニット７６にディスパッチされ、残りの命令は、確定不能の更新が完了するまでストールされる。ラインを分割したとき、分割移動検出ユニット１０２は、分割制御バス１０４を介して、アライメントユニット２０、スケジューラ８２およびフューチャファイルリネームタグユニット７６に知らせる。分割が発生した命令が与えられ、分割発生を示す、アサートされた制御信号も与えられる。
【００８７】
分割移動検出ユニット１０２は、ベースポインタースタックポインタ転送命令でもラインを分割する。命令はタグフューチャファイルにおけるタグのスワッピングにより加速されており、ルックアヘッド加算器８０が保持する現在のルックアヘッド値は、ベースポインタースタックポインタ転送命令のディスパッチの際に無効になる。応じて、ラインが分割され、後続の命令が、新規スタックポインタリネームレジスタが有効になるまでストールされる。新規スタックポインタリネームレジスタは既に有効かもしれない。その場合、ストールされず新規の値が読出される、または、値が有効になり読出すことができるようになるまでストールされる。
【００８８】
なお、この実施例では、スタックポインタレジスタからベースポインタレジスタへの転送もタグのスワッピングによって検出および処理する。しかしながら、スタックポインタレジスタは実際命令によって修正されないため、スタックポインタルックアヘッド値は無効にならない。したがって、この場合ラインは分割されない。しかしながら、簡単にするため、ベースポインタからスタックポインタへの転送も同じライン内にある場合は、ある実施例に従うと、ラインはスタックポインタからベースポインタへの転送で分割される。
【００８９】
各定数発生器１００Ａ−１００Ｆは、アライメントユニット２２が整地した命令の発行位置の１つに対応し、ラインの、その発行位置以前の命令のＥＳＰに対する累積更新を示す定数を発生する。したがって、定数発生器１００Ａ（発行位置０に対する定数を発生する）は、発行位置０内の命令をスキャンする。定数発生器１００Ｂは、発行位置０および１内の命令をスキャンする。これ以外も同様である。定数発生器１００Ｆは２つの定数を発生する。第１の定数は発行位置５内の命令に対応し、第２の定数は１組の命令の累積更新を示す。定数発生器１００Ｆが発生する第１および第２の定数は、発行位置５内の命令がＥＳＰの値をソースとして用い、値をインクリメントまたはデクリメントしてＥＳＰレジスタにデスティネーションとして格納する（たとえばＰＯＰ）場合は異なる。その代わりとして、累積定数を別に発生してもよい（たとえば分割移動検出ユニット１０２により）。
【００９０】
次に図５を参照して、分割移動検出ユニット１０２がアライメントユニット２２から与えられる１組の命令をスキャンする一実施例の動作を示すフローチャートを示す。他の実施例が可能であり意図される。図５に示したステップは、理解しやすくするために直列順序で表わしているが、これらステップは何らかの適切な順序で実施できる。さらに、これらステップは、分割移動検出ユニット１０２内の組合せ論理において種々の並列形式で実施できる。
【００９１】
分割移動検出ユニット１０２がスタックポインタからベースポインタへの転送を検出した場合（判断ブロック１１０）、分割移動検出ユニット１０２は、フューチャファイルリネームタグユニット７６に信号で知らせ、ベースポインタおよびスタックポインタタグをスワップする（ステップ１１２）。加えて、分割移動検出ユニット１０２は、転送命令でラインを分割し、そのラインに対する処理は現在のクロックサイクルで終了する。分割に続く命令は再び次のクロックサイクルでアライメントユニット２２により与えられる。
【００９２】
同様に、分割移動検出ユニット１０２がベースポインタからスタックポインタへの転送を検出した場合（判断ブロック１１４）、分割移動検出ユニット１０２は、フューチャファイルリネームタグユニット７６に信号で知らせ、ベースポインタおよびスタックポインタタグをスワップする（ステップ１１６）。加えて、分割移動検出ユニット１０２は、転送命令でラインを分割し、このラインに対する処理は現在のクロックサイクルで終了する。分割に続く命令は、次のクロックサイクル中にアライメントユニット２２により与えられる。加えて、分割移動検出ユニット１０２は、タグスワップに続きフューチャファイルリネームタグユニット７６からのＥＳＰペンディング信号を調べる（たとえばある特定の実施例では後続のクロックサイクルで）。スタックポインタタグがペンディングの場合（判断ブロック１１８）、分割移動検出ユニット１０２は、スタックポインタリネームレジスタ（すなわち前のベースポインタリネームレジスタ）が有効になるまで、後続の命令をストールする（ステップ１２０）。その後、スタックポインタレジスタの新規の値がリネームレジスタファイル３０から読出される（ステップ１２２）。明確にするためにステップ１２２はこのフローチャートに含まれているが、この実施例においてステップ１２２はルックアヘッド加算器８０が実施するものである。
【００９３】
分割移動検出ユニット１０２はまた、異なる分割ライン条件を検出する（判断ブロック１２４）。たとえば、ＥＳＰに対する、他の確定不能の更新を検出する。さらに、並行してディスパッチされる命令に対する他の制限をこのやり方で検出する。このような制限は、プロセッサ１０内のハードウェアをこうした限定を用いることで簡略化できるのであれば望ましい。異なる分割ライン条件を検出すると、分割移動検出ユニット１０２は識別された命令でラインを分割し、このラインに対する処理は終了する（ステップ１２６）。
【００９４】
他方、上記のような条件が検出されなければ、ラインは次のパイプライン段に進み、分割移動検出ユニット１０２は、アライメントユニット２２からの次のラインを待つ。
【００９５】
次に図６を参照して、分割移動検出ユニット１０２のある実施例で用いるステートマシンの例が示される。他の実施例が可能であり意図される。たとえば、他の実施例では、これらが含まれるプロセッサのパイプラインに応じて異なるステートマシンを用い、または全く用いないこともある。図６の実施例では、正常状態１５０およびチェック状態１５２が設けられる。
【００９６】
分割ライン条件の検出前、分割移動検出ユニット１０２は正常状態１５０にある。正常状態１５０で、分割移動検出ユニット１０２は、ステップ１１０、１１２、１１４、１１６、１２４および１２６を実施する。ベースポインタからスタックポインタへの転送が検出されない場合、分割移動検出ユニット１０２は状態１５０に留まる（アーク１５４）。他方、ベースポインタからスタックポインタへの転送が検出されれば、分割移動検出ユニット１０２は状態１５２に移る（アーク１５６）。加えて、スタックポインタおよびベースポインタリネームタグがスワップされる。
【００９７】
チェック状態１５２で、分割移動検出ユニット１０２は、ステップ１１８および１２０を実行する（適切な応答をステップ１１８から受けた際）。タグのスワッピング後、スタックポインタレジスタがペンディングならば、分割移動検出ユニット１０２は状態１５２に留まる（アーク１６０）。加えて、後続命令がストールされる。スタックポインタレジスタが有効であれば、分割移動検出ユニット１０２は正常状態１５０に移る（アーク１５８）。
【００９８】
次に図７を参照して、フューチャファイルリネームタグユニット７６が保持するリネームタグおよび転送命令の検出時に行なうこれらのスワッピングを表わした例が示される。リネームレジスタ２２を示すスタックポインタレジスタ（参照番号１３０）およびリネームレジスタ２８を示すベースポインタレジスタ（参照番号１３２）に対応するリネームタグの初期状態が示されている。ベースポインタからスタックポインタへの転送命令が検出され（参照番号１３４）、命令のデスティネーションレジスタに割当てられたリネームレジスタはリネームレジスタ５である。
【００９９】
転送命令のディスパッチに続き、スタックポインタ（参照番号１３６）に対応するリネームタグはリネームレジスタ２８を示す（すなわち以前にベースポインタレジスタに割当てられたリネームレジスタ）。加えて、転送命令のディスパッチ後ベースポインタに対応するリネームタグ（参照番号１３８）はリネームレジスタ５を示す。
【０１００】
図７の例は、ルックアヘッドスタックポインタ値の発生を加速するための、このタグスワッピング方法の利点の１つも示している。リネームレジスタ５はペンディングである（転送命令実行までペンディングである）が、リネームレジスタ２８は有効である。したがって、スタックポインタレジスタに対応するルックアヘッド値を、リネームレジスタファイル３０内のリネームレジスタ２８を読出すことによって、迅速に回復できる。
【０１０１】
図７には、ＭＯＶ  ＥＳＰ，ＥＢＰ命令に応答してスケジューラに送られる転送命令も示される。この命令はＭＯＶ５，２８（すなわちリネームレジスタ２８内の値のリネームレジスタ５への転送）である。したがって、転送命令を実行すると、ベースポインタレジスタに割当てられたリネームレジスタは更新され、ペンディング表示はリセットされる。
【０１０２】
次に図８を参照して、フューチャファイルリネームタグユニット７６が保持するリネームタグおよび転送命令の検出時のこれらのスワッピングを表わす別の例が示される。リネームレジスタ２２を示すスタックポインタレジスタ（参照番号１３０）およびリネームレジスタ２８を示すベースポインタレジスタ（参照番号１３２）に対応するリネームタグの初期状態が示される。スタックポインタからベースポインタへの転送命令が検出され（参照番号１４０）、命令のデスティネーションレジスタに割当てられたリネームレジスタはリネームレジスタ５である。
【０１０３】
転送命令のディスパッチ後、ベースポインタ（参照番号１４４）に対応するリネームタグはリネームレジスタ２２を示す（すなわち以前にスタックポインタレジスタに割当てられたリネームレジスタ）。加えて、転送命令のディスパッチ後スタックポインタに対応するリネームタグ（参照番号１４２）は、リネームレジスタ５を示す。
【０１０４】
図８に示した例は、スタックポインタレジスタが現在ペンディングであることを示しているが、スタックポインタレジスタのルックアヘッドコピーは有効なままである。したがって、命令ディスパッチおよびスタックポインタレジスタのルックアヘッドコピーは引続き発生する。言い換えれば、分割移動検出ユニット１０２は、スタックポインタからベースポインタへの転送命令のためにタグスワップを実行するときにはＥＳＰペンディング信号を無視する。
【０１０５】
図８には、ＭＯＶ  ＥＢＰ，ＥＳＰ命令に応答してスケジューラに運ばれる転送命令も示される。この命令はＭＯＶ  ５，２２（すなわちリネームレジスタ２２内の値のリネームレジスタ５への転送）である。したがって、この転送命令を実行すると、スタックポインタレジスタに割当てられたリネームレジスタは更新され、ペンディング表示はリセットされる。
【０１０６】
なお、図７および８の例は、ベースポインタレジスタおよびスタックポインタレジスタ対し１つのリネームタグを示しているが、実施例によっては各レジスタに対し複数のタグを用いてもよい。その場合、レジスタの一部は更新され他の部分は一定のままである（たとえばｘ８６マイクロプロセッサアーキテクチャにおけるＥＳＰおよびＳＰまたはＥＢＰおよびＤＰ）。
【０１０７】
次に図９を参照して、命令キュー２０の実施例のブロック図が示される。他の実施例が可能であり意図される。図９の実施例で、命令キュー２０は、ラン記憶部３００Ａ−３００Ｂ、スキャンデータ記憶部３０２Ａ−３０２Ｂおよびアドレス記憶部３０４Ａ−３０４Ｂを含む。加えて、命令キュー２０は、マルチプレクサ３０６および制御ユニット３０８を含む。命令のランが、ランバス３１０を介してフェッチ／スキャンユニット１８から命令キュー２０に与えられ、対応するスキャンデータがスキャンデータバス３１２で与えられ、対応するアドレス（１ランセクション当たり１つ）がランアドレスバス３１４で与えられる。命令キュー２０は、選択された１組の命令バイトを命令バイトバス３１６でアライメントユニット２２に与え、ポインタを命令ポインタバス３１８で命令バイト内の命令に与え、選択された１組の命令バイトを含むランセクションに対するアドレスをアドレスバス３２０で与える。ランバス３１０はラン記憶部３００Ａ−３００Ｂに結合され、スキャンデータバス３１２はスキャンデータ記憶部３０２Ａ−３０２Ｂに結合され、アドレス記憶部３０４Ａ−３０４Ｂはランアドレスバス３１４に結合される。記憶部３００Ａ−３００Ｂ、３０２Ａ−３０２Ｂおよび３０４Ａ−３０４Ｂはマルチプレクサ３０６に結合され、これはさらにバス３１６−３２０に結合される。制御ユニット３０８はマルチプレクサ３０６およびスキャンデータ記憶部３０２Ａ−３０２Ｂに結合される。
【０１０８】
フェッチ／スキャンユニット１８、より具体的には図２の実施例に従う命令スキャナ５６は、バス３１０−３１４を介し、命令キュー２０に、命令のランおよび関連情報を与える。制御ユニット３０８は、この命令ランを含む命令バイトに対してラン記憶部３００Ａ−３００Ｂのうちひとつを割当て、関連情報に対して対応するスキャンデータ記憶部３０２Ａ−３０２Ｂおよびアドレス記憶部３０４Ａ−３０４Ｂを割当てる。スキャンデータは、（ｉ）ランセクション内のオフセットとしてのスタートバイトおよびエンドバイト、ならびに（ii）命令の存在するランセクションを識別する命令ポインタを含む。ある特定の実施例に従うと、８バイトのランセクション内で５つまでの命令を識別でき、スキャンデータ記憶部３０２に格納された合計で１５までの命令ポインタに対するひとつのランに３つまでのランセクションがある。加えて、アドレス記憶部３０４は各ランセクションに対応するアドレスを格納する。
【０１０９】
制御ユニット３０８は、スキャンデータ記憶部３０２Ａ−３０２Ｂ内の命令ポインタを調べ、アライメントユニット２２にディスパッチするために、１組の連続するランセクション内の命令を識別する。ある特定の実施例では、４つまでの連続ランセクション内で６つまでの命令を識別する。ランセクションは、ラン記憶部３００Ａまたは３００Ｂの１つに格納され、または、いくつかのランセクションがラン記憶部３００Ａ−３００Ｂの一方から選択され、他のランセクションがラン記憶部３００Ａ−３００Ｂの他方から選択される。第１のランセクションは、第１のランセクションが投機的プログラム順で第２のランセクションの次であれば、第２のランセクションに連続する。なお、マルチプレクサ３０６は図１３で図面を簡単にするために１つのマルチプレクサとして示されているが、適切な並列または縦続接続されたマルチプレクサの組として実現してもよい。
【０１１０】
制御ユニット３０８は、１組の選択信号をマルチプレクサ３０６に与えて、選択された命令を含むランセクションの組および選択された命令に対応する命令ポインタを選択する。加えて、選択された各ランセクションに対するアドレスが選択される。ランセクションは命令バイトバス３１６上に出力され、対応する命令ポインタおよびアドレスはそれぞれ命令ポインタバス３１８およびアドレスバス３２０上に出力される。
【０１１１】
図１０を参照して、バスブリッジ２０２を通して種々のシステム構成要素に結合されるプロセッサ１０を含むコンピュータシステム２００の一実施例のブロック図が示される。他の実施例が可能であり意図される。図示のシステムでは、メインメモリ２０４がメモリバス２０６を通してバスブリッジ２０２に結合され、グラフィックスコントローラ２０８がＡＧＰバス２１０を通してバスブリッジ２０２に結合される。最後に、複数のＰＣＩデバイス２１２Ａ−２１２ＢがＰＣＩバス２１４を通してバスブリッジ２０２に結合される。セカンダリバスブリッジ２１６をさらに設け、ＥＩＳＡ／ＩＳＡバス２２０を通して１以上のＥＩＳＡまたはＩＳＡデバイス２１８への電気的インターフェイスとしてもよい。
【０１１２】
バスブリッジ２０２は、プロセッサ１０、メインメモリ２０４、グラフィックスコントローラ２０８およびＰＣＩバス２１４に結びつけられたデバイス間のインターフェイスを提供する。バスブリッジ２０２に接続されたデバイスの１つからのオペレーションを受けると、バスブリッジ２０２はそのオペレーションのターゲットを識別する（たとえば特定のデバイス、またはＰＣＩバス２１４の場合、ターゲットはＰＣＩバス２１４上にある）。バスブリッジ２０２は、このオペレーションをターゲットデバイスに送る。バスブリッジ２０２は一般に、オペレーションを、ソースデバイスまたはバスが用いるプロトコルから、ターゲットデバイスまたはバスが用いるプロトコルに変換する。
【０１１３】
ＰＣＩバス２１４のためのＩＳＡ／ＥＩＳＡバスへのインターフェイスを提供することに加え、セカンダリバスブリッジ２１６はさらに、所望のさらなる機能性を組込んでいる。たとえば、ある実施例では、セカンダリバスブリッジ２１６は、ＰＣＩバス２１４の所有権を調停するためのマスタＰＣＩアービタ（図示せず）を含む。第２のバスブリッジ２１６の外部またはこれと一体化される入／出力コントローラ（図示せず）もコンピュータシステム２００内に含まれ、所望に応じキーボードおよびマウス２２２ならびに種々のシリアルおよびパラレルポートに対し動作上のサポートを提供してもよい。他の実施例では、外部キャッシュユニット（図示せず）をさらにプロセッサ１０とバスブリッジ２０２との間でバスインターフェイス４６に結合してもよい。その代わりに、外部キャッシュをバスブリッジ２０２およびキャッシュ制御論理に結合してもよい。なぜなら外部キャッシュはバスブリッジ２０２と一体化できるからである。
【０１１４】
メインメモリ２０４はアプリケーションプログラムが格納されるメモリであり、プロセッサ１０は主にここから実行する。ある適切なメインメモリ２０４は、ＤＲＡＭ（ダイナミックランダムアクセスメモリ）を含み、好ましくはＳＤＲＡＭ（シンクロナスＤＲＡＭ）の複数のバンクを含む。
【０１１５】
ＰＣＩデバイス２１２Ａ−２１２Ｂは、例としてネットワークインターフェイスカード、ビデオアクセレレータ、オーディオカード、ハードもしくはフロッピイディスクドライブまたはドライブコントローラ、ＳＣＳＩ（スモールコンピュータシステムインターフェイス）アダプタ、およびテレフォニーカードといった、種々の周辺装置を表わしたものである。同様に、ＩＳＡデバイス２１８は、モデム、サウンドカード、およびＧＰＩＢまたはフィールドバスインターフェイスカードといった種々のデータ取得カードなどの、種々のタイプの周辺装置を表わしたものである。
【０１１６】
グラフィックスコントローラ２０８を設けて、ディスプレイ２２６上のテキストおよび画像のレンダリングを制御する。グラフィックスコントローラ２０８は、当該技術で一般に知られている典型的なグラフィックスアクセラレータを実現し、メインメモリ２０４にまたメインメモリ２０４から効果的にシフトできる３次元データ構造をレンダリングする。したがって、グラフィックスコントローラ２０８は、ＡＧＰバス２１０のマスタであり、バスブリッジ２０２内のターゲットインターフェイスへのアクセスを要求しかつこれを受け、メインメモリ２０４へのアクセスを得ることができる。専用グラフィックスバスは、メインメモリ２０４からの高速データ検索に対処する。オペレーションによっては、グラフィックスコントローラ２０８をさらに、ＡＧＰバス２１０上のＰＣＩプロトコルトランザクションを発生するように構成する。バスブリッジ２０２のＡＧＰインターフェイスはしたがって、ＡＧＰプロトコルトランザクションならびにＰＣＩプロトコルターゲットおよびイニシエータトランザクションをサポートする機能を含む。ディスプレイ２２６は画像またはテキストを提示できる何らかの電子表示装置である。適切なディスプレイ２２６としては、陰極線管（「ＣＲＴ」）、液晶ディスプレイ（「ＬＣＤ」）などがある。
【０１１７】
なお、上記の説明ではＡＧＰ、ＰＣＩおよびＩＳＡまたはＥＩＳＡバスを例として用いているが、所望に応じてどのようなバスアーキテクチャと置き換えてもよい。なお、さらに、コンピュータシステム２００はさらなるプロセッサ（たとえばコンピュータシステム２００の任意構成要素として示されるプロセッサ１０ａ）を含む多重処理コンピュータシステムでもよい。プロセッサ１０ａはプロセッサ１０と同様でもよい。より具体的には、プロセッサ１０ａはプロセッサ１０の同一コピーでもよい。プロセッサ１０ａはプロセッサ１０とバスインターフェイス４６を共有してもよく（図９に示す）、または、独立バスを介してバスブリッジ２０２に接続されてもよい。
【０１１８】
なお、上記の開示では、スタックポインタレジスタおよびベースポインタレジスタをそれぞれｘ８６命令セットアーキテクチャで規定されるＥＳＰレジスタおよびＥＢＰレジスタと呼んでいる部分があるが、本発明はこのアーキテクチャに限定されない。たとえば、他のアーキテクチャは明示スタックポインタおよび／またはベースポインタレジスタを含まないことがあるが、ソフトウェアの設計によりスタックポインタレジスタとして特定の汎用レジスタを用いてもよい。同様に、別の汎用レジスタをソフトウェアによりベースポインタレジスタとして用いてもよい。他の命令セットアーキテクチャおよび上記の方法で設計されたソフトウェアを用いるプロセッサは、本発明に従う利点をもたらすであろう。さらに、この実施例では、スタックポインタおよびベースポインタレジスタ間の転送を検出してリネームタグスワッピングを実施しているが、意図する種々の実施例においていかなる２つのレジスタ間の転送を検出してもよく、リネームタグスワッピングをそれに応じて行なってもよい。
【０１１９】
上記の開示に従うと、開示されているプロセッサは、リネームタグ制御ユニット内のソースおよびデスティネーションレジスタに対応するリネームタグのスワッピングにより、転送命令を加速する。転送のデスティネーションが後続命令のソースの場合、後続命令が加速される。こうしてプロセッサの性能が向上する。ある具体的な実施例では、ベースポインタレジスタからスタックポインタレジスタへの（およびこの逆の）転送が加速される。プロセッサは、スタックポインタのためのルックアヘッド値を発生しようとし、スタックポインタへの転送の加速により、ルックアヘッド値の発生を高速化する。
【図面の簡単な説明】
【図１】  プロセッサのある実施例のブロック図である。
【図２】  図１に示したフェッチ／スキャンユニットのある実施例のブロック図である。
【図３】  図２に示したリネーム／スケジュールユニットのある実施例のブロック図である。
【図４】  図３に示したＥＳＰルックアヘッドユニットのある実施例のブロック図である。
【図５】  図４に示した分割移動検出ユニットのある実施例の動作を示すフローチャートである。
【図６】  図４に示した分割移動検出ユニットのある実施例で用いるステートマシンである。
【図７】  リネームタグスワッピングの第１の例である。
【図８】  リネームタグスワッピングの第２の例である。
【図９】  図１に示した命令キューのある実施例のブロック図である。
【図１０】  図１に示したプロセッサを含むコンピュータシステムのある実施例のブロック図である。
【図１】
0003977015.tif 000004
【図２】
0003977015.tif 000005
【図３】
0003977015.tif 000006
【図４】
0003977015.tif 000007
【図５】
0003977015.tif 000008
【図６】
0003977015.tif 000009
【図７】
0003977015.tif 000010
【図８】
0003977015.tif 000011
【図９】
0003977015.tif 000012
【図１０】
0003977015.tif 000013