(57)【要約】【課題】リターンアドレススタックのみで精度良く分岐予測を行う機構を提供する。【解決手段】パイプライン処理する情報処理装置１００において、投機的に実行されている命令の検証に用いられる分岐予測アドレスの生成を行う分岐予測制御装置１１０であって、予測リターンアドレスを格納する第１のリターンアドレス格納手段１１３と、コール命令の実行結果に応じて生成されるリターンアドレスを格納する第２のリターンアドレス格納手段１１７と、格納された予測リターンアドレスを分岐予測アドレスとして送出し、送出した分岐予測アドレスを格納する分岐予測アドレス格納手段１１４とを有し、分岐予測アドレスと分岐命令あるいはリターン命令の実行後に生成されるリターンアドレスとが異なる場合に第２のリターンアドレス格納手段に格納１１７されている内容を第１のリターンアドレス格納手段１１３にコピーする分岐予測制御装置である。【選択図】図１
2008299795.tif 000002
【特許請求の範囲】
【請求項１】
投機的に生成された命令をパイプライン処理する情報処理装置において、投機的な命令の生成に用いられる予測リターンアドレスの生成と、投機的に実行されている命令の整合性の検証に用いられる分岐予測アドレスの生成を行う分岐予測制御装置であって、
前記情報処理装置において生成されたコール命令に基づき前記予測リターンアドレスを生成する予測リターンアドレス生成手段と、
前記予測リターンアドレスを格納する第１のリターンアドレス格納手段と、
前記コール命令の実行結果に応じて生成されるリターンアドレスを格納する第２のリターンアドレス格納手段と、
前記予測リターンアドレスを格納し、当該予測リターンアドレスを分岐予測アドレスとして送出し、送出した分岐予測アドレスを格納する分岐予測アドレス格納手段とを有し、
前記分岐予測アドレスと分岐命令あるいはリターン命令の実行後に生成されるリターンアドレスとが異なる場合に前記第２のリターンアドレス格納手段に格納されている内容を前記第１のリターンアドレス格納手段にコピーする分岐予測制御装置。
【請求項２】
前記分岐予測アドレス格納手段は、
送出する分岐予測アドレスに対応するリターン命令が実行されたことを示す識別子を有することを特徴とする請求項１に記載の分岐予測制御装置。
【請求項３】
前記分岐予測アドレス格納手段は、
当該分岐予測アドレス格納手段が送出する分岐予測アドレスに対応するリターン命令が再発行することを示す再発行信号を受信した場合に、前記識別子に基づき前記第２のリターンアドレス格納手段に前記リターンアドレスを格納するか否かを制御することを特徴とする請求項１又は２に記載の分岐予測制御装置。
【請求項４】
前記情報処理装置は、前記分岐予測アドレスと分岐命令あるいはリターン命令の実行後に生成されるリターンアドレスとが異なる場合、前記第１のリターンアドレス格納手段にコピーされたリターンアドレスを用いて後続の分岐予測を行う請求項１に記載の分岐予測制御装置。
【請求項５】
前記第１のリターンアドレス格納手段に格納する予測リターンアドレスの指定、及び読み出しを管理する第１のスタックポインタと、
前記第２のリターンアドレス格納手段に格納するリターンアドレスの指定、及び読み出しを管理する第２のスタックポインタと、
前記予測アドレス格納手段に格納する予測リターンアドレスの指定、及び読み出しを管理するキュウポインタとを有する請求項１に記載の分岐予測制御装置。
【請求項６】
前記第１のスタックポインタは、
コール命令がフェッチされ、前記第１のリターンアドレス格納手段に予測リターンアドレスが格納された場合、前記予測リターンアドレスが格納されたエントリを有効なエントリとして指定し、
リターン命令がフェッチされた時、指定されたエントリに格納されている予測リターンアドレスの読み出しを管理する請求項５に記載の分岐予測制御装置。
【請求項７】
前記第２のスタックポインタは、
コール命令が実行され、前記第２のリターンアドレス格納手段にリターンアドレスが格納された時、前記リターンアドレスが格納されたエントリを有効なエントリとして指定し、
リターン命令が実行された時、指定されたエントリに格納されているリターンアドレスの読み出しを管理する請求項５に記載の分岐予測制御装置。
【請求項８】
前記キュウポインタは、
コール命令が実行され、前記分岐予測アドレス格納手段にリターンアドレスが格納された時、前記予測リターンアドレスが格納されたエントリを有効なエントリとして指定し、
リターン命令が実行された時、指定されたエントリに格納されている予測リターンアドレスを予測アドレスとして送出することを管理する請求項５に記載の分岐予測制御装置。
【請求項９】
前記キュウポインタは、コール及びリターン命令の実行及び完了を管理することを特徴とする請求項５に記載の分岐予測制御装置。
【請求項１０】
パイプライン処理を行う情報処理装置において、分岐予測を行う分岐予測方法であって、
コール命令フェッチ時において、コール命令に対応し、投機的に予測されたリターンアドレスを格納し、
コール命令実行時において、コール命令に対応するリターンアドレスを格納し、
投機的に予測したリターンアドレスと、前記リターンアドレスとが一致するか否かを判定し、
一致した場合、前記予測リターンアドレスを用いて後続の分岐予測を行い、
不一致の場合、前記リターンアドレスを前記予測リターンアドレスの格納手段にコピーし、コピーされたリターンアドレスを用いて後続の分岐予測を行う分岐予測方法。
【請求項１１】
前記予測リターンアドレスが実行されたことを識別し、
命令再発行が要求された時、識別したリターンアドレスに基づいて、命令を再開することを特徴とする請求項１０に記載の分岐予測方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロプロセッサの分岐予測に係る制御装置及びその方法に関する。
【背景技術】
【０００２】
パイプライン処理を行うマイクロプロセッサは、いくつもの命令を流れ作業的に同時に実行する。しかし、命令の処理中に分岐命令が生じると、分岐命令が完了するまで、分岐するか否かが不明のためパイプラインが停止する。処理の完了を待っていたのでは、その間に多くの命令を読み出し、発行する機会を失うことになる。そこで、分岐命令によって分岐するか否かを予測し、後続の命令をフェッチしてパイプラインに流し込むのが分岐予測である。予測が成功すれば、パイプラインの停止は無く命令が続行できる。予測が失敗すれば、正しい分岐方向のアドレスから命令フェッチを行い、実行処理を再開しなければならない。この分岐予測の失敗を分岐予測ミスと言う。分岐予測ミスが起きるとパイプラインは停止し、正しい分岐方向の命令をフェッチして、命令はパイプラインに流し込まれ実行される。この実行されるまでの期間を分岐予測ミスペナルティと言う。命令をフェッチしてから命令実行されるまでのパイプラインのステージ数が多いマイクロプロセッサは、分岐予測が失敗すると分岐予測ミスペナルティが増大し、かなりの性能低下をまねく。このため、分岐予測については、予測の精度が非常に重要となっている。
【０００３】
また、分岐予測の効果を増大させるために、投機実行を行うマイクロプロセッサもある。この場合の投機実行とは、分岐予測に従って、分岐予測先の命令を予め実行しておくことである。即ち、分岐予測の成功／失敗がわかる以前に分岐命令以降の命令を実行する機能である。
【０００４】
従来の分岐予測に係る技術が、特許文献１に開示されている。特許文献１は、マイクロプロセッサにおけるサブルーチンコール／リターン命令等の命令列を高速に実行するための命令フェッチ制御装置である。図１０は、特許文献１に係る命令フェッチ制御装置を示したブロック図である。特許文献１は、リターン命令の分岐予測のために、リターンアドレススタック３０１とブランチヒストリ３０２を持つ構成になっている。
【０００５】
リターンアドレススタック（Return Address Stuck：以下、ＲＡＳと称す）３０１は、サブルーチンのリターンアドレスをスタックするレジスタである。ＲＡＳ３０１は、コール命令の完了時にリターンアドレスをプッシュ処理する。即ち、コール命令によって、指定アドレスに実行位置を移動した後、リターンアドレス、或いは次の命令のアドレス情報をＲＡＳ３０１に格納し、スタックポインタを操作する。また、ＲＡＳ３０１は、リターン命令の完了時に、リターンアドレスをポップ処理する。即ち、リターン命令によってＲＡＳ３０１から取り出したリターンアドレス、或いは次の命令のアドレスに実行位置を移動した後、スタックポインタを操作する。
【０００６】
ブランチヒストリ３０２は、過去の分岐予測の履歴情報が格納されたテーブルである。ＲＡＳ３０１のプッシュ処理、或いはポップ処理により、スタックポインタ値が変化する。その値によって分岐予測アドレスが、ＲＡＳ３０１から読み出されるか、又はブランチヒストリ３０２から読み出されるかが選択される。
【０００７】
図１０に示す命令フェッチ制御装置３００では、命令がフェッチされると、命令アドレス作成部３０４から出力されるアドレスによって、命令キャッシュ３０５及びブランチヒストリ３０２から命令コードを読み出す。命令コードがリターン命令であることを選択制御部３０６が認識すると、スタックポインタを参照し、予測分岐先アドレスをＲＡＳ３０１から読み出すか、ブランチヒストリ３０２から読み出すかの選択信号を出力する。そして、選択された予測分岐先アドレスで後続の命令フェッチを実行する。スタックポインタは、完了した命令がコール命令であった場合プッシュ処理され、リターン命令であった場合ポップ処理される。このように、特許文献１は、ＲＡＳ３０１とブランチヒストリ３０２を有すことで、リターン命令の分岐予測を行っている。なお、分岐予測ミスが生じ、再命令フェッチが生じた場合、スタックポインタは最小値に戻され、始めから処理を再開する。
【０００８】
しかし、特許文献１では、ＲＡＳ３０１のポインタ制御は、サブルーチンコール／リターン命令が完了した時に行われる。そのため、予測分岐先アドレスで後続の命令フェッチ実行時と、リターン命令が時間的に近接している場合、ＲＡＳ３０１のみで分岐予測を行うと、分岐予測ミスが多発する。例えば、コール命令の予測分岐先アドレスの先読み等（命令の投機フェッチ時）により、コール命令完了前にリターン命令が発生した場合、リターンアドレスがＲＡＳ３０１に格納されていないため、分岐予測ミスが多発する。従って、従来技術では、リターンアドレスで対応できないリターン命令は、ブランチヒストリ３０２を併用することで分岐予測の精度を高めている。
【０００９】
上述した問題を解決するため、特許文献２が開示されている。特許文献２では、コール命令が実行されるまでリターンアドレスを格納する第１のＲＡＳと、コール命令が実行された後にリターンアドレスを格納する第２のＲＡＳを備えることに特徴を有している。コール命令が実行されるまでは第１のＲＡＳを用い、コール命令が実行された後は、第２のＲＡＳを用いてリターン先を予測できるようにした。この時、ブランチヒストリが検出した情報に従い、出力選択回路がどのアドレスを選択するか決定する。
【特許文献１】特開２０００−１７２５０７号公報
【特許文献２】特開２００６−４０１７３号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、発明者は従来技術には以下の課題があることを見出した。従来技術では、ブランチヒストリを用いてサブルーチンコール／リターン命令の存在を予測している。ブランチヒストリは、容量が大きければ分岐予測の効果が上がるが、回路規模が大きくなると非常に高価なものとなる。従って、精度の良い分岐予測を行うためには、高価なブランチヒストリを使用する必要が生じる。加えて、ブランチヒストリは過去の履歴を学習する期間が必要となるという問題が生じる。
【課題を解決するための手段】
【００１１】
本発明の第１の態様は、投機的に生成された命令をパイプライン処理する情報処理装置において、投機的な命令の生成に用いられる予測リターンアドレスの生成と、投機的に実行されている命令の整合性の検証に用いられる分岐予測アドレスの生成を行う分岐予測制御装置であって、前記情報処理装置において生成されたコール命令に基づき前記予測リターンアドレスを生成する予測リターンアドレス生成手段と、前記予測リターンアドレスを格納する第１のリターンアドレス格納手段と、前記コール命令の実行結果に応じて生成されるリターンアドレスを格納する第２のリターンアドレス格納手段と、前記予測リターンアドレスを格納し、当該予測リターンアドレスを分岐予測アドレスとして送出し、送出した分岐予測アドレスを格納する分岐予測アドレス格納手段とを有し、前記分岐予測アドレスと分岐命令あるいはリターン命令の実行後に生成されるリターンアドレスとが異なる場合に前記第２のリターンアドレス格納手段に格納されている内容を前記第１のリターンアドレス格納手段にコピーする分岐予測制御装置である。
【００１２】
また、本発明の第２の態様は、パイプライン処理を行う情報処理装置において、分岐予測を行う分岐予測方法であって、コール命令フェッチ時において、コール命令に対応し、投機的に予測されたリターンアドレスを格納し、コール命令実行時において、コール命令に対応するリターンアドレスを格納し、投機的に予測したリターンアドレスと、前記リターンアドレスとが一致するか否かを判定し、一致した場合、前記予測リターンアドレスを用いて後続の分岐予測を行い、不一致の場合、前記リターンアドレスを前記予測リターンアドレスの格納手段にコピーし、コピーされたリターンアドレスを用いて後続のリターン命令の分岐予測を行う分岐予測方法である。
【発明の効果】
【００１３】
以上のような構成により、ブランチヒストリ等の高価なリソースを使用せず、リターンアドレススタックのみで精度良くサブルーチンコールからのリターン命令によるリターンアドレスを分岐予測する機構を提供することができる。
【発明を実施するための最良の形態】
【００１４】
以下に、本発明の好ましい実施の形態を説明する。説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、説明の明確化のため、必要に応じて重複説明は省略されている。
【００１５】
発明の実施の形態１．
図面を参照し、第１の実施形態に係る分岐予測制御機構及びその方法について説明する。図１は、第１の実施形態に係る情報処理装置１００の構成を示すブロック図である。ここでは、マイクロプロセッサ等の情報処理装置１００に形成された分岐予測制御機構について例を示したものである。図１には、第１の実施形態に関連する部分が示されている。
【００１６】
第１の実施形態においては、命令フェッチのパイプライン処理が行われる場合の分岐予測制御機構について、例示的に示す。情報処理装置１００は、記憶装置に格納されたデータに基づき処理を実行する。第１の実施形態に係る情報処理装置１００は、内部の命令キャッシュ１０２に予め命令セットを有している。そして、プログラムに応じてアドレス生成回路１０１がアドレスを生成し、アドレス生成回路１０１は、命令キャッシュ１０２にアドレスを転送し、命令キャッシュ１０２から読み出した命令セットを情報処理装置１００内の命令バッファ１０４に転送する。この動作は、全ての命令において共通の動作である。命令キャッシュ１０２から、命令セットを読み出すことを命令フェッチと呼ぶ。また、命令は、命令キャッシュ１０２から読み出されるとデコーダ１０３でデコードされ、デコーダ１０３は、その結果をアドレス生成回路１０１に転送し、後続の命令フェッチのためのアドレスを生成する。例えば、あるサブルーチンを実行する場合、コール命令をフェッチすることにより、サブルーチが実行される。サブルーチンの実行が完了した場合、リターン命令により、メインルーチンに処理が戻る。
【００１７】
パイプラインとは、ハードウェアの処理を並列化して性能を向上させるための一般的な手法である。パイプラインの考え方について、自動車の製造ラインや電子部品工場等で行われる流れ作業を用いて簡単に説明する。各工程が１単位時間係るＮ工程からなる処理を終了するためには、通常Ｎ時間必要となる。これをＮ人の人が流れ作業によって各工程を分担することにすると、１単位時間に１つの製品が完成する。従って、処理速度はＮ倍に改善される。これがパイプラインの原理である。
【００１８】
即ち、１つの製品の完成を情報処理装置での命令フェッチに例えた場合、命令フェッチを実行するために必要な工程をオーバーラップさせることにより、命令フェッチのスループットを向上させることができる。ここで、上述した工程各々をパイプラインのステージという。命令フェッチは、命令フェッチステージＩＦ、命令デコードステージＩＤ、命令発行ステージＩＳ、レジスタフェッチステージＲＦ、実行ステージＥＸ、ライトバックステージＷＢ、及び命令完了ステージＣＯ等の各ステージによって構成されている。各ステージの処理内容については、後述する。
【００１９】
また、あるステージの処理が手間取り、１単位時間以内に終わらない場合、パイプライン処理に乱れが生じ、処理性能が低下する。このように、パイプラインステージでの処理を単位時間内に終わらせることを阻害する要因をハザードという。分岐命令は、ハザードを引き起こす要因の一つとなりうる。
【００２０】
パイプライン処理を行う情報処理装置は、いくつもの命令を流れ作業的に命令フェッチし、実行する。命令フェッチ時に分岐命令があると後続の命令を分岐先からフェッチしてくるのか、すぐ後のアドレスからフェッチしてくるのかは、分岐命令を実行しないとわからないときがある。その場合、分岐方向が分岐命令の実行により確定するまで命令フェッチを停止してしまうと命令実行が途切れ処理効率が低下する。これを防ぐため、命令が分岐するか否かを予測し、命令フェッチを続けパイプラインに命令を流し込むのが分岐予測である。更に、分岐予測に従って、分岐予測先の命令をあらかじめ実行しておくことを投機実行という。
【００２１】
図１に示す情報処理装置１００は、アドレス生成回路１０１、命令キャッシュ１０２、デコーダ１０３、命令バッファ１０４、命令発行ユニット１０５、レジスタ１０６、実行ユニット１０７、命令完了ユニット１０８、分岐実行ユニット１０９、分岐予測制御回路１１０を有している。
【００２２】
第１の実施形態に係る情報処理装置１００は、例えばマイクロプロセッサ等のＣＰＵである。また、情報処理装置１００は、バス等のインターフェースを介して、記憶装置に格納されているデータや命令を読み出して実行する。
【００２３】
情報処理装置１００は、パイプラインで情報を処理するユニットである。第１の実施形態に係る分岐予測制御回路１１０は、従来技術のようにリターン命令のリターン先をブランチヒストリに設けず、投機フェッチＲＡＳ１１３と、実行後ＲＡＳ１１７だけによって、精度良く分岐予測の正誤判定を行うことに特徴を有している。投機フェッチＲＡＳ１１３は、投機予測したアドレスを格納するリターンアドレススタックである。また、実行後ＲＡＳ１１０は、命令フェッチが実行されたアドレスを格納するリターンアドレススタックである。これら情報処理装置１００の各構成要素について以下に説明する。
【００２４】
アドレス生成回路１０１は、記憶装置から読み出した命令コードが納められた命令キャッシュ１０２上のアドレス（命令アドレス、図中のＡｄｄｒｅｓｓ）を生成する。つまり、アドレス生成回路１０１は、プログラムに基づき命令アドレスを命令キャッシュ１０２に出力する。
【００２５】
命令キャッシュ１０２には、予め準備された命令セットが命令コード（図中のＩｎｓｔＣｏｄｅ）として格納される。命令キャッシュ１０２は、アドレス生成回路１０１からの命令アドレスに応じた命令コードをデコーダ１０３、或いは命令バッファ１０４に出力する。
【００２６】
デコーダ１０３では、命令キャッシュ１０２から入力された命令コードを複号化する。即ち、命令コードがコール命令フェッチであるか、リターン命令フェッチであるかを判定する。この判定結果は、アドレス生成回路１０１及び分岐予測制御回路１１０に出力される。
【００２７】
命令バッファ１０４は、格納された命令コードを命令ディスパッチ信号ＩｎｓｔＤｓｐｔとして出力する。命令発行ユニット１０５は、命令ディスパッチ信号を受信し、分岐実行ユニット１０９及び実行ユニット１０７に対して命令を発行（図中のＩｎｓｔＩｓ）する。また、命令発行ユニット１０５は、レジスタ１０６に発行した命令のインデックス情報（図中のＩｎｄｅｘ）を出力する。インデックス情報とは、レジスタ１０６に格納されているデータのうち出力されるデータが格納されているレジスタの番号を示す情報である。
【００２８】
レジスタ１０６は、情報処理装置１００で行われる演算処理の結果の記憶装置である。レジスタ１０６は、命令発行ユニット１０５からのインデックス情報と関連づけて、実行ユニット１０７が出力する演算データ（図中のＥｘｅＤａｔａ）及び分岐実行ユニット１０９が出力するリンクアドレス（図中のＬｎｋＡｄｒ）を記憶する。また、記憶されたデータは、出力データ（図中のＤＡＴＡ）として、実行ユニット１０７、あるいは分岐実行ユニット１０９に送信される。
【００２９】
実行ユニット１０７は、命令発行ユニット１０５によって発行された命令に基づいて演算処理を行う。演算によって生成されたデータは、レジスタ１０６に格納される。なお、実行ユニット１０７が演算する命令は、例えば論理演算、ＩＮＴ演算、ＦＰ演算、ＳＩＭＤ演算、ロード／ストアなどである。また、実行ユニット１０７は、演算処理が完了すると、演算完了信号（図中のＥｘｅＣｏｍｐ）を命令完了ユニット１０８に出力する。命令完了ユニット１０８は、演算完了信号あるいは分岐実行ユニット１０９が出力する分岐処理終了信号（図中のＢｒhＥｘｅＣｏｍｐ）に基づき、実行中の命令の処理が完了したことを認識する。
【００３０】
分岐実行ユニット１０９は、命令発行ユニット１０５によって発行された命令がコール命令であった場合に、コール命令を実行することで得られるリンクアドレスを生成する。このリンクアドレスは、レジスタ１０６と実行後ＲＡＳ１１７に格納される。また、命令発行ユニット１０５によって発行された命令がリターン命令であった場合に、投機的にフェッチされた分岐予測リターンアドレスが正しいものであったか否かを判断する。このとき、分岐実行ユニット１０９は、分岐予測制御回路１１０から出力される分岐予測リターンアドレス（図中のＢｒhＰｒｄＡｄｒ）と、レジスタ１０６から読み出したリンクアドレスとを比較する。そして、比較の結果、分岐予測リターンアドレスとリンクアドレスとが異なるものである場合、アドレス生成回路１０１、キュウポインタ１１５、投機スタックポインタ１１２に予測ミス信号（図中のＭｉｓ）を送信する。さらに、分岐実行ユニット１０９は、正しい分岐先を示すリターンアドレスをミスアドレス（図中のＭｉｓＡｄｒ）として、アドレス生成回路１０１に送信する。また、命令の実行後に分岐実行ユニット１０９は、命令完了ユニット１０８に命令の実行が完了したことを通知する分岐処理終了信号（図中のＢｒｈＥｘｅＣｏｍｐ）を出力する。ここで、分岐予測リターンアドレスとは、分岐予測制御回路１１０が予測し、投機的にフェッチされている分岐先の命令アドレスである。
【００３１】
分岐予測制御回路１１０は、予測リターンアドレス生成回路１１１、投機スタックポインタ１１２、投機フェッチＲＡＳ１１３、分岐予測アドレスバッファ１１４、キュウポインタ１１５、実行後スタックポインタ１１６、実行後ＲＡＳ１１７を有している。
【００３２】
予測リターンアドレス生成回路１１１は、予測リターンアドレス生成手段の一例であって、コール命令がフェッチされた場合、アドレス生成回路１０１から出力される命令アドレスに基づきリターンアドレスを投機的に予測する。そして、予測リターンアドレス生成回路１１１は、予測リターンアドレス（図中のＰｒｄＲｔｎＡｄｒ）を生成する。なお、予測リターンアドレスは、投機フェッチＲＡＳ１１３にスタックされる。
【００３３】
投機スタックポインタ１１２は、第１のスタックポインタの一例であって、投機フェッチＲＡＳ１１３におけるデータの格納場所を示すポインタを有している。そして、デコーダ１０３が出力するコール命令フェッチ信号（図中のＣａｌＦｔｈ）に基づきポインタの値をプッシュ処理する。プッシュ処理後のポインタの値に基づき投機フェッチＲＡＳ１１３に予測リターンアドレスがスタックされる。一方、命令コードがリターン命令フェッチである場合、投機スタックポインタ１１２は、デコーダ１０３が出力するリターン命令フェッチ信号（図中のＲｔｎＦｔｈ）に基づきポインタの値をポップ処理する。このポップ処理に基づき、投機フェッチＲＡＳ１１３は、格納されている予測リターンアドレスを出力する。出力された予測リターンアドレスは、アドレス生成回路１０１に送られる。アドレス生成回路１０１は、この予測リターンアドレスに基づいて後続の命令を投機的にフェッチする。また、予測リターンアドレスは、分岐予測アドレスバッファ１１４にも格納される。
【００３４】
投機フェッチＲＡＳ１１３は、第１のリターンアドレス格納手段の一例であって、コール命令フェッチ時において、投機的に予測されたコール命令に対応するリターンアドレスを格納するものであり、第１の実施形態において特徴的な装置である。投機フェッチＲＡＳ１１３は、先に入力したデータが後に出力されるスタック構造となっている。また、投機フェッチＲＡＳ１１３は、投機スタックポインタ１１２によって、データの入出力が管理される。
【００３５】
例えば、投機フェッチＲＡＳ１１３は、コール命令フェッチ時には、予測リターンアドレスが格納される。この時、投機スタックポインタ１１２をプッシュ処理する。即ち、投機スタックポインタ１１２のスタックポインタを"１"進める。また、投機フェッチＲＡＳ１１３は、リターン命令フェッチ時には、格納されている予測リターンアドレスをアドレス生成回路１０１及び分岐予測アドレスバッファ１１４に出力する。この時、投機スタックポインタ１１２をポップ処理する。即ち、投機スタックポインタ１１２のスタックポインタを"１"戻す。このように、投機スタックポインタ１１２は、投機フェッチＲＡＳ１１３に格納される予測リターンアドレスの指定や、読み出しを管理している。
【００３６】
投機スタックポインタ１１２は、コール命令フェッチ時に＋１、リターン命令フェッチ時に−１される。例えば、ライトポインタとリードポインタの両方を管理するスタックポインタについて示した場合、スタックポインタとライトポインタ及びリードポインタとの関係は、スタックポインタ＝ライトポインタ、及びスタックポインタ−１＝リードポインタとなる。即ち、投機フェッチＲＡＳ１１３から、読み出される予測リターンアドレスは、スタックポインタ−１のスタックから出力される。
【００３７】
図２を用いて、投機フェッチＲＡＳ１１３について詳述する。図２は、第１の実施形態に係る投機フェッチＲＡＳ１１３の基本的な構成と理想的な更新を例示的に示した図である。図２には、例えばＭＩＰＳ系命令セットによって示されるプログラムの一例が左部分に示される。
【００３８】
図２のプログラムは、Ｓｔａｒｔから始まるメインルーチンと、ｆｕｎｃｔｉｏｎ１〜３のサブルーチンが示されている。つまり、メインルーチンからサブルーチンを呼び出して何らかの命令を処理し、サブルーチンからメインルーチンに戻る動作が示されている。これは、分岐命令を実行していることと同じである。ＭＩＰＳ系命令セットでは、ＪＡＬ命令がコール命令であり、ＪＲ  ｒ３１命令がリターン命令である。
【００３９】
図２の右上部分には、基本的な投機フェッチＲＡＳ１１３構造が示されている。図２に示される投機フェッチＲＡＳ１１３は、例示的に８エントリのスタック構成となっており、プログラムの進行による状態の推移を示しているが、エントリ数は８に限る必要はない。
【００４０】
図２に示すプログラムでは、始めに、（ａ）のコール命令（ＪＡＬ命令）によって、（ｂ）のサブルーチン（ｆｕｎｃｔｉｏｎ１）がコールされる。そして、サブルーチン（ｂ）の処理が完了した後に戻るリターンアドレス（ＬｉｎｋＡ１）を投機的に予測し、投機フェッチＲＡＳ１１３に格納する。即ち、（１）のプッシュ処理が行われる。同時に、スタックポインタのライトポインタ（ＷｒＰ）を"１"とし、リードポインタ（ＲｄＰ）を"０"とする。
【００４１】
次に、（１）にて投機的に予測したリターンアドレスがヒットしていた場合、（ｃ）のリターン命令（ＪＲ  ｒ３１命令）によって、リターンアドレス（ＬｉｎｋＡ１）に戻る。即ち、（２）のポップ処理が行われる。同時に、スタックポインタのライトポインタは、"０"とし、リードポインタは、"−１"となる。
【００４２】
図２では、スタックポインタは、ライトポインタとリードポインタと分かれて管理する例が示されている。各々の初期値は、ライトポインタ＝０、リードポインタ＝−１である。プッシュ処理が行われると、ライトポインタ及びリードポインタが１進む。一方、ポップ処理が行われると、ライトポインタ及びリードポインタが１戻る。なお、スタックポインタは、ライトポインタ及びリードポインタに分かれず、両方管理することも可能である。
【００４３】
図２のプログラムに戻り、同様に、（ｅ）のコール命令（ＪＡＬ命令）によって、（ｆ）のサブルーチン（ｆｕｎｃｔｉｏｎ２）がコールされる。そして、サブルーチン（ｆ）の処理が完了した後に戻るリターンアドレス（ＬｉｎｋＡ２）を投機的に予測し、投機フェッチＲＡＳ１０４に格納する。即ち、（３）のプッシュ処理が行われる。同時に、スタックポインタのライトポインタを"１"とし、リードポインタを"０"とする。
【００４４】
次に、（３）にて投機的に予測したリターンアドレスがヒットしていた場合、（ｇ）のリターン命令（ＪＲ  ｒ３１命令）によって、リターンアドレス（ＬｉｎｋＡ２）に戻る。即ち、（４）のポップ処理が行われる。同時に、スタックポインタのライトポインタは、"０"とし、リードポインタは、"−１"となる。以降、（５）及び（６）の処理についても、上述した処理と同様であるため、説明を省略する。
【００４５】
なお、投機フェッチＲＡＳ１１３は、図２に示した予測リターンアドレスのスタックエントリへの格納順に限らず、図３に示すスタックエントリへの格納順とすることも可能である。図２に示した投機フェッチＲＡＳ１１３は、１エントリのみにリターンアドレスの情報をスタックしていた。図３は、（１）、（２）、及び（３）のプッシュ処理が行われ、それに対応するリターンアドレス（ＬｉｎｋＡ１、ＬｉｎｋＡ２、及びＬｉｎｋＡ３）が投機フェッチＲＡＳ１１３にスタックされる。ここでは、プッシュ処理によって投機フェッチＲＡＳ１１３に格納されるリターンアドレスが複数となり、スタックが深くなる構成となる。そして、（４）、（５）、及び（６）のポップ処理によって、各々のリターンアドレスに戻る。
【００４６】
図２及び図３に示されるように、基本的な投機フェッチＲＡＳ１１３は、投機的コール命令をフェッチした時に計算した予測リターンアドレスをプッシュ処理によって書き込み、投機的にリターン命令をフェッチした時にポップ処理によって読み出される。これらの処理は、特許文献１で示したＲＡＳと異なり、命令が完了する前に行われる。
【００４７】
図１に戻り、分岐予測制御装置１００の構成要素について引き続き説明する。分岐予測アドレスバッファ１１４は、分岐予測アドレス格納手段の一例であって、投機フェッチＲＡＳ１１３を用いて予測したリターンアドレスを格納する。分岐予測アドレスバッファ１１４に格納された予測リターンアドレスは、リターン命令実行時に読み出される。予測リターンアドレスは、実際に実行されるリターンアドレスと比較し、分岐予測が当たっているかを判断するために使用する。投機フェッチＲＡＳ１１３には、予測されたリターンアドレスの候補が格納されているが、分岐予測アドレスバッファ１１４には、予測に使用されたアドレスを格納する。つまり、リターン命令フェッチ時に読み出された予測リターンアドレスが格納されている。
【００４８】
また、分岐予測アドレスバッファ１１４は、スタック構造と異なり、先に入力したデータが先に出力されるキュウ（待ち行列）構造となっている。そして、分岐予測アドレスバッファ１１４は、キュウポインタ１１５によって、入出力されるデータが管理される。キュウポインタ１１５は、例えばライトポインタＷｒＰ及びリードポインタＲｄＰを有している。ライトポインタＷｒＰ及びリードポインタＲｄＰは、初期値を"０"とし、最大値を"キュウの数−１"とするポインタである。ライトポインタＷｒＰは、リターン命令フェッチ時に＋１される。また、分岐予測がミスとなった場合、ライトポインタＷｒＰの値は、その時点におけるリードポインタＲｄＰに"１"を加えた値となる。一方、リードポインタＲｄＰは、リターン命令実行時に＋１される。
【００４９】
実行後ＲＡＳ１１７は、第２のリターンアドレス格納手段の一例であって、コール命令実行時において、リターン命令に対応するリターンアドレスを格納する。つまり、実行後ＲＡＳ１１７は、投機的に予測したリターンアドレスではなく、コール命令を実行することで得られる正しいリターンアドレスを格納する格納手段である。実行後ＲＡＳ１１７は、投機フェッチＲＡＳ１１３と同様に、先に入力したデータが後に出力されるスタック構造となっており、図２及び図３で示した投機フェッチＲＡＳ１１３の構造と同様である。実行後ＲＡＳ１１７は、実行後スタックポインタ１１６によって、データの入出力が管理される。実行後スタックポインタ１１６は、第２のスタックポインタの一例である。
【００５０】
例えば、コール命令が発行され、命令が実行された場合、実行後ＲＡＳ１１７には、分岐実行ユニット１０９にて計算された正しいリターンアドレスが格納される。この時、実行後スタックポインタ１１６は、分岐実行ユニット１０９が出力するコール命令完了信号（図中のＣａｌＩｎｓｔＣｏｍｐ）に基づきポインタの値をプッシュ処理する。即ち、実行後スタックポインタ１１１のスタックポインタを"１"進める。また、リターン命令が発行され、命令が実行された場合、実行後スタックポインタ１１６は、分岐実行ユニット１０９が出力するリターン命令実行信号（図中のＲｔｎＩｎｓｔＥｘｅ）に基づきポインタの値をポップ処理する。即ち、実行後スタックポインタ１１６のスタックポインタを"１"戻す。このように、実行後スタックポインタ１１６は、実行後ＲＡＳ１１７に格納されるリターンアドレスの指定や、読み出しを管理している。
【００５１】
実行後スタックポインタ１１６は、コール命令実行時に＋１、リターン命令時に−１される。なお、スタックポインタは、ライトポインタとリードポインタと分けて管理することも可能であり、一方、ライトポインタ及びリードポインタに分かれずに管理することも可能である。また、実行後スタックポインタ１１６は、完了スタックポインタ（ＣＰ：以降、コミットポインタと称す）も有している。コミットポインタは、コール命令完了時に＋１、リターン命令完了時に−１される。コミットポインタについては、後に詳述する。
【００５２】
次に、第１の実施形態に係る情報処理装置１００の処理動作について具体的に説明する。図４は、第１の実施形態に係る情報処理装置１００の処理動作を命令ステージ毎に分割して示した図である。また、例示的にコール／リターン命令のパイプラインステージを分割して説明している。各ステージは、ＩＦ（命令フェッチステージ）、ＩＤ（命令デコードステージ）、ＩＳ（命令発行ステージ）、ＲＦ（レジスタフェッチステージ）、ＥＸ（実行ステージ）、ＷＢ（ライトバックステージ）、及びＣＯ（命令完了ステージ）に分かれている。
【００５３】
ＩＦステージは、命令キャッシュ１０２から命令コードを読み出すステージである。ＩＤステージは、命令コードをデコーダ１０３にてデコードするステージである。ＩＳステージは、読み出した命令コードに従って、命令を発行するステージである。ＲＦステージは、処理に用いる情報が格納されるレジスタ１０６からデータを読み出すステージである。ＥＸステージは、レジスタ１０６から出力されたデータを命令コードに従って、命令を実行するステージであり、コール命令の場合は、リターン先のアドレスを計算し、リターン命令の場合は、分岐先のリターンアドレスを確定するステージである。ＷＢステージは、ＥＸで計算した結果をレジスタ１０６、或いは実行後ＲＡＳ１１７に格納するステージである。ＣＯステージは、命令が完了したことを示すステージである。以下に、各ステージで行われる動作について説明する。
【００５４】
まず、コール命令をフェッチし、実行される場合の動作について説明する。この場合、まずアドレス生成回路１０１が命令アドレスを生成する（ａ）。続いて、ＩＦステージにて、命令キャッシュ１０２は、命令アドレスに応じて命令コードを出力する。また、予測リターンアドレス生成回路１１１は、命令アドレスに基づいて予測リターンアドレスを生成する（ｄ）。
【００５５】
ＩＤステージでは、命令キャッシュ１０２からフェッチされた命令コードが選択される（ｂ）。選択された命令コードは、命令バッファ１０４へ出力される。また、命令キャッシュ１０２からフェッチされた命令コードは、デコーダ１０３に送信される（ｃ）。デコーダ１０３は、命令コードをデコードし、その結果をアドレス生成回路１０１に送信する。命令デコード結果がコール命令であれば、さらに、投機スタックポインタ１１２とキュウポインタ１１５の値をプッシュ処理する。なお、アドレス生成回路１０１に送信されたコール命令のデコード結果は、アドレス生成回路１０１で次の命令アドレスとしてコール先アドレスを生成する情報となる。
【００５６】
ＩＳステージでは、命令バッファ１０４にフェッチされた命令コードが格納され、命令バッファ１０４に格納されていた命令コードは、命令ディスパッチ信号とともに命令発行ユニット１０５に出力される。命令発行ユニット１０５は、命令ディスパッチ信号に基づいてインデックス情報の出力（ｇ）と命令の発行（ｈ）、（ｌ）とを行う。また、投機フェッチＲＡＳ１１３は、ＩＤステージにてコール命令のデコード結果を受け投機スタックポインタ１１２で行われたプッシュ処理に基づき予測リターンアドレスを記憶する。
【００５７】
ＲＦステージでは、レジスタ１０６がインデックス情報で指定されたアドレスに格納されているデータを出力する（ｉ）、（ｎ）。ＥＸステージでは、実行ユニット１０７が、レジスタ１０６から送信されるデータを命令発行ユニット１０５が発行した命令に基づき処理する。そして、その処理結果は、演算データとしてレジスタ１０６に送信される（ｊ）。また、実行ユニット１０７は、命令の実行が完了すると命令完了信号を完了ユニットに送信する（ｋ）。一方、分岐実行ユニット１０９は、命令発行ユニット１０５が発行したコール命令に基づきリンクアドレスを生成する（ｑ）。このリンクアドレスは、コール命令を実行することで得られるリターンアドレスである。そして、このリンクアドレスは、実行後ＲＡＳ１１７とレジスタ１０６に送信される。このとき、分岐実行ユニット１０９は、実行後スタックポインタ１１６にプッシュ処理を行う。
【００５８】
ＷＢステージでは、レジスタ１０６が、実行ユニット１０７から送信された演算データと分岐ユニットから送信されたリンクアドレスとを記憶する。また、実行後ＲＡＳ１１７は、実行後スタックポインタ１１６のポインタ値に基づき分岐実行ユニット１０９から送信されたリンクアドレスを記憶する。そして、ＣＯステージでは、分岐実行ユニット１０９が実行後スタックポインタ１１６のコミットポインタに対しプッシュ処理を行う。
【００５９】
上記手順によって、コール命令がフェッチされ、投機的にリターン命令後の命令をフェッチするための予測リターンアドレスとコール命令実行後のリターンアドレスとがそれぞれ投機フェッチＲＡＳ１１３と実行後ＲＡＳ１１７とにそれぞれ記憶される。
【００６０】
続いて、リターン命令がフェッチされ、実行される場合の動作について説明する。この場合、まずアドレス生成回路１０１が命令アドレスを生成する（ａ）。続いて、ＩＦステージにて、命令キャッシュ１０２は、命令アドレスに応じて命令コードを出力する。
【００６１】
ＩＤステージでは、命令キャッシュ１０２からフェッチされた命令コードが選択される（ｂ）。選択された命令コードは、命令バッファ１０４へ出力される。また、命令キャッシュ１０２からフェッチされた命令コードは、デコーダ１０３に送信される（ｃ）。デコーダ１０３は、命令コードをデコードし、その結果をアドレス生成回路１０１に送信する。命令デコード結果がリターン命令の場合、投機スタックポインタ１１２の値をポップ処理する。なお、アドレス生成回路１０１に送信されたリターン命令のデコード結果は、アドレス生成回路１０１で次の命令アドレスとしてリターン先アドレスを生成する情報となる。すなわち、投機フェッチＲＡＳ１１３から送出される予測リターン先アドレスをアドレス生成回路１０１は選択し、後続の命令アドレスとして生成する。
【００６２】
ＩＳステージでは、命令バッファ１０４にフェッチされた命令コードが格納され、命令バッファ１０４に格納されていた命令コードは、命令ディスパッチ信号とともに命令発行ユニット１０５に出力される。命令発行ユニット１０５は、命令ディスパッチ信号に基づいてインデックス情報の出力（ｇ）と命令の発行（ｈ）、（ｌ）とを行う。また、投機フェッチＲＡＳ１１３は、ＩＤステージにてリターン命令のデコード結果を受け予測リターンアドレスを予測アドレスとしてアドレス生成回路１０１に送信する（ｅ）。アドレス生成回路１０１は、この予測アドレスを後続命令のアドレスとして命令キャッシュ１０２へ生成する。投機スタックポインタ１１２は、予測リターンアドレスの送信後にポップ処理がおこなわれる。また、分岐予測アドレスバッファ１１４は、デコーダ１０３がリターン命令のデコード結果を受け、投機フェッチＲＡＳ１１３から送出される予測リターンアドレスをＩＳステージで格納する。このとき、キュウポインタ１１５は、処理される。キュウポインタ１１５に基づき、分岐予測アドレスバッファ１１４は、分岐予測アドレスとして分岐実行ユニット１０９に送信する（ｍ）。
【００６３】
ＲＦステージでは、レジスタ１０６がインデックス情報で指定されたレジスタ番号に格納さているデータを出力する（ｉ）、（ｎ）。ＥＸステージでは、実行ユニット１０７が、レジスタ１０６から送信されるデータを命令発行ユニット１０５が発行した命令に基づき処理する。そして、その処理結果は、演算データとしてレジスタ１０６に送信される（ｊ）。また、実行ユニット１０７は、命令の実行が完了すると命令完了信号を完了ユニットに送信する（ｋ）。一方、分岐実行ユニット１０９は、命令発行ユニット１０５が発行したリターン命令に基づきレジスタに格納されたコール命令実行時に生成したリンクアドレスを読み出す。そして、このリンクアドレスと分岐予測アドレスバッファ１１４が出力する分岐予測アドレスとを比較する。ここで、比較結果が正しければ、分岐実行ユニット１０９は、実行後スタックポインタ１１６に対してポップ処理を行う。一般的に、コール命令の後にその他の分岐命令がない場合、リターン命令実行時の戻り先は、コール命令に従って予測した分岐先と同じになる。
【００６４】
ＷＢステージでは、レジスタ１０６が、実行ユニット１０７から送信された演算データと分岐ユニットから送信されたリンクアドレスとを記憶する。また、実行後ＲＡＳ１１７は、実行後スタックポインタ１１６のポインタ値に基づき分岐実行ユニット１０９から送信されたリンクアドレスを記憶する。そして、ＣＯステージでは、分岐実行ユニット１０９が実行後スタックポインタ１１６のコミットポインタに対しポップ処理を行う。
【００６５】
上記手順によって、リターン命令がフェッチされた場合の処理が行われる。しかしながら、コール命令とリターン命令との間に条件分岐命令などの命令が存在する場合がある。このような場合、投機的にフェッチされる命令が実際に分岐する分岐先の命令と異なる場合がある。このような分岐が発生する場合、投機フェッチＲＡＳ１１３の情報が乱れる。ここでは、このような場合の動作について説明する。ここで、条件分岐命令とは、例えばそれ以前の演算結果が所定の条件を満たしている場合に新たな分岐先に処理を移行する命令である。この条件分岐命令では、条件を満たして新たな分岐先に処理が移行する場合をＴａｋｅｎと称し、条件を満たさず現在のルーチンに沿って処理を進める場合をＮｏｔ  Ｔａｋｅｎと称する。
【００６６】
この場合、まず、アドレス生成回路１０１が命令アドレスを生成する（ａ）。続いて、ＩＦステージにて、命令キャッシュ１０２は、命令アドレスに応じて命令コードを出力する。
【００６７】
ＩＤステージでは、命令コードが選択される（ｂ）。また、命令コードは、デコーダ１０３に送信される（ｃ）。デコーダ１０３は、命令コードをデコードし、条件分岐命令である場合、その結果をアドレス生成回路１０１に送信する。本説明では、ここで送信されるデコード結果に基づきアドレス生成回路１０１は、フェッチされた条件分岐命令がＴａｋｅｎ予測の場合に分岐先予測アドレスを生成する。以降の図４の説明では、条件分岐命令は、Ｔａｋｅｎ予測されたことを仮定とする。
【００６８】
ＩＳステージでは、命令バッファ１０４が、ＩＳステージで選択された命令に基づき、命令ディスパッチ信号を命令発行ユニット１０５に出力する。命令発行ユニット１０５は、命令ディスパッチ信号に基づいてインデックス情報の出力（ｇ）と命令の発行（ｈ）、（ｌ）とを行う。
【００６９】
ＲＦステージでは、レジスタ１０６がインデックス情報で指定されたレジスタ番号に格納さているデータを出力する（ｉ）、（ｎ）。ＥＸステージでは、実行ユニット１０７が、レジスタ１０６から送信されるデータを命令発行ユニット１０５が発行した命令に基づき処理する。そして、その処理結果は、演算データとしてレジスタ１０６に送信される（ｊ）。また、実行ユニット１０７は、命令の実行が完了すると命令完了信号を完了ユニットに送信する（ｋ）。一方、分岐実行ユニット１０９は、命令発行ユニット１０５が発行した条件分岐命令に基づきレジスタに格納された演算結果を読み出す（ｎ）。そして、この演算結果が分岐命令の条件と一致しているかを判断する。ここで、判断の結果がＴａｋｅｎであった場合は、条件分岐命令フェッチ時にＴａｋｅｎ予測をしているのでそのままその後の処理を続行する。一方、判断の結果がＮｏｔ  Ｔａｋｅｎであった場合、分岐予測ミスとなり分岐予測ミス信号及びミスアドレスがアドレス生成回路１０１に送信される（ｏ）、（ｒ）。アドレス生成回路１０１は、このミスアドレスに基づいて正しい分岐方向の命令アドレスを生成する。
【００７０】
ＷＢステージでは、ＥＸステージにおいて分岐条件がＴａｋｅｎであった場合、投機的に実行され演算されたデータはレジスタ１０６に演算データとして格納する。一方、ＥＸステージにおいて分岐条件がＮｏｔ  Ｔａｋｅｎであった場合、分岐予測ミスが生じているので、実行後ＲＡＳ１１７に蓄積されている正しい分岐アドレスを投機フェッチＲＡＳ１１３にコピーする（ｓ）。これによって、投機フェッチＲＡＳ１１３に記憶されている情報は正しいものに修正される。なお、分岐予測アドレスバッファ１１４のキュウポインタ１１５は、分岐予測がミスしている場合、ポインタを初期状態に戻す。
【００７１】
そして、ＣＯステージでは、ＥＸステージにおいて分岐条件がＴａｋｅｎであった場合、そのまま続く処理を中断することなく実行する。一方、ＥＸステージにおいて分岐条件がＮｏｔ  Ｔａｋｅｎであった場合、それまで投機的に実行されていた命令の処理を破棄するように各ブロックに命令する。これによって、投機的に実行されていた命令の処理は中断される。
【００７２】
このように、実行後ＲＡＳ１１７は、分岐予測が外れた場合に、実行後ＲＡＳ１１７に記憶されている内容を投機フェッチＲＡＳ１１３にコピーする。従って、投機フェッチＲＡＳ１１３の乱れを実行後ＲＡＳ１１７の内容をコピーすることにより、修正が可能である。従来技術のＲＡＳのように、分岐予測ミスが起きた場合、投機フェッチＲＡＳをクリアする等して初期状態に戻し、処理の初めから再開する必要がなくなる。従って、処理の効率化が図られる。
【００７３】
次に、図５〜図７を用いて、上述した動作時における投機フェッチＲＡＳと実行後ＲＡＳの状態について詳細に説明する。図５は、基本的なサブルーチンコール／リターン命令のパイプライン動作であり、分岐予測が正常に完了した場合を示した図である。
【００７４】
図５は、上部にコール／リターン命令の流れが示されている。つまり、（１）の「ＪＡＬ」（コール命令）と（５）の「ＪＲ  ｒ３１」（リターン命令）との間に、投機的に実行される３つのサブルーチン命令（２）〜（４）が示されている。最終行には、「サブルーチンリターン予測先の命令」が実行され、リターン予測がヒットしていることから正常に終了している状態が示されている。下部には、第１の実施形態に係る「投機フェッチＲＡＳ」と「実行後ＲＡＳ１１７」が例示され、上部の命令の進行状況に応じて変化する格納状態が示されている。なお、「投機フェッチＲＡＳ」と「実行後ＲＡＳ」は、図１に示す投機フェッチＲＡＳ１１３と実行後ＲＡＳ１１７と同じものである。
【００７５】
各命令は、ＩＦステージからＣＯステージまで、前述した７段階のステージを有し、横軸方向に時系列的に示されている。なお、１段階が１クロックとなるように示されている。図５では、パイプラインの基本動作に従い、各命令は、１クロック毎にオーバーラップして進むように示されている。但し、コール命令からサブルーチン、或いはサブルーチンからリターン命令へジャンプする場合は、通常１クロック程度のストール（バブルと称す）が必要のため、２クロックの遅れが生じる。
【００７６】
始めに、（１）の「ＪＡＬ」（コール命令）が開始される。パイプライン動作の場合、（１）の「ＪＡＬ」命令の完了（ＣＯステージ）を待たずに、次々とサブルーチンが投機的に実行される。（２）の「サブルーチンの先頭命令」は、バブルによるストールが発生するため、２クロック遅れてＩＦステージが開始するが、（３）の「次のサブルーチン内の命令」は、（２）のＩＦステージから１クロック遅れて開始される。同様に、（４）の「次のサブルーチン内の命令」も、（３）のＩＦステージから１クロック遅れて開始される。サブルーチン内の命令が全て開始されると、（５）において、「ＪＲ  ｒ３１」（リターン命令）が開始される。更に、１クロック後に（６）の「サブルーチンリターン予測先の命令」を開始する。
【００７７】
ここで、サブルーチンリターン先の予測リターンアドレスは、（１）のＩＤステージにおいて、「投機フェッチＲＡＳ」にプッシュ処理（ａ）されている。即ち、図４にて説明したように、コール命令フェッチ時は、アドレス生成回路１０１で生成された予測リターンアドレスが投機フェッチＲＡＳ１１３に格納されるためである。ここで、コール命令がフェッチされ、投機フェッチＲＡＳ１１３に予測リターンアドレスが格納された時、投機スタックポインタ１１２は、予測リターンアドレスが格納されたエントリを有効なエントリとして指定する。
【００７８】
更に、（１）のＥＸステージでは、「ＪＡＬ」命令が実行され、本来のリターンアドレスが「実行後ＲＡＳ」にプッシュ処理（ｂ）される。即ち、図４にて説明したように、コール命令が実行されると、分岐実行ユニット１０９で計算された本来のリターンアドレスが実行後ＲＡＳ１１７に格納されるためである。ここで、コール命令が実行され、実行後ＲＡＳ１１７にリターンアドレスが格納された時、実行後スタックポインタ１１６は、リターンアドレスが格納されたエントリを有効なエントリとして指定する。
【００７９】
一方、（１）の開始と共に、（２）〜（４）のサブルーチン、及び（５）「ＪＲ  ｒ３１」（リターン命令）が次々に投機的に実行される。最後に、（６）のＩＦステージでは、「投機フェッチＲＡＳ」にスタックされている予測リターンアドレスがポップ処理（ｃ）され、そのアドレスに投機的にリターンする。即ち、図４にて説明したように、リターン命令フェッチ時は、投機スタックポインタ１１２が示す投機フェッチＲＡＳ１１３から予測リターンアドレスを読み出し、アドレス生成回路１０１に送り後続の命令フェッチアドレスとするためである。ここで、投機スタックポインタ１１２は、リターン命令がフェッチされた時、指定されたエントリに格納されている予測リターンの読み出しを管理している。
【００８０】
その後、（５）のＥＸステージでは、「実行後ＲＡＳ」にスタックされている本来のリターンアドレスをポップ処理（ｅ）し、（６）のＩＦステージにてポップ処理（ｃ）された予測リターンアドレスと一致しているかを判定する。即ち、図４にて説明したように、リターン命令が実行されると、分岐実行ユニット１０９は、実行後スタックポインタ１１６が示す実行後ＲＡＳ１１７から正しいリターンアドレスを読み出し、予測リターンアドレスが一致しているか否か判定する。ここで、実行後スタックポインタ１１６は、リターン命令が実行された時、指定されたエントリに格納されているリターンアドレスの読み出しを管理している。
【００８１】
図５は、分岐予測が正常に完了した場合を示しているため、本来のリターンアドレスと予測リターンアドレスは一致する。従って、分岐予測は正しく、正常終了する。
【００８２】
以上に示すように、投機フェッチＲＡＳ１１３は、コール命令フェッチ時に、予測リターンアドレスを格納する。従って、特許文献１のように実行完了を待って次の命令に進む必要がない。その結果、投機予測が当たっている限り、直後にリターン命令がフェッチされても分岐先を正しく予測することが可能となる。
【００８３】
なお、「実行後ＲＡＳ」には、スタックポインタに加え、完了スタックポインタ（ＣＰ：以降、コミットポインタと称す）が示されている。コミットポインタは、命令が完了した時点（ＣＯステージ）における「実行後ＲＡＳ」の格納状態を管理するものである。例えば、コール命令フェッチ時において、ＥＸステージにて「実行後ＲＡＳ」に本来のリターンアドレスがプッシュ処理（ｂ）された場合、スタックポインタは１進むが、コミットポインタは変化しない。コミットポインタは、ＣＯステージになった時点でプッシュ処理（ｄ）され、１進む。また、リターン命令フェッチ時において、ＥＸステージにて本来のリターンアドレスがポップ処理（ｅ）読み出された場合、スタックポインタは１戻るが、コミットポインタは変化しない。コミットポインタは、ＣＯステージになった時点でポップ処理（ｆ）され、１戻る。即ち、コミットポインタは、コール命令が完了した時、実行後ＲＡＳ１１０に格納されたリターンアドレスを有効なエントリとして指定する機能を有する。
【００８４】
次に、図６を用いて説明する。図６は、基本的なサブルーチンコール／リターン命令のパイプライン動作であり、分岐予測にミスがあった場合を示した図である。図６も、図５と同様に、上部にサブルーチンコール／リターン命令の流れが示され、下部に上記命令の進行状況に応じて変化する「投機フェッチＲＡＳ」と「実行後ＲＡＳ」の格納状態が示されている。
【００８５】
（１）の「ＪＡＬ」命令に続いて、投機的に実行されるサブルーチン内の命令が（２）、（３）に示されている。図６では、（３）において更に条件分岐が命令されたため、（４）〜（８）の分岐予測先の命令が次々に投機的に実行される。但し、図６では、分岐予測にミスがあった場合について示されている。即ち、（３）のＥＸステージにおいて、条件分岐の予測判断にミスがあることが判明した場合が示されている。従って、（３）のＣＯステージまでに投機的に実行された（４）〜（８）の分岐予測先の命令は無効となるが、（９）において、分岐予測ミスがリカバーされる。その後、最終行において、「サブルーチンリターン予測先の命令」が実行され、リターン予測がヒットしていることから、終了している状態が示されている。
【００８６】
上述した処理の流れと、「投機フェッチＲＡＳ」及び「実行後ＲＡＳ」の格納状態の関係について具体的に説明する。（１）の「ＪＡＬ」命令の開始に伴い、（２）、（３）のサブルーチンが次々に投機的に実行される。（３）では、更に条件分岐が命令フェッチされ、Ｎｏｔ  Ｔａｋｅｎ予測されているため、（４）〜（８）が１クロック遅れて次々に投機的に実行される。ここで、（１）のＩＤステージにおいて、「投機フェッチＲＡＳ」に予測リターンアドレスがプッシュ処理（ａ）される。更に、（１）のＥＸステージでは、本来のリターンアドレスが「実行後ＲＡＳ」にプッシュ処理（ｂ）される。（３）のＥＸステージでは、条件分岐命令実行され予測判断がミスしたことが判明する。従って、（３）がＣＯステージとなるまでに投機的に実行された（４）〜（８）の命令が無効化される。
【００８７】
ここで、第１の実施形態では、「実行後ＲＡＳ」に格納されている本来のリターンアドレスを、「投機フェッチＲＡＳ」にコピーする処理が行われる（ｄ）。図６では、「投機フェッチＲＡＳ」と「実行後ＲＡＳ」の格納状態が同じであるため、コピーによる変化がないように見える。
【００８８】
その後、（９）にて、条件分岐の分岐予測ミスのリカバーが行われる。分岐実行ユニットは、分岐予測ミス信号とともにミスアドレスをアドレス生成回路１０１に送出し、分岐予測ミスしたリカバーアドレスを生成する。
【００８９】
その後、（１０）の「ＪＲ  ｒ３１」命令のＥＸステージでは、「実行後ＲＡＳ」からポップ処理（ｆ）した本来のリターンアドレスと、（１１）のＩＦステージにてポップ処理（ｅ）された予測リターンアドレスとを比較し、一致していることによって終了する。
【００９０】
以上に示すように、図６では、分岐予測ミスによって処理時間にペナルティが含まれる。しかし、「実行後ＲＡＳ」の内容を「投機フェッチＲＡＳ」にコピーすることにより、初期状態からではなく、途中からリカバーすることが可能となる。
【００９１】
次に、図７を用いて説明する。図７は、図６と同様に、基本的なコール／リターン命令のパイプライン動作であり、条件分岐の分岐予測にミスがあった場合を示した図である。但し、図７は、図６と異なり、分岐予測ミスの判明前に分岐予測先でＪＡＬ命令がフェッチされ、「投機フェッチＲＡＳ」内容が上書きされた場合を示した図である。図７においても、図５と同様に、上部にコール／リターン命令の流れが示され、下部に上記命令の進行状況に応じて変化する「投機フェッチＲＡＳ」と「実行後ＲＡＳ」の格納状態が示されている。
【００９２】
（１）の「ＪＡＬ」命令の開始に伴い、投機的に実行されるサブルーチン内の命令が（２）に示されている。図７では、（２）において更に条件分岐が行なわれるが、条件分岐はＮｏｔ  Ｔａｋｅｎ予測を行なっており、実行時にＴａｋｅｎと判断し、分岐予測ミスが生じた場合が示されている。但し、（２）のＥＸステージまでは、条件分岐の予測判断にミスがあることが判明しないため、（３）以降の命令が投機的に実行される。
【００９３】
図７では、（３）において分岐予測先の命令が「ＪＲ  ｒ３１」命令であるため、予測リターン先にリターンする。更に、（４）の「リターン予測先の命令がＪＡＬ」命令であるため、ＩＦステージにてコール命令がフェッチされる。この時、（１）のＩＤステージにて「投機フェッチＲＡＳ」にプッシュ処理（ａ）された予測リターンアドレス（Ａｄｄｒ０）がポップ処理（ｂ）される。
【００９４】
その後、（４）の「ＪＡＬ」命令のＩＤステージにて、予測リターンアドレス（Ａｄｄｒ１）が「投機フェッチＲＡＳ」にプッシュ処理（ｃ）され、上書きされる。なお、「実行後ＲＡＳ」には、（１）のＥＸステージで計算された本来のリターンアドレスがプッシュ処理（ｄ）されている。
【００９５】
その後、（２）のＥＸステージにおいて、条件分岐の予測判断がミスしたことが判明する。従って、（２）がＣＯステージとなるまでに投機的に実行された（３）、（４）の命令が無効化される。
【００９６】
ここで、第１の実施形態では、「実行後ＲＡＳ」に格納されている本来のリターンアドレス（Ａｄｄｒ０）を、「投機フェッチＲＡＳ」にコピー（ｆ）する処理が行われる。従って、「投機フェッチＲＡＳ」の予測リターンアドレスは、Ａｄｄｒ１からＡｄｄｒ０に変更される。その後、（５）のリカバー以降の処理は、図６の（９）以降の処理と同様であるため、説明を省略する。
【００９７】
図７でも、図６と同様に分岐予測ミスによって処理時間にペナルティが含まれる。しかし、「実行後ＲＡＳ」の内容を「投機フェッチＲＡＳ」にコピーすることにより、初期状態からではなく途中からリカバーすることが可能となる。図７は、条件分岐ミスが判明する前に、次の命令の予測リターンアドレスが「投機フェッチＲＡＳ」に上書きされた。しかしながら、その場合も「実行後ＲＡＳ」を設けることにより、正しいリターンアドレスを復帰させることが可能となる。
【００９８】
以上のように、第１の実施形態によれば、ブランチヒストリを使用せず、ＲＡＳのみで精度良くリターン命令の分岐予測ができる。つまり、コール命令とリターン命令が時間的に近接していても、投機フェッチＲＡＳに予測リターンアドレスが格納されているため、精度良くリターン命令の分岐予測が実行できる。なお、コール／リターン命令の予測時に、ブランチヒストリを使用しないことから、高価なリソースを用いる必要もなく、ブランチヒストリの学習期間も必要なくなる。
【００９９】
また、従来、分岐予測ミスにより再命令フェッチが生じた場合、ＲＡＳの内容が乱れるのは、完了しているコール命令から導出されているリターンアドレスがある場合でもスタックポインタを強制的に初期値に戻すためである。しかしながら、第１の実施形態では、実行後ＲＡＳの内容を投機フェッチＲＡＳにコピーすることにより、乱れた投機フェッチＲＡＳを修正し、精度良くリターン命令の分岐予測を実行することができる。
【０１００】
発明の実施の形態２．
次に、本発明の実施の形態２について説明する。本実施形態においても、マイクロプロセッサ等の情報処理装置に形成された分岐予測制御機構について例を示したものであることは、実施の形態１と同様である。分岐予測制御機構の構成要素や動作等、実施の形態１と同様のものは、説明を省略する。図８は、第２の実施形態に係る分岐予測制御機構が備えられる情報処理装置の構成を示すブロック図である。図を参照し、第２の実施形態に係る分岐予測制御機構及びその方法について説明する。
【０１０１】
図８に示す分岐予測制御装置２１０には、予測リターンアドレス生成回路１１１、投機スタックポインタ１１２、投機フェッチＲＡＳ１１３、分岐予測アドレスバッファ２１４、キュウポインタ２１５、実行後スタックポインタ１１６、実行後ＲＡＳ１１７を有している。
【０１０２】
第２の実施形態に係る分岐予測制御装置２１０も、第１の実施形態と同様、マイクロプロセッサ等の情報処理装置のＣＰＵの内部に構築され、ＣＰＵによって制御されている。また、バス等のインターフェースを介して、記憶装置に格納されているデータや命令を内部に取り込んでいることについても第１の実施形態と同様である。
【０１０３】
第２の実施形態に係る分岐予測制御装置２１０は、分岐予測アドレスバッファ２１４のキュウに識別子を備えることに特徴を有している。つまり、分岐予測アドレスバッファ２１４のキュウに格納された予測リターンアドレスが命令実行されたか否かを識別するフラグが備えられている。その他の構成要素の機能、動作については、第１の実施形態と同様であるため、説明を省略する。
【０１０４】
近年、プロセッサにおける処理内容の複雑化に伴い、命令の処理中に実行ユニット１０７で実行ハザードやソフトエラー等が生じ、命令再発行が要求される頻度が増加している。その場合、既に処理した分岐予測を再度実施することになり、処理効率が悪くなるという問題が生じている。例えば、第１の実施形態に係る実行後ＲＡＳ１１７によって、既に命令実行されたリターンアドレスを識別し、その後の命令から実行を再開する方法も考えられる。しかしながら、命令の完了前に再度、命令再発行が要求された場合、実行後ＲＡＳ１１７に同じリターンアドレスが格納されることになり、内容が乱されてしまう。第２の実施形態では、分岐予測アドレスバッファ２１４にフラグを設けることにより、実行後ＲＡＳ１１７の内容を乱さずに既に実行された命令を識別することが可能となる。
【０１０５】
第２の実施形態に係る分岐予測アドレスバッファ２１４は、先に入力したデータが先に出力されるキュウ（待ち行列）構造となっている。そして、キュウポインタ２１５によって、データの入出力が管理されることについては、分岐予測アドレスバッファ１１４と同様である。また、格納した予測リターンアドレスを、リターン命令実行時に読み出し、実際に実行されるリターンアドレスと比較し、分岐予測が当たっているかを判断するために使用することについても、第１の実施形態と同様である。
【０１０６】
しかし、命令再発行が行われた場合のポインタの動作が第１の実施形態とは異なるため、第２の実施形態に係るキュウポインタ２１５について詳細に説明する。まず、キュウポインタ２１５は、ライトポインタＷｒＰ、リードポインタＲｄＰ、完了ポインタＣｍを有している。各ポインタは、初期値が"０"であり、最大値が"キュウの数−１"であり、最大値を超えた場合は"０"に戻る。リードポインタＷｒＰは、コール命令フェッチ時及びリターン命令フェッチ時に"＋１"される。また、分岐予測ミス時にリードポインタＲｄＰに"１"を加えた値となる。リードポインタＲｄＰは、コール命令実行時及びリターン命令実行時に"＋１"される。また、命令再発行時に完了ポインタＣｍの値と同じになる。完了ポインタＣｍは、分岐命令完了時に"＋１"される。
【０１０７】
第２の実施形態では、予測リターンアドレスが格納される分岐予測アドレスバッファ２１４の各々のキュウに、フラグが付加されている。フラグは、コール命令フェッチ時にライトポインタＷｒＰが示すアドレスのフラグをクリアする。また、リターン命令フェッチ時にリードポインタＲｄＰが示すアドレスのフラグをクリアする。また、このフラグは、コール／リターン命令の実行時にセットされる。これによって、命令再発行要求時に一度実行されたコール命令であるか否かを判断する。そして、分岐予測アドレスバッファ２１４は、リードポインタＲｄＰが示すアドレスのキュウに格納されたデータを分岐予測アドレスとして出力する。このとき、フラグがセットされた状態であれば、プッシュ／ポップイネーブル信号（図中のＰｕｓｈ／Ｐｏｐ）を無効状態にする。
【０１０８】
このプッシュ／ポップイネーブル信号の出力によって、実行後ＲＡＳのポップ／プッシュ処理が制御される。プッシュ／ポップイネーブル信号が出力されない場合は、コール／リターン命令が実行されたとしても、リターンアドレスは実行後ＲＡＳにポップ／プッシュ処理されない。第２の実施形態では、命令再発行が要求され、分岐予測アドレスバッファ２１４のキュウにフラグがセットされている場合、実行後ＲＡＳ１１７のスタックポインタが更新されないように、ポップ／プッシュ処理のイネーブル信号を無効状態にする。従って、命令再発行が要求された場合、実行後ＲＡＳ１１７ではなく、分岐予測アドレスバッファ２１４のフラグによって、実行される命令を識別する構成となっている。このように、分岐予測アドレスバッファ２１４は、命令再発行が要求された時、命令が完了するまで、実行されたことを示すフラグを備えたリターンアドレスが実行後ＲＡＳ１１７へ格納されることを抑制している。
【０１０９】
なお、キュウポインタ２１５は、命令再発行が要求された時、コール／リターン命令が完了しているポインタに戻す処理が行われる。即ち、キュウポインタ２１５は、コール／リターン命令の完了を管理する。また、キュウポインタ２１５は、コール／リターン命令の分岐命令完了通知（図中のＢｒｈＩｎｓｔＣｏｍｐ）が命令完了ユニット１０８より通知されたことも管理する。即ち、キュウポインタ２１５は、分岐予測アドレスバッファ２１４に格納されるリターンアドレスを実行させた否かを管理している。
【０１１０】
次に、図８を用いて、第１の実施形態に係る分岐予測制御装置の処理動作について具体的に説明する。始めに、アドレス生成回路１０１では、命令コードが格納されているアドレスを生成し、命令キャッシュ１０２に出力する。デコーダ１０３は、命令コードをデコードし、コール命令であると認識すると、アドレス生成回路１０１にコール命令をフェッチしたことを出力する。アドレス生成回路１０１は、コール命令フェッチ時において、投機的に予測されたリターンアドレスを生成する。
【０１１１】
命令キャッシュ１０２では、アドレス生成回路１０１から入力されたアドレスに従って命令コードが選択され、命令バッファ１０４に読み出される。その後、選択された命令コードに対応する分岐命令が実行される。
【０１１２】
一方、命令キャッシュ１０２にて読み出された命令コードをデコーダ１０３にてデコードし、分岐予測を開始する。デコードした結果、命令コードがコール命令フェッチの場合、投機スタックポインタ１１２のスタックポインタをプッシュ処理する。そして、予測リターンアドレス生成回路１１１にて生成された予測リターンアドレスを、投機フェッチＲＡＳ１１３にスタックする。同時に、予測リターンアドレスは、分岐予測アドレスバッファ２１４にも格納され、キュウに付加されたフラグは、クリアされる。
【０１１３】
デコードした結果、リターン命令フェッチの場合、投機スタックポインタ１１２のスタックポインタをポップ処理する。そして、投機スタックポインタ１１２が示す投機フェッチＲＡＳ１１３から予測リターンアドレスを読み出す。読み出された予測リターンアドレスは、後続の命令フェッチアドレスとするため、アドレス生成回路１０１に送られる。
【０１１４】
第２の実施形態では、コール／リターン命令がフェッチされた場合、分岐予測アドレスバッファ２１４に予測リターンアドレスを格納し、格納されたキュウのフラグをクリアする。即ち、この予測リターンアドレスは、実行されていないことを示している。コール命令フェッチ時の分岐予測アドレスバッファ２１４に格納されるアドレスは、コール命令実行時には使用しないので任意の値でよい。コール命令実行時に分岐予測アドレスバッファ２１４で参照するのは、キュウのフラグだけである。
【０１１５】
次に、命令キャッシュ１０２から命令バッファ１０４を経由した命令コードが、コール命令である場合、命令発行ユニット１０５から実行ユニット１０７及び分岐実行ユニット１０９に命令が発行される。そして、分岐実行ユニット１０９で計算されたリンクアドレスは、実行後ＲＡＳ１１７に送信され、実行後スタックポインタ１１６の値で示されるスタックに格納される。このリンクアドレスは、レジスタ１０６にも送信され、格納される。なお、実行後スタックポインタ１１６は、分岐予測アドレスバッファ２１４のフラグがクリア状態であれば、ポップ／プッシュ処理のイネーブル信号が有効状態となり、実行後スタックポインタ１１６のスタックポインタがプッシュ処理される。一方、ポップ／プッシュ処理のイネーブル信号が無効状態である場合は、プッシュ処理は行われない。そして、命令実行後に、分岐予測アドレスバッファ２１４のコール命令に対応するリターンアドレスを格納していたキュウに付加されているフラグをセットする。その後、分岐実行ユニット１０９及び実行ユニット１０７から命令完了ユニット１０８に命令が完了したことを通知する。更に、命令完了部１０８は、キュウポインタ２１５にコール命令が実行されたことを通知する。これによって、キュウポインタ２１５はプッシュ処理される。
【０１１６】
また、命令キャッシュ１０２から命令バッファ１０４を経由した命令コードが、リターン命令である場合、分岐実行ユニット１０９は、正しいリターンアドレスと予測リターンアドレスが一致しているか否か判定する。即ち、レジスタ１０６に格納されているリターンアドレスと、分岐予測アドレスバッファ２１４から送出される予測リターンアドレスとを比較する。
【０１１７】
一致している場合、分岐予測は正しい。そして、分岐予測アドレスバッファ２１４のフラグがクリア状態であれば、ポップ／プッシュ処理のイネーブル信号と共に、実行後ＲＡＳ１１７の実行後スタックポインタ１１６をポップ処理する。
【０１１８】
一致していない場合、分岐予測ミスとなる。そして、分岐実行ユニット１０９は、正しいリターンアドレスをアドレス生成回路１０１に送る。そして、分岐予測アドレスバッファ２１４のフラグがクリア状態であることを確認し、実行後ＲＡＳ１１７のスタックポインタをポップ処理する。その後、このアドレスで命令の再フェッチを行う。命令実行後は、分岐実行ユニット１０９から命令完了ユニット１０８に命令が実行されたことを通知する。ここで、分岐予測アドレスバッファ２１４の予測したリターンアドレスが格納されていたキュウに付加されたフラグは、リターン命令の実行後にセットされる。なお、分岐予測アドレスバッファ２１４のキュウポインタ２１５は、分岐予測結果にかかわらず１つ増加させる。更に、命令完了ユニット１０８は、実行ハザードやソフトエラーが生じていなければキュウポインタ２１５にリターン命令が実行完了したことを通知する。
【０１１９】
なお、分岐予測ミスが生じた場合について更に説明する。分岐予測ミスが生じると、各部にその通知を行い処理する。具体的には、投機スタックポインタ１１２のスタックポインタの開始位置を再設定する。即ち、投機フェッチＲＡＳ１１３は、分岐予測ミスが生じると実行後ＲＡＳ１１７のリターンアドレスを全てコピーする。そして、投機スタックポインタ１１２のスタックポインタを実行後スタックポインタ１１６と合わせる。この処理により、分岐予測ミスで生じた投機フェッチＲＡＳ１１３の乱れを修正することが可能となる。分岐予測アドレスバッファ２１４のキュウポインタ２１５は、開始位置を初期状態に戻す。命令発行ユニット１０５には、正しい分岐先命令から発行を再開するため、命令バッファ１０４にあるポインタを巻き戻す。アドレス生成回路１０１では、分岐実行ユニット１０９から送られた正しいリターンアドレスに従って、正しい分岐先からの命令フェッチを再開する。
【０１２０】
例えば、実行ユニット１０７で実行ハザードやソフトエラーが生じた場合、エラー情報が命令完了ユニット１０８に通知される。回復が可能であれば、命令完了ユニット１０８は、命令発行ユニット１０５に命令再発行を要求する。命令再発行要求が通知されると、分岐予測アドレスバッファ２１４のキュウポインタ２１５は、コール／リターン命令が完了しているポインタに戻される。また、分岐実行ユニット１０９でコール／リターン命令が再実行された場合、分岐予測アドレスバッファ２１４のフラグがセットされているので、ポップ／プッシュ処理のイネーブル信号は無効状態であり、実行後スタックポインタ１１６は、更新されない。
【０１２１】
上述したように、第２の実施形態では、コール／リターン命令が実行された時点で、分岐予測アドレスバッファ２１４のフラグがセットされる。従って、命令実行後は、フラグがセットされているため、実行後ＲＡＳ１１７へのイネーブル信号が無効状態となる。即ち、命令が実行されてから命令が完了するまで、実行後ＲＡＳ１１７へのリターンアドレスの書き込みが抑制される構成となっている。
【０１２２】
次に、図９を用いて、第２の実施形態における投機フェッチＲＡＳと実行後ＲＡＳの状態について詳細に説明する。なお、説明の簡単化のため、図８も併用する。図９は、基本的なコール／リターン命令のパイプライン動作であり、命令再発行が要求された場合を示した図である。
【０１２３】
図９は、上部にコール／リターン命令の流れが示されている。下部には、「投機フェッチＲＡＳ」、「実行後ＲＡＳ」、及び「再発行による書き込み抑止をしない実行後ＲＡＳ」について例示され、上部の命令の進行状況に応じて変化する格納状態が示されている。なお、「投機フェッチＲＡＳ」、「実行後ＲＡＳ」については、第２の実施形態に係る処理が行われる。「再発行による書き込み抑止をしない実行後ＲＡＳ」については、説明を判りやすくするため、第２の実施形態の処理を用いない場合のＲＡＳを示している。
【０１２４】
始めに、（１）の「ＪＡＬ」（コール命令）が開始される。パイプライン動作の場合、（１）の「ＪＡＬ」命令の完了（ＣＯステージ）を待たずに、（２）以降の命令が次々に投機的に実行される。図９では、（１）の「ＪＡＬ」命令の完了（ＣＯステージ）前に、実行ハザード或いはソフトエラー等が発生し、命令再発行が要求された場合について示されている。更に、（１）の命令再発行の命令完了前に、再々命令発行が要求されている。
【０１２５】
ここで、（１）の「ＪＡＬ」命令に対応する予測リターンアドレスは、（１）のＩＤステージにおいて、「投機フェッチＲＡＳ」にプッシュ処理（ａ）される。（３）、（４）の「ＪＡＬ」命令に対応する予測リターンアドレスについても、各々のＩＤステージ（ｂ、ｃ）において、「投機フェッチＲＡＳ」に格納される。
【０１２６】
「実行後ＲＡＳ」には、（１）のＥＸステージにおいてＪＡＬ命令が実行された後、本来のリターンアドレスがプッシュ処理（ｄ）される。この時、図８に示す分岐予測アドレスバッファ２１４のリターンアドレスを格納していたキュウのフラグをセットし、キュウポインタ２１５を１つ増加させる。従って、図９に示すように、（１）において命令再発行が要求され、ＥＸステージが再度実行された場合でも、命令が完了するまで（ｈ）、実行後ＲＡＳへのポップ／プッシュ処理イネーブル信号は無効状態となる。
【０１２７】
一方、「再発行による書き込み抑止をしない実行後ＲＡＳ」の場合、（１）のＥＸステージにおいて「ＪＡＬ」命令が実行された後、「実行後ＲＡＳ」と同様に、本来のリターンアドレスがプッシュ処理（ｅ）される。しかしながら、「再発行による書き込み抑止をしない実行後ＲＡＳ」を用いる場合、分岐予測アドレスバッファ２１４からの書き込み抑止（ポップ／プッシュ処理イネーブル信号）が発生しない。従って、（１）において命令再発行が要求された場合、ＥＸステージにおいてリターンアドレスがプッシュ処理（ｆ）される。即ち、（ｅ）にてプッシュ処理されたリターンアドレスと同じリターンアドレスが再度プッシュ処理されることになる。
【０１２８】
更に、（１）において命令再発行が再度要求され、ＥＸステージが再々度実行された場合、「再発行による書き込み抑止をしない実行後ＲＡＳ」に、リターンアドレスがプッシュ処理される（ｇ）。即ち、（ｅ）、（ｆ）にてプッシュ処理されたリターンアドレスと同じリターンアドレスが再々度プッシュ処理され、完了時に乱れた実行後ＲＡＳとなる。例えば、図９のパイプライン動作に分岐予測ミスが発生し、乱れた実行後ＲＡＳ（「再発行による書き込み抑止をしない実行後ＲＡＳ」）の内容を「投機フェッチＲＡＳ」にコピーした場合、「投機フェッチＲＡＳ」の内容も乱されることになる。
【０１２９】
以上のように、第２の実施形態は、分岐予測アドレスバッファ２１４の各エントリに、一度実行したことを示すフラグを付加する。従って、一度実行したコール／リターン命令は、実行ハザードやソフトエラーによる再発行命令が要求されても、実行後ＲＡＳ１１７のポップ／プッシュ処理を抑制する。従って、命令再発行要求時に実行後ＲＡＳが再実行によって乱されず、ＲＡＳのみで精度の良いリターン命令の分岐予測が可能となる。
【０１３０】
なお、本発明は上記に示す実施形態に限定されるものではない。本発明の範囲において、上記実施形態の各要素を、当業者であれば容易に考えうる内容に変更、追加、変換することが可能である。
【図面の簡単な説明】
【０１３１】
【図１】第１の実施形態に係る分岐予測制御機構を有す情報処理装置のブロック図である。
【図２】第１の実施形態に係る投機フェッチＲＡＳの構成と更新方法を示した図である。
【図３】第１の実施形態に係る投機フェッチＲＡＳの構成と更新方法を示した図である。
【図４】第１の実施形態に係る分岐予測制御装置の処理動作を示した図である。
【図５】第１の実施形態に係る基本的なコール／リターン命令のパイプライン動作を示した図である。
【図６】第１の実施形態に係る基本的なコール／リターン命令のパイプライン動作を示した図である。
【図７】第１の実施形態に係る基本的なコール／リターン命令のパイプライン動作を示した図である。
【図８】第２の実施形態に係る分岐予測制御機構を有す情報処理装置のブロック図である。
【図９】第２の実施形態に係る基本的なコール／リターン命令のパイプライン動作を示した図である。
【図１０】特許文献１に係る分岐予測制御機構のブロック図である。
【符号の説明】
【０１３２】
１００  情報処理装置、
１０１  アドレス生成回路、  １０２  命令キャッシュ、
１０３  デコーダ、  １０４  命令バッファ、
１０５  命令発行ユニット、  １０６  レジスタ、
１０７  実行ユニット、  １０８  命令完了ユニット
１０９  分岐実行ユニット
１１０  分岐予測制御装置、  １１１  予測リターンアドレス生成回路、
１１２  投機スタックポインタ、  １１３  投機フェッチＲＡＳ
１１４  分岐予測アドレスバッファ、  １１５  キュウポインタ
１１６  実行後スタックポインタ、  １１７  実行後ＲＡＳ
２００  情報処理装置、  ２１０  分岐予測制御装置、
２１４  分岐予測アドレスバッファ、  ２１５  キュウポインタ
３００  命令フェッチ制御装置
３０１  リターンアドレススタック、  ３０２  ブランチヒストリ、
３０３  命令アドレスレジスタ、  ３０４  命令アドレス作成部、
３０５  命令キャッシュ、  ３０６  選択制御部
【図１】
2008299795.tif 000003
【図２】
2008299795.tif 000004
【図３】
2008299795.tif 000005
【図４】
2008299795.tif 000006
【図５】
2008299795.tif 000007
【図６】
2008299795.tif 000008
【図７】
2008299795.tif 000009
【図８】
2008299795.tif 000010
【図９】
2008299795.tif 000011
【図１０】
2008299795.tif 000012