JP4286768B2 - 分岐予測装置およびその制御方法 - Google Patents

分岐予測装置およびその制御方法 Download PDF

Info

Publication number
JP4286768B2
JP4286768B2 JP2004347194A JP2004347194A JP4286768B2 JP 4286768 B2 JP4286768 B2 JP 4286768B2 JP 2004347194 A JP2004347194 A JP 2004347194A JP 2004347194 A JP2004347194 A JP 2004347194A JP 4286768 B2 JP4286768 B2 JP 4286768B2
Authority
JP
Japan
Prior art keywords
return
instruction
branch
address
branch prediction
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
JP2004347194A
Other languages
English (en)
Other versions
JP2006155374A (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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2004347194A priority Critical patent/JP4286768B2/ja
Priority to US11/065,712 priority patent/US7320066B2/en
Priority to EP05251154A priority patent/EP1662377B1/en
Publication of JP2006155374A publication Critical patent/JP2006155374A/ja
Application granted granted Critical
Publication of JP4286768B2 publication Critical patent/JP4286768B2/ja
Priority to US12/656,111 priority patent/USRE42466E1/en
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/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
    • 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/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30054Unconditional branch instructions
    • 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

Landscapes

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

Description

この発明は、パイプライン方式のプロセッサにおいて分岐予測をおこなう分岐予測装置およびその制御方法に関し、特にコール命令の実行完了に先行して複数のコール命令がブランチヒストリによって検出された場合に分岐予測の精度を高く保つことができる分岐予測装置およびその制御方法に関するものである。
従来より、パイプライン方式のプロセッサにおいては、処理の高速化のために分岐予測の手法が広く用いられている。本来、プログラム中に分岐が存在する場合、分岐が確定するまでパイプラインを停止する必要があるが、分岐予測をおこなうプロセッサは、分岐を予測し、予測した分岐後の命令を投機的に実行する。
分岐予測には、予測が当たった場合、分岐が確定するのを待つ分の処理時間を短縮することができるという大きなメリットがあるが、予測がはずれた場合は、パイプラインをフラッシュして分岐命令の部分から処理を再実行する必要がありペナルティも大きい。このため、分岐予測においては、予測の精度が非常に重要となっている。
分岐予測には、一般的には、ブランチヒストリが用いられる。ブランチヒストリは、過去に実行した分岐命令のアドレスとその分岐命令により分岐した分岐先のアドレスとを対にして履歴として保持する装置である。ブランチヒストリを用いた分岐予測は、過去の履歴に基づいたものであるため、ループ処理のように同じ分岐が繰り返される場合に非常に効果的であるが、サブルーチンからのリターン命令による分岐に対しては有効性が低い。
サブルーチンからのリターン命令により分岐する場合、分岐先は、サブルーチンのコール命令の次の命令となる。だが、一般的に、サブルーチンはプログラムの各所から呼び出されるため、リターン命令の戻り先は一定ではない。したがって、過去の履歴にしたがって分岐先を予測しても、予測が正しいとは限らない。
そこで、サブルーチンのコール命令の実行時にリターン命令による戻り先のアドレスをリターンスアドレスタックに格納しておき、リターン命令については、ブランチヒストリよりリターンアドレススタックを優先して分岐予測をおこなうことで予測の精度を高める手法が広く採用されている。
リターンスアドレスタックは、コール命令の実行が完了した後にそのコール命令に対応するリターン命令の戻り先のアドレスを格納する。このため、命令列の先読み等により、コール命令の実行が完了する前にリターン命令がブランチヒストリによって検出された場合には、リターンスアドレスタックには戻り先のアドレスが格納されておらず、分岐予測の精度が低下するという問題がある。
そこで、本出願人は、特許文献1において、第2のリターンアドレススタックを設け、ブランチヒストリによってコール命令が検出された段階で、この第2のリターンアドレススタックにリターン命令の戻り先のアドレスを格納することで、上記の場合にも精度の高い分岐予測を実現する技術を提案している。
特願2004−222399号公報
しかしながら、特許文献1で提案されている技術は、ブランチヒストリによってコール命令が検出された後、そのコール命令の実行が完了するまでの間にブランチヒストリによって他のコール命令が検出されることまで考慮していないという問題がある。第2のリターンアドレススタックにはリターン命令の戻り先のアドレスを格納するエントリを一つしか設けていないため、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合には、最後に検出されたコール命令に対応するリターン命令の戻り先以外のアドレスは破棄され、分岐先の予測精度が低下する。
この発明は、上述した従来技術による問題点を解消するためになされたものであり、コール命令の実行完了に先行して複数のコール命令がブランチヒストリによって検出された場合に分岐予測の精度を高く保つことができる分岐予測装置およびその制御方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明は、パイプライン方式のプロセッサにおいて分岐予測をおこなう分岐予測装置であって、コール命令とリターン命令を含む分岐命令の実行履歴情報を記憶し、この分岐命令の実行履歴情報を検索して分岐命令の存在と該分岐命令による分岐先を予測するブランチヒストリと、サブルーチンのコール命令の実行が完了した場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶する第1のリターンアドレススタックと、前記ブランチヒストリによりサブルーチンのコール命令の存在が予測された場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶する第2のリターンアドレススタックと、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックにアドレス情報が保持されていれば、前記第2のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力する出力選択手段とを備えたことを特徴とする。
また、本発明は、パイプライン方式のプロセッサにおいて分岐予測をおこなう分岐予測方法であって、コール命令とリターン命令を含む分岐命令の実行履歴情報を記憶するブランチヒストリをもちいて、分岐命令の存在と該分岐命令による分岐先を予測する分岐命令予測工程と、前記分岐命令予測工程によりサブルーチンのコール命令の存在が予測された場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶手段に記憶する第1のリターンアドレス記憶工程と、サブルーチンのコール命令の実行が完了した場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶手段に記憶する第2のリターンアドレス記憶工程と、前記分岐命令予測工程によりリターン命令の存在が予測された場合に、前記第1のリターンアドレス記憶工程より記憶されたアドレス情報が存在すれば、前記第1のリターンアドレス記憶工程により記憶されたアドレス情報を最優先で分岐予測結果として選択して出力する出力選択工程とを含んだことを特徴とする。
この発明によれば、第2のリターンアドレススタックに有効なエントリが存在する場合には、リターンスタックポインタの値に関わらず、第2のリターンアドレススタックから分岐先のアドレスを取得するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報を適切な順序で取得して精度の高い分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックに複数のアドレス情報が保持されていれば、前記第2のリターンアドレススタックに最後に記憶された有効なアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする。
この発明によれば、第2のリターンアドレススタックに有効なエントリが複数存在する場合には、第2のリターンアドレススタックに最後に格納された有効なアドレス情報を取得するように構成したので、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合にも精度の高い分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックにアドレス情報が保持されていなければ、前記第1のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする。
この発明によれば、第2のリターンアドレススタックに有効なアドレス情報が格納されていない場合に第1のリターンアドレススタックから分岐先のアドレスを取得するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報を適切な順序で取得して精度の高い分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第1のリターンアドレススタックと前記第2のリターンアドレススタックのいずれにもアドレス情報が保持されていなければ、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする。
この発明によれば、第1および第2のリターンアドレススタックに有効なアドレス情報が格納されていない場合にブランチヒストリの予測結果を用いるように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報とブランチヒストリの情報とを適切な順序で取得して精度の高い分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記ブランチヒストリによって存在が予測されたコール命令が実行完了したか否かと、該コール命令に対応するリターン命令の分岐予測が完了しているか否かを保持するコール命令状況保持手段をさらに備えたことを特徴とする。
この発明によれば、コール命令状況保持手段によって仮想の第2のリターンアドレススタックのエントリの有効性を管理するように構成したので、実際の第2のリターンアドレススタックのエントリ数を少なく抑えながら、高い精度で分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記コール命令状況保持手段が状況を保持しているコール命令の数を保持するカウンタをさらに備えたことを特徴とする。
この発明によれば、コール命令状況保持手段に情報が保持されたコール命令の件数をカウンタに保持するように構成したので、コール命令状況保持手段の仕組みを簡略化することができる。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令状況保持手段によって判明した場合には、前記第2のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令状況保持手段によって判明したが、前記第2のリターンアドレススタックにアドレス情報が保持されていない場合には、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令状況保持手段によって判明した場合には、前記第1のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする。
また、本発明は、上記の発明において、前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令状況保持手段によって判明し、前記第1のリターンアドレススタックにアドレス情報が保持されていない場合には、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする。
これらの発明によれば、コール命令状況保持手段に記憶された情報に基づいて、第2のリターンアドレススタックに有効なアドレス情報が格納されているか否かを判断するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報とブランチヒストリの情報とを適切な順序で取得して精度の高い分岐予測をおこなうことができる。
また、本発明は、上記の発明において、前記コール命令状況保持手段は、前記ブランチヒストリによって存在が予測されたコール命令の状況を命令毎にビットのオン/オフによって保持することを特徴とする。
また、本発明は、上記の発明において、前記コール命令状況保持手段は、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを0に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、管理対象のビットのうち値が0の最新のビットを1に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする。
あるいは、本発明は、上記の発明において、前記コール命令状況保持手段は、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを1に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、管理対象のビットのうち値が1の最新のビットを0に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする。
あるいは、本発明は、上記の発明において、前記コール命令状況保持手段は、所有するビットを初期化時に全て0に設定し、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを1に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、全ビットのうち値が1の最新のビットを0に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする。
あるいは、本発明は、上記の発明において、前記コール命令状況保持手段は、所有するビットを初期化時に全て1に設定し、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを0に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、全ビットのうち値が0の最新のビットを1に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする。
これらの発明によれば、少数のビットからなる管理テーブルによって仮想の第2のリターンアドレススタックのエントリの有効性を管理するように構成したので、実際の第2のリターンアドレススタックのエントリ数を少数にしてコストの上昇を抑制しながら、高い精度で分岐予測をおこなうことができる。
また、本発明は、分岐予測が失敗した場合に、前記第2のアドレススタックの内容を全消去することを特徴とする。
また、本発明は、分岐予測が失敗した場合に、前記コール命令状況保持手段の内容を全消去することを特徴とする。
これらの発明によれば、分岐予測が失敗した場合に分岐予測のための各種情報を初期化し、誤った情報に基づいて分岐予測を継続しないように構成したので、高い精度で分岐予測をおこなうことができる。
本発明によれば、第2のリターンアドレススタックに有効なエントリが存在する場合には、リターンスタックポインタの値に関わらず、第2のリターンアドレススタックから分岐先のアドレスを取得するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報を適切な順序で取得して精度の高い分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、第2のリターンアドレススタックに有効なエントリが複数存在する場合には、第2のリターンアドレススタックに最後に格納された有効なアドレス情報を取得するように構成したので、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合にも精度の高い分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、第2のリターンアドレススタックに有効なアドレス情報が格納されていない場合に第1のリターンアドレススタックから分岐先のアドレスを取得するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報を適切な順序で取得して精度の高い分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、この発明によれば、第1および第2のリターンアドレススタックに有効なアドレス情報が格納されていない場合にブランチヒストリの予測結果を用いるように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報とブランチヒストリの情報とを適切な順序で取得して精度の高い分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、コール命令状況保持手段によって仮想の第2のリターンアドレススタックのエントリの有効性を管理するように構成したので、実際の第2のリターンアドレススタックのエントリ数を少なく抑えながら、高い精度で分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、コール命令状況保持手段に情報が保持されたコール命令の件数をカウンタに保持するように構成したので、コール命令状況保持手段の仕組みを簡略化することができるという効果を奏する。
また、本発明によれば、コール命令状況保持手段に記憶された情報に基づいて、第2のリターンアドレススタックに有効なアドレス情報が格納されているか否かを判断するように構成したので、第1のリターンアドレススタックと第2のリターンアドレススタックに格納されたアドレス情報とブランチヒストリの情報とを適切な順序で取得して精度の高い分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、少数のビットからなる管理テーブルによって仮想の第2のリターンアドレススタックのエントリの有効性を管理するように構成したので、実際の第2のリターンアドレススタックのエントリ数を少数にしてコストの上昇を抑制しながら、高い精度で分岐予測をおこなうことができるという効果を奏する。
また、本発明によれば、分岐予測が失敗した場合に分岐予測のための各種情報を初期化し、誤った情報に基づいて分岐予測を継続しないように構成したので、高い精度で分岐予測をおこなうことができるという効果を奏する。
以下に添付図面を参照して、この発明に係る分岐予測装置およびその制御方法の好適な実施の形態を詳細に説明する。
まず、本実施例に係るリターン命令の分岐予測方式の概要について説明する。図1は、本実施例に係る分岐予測装置の動作を説明するための命令列を示すサンプル図である。同図に示すように、メインルーチンは、アドレスAのコール命令によってサブルーチンAを呼び出す(ステップS101)。サブルーチンAは、いくつかの命令を実行した後、アドレスCのリターン命令によってメインルーチンへ復帰する(ステップS102)。リターン命令により復帰する先のアドレスは、コール命令のアドレスの8バイト後、すなわち、A+8となる。
ここで、リターン命令の戻り先のアドレスがコール命令のアドレス+8となるのは、この命令列を実行するプロセッサが4バイトの命令長をもち、さらに、コール命令の後には必ず遅延命令をともなう仕様であるからである。したがって、プロセッサの仕様によっては、リターン命令の戻り先のアドレスがコール命令のアドレス+4となったり、コール命令のアドレス+16となったりする場合もありうるが、本書では、リターン命令の戻り先のアドレスはコール命令のアドレス+8であるものとして説明することとする。
メインルーチンは、アドレスDのコール命令によってサブルーチンBを呼び出す(ステップS103)。サブルーチンBは、いくつかの命令を実行した後、アドレスFのコール命令によってサブルーチンCを呼び出す(ステップS104)。サブルーチンCは、いくつかの命令を実行した後、アドレスHのリターン命令によってサブルーチンBへ復帰する(ステップS105)。復帰先のアドレスはF+8である。サブルーチンBは、いくつかの命令を実行した後、アドレスIのリターン命令によってメインルーチンへ復帰する(ステップS106)。復帰先のアドレスはD+8である。
次に、図1で示した命令列を実行する場合を例にして、本実施例に係る分岐予測方式の概要について説明する。図2−1〜2−5は、本実施例に係る分岐予測装置の動作を説明するための説明図である。図2−1は、ブランチヒストリにより、アドレスAでコール命令が検出された場面を示している。なお、アドレスAでコール命令が検出される前は、分岐予測装置は初期状態であったものとする。
同図に示すように、この分岐予測装置には、リターンアドレススタックと、リターンアドレススタックXと、リターンスタックポインタとが存在する。リターンアドレススタックは、一般に利用されているリターンアドレススタックであり、実行ユニットでコール命令の実行が完了した際に、当該のコール命令に対応するリターン命令の戻り先のアドレスが格納される装置である。
リターンアドレススタックは、複数のエントリを有し、実行ユニットでコール命令の実行が完了するたびに先頭のエントリであるSTK0へリターン命令の戻り先のアドレスがプッシュされる。たとえば、実行ユニットで2つのコール命令の実行が完了した場面では、2番目に実行されたコール命令に対応するリターン命令の戻り先のアドレスが先頭のエントリであるSTK0に格納され、最初に実行されたコール命令に対応するリターン命令の戻り先のアドレスが2番目のエントリであるSTK1に格納される。また、リターンアドレススタックは、実行ユニットでリターン命令の実行が完了するたびにポップ動作をおこなって、最新のエントリの内容を破棄する。
リターンアドレススタックXは、実行ユニットでコール命令の実行が完了する前に当該のコール命令に対応するリターン命令がブランチヒストリによって検出された場合に予測精度が低下するのを改善するために設けられた第2のリターンアドレススタックであり、ブランチヒストリでコール命令が検出された際に、当該のコール命令に対応するリターン命令の戻り先のアドレスが格納される装置である。
前述の特許文献1においては、リターンアドレススタックXは、一つのエントリしか有していないが、ここでは複数のエントリを有しているものとする。リターンアドレススタックXは、ブランチヒストリでコール命令が検出されるたびに先頭のエントリであるSTK−X1からリターン命令の戻り先のアドレスを格納していく。たとえば、ブランチヒストリで2つのコール命令が検出された場面では、最初に検出されたコール命令に対応するリターン命令の戻り先のアドレスが先頭のエントリであるSTK−X1に格納され、次に検出されたコール命令に対応するリターン命令の戻り先のアドレスが2番目のエントリであるSTK−X2に格納される。
また、リターンアドレススタックXは、実行ユニットでコール命令の実行が完了するたびにシフト動作をおこなって最も古いエントリの内容を追い出す。また、いずれかのエントリが分岐予測に用いられた場合には、そのエントリのバリッドビットをオフにしてエントリを無効化する。
リターンスタックポインタは、2つのリターンアドレススタックのエントリのうち、どのエントリが分岐予測結果の取得対象のエントリであるのかを制御する装置である。リターンスタックポインタは、初期状態では0の値を保持し、ブランチヒストリでコール命令が検出されるたびに値が−1され、リターン命令が検出されるたびに+1される。また、実行ユニットでコール命令の実行が完了するたびに値が+1され、リターン命令の実行が完了するたびに−1される。
リターンスタックポインタの値が0以上の場合、リターンアドレススタックに分岐予測結果の取得対象のエントリが存在することを意味する。値が0の場合、リターンアドレススタックの先頭のSTK0が分岐予測結果の取得対象のエントリであり、リターンスタックポインタの値が正の方向に一つ大きくなるたびに、取得対象のエントリが一つずつ移動する。たとえば、リターンスタックポインタの値が3の場合、リターンアドレススタックのSTK3が分岐予測結果の取得対象のエントリとなる。
リターンスタックポインタの値が負の場合、リターンアドレススタックXに分岐予測結果の取得対象のエントリが存在することを意味する。前述の特許文献1は、リターンアドレススタックXのエントリが一つであると想定しているため、リターンスタックポインタの値が負の場合のリターンアドレススタックXのエントリとの対応については記述していない。
ここでは、リターンスタックポインタの値が−1の場合、リターンアドレススタックXの先頭のSTK−X1が分岐予測結果の取得対象のエントリであり、リターンスタックポインタの値が負の方向に一つ大きくなるたびに、取得対象のエントリが一つずつ移動するものとしておく。たとえば、リターンスタックポインタの値が−3の場合、リターンアドレススタックXのSTK−X3が分岐予測結果の取得対象のエントリとなる。
図2−1は、アドレスAでコール命令が検出された場面であるので、リターンアドレススタックXの先頭のSTK−X1に戻り先のアドレスとしてA+8が格納され、リターンスタックポインタの値は−1されて−1となっている。ここで、ブランチヒストリによりアドレスCのリターン命令が検出されたとすると、リターンスタックポインタの値は−1であるので、STK−X1に格納された値、すなわちA+8が分岐予測結果として取得される。A+8は、アドレスCのリターン命令の分岐先として正しいアドレスである。
この段階では、コール命令の実行が完了されていないため、リターンアドレススタックには分岐先のアドレスが格納されていないが、リターンアドレススタックXが有効に機能して正しい分岐予測をおこなうことが可能になっている。
図2−2は、アドレスCでリターン命令が検出された後の場面を示している。STK−X1は、分岐予測に使用されたため、バリッドビットがオフになり無効化されている。また、リターン命令の検出により、リターンスタックポインタの値は、+1されて0となっている。図2−3は、続いてアドレスAのコール命令の実行が完了した場面を示している。コール命令の実行の完了を受けて、リターンアドレススタックの先頭のSTK0に戻り先のアドレスA+8が格納され、リターンスタックポインタの値は、+1されて1となっている。
図2−4は、続いてアドレスDでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの先頭のSTK−X1に戻り先のアドレスD+8が格納され、リターンスタックポインタの値は、−1されて0となっている。図2−5は、続いてアドレスFでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの2番目のエントリのSTK−X2に戻り先のアドレスF+8が格納され、リターンスタックポインタの値は、−1されて−1となっている。
ここで、ブランチヒストリによりアドレスHのリターン命令が検出されたとすると、リターンスタックポインタの値は−1であるので、STK−X1に格納された値、すなわちD+8が分岐予測結果として取得される。D+8は、アドレスHのリターン命令の分岐先のアドレスではないので、誤った分岐予測がおこなわれることとなる。
図2−5の場面では、リターンアドレススタックXに2つの戻り先のアドレスが格納されているが、図1の命令列の実行順序をみると、アドレスDのコール命令は必ずアドレスFのコール命令より先に検出されることがわかる。すなわち、リターンアドレススタックXには、アドレスDのコール命令に対応するリターン命令の戻り先であるD+8、アドレスFのコール命令に対応するリターン命令の戻り先であるF+8の順で値が格納されることになる。
同様に、図1の命令列の実行順序をみると、アドレスHのリターン命令は必ずアドレスIのリターン命令より先に検出されることがわかる。すなわち、アドレスHのリターン命令の戻り先であるF+8は、アドレスIのリターン命令の戻り先であるD+8より先に分岐予測で利用されるはずである。
このことから、リターンアドレススタックXに格納された戻り先のアドレスについては、リターンスタックポインタの値に関わらず、最後に格納されたものから使用していけばよいことがわかる。図2−5の場面で、ブランチヒストリによりアドレスHのリターン命令が検出された場合を考えると、最後に格納された戻り先のアドレスはF+8であり、アドレスHのリターン命令の分岐先のアドレスとして正しい値である。
また、コール命令の検出と実行完了の順序は、必ず検出の方が先になる。すなわち、リターン命令の分岐先のアドレスは、リターンアドレススタックよりも先にリターンアドレススタックXに格納される。コール命令の完了は必ずインオーダでおこなわれるので、リターンアドレススタックXに戻り先が格納されたコール命令は、リターンアドレススタックに戻り先が格納されたコール命令よりも後に実行されたことになる。
リターン命令は、最後に実行されたコール命令に対応したものから検出されるはずであるから、リターンアドレススタックXに格納された戻り先のアドレスは、リターンアドレススタックに格納された戻り先のアドレスよりも先に分岐予測に使用する必要がある。このことから、リターンアドレススタックXに有効なエントリが存在する場合には、リターンスタックポインタの値に関わらず、リターンアドレススタックXから分岐先のアドレスを取得する必要があることがわかる。
たとえば、図2−4の場面で、アドレスIのリターン命令が検出された場合、リターンスタックポインタの値に従うと、A+8という誤った分岐先を取得してしまう。この場合、リターンアドレススタックXに有効なエントリが存在するので、リターンアドレススタックXから最後に登録されたアドレスを取得するとD+8という正しい分岐先が取得される。
このように本実施例に係る分岐予測方式においては、リターンアドレススタックXに有効なエントリが存在する場合には、リターンスタックポインタの値に関わらず、リターンアドレススタックXに最後に値が格納された有効なエントリから分岐先のアドレスを取得する。この方式をとることにより、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合にも精度の高い分岐予測をおこなうことが可能になる。
次に、本実施例に係る分岐予測装置の構成について説明する。図3は、本実施例に係る分岐予測装置の構成を示すブロック図である。同図に示すように、分岐予測装置200は、命令フェッチ制御ユニット110と、分岐リザベーションステーション150と接続された構成をとる。
命令フェッチ制御ユニット110は、パイプラインで実行する命令の取得を制御するユニットである。命令フェッチ制御ユニット110による命令の取得要求は、実際の命令取得のためにキャッシュ制御ユニット120に送出されるとともに、分岐予測のために分岐予測装置200内のブランチヒストリ210に対しても送出される。
キャッシュ制御ユニット120は、命令フェッチ制御ユニット110から要求された命令をキャッシュもしくは主記憶から取得するユニットである。キャッシュ制御ユニット120により取得された命令は、命令バッファ130に一時的に格納された後、デコーダ140によりデコードされ、命令の種類に応じたリザベーションステーションに送られる。
リザベーションステーションには、分岐リザベーションステーション150、整数演算リザベーションステーション160、浮動少数演算リザベーションステーション170、アドレス生成リザベーションステーション180などがあり、分岐命令は分岐リザベーションステーション150に送られてここで実行される。
分岐予測装置200は、ブランチヒストリ210と、リターンアドレススタック220と、リターンアドレス演算回路230と、リターンアドレススタックX240と、バリッド制御回路250と、リターンアドレス演算回路260と、リターンスタックポインタ270と、リターンアドレス選択回路281と、出力選択回路282とを有する。
ブランチヒストリ210は、分岐リザベーションステーション150にて実行された分岐命令のアドレスとその命令による分岐先を対にして、その他の情報フラグとともに記憶しておく装置である。コール命令やリターン命令も分岐命令の一種であり、その分岐結果がブランチヒストリ210に記憶される。
また、ブランチヒストリ210は、命令フェッチ制御ユニット110から命令列のアドレスを取得すると、自身の情報を参照して、その命令列に含まれる命令によって分岐が発生するか否かを判断する。そして、分岐が発生すると判断した場合には、出力選択回路282に対して分岐先のアドレス等の情報を送出する。
リターンアドレススタック220は、分岐リザベーションステーション150にて実行されたコール命令に対応するリターン命令の戻り先のアドレスを記憶しておく装置である。リターンアドレススタック220の各エントリは、エントリの有効性を示すバリッドビットを備える。リターンアドレススタック220の有効なエントリは、リターンアドレス選択回路281に対して、当該エントリに格納されたアドレス情報を送出する。なお、本実施例においては、リターンアドレススタック220は4つのエントリからなるものとして説明するが、エントリの数は必ずしも4つである必要はない。
リターンアドレス演算回路230は、分岐リザベーションステーション150から伝えられたコール命令のアドレスをリターン命令の戻り先のアドレスへ変換する演算をおこない、リターンアドレススタック220へ送出する回路である。既に説明した通り、本実施例で説明しているプロセッサにおいては、コール命令のアドレスに+8したものがリターン命令の戻り先のアドレスとなるが、他の仕様のプロセッサにおいては変換方式が異なる場合もある。
リターンアドレススタックX240は、ブランチヒストリ210にてコール命令が検出された場合に、そのコール命令に対応するリターン命令の戻り先のアドレスを記憶しておく装置である。リターンアドレススタックX240の各エントリは、エントリの有効性を示すバリッドビットを備える。リターンアドレススタックX240は、リターンアドレス選択回路281に対して、最後に値が格納された有効なエントリの情報を送出する。
バリッド制御回路250は、リターンアドレススタックX240のエントリのバリッドビットの状態を制御する回路である。バリッド制御回路250は、ブランチヒストリ210からのコールヒット信号等の状態に応じて、リターンアドレススタックX240のエントリのバリッドビットの状態を変更する。
リターンアドレス演算回路260は、ブランチヒストリ210が検出したコール命令のアドレスをリターン命令の戻り先のアドレスへ変換する演算をおこない、リターンアドレススタックX240へ送出する回路である。リターンアドレス演算回路230の場合と同様に、本実施例で説明しているプロセッサにおいては、コール命令のアドレスに+8したものがリターン命令の戻り先のアドレスとなるが、他の仕様のプロセッサにおいては変換方式が異なる場合もある。
リターンスタックポインタ270は、リターン命令が検出された場合に使用すべきリターンアドレススタックのエントリを示す値を保持する装置である。具体的には、リターンスタックポインタ270保持する値が000、001、010、011である場合は、それぞれリターンアドレススタック220のSTK0、STK1、STK2、STK3のエントリを使用すべきことを意味する。なお、リターンアドレススタックX240に有効なエントリが存在する場合は、リターンスタックポインタ270保持する値に関わらず、リターンアドレススタックX240に保持された情報を用いて分岐予測がおこなわれる。
リターンアドレス選択回路281は、リターンアドレススタック220、リターンアドレススタックX240およびリターンスタックポインタ270の情報に基づいて適切な分岐先のアドレスを選択して出力選択回路282へ送出する回路である。
図4は、図3に示したリターンアドレス選択回路281の処理手順を示すフローチャートである。同図に示すように、リターンアドレス選択回路281は、リターンアドレススタックX240から有効な分岐先のアドレス情報が送出されていれば(ステップS1001肯定)、そのアドレス情報を出力選択回路282へ送出する(ステップS1002)。リターンアドレススタックX240からの情報がない場合は(ステップS1001否定)、リターンスタックポインタ270がリターンアドレススタック220の有効なエントリを指示しており(ステップS1003肯定)、かつ、指示されたエントリからアドレス情報が送出されていれば(ステップS1004肯定)、そのエントリに格納されているアドレス情報を出力選択回路282へ送出する(ステップS1005)。いずれかに該当しない場合は(ステップS1003否定もしくはステップS1004否定)、出力選択回路282へのアドレス情報の送出はおこなわない。
出力選択回路282は、複数の分岐情報から適切なものを選択して命令フェッチ制御ユニット110へ送出する回路である。具体的には、ブランチヒストリ210がリターン命令を検出した場合は、リターンアドレス選択回路281からアドレス情報が送出されていればそのアドレスを、さもなければ、ブランチヒストリ210が送出しているアドレスをリターン命令の戻り先のアドレスとして送出する。
次に、コール命令の実行が完了した場合の本実施例に係る分岐予測装置200の動作について説明する。図5−1〜5−3は、本実施例に係る分岐予測装置200の動作を説明するための説明図である。図5−1は、図2−5の場面の後にアドレスCのリターン命令の実行が完了した場面を示している。リターン命令の実行完了を受けて、リターンアドレススタックでポップ動作がおこなわれて先頭のSTK0の内容が破棄され、リターンスタックポインタの値は、−1されて−2となっている。
図5−2は、続いてアドレスDのコール命令の実行が完了した場面を示している。コール命令の実行完了を受けて、リターンスタックポインタの値は、+1されて−1となっている。また、リターンアドレススタックXでは、シフト動作がおこなわれて先頭のSTK−X1のD+8が破棄されている。一方、リターンアドレススタックでは、実行が完了したコール命令に対応するリターン命令の戻り先のアドレスであるD+8が先頭のエントリであるSTK0に格納される。
このように本実施例に係る分岐予測装置200においては、ブランチヒストリによって検出されたコール命令に対応するリターン命令の戻り先のアドレスが一旦リターンアドレススタックXに格納され、そのコール命令が実行ユニットによって実行完了した際に、リターン命令の戻り先のアドレスがリターンアドレススタックXからリターンアドレススタックへシフト動作によって移動するかのように動作する。
すなわち、ブランチヒストリのコール命令とリターン命令の検出が完璧であれば、リターンアドレススタックXとリターンアドレススタックは一体のスタックとして機能し、コール命令やリターン命令の実行がどこまで進んでいるかに関わらず、ブランチヒストリで検出されたコール命令に対応するリターン命令の分岐先を常に正確に予測できることになる。
図5−3は、続いてアドレスHでリターン命令が検出された場面を示している。この場合、リターンアドレススタックXに有効なエントリが存在するため、リターンアドレススタックXに最後に格納されたアドレス情報であるF+8が分岐予測結果として取得される。リターンアドレススタックXに複数のエントリが格納された後の場面であるが、本実施例に係る分岐予測装置200はリターン命令の分岐先を正確に予測することに成功している。
上述してきたように、本実施例1では、リターンアドレススタックXに有効なエントリが存在する場合には、リターンスタックポインタの値に関わらず、リターンアドレススタックXに最後に値が格納された有効なエントリから分岐先のアドレスを取得するように構成したので、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合にも精度の高い分岐予測をおこなうことができる。
実施例1で説明した分岐予測方式を用いれば、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合にも精度の高い分岐予測をおこなうことができる。しかしながら、この分岐予測方式を用いて分岐予測の精度を上げるには、リターンアドレススタックXに十分な数のエントリを用意しなければならず、コストが上昇するという問題がある。
そこで、本実施例では、リターンアドレススタックXのエントリの数を少数に抑えながら、ブランチヒストリによって検出されているが、実行が完了していないコール命令が複数ある場合に十分な精度をもって分岐予測をおこなうことができる分岐予測方式について説明することとする。
図6は、本実施例に係る分岐予測装置の動作を説明するための命令列を示すサンプル図である。同図に示すように、メインルーチンは、アドレスAのコール命令によってサブルーチンAを呼び出す(ステップS201)。サブルーチンAは、いくつかの命令を実行した後、アドレスCのリターン命令によってメインルーチンへ復帰する(ステップS202)。リターン命令により復帰する先のアドレスは、コール命令のアドレスの8バイト後、すなわち、A+8となる。
メインルーチンは、アドレスDのコール命令によってサブルーチンBを呼び出す(ステップS203)。サブルーチンBは、いくつかの命令を実行した後、アドレスFのコール命令によってサブルーチンCを呼び出す(ステップS204)。そして、サブルーチンCは、いくつかの命令を実行した後、アドレスHのコール命令によってサブルーチンDを呼び出す(ステップS205)。
サブルーチンDは、いくつかの命令を実行した後、アドレスJのリターン命令によってサブルーチンCへ復帰する(ステップS206)。復帰先のアドレスはH+8である。サブルーチンCは、いくつかの命令を実行した後、アドレスKのリターン命令によってサブルーチンBへ復帰する(ステップS207)。復帰先のアドレスはF+8である。サブルーチンBは、いくつかの命令を実行した後、アドレスLのリターン命令によってメインルーチンへ復帰する(ステップS208)。復帰先のアドレスはD+8である。
次に、図6で示した命令列を実行する場合を例にして、従来の分岐予測装置の動作について説明する。ここで、従来の分岐予測装置と呼んでいるのは、実施例1にて説明した分岐予測装置のことである。ここでは、リターンアドレススタックのエントリの数が2つの場合を想定して説明する。
図7−1〜7−8は、従来の分岐予測装置の動作を説明するための説明図である。図7−1は、ブランチヒストリにより、アドレスAでコール命令が検出された場面を示している。なお、アドレスAでコール命令が検出される前は、分岐予測装置は初期状態であったものとする。
同図に示すように、この分岐予測装置には、リターンアドレススタックと、リターンアドレススタックXと、リターンスタックポインタとが存在する。リターンアドレススタックは、一般に利用されているリターンアドレススタックであり、実行ユニットでコール命令の実行が完了した際に、当該のコール命令に対応するリターン命令の戻り先のアドレスが格納される装置である。
リターンアドレススタックXは、実行ユニットでコール命令の実行が完了する前に当該のコール命令に対応するリターン命令がブランチヒストリによって検出された場合に予測精度が低下するのを改善するために設けられた第2のリターンアドレススタックであり、ブランチヒストリでコール命令が検出された際に、当該のコール命令に対応するリターン命令の戻り先のアドレスが格納される装置である。
リターンスタックポインタは、リターンアドレススタックのエントリのうち、どのエントリが分岐予測結果の取得対象のエントリであるのかを制御する装置である。リターンスタックポインタの値が0以上の場合、リターンアドレススタックに分岐予測結果の取得対象のエントリが存在することを意味する。ただし、リターンアドレススタックXに有効なエントリが存在する場合は、リターンスタックポインタが指し示すエントリは、分岐予測には用いられない。
図7−1は、アドレスAでコール命令が検出された場面であり、リターンアドレススタックXの先頭のSTK−X1に戻り先のアドレスとしてA+8が格納され、リターンスタックポインタの値は−1されて−1となっている。ここで、ブランチヒストリによりアドレスCのリターン命令が検出されたとすると、リターンアドレススタックXに有効なエントリが存在するので、最新のエントリであるSTK−X1に格納された値、すなわちA+8が分岐予測結果として取得される。A+8は、アドレスCのリターン命令の分岐先として正しいアドレスである。
図7−2は、アドレスCでリターン命令が検出された後の場面を示している。STK−X1は、分岐予測に使用されたため、バリッドビットがオフになり無効化されている。また、リターン命令の検出により、リターンスタックポインタの値は、+1されて0となっている。図7−3は、続いてアドレスAのコール命令の実行が完了した場面を示している。コール命令の実行の完了を受けて、リターンアドレススタックの先頭のSTK0に戻り先のアドレスA+8が格納され、リターンスタックポインタの値は、+1されて1となっている。
図7−4は、続いてアドレスDでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの先頭のSTK−X1に戻り先のアドレスD+8が格納され、リターンスタックポインタの値は、−1されて0となっている。図7−5は、続いてアドレスFでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの2番目のエントリのSTK−X2に戻り先のアドレスF+8が格納され、リターンスタックポインタの値は、−1されて−1となっている。
図7−6は、続いてアドレスHでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXに戻り先のアドレスであるH+8がプッシュされるが、既にエントリは2つとも埋まった状態であるため、古い情報であるD+8がプッシュアウトされて消えてしまう。こうして、リターンアドレススタックXは、STK−X2にH+8が格納され、STK−X1にF+8が格納された状態となる。また、リターンスタックポインタの値は、−1されて−2となっている。
ここで、ブランチヒストリによりアドレスJのリターン命令が検出されたとすると、リターンアドレススタックXに有効なエントリが存在するので、最新のエントリであるSTK−X2に格納された値、すなわちH+8が分岐予測結果として取得される。H+8は、アドレスJのリターン命令の分岐先のアドレスとして正しいアドレスである。図7−7は、アドレスJでリターン命令が検出された後の場面を示している。STK−X2は、分岐予測に使用されたため、バリッドビットがオフになり無効化されている。また、リターン命令の検出により、リターンスタックポインタの値は、+1されて−1となっている。
ここで、ブランチヒストリによりアドレスKのリターン命令が検出されたとすると、リターンアドレススタックXに有効なエントリが存在するので、最新のエントリであるSTK−X1に格納された値、すなわちF+8が分岐予測結果として取得される。F+8は、アドレスKのリターン命令の分岐先のアドレスとして正しいアドレスである。図7−8は、アドレスKでリターン命令が検出された後の場面を示している。STK−X1は、分岐予測に使用されたため、バリッドビットがオフになり無効化されている。また、リターン命令の検出により、リターンスタックポインタの値は、+1されて0となっている。
ここで、ブランチヒストリによりアドレスLのリターン命令が検出されたとすると、リターンアドレススタックXに有効なエントリが存在せず、リターンスタックポインタの値は0であるので、リターンアドレススタックのSTK0に格納された値、すなわちA+8が分岐予測結果として取得される。A+8は、アドレスLのリターン命令の分岐先のアドレスではないので、誤った分岐予測がおこなわれることとなる。
ここで誤った分岐予測がおこなわれるのは、図7−6の場面でD+8がエントリの数が不足しているためにプッシュアウトされたことが考慮されていないためである。本実施例に係る分岐予測装置は、リターンアドレススタックXに多数のエントリが存在することを仮想し、それらの仮想的なエントリの有効性を管理テーブルで管理する方式をとる。
図8は、本実施例に係る分岐予測方式の概要を説明するための説明図である。同図に示すように、本実施例に係る分岐予測方式では、リターンヒットテーブルとコールヒットカウンタを使用する。
リターンヒットテーブルは、仮想のリターンアドレススタックXの各エントリの有効性を管理するテーブルである。リターンヒットテーブルの各ビットは、仮想のリターンアドレススタックXのエントリ一つに対応し、初期値として0をとる。ビットが0であれば、対応する仮想のエントリが有効であることを示し、ビットが1であれば対応する仮想のエントリが分岐予測に用いられて無効化されていることを示す。
リターンヒットテーブルは、コール命令が検出されるたびに最下位のビットであるXH1から順に使用され、コール命令の実行が完了するたびにシフト動作により最下位のビットの値が捨てられる。コール命令の実行が完了すれば、リターン命令の戻り先のアドレスがリターンアドレススタックに格納されるため、仮想のリターンアドレススタックXのエントリは不要となるためである。
リターンヒットテーブルは、仮想のリターンアドレススタックXのエントリごとに1ビットあればよいので、非常に低コストで実装することができる。たとえば、アドレス長が64ビットあるとした場合、実際のリターンアドレススタックXに8個のエントリを設けると64×8で512ビットが必要になるが、リターンヒットテーブルは8ビットあれば済むことになる。
コールヒットカウンタは初期値として0をとり、コール命令が検出されるたびに+1され、コール命令の実行が完了するたびに−1される。したがって、コールヒットカウンタの値は、ブランチヒストリによって検出されているが、実行が完了していないコール命令の数、すなわち、値が格納されている仮想のリターンアドレススタックXのエントリの数を表す。
図8では、コールヒットカウンタの値が5となっており、実行ユニットで実行が完了していないコール命令が5個あり、それらのコール命令に対応するリターン命令の戻り先のアドレスが仮想のリターンアドレススタックXの5つのエントリに格納されていることを示している。
それらのコール命令には、既に、対応するリターン命令がブランチヒストリによって検出されているものがある場合もある。図8の例では、3番目と5番目のコール命令がこれに該当し、リターンヒットテーブルの対応するビットの値が1になっている。リターン命令が検出され、不要となったエントリであっても、コール命令実行完了時にシフトアウトする順序を保持するためにリターンヒットテーブルに対応するビットが保持される。
実際のリターンアドレススタックXは、コスト等の制約から2つのエントリのみを備えるものとする。このリターンアドレススタックXにおいては、コール命令の検出時にリターン命令の戻り先のアドレスがプッシュされ、リターン命令の検出時にポップ動作によって最新のエントリの内容が破棄される。エントリが全て埋まっている状態でコール命令が検出された場合は、最も古いエントリの内容がプッシュアウトされて破棄される。
図8の例では、仮想のリターンアドレススタックXには3つの有効なエントリが存在するが、実際のリターンアドレススタックXには2つのエントリしか存在しないため、最も古いエントリの内容がプッシュアウトされている。しかし、リターンヒットテーブルには、本来リターンアドレススタックXには3つのエントリが存在しているはずであることが記録されているため、図7−8の場合のように誤ってリターンアドレススタックから分岐先のアドレスが取得されることを回避することができる。
本実施例に係る分岐予測方式においては、ブランチヒストリでリターン命令が検出された場合に、コールヒットカウンタの値が1以上であればリターンヒットテーブルを調べる。そして、コールヒットカウンタの指すビットから最下位ビットまでの間に一つでも値が0のビットが存在すれば、コールヒットカウンタの指す位置に最も近いビットの値を1へ変更し、実際のリターンアドレススタックXの最新のエントリの内容を取得して分岐予測結果とする。
プッシュアウトによりアドレス情報が破棄されていた場合、リターンアドレススタックXの全てのエントリが無効化されていることがある。この場合には、リターンアドレススタックXとリターンアドレススタックを用いた分岐予測をおこなうことはできないので、ブランチヒストリの予測結果を分岐予測結果として採用する。ブランチヒストリの予測結果は誤っている場合もあるが、誤ってリターンアドレススタックからアドレスを取得する場合に比べればはるかに精度の高い予測結果をえることができる。
また、リターンヒットテーブルにおいて値が0のビットが一つも存在しなければ、仮想のリターンアドレススタックXの全てのエントリが使用済みであることになるので、リターンスタックポインタに従ってリターンアドレススタックから戻り先のアドレスを取得する。
このように本実施例に係る分岐予測方式では、リターンヒットテーブルによって仮想のリターンアドレススタックXの各エントリの有効性を管理するように構成したので、実際のリターンアドレススタックXのエントリの数が少ない場合であっても、高い精度を保って分岐予測をおこなうことができる。
実際には、リターンアドレススタックXに多数のアドレス情報がプッシュされる場面は少ないと想定されるため、リターンアドレススタックXのエントリ数を少なく抑えながら分岐予測の精度を高く保つことができるこの方式は、非常に高いコストパフォーマンスを有する。
次に、本実施例に係る分岐予測装置の構成について説明する。図9は、本実施例に係る分岐予測装置の構成を示すブロック図である。命令フェッチ制御ユニット110〜アドレス生成リザベーションステーションについては、実施例1と同様であるので説明を省略する。
分岐予測装置300は、ブランチヒストリ310と、リターンアドレススタック320と、リターンアドレス演算回路330と、リターンアドレススタックX340と、リターンアドレス演算回路350と、コールヒットカウンタ360と、リターンヒットテーブル370と、リターンスタックポインタ380と、リターンアドレス選択回路391と、出力選択回路392とを有する。
ブランチヒストリ310、リターンアドレススタック320およびリターンアドレス演算回路330は、それぞれ、実施例1におけるブランチヒストリ210、リターンアドレススタック220およびリターンアドレス演算回路230に対応し、同様の機能を有する。
リターンアドレススタックX340は、ブランチヒストリ310にてコール命令が検出された場合に、そのコール命令に対応するリターン命令の戻り先のアドレスを記憶しておく装置であり、X−TOPとX−NXTという2つのエントリを有する。リターンアドレススタックX340においては、コール命令の検出時にアドレスがプッシュされ、リターン命令検出時に最新のエントリの内容がポップアップするため、先頭のエントリであるX−TOPが常に最新のエントリとなる。
リターンアドレス演算回路350は、ブランチヒストリ310が検出したコール命令のアドレスをリターン命令の戻り先のアドレスへ変換する演算をおこない、リターンアドレススタックX340へ送出する回路である。
コールヒットカウンタ360は、リターンヒットテーブル370に対応する仮想のリターンアドレススタックXの何番目のエントリまでアドレス情報がスタックされているかを保持する装置である。
図10は、コールヒットカウンタ360の回路構成を示す論理回路図である。同図に示すように、コールヒットカウンタ360は、仮想のエントリ数を保持するのに十分なKビットのラッチを有し、このラッチの保持している値をCALL_HIT_CTR信号として出力する。ラッチは初期化時に0に設定され、ブランチヒストリ310からのコールヒット信号がオンになるたびに+1され、分岐リザベーションステーション150からのコール命令フラグがオンになるたびに−1される。
図11は、コールヒットカウンタ360のデコーダ部分の論理回路図である。同図に示すように、コールヒットカウンタ360から出力されるCALL_HIT_CTR信号は、デコーダによってデコードされて、CTR_EQ_0〜CTR_EQ_mのいずれかの信号一つをオンにする。たとえば、CALL_HIT_CTR信号の値が0であればCTR_EQ_0がオンになり、値がmであればCTR_EQ_mがオンになる。
リターンヒットテーブル370は、対応する仮想のリターンアドレススタックXのエントリの有効性を示すビットを保持する装置である。リターンヒットテーブル370の各ビットは、初期値が0であり、対応する仮想のエントリが予測に使用された場合に1に変化する。また、コール命令の実行が完了するたびに、最も古い仮想のエントリに対応するビットがシフトアウトされる。
図12は、リターンヒットテーブル370の回路構成を示す論理回路図である。同図に示すように、リターンヒットテーブル370は、XH1〜XHmのmビットの情報を保持し、各ビットの値は、それぞれ、XH1_SET〜XHm_SET信号によって制御される。たとえば、jビット目のXHjのビットは、XHj_SET信号によって制御される。このXHj_SET信号は、ブランチヒストリ310からのリターンヒット信号がオンであり、かつ、リターンヒットテーブル370のjビットの次のビットからコールヒットカウンタ360が指すビットまでの全てのビットが1の場合、もしくは、コールヒットカウンタ360の値がjである場合にオンとなる。
図13は、リターンヒットテーブル370の出力部分の回路構成を示す論理回路図である。同図に示すように、リターンヒットテーブル370から出力されるUSE_X信号は、リターンヒットテーブル370の最下位ビットからコールヒットカウンタ360が指すビットまでのいずれかのビットが1の場合にオンとなる。
リターンスタックポインタ380は、リターン命令が検出された場合に使用すべきリターンアドレススタックのエントリを示す値を保持する装置である。具体的には、リターンスタックポインタ380が保持する値が000、001、010、011である場合は、それぞれリターンアドレススタック220のSTK0、STK1、STK2、STK3のエントリを使用すべきことを意味する。なお、リターンアドレススタックX340に有効なエントリが存在する場合は、リターンスタックポインタ380が保持する値に関わらず、リターンアドレススタックX340に保持された情報を用いて分岐予測がおこなわれる。
図14は、リターンスタックポインタ380の回路構成を示す論理回路図である。同図に示すように、リターンスタックポインタ380は、<2:0>の3ビットからなるラッチを有し、このラッチの保持している値をRTN_STK_PTR信号として出力する。ラッチの値は初期状態では000であり、分岐リザベーションステーション150からのコール命令フラグがオンになるたびに+1され、リターン命令フラグがオンになるたびに−1される。また、ブランチヒストリ310からのコールヒット信号がオンになるたびに−1され、リターンヒット信号がオンになるたびに+1される。
図15は、リターンスタックポインタ380のデコーダ部分の論理回路図である。同図に示すように、リターンスタックポインタ380から出力されるRTN_STK_PTR信号信号は、デコーダによってデコードされて、PTR_EQ_000〜PTR_EQ_111のいずれかの信号一つをオンにする。具体的には、RTN_STK_PTR信号の値が0〜3の場合は、それぞれ、PTR_EQ_000〜PTR_EQ_011がオンになり、RTN_STK_PTR信号の値が負の場合は、PTR_EQ_111がオンになる。
なお、リターンスタックポインタ380のラッチのビット数は、リターンアドレススタック320のエントリが増えた場合には、それらのエントリを特定できるだけの幅に増やすものとする。
リターンアドレス選択回路391は、リターンアドレススタック320、リターンアドレススタックX340およびリターンスタックポインタ380の情報に基づいて適切な分岐先のアドレスを選択して出力選択回路392へ送出する回路である。
出力選択回路392は、複数の分岐情報から適切なものを選択して命令フェッチ制御ユニット110へ送出する回路である。具体的には、ブランチヒストリ310がリターン命令を検出した場合は、リターンアドレス選択回路391からアドレス情報が送出されていればそのアドレスを、さもなければ、ブランチヒストリ310が送出しているアドレスをリターン命令の戻り先のアドレスとして送出する。
図16は、リターンアドレス選択回路391と出力選択回路392の回路構成を示す論理回路図である。同図に示すように、リターンアドレススタックX340の先頭のエントリの有効性を示すX_TOP_VALID信号がオンであるとき、リターンヒットテーブル370から出力されるUSE_X信号がオンであれば、X_TOP_SEL信号がオンになり、リターン命令の戻り先のアドレスをリターンアドレススタックX340から取得するべきであることを示す。
また、X_TOP_VALID信号がオンでないときは、リターンスタックポインタ380が示すリターンアドレススタック320のエントリが有効であれば、そのエントリに対応するSTK0_SEL〜STK3_SELのいずれかの信号がオンになり、リターン命令の戻り先のアドレスをリターンアドレススタック320から取得するべきであることを示す。
X_TOP_SEL信号およびSTK0_SEL〜STK3_SELの信号は、同時に2つ以上がオンになることはなく、リターンアドレス選択回路391に相当する第1のセレクタは、オンになっている信号に対応するエントリの内容を分岐予測結果として第2のセレクタへ出力する。X_TOP_SEL信号およびSTK0_SEL〜STK3_SELの信号のいずれもオンでない場合には、第2のセレクタへの出力はおこなわない。
出力選択回路392に相当する第2のセレクタは、X_TOP_SEL信号およびSTK0_SEL〜STK3_SELの信号のいずれかがオンであり、かつ、ブランチヒストリ310からのリターンヒット信号がオンであれば、第1のセレクタから出力されたアドレスを分岐予測結果として命令フェッチ制御ユニット110へ出力する。その他の場合は、ブランチヒストリ310から出力されたアドレスを分岐予測結果として命令フェッチ制御ユニット110へ出力する。
なお、リターンアドレススタック320と、リターンアドレススタックX340と、コールヒットカウンタ360と、リターンヒットテーブル370と、リターンスタックポインタ380は、分岐予測が失敗した場合には初期状態にリセットされる。
また、本実施例では、リターンヒットテーブル370の各ビットは、0で初期化され、リターン命令検出時に1になるものとして説明してきたが、逆に、1で初期化され、リターン命令検出時に0になるように構成することもできる。このように構成した場合の、リターンヒットテーブル370の構成についても説明しておく。
図17は、リターンヒットテーブル370の回路構成を示す論理回路図である。同図に示すように、リターンヒットテーブル370は、XH1〜XHmのmビットの情報を保持し、各ビットの値は、それぞれ、XH1_SET〜XHm_SET信号によって制御される。たとえば、jビット目のXHjのビットは、XHj_SET信号によって制御される。
このXHj_SET信号は、ブランチヒストリ310からのコールヒット信号がオンとなったならば、その時点のコールヒットカウンタ360の値がj−1であった場合にオフとなり、リターンヒットテーブル370の対応するビットを0にする。すなわち、ブランチヒストリ310からのコールヒット信号がオンになった場合には、コールヒットカウンタ360が新たに示すことになるビットが0に更新されることになる。
また、XHj_SET信号は、ブランチヒストリ310からのリターンヒット信号がオンとなったならば、その時点のコールヒットカウンタ360の値がjより上位のビットが全て1であった場合にオンとなり、リターンヒットテーブル370の対応するビットを1にする。すなわち、ブランチヒストリ310からのリターンヒット信号がオンになった場合には、リターンヒットテーブル370の値が0である最上位のビットが1に更新される。
このようにリターンヒットテーブル370の各ビットは、対応する仮想のリターンスタックXのエントリに有効な値が存在している場合のみ0となり、その他の場合は1の値をとることになる。
図18は、リターンヒットテーブル370の出力部分の論理回路図である。同図に示すように、リターンヒットテーブル370から出力されるUSE_X信号は、リターンヒットテーブル370の全てのビットの中に一つでも1でないビットが存在した場合にオンとなる。リターンヒットテーブル370に1でないビットが存在するということは、仮想のリターンスタックXのエントリに有効な値が存在していることを意味する。
次に、本実施例に係る分岐予測装置の動作について、図6の命令列を実行する場合を例にして説明する。図19−1〜19−12は、本実施例に係る分岐予測装置の動作を説明するための説明図である。なお、ここでは、リターンヒットテーブルの各ビットを0で初期化する方式を用いた場合について説明することとする。
図19−1は、アドレスAでコール命令が検出された場面であり、リターンアドレススタックXの先頭のX−TOPに戻り先のアドレスとしてA+8が格納され、リターンスタックポインタの値は−1されて−1となっている。また、コールヒットカウンタの値は、+1されて1となっている。
ここで、ブランチヒストリによりアドレスCのリターン命令が検出されたとすると、リターンヒットテーブルの最下位ビットからコールヒットカウンタが示すビットの間に値が0のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちA+8が分岐予測結果として取得される。A+8は、アドレスCのリターン命令の分岐先として正しいアドレスである。
図19−2は、アドレスCでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−TOPの情報は破棄されている。また、リターンスタックポインタの値は、+1されて0となっている。リターンヒットテーブルではコールヒットカウンタが示しているXH1のビットが1となり、対応する仮想のエントリが使用済みであることを記憶している。
図19−3は、続いてアドレスAのコール命令の実行が完了した場面を示している。コール命令の実行の完了を受けて、リターンアドレススタックの先頭のSTK0に戻り先のアドレスA+8が格納され、リターンスタックポインタの値は、+1されて1となっている。また、コールヒットカウンタの値は、−1されて0となり、リターンヒットテーブルではシフト動作がおこなわれて最下位のビットが破棄されている。
図19−4は、続いてアドレスDでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの先頭のX−TOPに戻り先のアドレスD+8が格納され、リターンスタックポインタの値は、−1されて0となっている。また、コールヒットカウンタの値は、+1されて1となっている。
図19−5は、続いてアドレスFでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXに戻り先のアドレスF+8がプッシュされ、リターンスタックポインタの値は、−1されて−1となっている。また、コールヒットカウンタの値は、+1されて2となっている。
図19−6は、続いてアドレスHでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXに戻り先のアドレスであるH+8がプッシュされるが、既にエントリは2つとも埋まった状態であるため、古い情報であるD+8がプッシュアウトされて消えてしまう。こうして、リターンアドレススタックXは、X−TOPにH+8が格納され、X−NXTにF+8が格納された状態となる。また、リターンスタックポインタの値は、−1されて−2となり、コールヒットカウンタの値は、+1されて3となっている。
ここで、ブランチヒストリによりアドレスJのリターン命令が検出されたとすると、リターンヒットテーブルの最下位ビットからコールヒットカウンタが示すビットの間に値が0のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちH+8が分岐予測結果として取得される。H+8は、アドレスJのリターン命令の分岐先のアドレスとして正しいアドレスである。
図19−7は、アドレスJでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−NXTの情報がX−TOPへ移動している。また、リターンスタックポインタの値は、+1されて−1となっている。リターンヒットテーブルではコールヒットカウンタが示しているXH3のビットが1となり、対応する仮想のエントリが使用済みであることを記憶している。
ここで、ブランチヒストリによりアドレスKのリターン命令が検出されたとすると、リターンヒットテーブルの最下位ビットからコールヒットカウンタが示すビットの間に値が0のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちF+8が分岐予測結果として取得される。F+8は、アドレスKのリターン命令の分岐先のアドレスとして正しいアドレスである。
図19−8は、アドレスKでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−TOPの情報は破棄されている。また、リターンスタックポインタの値は、+1されて0となっている。リターンヒットテーブルではコールヒットカウンタが示しているXH3のビットは既に1であるので、次のXH2のビットが1となり、対応する仮想のエントリが使用済みであることを記憶している。
ここで、ブランチヒストリによりアドレスLのリターン命令が検出されたとすると、リターンヒットテーブルの最下位ビットからコールヒットカウンタが示すビットの間に値が0のビットが存在するので、リターンアドレススタックXの最新エントリであるX−TOPからアドレス情報を取得しようとするが、X−TOPには既に情報が存在しないため取得することができない。この場合、リターンアドレススタックからアドレス情報を取得しても正しい分岐先のアドレスは取得できないため、ブランチヒストリの予測値を予測結果とする。
ブランチヒストリが正しいアドレスを予測することができれば、分岐予測は成功する。同じ命令実行状況である図7−8の場面では、常に分岐予測が失敗するのに対し、本実施例に係る分岐予測方式では、ブランチヒストリを利用した分岐予測をおこなうことで分岐予測の精度を大幅に向上させることができる。
図19−9は、アドレスLでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれている。また、リターンスタックポインタの値は、+1されて1となっている。リターンヒットテーブルではXH3のビットとHX2のビットが既に1であるので、次のXH1のビットが1となり、全ての仮想のエントリが使用済みであることを記憶している。
もしも、アドレスLのリターン命令が検出される前にアドレスDのコール命令の実行が完了していたとすると、分岐予測の精度はさらに高くなる。アドレスDのコール命令の実行が完了するには、アドレスCのリターン命令の実行が完了している必要があるため、図19−8の場面でアドレスCのリターン命令の実行が完了したものとする。
図19−10は、図19−8の状況でアドレスCのリターン命令の実行が完了した場面を示している。リターン命令の実行の完了を受けて、リターンアドレススタックではポップ動作がおこなわれて、先頭のSTK0の内容が破棄されている。また、リターンスタックポインタの値は、−1されて−1となっている。
図19−11は、続いてアドレスDのコール命令の実行が完了した場面を示している。コール命令の実行の完了を受けて、リターンアドレススタックの先頭のSTK0に戻り先のアドレスD+8が格納され、リターンスタックポインタの値は、+1されて0となっている。また、コールヒットカウンタの値は、−1されて2となり、リターンヒットテーブルではシフト動作がおこなわれて最下位のビットが破棄されている。
ここで、ブランチヒストリによりアドレスLのリターン命令が検出されたとすると、リターンヒットテーブルの最下位ビットからコールヒットカウンタが示すビットの間に値が0のビットが存在しないので、リターンスタックポインタが示すリターンアドレススタックのエントリであるSTK0に格納された値、すなわちD+8が分岐予測結果として取得される。D+8は、アドレスLのリターン命令の分岐先のアドレスとして正しいアドレスである。
このように、コール命令の実行が迅速に完了すれば、本実施例に係る分岐予測方式によって、リターンアドレススタックXのエントリ数を増加させることなく、高い精度で分岐予測をおこなうことが可能となる。
図19−12は、アドレスLでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれている。また、リターンスタックポインタの値は、+1されて1となっている。
上述してきたように、本実施例2では、少数のビットからなる管理テーブルによって仮想のリターンアドレススタックXのエントリの有効性を管理するように構成したので、実際のリターンアドレススタックXのエントリ数を少なく抑えながら、高い精度で分岐予測をおこなうことができる。
なお、本実施例においては、リターンヒットテーブルを最下位のビットから使用するものとして説明しているが、必ずしもこの通りの使い方をする必要はない。たとえば、最上位のビットから順に使用することも可能であり、スタックのような使い方をすることもできる。
実施例3で説明した分岐予測方式では、リターン命令の検出を契機として仮想エントリの管理テーブルのビットの更新をおこなったが、コール命令の検出を契機として仮想エントリの管理テーブルのビットの更新をおこなうように構成することもできる。本実施例では、コール命令の検出を契機として仮想エントリの管理テーブルのビットの更新をおこなう分岐予測方式について説明することとする。
図20は、本実施例に係る分岐予測方式の概要を説明するための説明図である。同図に示すように、本実施例に係る分岐予測方式では、Xバリッドテーブルとコールヒットカウンタを使用する。
Xバリッドテーブルは、仮想のリターンアドレススタックXの各エントリの有効性を管理するテーブルである。リターンヒットテーブルの各ビットは、仮想のリターンアドレススタックXのエントリ一つに対応し、初期値として0をとる。そしてビットが0であれば、対応する仮想のエントリが無効であることを示し、ビットが1であれば対応する仮想のエントリが有効であることを示す。
Xバリッドテーブルは、コール命令が検出されるたびに最下位のビットであるXV1から順に1が設定され、リターン命令が検出されるたびに最上位の値が1であるビットが0にリセットされる。また、コール命令の実行が完了するたびにシフト動作により最下位のビットの値が捨てられる。コール命令の実行が完了すれば、リターン命令の戻り先のアドレスがリターンアドレススタックに格納されるため、仮想のリターンアドレススタックXのエントリは不要となるためである。
Xバリッドテーブルは、仮想のリターンアドレススタックXのエントリごとに1ビットあればよいので、非常に低コストで実装することができる。たとえば、アドレス長が64ビットあるとした場合、実際のリターンアドレススタックXに8個のエントリを設けると64×8で512ビットが必要になるが、Xバリッドテーブルは8ビットあれば済むことになる。
コールヒットカウンタは初期値として0をとり、コール命令が検出されるたびに+1され、コール命令の実行が完了するたびに−1される。したがって、コールヒットカウンタの値は、ブランチヒストリによって検出されているが、実行が完了していないコール命令の数、すなわち、値が格納されている仮想のリターンアドレススタックXのエントリの数を表す。
図20では、コールヒットカウンタの値が5となっており、実行ユニットで実行が完了していないコール命令が5個あり、それらのコール命令に対応するリターン命令の戻り先のアドレスが仮想のリターンアドレススタックXの5つのエントリに格納されていることを示している。
それらのコール命令には、既に、対応するリターン命令がブランチヒストリによって検出されているものがある場合もある。図20の例では、3番目と5番目のコール命令がこれに該当し、Xバリッドテーブルの対応するビットの値が0になっている。リターン命令が検出され、不要となったエントリであっても、コール命令実行完了時にシフトアウトする順序を保持するためにXバリッドテーブルに対応するビットが保持される。
実際のリターンアドレススタックXは、コスト等の制約から2つのエントリのみを備えるものとする。このリターンアドレススタックXにおいては、コール命令の検出時にリターン命令の戻り先のアドレスがプッシュされ、リターン命令の検出時にポップ動作によって最新のエントリの内容が破棄される。エントリが全て埋まっている状態でコール命令が検出された場合は、最も古いエントリの内容がプッシュアウトされて破棄される。
図20の例では、仮想のリターンアドレススタックXには3つの有効なエントリが存在するが、実際のリターンアドレススタックXには2つのエントリしか存在しないため、最も古いエントリの内容がプッシュアウトされている。しかし、Xバリッドテーブルには、本来リターンアドレススタックXには3つのエントリが存在しているはずであることが記録されているため、実施例2の図7−8の場合のように誤ってリターンアドレススタックから分岐先のアドレスが取得されることを回避することができる。
本実施例に係る分岐予測方式においては、ブランチヒストリでリターン命令が検出された場合に、コールヒットカウンタの値が1以上であればXバリッドテーブルを調べる。そして、全ビット中に値が1のビットがひとつでも存在すれば、値が1である最も上位のビットの値を0へ変更し、実際のリターンアドレススタックXの最新のエントリの内容を取得して分岐予測結果とする。
プッシュアウトによりアドレス情報が破棄されていた場合、リターンアドレススタックXの全てのエントリが無効化されていることがある。この場合には、リターンアドレススタックXとリターンアドレススタックを用いた分岐予測をおこなうことはできないので、ブランチヒストリの予測結果を分岐予測結果として採用する。
また、Xバリッドテーブルにおいて値が1のビットが一つも存在しなければ、仮想のリターンアドレススタックXの全てのエントリが使用済みであることになるので、、リターンスタックポインタに従ってリターンアドレススタックから戻り先のアドレスを取得する。
このように本実施例に係る分岐予測方式では、Xバリッドテーブルによって仮想のリターンアドレススタックXの各エントリの有効性を管理するように構成したので、実際のリターンアドレススタックXのエントリの数が少ない場合であっても、高い精度を保って分岐予測をおこなうことができる。
次に、本実施例に係る分岐予測装置の構成について説明する。図21は、本実施例に係る分岐予測装置の構成を示すブロック図である。命令フェッチ制御ユニット110〜アドレス生成リザベーションステーションについては、実施例1と同様であるので説明を省略する。
分岐予測装置400は、ブランチヒストリ410と、リターンアドレススタック420と、リターンアドレス演算回路430と、リターンアドレススタックX440と、リターンアドレス演算回路450と、コールヒットカウンタ460と、Xバリッドテーブル470と、リターンスタックポインタ480と、リターンアドレス選択回路491と、出力選択回路492とを有する。
ブランチヒストリ410、リターンアドレススタック420、リターンアドレス演算回路430、リターンアドレススタックX440、リターンアドレス演算回路450、リターンスタックポインタ480、リターンアドレス選択回路491および出力選択回路492は、それぞれ、実施例2におけるブランチヒストリ310、リターンアドレススタック320、リターンアドレス演算回路330、リターンアドレススタックX340、リターンアドレス演算回路350、リターンスタックポインタ380、リターンアドレス選択回路391および出力選択回路392に対応し、同様の機能を有する。
コールヒットカウンタ460は、Xバリッドテーブル470に対応する仮想のリターンアドレススタックXの何番目のエントリまでアドレス情報がスタックされているかを保持する装置である。実施例2の図10に示すように、コールヒットカウンタ460は、仮想のエントリ数を保持するのに十分なKビットのラッチを有し、このラッチの保持している値をCALL_HIT_CTR信号として出力する。ラッチは初期化時に0に設定され、ブランチヒストリ310からのコールヒット信号がオンになるたびに+1され、分岐リザベーションステーション150からのコール命令フラグがオンになるたびに−1される。
また、実施例2の図11に示すように、コールヒットカウンタ460から出力されるCALL_HIT_CTR信号は、デコーダによってデコードされて、CTR_EQ_0〜CTR_EQ_mのいずれかの信号一つをオンにする。たとえば、CALL_HIT_CTR信号の値が0であればCTR_EQ_0がオンになり、値がmであればCTR_EQ_mがオンになる。
Xバリッドテーブル470は、対応する仮想のリターンアドレススタックXのエントリの有効性を示すビットを保持する装置である。Xバリッドテーブル470の各ビットは、初期値が0であり、コール命令が検出され、対応する仮想のエントリに値が格納されたとみなされた場合に1が設定され、リターン命令が検出され、対応する仮想のエントリの値が予測に使用された場合に0にリセットされる。また、コール命令の実行が完了するたびに、最も古い仮想のエントリに対応するビットがシフトアウトされる。
図22は、Xバリッドテーブル470の回路構成を示す論理回路図である。同図に示すように、Xバリッドテーブル470は、XV1〜XVmのmビットの情報を保持し、各ビットの値は、それぞれ、XV1_SET〜XVm_SET信号によって制御される。たとえば、jビット目のXVjのビットは、XVj_SET信号によって制御される。
このXVj_SET信号は、ブランチヒストリ410からのコールヒット信号がオンとなったならば、その時点のコールヒットカウンタ460の値がj−1であった場合にオンとなり、Xバリッドテーブル470の対応するビットを1にする。すなわち、ブランチヒストリ410からのコールヒット信号がオンになった場合には、コールヒットカウンタ460が新たに示すことになるビットが1に更新されることになる。
また、XVj_SET信号は、ブランチヒストリ410からのリターンヒット信号がオンとなったならば、その時点のコールヒットカウンタ360の値がjより上位のビットが全て0であった場合にオフとなり、Xバリッドテーブル470の対応するビットを0にする。すなわち、ブランチヒストリ410からのリターンヒット信号がオンになった場合には、Xバリッドテーブル470の値が1である最上位のビットが0に更新される。
このようにXバリッドテーブル470の各ビットは、対応する仮想のリターンスタックXのエントリに有効な値が存在している場合のみ1となり、その他の場合は1の値をとることになる。
図23は、Xバリッドテーブル470の出力部分の論理回路図である。同図に示すように、Xバリッドテーブル470から出力されるUSE_X信号は、Xバリッドテーブル470の全てのビットの中に一つでも値が1であるビットが存在した場合にオンとなる。Xバリッドテーブル470に値が1のビットが存在するということは、仮想のリターンスタックXのエントリに有効な値が存在していることを意味する。
なお、リターンアドレススタック420と、リターンアドレススタック440と、コールヒットカウンタ460と、Xバリッドテーブル470と、リターンスタックポインタ480は、分岐予測が失敗した場合には初期状態にリセットされる。
次に、本実施例に係る分岐予測装置の動作について、実施例2の図6の命令列を実行する場合を例にして説明する。図24−1〜24−9は、本実施例に係る分岐予測装置の動作を説明するための説明図である。なお、本実施例においては、Xバリッドテーブルの全てのビットが初期化時に0に設定されているものとする。
図24−1は、アドレスAでコール命令が検出された場面であり、リターンアドレススタックXの先頭のX−TOPに戻り先のアドレスとしてA+8が格納され、リターンスタックポインタの値は−1されて−1となっている。また、コールヒットカウンタの値は、+1されて1となり、コールヒットカウンタによって指し示されるXバリッドテーブルのXV1に1が設定されている。
ここで、ブランチヒストリによりアドレスCのリターン命令が検出されたとすると、Xバリッドテーブルに値が1のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちA+8が分岐予測結果として取得される。A+8は、アドレスCのリターン命令の分岐先として正しいアドレスである。
図24−2は、アドレスCでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−TOPの情報は破棄されている。また、リターンスタックポインタの値は、+1されて0となっている。Xバリッドテーブルではコールヒットカウンタが示しているXV1のビットが0となり、対応する仮想のエントリが使用済みであることを記憶している。
図24−3は、続いてアドレスAのコール命令の実行が完了した場面を示している。コール命令の実行の完了を受けて、リターンアドレススタックの先頭のSTK0に戻り先のアドレスA+8が格納され、リターンスタックポインタの値は、+1されて1となっている。また、コールヒットカウンタの値は、−1されて0となり、Xバリッドテーブルではシフト動作がおこなわれて最下位のビットが破棄されている。
図24−4は、続いてアドレスDでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXの先頭のX−TOPに戻り先のアドレスD+8が格納され、リターンスタックポインタの値は、−1されて0となっている。また、コールヒットカウンタの値は、+1されて1となり、コールヒットカウンタによって指し示されるXバリッドテーブルのXV1に1が設定されている。
図24−5は、続いてアドレスFでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXに戻り先のアドレスF+8がプッシュされ、リターンスタックポインタの値は、−1されて−1となっている。また、コールヒットカウンタの値は、+1されて2となり、コールヒットカウンタによって指し示されるXバリッドテーブルのXV2に1が設定されている。
図24−6は、続いてアドレスHでコール命令が検出された場面を示している。コール命令の検出を受けて、リターンアドレススタックXに戻り先のアドレスであるH+8がプッシュされるが、既にエントリは2つとも埋まった状態であるため、古い情報であるD+8がプッシュアウトされて消えてしまう。こうして、リターンアドレススタックXは、X−TOPにH+8が格納され、X−NXTにF+8が格納された状態となる。また、リターンスタックポインタの値は、−1されて−2となり、コールヒットカウンタの値は、+1されて3となり、コールヒットカウンタによって指し示されるXバリッドテーブルのXV3に1が設定されている。
ここで、ブランチヒストリによりアドレスJのリターン命令が検出されたとすると、Xバリッドテーブルに値が1のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちH+8が分岐予測結果として取得される。H+8は、アドレスJのリターン命令の分岐先のアドレスとして正しいアドレスである。
図24−7は、アドレスJでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−NXTの情報がX−TOPへ移動している。また、リターンスタックポインタの値は、+1されて−1となっている。Xバリッドテーブルでは値が1である最上位のXV3のビットが0となり、対応する仮想のエントリが使用済みであることを記憶している。
ここで、ブランチヒストリによりアドレスKのリターン命令が検出されたとすると、Xバリッドテーブルに値が1のビットが存在するので、リターンアドレススタックXの有効な最新のエントリであるX−TOPに格納された値、すなわちF+8が分岐予測結果として取得される。F+8は、アドレスKのリターン命令の分岐先のアドレスとして正しいアドレスである。
図24−8は、アドレスKでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれ、X−TOPの情報は破棄されている。また、リターンスタックポインタの値は、+1されて0となっている。Xバリッドテーブルでは値が1である最上位のXV2のビットが0となり、対応する仮想のエントリが使用済みであることを記憶している。
ここで、ブランチヒストリによりアドレスLのリターン命令が検出されたとすると、Xバリッドテーブルに値が1のビットが存在するので、リターンアドレススタックXの最新エントリであるX−TOPからアドレス情報を取得しようとするが、X−TOPには既に情報が存在しないため取得することができない。この場合、リターンアドレススタックからアドレス情報を取得しても正しい分岐先のアドレスは取得できないため、ブランチヒストリの予測値を予測結果とする。
ブランチヒストリが正しいアドレスを予測することができれば、分岐予測は成功する。同じ命令実行状況である実施例2の図7−8の場面では、常に分岐予測が失敗するのに対し、本実施例に係る分岐予測方式では、ブランチヒストリを利用した分岐予測をおこなうことで分岐予測の精度を大幅に向上させることができる。
図24−9は、アドレスLでリターン命令が検出された後の場面を示している。リターン命令の検出により、リターンアドレススタックXではポップ動作がおこなわれている。また、リターンスタックポインタの値は、+1されて1となっている。Xバリッドテーブルでは値が1である最上位のXV1のビットが0となり、全ての仮想のエントリが使用済みであることを記憶している。
なお、説明は省略するが、実施例2の場合と同様に、コール命令の実行が迅速に完了すれば、本実施例に係る分岐予測方式による分岐予測の精度はさらに高いものとなる。
上述してきたように、本実施例3では、少数のビットからなる管理テーブルによって仮想のリターンアドレススタックXのエントリの有効性を管理するように構成したので、実際のリターンアドレススタックXのエントリ数を少なく抑えながら、高い精度で分岐予測をおこなうことができる。
また、図12と図22を比較すれば分かるように、本実施例に係る分岐予測方式は、実施例2で説明した方式と同等の効果を、より簡略な仕組みで実現することができる。
なお、本実施例においては、Xバリッドテーブルを最下位のビットから使用するものとして説明しているが、必ずしもこの通りの使い方をする必要はない。たとえば、最上位のビットから順に使用することも可能であり、スタックのような使い方をすることもできる。また、本実施例とはビットのオン/オフを逆にして実施することもできる。
(付記1)パイプライン方式のプロセッサにおいて分岐予測をおこなう分岐予測装置であって、
コール命令とリターン命令を含む分岐命令の実行履歴情報を記憶し、この分岐命令の実行履歴情報を検索して分岐命令の存在と該分岐命令による分岐先を予測するブランチヒストリと、
サブルーチンのコール命令の実行が完了した場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶する第1のリターンアドレススタックと、
前記ブランチヒストリによりサブルーチンのコール命令の存在が予測された場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶する第2のリターンアドレススタックと、
前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックにアドレス情報が保持されていれば、前記第2のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力する出力選択手段と
を備えたことを特徴とする分岐予測装置。
(付記2)分岐予測が失敗した場合に、前記第2のアドレススタックの内容を全消去することを特徴とする付記1に記載の分岐予測装置。
(付記3)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックに複数のアドレス情報が保持されていれば、前記第2のリターンアドレススタックに最後に記憶された有効なアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする付記1または2に記載の分岐予測装置。
(付記4)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第2のリターンアドレススタックにアドレス情報が保持されていなければ、前記第1のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする付記1、2または3に記載の分岐予測装置。
(付記5)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記第1のリターンアドレススタックと前記第2のリターンアドレススタックのいずれにもアドレス情報が保持されていなければ、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする付記1〜4のいずれか一つに記載の分岐予測装置。
(付記6)前記ブランチヒストリによって存在が予測されたコール命令が実行完了したか否かと、該コール命令に対応するリターン命令の分岐予測が完了しているか否かを保持するコール命令状況保持手段をさらに備えたことを特徴とする付記1〜5のいずれか一つに記載の分岐予測装置。
(付記7)分岐予測が失敗した場合に、前記コール命令状況保持手段の内容を全消去することを特徴とする付記6に記載の分岐予測装置。
(付記8)前記コール命令状況保持手段が状況を保持しているコール命令の数を保持するカウンタをさらに備えたことを特徴とする付記6または7に記載の分岐予測装置。
(付記9)分岐予測が失敗した場合に、前記カウンタの内容を全消去することを特徴とする付記8に記載の分岐予測装置。
(付記10)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令状況保持手段によって判明した場合には、前記第2のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする付記6〜9のいずれか一つに記載の分岐予測装置。
(付記11)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令状況保持手段によって判明したが、前記第2のリターンアドレススタックにアドレス情報が保持されていない場合には、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする付記10に記載の分岐予測装置。
(付記12)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令状況保持手段によって判明した場合には、前記第1のリターンアドレススタックに保持されたアドレス情報を最優先で分岐予測結果として選択して出力することを特徴とする付記6〜11のいずれか一つに記載の分岐予測装置。
(付記13)前記出力選択手段は、前記ブランチヒストリによりリターン命令の存在が予測された場合に、前記ブランチヒストリにより存在が予測されているが、実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令状況保持手段によって判明し、前記第1のリターンアドレススタックにアドレス情報が保持されていない場合には、前記ブランチヒストリの予測結果を分岐予測結果として選択して出力することを特徴とする付記12に記載の分岐予測装置。
(付記14)前記コール命令状況保持手段は、前記ブランチヒストリによって存在が予測されたコール命令の状況を命令毎にビットのオン/オフによって保持することを特徴とする付記6〜9のいずれか一つに記載の分岐予測装置。
(付記15)前記コール命令状況保持手段は、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを0に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、管理対象のビットのうち値が0の最新のビットを1に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする付記14に記載の分岐予測装置。
(付記16)前記コール命令状況保持手段は、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを1に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、管理対象のビットのうち値が1の最新のビットを0に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする付記14に記載の分岐予測装置。
(付記17)前記コール命令状況保持手段は、所有するビットを初期化時に全て0に設定し、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを1に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、全ビットのうち値が1の最新のビットを0に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする付記14に記載の分岐予測装置。
(付記18)前記コール命令状況保持手段は、所有するビットを初期化時に全て1に設定し、前記ブランチヒストリによってコール命令の存在が予測された場合に、管理対象のビット一つ追加して該ビットを0に設定し、前記ブランチヒストリによってリターン命令の存在が予測された場合には、全ビットのうち値が0の最新のビットを1に変更し、いずれかのコール命令の実行が完了した場合には、最も古いビットを管理対象から外すことを特徴とする付記14に記載の分岐予測装置。
(付記19)パイプライン方式のプロセッサにおいて分岐予測をおこなう分岐予測方法であって、
コール命令とリターン命令を含む分岐命令の実行履歴情報を記憶するブランチヒストリをもちいて、分岐命令の存在と該分岐命令による分岐先を予測する分岐命令予測工程と、
前記分岐命令予測工程によりサブルーチンのコール命令の存在が予測された場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶手段に記憶する第一のリターンアドレス記憶工程と、
サブルーチンのコール命令の実行が完了した場合に、該コール命令に対応するリターン命令の戻り先のアドレス情報を記憶手段に記憶する第2のリターンアドレス記憶工程と、
前記分岐命令予測工程によりリターン命令の存在が予測された場合に、前記第2のリターンアドレス記憶工程より記憶されたアドレス情報が存在すれば、前記第1のリターンアドレス記憶工程により記憶されたアドレス情報を最優先で分岐予測結果として選択して出力する出力選択工程と
を含んだことを特徴とする分岐予測方法。
以上のように、本発明にかかる分岐予測装置およびその制御方法は、リターン命令の分岐予測に有用であり、特に、コール命令の実行完了に先行して複数のコール命令がブランチヒストリによって検出された場合に分岐予測の精度を高く保つことが必要な場合に適している。
本実施例に係る分岐予測装置の動作を説明するための命令列を示すサンプル図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の構成を示すブロック図である。 図3に示したリターンアドレス選択回路の処理手順を示すフローチャートである。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための命令列を示すサンプル図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 従来の分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測方式の概要を説明するための説明図である。 本実施例に係る分岐予測装置の構成を示すブロック図である。 コールヒットカウンタの回路構成を示す論理回路図である。 コールヒットカウンタのデコーダ部分の論理回路図である。 リターンヒットテーブルの回路構成を示す論理回路図である。 リターンヒットテーブルの出力部分の回路構成を示す論理回路図である。 リターンスタックポインタの回路構成を示す論理回路図である。 リターンスタックポインタのデコーダ部分の論理回路図である。 リターンアドレス選択回路と出力選択回路の回路構成を示す論理回路図である。 リターンヒットテーブルの回路構成を示す論理回路図である。 リターンヒットテーブルの出力部分の論理回路図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測方式の概要を説明するための説明図である。 本実施例に係る分岐予測装置の構成を示すブロック図である。 Xバリッドテーブルの回路構成を示す論理回路図である。 Xバリッドテーブルの出力部分の論理回路図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。 本実施例に係る分岐予測装置の動作を説明するための説明図である。
符号の説明
110 命令フェッチ制御ユニット
120 キャッシュ制御ユニット
130 命令バッファ
140 デコーダ
150 分岐レザベーションステーション
160 整数演算レザベーションステーション
170 浮動小数演算レザベーションステーション
180 アドレス生成レザベーションステーション
200 分岐予測装置
210 ブランチヒストリ
220 リターンアドレススタック
230 リターンアドレス演算回路
240 リターンアドレススタックX
250 バリッド制御回路
260 リターンアドレス演算回路
270 リターンスタックポインタ
281 リターンアドレス選択回路
282 出力選択回路
300 分岐予測装置
310 ブランチヒストリ
320 リターンアドレススタック
330 リターンアドレス演算回路
340 リターンアドレススタックX
350 リターンアドレス演算回路
360 コールヒットカウンタ
370 リターンヒットテーブル
380 リターンスタックポインタ
391 リターンアドレス選択回路
392 出力選択回路
400 分岐予測装置
410 ブランチヒストリ
420 リターンアドレススタック
430 リターンアドレス演算回路
440 リターンアドレススタックX
450 リターンアドレス演算回路
460 コールヒットカウンタ
470 リターンヒットテーブル
480 リターンスタックポインタ
491 リターンアドレス選択回路
492 出力選択回路

Claims (13)

  1. 分岐命令実行部に接続され、第1のプログラムから第2のプログラムを呼び出すコール命令と前記第2のプログラムから前記第1のプログラムに戻るリターン命令を含む分岐命令の分岐先アドレスを含む分岐履歴情報を保持し、前記分岐命令が前記分岐命令実行部により実行された場合に前記分岐履歴情報に基づいて分岐先アドレスの予測を行う分岐予測部と、
    コール命令が実行された場合に、前記実行されたコール命令のアドレスに所定値を加算して、前記実行されたコール命令に対応するリターン命令の戻り先アドレスである第1の戻り先アドレスを算出する第1のリターンアドレス演算部と、
    第1のエントリを有するとともに、前記第1の戻り先アドレスと前記第1の戻り先アドレスが有効であることを示す第1のバリッド情報を、前記第1のエントリに保持する第1の戻り先アドレス記憶部と、
    前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記検出されたコール命令のアドレスに所定値を加算して、前記検出されたコール命令に対応するリターン命令の戻り先アドレスである第2の戻り先アドレスを算出する第2のリターンアドレス演算部と、
    前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記第2の戻り先アドレスが有効であることを表す第2のバリッド情報を生成する第2のバリッド情報生成部と、
    第2の複数のエントリを有するとともに、前記第2の戻り先アドレスと前記第2のバリッド情報を、前記第2の複数のエントリのいずれかのエントリに保持し、コール命令が前記分岐命令実行部により実行された場合には、前記第2の複数のエントリのうち、最も古い第2の戻り先アドレスを保持するエントリの内容を消去する第2の戻り先アドレス記憶部と、
    前記第1の戻り先アドレス記憶部が有する前記第1のエントリと、前記第2の戻り先アドレス記憶部が有する前記第2の複数のエントリのうち、いずれか1つのエントリを指定するポインタ情報を生成・保持するポインタ部と、
    前記第1のバリッド情報と前記第2のバリッド情報と前記ポインタ情報に基づいて、前記分岐予測部が前記分岐履歴情報に保持するリターン命令に対応する分岐先アドレスと、前記第1の戻り先アドレス記憶部に保持する第1の戻り先アドレスと、前記第2の戻り先アドレス記憶部に保持する第2の戻り先アドレスのうち、いずれか1つのアドレスを選択する出力選択部と
    を有することを特徴とする分岐予測装置。
  2. 前記分岐予測装置は、
    コール命令の分岐予測が失敗した場合に、前記第2の戻り先アドレス記憶部が有する複数のエントリの内容を全て消去することを特徴とする請求項1に記載の分岐予測装置。
  3. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記第2の戻り先アドレス記憶部が有する複数のエントリに複数の戻り先アドレスが保持されているとき、前記第2の戻り先アドレス記憶部に最後に記憶されたバリッド情報が有効である戻り先アドレスを、選択することを特徴とする請求項1または2に記載の分岐予測装置。
  4. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記第2の戻り先アドレス記憶部が有する複数のエントリのいずれにも、バリッド情報が有効である戻り先アドレスが保持されていないとき、前記第1の戻り先アドレス記憶部に保持された戻り先アドレスを、選択することを特徴とする請求項1〜3のいずれか1項に記載の分岐予測装置。
  5. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記第1の戻り先アドレス記憶部が有するエントリと前記第2の戻り先アドレス記憶部が有する複数のエントリのいずれにも、バリッド情報が有効である戻り先アドレスが保持されていないとき、前記分岐予測部が前記分岐履歴情報に保持するリターン命令に対応する分岐先アドレスを、選択することを特徴とする請求項1〜4のいずれか1項に記載の分岐予測装置。
  6. 分岐命令実行部に接続され、第1のプログラムから第2のプログラムを呼び出すコール命令と前記第2のプログラムから前記第1のプログラムに戻るリターン命令を含む分岐命令の分岐先アドレスを含む分岐履歴情報を保持し、前記分岐命令が前記分岐命令実行部により実行された場合に前記分岐履歴情報に基づいて分岐先アドレスの予測を行う分岐予測部と、
    コール命令が実行された場合に、前記実行されたコール命令のアドレスに所定値を加算して、前記実行されたコール命令に対応するリターン命令の戻り先アドレスである第1の戻り先アドレスを算出する第1のリターンアドレス演算部と、
    第1のエントリを有するとともに、前記第1の戻り先アドレスと前記第1の戻り先アドレスが有効であることを示す第1のバリッド情報を、前記第1のエントリに保持する第1の戻り先アドレス記憶部と、
    前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記検出されたコール命令のアドレスに所定値を加算して、前記検出されたコール命令に対応するリターン命令の戻り先アドレスである第2の戻り先アドレスを算出する第2のリターンアドレス演算部と、
    前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記第2の戻り先アドレスが有効であることを表す第2のバリッド情報を生成する第2のバリッド情報生成部と、
    前記分岐予測部が前記実行履歴情報から検出したコール命令の実行が完了したか否かを表すコール命令完了情報を保持するコール命令完了情報保持部と、
    前記コール命令完了情報保持部が保持するコール命令完了情報に対応するコール命令の数を保持するコール命令カウンタと、
    第2の複数のエントリを有するとともに、前記第2の戻り先アドレスと前記第2のバリッド情報を、前記第2の複数のエントリのいずれかのエントリに保持し、コール命令が前記分岐命令実行部により実行された場合には、前記第2の複数のエントリのうち、最も古い第2の戻り先アドレスを保持するエントリの内容を消去する第2の戻り先アドレス記憶部と、
    前記第1の戻り先アドレス記憶部が有する前記第1のエントリと、前記第2の戻り先アドレス記憶部が有する前記第2の複数のエントリのうち、いずれか1つのエントリを指定するポインタ情報を生成・保持するポインタ部と、
    前記第1のバリッド情報と前記第2のバリッド情報と前記ポインタ情報に基づいて、前記分岐予測部が前記分岐履歴情報に保持するリターン命令に対応する分岐先アドレスと、前記第1の戻り先アドレス記憶部に保持する第1の戻り先アドレスと、前記第2の戻り先アドレス記憶部に保持する第2の戻り先アドレスのうち、いずれか1つのアドレスを選択する出力選択部と
    を有することを特徴とする分岐予測装置。
  7. 前記分岐予測装置は、
    コール命令の分岐予測が失敗した場合に、前記コール命令完了情報保持部が保持するコール命令完了情報の全てを消去することを特徴とする請求項6に記載の分岐予測装置。
  8. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記分岐予測部によって前記分岐履歴情報から検出されたが実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令完了情報保持部によって判明したとき、前記第2の戻り先アドレス記憶部に保持された前記検出されたリターン命令の戻り先アドレスを選択することを特徴とする請求項6または7に記載の分岐予測装置。
  9. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記分岐予測部によって前記分岐履歴情報から検出されたが実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在することが前記コール命令完了情報保持部によって判明し、さらに、前記第2の戻り先アドレス記憶部に前記検出されたリターン命令の戻り先アドレスが保持されていないとき、前記分岐予測部が前記分岐履歴情報に保持する前記検出されたリターン命令に対応する分岐先アドレスを選択することを特徴とする請求項8に記載の分岐予測装置。
  10. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記分岐予測部によって前記分岐履歴情報から検出されたが実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令完了情報保持部によって判明したとき、前記第1の戻り先アドレス記憶部に保持された前記検出されたリターン命令の戻り先アドレスを選択することを特徴とする請求項6または7に記載の分岐予測装置。
  11. 前記出力選択部は、
    前記分岐予測部が前記分岐履歴情報からリターン命令を検出した場合に、前記分岐予測部によって前記分岐履歴情報から検出されたが実行が完了しておらず、かつ、対応するリターン命令の分岐予測が完了していないコール命令が存在しないことが前記コール命令完了情報保持部によって判明し、さらに、前記第1の戻り先アドレス記憶部に前記検出されたリターン命令の戻り先アドレスが保持されていないとき、前記分岐予測部が前記分岐履歴情報に保持する前記検出されたリターン命令に対応する分岐先アドレスを選択することを特徴とする請求項10に記載の分岐予測装置。
  12. 分岐命令実行部に接続され、第1のプログラムから第2のプログラムを呼び出すコール命令と前記第2のプログラムから前記第1のプログラムに戻るリターン命令を含む分岐命令の分岐先アドレスを含む分岐履歴情報を保持し、前記分岐命令が前記分岐命令実行部により実行された場合に前記分岐履歴情報に基づいて分岐先アドレスの予測を行う分岐予測部を有する分岐予測装置の制御方法において、
    第1のリターンアドレス演算部が、コール命令が実行された場合に、前記実行されたコール命令のアドレスに所定値を加算して、前記実行されたコール命令に対応するリターン命令の戻り先アドレスである第1の戻り先アドレスを算出するステップと、
    第1のエントリを有する第1の戻り先アドレス記憶部が、前記第1の戻り先アドレスと前記第1の戻り先アドレスが有効であることを示す第1のバリッド情報を、前記第1のエントリに保持するステップと、
    第2のリターンアドレス演算部が、前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記検出されたコール命令のアドレスに所定値を加算して、前記検出されたコール命令に対応するリターン命令の戻り先アドレスである第2の戻り先アドレスを算出するステップと、
    第2のバリッド情報生成部が、前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記第2の戻り先アドレスが有効であることを表す第2のバリッド情報を生成するステップと、
    第2の複数のエントリを有する第2の戻り先アドレス記憶部が、前記第2の戻り先アドレスと前記第2のバリッド情報を、前記第2の複数のエントリのいずれかのエントリに保持し、コール命令が前記分岐命令実行部により実行された場合には、前記第2の複数のエントリのうち、最も古い第2の戻り先アドレスを保持するエントリの内容を消去するステップと、
    ポインタ部が、前記第1の戻り先アドレス記憶部が有する前記第1のエントリと、前記第2の戻り先アドレス記憶部が有する前記第2の複数のエントリのうち、いずれか1つのエントリを指定するポインタ情報を生成・保持するステップと、
    出力選択部が、前記第1のバリッド情報と前記第2のバリッド情報と前記ポインタ情報に基づいて、前記分岐予測部が前記分岐履歴情報に保持するリターン命令に対応する分岐先アドレスと、前記第1の戻り先アドレス記憶部に保持する第1の戻り先アドレスと、前記第2の戻り先アドレス記憶部に保持する第2の戻り先アドレスのうち、いずれか1つのアドレスを選択するステップと
    を有することを特徴とする分岐予測装置の制御方法。
  13. 分岐命令実行部に接続され、第1のプログラムから第2のプログラムを呼び出すコール命令と前記第2のプログラムから前記第1のプログラムに戻るリターン命令を含む分岐命令の分岐先アドレスを含む分岐履歴情報を保持し、前記分岐命令が前記分岐命令実行部により実行された場合に前記分岐履歴情報に基づいて分岐先アドレスの予測を行う分岐予測部を有する分岐予測装置の制御方法において、
    第1のリターンアドレス演算部が、コール命令が実行された場合に、前記実行されたコール命令のアドレスに所定値を加算して、前記実行されたコール命令に対応するリターン命令の戻り先アドレスである第1の戻り先アドレスを算出するステップと、
    第1のエントリを有する第1の戻り先アドレス記憶部が、前記第1の戻り先アドレスと前記第1の戻り先アドレスが有効であることを示す第1のバリッド情報を、前記第1のエントリに保持するステップと、
    第2のリターンアドレス演算部が、前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記検出されたコール命令のアドレスに所定値を加算して、前記検出されたコール命令に対応するリターン命令の戻り先アドレスである第2の戻り先アドレスを算出するステップと、
    第2のバリッド情報生成部が、前記分岐予測部が前記分岐履歴情報からコール命令を検出した場合に、前記第2の戻り先アドレスが有効であることを表す第2のバリッド情報を生成するステップと、
    コール命令完了情報保持部が、前記分岐予測部が前記実行履歴情報から検出したコール命令の実行が完了したか否かを表すコール命令完了情報を保持するステップと、
    コール命令カウンタが、前記コール命令完了情報保持部が保持するコール命令完了情報に対応するコール命令の数を保持するステップと、
    第2の複数のエントリを有する第2の戻り先アドレス記憶部が、前記第2の戻り先アドレスと前記第2のバリッド情報を、前記第2の複数のエントリのいずれかのエントリに保持し、コール命令が前記分岐命令実行部により実行された場合には、前記第2の複数のエントリのうち、最も古い第2の戻り先アドレスを保持するエントリの内容を消去するステップと、
    ポインタ部が、前記第1の戻り先アドレス記憶部が有する前記第1のエントリと、前記第2の戻り先アドレス記憶部が有する前記第2の複数のエントリのうち、いずれか1つのエントリを指定するポインタ情報を生成・保持するステップと、
    出力選択部が、前記第1のバリッド情報と前記第2のバリッド情報と前記ポインタ情報に基づいて、前記分岐予測部が前記分岐履歴情報に保持するリターン命令に対応する分岐先アドレスと、前記第1の戻り先アドレス記憶部に保持する第1の戻り先アドレスと、前記第2の戻り先アドレス記憶部に保持する第2の戻り先アドレスのうち、いずれか1つのアドレスを選択するステップと
    を有することを特徴とする分岐予測装置の制御方法。
JP2004347194A 2004-11-30 2004-11-30 分岐予測装置およびその制御方法 Expired - Fee Related JP4286768B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2004347194A JP4286768B2 (ja) 2004-11-30 2004-11-30 分岐予測装置およびその制御方法
US11/065,712 US7320066B2 (en) 2004-11-30 2005-02-25 Branch predicting apparatus and branch predicting method
EP05251154A EP1662377B1 (en) 2004-11-30 2005-02-28 Branch predicting apparatus and branch predicting method using return address stacks
US12/656,111 USRE42466E1 (en) 2004-11-30 2010-01-15 Branch predicting apparatus and branch predicting method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004347194A JP4286768B2 (ja) 2004-11-30 2004-11-30 分岐予測装置およびその制御方法

Publications (2)

Publication Number Publication Date
JP2006155374A JP2006155374A (ja) 2006-06-15
JP4286768B2 true JP4286768B2 (ja) 2009-07-01

Family

ID=34940517

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004347194A Expired - Fee Related JP4286768B2 (ja) 2004-11-30 2004-11-30 分岐予測装置およびその制御方法

Country Status (3)

Country Link
US (2) US7320066B2 (ja)
EP (1) EP1662377B1 (ja)
JP (1) JP4286768B2 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008090492A (ja) * 2006-09-29 2008-04-17 Fujitsu Ltd キャッシュコントローラ、マイクロプロセッサシステム、記憶装置
JPWO2009004709A1 (ja) * 2007-07-02 2010-08-26 富士通株式会社 間接分岐処理プログラムおよび間接分岐処理方法
US7975132B2 (en) * 2009-03-04 2011-07-05 Via Technologies, Inc. Apparatus and method for fast correct resolution of call and return instructions using multiple call/return stacks in the presence of speculative conditional instruction execution in a pipelined microprocessor
CN101819522B (zh) * 2009-03-04 2012-12-12 威盛电子股份有限公司 微处理器以及相关指令解析的方法
US8996624B2 (en) * 2010-09-15 2015-03-31 At&T Intellectual Property I, L.P. Managing presence in communications systems
JP5494832B2 (ja) 2011-01-07 2014-05-21 富士通株式会社 演算処理装置および分岐予測方法
US9354886B2 (en) * 2011-11-28 2016-05-31 Apple Inc. Maintaining the integrity of an execution return address stack
WO2013101152A1 (en) 2011-12-30 2013-07-04 Intel Corporation Embedded branch prediction unit
US9405544B2 (en) 2013-05-14 2016-08-02 Apple Inc. Next fetch predictor return address stack
US9619230B2 (en) * 2013-06-28 2017-04-11 International Business Machines Corporation Predictive fetching and decoding for selected instructions
US9361144B2 (en) * 2013-06-28 2016-06-07 Globalfoundries Inc. Predictive fetching and decoding for selected return instructions
GB2516999B (en) 2014-01-31 2015-07-22 Imagination Tech Ltd An improved return stack buffer
US9569613B2 (en) * 2014-12-23 2017-02-14 Intel Corporation Techniques for enforcing control flow integrity using binary translation
US10747539B1 (en) 2016-11-14 2020-08-18 Apple Inc. Scan-on-fill next fetch target prediction
US20220405102A1 (en) * 2021-06-21 2022-12-22 Intel Corporation Count to empty for microarchitectural return predictor security

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4459659A (en) 1981-02-04 1984-07-10 Burroughs Corporation Subroutine control circuitry for providing subroutine operations in a data processing system in which tasks are executed on a microprogrammed level
JPH0769814B2 (ja) 1988-04-07 1995-07-31 三菱電機株式会社 パイプライン処理機構を持つデータ処理装置
US5193205A (en) 1988-03-01 1993-03-09 Mitsubishi Denki Kabushiki Kaisha Pipeline processor, with return address stack storing only pre-return processed address for judging validity and correction of unprocessed address
US5604877A (en) 1994-01-04 1997-02-18 Intel Corporation Method and apparatus for resolving return from subroutine instructions in a computer processor
US5964868A (en) 1996-05-15 1999-10-12 Intel Corporation Method and apparatus for implementing a speculative return stack buffer
US7200740B2 (en) 2001-05-04 2007-04-03 Ip-First, Llc Apparatus and method for speculatively performing a return instruction in a microprocessor
JP3798998B2 (ja) 2002-06-28 2006-07-19 富士通株式会社 分岐予測装置および分岐予測方法

Also Published As

Publication number Publication date
USRE42466E1 (en) 2011-06-14
EP1662377B1 (en) 2012-10-10
JP2006155374A (ja) 2006-06-15
EP1662377A1 (en) 2006-05-31
US7320066B2 (en) 2008-01-15
US20060149948A1 (en) 2006-07-06

Similar Documents

Publication Publication Date Title
JP4286768B2 (ja) 分岐予測装置およびその制御方法
EP0084114B1 (en) Instruction prefetching data processing apparatus including a conditional branch instruction predictor
JP4027620B2 (ja) 分岐予測装置、プロセッサ、及び分岐予測方法
JP3542021B2 (ja) セット予測によりセット連想キャッシュの遅延を少なくする方法及び装置
US6647491B2 (en) Hardware/software system for profiling instructions and selecting a trace using branch history information for branch predictions
JP2875909B2 (ja) 並列演算処理装置
TWI295032B (ja)
US20050210224A1 (en) Processor including fallback branch prediction mechanism for far jump and far call instructions
CN112368677B (zh) 基于分支指令的类型选择性地执行提前分支预测
JP2001243069A (ja) 分岐予測装置及び分岐予測方法
JP2008186233A (ja) 命令キャッシュプリフェッチ制御方法及びその装置
CN102349051A (zh) 用于在数字处理器中执行跳转操作的方法和设备
JP3798998B2 (ja) 分岐予測装置および分岐予測方法
WO2001042927A1 (fr) Dispositif d'acces memoire et methode utilisant une table d'historique des traductions d'adresses
JP3628375B2 (ja) 未参照先取りキャッシュを利用した命令語先取り方法およびその回路
JP3890910B2 (ja) 命令の実行結果予測装置
JP2006040173A (ja) 分岐予測装置および分岐予測方法
KR20010050703A (ko) 정보 처리 장치
JP3843048B2 (ja) 分岐予測機構を有する情報処理装置
US20150193348A1 (en) High-performance data cache system and method
JP2001166934A (ja) 命令フェッチ制御装置
JP2943772B2 (ja) 分岐予測方式
US6604193B1 (en) Processor in which register number translation is carried out
CN111459551B (zh) 具高度领先分支预测器的微处理器
JPH06301537A (ja) 命令フェッチ回路

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20070119

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20080527

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080728

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20081028

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20081201

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: 20090317

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20090325

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120403

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Ref document number: 4286768

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120403

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130403

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140403

Year of fee payment: 5

LAPS Cancellation because of no payment of annual fees