JP5347023B2 - 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体 - Google Patents

分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体 Download PDF

Info

Publication number
JP5347023B2
JP5347023B2 JP2011514333A JP2011514333A JP5347023B2 JP 5347023 B2 JP5347023 B2 JP 5347023B2 JP 2011514333 A JP2011514333 A JP 2011514333A JP 2011514333 A JP2011514333 A JP 2011514333A JP 5347023 B2 JP5347023 B2 JP 5347023B2
Authority
JP
Japan
Prior art keywords
branch
instruction
function
argument
result
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2011514333A
Other languages
English (en)
Other versions
JPWO2010134330A1 (ja
Inventor
克重 天野
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2011514333A priority Critical patent/JP5347023B2/ja
Publication of JPWO2010134330A1 publication Critical patent/JPWO2010134330A1/ja
Application granted granted Critical
Publication of JP5347023B2 publication Critical patent/JP5347023B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3844Speculative instruction execution using dynamic branch prediction, e.g. using branch history tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • G06F9/3806Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)

Description

本発明は、情報処理装置において実行される命令の分岐予測に関する。
プロセッサの命令には、指定したアドレスへジャンプする分岐命令が含まれていることがある。現在のプロセッサでは、命令はパイプライン構造で実行される。
パイプラインでの命令実行では、ある命令の実行が完了する前に、その先のアドレスに位置する命令を先行してフェッチしている。ここで、分岐命令が実行されるとプログラムのフローが変更されて、フェッチした命令が不要となることがある。そのため、フェッチした命令は不要となり、新たに分岐先の命令のアドレスをフェッチする必要がある。
この命令のフェッチのやり直しは、パイプラインの途中まで進んでいる命令処理の放棄(これをパイプラインハザードという)を引き起こし、プロセッサの実行性能を低下させる一要因となっている。
そこで、プロセッサにとって、分岐命令の分岐先を予測することが重要となる。
分岐命令の一種に、条件分岐命令がある。条件分岐命令とは、その時々の演算結果により分岐が発生するかどうかが決まる分岐命令のことである。分岐が発生しない場合には、後続する命令が実行され、分岐が発生する場合は、固定の分岐先のアドレスで指定される命令が実行される。
当該条件分岐命令においては、分岐が発生するか否かを過去の分岐結果から推測して分岐先を決定する技術がある。即ち、過去の分岐結果で分岐が発生するか否かの統計をとっておいて、分岐が発生したか否かの確率の高い方を分岐先と予測する。これによって、条件分岐命令の分岐予測の確度を高めることができる。
しかし、分岐命令には、より複雑な分岐として間接分岐と呼ばれるものがある。間接分岐とは、あるレジスタに設定された値へのジャンプ命令や、プログラムカウンタのアドレス代入によるジャンプ等、ジャンプ先が不定の分岐である。
間接分岐では、条件分岐による分岐するか否かの不定に加え、ジャンプ先も不定となるため、単純な分岐予測機能では分岐先の予測は不可能である。
間接分岐を予測する一つの従来の技術として、リターンスタックがある。関数実行後の戻り先は、関数の呼び出し元によって変わるので、呼び出し元のアドレスをメモリ上のスタックなどに記録しておき、関数からの復帰(リターン)時にはこのアドレスへとジャンプする。関数呼び出し時に戻り先アドレスを専用のリターンスタックに保存されており、関数からのリターン命令をフェッチした際は、メモリ上の戻り先アドレスを取得してのジャンプの処理に先駆けて、リターンスタックより戻りアドレスを取得して次にフェッチすべきアドレスの予測として用いる。
また、間接分岐に対する分岐予測の技術の一つとして、間接分岐の結果に寄与するキー情報を、プログラム中でプログラマが専用の暗示オペレーション命令を用いてキー情報を指定して、分岐先を予測するものがある(特許文献1参照)。
特表2004−533695号公報
しかしながら、上記特許文献1に記載の技術では、専用の暗示オペレーション命令を用いてプロセッサにキー情報を通知する必要があり、予測対象となるプログラム内に暗示オペレーション命令を組み込む手間が存在する。
本発明は、上記手間を軽減するためのものであり、プログラムに上述の暗示オペレーション命令のような専用の処理を組み込むことなく、任意のプログラムに対して、間接分岐を含むプログラムの分岐を予測する分岐予測装置を提供することを目的とする。
上記課題を解決するため、本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴としている。
ここで、関数とは、コンピュータプログラムにおける所謂サブルーチンのことをいう。
上述のような構成によって、分岐予測装置は、関数の呼び出しを実行する際に、その関数の引数を引数スタックが取得して、分岐命令が実行される場合に、引数スタックが保持する引数と、過去の分岐結果を用いて、分岐を予測することができる。これにより、ユーザがプログラムに上記特許文献1における暗示オペレーション命令のような特殊の命令を組み込まずとも分岐予測装置が分岐予測のためのキーとなる情報として自動的にその分岐命令が属する関数の引数を取得して分岐予測を実現でき、任意のプログラムで間接分岐の分岐予測を実現できる。
図1は、実施の形態に係る分岐予測装置の機能構成を示した機能ブロック図である。 図2は、引数スタック113への引数の渡し方を示す概要図である。 図3は、分岐結果バッファに格納されている分岐結果情報の構成例を示すデータ概念図である。 図4は、プログラムが実行されて引数が引数スタックに格納される様子を示す概要図である。 図5は、分岐予測部117が実行する分岐予測の際の検索の仕方を示す概要図である。 図6は、情報処理装置100の分岐予測に係る動作を示したフローチャートである。 図7は、高級言語プログラムと、当該高級言語プログラムのアセンブラコードと、引数スタックに格納される引数の関係とを示す関係図である。 図8は、コンパイラ119のコンパイルにおける動作を示すフローチャートである。 図9は、コンパイラ119がコンパイルした命令を実行する際の命令実行部110の動作を示すフローチャートである。 図10は、関数の引数と、分岐命令の引数と、引数スタックに格納される引数との関係を示す関係図である。 図11は、変形例に係る情報処理装置300の別構成例を示す機能ブロック図である。 図12は、変形例に係る情報処理装置300の引数スタックへの引数の渡し方の具体例を示す図である。 図13は、変形例に係る情報処理装置300の引数スタックへの引数の渡し方の別具体例を示す図である。 図14は、図8に示すプログラムの分岐命令を実行した場合の分岐予測部の検索の仕方を示す概要図である。 図15は、引数スタックへの引数の渡し方の別例を示す図である。 図16は、図15に示す引数スタックの引数の渡し方の具体例を示す図である。 図17は、引数スタックの別構成例を示した図である。
<実施の形態>
本発明に係る分岐予測装置の一実施形態である分岐予測機構1000が含まれる情報処理装置100について図面を参照しながら説明する。
<構成>
図1は、情報処理装置100の機能構成を示した機能ブロック図である。図1に示すように情報処理装置100は、命令実行部110と、関数呼び出し通知部111と、関数リターン通知部112と、引数スタック113と、分岐命令通知部114と、分岐結果記録部115と、分類結果バッファ116と、分岐予測部117と、命令フェッチ部118と、コンパイラ119とを含んで構成される。
情報処理装置100は、記憶装置200に接続されており、記憶装置200に格納されている命令を逐次読み出して実行するプロセッサである。
命令実行部110は、コンパイラ119が実行形式に変換した命令列を、記憶装置200からフェッチされ、順次実行する機能を有する。
関数呼び出し通知部111は、命令実行部110が関数呼び出しを行った場合にそれを検知して、その旨を引数スタック113に通知する機能を有する。ここでいう関数は所謂サブルーチンの呼び出しのことであり、1以上の命令を実行するためのルーチンの呼び出しのことをいう。高級言語における関数は、コンパイラ119によりプロセッサの命令列にコンパイルされて実行される。関数呼び出し通知部111は、コンパイラ119が関数の呼び出し部分のコンパイルに特定の命令を用いる場合に、当該特定の命令の実行を検知することで、関数呼び出しが実行されることを検出する。特定の命令とは、例えば、ジャンプと同時に、そのジャンプ命令の次のアドレスを戻り番地としてリターンレジスタと呼ばれる特定のレジスタに保持する命令等である。関数をどのようにコンパイルするのかは、情報処理装置100が用いるコンパイルの規約に従って定められている。関数呼び出し通知部111は、その規約に従って命令列がコンパイルされることを想定して、特定の命令がどのような命令であるかを記憶しておき、その予め定められた特定の命令の実行を検知することで関数の呼び出しが実行されることを通知する。
関数リターン通知部112は、命令実行部110が関数を終了した、即ちリターンしたかどうかを監視し、リターンした場合にその旨を引数スタック113に通知する機能を有する。関数の呼び出しと同様に関数のリターンにおいてもコンパイラ119が特定の命令を用いてコンパイルされるので、コンパイラ119による当該特定の命令の実行を検知することで関数リターン通知部112は関数のリターンを検知する。
引数スタック113は、関数呼び出し通知部111から関数の呼び出しがあったことを通知された場合に、命令実行部110の特定のレジスタに格納されている値を、呼び出された関数の引数として取得し、プッシュ、即ち、記憶する機能を有する。また、関数リターン通知部112から、関数が終了した、即ちリターンしたことを通知された場合に、一番最後に格納した引数を出力、即ち、ポップする機能も有する。なお、引数スタック113は所謂FILO(First In Last Out)型のメモリであり、本明細書においては、引数スタック113から保持している引数をポップさせる場合に出力される値を引数スタック113の先頭値と記載する。上述のプッシュとポップを行うことにより、引数スタック113の先頭値には、必ず、現在実行されている関数の引数が保持される構成となっている。
図2は引数スタック113における処理、即ち引数の取得の仕方の詳細を示す図である。
関数への引数の渡し方についても予め定められており、関数の引数は、通常、高級言語プログラムにおいて記載されている順に、命令実行部110が保持するレジスタ群120の各レジスタに割り当てられている番号の小さいものから順に、格納されていく。つまり、レジスタ0が関数の第1引数を、レジスタ1が関数の第2引数を、レジスタ2が関数の第3引数を、・・・というように各レジスタに引数が格納される。こうして、レジスタに格納されている引数のうち、本実施の形態においては、図2に示すように、引数スタック113は、レジスタ0に格納されている引数を取得して、記憶する。
また、図4は、引数スタック113への引数の格納の手順の一具体例を示している。
プログラム400の関数funcAは、引数a0、a1、a2を受け取る。この引数a0は、レジスタ0に格納され、引数スタック113にプッシュされる。関数funcA内において、プログラム400は、関数funcBを呼び出す。関数funcBは、引数b0、b1、b2を受け取る。引数b0は、レジスタ0に格納され、引数スタック113にプッシュされる。関数funcB内において、プログラム400は、関数funcCを呼び出す。関数funcCは、引数c0、c1、c2を受け取る。引数c0は、レジスタ0に格納され、引数スタック113にプッシュされる。図4のプログラム400の右横には、そのときの引数スタック113の保持している引数の情報を示しており、図4を見れば明らかなように、最後に呼び出された関数funcCの第1引数であるc0が先頭値となっている。なお、図4においては、引数スタック113の上側が先頭値となる。
図1に戻って、分岐命令通知部114は、命令実行部110が実行する命令が分岐命令であるかを判定し、肯定的な判定をした場合に、その旨を分岐結果記録部115と分岐予測部117に通知する機能を有する。
分岐結果記録部115は、分岐命令通知部114から分岐命令の実行が通知されると、命令実行部110が実行した当該分岐命令のアドレスを取得するとともに、命令実行部110における当該分岐命令の実行の結果、分岐した分岐先のアドレスとを取得する。また、分岐結果記録部115は、分岐命令を実行したときの引数スタック113の先頭値も取得する。分岐結果記録部115は、そして、取得した分岐命令のアドレスと、分岐の時点での引数スタック113の先頭値と、分岐命令の分岐先のアドレスとを対応付けて、分岐結果バッファ116に記録する機能を有する。
分岐結果バッファ116は、分岐命令が位置するアドレスと、当該分岐命令が実行されるときの引数スタックの先頭値と、分岐命令の分岐先のアドレスとを対応付けた分岐結果エントリを記憶しているメモリである。
図3に、分岐結果バッファ116が記憶している分岐結果情報のデータ構成例を示すデータ概念図を示す。
分岐結果情報は、分岐命令アドレス301と、引数スタックの先頭値302と、分岐先303とを対応付けた分岐結果エントリを統合した情報である。
分岐命令アドレス301は、分岐命令の位置するアドレスを示す情報である。
引数スタックの先頭値302は、対応する分岐命令が実行されたときの、引数スタック113に格納されていた引数を示す情報である。
分岐先303は、分岐命令が実際に実行されて、分岐した分岐先のアドレスを示す情報である。
当該分岐結果情報が分岐結果バッファ116に記憶されていることにより、分岐予測部117は、分岐の予測を実行できる。
図1に戻って分岐予測部117は、分岐命令通知部114からの通知を受けると、当該通知とともに伝達される分岐命令のアドレスと、そのときの引数スタック113の先頭値とを取得する。分岐予測部117は、取得した分岐命令のアドレスと、引数スタック113の先頭値の両方とに一致する分岐結果エントリが分岐結果バッファ116にあるかどうかを検索する。そして、分岐予測部117は、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐先を、分岐命令の予測先として、命令フェッチ部118に通知する機能を有する。
図5は、その分岐予測部117が分岐結果バッファを検索する際の検索の仕方を示した概要図である。
図5に示すように、分岐予測部117は、分岐命令の位置するアドレスとそのときに引数スタック113から取得した引数とが対応する分岐結果エントリが、分岐結果バッファ116にあるかどうかを検索する。即ち、分岐予測部117は、実行される分岐命令のアドレスを取得し、取得した分岐命令のアドレスと一致するアドレスがあるかどうかを検索する。
次に、分岐命令のアドレスと一致する分岐結果エントリがある場合に次に、その分岐結果エントリのうち、引数スタック113から取得した引数について引数スタックの先頭値302に一致するものがあるかどうかを検索する。
こうして、両者に一致する分岐結果エントリの分岐先を、分岐命令の分岐先として予測する。
再度、図1に戻って、命令フェッチ部118は、記憶装置200より命令をフェッチする機能を有する。命令フェッチ部118は、分岐予測部117から、次に実行する命令のアドレスを通知されていた場合に、通知されたアドレスから命令のフェッチを行う機能を有する。
以上が、情報処理装置100の各機能部の説明である。
<動作>
図6は、情報処理装置100の分岐予測の動作を示したフローチャートである。本フローチャートに基づいて、情報処理装置100の分岐予測における動作を説明する。
図6に示すように、情報処理装置100の分岐命令通知部114は、分岐命令が実行されることを検知して、その旨を分岐予測部117に通知する(ステップS601)。
分岐予測部117は、分岐命令通知部114から、分岐命令の実行を通知されると、そのときの引数スタック113の先頭値を取得する。また、分岐予測部117は、分岐命令通知部114からは、実行される分岐命令のアドレスも取得する(ステップS602)。
そして、取得した分岐命令のアドレスと、引数スタック113の先頭値とに一致する分岐結果エントリが、分岐結果バッファ116に記憶されているかどうかを検索する(ステップS603)。
分岐予測部117は、分岐結果バッファ116に分岐結果エントリが記憶されていた場合(ステップS603のYES)、実行される分岐命令のアドレスと、引数スタック113の先頭値とに一致する分岐結果エントリの分岐先303を、当該分岐命令の分岐先として予測する(ステップS604)。
命令フェッチ部118は、分岐予測部117から通知されたアドレスの命令を記憶装置200から呼び出して、命令実行部110にフェッチする(ステップS605)。
分岐結果バッファ116に分岐結果エントリが記憶されていなかった場合(ステップS603のNO)、分岐予測部117は、命令フェッチ部118に予測なしを示す情報を出力する。すると命令フェッチ部118は、当該分岐命令の次のアドレスの命令をフェッチする。
そして、実際に分岐命令が実行される(ステップS607)と、分岐結果記録部115は、当該分岐命令のアドレスと、当該分岐命令が実行された時点における引数スタック113の先頭値と、分岐命令の実行の結果分岐した分岐先のアドレスとを対応付けた分岐結果エントリを分岐結果バッファ116に記録する(ステップS608)。
以上が、分岐予測部117の分岐予測並びに分岐命令の実行時の情報処理装置100の動作である。
図7は、高級言語プログラムと、コンパイルされたプロセッサ命令列、そして、その命令列が実行されることによって、引数スタック113に格納される引数を示す図である。
図7に示す高級言語プログラム701の関数interpreterは、擬似命令instを引数とするインタープリンタ言語の実行関数である。Java(登録商標)Scriptなどは、テキストファイルのプログラムを解釈して擬似命令にコンパイルした後、その擬似命令をインタープリンタで処理する。典型的には、インタープリンタを実装する関数は、図7に示したように個々の擬似言語に応じた処理をswitch〜case文で実現する。
図7に示すプロセッサ命令列702は、関数interpreterを、擬似的なプロセッサ命令列で示したものである。ここでは、mv命令で引数instをレジスタr0に格納した後、bl命令で関数interpreterの先頭へのジャンプ(関数呼び出し)が行われる。
関数interpreter内においては、まず下位関数として、関数funcが、引数をaとして呼び出される。
その後、レジスタr0、即ち関数interpreterの引数がAであるかをtst命令で判定する。Aと等しい場合にレジスタr1に数値0x01000が格納される。同様にr0がBならばレジスタr1には0x2000が格納される。アドレス0x0100に位置するmv命令にてプログラムカウンタ(pc)にレジスタr1の値が代入され、分岐が発生する。つまり関数interpreterの引数instがAならば0x1000への、Bならば0x2000への分岐となる。
図7の右段には、プロセッサ命令列702が実行されていく過程における引数スタック113の状態を示している。
関数interpreterの呼び出し時には、引数instが引数スタック113にプッシュされる。また、その後に呼び出される下位関数funcの呼び出し時には、下位関数funcの引数aが引数スタック113にプッシュされる。この時点で引数aが引数スタックの先頭値になる。
また、関数funcのリターン時には、引数aがポップされ、引数instが再び引数スタック113の先頭値になる。アドレス0x0100の分岐が発生した際、引数instがAの際は分岐結果バッファ116に分岐先アドレスが0x1000の分岐結果エントリが作られる。アドレス0x0100の分岐が発生した際、引数instがBの際は分岐結果バッファ116に分岐先アドレスが0x2000の分岐結果エントリが作られる。
当該分岐結果エントリができるとそれ以降に引数AやBで関数interpreterを実行した際、アドレス0x0100に位置する分岐命令の実行時に、それぞれの分岐先アドレスが予測値として得られるようになる。
図8は、コンパイラ119のコンパイルにおける動作を示すフローチャートである。図8は、特に、関数の呼び出し時の関数のコンパイルの動作を示している。なお、ここでは、本実施の形態の発明に係る部分のみの動作を記載するものとし、その他の動作についての詳細は従来のコンパイルに準ずるものとして割愛する。
コンパイラ119は、関数のコンパイル時に、当該関数内において、特定の引数が分岐先を決定するかどうかを判定する(ステップS801)。
当該判定には、以下の手順を踏む。まず、関数を解析し、関数内に分岐命令があるかどうかを検索する。そして、分岐命令があった場合に、当該分岐命令の分岐の条件に用いられるデータが、関数の引数に含まれているかどうかを判定する。これによって、関数の引数が分岐先を決定するかどうかを判定する。
関数の呼び出し時に当該関数の引数のうち、特定の引数が分岐先を決定すると判定された場合に(ステップS801のYES)、分岐先を決定する引数を、引数スタック113が値を取得するレジスタに格納するコードを生成する(ステップS802)。即ち、関数の引数に含まれる特定の引数をレジスタ0に格納させるコードを生成する。例えば、分岐先を決定する引数が関数の第1引数であった場合には、当該第1引数をレジスタ0に、分岐先を決定する引数が関数の第3引数であった場合には、当該第3引数をレジスタ0に格納させるコードを生成する。
そして、コンパイラ119は、引数スタック113にどのレジスタの引数を取得するのかを指定するコードを生成する(ステップS803)。ここでは、コンパイラ119は、引数スタック113に、レジスタ0の値を取得するコードを生成する。
そして、コンパイラ119は、関数内の各命令を通常通りコンパイルして終了する。
特定の引数が分岐先を決定しない場合(ステップS801のNO)、コンパイラ119は、通常通り、関数の各命令をコンパイルして終了する。
図9は、図8に示した動作に従ってコンパイルされたコード列においてオブジェクトファイルのリンク動作を示すフローチャートである。当該動作は、命令実行時の値のレジスタへの格納の仕方を示すものであり、それ以外の動作については、従来の命令の実行の仕方に準ずるものとし、ここでは割愛する。
図9に示すように、命令実行部110は、呼び出し先の関数が引数を渡すレジスタを指定する情報を保持しているか否かを判定する(ステップS901)。
引数を渡すレジスタを指定する情報を保持している場合には(ステップS901のYES)、コンパイラ119は、その情報に従って、関数呼び出し部分のレジスタへ引数を格納するコードを修正する(ステップS902)。つまり、どの引数をどのレジスタに格納するのかを指定するコードがある場合に、指定されている引数をレジスタ0に格納するコードに修正する。指定されていない場合には、高級言語プログラムに記載されている順で、関数の引数がレジスタ番号の若い順に格納される。
全ての関数呼び出しのリンクを終了したかどうかを判定し(ステップS903)、終了していた場合には(ステップS903)、オブジェクトファイルのリンク処理を終了し、終了していなかった場合には、ステップS901に戻る。
このコンパイル方法に従って、関数呼び出しが実行され、分岐命令が実行された場合の例を、図10を用いて説明する。図10は、関数が呼び出されて、その関数内で分岐命令が実行される場合の一具体例を示している。ここでは、分岐命令の一例として、switch〜case文を示している。switch〜case文は、例えば、C言語や、C++、PHP(Hypertext Preprocessor。なお、PHPは、Personal Home Page toolsの略であるがPHPの本来意味するところは、Hypertext Preprocessorである。)などの言語で用いられる。本実施の形態に係る情報処理装置100の分岐予測部が予測を成功にさせるためには、分岐に影響する関数の引数を、引数スタック113に記憶する必要がある。図10では、その為の引数のレジスタへの格納の仕方を示している。
図10(a)のプログラム1001では、switch文に影響する引数は、switch文の引数がa0であることから、分岐に関連する引数もa0であることがわかる。そこで、関数funcAの呼び出し時には、引数スタック113には、引数a0が渡される必要がある。そのため、funcAの第1引数であるa0がレジスタ0に格納される構成をとる。この場合のコンパイラ119が生成するコードは、例えば、第1引数をレジスタ0に格納する命令、例えば、「mv r0(a0)」などによって実現される。上述の通り、引数スタック113に渡される引数は、レジスタ0に格納されている値なので、これにより、分岐に関連する引数が引数スタック113に格納されることとなる。
一方、図10(b)のプログラム1002では、switch文に関連する引数は、b1である。当該引数b1は、関数funcBの第2引数となっている。そこで、図10(b)の場合においては、funcBの第2引数b1がレジスタ0に格納される構成となる。これにより、引数スタック113に分岐に関連する引数が格納されることとなる。この第2引数が格納される構成はコンパイラ119によるコンパイル時に引数のレジスタへの格納の際の格納の仕方を指定することにより実現される。
<変形例>
上記実施の形態において示した情報処理装置100を変形した別構成例の情報処理装置300について説明する。本変形例においては、上記実施の形態に示した情報処理装置100との差異についてのみ説明するものとし、その他の情報処理装置100に共通する内容については、説明を割愛する。
図11は、情報処理装置300の機能構成を示す機能ブロック図である。
情報処理装置300は、情報処理装置100とは異なり、命令実行部110とは一部別の動作をする命令実行部122を備え、また、情報処理装置100が備えていなかった引数番号通知部121を備える。その他の構成については、情報処理装置300は情報処理装置100と同様の構成をとる。
命令実行部122は、命令フェッチ部118により記憶装置200からフェッチされた命令を実行し、更に、分岐に影響する関数の引数を指定する命令を解釈して、引数番号通知部121に通知する機能を有する。引数を指定する命令は、コンパイル時にコンパイラがプログラムを解析し、自動的に付加するものとする。
引数番号通知部121は、指定された引数の番号を命令実行部122から取得し、取得した引数番号を引数スタック123に通知する機能を有する。
引数スタック123は、引数番号通知部121から通知を受けて、指定された引数をプッシュする機能を有する。引数スタック123は、引数スタック113と同様に、関数呼び出し通知部111からの通知を受けて、その関数の引数をプッシュし、関数リターン通知部112からの通知を受けて、その関数の引数をポップする。即ち、引数スタック123の先頭値には現在実行中の関数の引数が保持される。
当該構成を備えることにより、情報処理装置100の分岐予測機構1100は、分岐に影響する引数をより確実に引数スタックに格納することができる。
図12は、引数スタック123における、関数の引数を保存した例を示している。図12は、引数番号通知部121を用いて関数の引数を取得する手順を示している。図12(a)では、分岐となるswitch〜case文に影響する引数は、a0である。図12(a)に示される命令argが分岐に影響する引数を通知する。図12(a)の命令argのオペランド0は、分岐に影響する引数が格納されたレジスタ群120のレジスタ番号を示す。ゆえに、図12(a)の場合、引数スタック123は、arg命令で指定されたレジスタ0の値をプッシュする。
図12(b)では、分岐に影響する引数は、b1である。図12(b)の命令argのオペランドは、1となっている。これにより、分岐に影響するレジスタ群120のレジスタ番号がレジスタ1であることがわかり、引数スタック123は、関数呼び出しの際に、arg命令で指定されたレジスタ1の値をプッシュする。
当該構成を実現するために、コンパイラ119は、コンパイル時にこのarg命令を生成する必要がある。上記実施の形態においては、コンパイラ119は、どの引数をレジスタ0に格納するかを指定するコードを生成した(mv命令でレジスタに格納する値を指定していた)のに対し、本変形例においては、どのレジスタの値を引数スタックがプッシュするのかを指定するコードを生成する。
<まとめ>
上記実施の形態、及び、その変形例において示してきたように、情報処理装置100は、関数呼び出しを行う際に、その引数を取得する引数スタックを備える。そして、分岐命令が実行される段において、その引数スタックに格納されている値の先頭値と、実行される分岐命令の位置するアドレスとから、過去の分岐結果を検索して、分岐先を予測する。また、分岐命令が実際に実行された場合に、その分岐命令の位置するアドレスと、その時点での引数スタックの先頭値と、分岐先のアドレスとを対応付けた分岐結果エントリを記憶しておくことで、以降において実行される分岐命令の分岐先の予測の確度を高めていくことができる。関数呼び出しにおいて、その引数を取得する引数スタックを備えることにより、従来技術のような暗示オペレーション命令という分岐予測のキー情報を指定する命令を組み込まずとも、間接分岐の分岐予測を実現できる。即ち、任意のプログラムにおいて、そのプログラム内に含まれる分岐命令の分岐先の予測が可能となる。
<補足>
上記実施の形態において、本発明の実施の手法について説明してきたが、本発明の実施形態がこれに限られないことは勿論である。以下、上記実施形態以外に本発明として含まれる各種の変形例について説明する。
(1)上記実施の形態においては、関数呼び出し通知部111は、命令実行部110が実行する命令がコンパイラ119により特定の命令を以ってコンパイルされることを検知して、関数の呼び出しが実行されることを通知する構成とした。しかし、関数の呼び出しを検知する手法はこれに限るものではなく、実行される命令を解析して、予め定められた特定の命令文と一致する命令があるかどうかで検知してもよい。あるいは、コンパイラ119が関数呼び出しを通知する専用の命令を生成して、関数呼び出し通知部111に当該命令を出力することで、関数呼び出し通知部111が関数呼び出しの実行を検知することとしてもよい。
同様に、関数リターン通知部112も上記実施の形態において示したようにコンパイラ119が特定の命令を実行したことを検知することで、関数のリターンの実行を検知するのではなく、上述した手法、例えば、コンパイラからの関数リターンの実行の通知を受けるなどの手法を用いて関数のリターンを検知することとしてもよい。
(2)上記実施の形態においては、分岐予測部117が、引数スタック113の先頭値を用いて予測する手法を示したが、分岐命令実行時に、その分岐命令がどの関数内において実行されるのか、また、その関数に対応する引数がどれであるのかを対応付けて記憶されているのであれば、引数スタック113の先頭値ではなく、必要とする引数を参照する構成としてもよい。つまり、引数スタック113は、引数を取得する際に、そのとき呼び出された関数を示す情報とを対応付けて記憶するものとし、分岐予測部117は、分岐命令の実行を通知されたときに、その分岐命令が含まれる関数の情報を受け取り、当該関数の情報で示される関数に対応する引数を引数スタック113から取得する構成としてもよい。
(3)上記実施の形態においては、分岐予測部117が分岐命令のアドレスと、引数スタック113の先頭値とが一致する分岐結果エントリが複数ある場合について詳細に説明しなかった。ここでは、その説明をする。
分岐結果エントリは上述した内容に更に、分岐したかどうかの頻度を求めるための情報も対応付けられていてもよい。即ち、各分岐結果エントリは、更に分岐カウント値も対応付けられていてもよい。当該分岐カウント値は、その分岐結果エントリに示される分岐命令が実際にその分岐結果エントリで示される分岐先に分岐した場合に+1され、分岐しなかった場合に−1される。
そして、分岐予測部117は、検索の結果該当する分岐結果エントリが複数ある場合には、分岐カウント値が最も高い分岐結果エントリの分岐先を、実行される分岐命令の分岐先として、命令フェッチ部118にアドレスを通知してよい。
これにより、分岐予測の確度を高めることができる。
なお、上述の分岐カウント値において、当該分岐カウント値は、分岐結果エントリの分岐の確度を示すためのものであればよく、上述の分岐しなかった分岐結果エントリの分岐カウンタを−1する構成は設けなくともよい。
また、加算する値も1でなくともよく、予め定められた値であってもよい。
(4)上記実施の形態においては、分岐に影響する引数が1つの場合の具体例を示したが、分岐に影響する引数が複数ある場合がある。
ここでは、その場合についての情報処理装置300における動作について図13を参照しながら説明する。
図13は、このような場合に、引数を指定する命令で、順に分岐に影響する引数を指定する例を示している。
図13のswitch文に示されるように、その引数は、各分岐に引数a1、a0が分岐に影響する。そのため、プロセッサ命令列のarg命令で示されるように、高級言語プログラムの関数呼び出し時の引数の順序(a0、a1、a2)におけるa0とa1の順序とは逆に命令列としてコンパイルされる。
そして、引数スタック123は、この順序で引数をプッシュする。即ち、先にa0をプッシュし、その後にa1をプッシュする。こうすることで、分岐命令の実行時に、各分岐命令に関連する引数を分岐予測のキー情報として用いることができる。なお、分岐の予測、分岐結果バッファへの分岐結果エントリへの格納は、引数スタックからポップさせた引数を利用する。
なお、図13(a)に示した構成は、図13(b)に示すような構成によっても実現できる。即ち図13(b)に示すように引数スタック123が複数の引数を保持できる構成である。図13(b)には、引数スタック123が一段階で複数の引数を保持できる場合を示している。分岐予測部117は、分岐予測の際には、引数スタック123の同じ段階に格納された値を順に用いる。
どの引数をどのレジスタに格納するかについては、上記実施の形態、変形例に示したように、コンパイラ119が、レジスタに格納する変数を指定するコードを生成することによって実現できる。
(5)上記実施の形態においては、間接分岐の例を示したが、分岐先が固定されている分岐命令の条件実行時に、予測することも可能である。
図14は、分岐先が固定されている場合の分岐結果バッファ116への記録の例を示している。図14のプログラム例では、tst命令でレジスタr0の値がaと等しいかが判断され、その結果によって条件分岐命令bleqが実行されるかが決まる。bleq命令が実行されるとr1で示されるアドレスへの分岐が発生する。
分岐結果バッファ116に格納されている分岐結果情報は、分岐命令の位置する分岐命令アドレス301と、引数スタック113の先頭値302と、分岐が発生したか否かの分岐結果が対応付けられている。
分岐予測部117は、条件分岐命令が実行される場合に、分岐結果バッファ116に当該条件分岐命令の位置するアドレスと、そのときの引数スタック113の先頭値とに一致する分岐結果エントリがあるかどうかを検索し、あった場合に、その分岐結果エントリの分岐304が分岐したことを示す場合に、固定となっている分岐先のアドレスを命令フェッチ部118に通知し、分岐しなかったことを示す場合に、条件分岐命令の次のアドレスを命令フェッチ部118に通知する。
この構成によって、間接分岐だけでなく、条件分岐の分岐予測も可能となる。
(6)上記実施の形態においては、命令実行部110が引数を格納するためのレジスタ群120を備える構成を示した。
ここでは、命令実行部110が、レジスタ群120を備える構成以外の構成について説明する。即ち、命令実行部110が、引数を記憶装置200に記憶する構成にした場合を、図15を用いて説明する。
この場合、命令実行部110は、引数をどこに格納したかを示すスタックポインタレジスタ1501を備える。そして、記憶装置200は、スタックポインタレジスタ1501で示されるスタック1502に、関数の引数を記憶する。引数スタック113は、関数呼び出し通知部112により関数の呼び出しが通知された場合に、命令実行部110からスタックポインタレジスタ1501の値を取得し、記憶装置200の当該スタックポインタレジスタ1501で示されるスタック1502に格納されている値を引数として取得して記憶する。
このような構成にしても、引数スタック113は分岐命令に関連する関数呼び出し時の引数をプッシュできる。
図15に示す手法を用いて、引数の取得を行った場合の具体例を図16に示す。
図16(a)に示すように、プログラム501中のfuncAが呼び出された際に、その関数a0、a1、a2がスタック1602の先頭にa0が来るように格納される。このときスタックポインタレジスタ1501にはスタック1602の先頭アドレスが格納される。
そして、分岐命令(図16(a)のswitch文)が実行されるタイミングで、引数スタック113には、スタックポインタレジスタ1501で示されるアドレスであるスタック1602の先頭に保持されているa0が引数スタック113に格納される。
また、図16(b)に示すように、プログラム502中のfuncBが呼び出された際に、その引数b0、b1、b2がスタック1602の先頭に分岐命令に関連するb1が来るように格納される。このときスタックポインタレジスタ1501にはスタック1602の先頭アドレスが格納される。
そして、分岐命令(図16(b)のswitch文)が実行されるタイミングで、引数スタック113には、スタックポインタレジスタ1501で示されるアドレスであるスタック1602の先頭に保持されているb1が引数スタック113に格納される。
(7)上記実施の形態においては、引数スタック113にレジスタ0に格納されている値のみを格納する構成を示した。
ここでは、本発明の思想として含まれるそれ以外の実施の形態を示す。
図17(a)は、引数スタック113の容量を多くとり、レジスタ0に格納されている引数だけでなく、関数呼び出しの際に受け取る引数全てを格納する例を示している。
また、ここでは、全ての引数を引数スタックに渡す場合を記載しているが、関数呼び出しの際に受け取る引数全てでなくとも、そのうちの複数の引数を格納する構成としてもよい。例えば、図17(a)の例で言えば、引数a0と引数a1と引数a2とを引数スタックに格納する構成としてもよい。この場合には、例えば、レジスタ0〜レジスタ2に格納されている3つの引数を格納するという構成にすればよい。
これにより引数1つのみで、分岐予測を行う場合に比して、分岐予測の確度を高めることができる。
また、図17(b)に示すように、引数スタック113は、レジスタ0の引数を格納するだけでなく、更に、引数スタック113をリターンスタックと兼用してもよい。即ち、リターンスタックを用いるプロセッサにおいては、引数スタックと同じタイミングで、リターンアドレスのプッシュとポップが行われるので、同じスタック内にリターンアドレスと引数とを組にして保持してもよい。なお、図17(b)において、addressA、addressB、addressCは、それぞれfuncA、funcB、funcCのリターンアドレスを示している。こうすることで、リターンスタックとの併用が可能になる。
(8)上記実施の形態においては、関数の引数を保持するのに引数スタックを用いたが、引数スタックとして用いるものは必ずしもスタック形式に限るものではなく、上記実施の形態において引数スタックとして示した内容を実行できるものであればよい。
(9)図1及び図11に示した情報処理装置100、300の各機能部は集積化されて1又は複数のLSI(Large Scale Integration)により実現されてもよい。また、複数の機能部が1のLSIにより実現されてもよい。
LSIは集積度の違いにより、IC(Integrated Circuit)、システムLSI、VLSI(Very Large Scale Integration)、SLSI(Super Large Scale Integration)、ULSI(Ultra Large Scale Integration)などと呼称されることもある。
また、集積回路化の手法はLSIに限られるものではなく、専用回路または汎用プロセッサで実現しても良い。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
さらに、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行っても良い。バイオ技術の適応等が可能性としてあり得る。
(10)上述の実施形態で示した分岐予測に係る動作、分岐予測の処理等(図6等参照)を情報処理装置等のプロセッサ、及びそのプロセッサに接続された各種回路に実行させるためのプログラムコードからなる制御プログラムを、記録媒体に記録すること、又は各種通信路(例えば、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク)等を介して流通させ頒布させることもできる。このような記録媒体には、ICカード、ハードディスク、光ディスク、フレキシブルディスク、ROM等がある。流通、頒布された制御プログラムはプロセッサに読み出され得るメモリ等に格納されることにより利用に供され、そのプロセッサがその制御プログラムを実行することにより、実施形態で示したような各種機能が実現されるようになる。
(11)以下に本発明に係る分岐予測装置の実施態様とその効果について説明する。
本発明に係る分岐予測装置は、命令を実行する命令実行部と、前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックと、前記命令実行部により前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知部と、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、前記分岐命令通知部が分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、を備えることを特徴とする分岐予測装置である。
また、本発明は、情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測方法である。
また、本発明は、プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、前記分岐予測処理は、関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、当該関数呼び出し命令の少なくとも一つの引数を格納する引数スタックに格納する格納ステップと、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令が実行されることを通知する分岐命令通知ステップと、前記分岐命令通知ステップにより分岐命令が実行されることを通知された場合に、分岐命令の位置するアドレスと、当該分岐命令が実行されたときの引数スタックの先頭値と、分岐先のアドレスを示す分岐結果とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、あった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、分岐命令の実行完了後に実行された分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスを示す分岐結果と、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップとを含むことを特徴とする分岐予測プログラム記録媒体である。
引数スタックが関数呼び出し時にその関数の引数を取得する構成を備え、当該引数と、過去の分岐結果を対応付けた情報を分岐結果記憶部が保持しており、実際に分岐命令が実行されるタイミングにおいて、分岐予測部が、分岐命令のアドレスと、引数スタックの先頭値とに基づいて、過去の分岐結果を分岐結果記憶部から検索して、検索がヒットした場合に、分岐結果エントリの分岐先を分岐命令の分岐先として予測することができる。
また、実際に分岐命令が実行された際には、その分岐命令の位置するアドレスと、引数スタックの先頭値と、分岐先のアドレスとが対応付けられた分岐結果エントリが分岐結果記憶部に追加されるので、以降において分岐命令が実行される場合の分岐予測の確度を高めることができる。
前記分岐予測装置は、更に、前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除することとしてもよい。
これにより、関数がリターンされると、引数スタックに格納されている引数が削除されることにより、常に、引数スタックの先頭値を、現在実行されている関数の引数とすることができ、分岐予測装置は、間違いなく分岐命令が含まれる関数の引数を分岐の予測のための情報として用いることができる。
また、前記分岐予測装置において、前記分岐命令は条件付分岐命令であり、前記分岐結果記録部は、更に、条件付分岐命令が実行されたか否かを示す情報が対応付けられた分岐結果エントリを記録することとしてもよい。
これにより、分岐命令が条件分岐命令である場合に、その条件分岐の成否の情報を対応付けることにより、例えば、その成否に基づいて、条件分岐が成立するかどうかを判定して、分岐予測を実行することができる。
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令の分岐先それぞれについて、分岐した頻度を示す頻度情報を対応付けた分岐結果エントリを前記分岐結果記憶部に記録し、前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、最も分岐した頻度が高い分岐結果エントリの分岐先アドレスを予測結果とすることとしてもよい。
また、前記分岐予測装置において、前記分岐結果記録部は、分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を1加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を1減算することとしてもよい。
これにより、分岐結果エントリは、各分岐エントリが実行された頻度を特定するための情報が対応付けられており、実行される分岐命令のアドレスと、引数スタックの先頭値とに対応する分岐結果エントリが複数あった場合に、それらの分岐結果エントリの中で最も実行頻度の高い分岐結果エントリを分岐先として予測することができる。これにより、分岐予測の確度を高めることができる。
また、前記分岐予測装置において、前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納することとしてもよい。
これにより、命令実行部の予め定められたレジスタに格納された値を引数として引数スタックに渡すことができるので、これを前提とした装置作りが容易となる。
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成することとしてもよい。
また、本発明は、分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数の引数を格納する引数スタックを備え、前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含むこととしてもよい。
これにより、引数スタックに渡される引数を、関数の呼び出し時に必ず特定のレジスタに格納するようにコンピュータを制御することができるので、関数内の分岐命令の分岐先を決定する引数を確実に引数スタックに格納することを保障することができる。
本発明に係る分岐予測装置は、プログラムの実行性能の向上に寄与し、プロセッサの処理速度の向上を促すものとして有用である。よって、プロセッサを用いるものであれば、幅広い分野において有効である。例えば、大型計算機や、パーソナルコンピュータのような形態のみならず、各種の家電機器、携帯電話機のような通信機器、産業機器、制御機器などでも利用可能である。
100、300 情報処理装置
110、122 命令実行部
111 関数呼び出し通知部
112 関数リターン通知部
113、123 引数スタック
114 分岐命令通知部
115 分岐結果記録部
116 分岐結果バッファ
117 分岐予測部
118 命令フェッチ部
120 レジスタ群
121 引数番号通知部
200 記憶装置
1000、1100 分岐予測機構

