(57)【要約】【課題】  ＣＰＵとメモリと先読みバッファを搭載した情報処理装置において、分岐命令およびデータアクセス命令の先読みを効果的に行う。【解決手段】  先読みアドレス生成部は、バッファに格納されたエントリに含まれる命令列から確実に実行される分岐命令およびデータアクセス命令を１サイクルで検出し、制御部にそのターゲットアドレスの先読み要求を出力する。そして、エントリに含まれる命令列の種類をデコードして命令種フラグにセットし、実行している命令のアドレス信号を用いて実行が終わった命令種フラグの出力をマスクして、先読み要求を出す命令の位置を出力する。制御部からの信号により、先読み要求を出した命令に対応する命令種フラグをクリアする。【選択図】  図８
2006202346.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵと、メモリと、予め定められた数の命令およびデータからなる命令列を当該命令列内の命令またはデータを前記ＣＰＵが実行する前に格納する先読みバッファとを備える情報処理装置であって、
前記命令列が前記先読みバッファに格納された時点で、当該命令列内に含まれる所定の分岐命令またはデータアクセス命令を選択し、当該選択した命令のターゲットアドレスを演算する先読みアドレス生成手段と、
前記先読みアドレス生成手段において演算された前記ターゲットアドレスの命令またはデータが含まれる前記命令列が前記先読みバッファに格納されているか否かを判断し、格納されていない場合、当該命令列を前記メモリから読み出し前記先読みバッファに格納する先読みバッファ格納手段とを備えること
を特徴とする情報処理装置。
【請求項２】
請求項１記載の情報処理装置であって、
前記先読みアドレス生成手段は、
前記命令列に含まれる各命令の種類を判別する命令種判別手段と、
前記命令種別判別手段の判別結果に基づいて、前記命令列から前記ターゲットアドレスを演算する所定の分岐命令またはデータアクセス命令を選択するターゲット命令選択手段とを備えること
を特徴とする情報処理装置。
【請求項３】
請求項２記載の情報処理装置であって、
前記ターゲット命令選択手段は、
前記命令種判別手段の判別結果に基づいて、前記命令列の中から、最も先に実行される分岐命令またはデータアクセス命令を選択すること
を特徴とする情報処理装置
【請求項４】
請求項３記載の情報処理装置であって、
前記ターゲット命令選択手段は、
前記ＣＰＵが現在実行している命令を特定する実行命令判別手段を備え、
前記命令列の中の前記実行命令判別手段が特定した命令以降の命令の中から、前記命令種判別手段の判別結果に基づいて、最も先に実行される分岐命令またはデータアクセス命令を選択すること
を特徴とする情報処理装置。
【請求項５】
請求項４項記載の情報処理装置であって、
前記ターゲット命令選択手段は、前記選択した命令が、前記データアクセス命令または前記分岐命令の中の条件付分岐命令である場合、前記命令列内の前記選択した命令以降の分岐命令またはデータアクセス命令の中から最も先に実行される命令を、さらに選択すること
を特徴とする情報処理装置。
【請求項６】
請求項５記載の情報処理装置であって、
前記先読みアドレス生成手段は、
前記選択された最も早く実行される命令に対応する前記命令種判別手段による判別結果をクリアするクリア手段をさらに備え、
前記ターゲット命令選択手段は、
判別結果がクリアされていない命令の中から、前記最も早く実行される命令を選択すること
を特徴とする情報処理装置。
【請求項７】
ＣＰＵとメモリと予め定められた数の命令からなる命令列を当該命令列内の命令またはデータを前記ＣＰＵが実行する前に格納する先読みバッファとを備える情報処理装置において、前記際読みバッファに前記命令列を格納する先読みバッファ格納方法であって、
前記命令列が前記先読みバッファに格納された時点で、当該命令列内に含まれる所定の分岐命令またはデータアクセス命令を選択し、当該選択された命令のターゲットアドレスを演算する先読みアドレス生成ステップと、
前記先読みアドレス生成ステップにおいて演算された前記ターゲットアドレスの命令またはデータが含まれる前記命令列が前記先読みバッファに格納されているか否かを判断し、格納されていない場合、当該命令列を前記メモリから読み出し前記先読みバッファに格納する先読みバッファ格納ステップと
を備えること
を特徴とする先読みバッファ格納方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＰＵとメモリと先読みバッファとを備えた情報処理装置における、分岐命令およびデータアクセス命令の先読み技術に関する。
【背景技術】
【０００２】
近年、ＣＰＵの動作周波数が格段に向上している一方、大容量化に対応するため、メモリの動作周波数の向上はＣＰＵのそれと比較して穏やかである。このようにＣＰＵとメモリとの動作周波数が乖離しているため、システム全体の性能が向上しないという問題が顕著になってきている。
【０００３】
この問題を解決するため、高速に読み出しが可能な先読みバッファあるいはキャッシュに予め必要となる命令を格納し、これらから命令を読み出すことで、メモリ読み出しの遅延を隠蔽し、性能の向上を図ることが一般的に行われている。
【０００４】
ここで、実行されているプログラムに分岐命令がある場合は、分岐先の命令を適切に予測して先読みバッファ等に読み出す先読みを行なう必要がある。
【０００５】
この予測手法として、分岐命令の実行履歴に基づいて分岐先アドレスを予測し、予測した分岐先命令をメモリから先読みバッファに予め読み出しておくものがある。しかし、分岐命令により処理が実際に分岐した場合、命令が実行される際に上記予測が行なわる構成であると、分岐後の命令列の先読みが間に合わないという問題があった。
【０００６】
そこで、特許文献１に開示されているように、命令の先読みの段階で分岐の可能性を予測し、その後の命令列を先読みする手法が考えられている。
【０００７】
【特許文献１】特開平６−２７４３４１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
特許文献１に開示されている技術では、分岐命令の分岐先命令の先読みのみが実行され、データアクセスの多いプログラムでは、性能が向上しないという問題が依然として残る。
【０００９】
近年一般的になっている固定命令長のプロセッサでは、命令長を超えるビット幅を持つデータを扱うために、プロセッサ内のプログラムカウンタ値と命令コードに埋め込まれた定数(即値)を実行時に加算し、その値をアクセス先のアドレスとするＰＣ相対データアクセス命令を持つ。
【００１０】
ただし、分岐命令とは異なり、データアクセス命令の場合、当該命令に伴うデータアクセスが発生した後、引き続き以前の命令列を実行する。
【００１１】
従来の技術では、このような処理への対処は考慮されず、ＰＣ相対データアクセス命令の先読みなどの処理は行なわれていない。このため、データアクセスの多いプログラムでは、性能を高めることが難しい。
【００１２】
本発明の目的は、データアクセスの多いプログラムにおいても、効果的な先読みを行い、プログラムの種類に依存しない高性能な情報処理技術を提供することにある。
【課題を解決するための手段】
【００１３】
上記目的を達成するため、本発明は、ＣＰＵとメモリと先読みバッファとを搭載した情報処理装置において、分岐命令およびデータアクセス命令のターゲットアドレスをその命令の実行前に、出力する先読みアドレス生成部を有し、先読みアドレス生成部が出力するターゲットアドレスの命令またはデータを予めメモリから読み出し先読みバッファに格納することを特徴とする。
【００１４】
具体的には、ＣＰＵと、メモリと、予め定められた数の命令およびデータからなる命令列を当該命令列内の命令またはデータを前記ＣＰＵが実行する前に格納する先読みバッファとを備える情報処理装置であって、前記命令列が前記先読みバッファに格納された時点で、当該命令列内に含まれる所定の分岐命令またはデータアクセス命令を選択し、当該選択した命令のターゲットアドレスを演算する先読みアドレス生成手段と、前記先読みアドレス生成手段において演算された前記ターゲットアドレスの命令またはデータが含まれる前記命令列が前記先読みバッファに格納されているか否かを判断し、格納されていない場合、当該命令列を前記メモリから読み出し前記先読みバッファに格納する先読みバッファ格納手段とを備えることを特徴とする情報処理装置を提供する。
【発明の効果】
【００１５】
データアクセスの多いプログラムにおいても、効果的な先読みを行うことができ、プログラムの種類に依存しない高性能な情報処理技術が提供できる。
【発明を実施するための最良の形態】
【００１６】
図1は本発明のー実施形態の情報処理装置の全体図である。
【００１７】
本情報処理装置は、メモリ（１）、ＣＰＵ（２）、先読みアドレス生成部（４）、先読みバッファ（７）、タグ（６）、リードデータ選択部（５）、制御部（３）から構成される。
【００１８】
メモリ（１）はプログラムを格納し、信号ライン１１でメモリアドレス信号ｍｅｍａｄｒ［１５：４］を、信号ライン１２でメモリリード信号ｍｅｍｒｄを受け取り、信号ライン１３でメモリリードデータ信号ｍｅｍｄａｔａ［１２７：０］を出力する。
【００１９】
ここで、ｍｅｍａｄｒ[１５：０]の表記は、ｍｅｍａｄｒ[１５]、ｍｅｍａｄｒ[１４]、・・・・、ｍｅｍａｄｒ[０]からなる１６ビットの信号を表記上まとめて記述したものである。本明細書において、他の信号に関しても同様である。
【００２０】
なお、本実施形態では、メモリのアクセスレイテンシを２、読み出し幅を１２８ビットとする。
【００２１】
ＣＰＵ（２）は、必要な命令コードをメモリ（１）などから読み出し、プログラムを実行する。図示しないが、メモリ等に格納されたデータに対して必要な数値演算、論理演算を行なうためのＡＬＵ（算術演算ユニット）、プログラムカウンタ、アキュムレータ、汎用レジスタ等を備える演算部と、入力された命令をデコードすることによって前記演算部の動作制御信号を生成する動作制御部とを備える。
【００２２】
ＣＰＵ（２）は、信号ライン１４でＣＰＵ（２）がアクセスする対象である命令コードおよびデータのアドレスを示すＣＰＵアドレス信号ｃｐｕａｄｒ［１５：０］を、信号ライン１６でＣＰＵのアクセス種類を示すＣＰＵコマンド信号ｃｐｕｃｍｄ［１：０］を出力する。ＣＰＵコマンド信号の示すアクセスの種類は後述する。
【００２３】
ＣＰＵ（２）は、さらに、信号ライン１５でＣＰＵ（２）が現在実行している命令のアドレスを示すプログラムカウンタ信号ｐｃ［１５：０］を先読みアドレス生成部（４）の演算用に出力する。先読みアドレス生成部（４）は、ｐｃ[１５：０]と命令コード内の即値を用いて、分岐先のアドレスを得る。
【００２４】
ＣＰＵ（２）には、さらに、ｃｐｕａｄｒ［１５：０］が示すアドレスにある命令又はデータの読み出し値であるＣＰＵリードデータ信号ｃｐｕｄａｔａ［１５：０］が信号ライン１７でリードデータ選択部（５）から入力される。
【００２５】
ＣＰＵ（２）には、さらに、ｃｐｕｄａｔａ［１５：０］が確定していない場合にＣＰＵアクセスを停止するためのＣＰＵウエイト信号ｃｐｕｗａｉtが信号ライン１８で制御部（３）から入力される。
【００２６】
なお、本実施形態では、ＣＰＵ（２）の命令、データ幅、アドレス空間を、それぞれ、１６ビットとする。
【００２７】
先読みアドレス生成部（４）は、先読みバッファ（７）に所定数の命令またはデータからなる命令列が格納されると、格納された命令列の中から分岐命令およびデータアクセス命令を、その命令が実行される前に検出し、それらの命令に従って次にアクセスするターゲットアドレスを演算し、そのターゲットアドレスが含まれる命令列をメモリ（１）から先読みバッファ（７）へ読み出す要求を生成する。
【００２８】
ここで、以後、本明細書中において、分岐命令およびデータアクセス命令を、要先読み命令と呼ぶ。また、要先読み命令に従って、次にアクセスするターゲットアドレスを演算し、そのターゲットアドレスが含まれる命令列をメモリ（１）から先読みバッファ（７）へ読み出す要求を先読み要求と呼ぶ。
【００２９】
先読みアドレス生成部（４）は、信号ライン１９で要先読み命令のターゲットアドレスを示す先読みアドレス信号ｐｆａｄｒ［１５：０］を、信号ライン２０で先読み要求が発生したことを示す信号である先読み要求信号ｐｆｒｅｑ［１：０］を制御部（３）に出力する。
【００３０】
先読みアドレス生成部（４）は、さらに、ＣＰＵ（２）から、ｃｐｕａｄｒ［１５：０］とｐｃ［１５：０］を、リードデータ選択部（５）から信号ライン２１でヒットバッファ出力信号ｈｂｕｆ［１２７：０］を、制御部（３）から、信号ライン２７で信号ｐｆａｃｋ、信号ライン２８でｈｂｕｆ［１２７：０］の入力タイミングを示す先読みアップデート信号ｐｄｕｐｄを受け、ｐｆａｄｒ［１５：０］およびｐｆｒｅｑ［１：０］の演算に用いる。ｐｆａｃｋは、所定の命令列から抽出した要先読み命令に従って先読み要求を処理した後に、さらに同じ命令列内から要先読み命令を抽出して先読み要求を進める必要がある場合に出力される信号である。このｐｆａｃｋとｈｂｕｆの詳細は、後述する。
【００３１】
先読みバッファ（７）は、ＣＰＵ（２）が要先読み命令を実行する前に、当該要先読み命令のターゲットアドレスへのアクセスに備えて、当該要先読み命令のターゲットアドレスの命令またはデータをメモリ（１）から読み出して保持する。
【００３２】
先読みバッファ（７）は、信号ライン３３で先読みバッファが保持している値の更新タイミングを示すバッファアップデート信号ｂｕｆｕｐｄ［４：０］の入力を受け、ｍｅｍｄａｔａ［１２７：０］の信号を取りこむ。
【００３３】
また、先読みバッファ（７）は、信号ライン２４でヒットしたバッファを示す先読みバッファ出力信号ｂｕｆ＜４：０＞［１２７：０］を出力する。ここで、ｂｕｆ＜４：０＞［１２７：０］は、ｂｕｆ４［１２７：０］、ｂｕｆ３［１２７：０］、..、ｂｕｆ０［１２７：０］の５本の信号を表記上まとめて記述したものである。
【００３４】
タグ（６）は、先読みバッファ（７）が保持する命令およびデータのアドレスを保持する。
【００３５】
タグ（６）は、信号ライン３２でタグが保持している値を更新するタイミングを示すタグアップデート信号ｔａｇｕｐｄ［４：０］の入力を受け、ｍｅｍａｄｒ［１５：４］を取りこむ。
【００３６】
また、タグ（６）は、信号ライン２３で先読みバッファが保持する命令およびデータのアドレスを示すタグ出力信号ｔａｇ＜４：０＞［１５：４］を出力する。ここで、ｔａｇ＜４：０＞［１５：４］は、ｔａｇ４［１５：４］、ｔａｇ３［１５：４］、．．、ｔａｇ０［１５：４］の５本の信号を表記上まとめて記述したものである。
【００３７】
リードデータ選択部（５）は、先読みアドレス生成部（４）により先読み要求がなされた命令またはデータが、先読みバッファ（７）に保持されているか判定する。ここで、制御部（３）は、先読みアドレス生成部（４）により先読み要求がなされている場合、このリードデータ選択部（５）の判定に従って、先読みを実行するかどうか判断する。
【００３８】
また、リードデータ選択部（５）は、ＣＰＵ（２）からアクセス要求のある命令またはデータが先読みバッファ（７）に保持されているか判定し、先読みバッファ（７）に保持されていれば、先読みバッファ（７）からＣＰＵに出力する。
【００３９】
リードデータ選択部（５）は、ｔａｇ＜４：０＞［１２７：０］とｐｆａｄｒ[１５：０]の上位１５〜４ビットであるｐｆａｄｒ［１５：４］との比較結果を、信号ライン３０で比較信号ｈｉｔ０［４：０］として、そして、ｔａｇ＜４：０＞［１２７：０］とｃｐｕａｄｒ[１５：０]の上位１５〜４ビットであるｃｐｕａｄｒ［１５：４］との比較結果を、信号ライン３１で比較信号ｈｉｔ１［４：０］として出力する。これは、後述するように、１５〜４ビットがエントリという命令およびデータを読み出す際の単位を指定するものであるためである。
【００４０】
リードデータ選択部（５）は、さらに、ｂｕｆ＜４：０＞［１２７：０］およびｍｅｍｄａｔａ［１２７：０］の中から、先読みアドレス生成部（４）の演算に用いられるヒットバッファ出力信号ｈｂｕｆ［１２７：０］を、信号ライン２１で先読みアドレス生成部（４）に出力する。
【００４１】
リードデータ選択部（５）は、さらに、ｂｕｆ＜４：０＞［１２７：０］およびｍｅｍｄａｔａ［１２７：０］の中から、ｃｐｕａｄｒ［１５：０］でアクセスを要求された命令およびデータを選択し、ｃｐｕｄａｔａ［１５：０］に出力する。
【００４２】
制御部（３）は、ＣＰＵ（２）、メモリ（１）、先読みアドレス生成部（４）、先読みバッファ（７）、タグ（６）、リードデータ選択部（５）と、制御信号を入出力することにより、ＣＰＵ（２）とメモリ（１）との間の命令およびデータ転送に関わる制御を行なう。
【００４３】
具体的には、後述するように、各種の制御信号の入力を受けて、必要な制御信号を所定のタイミングでアサートすることにより、各部の処理を制御する。
【００４４】
次に、各構成の詳細を説明する。詳細の説明に先立ち、本実施形態において想定しているＣＰＵ（７）が実行するプログラムの一例、当該プログラムが、本実施形態においてメモリに格納される場合の配置、および、ＣＰＵ（７）の動作について説明する。
【００４５】
図２に、ＣＰＵ（１）が実行するプログラムの一例を示す。
【００４６】
本プログラムは、アドレス０から順にシーケンシャルに処理を行なう一般の命令と、所定のデータにアクセスすることを指示するデータアクセス命令と、条件が成立した場合に所定のアドレスに処理を移行する条件分岐命令と、無条件に所定のアドレスに処理を移行する無条件分岐命令とを有する。
【００４７】
本図において、一般の命令は「命令」、データアクセス命令は「ＭＯＶ〜」、条件分岐命令は「ＢＴ〜」、無条件分岐命令は「ＢＲＡ〜」と表す。
【００４８】
本図において、アドレス８の“ＭＯＶ  ＠（３２，ＰＣ）, Ｒ１”は、“この命令のアドレスに３２を足したアドレスのデータをＲ１に転送する”という処理を実行させるデータアクセス命令を表し、この命令が実行されるとアドレス４０にあるデータ２０へのアクセスが発生する。同様に、アドレス２２の“ＭＯＶ  ＠（２０，ＰＣ）, Ｒ１”が実行されると、アドレス４２にあるデータ２１へのアクセスが発生する。
【００４９】
アドレス１８の“ＢＴ  −１８”は、“ＣＰＵのレジスタＴ＝１の時、この命令のアドレスに（−１８）を足したアドレスへ分岐する”という処理を実行させる条件分岐命令を表す。この命令が実行され、かつ、その時のＣＰＵのレジスタＴ＝1が成立している場合、アドレス０の命令へとプログラムの流れが移行する。
【００５０】
アドレス２６の“ＢＡＲ  １０２”は、“この命令のアドレスに１０２を足したアドレスへ分岐する”という処理を実行させる無条件分岐命令を表す、この命令が実行されると、無条件にアドレス１２８の命令へとプログラムの流れが移行する。
【００５１】
図３は、ＣＰＵ（２）の動作を示すタイミングチャートである。
【００５２】
図３上段は、ＣＰＵ（２）が実行する命令列の一例と、その命令列を処理する際のＣＰＵ（２）のパイプライン動作とを示したものである。
【００５３】
ＣＰＵ（２）は、命令をメモリ（１）から読み込む命令フェッチ（ＩＦ）ステージ、命令をデコードする命令デコード（ＩＤ）ステージ、命令を実行する実行（ＥＸ）ステージ、メモリ（１）からデータを読み出すメモリアクセス（ＭＡ）ステージ、メモリ（１）への書きこみを行うライトバック（ＷＢ）ステージの５段パイプラインで１つの命令を処理する。
【００５４】
なお、メモリ（１）へのアクセスは、各命令のＩＦステージ、ＭＡステージ、ＷＢステージで発生する。また、ＩＦステージ、ＩＤステージ、ＥＸステージは必ず実行されるが、ＭＡステージ，ＷＢステージは命令によって実行されない場合がある。本図においては、実行されない命令ステージは小文字で示している。
【００５５】
図３下段は、図３上段で示すパイプライン動作に対応して発生するＣＰＵ（２）の各入出力信号波形を示したものである。
【００５６】
本図において、サイクル０は、アドレス０の命令０のＩＦステージである。サイクル０では、ＣＰＵ（２）からｃｐｕａｄｒに０が、またｃｐｕｃｍｄに命令フェッチを示す信号（ＩＦ）が出力され、アドレス０にある命令へのアクセスが発生する。
【００５７】
なお、本実施形態では、ＣＰＵ（２）のアクセス種類を示すＣＰＵコマンド信号ｃｐｕｃｍｄ［１：０］の出力値とアクセス種類との対応は、
２‘ｂ００：アクセス無し（ＮＯＰ）
２‘ｂ０１：命令フェッチ（ＩＦ）
２‘ｂ１０：メモリアクセス（ＭＡ）
と定義されている。
【００５８】
続くサイクル１で、サイクル０のアクセスに対するアドレス０の命令がｃｐｕｄａｔａからＣＰＵ（２）に入力される。
【００５９】
ここで、サイクル４は、アドレス２のデータアクセス命令“ＭＯＶ  ＠（１４，ＰＣ）, Ｒ１”のＭＡステージである。本命令は、アドレス１６（＝１４＋２）に格納されているデータをＲ１に転送するというものであるため、ここでは、ＣＰＵ（２）からｃｐｕａｄｒに１６が、また、ｃｐｕｃｍｄにＭＡが出力され、アドレス１６にあるデータへのアクセスが発生する。
【００６０】
サイクル５は、サイクル４のアクセスに対するデータが、メモリの出力遅延等の要因で確定しない状況を示している。この時、制御部（３）は、ｃｐｕｗａｉｔをアサートし、ＣＰＵ（２）に命令処理の中断を指示する。
【００６１】
続くサイクル６にてデータが確定し、ｃｐｕｗａｉｔのネゲートを受けて、ＣＰＵ（２）は、処理を再開する。
【００６２】
サイクル８は、アドレス８の分岐命令“ＢＲＡ  ５６”のＥＸステージであるとともに、分岐先のアドレス６４にある命令３２のＩＦステージである。本サイクルでは、ＣＰＵ（２）からｃｐｕａｄｒに６４が、またｃｐｕｃｍｄにＩＦが出力され、アドレス６４にある命令へのアクセスが発生する。
【００６３】
次に、図３のプログラムを実行する際の、メモリ（１）の動作を説明する。図４は、図３のプログラム実行時のメモリ（１）の動作を示すタイミングチャートである。
【００６４】
サイクル０にて、制御部（３）が、ｍｅｍａｄｒに０を出力し、ｍｅｍｒｄをアサートすることで、メモリ（１）に対してアドレス０へのリード要求を出す。本実施形態では、メモリのアクセスレイテンシは２サイクルと設定されているため、このアクセスに対するデータは、サイクル２にて確定し、ここで、メモリ（１）は、ｍｅｍｄａｔａに命令またはデータを出力する。
【００６５】
要先読み命令を先読みする構成無しに、このようなアクセスレイテンシ２を持つメモリ（１）に，図２で示すプログラムを格納して実行すると、図１２に示すように、メモリアクセス毎にＣＰＵに対してｃｐｕｗａｉｔを1サイクルアサートすることになり、性能が低下する。
【００６６】
図５は、本実施形態における図２で示したプログラムをメモリ（１）に格納する場合の、命令およびデータの配置を模式的に示したものである。
【００６７】
本図に示すように、プログラムを構成する命令およびデータは、アドレスの小さい順にビットの大きい側から順番に配置され、８の命令（またはデータ）単位で１エントリを構成する。以後、１エントリを構成する命令またはデータの列を命令列と呼ぶ。
【００６８】
なお、本実施形態においては、メモリ（１）へのアクセスは、エントリ単位で行われる。例えば、アドレス０，２，４，６、８、１０、１２、１４に対するアクセスは、エントリ０へのアクセスとして同時に行なわれる。
【００６９】
このようなメモリ（１）に１６ビット幅の命令あるいはデータを格納する場合、アドレスの各ビットは以下を区別する役割を持つ。
ビット１５〜４：エントリ
ビット３〜１：同一エントリ内の命令あるいはデータの位置
ビット０:命令あるいはデータの上位８ビット、下位８ビット
次に、このようなプログラム、ＣＰＵの動作、メモリの命令およびデータの格納状況等を前提に、図１に基づいて説明した、タグ（６）、先読みバッファ（７）、リードデータ選択部（５）、および、先読みアドレス生成部（４）の詳細を以下に説明する。
【００７０】
図６は、タグ（６）および先読みバッファ（７）の詳細図である。本実施形態では、５つのバッファを先読みバッファ（７）として備える構成を例にあげ、説明する。もちろん、バッファ数はこれに限られない。
【００７１】
タグ（６）は、１２ビット幅の記憶素子ｔａｇｉ０、ｔａｇｉ１、．．、ｔａｇｉ４から構成される。
【００７２】
ｔａｇｉ０、ｔａｇｉ１、．．、ｔａｇｉ４は、それぞれ、ｔａｇｕｐｄ［０］、ｔａｇｕｐｄ［１］、．．、ｔａｇｕｐｄ［４］のアサートタイミングでｍｅｍａｄｒ［１５：４］の出力を取りこみ、取りこんだ値をｔａｇ０［１５：４］、ｔａｇ１［１５：４］、．．、ｔａｇ４［１５：４］に出力する。
【００７３】
先読みバッファ（７）は、１２８ビット幅の記憶素子ｂｕｆｉ０、ｂｕｆｉ１、．．、ｂｕｆｉ４から構成される。
【００７４】
ｂｕｆｉ０、ｂｕｆｉ１、．．、ｂｕｆｉ４は、それぞれ、ｂｕｆｕｐｄ［０］、ｂｕｆｕｐｄ［１］、．．、ｂｕｆｕｐｄ［４］のアサートタイミングでｍｅｍｄａｔａ［１２７：０］の出力を取りこみ、取りこんだ値をｂｕｆ０［１２７：０］、ｂｕｆ１［１２７：０］、．．、ｂｕｆ４［１２７：０］に出力する。
【００７５】
ｔａｇｉ０、ｔａｇｉ１、．．、ｔａｇｉ４は、それぞれ、ｂｕｆｉ０、ｂｕｆｉ１、．．、ｂｕｆｉ４に格納された命令列のエントリを記憶する。
【００７６】
図７は、リードデータ選択部（５）の詳細図である。
【００７７】
リードデータ選択部（５）は、比較器０（３０１）、比較器１（３０２）、３ビット記憶素子（３０５）、５ビット記憶素子（３０６）、セレクタ０（３０３）、および、セレクタ１（３０４）から構成される。
【００７８】
比較器０（３０１）はｔａｇ＜４：０＞［１５：４］とｐｆａｄｒ［１５：４］との比較を行い、その結果をｈｉｔ０［４：０］に出力する。
【００７９】
ｈｉｔ０［４：０］の各ビットは以下の論理式で演算される。
ｈｉｔ０［＄ｉ］＝（ｔａｇ＄ｉ［１５：４］＝＝ｐｆａｄｒ［１５：４］）
＄ｉ＝０、１、２、３、４
ｈｉｔ０［４：０］は、リードデータ選択部（５）において、先読みアドレス生成部（４）から先読み要求のあるエントリが、先読みバッファ（７）に保持されているか否かを判定（先読みバッファヒット判定）した結果を示す信号である。以下、保持されている場合をバッファヒット、保持されていない場合をバッファミスヒットと呼ぶ。また、保持されている場合において、バッファｎ（ｎ＝０、１、２、３、４）に保持されているとき、先読みバッファｎヒットと呼ぶ。
【００８０】
ここで、制御部（３）は、入力されたｈｉｔ０［４：０］の結果により、先読みアドレス生成部（４）から受け付けた先読み要求に従って先読みを実行するかどうかを判断する。すなわち、制御部（３）は、バッファヒット時は、先読みを実行せず、バッファミスヒット時は先読みを実行するよう制御する。
【００８１】
例えば、ｈｉｔ０［０］＝１の場合、先読みが要求されているエントリは既にｂｕｆｉ０に保持されていることを意味し（先読みバッファ０ヒット）、あらためて先読みの必要はない。
【００８２】
本実施形態においては、このように先読みの要求があるターゲットアドレスの先読みバッファヒット判定を行なう。すなわち、先読みを実際に行なう前に先読みバッファ（７）に当該アドレスの命令が含まれるエントリが既に格納されているか否か判定する。このような先読み制御により、無駄な先読みを抑止することができる。
【００８３】
比較器１（３０２）はｔａｇ＜４：０＞［１５：４］とｃｐｕａｄｒ［１５：４］との比較を行い、その結果をｈｉｔ１［４：０］に出力する。
【００８４】
ｈｉｔ１［４：０］の各ビットは以下の論理式で演算される。
ｈｉｔ１［＄ｉ］＝（ｔａｇ＄ｉ［１５：４］
＝＝ｃｐｕａｄｒ［１５：４］）
＄ｉ＝０、１、２、３、４
ｈｉｔ１［４：０］は、リードデータ選択部（５）において、ＣＰＵ（２）からアクセス要求がある命令またはデータを含むエントリが、先読みバッファ（７）に保持されているか否かを判定（先読みバッファヒット判定）した結果を示す信号である。バッファヒット、バッファミスヒット、先読みバッファｎヒットの定義は、ｈｉｔ０[４：０]の場合と同様である。
【００８５】
制御部（３）は、入力されたｈｉｔ１［４：０］の結果により、ＣＰＵ（２）からのアクセス要求に対する命令またはデータを、先読みバッファ（７）から読み出すか、メモリ（１）から読み出すかを判断する。すなわち、制御部（３）は、バッファヒット時は、先読みバッファ（７）から読み出し、バッファミスヒット時はメモリ（１）から読み出すよう制御する。
【００８６】
例えば、ｈｉｔ１［０］＝１（先読みバッファ０ヒット）の場合、アクセス要求がある命令またはデータを含むエントリはｂｕｆｉ０に保持されていることを意味する。この場合、制御部（３）は、ｂｕｆｉ０の出力ｂｕｆ０［１２７：０］からアクセス対象である命令またはデータを選択してＣＰＵ（２）に出力する。
【００８７】
このように、本実施形態では、先読みバッファ（７）にアクセス対象が保持されていれば、そこからＣＰＵ（２）に命令またはデータを出力することにより、高速なアクセスを実現している。
【００８８】
以上に述べたようなバッファヒット時における先読みバッファ出力ｂｕｆ＜４：０＞［１２７：０］から命令またはデータを選択する処理は、３ビット記憶素子（３０５）、５ビット記憶素子（３０６）、セレクタ０（３０３）、セレクタ１（３０４）によって行われる。
【００８９】
３ビット記憶素子（３０５）は、ＣＰＵ（２）のクロックと同期して動作するフリップフロップであり、ｃｐｕａｄｒ［３：１］の入力を受け、信号ライン３１０で信号ｃｐｕａｄｒ１［３：１］を出力する。
【００９０】
５ビット記憶素子（３０６）は、ＣＰＵ（２）のクロックと同期して動作するフリップフロップであり、ｈｉｔ１［４：０］の入力を受け、信号ライン３１１で信号ｈｉｔ１１［４：０］を出力する。
【００９１】
リードデータ選択部（５）では、３ビット記憶素子（３０５）および５ビット記憶素子（３０６）を用い、上記のようにｃｐｕａｄｒ［３：１］、ｈｉｔ１［４：０］を一旦フリップフロップで受け、1サイクル後に同じ値をｃｐｕａｄｒ１［３：１］、ｈｉｔ１１［４：０］に出力することで、ｃｐｕａｄｒ１［３：１］、ｈｉｔ１１［４：０］の出力を、ＣＰＵアクセスの1サイクル後であるリードデータ出力タイミングに同期させる。
【００９２】
セレクタ０（３０３）は、ｈｉｔ１１［４：０］をセレクト信号とし、ｂｕｆ０［１２７：０］、ｂｕｆ２［１２７：０］、．．、ｂｕｆ４［１２７：０］、および、ｍｅｍｄａｔａ［１２７：０］から選択した信号をｈｂｕｆ［１２７：０］に出力する。
【００９３】
ここで、ｈｉｔ１１［４：０］の値と選択される信号との関係は、
５‘ｂ００００１：ｂｕｆ０［１２７：０］
５‘ｂ０００１０：ｂｕｆ１［１２７：０］
５‘ｂ００１００：ｂｕｆ２［１２７：０］
５‘ｂ０１０００：ｂｕｆ３［１２７：０］
５‘ｂ１００００：ｂｕｆ４［１２７：０］
上記以外        ：ｍｅｍｄａｔａ［１２７：０］
とする。
【００９４】
これにより、セレクタ０（３０３）において、バッファヒット時は、ヒットしたバッファの出力が、バッファミスヒット時は、ｍｅｍｄａｔａ［１２７：０］が選択される。
【００９５】
セレクタ１（３０４）は、ｈｂｕｆ［１２７：０］が出力するエントリに含まれる命令列の中からｃｐｕａｄｒ１［３：１］が指す命令またはデータの一つを選択し、ｃｐｕｄａｔａ［１５：０］に出力する。
【００９６】
次に、先読みアドレス生成部（４）の詳細を説明する。図８は、先読みアドレス生成部（４）の詳細図である。
【００９７】
先読みアドレス生成部（４）は、入力された命令の種類をデコードする８つの命令種デコーダ、すなわち、命令種デコーダ０（２００）、命令種デコーダ１（２０１）、．．、命令種デコーダ７（２０７）と、８つのＡＮＤゲート、すなわち、ＡＮＤゲート０（２５０）、ＡＮＤゲート１（２５１）、．．、ＡＮＤゲート７（２５７）と、８つの命令種フラグ、すなわち、命令種フラグ０（２３０）、命令種フラグ１（２３１）、．．、命令種フラグ７（２３７）と、ターゲット命令選択部（２８０）と、アドレス演算部（２７０）と、アドレス記憶部（２８０）とを備える。
【００９８】
ｈｂｕｆ［１２７：０］は、１６ビット毎に区切られ、それぞれ、命令種デコーダ０（２００）、命令種デコーダ１（２０１）、．．、命令種デコーダ７（２０７）に入力される。
【００９９】
例えば、命令種デコーダ０（２００）には、ｈｂｕｆ［１２７：０］が出力するエントリの命令列における先頭アドレスの命令またはデータが入力される。命令種デコーダ０（２００）は、入力された命令またはデータの種類をデコードして、その結果を信号ライン（２１０）で信号ｐｄ０［１：０］として出力する。
【０１００】
なお、出力信号ｐｄ０［１：０］の意味は、
２‘ｂ０１: アドレス演算部（２７０）で
ターゲットアドレスが演算可能なデータアクセス命令
２‘ｂ１０: アドレス演算部（２７０）で
ターゲットアドレスが演算可能な条件分岐命令
２‘ｂ１１: アドレス演算部（２７０）で
ターゲットアドレスが演算可能な無条件分岐命令
２‘ｂ００:上記以外の命令またはデータ
と定義されている。
【０１０１】
命令種デコーダ１（２０１）も同様に、ｈｂｕｆ［１２７：０］が出力するエントリの命令列における２番目の命令またはデータの種類をデコードして、結果を信号ライン（２１１）で信号ｐｄ１［１：０］として出力する。
【０１０２】
さらに３番目、４番目、..、６番目の命令またはデータも同様にその種類がデコードされる。そして、命令種デコーダ７（２０７）も同様に、ｈｂｕｆ［１２７：０］が出力するエントリの命令列における８番目の命令またはデータの種類をデコードして、結果を信号ライン（２１７）で信号ｐｄ７［１：０］として出力する。
【０１０３】
ｐｄ０［１：０］、ｐｄ１［１：０］、．．、ｐｄ７［１：０］はそれぞれ命令種フラグ０（２３０）、命令種フラグ１（２３１）、．．、命令種フラグ７（２３７）に、制御部（３）が出力するｐｄｕｐｄ（２３）がアサートされるタイミングで保持される。
【０１０４】
命令種フラグ０（２３０）、命令種フラグ１（２３１）、．．、命令種フラグ７（２３７）に保持された値は、それぞれ、信号ライン２４０で信号ｉｆａ０［１：０］として、信号ライン２４１で信号ｉｆａ１［１：０］として、．．、また、信号ライン２４２で信号ｉｆａ７［１：０］として出力される。
【０１０５】
ターゲット命令選択部（２８０）は、ｉｆａ０［１：０］、ｉｆａ１［１：０］、．．、ｉｆａ７［１：０］、および、ｈｂｕｆ[１２７：０]の入力を受けて、入力された信号が示す命令種に従って、ｈｂｕｆ［１２７：０］が出力するエントリの命令列からターゲットアドレスを演算すべき要先読み命令を選択し、信号ライン２６０で信号ｔｉｎｓｔ［１５：０］として出力する。
【０１０６】
例えば、図５のエントリ０の命令列が入力された場合は、命令４のデータアクセス命令が選択され、エントリ１の命令列が入力された場合は、命令９の分岐命令が選択される。
【０１０７】
ターゲット命令選択部（２８０）は、さらに、入力されたｐｃ［３：１］を用いて、ＣＰＵ（２）が現在実行している命令のアドレスを得、選択する命令を現在実行している命令のアドレス以降のアドレスの命令に限定する。
【０１０８】
ターゲット命令選択部（２８０）は、さらに、ｐｆｒｅｑ［１：０］として、選択した命令の種類を出力する。ここで、出力信号ｐｆｒｅｑ［１：０］の意味は、ｐｄ０［１：０］、ｐｄ１［１：０］、．．、ｐｄ７［１：０］の意味と同じであり、２‘ｂ００以外の値で先読みアドレス生成部（４）から先読み要求があることを示す。
【０１０９】
ここで、制御部（３）は、先読みアドレス生成部（４）から入力されたｐｆｒｅｑの値に従い、ｐｆａｃｋをアサートする。
【０１１０】
制御部（３）におけるｐｆｒｅｑの値とｐｆａｃｋアサートの有無の関係は以下の通りである。
ｐｆｒｅｑ［１：０］＝２‘ｂ０１：ｐｆａｃｋをアサート。
ｐｆｒｅｑ［１：０］＝２‘ｂ１０:ｐｆａｃｋアサートなし。
ｐｆｒｅｑ［１：０］＝２‘ｂ１１:ｐｆａｃｋアサートなし。
【０１１１】
ｐｆｒｅｑ［１：０］＝２‘ｂ０１の場合、その時点で選択されている命令はデータアクセス命令である。従って、エントリ内のデータアクセス命令以降の命令は、必ず実行される。このため、エントリ内のこのデータアクセス命令以降の命令に関しても、要先読み命令の有無を判定し、あれば、先読み要求をする必要がある。
【０１１２】
ｐｆｒｅｑ［１：０］＝２‘ｂ１０の場合、その時点で選択されている命令は条件分岐命令である。従って、エントリ内のこの条件分岐命令以降の命令が実行されるか否かは、この条件分岐命令がＣＰＵ（２）において実行されなければ判断できない。すなわち、この条件分岐命令の次の命令のＩＤステージで分岐しなかったことが確定する。その時点では、ＰＣの値がこの条件分岐命令の次の命令のアドレスとなり、後述するように、ターゲット命令選択部（２８０）において、その条件分岐命令はマスクされ、エントリ内の当該条件分岐命令以降の命令に対し、要先読み芽例の有無が判定される。
【０１１３】
ｐｆｒｅｑ［１：０］＝２‘ｂ１１の場合、その時点で選択されている命令は、無条件分岐命令である。従ってエントリ内のこの無条件分岐命令以降の命令は実行されない。このため、以降の命令に対して命令種を判定したり、先読みの要否の検討を行なう必要はない。
【０１１４】
ターゲット命令選択部（２８０）は、さらに信号ライン２６１で選択した命令のエントリ内の位置を示す信号ｐａｄｅｃ［７：０］を出力する。
【０１１５】
ここで、ｐａｄｅｃ［７：０］の意味は、
８‘ｂ０００００００１：先頭の命令を選択
８‘ｂ００００００１０：２番目の命令を選択
・・・・
８‘ｂ１０００００００：８番目の命令を選択
と定義されている。
【０１１６】
ｐａｄｅｃ［７：０］の各ビットとｐｆａｃｋとの論理積をＡＮＤゲート０（２５０）、ＡＮＤゲート１（２５１）、．．、ＡＮＤゲート７（２５７）を用いて生成し、信号ライン２２０で命令種フラグ０のクリア信号ｃｌｒ０を、信号ライン２２１で命令種フラグ１のクリア信号ｃｌｒ１を、．．、信号ライン２２７で命令種フラグ７のクリア信号ｃｌｒ７を出力する。
【０１１７】
このように、アサートされたｐｆａｃｋを用いて、現在選択している命令の命令種フラグをクリアし、以降のタイミングでその命令が選択されないようにすることができる。すなわち、同じエントリ内で現在選択している命令以降の命令から、その後の要先読み命令を選択できる。
【０１１８】
アドレス記憶部（２９０）は、先読みアドレス生成部（４）が現在、演算の対象としている命令列を含むエントリ値を保持する。具体的には、アドレス記憶部（２９０）は、ｐｄｕｐｄのアサートタイミングでｃｐｕａｄｒ［１５：４］の出力値を保持し、信号ライン（２６３）でその保持している値をアドレス信号ａｄｒ［１５：４］に出力する。
【０１１９】
アドレス演算部（２７０）は、先読みアドレス生成部（４）が、現在、演算の対象としている命令列に含まれる要先読み命令のターゲットアドレスを演算して出力する。具体的には、アドレス演算部（２７０）は、入力されたｐａｄｅｃ［７：０］と、ｔｉｎｓｔ［１５：０］と、ａｄｒ［１５：４］とから、先読みターゲットアドレス信号ｐｆａｄｒ［１５：４］を演算し出力する。ｐｆａｄｒ［１５：４］は、ｔｉｎｓｔ［１５：０］で出力されている要先読み命令のターゲットアドレスが含まれるエントリを示す。
【０１２０】
次に、ターゲット命令選択部（２８０）の構成の詳細を説明し、先読みが必要な要先読み命令の選択方法を示す。図９はターゲット命令選択部（２８０）の詳細図である。
【０１２１】
本図に示すように、ｐｃ［３：１］はデコーダ（５６２）により
３‘ｂ０００−＞８’ｂ１１１１１１１１
３‘ｂ００１−＞８’ｂ１１１１１１１０
３‘ｂ０１０−＞８’ｂ１１１１１１００
３‘ｂ０１１−＞８’ｂ１１１１１０００
３‘ｂ１００−＞８’ｂ１１１１００００
３‘ｂ１０１−＞８’ｂ１１１０００００
３‘ｂ１１０−＞８’ｂ１１００００００
３‘ｂ１１１−＞８’ｂ１０００００００
と、８ビットにデコードされ、信号ライン５７０で選択マスク信号ｍａｓｋ［７：０］として出力される。
【０１２２】
そして、ｉａｆ０［１：０］の各ビットの論理和をｍａｓｋ［０］でマスクした結果は、複合ゲート０（５００）を介して信号ｓ［０］として出力される。ｉａｆ１［１：０］、．．、ｉａｆ７［１：０］についても、ｉａｆ０［１：０］と同様に各ビットの論理和を、それぞれ、ｍａｓｋ［１］、．．、ｍａｓｋ［７］でマスクした結果が複合ゲート１（５０１）、．．、複合ゲート７（５０１）を介して信号ｓ［１］、．．、信号ｓ［７］としてそれぞれ出力される。
【０１２３】
出力された信号ｓ［７：０］は優先順位判定回路（５６３）に入力され、予め定められた以下の対応関係に従い、ｐａｄｅｃ［７：０］として出力される。
【０１２４】
ここで、優先順位判定回路（５６３）の入力と出力の対応関係は以下のとおりである。
８‘ｂ？？？？？？？１−＞８‘ｂ０００００００１
８‘ｂ？？？？？？１０−＞８‘ｂ００００００１０
８‘ｂ？？？？？１００−＞８‘ｂ０００００１００
８‘ｂ？？？？１０００−＞８‘ｂ００００１０００
８‘ｂ？？？１００００−＞８‘ｂ０００１００００
８‘ｂ？？１０００００−＞８‘ｂ００１０００００
８‘ｂ？１００００００−＞８‘ｂ０１００００００
８‘ｂ１０００００００−＞８‘ｂ１０００００００
上記以外              ―＞８‘ｂ００００００００
なお“？”は“ｄｏｎ‘ｔ  ｃａｒｅ”を意味する。すなわち、１、０どちらであってもよいという意味である。
【０１２５】
この優先順位判定回路５６３により、エントリ内の1番最初に実行される要先読み命令がｐａｄｅｃ[０]として出力される。また、本構成により、ｐｃ[３：１]によって示される現在ＣＰＵ（２）において実行されている命令以前の命令は、ｍａｓｋ[０]・・・ｍａｓｋ[７]により信号ｓの出力が０となるため、この優先順位判定回路５６３において選択されない。
【０１２６】
優先順位判定回路５６３から出力されたｐａｄｅｃ［０］は、ｈｂｕｆ［１２７：１１２］をＡＮＤゲート００（５４０）においてマスクするために用いられ、その結果は、信号ライン５５０でｔｉｎｓｔ０［１５：０］に出力される。
【０１２７】
ｈｂｕｆ［１１１：９６］、．．、ｈｂｕｆ［１５：０］、についても、ｈｂｕｆ［１２７：１１２］と同様に、ｐａｄｅｃ［１］、．．、ｐａｄｅｃ［７］でマスクした結果を、ＡＮＤゲート０１（５４１）、．．、ＡＮＤゲート０７（５４７）により、それぞれ、ｔｉｎｓｔ１［１５：０］、．．、ｔｉｎｓｔ７［１５：０］に出力する。
【０１２８】
ｉａｆ０［１：０］をｐａｄｅｃ［０］でマスクした結果をＡＮＤゲート１０（５１０）により信号ライン５２０でｐｆｒｅｑ０［１：０］に出力する。
【０１２９】
ｉａｆ１［１：０］、．．、ｉａｆ７［１：０］、についても、ｉａｆ０［１：０］と同様に、ｐａｄｅｃ［１］、．．、ｐａｄｅｃ［７］でマスクした結果を、ＡＮＤゲート１１（５１１）、．．、ＡＮＤゲート１７（５１２）により、それぞれ、ｐｆｒｅｑ１［１：０］、．．、ｐｆｒｅｑ７［１：０］に出力する。
【０１３０】
ｔｉｎｓｔ０［１５：０］、．．、ｔｉｎｓｔ７［１５：０］は、ＯＲゲート０（５６０）により論理和が演算され、結果がｔｉｎｓｔ［１５：０］に出力される。そして、ｐｆｒｅｑ０［１：０］、．．、ｐｆｒｅｑ７［１：０］は、ＯＲゲート１（５６１）により論理和が演算され、結果がｐｆｒｅｑ［１：０］に出力される。
【０１３１】
以上、図９を用いて説明した回路によりｔｉｎｓｔ［１５：０］には、ｈｂｕｆ［１２７：０］が出力するエントリの命令列の中で、ＣＰＵが現在実行している命令以降のアドレスに格納され、かつ、最初に実行される要先読み命令が出力される。また、ｐｆｒｅｑ［１：０］には、ｔｉｎｓｔ［１５：０］に出力された命令の種類が出力される。
【０１３２】
以上の構成により、先読みアドレス生成部（４）は、バッファに格納されたエントリに含まれる命令列から確実に実行される分岐命令およびデータアクセス命令を１サイクルで検出し、制御部（３）に対してそのターゲットアドレスの先読み要求を出力することができる。
【０１３３】
具体的には、先読みアドレス生成部（４）はエントリに含まれる命令列の種類をデコードしそれぞれ命令種フラグ０（２３０）、．．、命令種フラグ７（２３２）にセットする。実行している命令のアドレス信号を用いて既に実行が終わった命令種フラグの出力をマスクする。優先順位判定回路（５６３）はマスクされた命令種フラグの出力からターゲットアドレスの先読み要求を出す命令の位置を出力する。そして、制御部（３）からのｐｆａｃｋ信号により、ターゲットアドレスへの先読み要求を出した命令に対応する命令種フラグをクリアする。
【０１３４】
ここで、ターゲット命令選択部（２８０）で選択される命令は、命令種をデコードしているエントリのうち、現在実行している命令のアドレス以降の命令で、最初に実行される要先読み命令である。そして、選択された要先読み命令がデータアクセス命令の場合は、さらに当該命令以降の命令においても要先読み命令の有無を判定し、要先読み命令があれば、同様の手順で選択する。選択された要先読み命令が条件付分岐命令の場合は、当該選択された命令が実行され、分岐が行なわれず以降の命令が実行されることになった場合、当該以降の命令において同様に要先読み命令の有無を判定し、要先読み命令があれば、選択する。選択された要先読み命令が無条件分岐命令の場合、以降の命令に対しては、何も行なわない。
【０１３５】
なお、最も先の分岐命令だけを解釈しそのターゲットアドレスが含まれるエントリのみを知る構成の場合、選択された命令がデータアクセス命令または条件付分岐命令の場合であっても、次の分岐またはデータアクセス命令まで解釈できない。
【０１３６】
また、本実施形態においては、ｐｆｒｅｑによって当該命令がデータアクセス命令と指定された場合、制御部（３）は、ｐｆａｃｋを出力し、先読みアドレス生成部（４）内の命令種フラグ（２３０）〜（２３７）に保存されている結果を消去し、そのエントリ内の以降の命令のみを対象として要先読み命令の処理を行なうことができる。
【０１３７】
本構成により、本実施形態の先読みアドレス生成部（４）は、同じエントリ内の要先読み命令による先読みアドレスを、必要十分なだけ効率的に生成することができる。
【０１３８】
次に、ターゲット命令選択部（２８０）によって選択された要先読み命令のターゲットアドレスが含まれるエントリを抽出する演算について、以下に説明する。図１０はアドレス演算部（２７０）の詳細図である。
【０１３９】
アドレス加算値解読部（６０１）は、ｔｉｎｓｔ［１５：０］に出力された要先読み命令より、その命令自身のアドレスとターゲットアドレスとの相対値を示す即値を切りだし、信号ライン６１０で相対アドレス信号ｒｅｌａｄｒ［７：０］に出力する。なお、本実施形態で説明するＣＰＵの要先読み命令の即値は8ビットとする。
【０１４０】
エンコーダ（６０２）は、ｐａｄｅｃ［７：０］を３ビットにエンコードし、信号ライン６１１にベースアドレス信号ｂａｓｅａｄｒ［３：１］を出力する。
【０１４１】
ここで、エンコーダ（６０２）の入力と出力の関係は以下のとおりである。
８‘ｂ０００００００１−＞３’ｂ０００
８‘ｂ００００００１０−＞３’ｂ００１
８‘ｂ０００００１００−＞３’ｂ０１０
８‘ｂ００００１０００−＞３’ｂ０１１
８‘ｂ０００１００００−＞３’ｂ１００
８‘ｂ００１０００００−＞３’ｂ１０１
８‘ｂ０１００００００−＞３’ｂ１１０
８‘ｂ１０００００００−＞３’ｂ１１１
上記以外−＞３‘ｂ０００
加算器（６０３）は、
ｒｅｌａｄｒ［７：０］＋ｂａｓｅａｄｒ［３：１］
＋｛ａｄｒ［１５：４］、４‘ｂ００００｝
の演算を行い、演算結果の１５〜４ビットをｐｆａｄｒ［１５：４］に出力する。
【０１４２】
なお、ｐｆａｄｒ［１５：４］と、ターゲット命令選択部（２８０）から出力されるｐｆｒｅｑ［１：０］とを受け取った制御部（３）は、その組み合わせに応じて以下の制御を行なう。
ｐｆｒｅｑ［１：０］＝２‘ｂ０１:エントリｐｆａｄｒ［１５：４］へのデータアクセスに備えた先読み要求を行なう。
ｐｆｒｅｑ［１：０］＝２‘ｂ１０:エントリｐｆａｄｒ［１５：４］の条件分岐に備えた先読み要求を行なう。
ｐｆｒｅｑ［１：０］＝２‘ｂ１１:エントリｐｆａｄｒ［１５：４］への無条件分岐に備えた先読み要求を行なう。
ｐｆｒｅｑ［１：０］＝２‘ｂ００:先読み要求なし。
【０１４３】
次に、本実施形態の情報処理装置の動作を説明する。
【０１４４】
図１１は以上説明した本発明の実施形態における情報処理装置の動作を示すタイミングチャートである。ここで、本タイミングチャートは、図２に示すプログラムを、図５の通りにメモリに格納して実行した例である。
【０１４５】
まずサイクル０において、ＣＰＵ（２）は、アドレス０の命令０のフェッチを行う。この時点では先読みバッファ（７）には何も格納されていないので、リードデータ選択部（５）からのヒット信号ｈｉｔ１［４：０］はバッファミスを示す。
【０１４６】
次にサイクル１において、バッファミスを示す信号を受けた制御部（３）は、ｍｅｍａｄｒに“０”を出力するとともに、ｍｅｍｒｄをアサートし、メモリ（１）に対してエントリ０へのアクセスを開始する。同時に、ｃｐｕｗａｉｔをアサートし、データが確定するまでＣＰＵ（２）のメモリ（１）へのアクセスを停止する要求を出す。
【０１４７】
次にサイクル２において、制御部（３）は、エントリ０の格納場所を先読みバッファ（７）のｂｕｆｉ０とし、対応するタグ（６）のｔａｇｉ０にエントリ０を示す“０”を格納するため、引き続きｍｅｍａｄｒに“０”を出力し、ｔａｇｕｐｄにｔａｇｉ０を更新する信号を出力する。
【０１４８】
次にサイクル３において、メモリ（１）はｍｅｍｄａｔａにエントリ０の命令とデータとを含む１２８ビット幅の命令列を出力する。リードデータ選択部（５）は、ｈｂｕｆにｍｅｍｄａｔａを選択し、エントリ０の命令列を出力する。さらに、リードデータ選択部（５）は、ｈｂｕｆからアドレス０の命令０を選択し、ｃｐｕｄａｔａに出力する。
【０１４９】
制御部（３）は、ｃｐｕｄａｔａが確定したので、ｃｐｕｗａｉｔをネゲートし、ＣＰＵ（２）にメモリ（１）へのアクセスの再開許可を伝達する。
【０１５０】
さらに、制御部（３）は、ｍｅｍｄａｔａに出力されたエントリ０の命令列をｂｕｆｉ０に格納するため、ｂｕｆｕｐｄにｂｕｆｉ０を更新する信号を出力する。
【０１５１】
サイクル１−３にて説明したｔａｇｉ０、ｂｕｆｉ０への制御の通り、先読みバッファ（７）の更新はメモリ（１）へのアクセスと一体となって行われ、メモリ（１）へのアクセス、タグ（６）の更新、先読みバッファ（７）の更新の順に一連の動作が実行される。以降説明する先読みバッファ（７）の操作も同様の手順で行われる。
【０１５２】
さらに、制御部（３）は、将来エントリ１がアクセスされることに備え、ｍｅｍａｄｒに“１”を出力し、またｍｅｍｒｄをアサートし、メモリ（１）に対しエントリ１へのアクセスを開始する。
【０１５３】
リードデータ選択部（５）は、エントリ０へのアクセスは次サイクルにおいてｂｕｆｉ０から出力することが可能であるので、ヒット信号ｈｉｔ１にバッファ０ヒットを出力する。
【０１５４】
さらに、リードデータ選択部（５）は、ｍｅｍｄａｔａからアドレス０の命令０を選択し、ｃｐｕｄａｔａに出力する。
【０１５５】
ＣＰＵ（２）は、アドレス０の命令０をｃｐｕｄａｔａから取りこむと同時に、アドレス２の命令１のフェッチを行う。
【０１５６】
次にサイクル４において、リードデータ選択部（５）は、ｈｂｕｆにｂｕｆ０を選択し、ｂｕｆｉ０に格納されているエントリ０の命令列を出力する。さらに、リードデータ選択部（５）は、ｈｂｕｆからアドレス２の命令１を選択し、ｃｐｕｄａｔａに出力する。
【０１５７】
ＣＰＵ（２）は、アドレス２の命令１をｃｐｕｄａｔａから取りこむと同時に、アドレス２の命令１のフェッチを行う。
【０１５８】
以降、サイクル１０まで続くエントリ０にある命令の命令フェッチは、以上述べた命令１のフェッチと同様、ｂｕｆｉ０を介してアクセスする。すなわち、必要な命令は、メモリ（１）からではなく、高速な先読みバッファ（７）から取得する。これにより、メモリ（１）のアクセスレイテンシによるアクセスの中断がなく、処理が高速に実行される。またこの間は、命令フェッチによるメモリ（１）へのアクセスが発生しないため、制御部（３）は、将来のアクセスに備えて、命令列の先読みを行うことができる。
【０１５９】
ここで、制御部（３）は、バッファ０にあるエントリ０の要先読み命令の実行前にその命令のターゲットアドレスの演算を行うことを先読みアドレス生成部(４)に指示するため、ｐｄｕｐｄをアサートする。
【０１６０】
次にサイクル５において、先読みアドレス生成部(４)は、図８にて説明した回路によりアドレス８の命令“ＭＯＶ  ＠（３２，ＰＣ）、Ｒ１”を検出し、ターゲットアドレスの先読みを要求する命令の種類がデータアクセスであることを示す“１”、およびターゲットアドレスが含まれるエントリを示す“５”を、ｐｆｒｅｑ、ｐｆａｄｒにそれぞれ出力する。
【０１６１】
この時点で、先読みバッファ（７）にエントリ５は格納されていないので、リードデータ選択部（５）からのヒット信号ｈｉｔ０［４：０］は、バッファミスを示す。バッファミスを示す信号を受けた制御部（３）は、メモリ（１）に対しエントリ５へのアクセスを開始し、続くサイクル６、７において、ｂｕｆｉ２にエントリ５の命令列を格納するため、ｔａｇｕｐｄおよびｂｕｆｕｐｄにｔａｇｉ２、ｂｕｆｉ２を更新する信号を出力する。
【０１６２】
ここで、同サイクルでターゲットアドレスの先読みを要求する命令として選択されたアドレス８の命令は、データアクセス命令である。このため、制御部（３）は、エントリ０のアドレス８以降の要先読み命令のターゲットアドレスの先読み要求を先読みアドレス生成部(４)に指示するため、ｐｆａｃｋをアサートする。
【０１６３】
次にサイクル６において、先読みアドレス生成部(４)は、前サイクルのｐｆａｃｋのアサートを受けて、アドレス８の命令の種類を格納していた命令種フラグ４をクリアする。その結果、命令種フラグ０〜７の格納値は全て０となり、先読みアドレス生成部（４）は、ｐｆａｄｒ、ｐｆｒｅｑにそれぞれ０を出力する。
【０１６４】
この結果、制御部（３）は、エントリ０のアドレス８以降には、要先読み命令はないことがわかる。
【０１６５】
次にサイクル９において、ＣＰＵ（２）は、アドレス８の命令“ＭＯＶ  ＠（３２，ＰＣ）、Ｒ１”に伴うメモリアクセス（ＭＡ）をｃｐｕｍｄに出力する。このメモリアクセスに備えて、サイクル５においてエントリ５をｂｕｆｉ２に先読みしてあるため、ＣＰＵ（２）は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル１０にてターゲットアドレスのアドレス４０のデータ２０にアクセスできる。
【０１６６】
次にサイクル１１において、ＣＰＵ（２）はアドレス１６の命令８のフェッチを行う。この命令フェッチに備えてサイクル２においてエントリ１をｂｕｆｉ１に先読みしてあるため、ＣＰＵ（２）は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル１２にてターゲットアドレスのアドレス１６の命令８にアクセスできる。
【０１６７】
以降、サイクル１６まで続くエントリ１にある命令の命令フェッチは、以上述べた命令８のフェッチと同様に、先読みバッファ（７）内のｂｕｆｉ１にアクセスすることにより、メモリ（１）のアクセスレイテンシによるアクセスの中断なしに、高速に実行することができる。またこの間、命令フェッチによるメモリ（１）へのアクセスが発生しないため、制御部（３）は、将来のアクセスに備えて先読みを行うことができる。
【０１６８】
次にサイクル１２において、制御部（３）は、バッファ１にあるエントリ１の要先読み命令の実行前にその命令のターゲットアドレスの演算を行うよう先読みアドレス生成部(４)に指示するため、ｐｄｕｐｄをアサートする。
【０１６９】
次にサイクル１３において、先読みアドレス生成部(４)は、図８にて説明した回路によりアドレス１８の命令“ＢＴ  −１８”を検出し、先読みを要求する命令が条件分岐命令であることを示す“２”、および、ターゲットアドレスのエントリ“０”をｐｆｒｅｑ、ｐｆａｄｒにそれぞれ出力する。このとき、先読みバッファｂｕｆｉ０にエントリ０が格納されているので、エントリ０の先読み要求に対しリードデータ選択部（５）からのヒット信号ｈｉｔ０［４：０］は、バッファ０ヒットを示すものとなる。
【０１７０】
バッファ０ヒットを示す信号を受け、制御部（３）は、このアドレス１８の命令“ＢＴ  −１８”のターゲットアドレスの先読みを実行しない。
【０１７１】
本実施形態では、制御部（３）は、前述のアルゴリズムに従い、先読み要求を受けたアドレス１８の命令より以降の要先読み命令のターゲットアドレス先読み要求を先読みアドレス生成部(４)に指示するためのｐｆａｃｋのアサートを行わない。
【０１７２】
次にサイクル１４において、ＣＰＵ（２）は、ｐｃに“２０”を出力する。これを受け、先読みアドレス生成部(４)は、図８および図９にて説明した回路によりアドレス１８の命令“ＢＴ  −１８”に対応した命令種フラグの出力をマスクする。そして、次のデータアクセス命令であるアドレス２２の命令“ＭＯＶ  ＠（２０，ＰＣ）、Ｒ１”を検出し、先読み要求する命令がデータアクセス命令であることを示す“１”、およびターゲットアドレスのエントリ“５”をｐｆｒｅｑ、ｐｆａｄｒにそれぞれ出力する。
【０１７３】
ここで、先読みバッファｂｕｆｉ２にエントリ５は既に格納されているので、リードデータ選択部（５）からのヒット信号ｈｉｔ０［４：０］は、バッファ２ヒットを示すものが出力される。
【０１７４】
バッファ２ヒットを示す信号を受け、制御部（３）は、この命令“ＭＯＶ  ＠（２０，ＰＣ）、Ｒ１”のターゲットアドレスの先読みを実行しない。
【０１７５】
さらに、制御部（３）は、同サイクルで先読みを要求するアドレス２２の命令がデータアクセス命令であるため、それ以降の要先読み命令のターゲットアドレスの先読み要求を先読みアドレス生成部(４)に指示するため、ｐｆａｃｋをアサートする。
【０１７６】
次にサイクル１５において、先読みアドレス生成部(４)は、図８にて説明した回路によりアドレス２６の命令“ＢＲＡ  １０２”を検出し、先読み要求する命令が無条件分岐命令であることを示す“３”、およびターゲットアドレスのエントリ“８”を、ｐｆｒｅｑ、ｐｆａｄｒにそれぞれ出力する。
【０１７７】
この時点で、先読みバッファにエントリ８は格納されていないので、リードデータ選択部（５）からのヒット信号ｈｉｔ０［４：０］は、バッファミスを示すものが出力される。
【０１７８】
バッファミスを示す信号を受けた制御部（３）は、メモリ（１）に対しエントリ８へのアクセスを開始し、続くサイクル１６、１７にてｂｕｆｉ４にエントリ８の命令列を格納するため、ｔａｇｉ４、ｂｕｆｉ４を更新する信号を出力する。
【０１７９】
次にサイクル１７にて、ＣＰＵ（２）は、アドレス２２の命令“ＭＯＶ  ＠（２０，ＰＣ）、Ｒ１”に伴うメモリアクセスを出力する。このメモリアクセスに備えてサイクル５においてエントリ５をｂｕｆｉ２に先読みしてあるため、メモリアクセスのレイテンシによるアクセスの中断なしに、ＣＰＵ（２）は、次のサイクル１８においてターゲットアドレスのデータ（アドレス４２のデータ２１）にアクセスできる。
【０１８０】
次にサイクル１８において、ＣＰＵ（２）は、アドレス２６の命令“ＢＲＡ  １０２”に伴い、プログラムの流れをアドレス１２８に無条件に移行し、アドレス１２８の命令６４のフェッチを行う。
【０１８１】
この命令フェッチに備えてサイクル１５においてエントリ８をｂｕｆｉ４に先読みしてあるため、ＣＰＵ（２）は、メモリアクセスのレイテンシによるアクセスの中断なしに、次のサイクル１９にてターゲットアドレスのデータ（アドレス１２８の命令６４）にアクセスできる。
【０１８２】
以上述べたように、本実施形態の情報処理装置では、プログラム実行サイクルが２０となり、図１２に示す本発明を使用しない場合の実行サイクル３６と比較して、サイクル数において性能が８０％向上している。
【０１８３】
本実施形態によれば、１サイクルで先読みバッファ（７）に格納されたエントリに含まれる命令列から分岐命令およびデータアクセス命令を検出し、そのターゲットアドレスの先読みを行なうことができる。このため、先読みがターゲットアドレスへのアクセスに間に合わずバッファミスが発生し、性能が落ちることが少なくなる。
【０１８４】
本実施形態によれば、ターゲットアドレスの先読みを行う命令の種類により、その命令より以降の分岐命令およびデータアクセス命令のターゲットアドレスの先読みを行うかどうかを制御している。また、現在実行している命令のアドレスを示す信号を用いて、既に実行が終わった分岐命令およびデータアクセス命令のターゲットアドレスの先読みを抑止し、今後実行される分岐命令およびデータアクセス命令に限定してターゲットアドレスの先読みを実施する。
【０１８５】
このため、確実に実行される分岐命令およびデータアクセス命令に実行されるに限定して、しかも、適切な順序でターゲットアドレスの先読みを実施することができる。これにより、無駄な先読みのメモリアクセスにより必要なメモリアクセスが妨害されて性能が落ちることが少なくなる。
【０１８６】
なお、本実施形態に記載した各種の回路構成は、本実施形態を説明するための一例に過ぎない。上記記載の入出力が可能ならば、本実施形態の回路構成に限られない。
【０１８７】
以上より、本実施形態によれば、分岐命令およびデータアクセス命令の先読みを効果的に行い、高性能な情報処理装置を提供することが出来る。
【図面の簡単な説明】
【０１８８】
【図１】図１は、本実施形態の情報処理装置の全体図である。
【図２】図２は、本実施形態のＣＰＵが実行するプログラムの一例を説明するための図である。
【図３】図３は、本実施形態のＣＰＵの動作を示すタイミングチャートである。
【図４】図４は、本実施形態のメモリの動作を示すタイミングチャートである。
【図５】図５は、図２で示したプログラムをメモリに格納する場合の、命令およびデータの配置を説明するための図である。
【図６】図６は、本実施形態のタグおよび先読みバッファの詳細図である。
【図７】図７は、本実施形態のリードデータ選択部の詳細図である。
【図８】図８は、本実施形態の先読みアドレス生成部の詳細図である。
【図９】図９は、本実施形態のターゲット命令選択部の詳細図である。
【図１０】図１０は、本実施形態のアドレス演算部の詳細図である。
【図１１】図１１は、本実施形態の情報処理装置の動作を示すタイミングチャートである。
【図１２】図１２は、従来の情報処理装置の動作を示すタイミングチャートである。
【符号の説明】
【０１８９】
１…メモリ、２…ＣＰＵ、３…制御部、４…先読みアドレス生成部、５…リードデータ選択部、６…タグ、７…先読みバッファ、２００〜２０７…命令種デコーダ、２３０〜２３７…命令種フラグ、２７０…アドレス演算部、２８０…ターゲット命令選択部、２９０…アドレス記憶部
【図１】
2006202346.tif 000003
【図２】
2006202346.tif 000004
【図３】
2006202346.tif 000005
【図４】
2006202346.tif 000006
【図５】
2006202346.tif 000007
【図６】
2006202346.tif 000008
【図７】
2006202346.tif 000009
【図８】
2006202346.tif 000010
【図９】
2006202346.tif 000011
【図１０】
2006202346.tif 000012
【図１１】
2006202346.tif 000013
【図１２】
2006202346.tif 000014
【手続補正書】
【提出日】平成18年5月11日(2006.5.11)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ＣＰＵと、メモリと、予め定められた数の命令およびデータからなる命令列を当該命令列内の命令またはデータを前記ＣＰＵが実行する前に格納する先読みバッファとを備える情報処理装置であって、
前記命令列が前記先読みバッファに格納された時点で、当該命令列内に含まれる所定の分岐命令またはデータアクセス命令を選択し、当該選択した命令のターゲットアドレスを演算する先読みアドレス生成手段と、
前記先読みアドレス生成手段において演算された前記ターゲットアドレスの命令またはデータが含まれる前記命令列が前記先読みバッファに格納されているか否かを判断し、格納されていない場合、当該命令列を前記メモリから読み出し前記先読みバッファに格納する先読みバッファ格納手段とを備え、
前記先読みアドレス生成手段は、
前記命令列に含まれる各命令の種類を並行して判別する命令種判別手段と、
前記命令種別判別手段の判別結果に基づいて、前記命令列から前記ターゲットアドレスを演算する所定の分岐命令またはデータアクセス命令を選択するターゲット命令選択手段とを備えること
を特徴とする情報処理装置。
【請求項２】
請求項１記載の情報処理装置であって、
前記ターゲット命令選択手段は、
前記命令種判別手段の判別結果に基づいて、前記命令列の中から、最も先に実行される分岐命令またはデータアクセス命令を選択すること
を特徴とする情報処理装置
【請求項３】
ＣＰＵと、メモリと、予め定められた数の命令およびデータからなる命令列を当該命令列内の命令またはデータを前記ＣＰＵが実行する前に格納する先読みバッファとを備える情報処理装置において、前記先読みバッファに前記命令列を格納する先読みバッファ格納方法であって、
前記命令列が前記先読みバッファに格納された時点で、当該命令列内に含まれる所定の分岐命令またはデータアクセス命令を選択し、当該選択された命令のターゲットアドレスを演算する先読みアドレス生成ステップと、
前記先読みアドレス生成ステップにおいて演算された前記ターゲットアドレスの命令またはデータが含まれる前記命令列が前記先読みバッファに格納されているか否かを判断し、格納されていない場合、当該命令列を前記メモリから読み出し前記先読みバッファに格納する先読みバッファ格納ステップと
を備え、
前記先読みアドレス生成ステップは、
前記命令列に含まれる各命令の種類を並行して判別する命令種判別ステップと、
前記命令種別判別ステップの判別結果に基づいて、前記命令列から前記ターゲットアドレスを演算する所定の分岐命令またはデータアクセス命令を選択するターゲット命令選択ステップとを備えること
を特徴とする先読みバッファ格納方法。