(57)【要約】リンクアドレスがリンクスタックに書き込まれるときにはいつでも、リンクスタックエントリの前の値が保存され、誤予測分岐に続いてリンクスタックプッシュオペレーションが投機的に実行された後で、リンクスタックに復元される。この状態は、パイプラインにおけるコミットされていないリンクスタック書き込み命令の合計数のカウントと、各分岐命令の前のコミットされていないリンクスタック書き込み命令の数のカウントと、を保持することによって検出される。分岐が誤予測したと評価され決定されるときには、それに関連づけられたカウントは、合計カウントと比較される。不一致は、誤予測された分岐命令の後でリンクスタック書き込み命令がパイプラインへと投機的に発行され、リンクスタック上へとリンクアドレスをプッシュされたことを示す。プライアリンクアドレスは、リンクスタック復元バッファから、リンクスタックに復元される。
2010541106.tif 000002
【特許請求の範囲】
【請求項１】
それぞれがリンクアドレスを保存するように動作可能である複数のエントリ、を備えているリンクスタックを管理する方法であって、
リンクスタックエントリに任意の新しいリンクアドレスを書き込むときに、前記リンクスタックエントリの前の値を保存することと、
分岐命令の前記分岐評価を予測することと、
前記予測に応じて、命令を投機的に実行することと、
前記分岐評価は誤予測されたということを検出し、前記リンクスタックは投機的に書き込まれたということを検出することと、
前記リンクスタックに前記保存された値を復元することと、
を備えている方法。
【請求項２】
前記リンクスタックが投機的に書き込まれたということを検出することは、
前記パイプラインにおいてコミットされていないリンクスタック書き込み命令の合計数のカウントを保持することと、
各コミットされていない分岐命令に関連づけられた、前記パイプラインにおけるそれの前の前記コミットされていないリンクスタック書き込み命令のカウント、を保持することと、
分岐が誤予測されたということを検出するとき、前記分岐命令に関連づけられたカウントと合計カウントを比較し、前記カウントが同じでない場合にはリンクスタックが投機的に書き込まれたということを検出することと、
を備える請求項１に記載の方法。
【請求項３】
前記パイプラインにおいてコミットされていないリンクスタック書き込み命令の合計数のカウントを保持することは、
リンクスタック書き込み命令を復号するときにアップ／ダウンカウンタをインクリメントすることと、
リンクスタック書き込み命令が実行をコミットするときには、前記アップ／ダウンカウンタをデクリメントすることと、
を備えている、
請求項２に記載の方法。
【請求項４】
各コミットされていない分岐命令に関連づけられた、前記パイプラインにおけるそれの前の前記コミットされていないリンクスタック書き込み命令のカウント、を保持することとは、
前記分岐命令を復号するときに前記分岐命令に関連づけられたカウンタに前記アップ／ダウンカウンタの値をコピーすることと、
リンクスタック書き込み命令が実行をコミットするときには前記カウンタをデクリメントすることと、
を備えている、
請求項３に記載の方法。
【請求項５】
前記分岐命令に関連づけられた前記カウンタは、前記分岐命令に関連づけられた分岐命令キューエントリにおけるフィールドである、請求項４に記載の方法。
【請求項６】
前記前の値と共に新しく書き込まれたリンクスタックエントリの前記リンクスタックインデクスを保存すること、をさらに備えており、前記リンクスタックに前記保存された値を復元することは、前記保存されたリンクスタックインデクスにおいて前記リンクスタックエントリに前記値を復元することを備えている、請求項１に記載の方法。
【請求項７】
前記リンクスタックが投機的に読み取られたということを検出すること、をさらに備えており、前記リンクスタックに前記保存された値を復元することは、前記リンクスタックが投機的に読み取られ且つ投機的に書き込まれた場合にのみ、前記リンクスタックに前記保存された値を復元することを備える、請求項１に記載の方法。
【請求項８】
前記リンクスタックに前記保存された値を保存することは、前記リンクスタックが投機的に書き込まれる前に投機的に読み取られた場合にのみ、前記リンクスタックに前記保存された値を復元することを備えている、請求項７に記載の方法。
【請求項９】
命令実行パイプラインと、
それぞれがリンクアドレスを保存するように動作可能である複数のエントリ、を備えているリンクスタックと、
任意のリンクスタックエントリが新しいリンクアドレスで上書きされているときにリンクスタックエントリの前の値を保存するように動作可能な、また、それを置き換えた前記リンクスタック書き込みが投機的で誤りであるという検出のときに、前記リンクスタックエントリに前記前の値を復元するように動作可能な、リンクスタック復元バッファと、
前記リンクスタックへの誤りの、投機的な書き込みを検出するように動作可能なリンクスタックモニタ回路と、
を備えるプロセッサ。
【請求項１０】
前記リンクスタックモニタ回路は、誤予測された分岐命令にしたがった前記パイプラインにおいて１つまたは複数のリンクスタック書き込み命令を検出することによって、前記リンクスタックへの誤りの、投機的な書き込みを検出するように動作可能である、請求項９に記載のプロセッサ。
【請求項１１】
前記リンクスタックモニタ回路は、前記パイプラインにおける誤予測された分岐命令の前の前記コミットされていないリンクスタック書き込み命令のカウントと、前記パイプラインにおけるコミットされていないリンクスタック書き込み命令の合計数のカウントと、を比較することによって、誤予測分岐命令にしたがった前記パイプラインにおいて１つまたは複数のリンクスタック書き込み命令を検出するように動作可能である、請求項１０に記載のプロセッサ。
【請求項１２】
前記パイプラインにおいてコミットされていないリンク書き込み命令の合計数のカウントは、リンクスタック書き込み命令が復号されるときにインクリメントし、リンクスタック書き込み命令が実行をコミットするときにデクリメントする、アップ／ダウンカウンタの値である、請求項１１に記載のプロセッサ。
【請求項１３】
前記パイプラインにおける誤予測された分岐命令の前の前記コミットされていないリンクスタック書き込み命令のカウントは、前記分岐命令が復号されるときには前記アップ／ダウンカウンタの前記値に初期化しリンクスタック書き込み命令が実行をコミットするときにはデクリメントする、分岐命令に関連づけられたカウンタの値であり、前記分岐命令は、誤予測されたと評価される、請求項１２に記載のプロセッサ。
【請求項１４】
プロセッサであって、
命令実行パイプラインと；
それぞれがリンクアドレスを保存するように動作可能である複数のエントリ、を備えているリンクスタックと；
任意のリンクスタックエントリが新しいリンクアドレスで上書きされているときにリンクスタックエントリの前の値を保存するように動作可能で、それを置き換えた前記リンクスタック書き込みが投機的で誤りであったという検出のときに前記リンクスタックエントリに前記前の値を復元するように動作可能な、リンクスタック復元バッファと；
リンクスタック書き込み命令を復号するときにインクリメントし、リンクスタック書き込み命令が実行をコミットしているときにデクリメントすることによって、前記パイプラインにおいてコミットされていないリンクスタック書き込み命令のカウントを保持するように動作可能なアップ／ダウンカウンタと；
前記パイプラインにおいて各コミットされていない分岐命令に関連づけられたカウンタと、なお、前記カウンタは、分岐命令を復号するときに前記アップ／ダウンカウンタ値に初期化し、リンクスタック書き込み命令が実行にコミットするときにデクリメントすることによって、前記パイプラインにおける前記分岐命令の前のコミットされていないリンクスタック書き込み命令のカウントを保持するように動作可能である；
前記アップ／ダウンカウンタ値と誤予測された分岐命令に関連づけられた前記カウンタの前記値とを比較することによって、誤りの、投機的なリンクスタック書き込みオペレーションを検出するように動作可能な比較器と；
を備えるプロセッサ。
【請求項１５】
前記リンクスタック復元バッファは、前記上書きされたエントリの前記リンクスタックインデクスを保存するように動作可能である、請求項１４に記載のプロセッサ。
【請求項１６】
前記リンクスタック復元バッファは、単独のエントリを備えている、請求項１４に記載のプロセッサ。
【請求項１７】
前記比較器は、ビットワイズＸＯＲ及び縮小ＡＮＤ関数をインプリメントする、請求項１４に記載のプロセッサ。
【請求項１８】
前記パイプラインにおいて各コミットされていない分岐命令に関連づけられた前記カウンタは、分岐命令キューにおいてカウントフィールドを備えている、請求項１４に記載のプロセッサ。
【発明の詳細な説明】
【背景】
【０００１】
本発明は、一般にプロセッサの分野に関し、より具体的には、投機的命令実行(speculative instruction execution)によって破損されたリンクスタックを修復するためのシステム及び方法に関する。
【０００２】
現代のソフトウェアは、本質的にモジュラー方式(modular)であり、特定の機能がサブルーチンにおいてインプリメントされている。サブルーチン呼び出し及びリターン(subroutine calls and returns)を効率的にインプリメントするために、多くの現代のプロセッサは、リンクスタックをインプリメントする（あるいはエミュレートする）回路を利用する。リンクスタック(link stack)は、ハードウェアにのみ見え、プログラマに直接アクセス可能でない、リンクアドレスを保存するための論理構造である。分岐及びリンク命令のような、サブルーチンを呼び出す（へ分岐する）命令は、リンクスタック上へと次の命令のアドレスを「プッシュする(pushes)」。サブルーチンにおいてリターンタイプ命令(a return-type instruction)に出くわすとき、リンクスタックは、サブルーチン呼び出しを作る１つにしたがって命令のアドレスをもたらすために「ポップされる(popped)」。サブルーチンが他のサブルーチンを呼び出すとき、リンクアドレスは、リンクスタック上へと連続的にプッシュされ、サブルーチンが実行とリターンを完了するときにポップされる。
【０００３】
最新プロセッサは、パイプライン化されたアーキテクチャ(pipelined architecture)を利用しており、そこでは、それぞれがマルチプル実行ステップを有しているシーケンシャル命令(sequential instructions)は、実行中にオーバラップされる。最大の性能のために、命令は、パイプラインを通して連続的に流れるべきである。命令にパイプラインにおいてストールさせるいずれの状況も性能に不利益な影響を及ぼす。
【０００４】
実質的には、すべての実社会プログラム(real-world programs)は、条件付きの分岐命令(conditional branch instructions)を含んでおり、その実際の分岐態度(actual branching behavior)は、命令がパイプラインにおいて深く評価されるまで、知られていない。各分岐命令の実際の評価を待機することから生じるパイプラインストールを回避するために、多くの最新プロセッサは、分岐予測のいくつかの形態を利用しており、それにより、条件付き分岐命令の分岐態度は、パイプラインの初期に予測される。予測された分岐評価に基づいて、プロセッサは、予測されたアドレス−分岐ターゲットアドレス（分岐が成立と予測される場合）あるいは分岐命令の後の次のシーケンシャルアドレス（分岐が不成立と予測される場合）のいずれか−から命令を投機的にフェッチし、実行する。実際の分岐態度が決定されるときに、分岐が誤予測された場合には、投機的にフェッチされた命令は、パイプラインからフラッシュされ、新しい命令は、正しい次のアドレスからフェッチされる。誤予測された分岐は、性能と電力消費量の両方に不利な影響を与える。
【０００５】
誤予測された分岐の別の結果は、リンクスタックの破損(corruption of the link stack)でありうる。誤予測された分岐に続き、投機的に実行された命令がサブルーチンリターンおよび連続呼び出しを含む場合には、有効なリンクアドレスは、リンクスタックからポップされ、新しいリンクアドレスはスタック上へとプッシュされる。リンクスタックハードウェアインプリメンテーションに依存しており、スタックをポップさせることはリードポインタを単に動かすにすぎないので、リンクスタックを誤りでポップさせること自体は不利な結果を有さない可能性があり、データはリンクスタックバッファに残る。しかしながら、リンクスタック上へと新しい値を連続的に誤ってプッシュすることは、前の値(previous value)に上書きしうる。分岐誤予測が検出され、適切な命令ストリームがフェッチされ、実行されるときに、リンクスタックの破損が検出されず修復されない場合には、サブルーチンリターンは、間違った位置(wrong location)へと制御を移す(transfer)だろう。
【０００６】
リンクスタックの破損を回避する１つの方法は、投機的命令によってリンクスタック更新を許可しないことである。例えば、すべての条件分岐が解決されるまで、リンクスタック更新は延期されうる。このことは、分岐評価がパイプライン深くに実行パイプステージにおいて生じるので、リンクスタック更新をパイプラインへと深く効率的に動かすであろう。しかしながら、このことは、それらの、リンクスタック機能の使用を効果的に否定することによって、短いサブルーチンについての性能に不利益に影響するであろう。したがって、リンクスタックハードウェアから最大性能を得るために、リンクスタックは、復号パイプステージでのような、パイプラインの初期に好ましくは初期に更新される。
【０００７】
分岐誤予測に帰因するプロセッサリソース（例、レジスターリネーミングバッファ及び同様なもの）の破損を防ぐ(guarding)１つの知られたアプローチは、パラレルの、リソースの「コミットされた」コピー(a parallel, "committed" copy of the resource)を保持することである。その状態を変更する命令が実行をコミットする(commit for execution)ときのみ、コミットされたコピーは更新される。命令が実行することを完了することを妨げる危険が存在しないことが確認されるとき、命令はそれ自体の実行を確認する。例えば、算術あるいは論理オペレーションをインプリメントする命令は、そのオペランドのすべてが利用可能である（すなわち、それらが他の命令によって計算されている、あるいは、メモリから成功裡に検索されている）ときに、実行を承認することができる。命令は、パイプラインにおけるそれ及びそれの前にある全ての命令が確認されるとき、実行をコミットする。
【０００８】
分岐誤予測に帰因する破損を回避するために、プロセッサリソースのワーキングコピーの状態(state of a working copy of a processor resource)は、命令のルーチン実行の間に、進行中ベースで変更されるが、プロセッサリソースのコミットされたコピーの状態は、実行をコミットした命令によってのみ変更される。分岐誤予測が検出されるとき、プロセッサリソースのコミットされたコピーは、ワーキングコピーに対しコピーされ、ワーキングコピーのコンテンツと置き換える。この技術は、いずれ命令の投機的実行の前に、それが有していた状態でワーキングコピーを置く。
【０００９】
リンクスタック破損問題に対してこのアプローチを利用することは可能である。ワーキングリンクスタックは、サブルーチン呼び出し及びリターンをインプリメントする、パイプラインにおける命令によって更新されるだろう。コミットされたリンクスタックは、実行をコミットしたサブルーチン呼び出し及びリターン命令によってのみ、更新される。分岐誤予測を発見するとき、リンクスタックのコミットされたコピーは、ワーキングリンクスタックとなるように単にコピーされるだろう。しかしながら、このアプローチはシリコンエリア(silicon area)と電力消費の両方の点からコストが大きい(costly)。リンクスタックを複製すること(Replicating)は、リンクスタックを管理するのに必要な制御論理と共に、それをインプリメントするレジスタあるいは他のメモリ構造を複製すること(duplicating)を必要とする。余分なハードウェアは、貴重な集積回路エリアを使用し(occupies)、ワイヤリング混雑(wiring congestion)を増大させ、そして、クロック及び配電(clock and power distribution)を複雑にする。２つの完全なリンクスタックを連続的に更新することは、名目上は、１つのリンクスタックのみを実行する電力の２倍を消費する。特に、モバイル電子デバイスで展開されるプロセッサにおいて、電力消費を最小にすることは、電池寿命を節約し、熱損失(heat dissipation)を低減するのに重要である。
【発明の概要】
【００１０】
ここにおいて開示され特許請求された１つまたは複数の実施形態によると、リンクスタックの破損は、検出され、効率的に修復される。リンクアドレスがリンクスタックに書き込まれるときにはいつでも、リンクスタックエントリの前の値(prior value of the link stack entry)は、リンクスタック復元バッファ(link stack restore buffer)において保存される。誤りリンクスタックプッシュオペレーションが検出されるとき、この値はリンクスタックに復元される(restored)。誤りリンクスタックプッシュオペレーションは、誤予測された分岐に続いて、投機的に実行されるものである。この状態は、パイプラインにおけるコミットされていないリンクスタック書き込み命令の合計数のカウント(a count of the total number of uncommitted link stack write instructions in the pipeline)と、各分岐命令の前のコミットされていないリンクスタック書き込み命令の数のカウント(a count of the number of uncommitted link stack write instructions ahead of each branch instruction)と、を保持することによって、検出される。分岐が誤予測されたと評価され決定されるとき、それに関連づけられたカウントは、合計カウントと比較される。不一致(discrepancy)は、リンクスタック書き込み命令が誤予測された分岐命令の後でパイプラインへと投機的に発行され、リンクスタック上へとリンクアドレスをプッシュされることを示す。この場合、プライアリンクアドレスは、リンクスタック復元バッファから、リンクスタックに復元される。
【００１１】
一実施形態は、それぞれがリンクアドレスを保存するように動作可能である複数のエントリを備えているリンクスタックを管理する方法に関する。リンクスタックに任意の新しいリンクアドレスを書き込むとき、リンクスタックエントリの前の値が保存される。分岐命令の分岐評価が予測される。予測に応じて、命令は、投機的に実行される。分岐評価は、誤予測したと決定される。リンクスタックは、投機的に書き込まれたと決定される。その保存された値は、リンクスタックに復元される。
【００１２】
別の実施形態はプロセッサに関する。プロセッサは、命令実行パイプラインとそれぞれがリンクアドレスを保存するように動作可能である複数のエントリを備えているリンクスタックを含む。プロセッサは、任意のリンクスタックエントリが新しいリンクアドレスで上書きされているときにリンクスタックエントリの前の値を保存するように動作可能で、それを置き換えた(displaced)リンクスタック書き込みが投機的で誤りであったという検出のときにリンクスタックエントリに対し前の値を保存するように動作可能な、リンクスタック復元バッファをさらに含む。プロセッサはまた、リンクスタックへの、誤りの、投機的書き込み(erroneous, speculative writes to the link stack)を検出するように動作可能なリンクスタックモニタ回路を含む。
【００１３】
また、別の実施形態はプロセッサに関する。プロセッサは、命令実行パイプラインとリンクアドレスを保存するように動作可能である複数のエントリを備えているリンクを含む。プロセッサは、任意のリンクスタックエントリが新しいリンクアドレスで上書きされているときにリンクスタックエントリの前の値を保存するように動作可能で、それを置き換えたリンクスタック書き込みが投機的で誤りであったという検出のときにリンクスタックエントリに対し前の値を保存するように動作可能な、リンクスタック復元バッファをさらに含む。プロセッサは、リンクスタック書き込み命令を復号するときにインクリメントし、リンクスタック書き込み命令が実行にコミットするときにデクリメントすることによって、パイプラインにおけるコミットされていないリンクスタック書き込み命令のカウントを保持するように動作可能なアップ／ダウンカウンタもまた含む。プロセッサは、パイプラインにおける各コミットされていない分岐命令に関連づけられたカウンタ、をさらに含んでおり、なお、カウンタは、分岐命令を復号するときにアップ／ダウンカウンタ値に初期化し、リンクスタック書き込み命令が実行にコミットするときにデクリメントすることによって、パイプラインにおける分岐命令の前のコミットされていないスタック書き込み命令のカウントを保持するように動作可能である。プロセッサは、アップ／ダウンカウンタ値と誤予測された分岐命令に関連づけられたカウンタの値とを比較することによって、誤りの投機的なリンクスタック書き込みオペレーションを検出するように動作可能な比較器をさらに含む。
【図面の簡単な説明】
【００１４】
【図１】図１は、プロセッサの機能ブロックブロック図である。
【図２】図２は、プロセッサの選択された部分の機能ブロックブロック図である。
【図３】図３は、コードフロー図である。
【図４】図４は、リンクスタック管理の方法のフロー図である。
【詳細な説明】
【００１５】
図１は、分岐誤予測に帰因するリンクスタックの破損を効率的に修復する回路を含んでいるプロセッサ１０の機能ブロック図を図示する。プロセッサ１０は、制御論理１ １にしたがって、命令実行パイプライン１２において、命令を実行する。パイプライン１２は、マルチプルパラレル実行パイプライン１４及び１６を備えた、スーパースカラー設計(superscalar design)であってもよい。パイプライン１２は、算術論理ユニット（ＡＬＵ）（図示されず）のような論理的で計算の回路(logical and computational circuits)に加えて、パイプステージで組織化された、様々なレジスタあるいはラッチ(latches)１８を含む。汎用レジスタ(general purpose register)（ＧＰＲ）ファイル２０は、メモリ階層のトップを備えているレジスタを提供する。パイプライン１２をサポートしている他のプロセッサリソースは、リンクスタック２２、リンクスタック復元バッファ(link stack restoration buffer)（ＬＳＲＢ）２３、分岐予測回路２４、及び分岐情報キュー(branch information queue)（ＢＩＱ）２５であり、そのオペレーションは、ここにおいて詳説されている。
【００１６】
パイプライン１２は、命令キャッシュ（Ｉ−Ｃａｃｈｅあるいは１＄）２６から命令をフェッチし、メモリアドレッシング及び許可(memory addressing and permissions)は、命令−サイド変換ルックアサイドバッファ(instruction-side translation lookaside buffer)（ＩＴＬＢ）２８によって管理される。データは、データキャッシュ（Ｄ−ＣａｃｈｅあるいはＤ＄）３０からアクセスされ、メモリアドレッシング及び許可は、メイン変換ルックアサイドバッファ（ＴＬＢ）３２によって管理される。様々な実施形態において、ＩＴＬＢ２８は、ＴＬＢ３２の一部分のコピーを備えることができる。あるいは、ＩＴＬＢ２８及びＴＬＢ３２は組み込まれることができる。いくつかの実施形態においては、専用データサイドＴＬＢ、すなわちＤＴＬＢ（図示されず）は、ＩＴＬＢ２８と完全に離れていてもよい。同様に、プロセッサ１０の様々な実施形態においては、Ｉ−ｃａｃｈｅ２６およびＤ−ｃａｃｈｅ３０は、統一されてもよい。
【００１７】
Ｉ−ｃａｃｈｅ２６及び／またはＤ−ｃａｃｈｅ３０におけるミス(Misses)は、メモリインタフェース３６の制御の下（他のキャッシュは、図示されていないが、プロセッサ１０とメインメモリ３４との間で挿入される）、メイン（オフチップ）メモリ３４へのアクセスをもたらす。プロセッサ１０は、インプット／アウトプット（Ｉ／Ｏ）インターフェース３８を含むことができ、様々な周辺機器４０、４２へのアクセスを制御する。当業者は、プロセッサ１０の多数の変形が可能であるということを理解するであろう。例えば、プロセッサ１０は、Ｉキャッシュ２６、Ｄキャッシュ３０のいずれか、あるいは両方のために、第２レベル（Ｌ２）キャッシュを含むことができる。さらに、プロセッサ１０で図示された機能ブロックのうちの１つまたは複数は、特定の実施形態から省略されることができる。
【００１８】
図２は、誤予測された分岐から生じるリンクスタック２２の破損を修復する、リンクスタック復元バッファ２３のオペレーションを図示している機能ブロック図である。制御回路及び信号のような低レベルの詳細は、明瞭のために、図２から省略される。図示された実施形態では、リンクスタック２２は、当技術分野において知られているように、読み込み及び書き込みポインタをインクリメントしデクリメントすることによって、環状バッファとしてインプリメントされており、この場合では８つのレジスタを備えている。このインプリメンテーションは限定的ではなく、本発明の実施形態は、当技術分野において知られる、あるいはまだ発明されていない、任意のハードウェア構造を使用してインプリメントされるリンクスタック２２に有利に適用されることができる。
【００１９】
リンクスタック復元バッファ２３は、リンクスタックプッシュオペレーションによって上書きされた最後のリンクアドレスのコピーを保持する。すなわち、分岐及びリンク命令がリンクスタック２２にリンクアドレスを書き込むときに、対応リンクスタックエントリにおいて保存されるプライアアドレスは、リンクスタック復元バッファ２３に自動的に保存される。さらに、図示された実施形態では、リンクスタックインデクスは保存されるので、必要であれば、それが上書きされたリンクスタック２２の位置に、リンクアドレスは復元されることができる。図示された実施形態では、リンクスタック復元バッファ２３は、単独のレジスタを備える。しかしながら、本発明はこの実施形態に制限されていない。他の実施形態では、特に、非常に深いパイプラインを有するプロセッサにおいては、リンクスタック復元バッファ２３は、マルチプルエントリを備えることができ、そして、必要とされればあるいは望まれれば、スタック、バッファ、あるいは他の論理構造として組織化されうる。
【００２０】
サブルーチン呼び出し（例、分岐及びリンク）命令がパイプライン１２で実行されるときに、リンクアドレスは、リンクスタック２２に書き込まれる。リンクアドレスは、図２で図示された実施形態にあるように、復号パイプステージのような、パイプライン１２の初期に好ましくは書き込まれる。このことは、短いサブルーチンが、リンクスタック２２ハードウェアを利用することを可能にする。しかしながら、他の実施形態では、特定のパイプライン１２に必要とされる、あるいは望まれるときに、リンクスタック２２は、任意のパイプステージにおいても書き込まれることができる。リンクスタック書き込み命令を含んでいる命令ストリームが分岐予測に応じて投機的にフェッチされる場合には、リンクスタック書き込みオペレーションが有効リンクアドレスを無効にする(override)ことができるということはありうる。したがって、プライアリンクアドレスは、新しい値がリンクスタック２２に書き込まれるとき、リンクスタック復元バッファ２３に保存される。分岐誤予測が検出されるとき、リンクスタック書き込みが誤っていたと決定される場合には、リンクスタック復元バッファ２３において保存された前の値は、上書きされた、リンクスタック２２に復元されることができる。
【００２１】
図３は、どのようにリンクスタック２２が誤予測された分岐に応じて破損されうるかを論証する、命令の仮説シーケンスを図示する。メインプログラムシーケンス（右）は、２つのロード（ＬＤ）命令、ＡＤＤ、保存（ＳＴ）、その後で、分岐及びリンク命令呼び出しサブルーチンＡ（ＢＬ  ＳＵＢ  Ａ）を実行する。これは、プログラムの流れを図示している実線の矢印で表されているような、適切なコードシーケンスである。ＢＬ  ＳＵＢ  Ａ命令は、リンクスタック上へと次のＬＤ命令のアドレスをプッシュし、サブルーチンＡに分岐し、そこでは、ＬＤ、ＡＤＤ、比較（ＣＭＰ）の命令が実行される。
【００２２】
パイプライン１２がサブルーチンＡのための命令をフェッチするときには、等しい場合には分岐する(branch if equal)(ＢＥＱ)命令が検出され、予測された分岐指示(predicted branch direction)と次のアドレスは、分岐予測回路５１において公式化される。この例において、分岐は、インデクス１の分岐ターゲットを用いて、成立と誤って予測される(is erroneously predicted taken)。命令は、プログラムの流れを図示している点線の矢印で示されているように、インデクス１で始まってフェッチされ、投機的に実行される。したがって、実行ストリームは、インデクス１でＬＤ命令に分岐し、リンクリターン命令ＢＸ  ＬＲ（サブルーチンＡからの第１の出口点である）へと第１の分岐を飛ばす。
【００２３】
ＬＤ、引き算（ＳＵＢ）、及びＳＴ命令は、投機的に実行され、ＢＸ ＬＲ命令は、リンクスタック２２の上でリンクアドレスに分岐し、読み取りポインタを動かすことによりリンクスタック２２をポップする。図２で図示されたリンクスタックの実施形態では、リンクスタック２２をポップさせることは、いずれのエントリも破損しない。すなわち、誤予測された分岐を検出するとき、リンクスタック２２の読み取りポインタは、そのプライアポジションに単にリセットされることができる。
【００２４】
投機的プログラム実行は、メインプログラムの流れに沿って継続し、ＬＤ、ＳＵＢ、およびＳＴ命令を実行する。サブルーチンＢへの呼び出しは、そのあとで、投機的に実行され、サブルーチンＢにおいてＬＤ命令に分岐し、リンクスタック２２上へと次のメインプログラムＡＤＤ命令のアドレスをプッシュする。リンクスタック２２のプッシュオペレーションは、リンクスタックエントリの前の値に上書きし、そしてそれは、初期のメインプログラムＬＤ命令のアドレスを含む。本発明の実施形態によると、ＡＤＤ命令のアドレスがリンクスタック２２上へとプッシュされるとき、ＬＤ命令のアドレスは、リンクスタック復元バッファ２３において保存される。投機的実行は、サブルーチンＢで継続し、２つのＬＤ命令及びＡＤＤを実行する。
【００２５】
この時点で、初期の、誤予測された分岐命令は、パイプライン１２を通じて進行しており(progressed)、実行パイプステージにおいて評価される。分岐誤予測が検出され、パイプライン１２は、誤予測された分岐命令（サブルーチンＡにおいてインデクス１に対するＢＥＱ）に従っているすべての命令がフラッシュされる(flushed)。リンクスタック２２に対する誤りプッシュオペレーションはまた検出されており（ここにおいてより詳細に説明されているように）、メインプログラムＬＤ命令のアドレスは、リンクスタック復元バッファ２３からリンクスタック２２における適切なエントリに書き込まれ（すなわち、リンクスタック復元バッファ２３において、リンクアドレスと共に、リンクスタックインデクスが保存される）、メインプログラムＡＤＤ命令の誤りアドレスに上書きする。リンクスタック２２の読み取り及び書き込みポインタはまた、リセットされ、誤予測された分岐命令にしたがった命令は、フェッチされ、実行される(すなわち、インデクス１に対するＢＥＱが続くＬＤ、で始まる(beginning with the LD following the BEQ to index 1))。ＬＤ及びＯＲＲの命令が実行された後で、リンクリターン命令に対する分岐は、メインプログラムにおいてＬＤ命令に分岐しており（破損されたリンクスタック２２がそれを指示したであろう、ＡＤＤではない）、適切な命令実行が継続する。
【００２６】
図２に戻って参照すると、各予測された分岐命令について、パイプライン１２におけるコミットされていないリンクスタック書き込み命令の合計数のカウントを、パイプライン１２における分岐命令の前のコミットされていないリンクスタック書き込み命令の数のカウントと比較することによって、リンクスタック２２への誤りの投機的な書き込みは検出される。これらの２つのカウントの不一致は、関連分岐命令の後ろで、−リンクスタック２２上へとリンクアドレスをプッシュした−リンクスタック書き込み命令を示す。その分岐命令が誤予測されたと決定される場合には、プッシュオペレーションは、投機的で且つ誤りであったと知られ、リンクスタック修理バッファ２３において保存されたリンクアドレスを復元することによって、修復されることができる。
【００２７】
分岐及びリンク構築のようなリンクスタック２２に書き込む命令がパイプライン１２において復号されるとき、リンクアドレスは、リンクスタック２２に書き込まれ、アップ／ダウンカウンタ５０はインクリメントされる。図２で図示された実施形態では、このことは、本発明がこのインプリメンテーションに限定されないにも関わらず、復号パイプステージで生じる。リンクスタック２２に書き込む各命令がパイプライン１２で実行をコミットするとき、アップ／ダウンカウンタ５０は、デクリメントされる。したがって、アップ／ダウンカウンタ５０の値は、パイプライン１２における命令の順序に関わらず、パイプライン１２における「フライト中(in-flight)」であるコミットされていないリンクスタック書き込み命令の数を示す。
【００２８】
分岐予測および投機的命令実行をサポートする多くのプロセッサは、分岐情報キュー(branch information queue)（ＢＩＱ）２５を含む。ＢＩＱ２５は、分岐予測、予測された分岐ターゲットアドレス、及び同様なもののようなフライト中分岐命令についての情報を保存する。ＢＩＱ２５における各エントリは、固有のコミットされていない（Ａｅ、フライト中）分岐命令に関連づけられている。本発明の１つまたは複数の実施形態によると、カウントフィールドは、各ＢＩＱ２５エントリにおいて定義されており、したがって各コミットされていない分岐命令に関連づけられている。分岐命令が復号パイプステージのような初期のパイプステージを残すとき、アップ／ダウンカウンタ５０の現在の値は、その分岐命令に関連づけられたＢＩＱエントリのカウントフィールドへとコピーされる。この値は、パイプライン１２におけるコミットされていないリンクスタック書き込み命令の数を表しており、したがって分岐命令の前である。ＢＩＱカウントフィールド値は、リンクスタック２２に書き込む命令がパイプライン１２において実行にコミットする度にデクリメントする。したがって、ＢＩＱカウントフィールド値は、パイプライン１２において関連づけられた分岐命令の前のコミットされていないリンクスタック書き込み命令の数を表わす。
【００２９】
ＢＩＱカウントフィールドは、アップ／ダウンカウンタ５０の値で初期化される。ＢＩＱカウントフィールド及びアップ／ダウンカウンタ５０の両方は、コミットしているリンクスタック書き込み命令によって、デクリメントする。アップ／ダウンカウンタ５０は、新しく復号されたリンクスタック書き込み命令によってインクリメントされ；ＢＩＱカウントフィールドは決してインクリメントされない。したがって、新しいリンクスタック書き込み命令が関連分岐命令の後でパイプライン１２に入らない場合にのみ、２つのカウント値は互いに追跡する。逆に、２つのカウント値における不一致は、少なくとも１つの新しいリンクスタック書き込み命令が関連分岐命令の後でパイプライン１２に入ったということを示す。
【００３０】
分岐命令がパイプライン１２において評価し、誤予測したと決定されるとき、当技術分野で知られているように、誤予測された分岐命令にしたがった命令は、すべてパイプライン１２からフラッシュされる。さらに、誤予測された分岐命令に関連づけられたＢＩＱカウントフィールドは、比較器５２においてアップ／ダウンカウンタ５０の値と比較される。２つのカウントが同じである場合には、誤予測された分岐命令の前のコミットされていないリンクスタック書き込み命令の数は、パイプライン１２におけるコミットされていないリンクスタック書き込み命令の合計数と等しく、そしてそれは、誤予測された分岐の後ろにコミットされていない（投機的に実行された）リンクスタック書き込み命令がないということを意味する。したがって、リンクスタック２２の修復は必要とされない。
【００３１】
しかしながら、ＢＩＱカウントフィールドがアップ／ダウンカウンタ５０の値と異なる場合には、少なくとも１つのリンクスタック書き込み命令は、ＢＩＱエントリが誤予測された分岐命令について作成された後で復号され、そしてそれは、リンクスタック２２は分岐後予測に応じて投機的に実行される命令によって書き込まれたということを意味しており、そして、リンクスタック２２に対してリンクスタック修理バッファ２３のコンテンツを復元することによって修理される必要があり得る。このことは、リンクスタック修復バッファ２３とパイプライン１２との間の、リンクスタック２２に対するインプットを多重化する比較回路５２のアウトプットによって機能的に示されている。当業者は、実際のインプリメンテーションが異なるということを理解するであろう。アップ／ダウンカウンタ５０、複数のＢＩＱカウントフィールド、比較器５２、及び他のインプリメンテーションロジック（示されていない）は、リンクスタックモニタ回路を備える。
【００３２】
図２で図示された実施形態では、リンクスタック修復バッファ２３は、単一のエントリを備える。この場合には、比較器５２は、縮小ＡＮＤ(reduction AND)と共に、単純ビットワイズＸＯＲ関数(a simple bitwise XOR function)をインプリメントすることができる。２以上のリンクアドレスがリンクスタック修復バッファ２３において保存されることができる他の実施形態では、アップ／ダウンカウンタ５０値とＢＩＱカウントフィールドとの間の数値比較は、誤予測された分岐にしたがったリンクスタック書き込みオペレーションの数を示しており、そしてそれは修復される。ＸＯＲ／ＡＮＤ関数は、２ｎリンクスタック書き込み命令が誤予測した分岐命令に従ったイベントにおいて、破損したリンクスタック２２を検出することを失敗する可能性があり、ここにおいてｎは、ＢＩＱカウントフィールドの幅である（カウントフィールドに「ラップ(wrap)」させる）、ということに留意してください。n≧２の場合、パイプライン１２が非常に深くないかぎり、これはありそうにない。
【００３３】
図２で図示されるリンクスタック２２の少なくとも一実施形態（すなわち環状バッファとしてインプリメントされる）では、投機的なリンクスタック書き込み命令（プッシュ）は、リンクスタック２２のエントリを、投機的なリンクスタック読み取り命令（ポップ）がそれを先行しないかぎり、破損しない。したがって、一実施形態では、投機的なリンクスタックポップオペレーションが誤りの投機的なリンクスタックプッシュを先行したということを検出される場合にのみ、リンクスタック修復バッファ２３からの保存された値がリンクスタック２２に復元される。別の実施形態では、リンクスタック修復バッファ２３からの保存された値は、投機的なリンクスタックポップ及びプッシュオレーションの両方が検出される場合にのみ、しかしそれらの相対的な実行順序に関係なく、リンクスタック２２に復元される。一実施形態では、投機的なリンクスタックポップ検出は、投機的なリンクスタックプッシュオペレーションを検出するためにここにおいて説明されたものと同様にインプリメントされることができ、−すなわち、パイプライン−ワイドな投機的リンクスタック読み取り命令のアップ／ダウンカウンタと、各分岐命令に関連づけられた投機的なリンクスタック読み取り命令カウントと、を保持し、そして、分岐が誤予測されたと決定される場合には２つの値を比較する。
【００３４】
図４は、リンクスタックを管理する方法６０のフロー図を図示している。分岐命令の評価は予測される（ブロック６２）。その分岐予測に基づいて、命令は、次のシーケンシャルアドレスあるいは予測された分岐ターゲットアドレスから投機的にフェッチされ、そして実行される（ブロック６４）。命令（投機的に実行された命令を含む）がリンクスタック２２を書き込む（ブロック６６）ときにはいつでも、上書きされたリンクスタックエントリの前の値は、リンクスタック復元バッファ２３において保存される（ブロック６８）。分岐命令が実行パイプステージにおいて評価されるときに、分岐予測が正しい場合には（ブロック７０）、パイプラインオペレーションは通常に継続する。分岐が誤予測された場合（ブロック７０）には、投機的命令は、パイプラインからフラッシュされ、適切な命令が、分岐命令にしたがったアドレスあるいは計算されたターゲットアドレスのいずれか、からフェッチされる（ブロック７２）。
【００３５】
投機的命令−すなわち分岐命令にしたがった命令−がリンクスタック２２を書き込んだかどうかが確認される（ブロック７４）。一実施形態においては、このことは、パイプラインにおいてすべてのコミットしていないリンクスタック書き込み命令の進行中カウントと、各分岐命令の前のすべてのコミットしていないリンクスタック書き込み命令のカウントと、を保持することと、そして、誤予測された分岐命令に関連づけられたカウントと合計カウントを比較することと、を備える。誤予測された分岐命令にしたがった命令がリンクスタック２２を書き込まなかった場合（ブロック７４）には、パイプラインオペレーションは、通常に継続する。投機的命令がリンクスタック２２を書き込んだ場合、プライアリンクスタックエントリ値は、保存されたリンクスタックインデクスにおいてリンクスタック復元バッファ２３から復元されることができ（ブロック７６）、パイプラインオペレーションは、通常に継続する。いくつかの実施形態において、リンクスタック２２の復元は、投機的な読み取り命令がまたリンクスタック２２をポップさせた場合にのみ生じる。
【００３６】
一実施形態では、単独エントリリンクスタック修復バッファ２３は、リンクアドレス用の３２ビット、モードビット(a mode bit)（例、ＡＲＭ／Ｔｈｕｍｂモードビット）、３ビットインデクス（８エントリリンクスタック２２用）を備えている。各ＢＩＱカウントフィールドは、パイプライン１２の深さに依存して、２あるいは３ビットのみを備えることができる。したがって、このアプローチのハードウェア影響は最小である。２０％より大きくもたらされた単独エントリのリンクスタック修復バッファ２３のシミュレーションは、リンクスタック修復メカニズムがないものよりも、リンクスタック精度において増加させる。より深いリンクスタック修復バッファのシミュレーションは、ごくわずかなさらなる精度の増加をもたらした。もちろん、これらの結果は、多数の要因に依存しており、パイプラインの深さ、コード特性、及び同様なものを含む。一般的に、当業者は、本開示の教示が与えられると、いずれの特定のプロセッサのインプリメンテーションについてのシリコンエリア及び設計の複雑さを用いて、性能及び節電のバランスをとるリンクスタック修復バッファ深さを選択することができるようになるであろう。マルチプルリンクスタック修復バッファエントリ（及びカウンタ比較の付随する複雑さ）でさえ、本発明の実施形態は、個別の「コミットされた」リンクスタックよりも、破損したリンクスタック復元に対してずっと効率的な解決方法を提供する。さらに、リンクスタック２２のオペレーションは、パイプレイン１２の初期に生じ、短いサブルーチンさえにもリンクスタック最適化を提供する。
【００３７】
ここに使用されるように、「リンクスタック書き込み命令(link stack write instruction)」は、命令が他の機能（例えばプログラムフローリダイレクション(program flow redirection)）をインプリメントする場合にさえ、リンクスタック上へとリンクアドレスをプッシュする、分岐及びリンク命令のような任意の命令である。ここにおいて使用されるように、「カウンタ(counter)」は、保存された値をインクリメント及び／またはデクリメントするように動作可能なハードウェアカウンタを備えることができ、あるいは、値を読み取り、オペレーションを実行し、ビットフィールドに新しい値を書き込むことによって、値がインクリメント／デクリメントするバッファにおいてビットフィールドを備えることができる。
【００３８】
本発明は、特定の特徴、態様、およびそれらの実施形態に関して、ここに説明されてきたけれども、多くの変形、修正、および他の実施形態は、本発明の広い範囲内で可能であり、したがって、すべての変形、修正、および実施形態は、本発明の範囲内にあるものとしてみなされるべきであるということは、明らかであろう。したがって、本実施形態は、すべての態様において限定ではなく説明のためとして解釈されるべきであり、添付された特許請求の範囲の意味および同等な範囲(the meaning and equivalency range)の中に入るすべての変更は、そこに包含されるように意図されている。
【図１】
2010541106.tif 000003
【図２】
2010541106.tif 000004
【図３】
2010541106.tif 000005
【図４】
2010541106.tif 000006
【国際調査報告】
2010541106.tif 000007
2010541106.tif 000008
2010541106.tif 000009