Claims (9)

  1. 命令を実行する命令実行部と、
    前記命令実行部による関数呼び出し命令の実行を通知する関数呼び出し通知部と、
    前記関数呼び出し通知部により関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令に関連する引数の少なくとも一つを格納する引数スタックと、
    前記命令実行部により前記関数呼び出し命令により呼び出される前記関数に含まれる前記分岐命令が実行されることを通知する分岐命令通知部と、
    前記分岐命令の位置するアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する分岐結果記憶部と、
    前記分岐命令通知部が、前記分岐命令が実行されることを通知した場合に、前記分岐結果記憶部に、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測部と、
    前記分岐予測部の予測した予測結果に基づき命令をフェッチする命令フェッチ部と、
    前記分岐命令の実行完了後に実行された当該分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録部と、
    前記命令実行部による関数リターン命令の実行を通知する関数リターン通知部を備え、
    前記引数スタックは、前記関数リターン通知部から関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する
    ことを特徴とする分岐予測装置。
  2. 前記分岐命令は条件付分岐命令であり、
    前記分岐結果記録部は、更に、前記条件付分岐命令が実行されたか否かを示す情報対応付けた前記分岐結果エントリを記録する
    ことを特徴とする請求項1記載の分岐予測装置。
  3. 前記分岐結果記録部は、前記分岐命令の分岐先それぞれについて、分岐したかどうかの頻度を示す頻度情報を対応付けた前記分岐結果エントリを前記分岐結果記憶部に記録し、
    前記分岐予測部は、検索された分岐結果エントリが複数ある場合に、前記頻度情報で示される前記分岐した頻度が最も多い分岐結果エントリの分岐先アドレスを予測結果とする
    ことを特徴とする請求項1記載の分岐予測装置。
  4. 前記分岐結果記録部は、前記分岐命令が実行された場合に、当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致する分岐結果エントリについて、当該分岐命令が実際に実行されて分岐した分岐先を有するものの頻度情報を1加算し、それ以外の当該分岐命令の分岐先アドレスと、当該分岐命令が実行されたときの引数スタックの先頭値とが一致するものの実際に分岐した分岐先が異なる分岐結果エントリについて、その頻度情報を1減算する
    ことを特徴とする請求項3記載の分岐予測装置。
  5. 前記命令実行部は、前記引数を格納するための複数のレジスタを備え、
    前記引数スタックは、前記複数のレジスタのうちの予め定められた特定のレジスタが格納している値を取得して格納する
    ことを特徴とする請求項1記載の分岐予測装置。
  6. 情報処理装置が関数中に含まれる分岐命令の分岐先を予測する分岐予測方法であって、
    関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
    前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令に関連する引数の少なくとも一つを格納する引数スタックに格納する格納ステップと、
    前記関数呼び出し命令により呼び出される前記関数に含まれる前記分岐命令が実行されることを通知する分岐命令通知ステップと、
    前記分岐命令通知ステップにより前記分岐命令が実行されることを通知された場合に、当該分岐命令の位置するアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
    前記分岐予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
    前記分岐命令の実行完了後に実行された当該分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
    関数リターン命令の実行を通知する関数リターン通知ステップと、
    前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップと
    を含むことを特徴とする分岐予測方法。
  7. 分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するコンパイラであって、
    前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数に含まれる前記分岐命令に関連する引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
    前記コンパイラは、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する
    ことを特徴とするコンパイラ。
  8. 分岐命令を含む関数を示すソースプログラムをコンピュータが実行可能な実行形式の命令コード列に変更するためのコンパイル方法であって、
    前記コンピュータは、前記分岐命令の分岐先を予測するための情報として、前記関数に含まれる前記分岐命令に関連する引数を格納し、関数リターン命令の実行が通知されたときに当該関数リターン命令に対応する関数の引数を削除する引数スタックを備え、
    前記コンパイル方法は、前記関数の呼び出しを実行する際に、当該関数の引数のうち、前記分岐命令に関連する引数を、前記引数スタックに格納させるための命令コードを生成する格納コード生成ステップを含む
    ことを特徴とするコンパイル方法。
  9. プログラムを実行する際の分岐命令の分岐先を予測する分岐予測処理をコンピュータが実行するための分岐予測プログラムを記録したコンピュータ読み取り可能な分岐予測プログラム記録媒体であって、
    前記分岐予測処理は、
    関数呼び出し命令の実行を通知する関数呼び出し通知ステップと、
    前記関数呼び出し通知ステップにより関数呼び出し命令の実行が通知されたときに、前記関数呼び出し命令により呼び出される関数に含まれる分岐命令に関連する引数の少なくとも一つを格納する引数スタックに格納する格納ステップと、
    前記関数呼び出し命令により呼び出される前記関数に含まれる前記分岐命令が実行されることを通知する分岐命令通知ステップと、
    前記分岐命令通知ステップにより前記分岐命令が実行されることを通知された場合に、当該分岐命令の位置するアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値と、分岐先とを対応付けた分岐結果エントリを記憶する前記コンピュータに接続された分岐結果記憶媒体から、実行される当該分岐命令のアドレスと前記引数スタックに格納されている引数に一致する分岐結果エントリが記録されているかどうかを検索し、一致する分岐結果エントリがあった場合に、当該分岐結果エントリの分岐結果を当該分岐命令による分岐の予測結果とする分岐予測ステップと、
    前記予測ステップにおいて予測した予測結果に基づき命令をフェッチする命令フェッチステップと、
    前記分岐命令の実行完了後に実行された当該分岐命令の位置するアドレスと、当該分岐命令の実行により分岐した分岐先のアドレスと、当該分岐命令が実行されたときの前記引数スタックの先頭値とを対応付けて、分岐結果エントリとして前記分岐結果記憶部に記録する分岐結果記録ステップと、
    関数リターン命令の実行を通知する関数リターン通知ステップと、
    前記引数スタックから、前記関数リターン通知ステップにおいて関数リターン命令の実行が通知されたときに、当該関数リターン命令に対応する関数の引数を削除する削除ステップとを含む
    ことを特徴とする分岐予測プログラム記録媒体。
