(57)【要約】情報処理装置１００に含まれる分岐予測機構１０００は、関数呼び出しを行うタイミングで、当該関数の引数をスタックする引数スタック１１３を備える。引数スタック１１３には、関数内の分岐命令に関連する引数が格納される。分岐予測機構１０００は、分岐命令が位置するアドレスと、その分岐命令が実行されたタイミングにおける引数スタック１１３の先頭値と、分岐命令が実行されたときの分岐先のアドレスとを対応付けた情報を分岐結果バッファ１１６に記憶している。分岐予測部１１７は、分岐命令の実行が通知されたときに、当該分岐命令の位置するアドレスと、そのときの引数スタック１１３の先頭値とを取得して、当該アドレスと先頭値とに対応する分岐先が分岐結果バッファ１１６にあるかどうかを検索し、検索して得られた分岐先を実行される分岐命令の分岐先として予測する。命令フェッチ部１１８は、分岐予測部１１７が予測した分岐先にある命令をフェッチする。
2010134330.tif 000002
【特許請求の範囲】
【請求項１】
命令を実行する命令実行部と、
前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、
前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、
前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、
分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、
前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、
前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、
を備えることを特徴とする分岐予測装置。
【請求項２】
前記分岐予測装置は、更に、
前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、
前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する
ことを特徴とする請求項１記載の分岐予測装置。
【請求項３】
前記分岐命令は条件付分岐命令であり、
前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録する
ことを特徴とする請求項２記載の分岐予測装置。
【請求項４】
前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した頻度を示す頻度情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、
前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、最も分岐した頻度が高い分岐結果エントリの分岐先アドレスを予測結果とする
ことを特徴とする請求項２記載の分岐予測装置。
【請求項５】
前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を１加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を１減算する
ことを特徴とする請求項４記載の分岐予測装置。
【請求項６】
前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納する
ことを特徴とする請求項２記載の分岐予測装置。
【請求項７】
情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含む
ことを特徴とする分岐予測方法。
【請求項８】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、
前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する
ことを特徴とするコンパイラ。
【請求項９】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、
前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含む
ことを特徴とするコンパイル方法。
【請求項１０】
プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、
前記分岐予測処理は、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含む
ことを特徴とする分岐予測プログラム記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置において実行される命令の分岐予測に関する。
【背景技術】
【０００２】
プロセッサの命令には、指定したアドレスへジャンプする分岐命令が含まれていることがある。現在のプロセッサでは、命令はパイプライン構造で実行される。【０００３】
パイプラインでの命令実行では、ある命令の実行が完了する前に、その先のアドレスに位置する命令を先行してフェッチしている。ここで、分岐命令が実行されるとプログラムのフローが変更されて、フェッチした命令が不要となることがある。そのため、フェッチした命令は不要となり、新たに分岐先の命令のアドレスをフェッチする必要がある。【０００４】
この命令のフェッチのやり直しは、パイプラインの途中まで進んでいる命令処理の放棄（これをパイプラインハザードという）を引き起こし、プロセッサの実行性能を低下させる一要因となっている。【０００５】
そこで、プロセッサにとって、分岐命令の分岐先を予測することが重要となる。【０００６】
分岐命令の一種に、条件分岐命令がある。条件分岐命令とは、その時々の演算結果により分岐が発生するかどうかが決まる分岐命令のことである。分岐が発生しない場合には、後続する命令が実行され、分岐が発生する場合は、固定の分岐先のアドレスで指定される命令が実行される。【０００７】
当該条件分岐命令においては、分岐が発生するか否かを過去の分岐結果から推測して分岐先を決定する技術がある。即ち、過去の分岐結果で分岐が発生するか否かの統計をとっておいて、分岐が発生したか否かの確率の高い方を分岐先と予測する。これによって、条件分岐命令の分岐予測の確度を高めることができる。【０００８】
しかし、分岐命令には、より複雑な分岐として間接分岐と呼ばれるものがある。間接分岐とは、あるレジスタに設定された値へのジャンプ命令や、プログラムカウンタのアドレス代入によるジャンプ等、ジャンプ先が不定の分岐である。【０００９】
間接分岐では、条件分岐による分岐するか否かの不定に加え、ジャンプ先も不定となるため、単純な分岐予測機能では分岐先の予測は不可能である。【００１０】
間接分岐を予測する一つの従来の技術として、リターンスタックがある。関数実行後の戻り先は、関数の呼び出し元によって変わるので、呼び出し元のアドレスをメモリ上のスタックなどに記録しておき、関数からの復帰（リターン）時にはこのアドレスへとジャンプする。関数呼び出し時に戻り先アドレスを専用のリターンスタックに保存されており、関数からのリターン命令をフェッチした際は、メモリ上の戻り先アドレスを取得してのジャンプの処理に先駆けて、リターンスタックより戻りアドレスを取得して次にフェッチすべきアドレスの予測として用いる。【００１１】
また、間接分岐に対する分岐予測の技術の一つとして、間接分岐の結果に寄与するキー情報を、プログラム中でプログラマが専用の暗示オペレーション命令を用いてキー情報を指定して、分岐先を予測するものがある（特許文献１参照）。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特表２００４−５３３６９５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかしながら、上記特許文献１に記載の技術では、専用の暗示オペレーション命令を用いてプロセッサにキー情報を通知する必要があり、予測対象となるプログラム内に暗示オペレーション命令を組み込む手間が存在する。【００１４】
本発明は、上記手間を軽減するためのものであり、プログラムに上述の暗示オペレーション命令のような専用の処理を組み込むことなく、任意のプログラムに対して、間接分岐を含むプログラムの分岐を予測する分岐予測装置を提供することを目的とする。
【課題を解決するための手段】
【００１５】
上記課題を解決するため、本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴としている。
【発明の効果】
【００１６】
ここで、関数とは、コンピュータプログラムにおける所謂サブルーチンのことをいう。【００１７】
上述のような構成によって、分岐予測装置は、関数の呼び出しを実行する際に、その関数の引数を引数スタックが取得して、分岐命令が実行される場合に、引数スタックが保持する引数と、過去の分岐結果を用いて、分岐を予測することができる。これにより、ユーザがプログラムに上記特許文献１における暗示オペレーション命令のような特殊の命令を組み込まずとも分岐予測装置が分岐予測のためのキーとなる情報として自動的にその分岐命令が属する関数の引数を取得して分岐予測を実現でき、任意のプログラムで間接分岐の分岐予測を実現できる。
【図面の簡単な説明】
【００１８】
【図１】図１は、実施の形態に係る分岐予測装置の機能構成を示した機能ブロック図である。
【図２】図２は、引数スタック１１３への引数の渡し方を示す概要図である。
【図３】図３は、分岐結果バッファに格納されている分岐結果情報の構成例を示すデータ概念図である。
【図４】図４は、プログラムが実行されて引数が引数スタックに格納される様子を示す概要図である。
【図５】図５は、分岐予測部１１７が実行する分岐予測の際の検索の仕方を示す概要図である。
【図６】図６は、情報処理装置１００の分岐予測に係る動作を示したフローチャートである。
【図７】図７は、高級言語プログラムと、当該高級言語プログラムのアセンブラコードと、引数スタックに格納される引数の関係とを示す関係図である。
【図８】図８は、コンパイラ１１９のコンパイルにおける動作を示すフローチャートである。
【図９】図９は、コンパイラ１１９がコンパイルした命令を実行する際の命令実行部１１０の動作を示すフローチャートである。
【図１０】図１０は、関数の引数と、分岐命令の引数と、引数スタックに格納される引数との関係を示す関係図である。
【図１１】図１１は、変形例に係る情報処理装置３００の別構成例を示す機能ブロック図である。
【図１２】図１２は、変形例に係る情報処理装置３００の引数スタックへの引数の渡し方の具体例を示す図である。
【図１３】図１３は、変形例に係る情報処理装置３００の引数スタックへの引数の渡し方の別具体例を示す図である。
【図１４】図１４は、図８に示すプログラムの分岐命令を実行した場合の分岐予測部の検索の仕方を示す概要図である。
【図１５】図１５は、引数スタックへの引数の渡し方の別例を示す図である。
【図１６】図１６は、図１５に示す引数スタックの引数の渡し方の具体例を示す図である。
【図１７】図１７は、引数スタックの別構成例を示した図である。
【発明を実施するための形態】
【００１９】
＜実施の形態＞
本発明に係る分岐予測装置の一実施形態である分岐予測機構１０００が含まれる情報処理装置１００について図面を参照しながら説明する。
＜構成＞
図１は、情報処理装置１００の機能構成を示した機能ブロック図である。図１に示すように情報処理装置１００は、命令実行部１１０と、関数呼び出し通知部１１１と、関数リターン通知部１１２と、引数スタック１１３と、分岐命令通知部１１４と、分岐結果記録部１１５と、分類結果バッファ１１６と、分岐予測部１１７と、命令フェッチ部１１８と、コンパイラ１１９とを含んで構成される。
【００２０】
情報処理装置１００は、記憶装置２００に接続されており、記憶装置２００に格納されている命令を逐次読み出して実行するプロセッサである。
【００２１】
命令実行部１１０は、コンパイラ１１９が実行形式に変換した命令列を、記憶装置２００からフェッチされ、順次実行する機能を有する。
【００２２】
関数呼び出し通知部１１１は、命令実行部１１０が関数呼び出しを行った場合にそれを検知して、その旨を引数スタック１１３に通知する機能を有する。ここでいう関数は所謂サブルーチンの呼び出しのことであり、１以上の命令を実行するためのルーチンの呼び出しのことをいう。高級言語における関数は、コンパイラ１１９によりプロセッサの命令列にコンパイルされて実行される。関数呼び出し通知部１１１は、コンパイラ１１９が関数の呼び出し部分のコンパイルに特定の命令を用いる場合に、当該特定の命令の実行を検知することで、関数呼び出しが実行されることを検出する。特定の命令とは、例えば、ジャンプと同時に、そのジャンプ命令の次のアドレスを戻り番地としてリターンレジスタと呼ばれる特定のレジスタに保持する命令等である。関数をどのようにコンパイルするのかは、情報処理装置１００が用いるコンパイルの規約に従って定められている。関数呼び出し通知部１１１は、その規約に従って命令列がコンパイルされることを想定して、特定の命令がどのような命令であるかを記憶しておき、その予め定められた特定の命令の実行を検知することで関数の呼び出しが実行されることを通知する。
【００２３】
関数リターン通知部１１２は、命令実行部１１０が関数を終了した、即ちリターンしたかどうかを監視し、リターンした場合にその旨を引数スタック１１３に通知する機能を有する。関数の呼び出しと同様に関数のリターンにおいてもコンパイラ１１９が特定の命令を用いてコンパイルされるので、コンパイラ１１９による当該特定の命令の実行を検知することで関数リターン通知部１１２は関数のリターンを検知する。
【００２４】
引数スタック１１３は、関数呼び出し通知部１１１から関数の呼び出しがあったことを通知された場合に、命令実行部１１０の特定のレジスタに格納されている値を、呼び出された関数の引数として取得し、プッシュ、即ち、記憶する機能を有する。また、関数リターン通知部１１２から、関数が終了した、即ちリターンしたことを通知された場合に、一番最後に格納した引数を出力、即ち、ポップする機能も有する。なお、引数スタック１１３は所謂ＦＩＬＯ（First In Last Out）型のメモリであり、本明細書においては、引数スタック１１３から保持している引数をポップさせる場合に出力される値を引数スタック１１３の先頭値と記載する。上述のプッシュとポップを行うことにより、引数スタック１１３の先頭値には、必ず、現在実行されている関数の引数が保持される構成となっている。
【００２５】
図２は引数スタック１１３における処理、即ち引数の取得の仕方の詳細を示す図である。
【００２６】
関数への引数の渡し方についても予め定められており、関数の引数は、通常、高級言語プログラムにおいて記載されている順に、命令実行部１１０が保持するレジスタ群１２０の各レジスタに割り当てられている番号の小さいものから順に、格納されていく。つまり、レジスタ０が関数の第１引数を、レジスタ１が関数の第２引数を、レジスタ２が関数の第３引数を、・・・というように各レジスタに引数が格納される。こうして、レジスタに格納されている引数のうち、本実施の形態においては、図２に示すように、引数スタック１１３は、レジスタ０に格納されている引数を取得して、記憶する。
【００２７】
また、図４は、引数スタック１１３への引数の格納の手順の一具体例を示している。
【００２８】
プログラム４００の関数ｆｕｎｃＡは、引数ａ０、ａ１、ａ２を受け取る。この引数ａ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。関数ｆｕｎｃＡ内において、プログラム４００は、関数ｆｕｎｃＢを呼び出す。関数ｆｕｎｃＢは、引数ｂ０、ｂ１、ｂ２を受け取る。引数ｂ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。関数ｆｕｎｃＢ内において、プログラム４００は、関数ｆｕｎｃＣを呼び出す。関数ｆｕｎｃＣは、引数ｃ０、ｃ１、ｃ２を受け取る。引数ｃ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。図４のプログラム４００の右横には、そのときの引数スタック１１３の保持している引数の情報を示しており、図４を見れば明らかなように、最後に呼び出された関数ｆｕｎｃＣの第１引数であるｃ０が先頭値となっている。なお、図４においては、引数スタック１１３の上側が先頭値となる。
【００２９】
図１に戻って、分岐命令通知部１１４は、命令実行部１１０が実行する命令が分岐命令であるかを判定し、肯定的な判定をした場合に、その旨を分岐結果記録部１１５と分岐予測部１１７に通知する機能を有する。
【００３０】
分岐結果記録部１１５は、分岐命令通知部１１４から分岐命令の実行が通知されると、命令実行部１１０が実行した当該分岐命令のアドレスを取得するとともに、命令実行部１１０における当該分岐命令の実行の結果、分岐した分岐先のアドレスとを取得する。また、分岐結果記録部１１５は、分岐命令を実行したときの引数スタック１１３の先頭値も取得する。分岐結果記録部１１５は、そして、取得した分岐命令のアドレスと、分岐の時点での引数スタック１１３の先頭値と、分岐命令の分岐先のアドレスとを対応付けて、分岐結果バッファ１１６に記録する機能を有する。
【００３１】
分岐結果バッファ１１６は、分岐命令が位置するアドレスと、当該分岐命令が実行されるときの引数スタックの先頭値と、分岐命令の分岐先のアドレスとを対応付けた分岐結果エントリを記憶しているメモリである。
【００３２】
図３に、分岐結果バッファ１１６が記憶している分岐結果情報のデータ構成例を示すデータ概念図を示す。
【００３３】
分岐結果情報は、分岐命令アドレス３０１と、引数スタックの先頭値３０２と、分岐先３０３とを対応付けた分岐結果エントリを統合した情報である。
【００３４】
分岐命令アドレス３０１は、分岐命令の位置するアドレスを示す情報である。
【００３５】
引数スタックの先頭値３０２は、対応する分岐命令が実行されたときの、引数スタック１１３に格納されていた引数を示す情報である。
【００３６】
分岐先３０３は、分岐命令が実際に実行されて、分岐した分岐先のアドレスを示す情報である。
【００３７】
当該分岐結果情報が分岐結果バッファ１１６に記憶されていることにより、分岐予測部１１７は、分岐の予測を実行できる。
【００３８】
図１に戻って分岐予測部１１７は、分岐命令通知部１１４からの通知を受けると、当該通知とともに伝達される分岐命令のアドレスと、そのときの引数スタック１１３の先頭値とを取得する。分岐予測部１１７は、取得した分岐命令のアドレスと、引数スタック１１３の先頭値の両方とに一致する分岐結果エントリが分岐結果バッファ１１６にあるかどうかを検索する。そして、分岐予測部１１７は、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐先を、分岐命令の予測先として、命令フェッチ部１１８に通知する機能を有する。
【００３９】
図５は、その分岐予測部１１７が分岐結果バッファを検索する際の検索の仕方を示した概要図である。
【００４０】
図５に示すように、分岐予測部１１７は、分岐命令の位置するアドレスとそのときに引数スタック１１３から取得した引数とが対応する分岐結果エントリが、分岐結果バッファ１１６にあるかどうかを検索する。即ち、分岐予測部１１７は、実行される分岐命令のアドレスを取得し、取得した分岐命令のアドレスと一致するアドレスがあるかどうかを検索する。
【００４１】
次に、分岐命令のアドレスと一致する分岐結果エントリがある場合に次に、その分岐結果エントリのうち、引数スタック１１３から取得した引数について引数スタックの先頭値３０２に一致するものがあるかどうかを検索する。
【００４２】
こうして、両者に一致する分岐結果エントリの分岐先を、分岐命令の分岐先として予測する。
【００４３】
再度、図１に戻って、命令フェッチ部１１８は、記憶装置２００より命令をフェッチする機能を有する。命令フェッチ部１１８は、分岐予測部１１７から、次に実行する命令のアドレスを通知されていた場合に、通知されたアドレスから命令のフェッチを行う機能を有する。
【００４４】
以上が、情報処理装置１００の各機能部の説明である。  
＜動作＞
図６は、情報処理装置１００の分岐予測の動作を示したフローチャートである。本フローチャートに基づいて、情報処理装置１００の分岐予測における動作を説明する。
【００４５】
図６に示すように、情報処理装置１００の分岐命令通知部１１４は、分岐命令が実行されることを検知して、その旨を分岐予測部１１７に通知する（ステップＳ６０１）。
【００４６】
分岐予測部１１７は、分岐命令通知部１１４から、分岐命令の実行を通知されると、そのときの引数スタック１１３の先頭値を取得する。また、分岐予測部１１７は、分岐命令通知部１１４からは、実行される分岐命令のアドレスも取得する（ステップＳ６０２）。
【００４７】
そして、取得した分岐命令のアドレスと、引数スタック１１３の先頭値とに一致する分岐結果エントリが、分岐結果バッファ１１６に記憶されているかどうかを検索する（ステップＳ６０３）。
【００４８】
分岐予測部１１７は、分岐結果バッファ１１６に分岐結果エントリが記憶されていた場合（ステップＳ６０３のＹＥＳ）、実行される分岐命令のアドレスと、引数スタック１１３の先頭値とに一致する分岐結果エントリの分岐先３０３を、当該分岐命令の分岐先として予測する（ステップＳ６０４）。
【００４９】
命令フェッチ部１１８は、分岐予測部１１７から通知されたアドレスの命令を記憶装置２００から呼び出して、命令実行部１１０にフェッチする（ステップＳ６０５）。
【００５０】
分岐結果バッファ１１６に分岐結果エントリが記憶されていなかった場合（ステップＳ６０３のＮＯ）、分岐予測部１１７は、命令フェッチ部１１８に予測なしを示す情報を出力する。すると命令フェッチ部１１８は、当該分岐命令の次のアドレスの命令をフェッチする。
【００５１】
そして、実際に分岐命令が実行される（ステップＳ６０７）と、分岐結果記録部１１５は、当該分岐命令のアドレスと、当該分岐命令が実行された時点における引数スタック１１３の先頭値と、分岐命令の実行の結果分岐した分岐先のアドレスとを対応付けた分岐結果エントリを分岐結果バッファ１１６に記録する（ステップＳ６０８）。
【００５２】
以上が、分岐予測部１１７の分岐予測並びに分岐命令の実行時の情報処理装置１００の動作である。
【００５３】
図７は、高級言語プログラムと、コンパイルされたプロセッサ命令列、そして、その命令列が実行されることによって、引数スタック１１３に格納される引数を示す図である。
【００５４】
図７に示す高級言語プログラム７０１の関数ｉｎｔｅｒｐｒｅｔｅｒは、擬似命令ｉｎｓｔを引数とするインタープリンタ言語の実行関数である。Ｊａｖａ（登録商標）Ｓｃｒｉｐｔなどは、テキストファイルのプログラムを解釈して擬似命令にコンパイルした後、その擬似命令をインタープリンタで処理する。典型的には、インタープリンタを実装する関数は、図７に示したように個々の擬似言語に応じた処理をｓｗｉｔｃｈ〜ｃａｓｅ文で実現する。
【００５５】
図７に示すプロセッサ命令列７０２は、関数ｉｎｔｅｒｐｒｅｔｅｒを、擬似的なプロセッサ命令列で示したものである。ここでは、ｍｖ命令で引数ｉｎｓｔをレジスタｒ０に格納した後、ｂｌ命令で関数ｉｎｔｅｒｐｒｅｔｅｒの先頭へのジャンプ（関数呼び出し）が行われる。
【００５６】
関数ｉｎｔｅｒｐｒｅｔｅｒ内においては、まず下位関数として、関数ｆｕｎｃが、引数をａとして呼び出される。
【００５７】
その後、レジスタｒ０、即ち関数ｉｎｔｅｒｐｒｅｔｅｒの引数がＡであるかをｔｓｔ命令で判定する。Ａと等しい場合にレジスタｒ１に数値０ｘ０１０００が格納される。同様にｒ０がＢならばレジスタｒ１には０ｘ２０００が格納される。アドレス０ｘ０１００に位置するｍｖ命令にてプログラムカウンタ（ｐｃ）にレジスタｒ１の値が代入され、分岐が発生する。つまり関数ｉｎｔｅｒｐｒｅｔｅｒの引数ｉｎｓｔがＡならば０ｘ１０００への、Ｂならば０ｘ２０００への分岐となる。
【００５８】
図７の右段には、プロセッサ命令列７０２が実行されていく過程における引数スタック１１３の状態を示している。
【００５９】
関数ｉｎｔｅｒｐｒｅｔｅｒの呼び出し時には、引数ｉｎｓｔが引数スタック１１３にプッシュされる。また、その後に呼び出される下位関数ｆｕｎｃの呼び出し時には、下位関数ｆｕｎｃの引数ａが引数スタック１１３にプッシュされる。この時点で引数ａが引数スタックの先頭値になる。
【００６０】
また、関数ｆｕｎｃのリターン時には、引数ａがポップされ、引数ｉｎｓｔが再び引数スタック１１３の先頭値になる。アドレス０ｘ０１００の分岐が発生した際、引数ｉｎｓｔがＡの際は分岐結果バッファ１１６に分岐先アドレスが０ｘ１０００の分岐結果エントリが作られる。アドレス０ｘ０１００の分岐が発生した際、引数ｉｎｓｔがＢの際は分岐結果バッファ１１６に分岐先アドレスが０ｘ２０００の分岐結果エントリが作られる。
【００６１】
当該分岐結果エントリができるとそれ以降に引数ＡやＢで関数ｉｎｔｅｒｐｒｅｔｅｒを実行した際、アドレス０ｘ０１００に位置する分岐命令の実行時に、それぞれの分岐先アドレスが予測値として得られるようになる。
【００６２】
図８は、コンパイラ１１９のコンパイルにおける動作を示すフローチャートである。図８は、特に、関数の呼び出し時の関数のコンパイルの動作を示している。なお、ここでは、本実施の形態の発明に係る部分のみの動作を記載するものとし、その他の動作についての詳細は従来のコンパイルに準ずるものとして割愛する。
【００６３】
コンパイラ１１９は、関数のコンパイル時に、当該関数内において、特定の引数が分岐先を決定するかどうかを判定する（ステップＳ８０１）。
【００６４】
当該判定には、以下の手順を踏む。まず、関数を解析し、関数内に分岐命令があるかどうかを検索する。そして、分岐命令があった場合に、当該分岐命令の分岐の条件に用いられるデータが、関数の引数に含まれているかどうかを判定する。これによって、関数の引数が分岐先を決定するかどうかを判定する。
【００６５】
関数の呼び出し時に当該関数の引数のうち、特定の引数が分岐先を決定すると判定された場合に（ステップＳ８０１のＹＥＳ）、分岐先を決定する引数を、引数スタック１１３が値を取得するレジスタに格納するコードを生成する（ステップＳ８０２）。即ち、関数の引数に含まれる特定の引数をレジスタ０に格納させるコードを生成する。例えば、分岐先を決定する引数が関数の第１引数であった場合には、当該第１引数をレジスタ０に、分岐先を決定する引数が関数の第３引数であった場合には、当該第３引数をレジスタ０に格納させるコードを生成する。
【００６６】
そして、コンパイラ１１９は、引数スタック１１３にどのレジスタの引数を取得するのかを指定するコードを生成する（ステップＳ８０３）。ここでは、コンパイラ１１９は、引数スタック１１３に、レジスタ０の値を取得するコードを生成する。
【００６７】
そして、コンパイラ１１９は、関数内の各命令を通常通りコンパイルして終了する。
【００６８】
特定の引数が分岐先を決定しない場合（ステップＳ８０１のＮＯ）、コンパイラ１１９は、通常通り、関数の各命令をコンパイルして終了する。
【００６９】
図９は、図８に示した動作に従ってコンパイルされたコード列においてオブジェクトファイルのリンク動作を示すフローチャートである。当該動作は、命令実行時の値のレジスタへの格納の仕方を示すものであり、それ以外の動作については、従来の命令の実行の仕方に準ずるものとし、ここでは割愛する。
【００７０】
図９に示すように、命令実行部１１０は、呼び出し先の関数が引数を渡すレジスタを指定する情報を保持しているか否かを判定する（ステップＳ９０１）。
【００７１】
引数を渡すレジスタを指定する情報を保持している場合には（ステップＳ９０１のＹＥＳ）、コンパイラ１１９は、その情報に従って、関数呼び出し部分のレジスタへ引数を格納するコードを修正する（ステップＳ９０２）。つまり、どの引数をどのレジスタに格納するのかを指定するコードがある場合に、指定されている引数をレジスタ０に格納するコードに修正する。指定されていない場合には、高級言語プログラムに記載されている順で、関数の引数がレジスタ番号の若い順に格納される。
【００７２】
全ての関数呼び出しのリンクを終了したかどうかを判定し（ステップＳ９０３）、終了していた場合には（ステップＳ９０３）、オブジェクトファイルのリンク処理を終了し、終了していなかった場合には、ステップＳ９０１に戻る。
【００７３】
このコンパイル方法に従って、関数呼び出しが実行され、分岐命令が実行された場合の例を、図１０を用いて説明する。図１０は、関数が呼び出されて、その関数内で分岐命令が実行される場合の一具体例を示している。ここでは、分岐命令の一例として、ｓｗｉｔｃｈ〜ｃａｓｅ文を示している。ｓｗｉｔｃｈ〜ｃａｓｅ文は、例えば、Ｃ言語や、Ｃ＋＋、ＰＨＰ（Hypertext Preprocessor。なお、ＰＨＰは、Personal Home Page toolsの略であるがＰＨＰの本来意味するところは、Hypertext Preprocessorである。）などの言語で用いられる。本実施の形態に係る情報処理装置１００の分岐予測部が予測を成功にさせるためには、分岐に影響する関数の引数を、引数スタック１１３に記憶する必要がある。図１０では、その為の引数のレジスタへの格納の仕方を示している。
【００７４】
図１０（ａ）のプログラム１００１では、ｓｗｉｔｃｈ文に影響する引数は、ｓｗｉｔｃｈ文の引数がａ０であることから、分岐に関連する引数もａ０であることがわかる。そこで、関数ｆｕｎｃＡの呼び出し時には、引数スタック１１３には、引数ａ０が渡される必要がある。そのため、ｆｕｎｃＡの第１引数であるａ０がレジスタ０に格納される構成をとる。この場合のコンパイラ１１９が生成するコードは、例えば、第１引数をレジスタ０に格納する命令、例えば、「ｍｖ  ｒ０（ａ０）」などによって実現される。上述の通り、引数スタック１１３に渡される引数は、レジスタ０に格納されている値なので、これにより、分岐に関連する引数が引数スタック１１３に格納されることとなる。
【００７５】
一方、図１０（ｂ）のプログラム１００２では、ｓｗｉｔｃｈ文に関連する引数は、ｂ１である。当該引数ｂ１は、関数ｆｕｎｃＢの第２引数となっている。そこで、図１０（ｂ）の場合においては、ｆｕｎｃＢの第２引数ｂ１がレジスタ０に格納される構成となる。これにより、引数スタック１１３に分岐に関連する引数が格納されることとなる。この第２引数が格納される構成はコンパイラ１１９によるコンパイル時に引数のレジスタへの格納の際の格納の仕方を指定することにより実現される。
＜変形例＞
上記実施の形態において示した情報処理装置１００を変形した別構成例の情報処理装置３００について説明する。本変形例においては、上記実施の形態に示した情報処理装置１００との差異についてのみ説明するものとし、その他の情報処理装置１００に共通する内容については、説明を割愛する。
【００７６】
図１１は、情報処理装置３００の機能構成を示す機能ブロック図である。
【００７７】
情報処理装置３００は、情報処理装置１００とは異なり、命令実行部１１０とは一部別の動作をする命令実行部１２２を備え、また、情報処理装置１００が備えていなかった引数番号通知部１２１を備える。その他の構成については、情報処理装置３００は情報処理装置１００と同様の構成をとる。
【００７８】
命令実行部１２２は、命令フェッチ部１１８により記憶装置２００からフェッチされた命令を実行し、更に、分岐に影響する関数の引数を指定する命令を解釈して、引数番号通知部２１に通知する機能を有する。引数を指定する命令は、コンパイル時にコンパイラがプログラムを解析し、自動的に付加するものとする。
【００７９】
引数番号通知部１２１は、指定された引数の番号を命令実行部１２２から取得し、取得した引数番号を引数スタック１２３に通知する機能を有する。
【００８０】
引数スタック１２３は、引数番号通知部１２１から通知を受けて、指定された引数をプッシュする機能を有する。引数スタック１２３は、引数スタック１１３と同様に、関数呼び出し通知部１１１からの通知を受けて、その関数の引数をプッシュし、関数リターン通知部１１２からの通知を受けて、その関数の引数をポップする。即ち、引数スタック１２３の先頭値には現在実行中の関数の引数が保持される。
【００８１】
当該構成を備えることにより、情報処理装置１００の分岐予測機構１１００は、分岐に影響する引数をより確実に引数スタックに格納することができる。
【００８２】
図１２は、引数スタック１２３における、関数の引数を保存した例を示している。図１２は、引数番号通知部１２１を用いて関数の引数を取得する手順を示している。図１２（ａ）では、分岐となるｓｗｉｔｃｈ〜ｃａｓｅ文に影響する引数は、ａ０である。図１２（ａ）に示される命令ａｒｇが分岐に影響する引数を通知する。図１２（ａ）の命令ａｒｇのオペランド０は、分岐に影響する引数が格納されたレジスタ群１２０のレジスタ番号を示す。ゆえに、図１２（ａ）の場合、引数スタック１２３は、ａｒｇ命令で指定されたレジスタ０の値をプッシュする。
【００８３】
図１２（ｂ）では、分岐に影響する引数は、ｂ１である。図１２（ｂ）の命令ａｒｇのオペランドは、１となっている。これにより、分岐に影響するレジスタ群１２０のレジスタ番号がレジスタ１であることがわかり、引数スタック１２３は、関数呼び出しの際に、ａｒｇ命令で指定されたレジスタ１の値をプッシュする。
【００８４】
当該構成を実現するために、コンパイラ１１９は、コンパイル時にこのａｒｇ命令を生成する必要がある。上記実施の形態においては、コンパイラ１１９は、どの引数をレジスタ０に格納するかを指定するコードを生成した（ｍｖ命令でレジスタに格納する値を指定していた）のに対し、本変形例においては、どのレジスタの値を引数スタックがプッシュするのかを指定するコードを生成する。
＜まとめ＞
上記実施の形態、及び、その変形例において示してきたように、情報処理装置１００は、関数呼び出しを行う際に、その引数を取得する引数スタックを備える。そして、分岐命令が実行される段において、その引数スタックに格納されている値の先頭値と、実行される分岐命令の位置するアドレスとから、過去の分岐結果を検索して、分岐先を予測する。また、分岐命令が実際に実行された場合に、その分岐命令の位置するアドレスと、その時点での引数スタックの先頭値と、分岐先のアドレスとを対応付けた分岐結果エントリを記憶しておくことで、以降において実行される分岐命令の分岐先の予測の確度を高めていくことができる。関数呼び出しにおいて、その引数を取得する引数スタックを備えることにより、従来技術のような暗示オペレーション命令という分岐予測のキー情報を指定する命令を組み込まずとも、間接分岐の分岐予測を実現できる。即ち、任意のプログラムにおいて、そのプログラム内に含まれる分岐命令の分岐先の予測が可能となる。
＜補足＞
上記実施の形態において、本発明の実施の手法について説明してきたが、本発明の実施形態がこれに限られないことは勿論である。以下、上記実施形態以外に本発明として含まれる各種の変形例について説明する。
（１）上記実施の形態においては、関数呼び出し通知部１１１は、命令実行部１１０が実行する命令がコンパイラ１１９により特定の命令を以ってコンパイルされることを検知して、関数の呼び出しが実行されることを通知する構成とした。しかし、関数の呼び出しを検知する手法はこれに限るものではなく、実行される命令を解析して、予め定められた特定の命令文と一致する命令があるかどうかで検知してもよい。あるいは、コンパイラ１１９が関数呼び出しを通知する専用の命令を生成して、関数呼び出し通知部１１１に当該命令を出力することで、関数呼び出し通知部１１１が関数呼び出しの実行を検知することとしてもよい。
【００８５】
同様に、関数リターン通知部１１２も上記実施の形態において示したようにコンパイラ１１９が特定の命令を実行したことを検知することで、関数のリターンの実行を検知するのではなく、上述した手法、例えば、コンパイラからの関数リターンの実行の通知を受けるなどの手法用いて関数のリターンを検知することとしてもよい。
（２）上記実施の形態においては、分岐予測部１１７が、引数スタック１１３の先頭値を用いて予測する手法を示したが、分岐命令実行時に、その分岐命令がどの関数内において実行されるのか、また、その関数に対応する引数がどれであるのかを対応付けて記憶されているのであれば、引数スタック１１３の先頭値ではなく、必要とする引数を参照する構成としてもよい。つまり、引数スタック１１３は、引数を取得する際に、そのとき呼び出された関数を示す情報とを対応付けて記憶するものとし、分岐予測部１１７は、分岐命令の実行を通知されたときに、その分岐命令が含まれる関数の情報を受け取り、当該関数の情報で示される関数に対応する引数を引数スタック１１３から取得する構成としてもよい。
（３）上記実施の形態においては、分岐予測部１１７が分岐命令のアドレスと、引数スタック１１３の先頭値とが一致する分岐結果エントリが複数ある場合について詳細に説明しなかった。ここでは、その説明をする。
【００８６】
分岐結果エントリは上述した内容に更に、分岐したかどうかの頻度を求めるための情報も対応付けられていてもよい。即ち、各分岐結果エントリは、更に分岐カウント値も対応付けられていてもよい。当該分岐カウント値は、その分岐結果エントリに示される分岐命令が実際にその分岐結果エントリで示される分岐先に分岐した場合に＋１され、分岐しなかった場合に−１される。
【００８７】
そして、分岐予測部１１７は、検索の結果該当する分岐結果エントリが複数ある場合には、分岐カウント値が最も高い分岐結果エントリの分岐先を、実行される分岐命令の分岐先として、命令フェッチ部１１８にアドレスを通知してよい。
【００８８】
これにより、分岐予測の確度を高めることができる。
【００８９】
なお、上述の分岐カウント値において、当該分岐カウント値は、分岐結果エントリの分岐の確度を示すためのものであればよく、上述の分岐しなかった分岐結果エントリの分岐カウンタを−１する構成は設けなくともよい。
【００９０】
また、加算する値も１でなくともよく、予め定められた値であってもよい。
（４）上記実施の形態においては、分岐に影響する引数が１つの場合の具体例を示したが、分岐に影響する引数が複数ある場合がある。
【００９１】
ここでは、その場合についての情報処理装置３００における動作について図１３を参照しながら説明する。
【００９２】
図１３は、このような場合に、引数を指定する命令で、順に分岐に影響する引数を指定する例を示している。
【００９３】
図１３のｓｗｉｔｃｈ文に示されるように、その引数は、各分岐に引数ａ１、ａ０が分岐に影響する。そのため、プロセッサ命令列のａｒｇ命令で示されるように、高級言語プログラムの関数呼び出し時の引数の順序（ａ０、ａ１、ａ２）におけるａ０とａ１の順序とは逆に命令列としてコンパイルされる。
【００９４】
そして、引数スタック１２３は、この順序で引数をプッシュする。即ち、先にａ０をプッシュし、その後にａ１をプッシュする。こうすることで、分岐命令の実行時に、各分岐命令に関連する引数を分岐予測のキー情報として用いることができる。なお、分岐の予測、分岐結果バッファへの分岐結果エントリへの格納は、引数スタックからポップさせた引数を利用する。
【００９５】
なお、図１３（ａ）に示した構成は、図１３（ｂ）に示すような構成によっても実現できる。即ち図１３（ｂ）に示すように引数スタック１２３が複数の引数を保持できる構成である。図１３（ｂ）には、引数スタック１２３が一段階で複数の引数を保持できる場合を示している。分岐予測部１１７は、分岐予測の際には、引数スタック１２３の同じ段階に格納された値を順に用いる。
【００９６】
どの引数をどのレジスタに格納するかについては、上記実施の形態、変形例に示したように、コンパイラ１１９が、レジスタに格納する変数を指定するコードを生成することによって実現できる。
（５）上記実施の形態においては、間接分岐の例を示したが、分岐先が固定されている分岐命令の条件実行時に、予測することも可能である。
【００９７】
図１４は、分岐先が固定されている場合の分岐結果バッファ１１６への記録の例を示している。図１４のプログラム例では、ｔｓｔ命令でレジスタｒ０の値がａと等しいかが判断され、その結果によって条件分岐命令ｂｌｅｑが実行されるかが決まる。ｂｌｅｑ命令が実行されるとｒ１で示されるアドレスへの分岐が発生する。
【００９８】
分岐結果バッファ１１６に格納されている分岐結果情報は、分岐命令の位置する分岐命令アドレス３０１と、引数スタック１１３の先頭値３０２と、分岐が発生したか否かの分岐結果が対応付けられている。
【００９９】
分岐予測部１１７は、条件分岐命令が実行される場合に、分岐結果バッファ１１６に当該条件分岐命令の位置するアドレスと、そのときの引数スタック１１３の先頭値とに一致する分岐結果エントリがあるかどうかを検索し、あった場合に、その分岐結果エントリの分岐３０４が分岐したことを示す場合に、固定となっている分岐先のアドレスを命令フェッチ部１１８に通知し、分岐しなかったことを示す場合に、条件分岐命令の次のアドレスを命令フェッチ部１１８に通知する。
【０１００】
この構成によって、間接分岐だけでなく、条件分岐の分岐予測も可能となる。
（６）上記実施の形態においては、命令実行部１１０が引数を格納するためのレジスタ群１２０を備える構成を示した。
【０１０１】
ここでは、命令実行部１１０が、レジスタ群１２０を備える構成以外の構成について説明する。即ち、命令実行部１１０が、引数を記憶装置２００に記憶する構成にした場合を、図１５を用いて説明する。
【０１０２】
この場合、命令実行部１１０は、引数をどこに格納したかを示すスタックポインタレジスタ１５０１を備える。そして、記憶装置２００は、スタックポインタレジスタ１５０１で示されるスタック１５０２に、関数の引数を記憶する。引数スタック１１３は、関数呼び出し通知部１１２により関数の呼び出しが通知された場合に、命令実行部１１０からスタックポインタレジスタ１５０１の値を取得し、記憶装置２００の当該スタックポインタレジスタ１５０１で示されるスタック１５０２に格納されている値を引数として取得して記憶する。
【０１０３】
このような構成にしても、引数スタック１１３は分岐命令に関連する関数呼び出し時の引数をプッシュできる。
【０１０４】
図１５に示す手法を用いて、引数の取得を行った場合の具体例を図１６に示す。
【０１０５】
図１６（ａ）に示すように、プログラム５０１中のｆｕｎｃＡが呼び出された際に、その関数ａ０、ａ１、ａ２がスタック１６０２の先頭にａ０が来るように格納される。このときスタックポインタレジスタ１５０１にはスタック１６０２の先頭アドレスが格納される。
【０１０６】
そして、分岐命令（図１６（ａ）のｓｗｉｔｃｈ文）が実行されるタイミングで、引数スタック１１３には、スタックポインタレジスタ１５０１で示されるアドレスであるスタック１６０２の先頭に保持されているａ０が引数スタック１１３に格納される。
【０１０７】
また、図１６（ｂ）に示すように、プログラム５０２中のｆｕｎｃＢが呼び出された際に、その関数ｂ０、ｂ１、ｂ２がスタック１６０２の先頭に分岐命令に関連するｂ１が来るように格納される。このときスタックポインタレジスタ１５０１にはスタック１６０２の先頭アドレスが格納される。
【０１０８】
そして、分岐命令（図１６（ｂ）のｓｗｉｔｃｈ文）が実行されるタイミングで、引数スタック１１３には、スタックポインタレジスタ１５０１で示されるアドレスであるスタック１６０２の先頭に保持されているｂ１が引数スタック１１３に格納される。
（７）上記実施の形態においては、引数スタック１１３にレジスタ０に格納されている値のみを格納する構成を示した。
【０１０９】
ここでは、本発明の思想として含まれるそれ以外の実施の形態を示す。
【０１１０】
図１７（ａ）は、引数スタック１１３の容量を多くとり、レジスタ０に格納されている引数だけでなく、関数呼び出しの際に受け取る引数全てを格納する例を示している。
【０１１１】
また、ここでは、全ての引数を引数スタックに渡す場合を記載しているが、関数呼び出しの際に受け取る引数全てでなくとも、そのうちの複数の引数を格納する構成としてもよい。例えば、図１７（ａ）の例で言えば、引数ａ０と引数ａ１と引数ａ２とを引数スタックに格納する構成としてもよい。この場合には、例えば、レジスタ０〜レジスタ２に格納されている３つの引数を格納するという構成にすればよい。
【０１１２】
これにより引数１つのみで、分岐予測を行う場合に比して、分岐予測の確度を高めることができる。
【０１１３】
また、図１７（ｂ）に示すように、引数スタック１１３は、レジスタ０の引数を格納するだけでなく、更に、引数スタック１１３をリターンスタックと兼用してもよい。即ち、リターンスタックを用いるプロセッサにおいては、引数スタックと同じタイミングで、リターンアドレスのプッシュとポップが行われるので、同じスタック内にリターンアドレスと引数とを組にして保持してもよい。なお、図１７（ｂ）において、ａｄｄｒｅｓｓＡ、ａｄｄｒｅｓｓＢ、ａｄｄｒｅｓｓＣは、それぞれｆｕｎｃＡ、ｆｕｎｃＢ、ｆｕｎｃＣのリターンアドレスを示している。こうすることで、リターンスタックとの併用が可能になる。
（８）上記実施の形態においては、関数の引数を保持するのに引数スタックを用いたが、引数スタックとして用いるものは必ずしもスタック形式に限るものではなく、上記実施の形態において引数スタックとして示した内容を実行できるものであればよい。
（９）図１及び図１１に示した情報処理装置１００、３００の各機能部は集積化されて１又は複数のＬＳＩ（Large Scale Integration）により実現されてもよい。また、複数の機能部が１のＬＳＩにより実現されてもよい。
【０１１４】
ＬＳＩは集積度の違いにより、ＩＣ（Integrated Circuit）、システムＬＳＩ、ＶＬＳＩ（Very Large Scale Integration）、ＳＬＳＩ（Super Large Scale Integration）、ＵＬＳＩ（Ultra Large Scale Integration）などと呼称されることもある。
【０１１５】
また、集積回路化の手法はＬＳＩに限られるものではなく、専用回路または汎用プロセッサで実現しても良い。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Field Programmable Gate Array）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
【０１１６】
さらに、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行っても良い。バイオ技術の適応等が可能性としてあり得る。
（１０）上述の実施形態で示した分岐予測に係る動作、分岐予測の処理等（図６等参照）を情報処理装置等のプロセッサ、及びそのプロセッサに接続された各種回路に実行させるためのプログラムコードからなる制御プログラムを、記録媒体に記録すること、又は各種通信路（例えば、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク）等を介して流通させ頒布させることもできる。このような記録媒体には、ＩＣカード、ハードディスク、光ディスク、フレキシブルディスク、ＲＯＭ等がある。流通、頒布された制御プログラムはプロセッサに読み出され得るメモリ等に格納されることにより利用に供され、そのプロセッサがその制御プログラムを実行することにより、実施形態で示したような各種機能が実現されるようになる。
（１１）以下に本発明に係る分岐予測装置の実施態様とその効果について説明する。
【０１１７】
本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴とする分岐予測装置である。
【０１１８】
また、本発明は、情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測方法である。
【０１１９】
また、本発明は、プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、前記分岐予測処理は、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測プログラム記録媒体である。
【０１２０】
引数スタックが関数呼び出し時にその関数の引数を取得する構成を備え、当該引数と、過去の分岐結果を対応付けた情報を分岐結果記憶部が保持しており、実際に分岐命令が実行されるタイミングにおいて、分岐予測部が、分岐命令のアドレスと、引数スタックの先頭値とに基づいて、過去の分岐結果を分岐結果記憶部から検索して、検索がヒットした場合に、分岐結果エントリの分岐先を分岐命令の分岐先として予測することができる。
【０１２１】
また、実際に分岐命令が実行された際には、その分岐命令の位置するアドレスと、引数スタックの先頭値と、分岐先のアドレスとが対応付けられた分岐結果エントリが分岐結果記憶部に追加されるので、以降において分岐命令が実行される場合の分岐予測の確度を高めることができる。
【０１２２】
前記分岐予測装置は、更に、前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除することとしてもよい。
【０１２３】
これにより、関数がリターンされると、引数スタックに格納されている引数が削除されることにより、常に、引数スタックの先頭値を、現在実行されている関数の引数とすることができ、分岐予測装置は、間違いなく分岐命令が含まれる関数の引数を分岐の予測のための情報として用いることができる。
【０１２４】
また、前記分岐予測装置において、前記分岐命令は条件付分岐命令であり、前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録することとしてもよい。
【０１２５】
これにより、分岐命令が条件分岐命令である場合に、その条件分岐の成否の情報を対応付けることにより、例えば、その成否に基づいて、条件分岐が成立するかどうかを判定して、分岐予測を実行することができる。
【０１２６】
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した頻度を示す頻度情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、最も分岐した頻度が高い分岐結果エントリの分岐先アドレスを予測結果とすることとしてもよい。
【０１２７】
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を１加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を１減算することとしてもよい。
【０１２８】
これにより、分岐結果エントリは、各分岐エントリが実行された頻度を特定するための情報が対応付けられており、実行される分岐命令のアドレスと、引数スタックの先頭値とに対応する分岐結果エントリが複数あった場合に、それらの分岐結果エントリの中で最も実行頻度の高い分岐結果エントリを分岐先として予測することができる。これにより、分岐予測の確度を高めることができる。
【０１２９】
また、前記分岐予測装置において、前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納することとしてもよい。
【０１３０】
これにより、命令実行部の予め定められたレジスタに格納された値を引数として引数スタックに渡すことができるので、これを前提とした装置作りが容易となる。
【０１３１】
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成することとしてもよい。
【０１３２】
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含むこととしてもよい。
【０１３３】
これにより、引数スタックに渡される引数を、関数の呼び出し時に必ず特定のレジスタに格納するようにコンピュータを制御することができるので、関数内の分岐命令の分岐先を決定する引数を確実に引数スタックに格納することを保障することができる。
【産業上の利用可能性】
【０１３４】
本発明に係る分岐予測装置は、プログラムの実行性能の向上に寄与し、プロセッサの処理速度の向上を促すものとして有用である。よって、プロセッサを用いるものであれば、幅広い分野において有効である。例えば、大型計算機や、パーソナルコンピュータのような形態のみならず、各種の家電機器、携帯電話機のような通信機器、産業機器、制御機器などでも利用可能である。
【符号の説明】
【０１３５】
１００、３００  情報処理装置
１１０、１２２  命令実行部
１１１  関数呼び出し通知部
１１２  関数リターン通知部
１１３、１２３  引数スタック
１１４  分岐命令通知部
１１５  分岐結果記録部
１１６  分岐結果バッファ
１１７  分岐予測部
１１８  命令フェッチ部
１２０  レジスタ群
１２１  引数番号通知部
２００  記憶装置
１０００、１１００  分岐予測機構
【図１】
2010134330.tif 000003
【図２】
2010134330.tif 000004
【図３】
2010134330.tif 000005
【図４】
2010134330.tif 000006
【図５】
2010134330.tif 000007
【図６】
2010134330.tif 000008
【図７】
2010134330.tif 000009
【図８】
2010134330.tif 000010
【図９】
2010134330.tif 000011
【図１０】
2010134330.tif 000012
【図１１】
2010134330.tif 000013
【図１２】
2010134330.tif 000014
【図１３】
2010134330.tif 000015
【図１４】
2010134330.tif 000016
【図１５】
2010134330.tif 000017
【図１６】
2010134330.tif 000018
【図１７】
2010134330.tif 000019
【手続補正書】
【提出日】平成22年9月1日(2010.9.1)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
命令を実行する命令実行部と、
前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、
前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックと、
前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、
分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、
前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、
前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、
前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、
前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する
ことを特徴とする分岐予測装置。
【請求項２】
前記分岐命令は条件付分岐命令であり、
前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録する
ことを特徴とする請求項１記載の分岐予測装置。
【請求項３】
前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した回数を示す回数情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、
前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、回数情報で示される回数が最も多い分岐結果エントリの分岐先アドレスを予測結果とする
ことを特徴とする請求項１記載の分岐予測装置。
【請求項４】
前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を１加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を１減算する
ことを特徴とする請求項３記載の分岐予測装置。
【請求項５】
前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納する
ことを特徴とする請求項１記載の分岐予測装置。
【請求項６】
情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
関数リターン命令の実行を通知する関数リターン通知ステップと、
前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップと
を含むことを特徴とする分岐予測方法。
【請求項７】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する
ことを特徴とするコンパイラ。
【請求項８】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含む
ことを特徴とするコンパイル方法。
【請求項９】
プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、
前記分岐予測処理は、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
関数リターン命令の実行を通知する関数リターン通知ステップと、
前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップとを含む
ことを特徴とする分岐予測プログラム記録媒体。
【請求項１０】
（削除）
【手続補正書】
【提出日】平成23年1月14日(2011.1.14)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置において実行される命令の分岐予測に関する。
【背景技術】
【０００２】
プロセッサの命令には、指定したアドレスへジャンプする分岐命令が含まれていることがある。現在のプロセッサでは、命令はパイプライン構造で実行される。
パイプラインでの命令実行では、ある命令の実行が完了する前に、その先のアドレスに位置する命令を先行してフェッチしている。ここで、分岐命令が実行されるとプログラムのフローが変更されて、フェッチした命令が不要となることがある。そのため、フェッチした命令は不要となり、新たに分岐先の命令のアドレスをフェッチする必要がある。
【０００３】
この命令のフェッチのやり直しは、パイプラインの途中まで進んでいる命令処理の放棄（これをパイプラインハザードという）を引き起こし、プロセッサの実行性能を低下させる一要因となっている。
【０００４】
そこで、プロセッサにとって、分岐命令の分岐先を予測することが重要となる。
分岐命令の一種に、条件分岐命令がある。条件分岐命令とは、その時々の演算結果により分岐が発生するかどうかが決まる分岐命令のことである。分岐が発生しない場合には、後続する命令が実行され、分岐が発生する場合は、固定の分岐先のアドレスで指定される命令が実行される。
【０００５】
当該条件分岐命令においては、分岐が発生するか否かを過去の分岐結果から推測して分岐先を決定する技術がある。即ち、過去の分岐結果で分岐が発生するか否かの統計をとっておいて、分岐が発生したか否かの確率の高い方を分岐先と予測する。これによって、条件分岐命令の分岐予測の確度を高めることができる。
【０００６】
しかし、分岐命令には、より複雑な分岐として間接分岐と呼ばれるものがある。間接分岐とは、あるレジスタに設定された値へのジャンプ命令や、プログラムカウンタのアドレス代入によるジャンプ等、ジャンプ先が不定の分岐である。
【０００７】
間接分岐では、条件分岐による分岐するか否かの不定に加え、ジャンプ先も不定となるため、単純な分岐予測機能では分岐先の予測は不可能である。
間接分岐を予測する一つの従来の技術として、リターンスタックがある。関数実行後の戻り先は、関数の呼び出し元によって変わるので、呼び出し元のアドレスをメモリ上のスタックなどに記録しておき、関数からの復帰（リターン）時にはこのアドレスへとジャンプする。関数呼び出し時に戻り先アドレスを専用のリターンスタックに保存されており、関数からのリターン命令をフェッチした際は、メモリ上の戻り先アドレスを取得してのジャンプの処理に先駆けて、リターンスタックより戻りアドレスを取得して次にフェッチすべきアドレスの予測として用いる。
【０００８】
また、間接分岐に対する分岐予測の技術の一つとして、間接分岐の結果に寄与するキー情報を、プログラム中でプログラマが専用の暗示オペレーション命令を用いてキー情報を指定して、分岐先を予測するものがある（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特表２００４−５３３６９５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、上記特許文献１に記載の技術では、専用の暗示オペレーション命令を用いてプロセッサにキー情報を通知する必要があり、予測対象となるプログラム内に暗示オペレーション命令を組み込む手間が存在する。
【００１１】
本発明は、上記手間を軽減するためのものであり、プログラムに上述の暗示オペレーション命令のような専用の処理を組み込むことなく、任意のプログラムに対して、間接分岐を含むプログラムの分岐を予測する分岐予測装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するため、本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴としている。
【発明の効果】
【００１３】
ここで、関数とは、コンピュータプログラムにおける所謂サブルーチンのことをいう。
上述のような構成によって、分岐予測装置は、関数の呼び出しを実行する際に、その関数の引数を引数スタックが取得して、分岐命令が実行される場合に、引数スタックが保持する引数と、過去の分岐結果を用いて、分岐を予測することができる。これにより、ユーザがプログラムに上記特許文献１における暗示オペレーション命令のような特殊の命令を組み込まずとも分岐予測装置が分岐予測のためのキーとなる情報として自動的にその分岐命令が属する関数の引数を取得して分岐予測を実現でき、任意のプログラムで間接分岐の分岐予測を実現できる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施の形態に係る分岐予測装置の機能構成を示した機能ブロック図である。
【図２】図２は、引数スタック１１３への引数の渡し方を示す概要図である。
【図３】図３は、分岐結果バッファに格納されている分岐結果情報の構成例を示すデータ概念図である。
【図４】図４は、プログラムが実行されて引数が引数スタックに格納される様子を示す概要図である。
【図５】図５は、分岐予測部１１７が実行する分岐予測の際の検索の仕方を示す概要図である。
【図６】図６は、情報処理装置１００の分岐予測に係る動作を示したフローチャートである。
【図７】図７は、高級言語プログラムと、当該高級言語プログラムのアセンブラコードと、引数スタックに格納される引数の関係とを示す関係図である。
【図８】図８は、コンパイラ１１９のコンパイルにおける動作を示すフローチャートである。
【図９】図９は、コンパイラ１１９がコンパイルした命令を実行する際の命令実行部１１０の動作を示すフローチャートである。
【図１０】図１０は、関数の引数と、分岐命令の引数と、引数スタックに格納される引数との関係を示す関係図である。
【図１１】図１１は、変形例に係る情報処理装置３００の別構成例を示す機能ブロック図である。
【図１２】図１２は、変形例に係る情報処理装置３００の引数スタックへの引数の渡し方の具体例を示す図である。
【図１３】図１３は、変形例に係る情報処理装置３００の引数スタックへの引数の渡し方の別具体例を示す図である。
【図１４】図１４は、図８に示すプログラムの分岐命令を実行した場合の分岐予測部の検索の仕方を示す概要図である。
【図１５】図１５は、引数スタックへの引数の渡し方の別例を示す図である。
【図１６】図１６は、図１５に示す引数スタックの引数の渡し方の具体例を示す図である。
【図１７】図１７は、引数スタックの別構成例を示した図である。
【発明を実施するための形態】
【００１５】
＜実施の形態＞
本発明に係る分岐予測装置の一実施形態である分岐予測機構１０００が含まれる情報処理装置１００について図面を参照しながら説明する。
＜構成＞
図１は、情報処理装置１００の機能構成を示した機能ブロック図である。図１に示すように情報処理装置１００は、命令実行部１１０と、関数呼び出し通知部１１１と、関数リターン通知部１１２と、引数スタック１１３と、分岐命令通知部１１４と、分岐結果記録部１１５と、分類結果バッファ１１６と、分岐予測部１１７と、命令フェッチ部１１８と、コンパイラ１１９とを含んで構成される。
【００１６】
情報処理装置１００は、記憶装置２００に接続されており、記憶装置２００に格納されている命令を逐次読み出して実行するプロセッサである。
命令実行部１１０は、コンパイラ１１９が実行形式に変換した命令列を、記憶装置２００からフェッチされ、順次実行する機能を有する。
【００１７】
関数呼び出し通知部１１１は、命令実行部１１０が関数呼び出しを行った場合にそれを検知して、その旨を引数スタック１１３に通知する機能を有する。ここでいう関数は所謂サブルーチンの呼び出しのことであり、１以上の命令を実行するためのルーチンの呼び出しのことをいう。高級言語における関数は、コンパイラ１１９によりプロセッサの命令列にコンパイルされて実行される。関数呼び出し通知部１１１は、コンパイラ１１９が関数の呼び出し部分のコンパイルに特定の命令を用いる場合に、当該特定の命令の実行を検知することで、関数呼び出しが実行されることを検出する。特定の命令とは、例えば、ジャンプと同時に、そのジャンプ命令の次のアドレスを戻り番地としてリターンレジスタと呼ばれる特定のレジスタに保持する命令等である。関数をどのようにコンパイルするのかは、情報処理装置１００が用いるコンパイルの規約に従って定められている。関数呼び出し通知部１１１は、その規約に従って命令列がコンパイルされることを想定して、特定の命令がどのような命令であるかを記憶しておき、その予め定められた特定の命令の実行を検知することで関数の呼び出しが実行されることを通知する。
【００１８】
関数リターン通知部１１２は、命令実行部１１０が関数を終了した、即ちリターンしたかどうかを監視し、リターンした場合にその旨を引数スタック１１３に通知する機能を有する。関数の呼び出しと同様に関数のリターンにおいてもコンパイラ１１９が特定の命令を用いてコンパイルされるので、コンパイラ１１９による当該特定の命令の実行を検知することで関数リターン通知部１１２は関数のリターンを検知する。
【００１９】
引数スタック１１３は、関数呼び出し通知部１１１から関数の呼び出しがあったことを通知された場合に、命令実行部１１０の特定のレジスタに格納されている値を、呼び出された関数の引数として取得し、プッシュ、即ち、記憶する機能を有する。また、関数リターン通知部１１２から、関数が終了した、即ちリターンしたことを通知された場合に、一番最後に格納した引数を出力、即ち、ポップする機能も有する。なお、引数スタック１１３は所謂ＦＩＬＯ（First In Last Out）型のメモリであり、本明細書においては、引数スタック１１３から保持している引数をポップさせる場合に出力される値を引数スタック１１３の先頭値と記載する。上述のプッシュとポップを行うことにより、引数スタック１１３の先頭値には、必ず、現在実行されている関数の引数が保持される構成となっている。
【００２０】
図２は引数スタック１１３における処理、即ち引数の取得の仕方の詳細を示す図である。
関数への引数の渡し方についても予め定められており、関数の引数は、通常、高級言語プログラムにおいて記載されている順に、命令実行部１１０が保持するレジスタ群１２０の各レジスタに割り当てられている番号の小さいものから順に、格納されていく。つまり、レジスタ０が関数の第１引数を、レジスタ１が関数の第２引数を、レジスタ２が関数の第３引数を、・・・というように各レジスタに引数が格納される。こうして、レジスタに格納されている引数のうち、本実施の形態においては、図２に示すように、引数スタック１１３は、レジスタ０に格納されている引数を取得して、記憶する。
【００２１】
また、図４は、引数スタック１１３への引数の格納の手順の一具体例を示している。
プログラム４００の関数ｆｕｎｃＡは、引数ａ０、ａ１、ａ２を受け取る。この引数ａ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。関数ｆｕｎｃＡ内において、プログラム４００は、関数ｆｕｎｃＢを呼び出す。関数ｆｕｎｃＢは、引数ｂ０、ｂ１、ｂ２を受け取る。引数ｂ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。関数ｆｕｎｃＢ内において、プログラム４００は、関数ｆｕｎｃＣを呼び出す。関数ｆｕｎｃＣは、引数ｃ０、ｃ１、ｃ２を受け取る。引数ｃ０は、レジスタ０に格納され、引数スタック１１３にプッシュされる。図４のプログラム４００の右横には、そのときの引数スタック１１３の保持している引数の情報を示しており、図４を見れば明らかなように、最後に呼び出された関数ｆｕｎｃＣの第１引数であるｃ０が先頭値となっている。なお、図４においては、引数スタック１１３の上側が先頭値となる。
【００２２】
図１に戻って、分岐命令通知部１１４は、命令実行部１１０が実行する命令が分岐命令であるかを判定し、肯定的な判定をした場合に、その旨を分岐結果記録部１１５と分岐予測部１１７に通知する機能を有する。
【００２３】
分岐結果記録部１１５は、分岐命令通知部１１４から分岐命令の実行が通知されると、命令実行部１１０が実行した当該分岐命令のアドレスを取得するとともに、命令実行部１１０における当該分岐命令の実行の結果、分岐した分岐先のアドレスとを取得する。また、分岐結果記録部１１５は、分岐命令を実行したときの引数スタック１１３の先頭値も取得する。分岐結果記録部１１５は、そして、取得した分岐命令のアドレスと、分岐の時点での引数スタック１１３の先頭値と、分岐命令の分岐先のアドレスとを対応付けて、分岐結果バッファ１１６に記録する機能を有する。
【００２４】
分岐結果バッファ１１６は、分岐命令が位置するアドレスと、当該分岐命令が実行されるときの引数スタックの先頭値と、分岐命令の分岐先のアドレスとを対応付けた分岐結果エントリを記憶しているメモリである。
【００２５】
図３に、分岐結果バッファ１１６が記憶している分岐結果情報のデータ構成例を示すデータ概念図を示す。
分岐結果情報は、分岐命令アドレス３０１と、引数スタックの先頭値３０２と、分岐先３０３とを対応付けた分岐結果エントリを統合した情報である。
【００２６】
分岐命令アドレス３０１は、分岐命令の位置するアドレスを示す情報である。
引数スタックの先頭値３０２は、対応する分岐命令が実行されたときの、引数スタック１１３に格納されていた引数を示す情報である。
【００２７】
分岐先３０３は、分岐命令が実際に実行されて、分岐した分岐先のアドレスを示す情報である。
当該分岐結果情報が分岐結果バッファ１１６に記憶されていることにより、分岐予測部１１７は、分岐の予測を実行できる。
【００２８】
図１に戻って分岐予測部１１７は、分岐命令通知部１１４からの通知を受けると、当該通知とともに伝達される分岐命令のアドレスと、そのときの引数スタック１１３の先頭値とを取得する。分岐予測部１１７は、取得した分岐命令のアドレスと、引数スタック１１３の先頭値の両方とに一致する分岐結果エントリが分岐結果バッファ１１６にあるかどうかを検索する。そして、分岐予測部１１７は、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐先を、分岐命令の予測先として、命令フェッチ部１１８に通知する機能を有する。
【００２９】
図５は、その分岐予測部１１７が分岐結果バッファを検索する際の検索の仕方を示した概要図である。
図５に示すように、分岐予測部１１７は、分岐命令の位置するアドレスとそのときに引数スタック１１３から取得した引数とが対応する分岐結果エントリが、分岐結果バッファ１１６にあるかどうかを検索する。即ち、分岐予測部１１７は、実行される分岐命令のアドレスを取得し、取得した分岐命令のアドレスと一致するアドレスがあるかどうかを検索する。
【００３０】
次に、分岐命令のアドレスと一致する分岐結果エントリがある場合に次に、その分岐結果エントリのうち、引数スタック１１３から取得した引数について引数スタックの先頭値３０２に一致するものがあるかどうかを検索する。
【００３１】
こうして、両者に一致する分岐結果エントリの分岐先を、分岐命令の分岐先として予測する。
再度、図１に戻って、命令フェッチ部１１８は、記憶装置２００より命令をフェッチする機能を有する。命令フェッチ部１１８は、分岐予測部１１７から、次に実行する命令のアドレスを通知されていた場合に、通知されたアドレスから命令のフェッチを行う機能を有する。
【００３２】
以上が、情報処理装置１００の各機能部の説明である。  
＜動作＞
図６は、情報処理装置１００の分岐予測の動作を示したフローチャートである。本フローチャートに基づいて、情報処理装置１００の分岐予測における動作を説明する。
【００３３】
図６に示すように、情報処理装置１００の分岐命令通知部１１４は、分岐命令が実行されることを検知して、その旨を分岐予測部１１７に通知する（ステップＳ６０１）。
分岐予測部１１７は、分岐命令通知部１１４から、分岐命令の実行を通知されると、そのときの引数スタック１１３の先頭値を取得する。また、分岐予測部１１７は、分岐命令通知部１１４からは、実行される分岐命令のアドレスも取得する（ステップＳ６０２）。
【００３４】
そして、取得した分岐命令のアドレスと、引数スタック１１３の先頭値とに一致する分岐結果エントリが、分岐結果バッファ１１６に記憶されているかどうかを検索する（ステップＳ６０３）。
【００３５】
分岐予測部１１７は、分岐結果バッファ１１６に分岐結果エントリが記憶されていた場合（ステップＳ６０３のＹＥＳ）、実行される分岐命令のアドレスと、引数スタック１１３の先頭値とに一致する分岐結果エントリの分岐先３０３を、当該分岐命令の分岐先として予測する（ステップＳ６０４）。
【００３６】
命令フェッチ部１１８は、分岐予測部１１７から通知されたアドレスの命令を記憶装置２００から呼び出して、命令実行部１１０にフェッチする（ステップＳ６０５）。
分岐結果バッファ１１６に分岐結果エントリが記憶されていなかった場合（ステップＳ６０３のＮＯ）、分岐予測部１１７は、命令フェッチ部１１８に予測なしを示す情報を出力する。すると命令フェッチ部１１８は、当該分岐命令の次のアドレスの命令をフェッチする。
【００３７】
そして、実際に分岐命令が実行される（ステップＳ６０７）と、分岐結果記録部１１５は、当該分岐命令のアドレスと、当該分岐命令が実行された時点における引数スタック１１３の先頭値と、分岐命令の実行の結果分岐した分岐先のアドレスとを対応付けた分岐結果エントリを分岐結果バッファ１１６に記録する（ステップＳ６０８）。
【００３８】
以上が、分岐予測部１１７の分岐予測並びに分岐命令の実行時の情報処理装置１００の動作である。
図７は、高級言語プログラムと、コンパイルされたプロセッサ命令列、そして、その命令列が実行されることによって、引数スタック１１３に格納される引数を示す図である。
【００３９】
図７に示す高級言語プログラム７０１の関数ｉｎｔｅｒｐｒｅｔｅｒは、擬似命令ｉｎｓｔを引数とするインタープリンタ言語の実行関数である。Ｊａｖａ（登録商標）Ｓｃｒｉｐｔなどは、テキストファイルのプログラムを解釈して擬似命令にコンパイルした後、その擬似命令をインタープリンタで処理する。典型的には、インタープリンタを実装する関数は、図７に示したように個々の擬似言語に応じた処理をｓｗｉｔｃｈ〜ｃａｓｅ文で実現する。
【００４０】
図７に示すプロセッサ命令列７０２は、関数ｉｎｔｅｒｐｒｅｔｅｒを、擬似的なプロセッサ命令列で示したものである。ここでは、ｍｖ命令で引数ｉｎｓｔをレジスタｒ０に格納した後、ｂｌ命令で関数ｉｎｔｅｒｐｒｅｔｅｒの先頭へのジャンプ（関数呼び出し）が行われる。
【００４１】
関数ｉｎｔｅｒｐｒｅｔｅｒ内においては、まず下位関数として、関数ｆｕｎｃが、引数をａとして呼び出される。
その後、レジスタｒ０、即ち関数ｉｎｔｅｒｐｒｅｔｅｒの引数がＡであるかをｔｓｔ命令で判定する。Ａと等しい場合にレジスタｒ１に数値０ｘ０１０００が格納される。同様にｒ０がＢならばレジスタｒ１には０ｘ２０００が格納される。アドレス０ｘ０１００に位置するｍｖ命令にてプログラムカウンタ（ｐｃ）にレジスタｒ１の値が代入され、分岐が発生する。つまり関数ｉｎｔｅｒｐｒｅｔｅｒの引数ｉｎｓｔがＡならば０ｘ１０００への、Ｂならば０ｘ２０００への分岐となる。
【００４２】
図７の右段には、プロセッサ命令列７０２が実行されていく過程における引数スタック１１３の状態を示している。
関数ｉｎｔｅｒｐｒｅｔｅｒの呼び出し時には、引数ｉｎｓｔが引数スタック１１３にプッシュされる。また、その後に呼び出される下位関数ｆｕｎｃの呼び出し時には、下位関数ｆｕｎｃの引数ａが引数スタック１１３にプッシュされる。この時点で引数ａが引数スタックの先頭値になる。
【００４３】
また、関数ｆｕｎｃのリターン時には、引数ａがポップされ、引数ｉｎｓｔが再び引数スタック１１３の先頭値になる。アドレス０ｘ０１００の分岐が発生した際、引数ｉｎｓｔがＡの際は分岐結果バッファ１１６に分岐先アドレスが０ｘ１０００の分岐結果エントリが作られる。アドレス０ｘ０１００の分岐が発生した際、引数ｉｎｓｔがＢの際は分岐結果バッファ１１６に分岐先アドレスが０ｘ２０００の分岐結果エントリが作られる。
【００４４】
当該分岐結果エントリができるとそれ以降に引数ＡやＢで関数ｉｎｔｅｒｐｒｅｔｅｒを実行した際、アドレス０ｘ０１００に位置する分岐命令の実行時に、それぞれの分岐先アドレスが予測値として得られるようになる。
【００４５】
図８は、コンパイラ１１９のコンパイルにおける動作を示すフローチャートである。図８は、特に、関数の呼び出し時の関数のコンパイルの動作を示している。なお、ここでは、本実施の形態の発明に係る部分のみの動作を記載するものとし、その他の動作についての詳細は従来のコンパイルに準ずるものとして割愛する。
【００４６】
コンパイラ１１９は、関数のコンパイル時に、当該関数内において、特定の引数が分岐先を決定するかどうかを判定する（ステップＳ８０１）。
当該判定には、以下の手順を踏む。まず、関数を解析し、関数内に分岐命令があるかどうかを検索する。そして、分岐命令があった場合に、当該分岐命令の分岐の条件に用いられるデータが、関数の引数に含まれているかどうかを判定する。これによって、関数の引数が分岐先を決定するかどうかを判定する。
【００４７】
関数の呼び出し時に当該関数の引数のうち、特定の引数が分岐先を決定すると判定された場合に（ステップＳ８０１のＹＥＳ）、分岐先を決定する引数を、引数スタック１１３が値を取得するレジスタに格納するコードを生成する（ステップＳ８０２）。即ち、関数の引数に含まれる特定の引数をレジスタ０に格納させるコードを生成する。例えば、分岐先を決定する引数が関数の第１引数であった場合には、当該第１引数をレジスタ０に、分岐先を決定する引数が関数の第３引数であった場合には、当該第３引数をレジスタ０に格納させるコードを生成する。
【００４８】
そして、コンパイラ１１９は、引数スタック１１３にどのレジスタの引数を取得するのかを指定するコードを生成する（ステップＳ８０３）。ここでは、コンパイラ１１９は、引数スタック１１３に、レジスタ０の値を取得するコードを生成する。
【００４９】
そして、コンパイラ１１９は、関数内の各命令を通常通りコンパイルして終了する。
特定の引数が分岐先を決定しない場合（ステップＳ８０１のＮＯ）、コンパイラ１１９は、通常通り、関数の各命令をコンパイルして終了する。
【００５０】
図９は、図８に示した動作に従ってコンパイルされたコード列においてオブジェクトファイルのリンク動作を示すフローチャートである。当該動作は、命令実行時の値のレジスタへの格納の仕方を示すものであり、それ以外の動作については、従来の命令の実行の仕方に準ずるものとし、ここでは割愛する。
【００５１】
図９に示すように、命令実行部１１０は、呼び出し先の関数が引数を渡すレジスタを指定する情報を保持しているか否かを判定する（ステップＳ９０１）。
引数を渡すレジスタを指定する情報を保持している場合には（ステップＳ９０１のＹＥＳ）、コンパイラ１１９は、その情報に従って、関数呼び出し部分のレジスタへ引数を格納するコードを修正する（ステップＳ９０２）。つまり、どの引数をどのレジスタに格納するのかを指定するコードがある場合に、指定されている引数をレジスタ０に格納するコードに修正する。指定されていない場合には、高級言語プログラムに記載されている順で、関数の引数がレジスタ番号の若い順に格納される。
【００５２】
全ての関数呼び出しのリンクを終了したかどうかを判定し（ステップＳ９０３）、終了していた場合には（ステップＳ９０３）、オブジェクトファイルのリンク処理を終了し、終了していなかった場合には、ステップＳ９０１に戻る。
【００５３】
このコンパイル方法に従って、関数呼び出しが実行され、分岐命令が実行された場合の例を、図１０を用いて説明する。図１０は、関数が呼び出されて、その関数内で分岐命令が実行される場合の一具体例を示している。ここでは、分岐命令の一例として、ｓｗｉｔｃｈ〜ｃａｓｅ文を示している。ｓｗｉｔｃｈ〜ｃａｓｅ文は、例えば、Ｃ言語や、Ｃ＋＋、ＰＨＰ（Hypertext Preprocessor。なお、ＰＨＰは、Personal Home Page toolsの略であるがＰＨＰの本来意味するところは、Hypertext Preprocessorである。）などの言語で用いられる。本実施の形態に係る情報処理装置１００の分岐予測部が予測を成功にさせるためには、分岐に影響する関数の引数を、引数スタック１１３に記憶する必要がある。図１０では、その為の引数のレジスタへの格納の仕方を示している。
【００５４】
図１０（ａ）のプログラム１００１では、ｓｗｉｔｃｈ文に影響する引数は、ｓｗｉｔｃｈ文の引数がａ０であることから、分岐に関連する引数もａ０であることがわかる。そこで、関数ｆｕｎｃＡの呼び出し時には、引数スタック１１３には、引数ａ０が渡される必要がある。そのため、ｆｕｎｃＡの第１引数であるａ０がレジスタ０に格納される構成をとる。この場合のコンパイラ１１９が生成するコードは、例えば、第１引数をレジスタ０に格納する命令、例えば、「ｍｖ  ｒ０（ａ０）」などによって実現される。上述の通り、引数スタック１１３に渡される引数は、レジスタ０に格納されている値なので、これにより、分岐に関連する引数が引数スタック１１３に格納されることとなる。
【００５５】
一方、図１０（ｂ）のプログラム１００２では、ｓｗｉｔｃｈ文に関連する引数は、ｂ１である。当該引数ｂ１は、関数ｆｕｎｃＢの第２引数となっている。そこで、図１０（ｂ）の場合においては、ｆｕｎｃＢの第２引数ｂ１がレジスタ０に格納される構成となる。これにより、引数スタック１１３に分岐に関連する引数が格納されることとなる。この第２引数が格納される構成はコンパイラ１１９によるコンパイル時に引数のレジスタへの格納の際の格納の仕方を指定することにより実現される。
＜変形例＞
上記実施の形態において示した情報処理装置１００を変形した別構成例の情報処理装置３００について説明する。本変形例においては、上記実施の形態に示した情報処理装置１００との差異についてのみ説明するものとし、その他の情報処理装置１００に共通する内容については、説明を割愛する。
【００５６】
図１１は、情報処理装置３００の機能構成を示す機能ブロック図である。
情報処理装置３００は、情報処理装置１００とは異なり、命令実行部１１０とは一部別の動作をする命令実行部１２２を備え、また、情報処理装置１００が備えていなかった引数番号通知部１２１を備える。その他の構成については、情報処理装置３００は情報処理装置１００と同様の構成をとる。
【００５７】
命令実行部１２２は、命令フェッチ部１１８により記憶装置２００からフェッチされた命令を実行し、更に、分岐に影響する関数の引数を指定する命令を解釈して、引数番号通知部１２１に通知する機能を有する。引数を指定する命令は、コンパイル時にコンパイラがプログラムを解析し、自動的に付加するものとする。
【００５８】
引数番号通知部１２１は、指定された引数の番号を命令実行部１２２から取得し、取得した引数番号を引数スタック１２３に通知する機能を有する。
引数スタック１２３は、引数番号通知部１２１から通知を受けて、指定された引数をプッシュする機能を有する。引数スタック１２３は、引数スタック１１３と同様に、関数呼び出し通知部１１１からの通知を受けて、その関数の引数をプッシュし、関数リターン通知部１１２からの通知を受けて、その関数の引数をポップする。即ち、引数スタック１２３の先頭値には現在実行中の関数の引数が保持される。
【００５９】
当該構成を備えることにより、情報処理装置１００の分岐予測機構１１００は、分岐に影響する引数をより確実に引数スタックに格納することができる。
図１２は、引数スタック１２３における、関数の引数を保存した例を示している。図１２は、引数番号通知部１２１を用いて関数の引数を取得する手順を示している。図１２（ａ）では、分岐となるｓｗｉｔｃｈ〜ｃａｓｅ文に影響する引数は、ａ０である。図１２（ａ）に示される命令ａｒｇが分岐に影響する引数を通知する。図１２（ａ）の命令ａｒｇのオペランド０は、分岐に影響する引数が格納されたレジスタ群１２０のレジスタ番号を示す。ゆえに、図１２（ａ）の場合、引数スタック１２３は、ａｒｇ命令で指定されたレジスタ０の値をプッシュする。
【００６０】
図１２（ｂ）では、分岐に影響する引数は、ｂ１である。図１２（ｂ）の命令ａｒｇのオペランドは、１となっている。これにより、分岐に影響するレジスタ群１２０のレジスタ番号がレジスタ１であることがわかり、引数スタック１２３は、関数呼び出しの際に、ａｒｇ命令で指定されたレジスタ１の値をプッシュする。
【００６１】
当該構成を実現するために、コンパイラ１１９は、コンパイル時にこのａｒｇ命令を生成する必要がある。上記実施の形態においては、コンパイラ１１９は、どの引数をレジスタ０に格納するかを指定するコードを生成した（ｍｖ命令でレジスタに格納する値を指定していた）のに対し、本変形例においては、どのレジスタの値を引数スタックがプッシュするのかを指定するコードを生成する。
＜まとめ＞
上記実施の形態、及び、その変形例において示してきたように、情報処理装置１００は、関数呼び出しを行う際に、その引数を取得する引数スタックを備える。そして、分岐命令が実行される段において、その引数スタックに格納されている値の先頭値と、実行される分岐命令の位置するアドレスとから、過去の分岐結果を検索して、分岐先を予測する。また、分岐命令が実際に実行された場合に、その分岐命令の位置するアドレスと、その時点での引数スタックの先頭値と、分岐先のアドレスとを対応付けた分岐結果エントリを記憶しておくことで、以降において実行される分岐命令の分岐先の予測の確度を高めていくことができる。関数呼び出しにおいて、その引数を取得する引数スタックを備えることにより、従来技術のような暗示オペレーション命令という分岐予測のキー情報を指定する命令を組み込まずとも、間接分岐の分岐予測を実現できる。即ち、任意のプログラムにおいて、そのプログラム内に含まれる分岐命令の分岐先の予測が可能となる。
＜補足＞
上記実施の形態において、本発明の実施の手法について説明してきたが、本発明の実施形態がこれに限られないことは勿論である。以下、上記実施形態以外に本発明として含まれる各種の変形例について説明する。
（１）上記実施の形態においては、関数呼び出し通知部１１１は、命令実行部１１０が実行する命令がコンパイラ１１９により特定の命令を以ってコンパイルされることを検知して、関数の呼び出しが実行されることを通知する構成とした。しかし、関数の呼び出しを検知する手法はこれに限るものではなく、実行される命令を解析して、予め定められた特定の命令文と一致する命令があるかどうかで検知してもよい。あるいは、コンパイラ１１９が関数呼び出しを通知する専用の命令を生成して、関数呼び出し通知部１１１に当該命令を出力することで、関数呼び出し通知部１１１が関数呼び出しの実行を検知することとしてもよい。
【００６２】
同様に、関数リターン通知部１１２も上記実施の形態において示したようにコンパイラ１１９が特定の命令を実行したことを検知することで、関数のリターンの実行を検知するのではなく、上述した手法、例えば、コンパイラからの関数リターンの実行の通知を受けるなどの手法を用いて関数のリターンを検知することとしてもよい。
（２）上記実施の形態においては、分岐予測部１１７が、引数スタック１１３の先頭値を用いて予測する手法を示したが、分岐命令実行時に、その分岐命令がどの関数内において実行されるのか、また、その関数に対応する引数がどれであるのかを対応付けて記憶されているのであれば、引数スタック１１３の先頭値ではなく、必要とする引数を参照する構成としてもよい。つまり、引数スタック１１３は、引数を取得する際に、そのとき呼び出された関数を示す情報とを対応付けて記憶するものとし、分岐予測部１１７は、分岐命令の実行を通知されたときに、その分岐命令が含まれる関数の情報を受け取り、当該関数の情報で示される関数に対応する引数を引数スタック１１３から取得する構成としてもよい。
（３）上記実施の形態においては、分岐予測部１１７が分岐命令のアドレスと、引数スタック１１３の先頭値とが一致する分岐結果エントリが複数ある場合について詳細に説明しなかった。ここでは、その説明をする。
【００６３】
分岐結果エントリは上述した内容に更に、分岐したかどうかの頻度を求めるための情報も対応付けられていてもよい。即ち、各分岐結果エントリは、更に分岐カウント値も対応付けられていてもよい。当該分岐カウント値は、その分岐結果エントリに示される分岐命令が実際にその分岐結果エントリで示される分岐先に分岐した場合に＋１され、分岐しなかった場合に−１される。
【００６４】
そして、分岐予測部１１７は、検索の結果該当する分岐結果エントリが複数ある場合には、分岐カウント値が最も高い分岐結果エントリの分岐先を、実行される分岐命令の分岐先として、命令フェッチ部１１８にアドレスを通知してよい。
【００６５】
これにより、分岐予測の確度を高めることができる。
なお、上述の分岐カウント値において、当該分岐カウント値は、分岐結果エントリの分岐の確度を示すためのものであればよく、上述の分岐しなかった分岐結果エントリの分岐カウンタを−１する構成は設けなくともよい。
【００６６】
また、加算する値も１でなくともよく、予め定められた値であってもよい。
（４）上記実施の形態においては、分岐に影響する引数が１つの場合の具体例を示したが、分岐に影響する引数が複数ある場合がある。
【００６７】
ここでは、その場合についての情報処理装置３００における動作について図１３を参照しながら説明する。
図１３は、このような場合に、引数を指定する命令で、順に分岐に影響する引数を指定する例を示している。
【００６８】
図１３のｓｗｉｔｃｈ文に示されるように、その引数は、各分岐に引数ａ１、ａ０が分岐に影響する。そのため、プロセッサ命令列のａｒｇ命令で示されるように、高級言語プログラムの関数呼び出し時の引数の順序（ａ０、ａ１、ａ２）におけるａ０とａ１の順序とは逆に命令列としてコンパイルされる。
【００６９】
そして、引数スタック１２３は、この順序で引数をプッシュする。即ち、先にａ０をプッシュし、その後にａ１をプッシュする。こうすることで、分岐命令の実行時に、各分岐命令に関連する引数を分岐予測のキー情報として用いることができる。なお、分岐の予測、分岐結果バッファへの分岐結果エントリへの格納は、引数スタックからポップさせた引数を利用する。
【００７０】
なお、図１３（ａ）に示した構成は、図１３（ｂ）に示すような構成によっても実現できる。即ち図１３（ｂ）に示すように引数スタック１２３が複数の引数を保持できる構成である。図１３（ｂ）には、引数スタック１２３が一段階で複数の引数を保持できる場合を示している。分岐予測部１１７は、分岐予測の際には、引数スタック１２３の同じ段階に格納された値を順に用いる。
【００７１】
どの引数をどのレジスタに格納するかについては、上記実施の形態、変形例に示したように、コンパイラ１１９が、レジスタに格納する変数を指定するコードを生成することによって実現できる。
（５）上記実施の形態においては、間接分岐の例を示したが、分岐先が固定されている分岐命令の条件実行時に、予測することも可能である。
【００７２】
図１４は、分岐先が固定されている場合の分岐結果バッファ１１６への記録の例を示している。図１４のプログラム例では、ｔｓｔ命令でレジスタｒ０の値がａと等しいかが判断され、その結果によって条件分岐命令ｂｌｅｑが実行されるかが決まる。ｂｌｅｑ命令が実行されるとｒ１で示されるアドレスへの分岐が発生する。
【００７３】
分岐結果バッファ１１６に格納されている分岐結果情報は、分岐命令の位置する分岐命令アドレス３０１と、引数スタック１１３の先頭値３０２と、分岐が発生したか否かの分岐結果が対応付けられている。
【００７４】
分岐予測部１１７は、条件分岐命令が実行される場合に、分岐結果バッファ１１６に当該条件分岐命令の位置するアドレスと、そのときの引数スタック１１３の先頭値とに一致する分岐結果エントリがあるかどうかを検索し、あった場合に、その分岐結果エントリの分岐３０４が分岐したことを示す場合に、固定となっている分岐先のアドレスを命令フェッチ部１１８に通知し、分岐しなかったことを示す場合に、条件分岐命令の次のアドレスを命令フェッチ部１１８に通知する。
【００７５】
この構成によって、間接分岐だけでなく、条件分岐の分岐予測も可能となる。
（６）上記実施の形態においては、命令実行部１１０が引数を格納するためのレジスタ群１２０を備える構成を示した。
【００７６】
ここでは、命令実行部１１０が、レジスタ群１２０を備える構成以外の構成について説明する。即ち、命令実行部１１０が、引数を記憶装置２００に記憶する構成にした場合を、図１５を用いて説明する。
【００７７】
この場合、命令実行部１１０は、引数をどこに格納したかを示すスタックポインタレジスタ１５０１を備える。そして、記憶装置２００は、スタックポインタレジスタ１５０１で示されるスタック１５０２に、関数の引数を記憶する。引数スタック１１３は、関数呼び出し通知部１１２により関数の呼び出しが通知された場合に、命令実行部１１０からスタックポインタレジスタ１５０１の値を取得し、記憶装置２００の当該スタックポインタレジスタ１５０１で示されるスタック１５０２に格納されている値を引数として取得して記憶する。
【００７８】
このような構成にしても、引数スタック１１３は分岐命令に関連する関数呼び出し時の引数をプッシュできる。
図１５に示す手法を用いて、引数の取得を行った場合の具体例を図１６に示す。
【００７９】
図１６（ａ）に示すように、プログラム５０１中のｆｕｎｃＡが呼び出された際に、その関数ａ０、ａ１、ａ２がスタック１６０２の先頭にａ０が来るように格納される。このときスタックポインタレジスタ１５０１にはスタック１６０２の先頭アドレスが格納される。
【００８０】
そして、分岐命令（図１６（ａ）のｓｗｉｔｃｈ文）が実行されるタイミングで、引数スタック１１３には、スタックポインタレジスタ１５０１で示されるアドレスであるスタック１６０２の先頭に保持されているａ０が引数スタック１１３に格納される。
【００８１】
また、図１６（ｂ）に示すように、プログラム５０２中のｆｕｎｃＢが呼び出された際に、その引数ｂ０、ｂ１、ｂ２がスタック１６０２の先頭に分岐命令に関連するｂ１が来るように格納される。このときスタックポインタレジスタ１５０１にはスタック１６０２の先頭アドレスが格納される。
【００８２】
そして、分岐命令（図１６（ｂ）のｓｗｉｔｃｈ文）が実行されるタイミングで、引数スタック１１３には、スタックポインタレジスタ１５０１で示されるアドレスであるスタック１６０２の先頭に保持されているｂ１が引数スタック１１３に格納される。
（７）上記実施の形態においては、引数スタック１１３にレジスタ０に格納されている値のみを格納する構成を示した。
【００８３】
ここでは、本発明の思想として含まれるそれ以外の実施の形態を示す。
図１７（ａ）は、引数スタック１１３の容量を多くとり、レジスタ０に格納されている引数だけでなく、関数呼び出しの際に受け取る引数全てを格納する例を示している。
【００８４】
また、ここでは、全ての引数を引数スタックに渡す場合を記載しているが、関数呼び出しの際に受け取る引数全てでなくとも、そのうちの複数の引数を格納する構成としてもよい。例えば、図１７（ａ）の例で言えば、引数ａ０と引数ａ１と引数ａ２とを引数スタックに格納する構成としてもよい。この場合には、例えば、レジスタ０〜レジスタ２に格納されている３つの引数を格納するという構成にすればよい。
【００８５】
これにより引数１つのみで、分岐予測を行う場合に比して、分岐予測の確度を高めることができる。
また、図１７（ｂ）に示すように、引数スタック１１３は、レジスタ０の引数を格納するだけでなく、更に、引数スタック１１３をリターンスタックと兼用してもよい。即ち、リターンスタックを用いるプロセッサにおいては、引数スタックと同じタイミングで、リターンアドレスのプッシュとポップが行われるので、同じスタック内にリターンアドレスと引数とを組にして保持してもよい。なお、図１７（ｂ）において、ａｄｄｒｅｓｓＡ、ａｄｄｒｅｓｓＢ、ａｄｄｒｅｓｓＣは、それぞれｆｕｎｃＡ、ｆｕｎｃＢ、ｆｕｎｃＣのリターンアドレスを示している。こうすることで、リターンスタックとの併用が可能になる。
（８）上記実施の形態においては、関数の引数を保持するのに引数スタックを用いたが、引数スタックとして用いるものは必ずしもスタック形式に限るものではなく、上記実施の形態において引数スタックとして示した内容を実行できるものであればよい。
（９）図１及び図１１に示した情報処理装置１００、３００の各機能部は集積化されて１又は複数のＬＳＩ（Large Scale Integration）により実現されてもよい。また、複数の機能部が１のＬＳＩにより実現されてもよい。
【００８６】
ＬＳＩは集積度の違いにより、ＩＣ（Integrated Circuit）、システムＬＳＩ、ＶＬＳＩ（Very Large Scale Integration）、ＳＬＳＩ（Super Large Scale Integration）、ＵＬＳＩ（Ultra Large Scale Integration）などと呼称されることもある。
【００８７】
また、集積回路化の手法はＬＳＩに限られるものではなく、専用回路または汎用プロセッサで実現しても良い。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Field Programmable Gate Array）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
【００８８】
さらに、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行っても良い。バイオ技術の適応等が可能性としてあり得る。
（１０）上述の実施形態で示した分岐予測に係る動作、分岐予測の処理等（図６等参照）を情報処理装置等のプロセッサ、及びそのプロセッサに接続された各種回路に実行させるためのプログラムコードからなる制御プログラムを、記録媒体に記録すること、又は各種通信路（例えば、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク）等を介して流通させ頒布させることもできる。このような記録媒体には、ＩＣカード、ハードディスク、光ディスク、フレキシブルディスク、ＲＯＭ等がある。流通、頒布された制御プログラムはプロセッサに読み出され得るメモリ等に格納されることにより利用に供され、そのプロセッサがその制御プログラムを実行することにより、実施形態で示したような各種機能が実現されるようになる。
（１１）以下に本発明に係る分岐予測装置の実施態様とその効果について説明する。
【００８９】
本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴とする分岐予測装置である。
【００９０】
また、本発明は、情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測方法である。
【００９１】
また、本発明は、プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、前記分岐予測処理は、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測プログラム記録媒体である。
【００９２】
引数スタックが関数呼び出し時にその関数の引数を取得する構成を備え、当該引数と、過去の分岐結果を対応付けた情報を分岐結果記憶部が保持しており、実際に分岐命令が実行されるタイミングにおいて、分岐予測部が、分岐命令のアドレスと、引数スタックの先頭値とに基づいて、過去の分岐結果を分岐結果記憶部から検索して、検索がヒットした場合に、分岐結果エントリの分岐先を分岐命令の分岐先として予測することができる。
【００９３】
また、実際に分岐命令が実行された際には、その分岐命令の位置するアドレスと、引数スタックの先頭値と、分岐先のアドレスとが対応付けられた分岐結果エントリが分岐結果記憶部に追加されるので、以降において分岐命令が実行される場合の分岐予測の確度を高めることができる。
【００９４】
前記分岐予測装置は、更に、前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除することとしてもよい。
【００９５】
これにより、関数がリターンされると、引数スタックに格納されている引数が削除されることにより、常に、引数スタックの先頭値を、現在実行されている関数の引数とすることができ、分岐予測装置は、間違いなく分岐命令が含まれる関数の引数を分岐の予測のための情報として用いることができる。
【００９６】
また、前記分岐予測装置において、前記分岐命令は条件付分岐命令であり、前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録することとしてもよい。
【００９７】
これにより、分岐命令が条件分岐命令である場合に、その条件分岐の成否の情報を対応付けることにより、例えば、その成否に基づいて、条件分岐が成立するかどうかを判定して、分岐予測を実行することができる。
【００９８】
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した頻度を示す頻度情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、最も分岐した頻度が高い分岐結果エントリの分岐先アドレスを予測結果とすることとしてもよい。
【００９９】
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を１加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を１減算することとしてもよい。
【０１００】
これにより、分岐結果エントリは、各分岐エントリが実行された頻度を特定するための情報が対応付けられており、実行される分岐命令のアドレスと、引数スタックの先頭値とに対応する分岐結果エントリが複数あった場合に、それらの分岐結果エントリの中で最も実行頻度の高い分岐結果エントリを分岐先として予測することができる。これにより、分岐予測の確度を高めることができる。
【０１０１】
また、前記分岐予測装置において、前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納することとしてもよい。
【０１０２】
これにより、命令実行部の予め定められたレジスタに格納された値を引数として引数スタックに渡すことができるので、これを前提とした装置作りが容易となる。
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成することとしてもよい。
【０１０３】
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含むこととしてもよい。
【０１０４】
これにより、引数スタックに渡される引数を、関数の呼び出し時に必ず特定のレジスタに格納するようにコンピュータを制御することができるので、関数内の分岐命令の分岐先を決定する引数を確実に引数スタックに格納することを保障することができる。
【産業上の利用可能性】
【０１０５】
本発明に係る分岐予測装置は、プログラムの実行性能の向上に寄与し、プロセッサの処理速度の向上を促すものとして有用である。よって、プロセッサを用いるものであれば、幅広い分野において有効である。例えば、大型計算機や、パーソナルコンピュータのような形態のみならず、各種の家電機器、携帯電話機のような通信機器、産業機器、制御機器などでも利用可能である。
【符号の説明】
【０１０６】
１００、３００  情報処理装置
１１０、１２２  命令実行部
１１１  関数呼び出し通知部
１１２  関数リターン通知部
１１３、１２３  引数スタック
１１４  分岐命令通知部
１１５  分岐結果記録部
１１６  分岐結果バッファ
１１７  分岐予測部
１１８  命令フェッチ部
１２０  レジスタ群
１２１  引数番号通知部
２００  記憶装置
１０００、１１００  分岐予測機構
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
命令を実行する命令実行部と、
前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、
前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックと、
前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、
分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、
前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、
前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、
前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、
前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する
ことを特徴とする分岐予測装置。
【請求項２】
前記分岐命令は条件付分岐命令であり、
前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録する
ことを特徴とする請求項１記載の分岐予測装置。
【請求項３】
前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した回数を示す回数情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、
前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、回数情報で示される回数が最も多い分岐結果エントリの分岐先アドレスを予測結果とする
ことを特徴とする請求項１記載の分岐予測装置。
【請求項４】
前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を１加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を１減算する
ことを特徴とする請求項３記載の分岐予測装置。
【請求項５】
前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納する
ことを特徴とする請求項１記載の分岐予測装置。
【請求項６】
情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
関数リターン命令の実行を通知する関数リターン通知ステップと、
前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップと
を含むことを特徴とする分岐予測方法。
【請求項７】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する
ことを特徴とするコンパイラ。
【請求項８】
分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、
前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含む
ことを特徴とするコンパイル方法。
【請求項９】
プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、
前記分岐予測処理は、
関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、
前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、
前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
関数リターン命令の実行を通知する関数リターン通知ステップと、
前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップとを含む
ことを特徴とする分岐予測プログラム記録媒体。
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2010134330.tif 000020
【図２】
2010134330.tif 000021
【図３】
2010134330.tif 000022
【図４】
2010134330.tif 000023
【図５】
2010134330.tif 000024
【図６】
2010134330.tif 000025
【図７】
2010134330.tif 000026
【図８】
2010134330.tif 000027
【図９】
2010134330.tif 000028
【図１０】
2010134330.tif 000029
【図１１】
2010134330.tif 000030
【図１２】
2010134330.tif 000031
【図１３】
2010134330.tif 000032
【図１４】
2010134330.tif 000033
【図１５】
2010134330.tif 000034
【図１６】
2010134330.tif 000035
【図１７】
2010134330.tif 000036
【国際調査報告】
2010134330.tif 000037
2010134330.tif 000038
2010134330.tif 000039