JP2011514333A 2009-05-19 2010-05-19 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体 Expired - Fee Related JP5347023B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011514333A JP5347023B2 (ja) 2009-05-19 2010-05-19 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2009120583 2009-05-19
JP2009120583 2009-05-19
JP2011514333A JP5347023B2 (ja) 2009-05-19 2010-05-19 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体
PCT/JP2010/003357 WO2010134330A1 (ja) 2009-05-19 2010-05-19 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体

Publications (2)

Publication Number Publication Date
JPWO2010134330A1 JPWO2010134330A1 (ja) 2012-11-08
JP5347023B2 true JP5347023B2 (ja) 2013-11-20

Family

ID=43126023

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011514333A Expired - Fee Related JP5347023B2 (ja) 2009-05-19 2010-05-19 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体

Country Status (4)

Country Link
US (1) US8694760B2 (ja)
JP (1) JP5347023B2 (ja)
CN (1) CN102099781A (ja)
WO (1) WO2010134330A1 (ja)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9652245B2 (en) 2012-07-16 2017-05-16 Lenovo Enterprise Solutions (Singapore) Pte. Ltd. Branch prediction for indirect jumps by hashing current and previous branch instruction addresses
CN103984525B (zh) * 2013-02-08 2017-10-20 上海芯豪微电子有限公司 指令处理系统及方法
US9639368B2 (en) * 2014-06-13 2017-05-02 International Business Machines Corporation Branch prediction based on correlating events
US20170090927A1 (en) * 2015-09-30 2017-03-30 Paul Caprioli Control transfer instructions indicating intent to call or return
CN105718241B (zh) * 2016-01-18 2018-03-13 北京时代民芯科技有限公司 一种基于sparc v8体系结构的分类式混合分支预测系统
CN106648636B (zh) * 2016-12-08 2020-01-03 北京航空航天大学 一种基于图挖掘的软件函数变更预测系统及方法
JP2018200545A (ja) * 2017-05-26 2018-12-20 ルネサスエレクトロニクス株式会社 プロセッサ装置
WO2018220836A1 (ja) * 2017-06-02 2018-12-06 三菱電機株式会社 プログラムコード生成装置およびプログラムコード生成プログラム
JP6720993B2 (ja) * 2018-03-07 2020-07-08 オムロン株式会社 サポート装置およびサポートプログラム
CN108897699A (zh) * 2018-07-03 2018-11-27 中国人民解放军国防科技大学 一种基于函数调用栈的数据预取方法和装置
CN109240815B (zh) * 2018-08-24 2021-07-23 珠海格力电器股份有限公司 一种共享堆栈的多任务运行方法、装置及设备
CN111176729A (zh) * 2018-11-13 2020-05-19 深圳市中兴微电子技术有限公司 一种信息处理方法、装置及计算机可读存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004533695A (ja) * 2001-06-29 2004-11-04 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ 分岐目標を予測する方法、プロセッサ、及びコンパイラ

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4763245A (en) * 1985-10-30 1988-08-09 International Business Machines Corporation Branch prediction mechanism in which a branch history table is updated using an operand sensitive branch table
US5333283A (en) * 1991-10-29 1994-07-26 International Business Machines Corporation Case block table for predicting the outcome of blocks of conditional branches having a common operand
JP2000132390A (ja) * 1998-10-23 2000-05-12 Toshiba Corp プロセッサ及び分岐予測器
US20030131345A1 (en) * 2002-01-09 2003-07-10 Chris Wilkerson Employing value prediction with the compiler
US20070088937A1 (en) * 2005-10-13 2007-04-19 International Business Machines Corporation Computer-implemented method and processing unit for predicting branch target addresses
US7444501B2 (en) * 2006-11-28 2008-10-28 Qualcomm Incorporated Methods and apparatus for recognizing a subroutine call
US7870371B2 (en) * 2007-12-17 2011-01-11 Microsoft Corporation Target-frequency based indirect jump prediction for high-performance processors

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004533695A (ja) * 2001-06-29 2004-11-04 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ 分岐目標を予測する方法、プロセッサ、及びコンパイラ

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
CSNG200600734052; 豊島 隆志 他: '「レジスタ間接分岐ターゲット・フォワーディング Register Indirect Jump Target Forwarding」' 先進的計算基盤システムシンポジウム SACSIS2006 論文集 Symposium on Advanced Computing Sy 第2006巻 第5号, 20060522, 社団法人情報処理学会 Information Processing Socie *
JPN6010034962; 豊島 隆志 他: '「レジスタ間接分岐ターゲット・フォワーディング Register Indirect Jump Target Forwarding」' 先進的計算基盤システムシンポジウム SACSIS2006 論文集 Symposium on Advanced Computing Sy 第2006巻 第5号, 20060522, 社団法人情報処理学会 Information Processing Socie *
JPN7010001919; Amir Roth et al.: '"Improving virtual function call target prediction via dependence-based pre-computation"' Proceedings of the 13th international conference on Supercomputing , 1999, Pages: 356 - 364, ACM *

Also Published As

Publication number Publication date
JPWO2010134330A1 (ja) 2012-11-08
US8694760B2 (en) 2014-04-08
US20110119472A1 (en) 2011-05-19
WO2010134330A1 (ja) 2010-11-25
CN102099781A (zh) 2011-06-15

Similar Documents

Publication Publication Date Title
JP5347023B2 (ja) 分岐予測装置、その分岐予測方法、コンパイラ、そのコンパイル方法及び分岐予測プログラム記録媒体
US7508985B2 (en) Pattern-matching system
JP3612294B2 (ja) デバッグ方法およびデバッグ装置
US8997040B2 (en) Variable closure
US7299462B2 (en) Relocation format for linking
US9626170B2 (en) Method and computer program product for disassembling a mixed machine code
US8612944B2 (en) Code evaluation for in-order processing
JPH07122854B2 (ja) プログラム翻訳方法
US9134973B2 (en) Dynamic compiling and loading at runtime
JPH0769832B2 (ja) プログラミング演算の効果と従属性とを表現する方法及び装置
JP6659955B2 (ja) プログラム分析方法、プログラム分析装置および分析プログラム
JP2012203826A (ja) デコーダコンパイラ、プログラムおよび通信機器
JP2011170749A (ja) シミュレーション装置及びシミュレーション方法
KR101851330B1 (ko) 코드 재사용 공격 탐지 장치 및 그 방법
JPH05505273A (ja) コードトランスレータのコンピュータコードを処理する方法および装置
CN108369499B (zh) 一种代码虚拟化系统和方法
JP2005190302A (ja) 情報処理システム及びコード生成方法
US9600284B2 (en) Computer program instruction analysis
KR101947737B1 (ko) 명시적 및 암시적 정보 흐름 추적 방법 및 그 장치
US20090235223A1 (en) Program generation apparatus and program generation method
US7155709B2 (en) Displaying user readable information during linking
JP5169322B2 (ja) 変数最適化装置、変数最適化プログラム、コンパイラ、変数最適化方法、及びコンパイル方法
KR20200061280A (ko) 네트워크 스위치 병렬화를 위한 데이터 의존성 기반의 데이터 평면 정적 분석 방법 및 이를 이용한 병렬화 장치
JP2011034250A (ja) 副作用解析装置、方法、及び、プログラム
JP2007272672A (ja) コンパイル最適化方法およびコンパイラ

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20121011

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130528

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130618

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130723

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130819

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees