(57)【特許請求の範囲】
【請求項１】
アドレスが連続する一群の命令をメモリからプリフェッチする命令プリフェッチバッファと、前記命令プリフェッチバッファから命令を読み込んで実行する処理実行部と、命令フェッチアドレス生成部とを備え、
前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブルを有し、前記処理実行部で分岐が発生したとき、前記テーブルを参照して発生した分岐の分岐先アドレスに対応する命令プリフェッチ量を求め、当該分岐先アドレスの命令を含み、求めた前記命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせ、
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記テーブルの当該分岐先アドレスに対応する命令プリフェッチ量を書き換える、
プロセッサ。
【請求項２】
請求項１において、前記テーブルには、前記処理実行部が所定の命令を実行することによって、分岐先アドレスと対応する命令プリフェッチ量が書き込まれる、
プロセッサ。
【請求項３】
請求項２において、前記テーブルを静的テーブルとし、
前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶する動的テーブルをさらに有し、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記動的テーブルの当該分岐先アドレスに対応する命令プリフェッチ量を書き換え、
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したときに、前記静的テーブルと前記動的テーブルの両方またはいずれか一方を参照して、発生した分岐の分岐先アドレスに対応する命令プリフェッチ量を求め、当該分岐先アドレスの命令を含み、求めた前記命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせる、
プロセッサ。
【請求項４】
請求項１において、前記命令フェッチアドレス生成部は、分岐予測部をさらに備え、前記処理実行部で分岐が発生し、前記分岐予測部による分岐予測が成功したときには、前記テーブルへの当該分岐先アドレスに対応する命令プリフェッチ量の書き換えを停止する、
プロセッサ。
【請求項５】
命令キャッシュと、処理実行部と、命令フェッチアドレス生成部とを備え、
前記命令キャッシュは、１ライン当たり所定数の命令コードで構成される複数のラインを保持し、前記命令フェッチアドレス生成部から供給される命令プリフェッチ要求アドレス毎に１ラインの命令コードをメモリからプリフェッチし、
前記処理実行部は、前記命令キャッシュから所定数の命令コードで構成される命令を読み込んで実行し、
前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令キャッシュにプリフェッチさせる命令プリフェッチ回数を記憶する命令プリフェッチ回数テーブルを有し、
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、前記命令プリフェッチ回数テーブルを参照して、発生した分岐の分岐先アドレスを含む命令プリフェッチ要求アドレスに対応する命令プリフェッチ回数を求め、当該命令プリフェッチ要求アドレスと連続し、求められた前記命令プリフェッチ回数に相当する数の命令プリフェッチ要求アドレスを、順次前記命令キャッシュに供給する、
プロセッサ。
【請求項６】
請求項５において、前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記命令プリフェッチ回数テーブルの当該分岐先アドレスに対応する命令プリフェッチ回数を書き換える、
プロセッサ。
【請求項７】
請求項６において、前記処理実行部は、分岐が発生したときに発生した分岐の分岐元アドレスと分岐先アドレスとを前記命令フェッチアドレス生成部に供給する、分岐要求部を有し、
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持し、当該分岐の次に分岐が発生したときに供給される分岐元アドレスから、保持されている前記分岐先アドレスを引いた差に基づいて、前記命令プリフェッチ回数テーブルの保持されている前記分岐先アドレスに対応する命令プリフェッチ回数を書き換える、
プロセッサ。
【請求項８】
請求項６において、前記処理実行部は、分岐要求部を有し、
前記分岐要求部は、前記処理実行部で分岐が発生したときに発生した分岐の分岐元アドレスを前記命令フェッチアドレス生成部に供給し、
前記分岐要求部は、前記処理実行部で分岐が発生したときにカウントを開始し、前記処理実行部で実行する命令のアドレスが前記命令キャッシュの１ラインに対応するアドレス境界を越えた回数をカウントするカウンタを備え、当該分岐の次に分岐が発生したときのカウント値を分岐間距離として前記命令フェッチアドレス生成部に供給し、
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持し、当該分岐の次に分岐が発生したときに供給される前記分岐間距離に基づいて、保持されている前記分岐先アドレスに対応する命令プリフェッチ回数を書き換える、
プロセッサ。
【請求項９】
請求項６において、前記処理実行部は、分岐要求部を有し、
前記分岐要求部は、前記処理実行部で分岐が発生したときに発生した分岐の分岐元アドレスを前記命令フェッチアドレス生成部に供給し、
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持するレジスタと、分岐先アドレスが供給されたときにカウントを開始し前記命令キャッシュに命令プリフェッチ要求アドレスを供給する回数をカウントするカウンタとを備え、当該分岐の次に分岐先アドレスが供給されたときに、前記カウンタのカウント値を、前記レジスタに保持されている分岐先アドレスに対応する命令プリフェッチ回数として、前記命令プリフェッチ回数テーブルに書き込む、
プロセッサ。
【請求項１０】
請求項５において、前記命令プリフェッチ回数テーブルには、前記処理実行部が所定の命令を実行することによって、分岐先アドレスと対応する命令プリフェッチ回数が書き込まれる、
プロセッサ。
【請求項１１】
請求項１０において、前記命令プリフェッチ回数テーブルを静的命令プリフェッチ回数テーブルとし、
前記命令フェッチアドレス生成部は、動的命令プリフェッチ回数テーブルをさらに備え、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記動的命令プリフェッチ回数テーブルの当該分岐先アドレスに対応する命令プリフェッチ回数を書き換え、
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したときに、前記静的命令プリフェッチ回数テーブルと前記動的命令プリフェッチ回数テーブルの両方またはいずれか一方を参照して発生した分岐の分岐先アドレスに対応する命令プリフェッチ回数を求め、発生した分岐の分岐先アドレスを含む命令プリフェッチ要求アドレスと、当該命令プリフェッチ要求アドレスと連続し、求めた前記命令プリフェッチ回数に相当する数の命令プリフェッチ要求アドレスとを、順次前記命令キャッシュに供給する、
プロセッサ。
【請求項１２】
請求項６において、前記命令フェッチアドレス生成部は、分岐予測部をさらに備え、前記処理実行部で分岐が発生したとき、前記分岐予測部による分岐予測が成功したときに、前記命令プリフェッチ回数テーブルの当該分岐先アドレスに対応する命令プリフェッチ量の書き換えを停止する、
プロセッサ。
【請求項１３】
請求項５において、前記命令プリフェッチ回数テーブルは、分岐先アドレスが入力され、対応する命令プリフェッチ回数を出力する、連想メモリである、
プロセッサ。
【請求項１４】
請求項１３において、前記命令プリフェッチ回数テーブルとして機能する前記連想メモリは、それぞれのエントリがタグとマスクと命令プリフェッチ回数からなる複数のエントリを備え、入力される分岐先アドレスの一部のビットを前記マスクによって無効化したときに前記タグと一致するエントリに格納されている命令プリフェッチ回数を、入力された前記分岐先アドレスに対応する命令プリフェッチ回数として出力する、
プロセッサ。
【請求項１５】
命令プリフェッチバッファと命令フェッチアドレス生成部とを備えるプロセッサに供給するプログラムの命令コードを生成する命令コード生成装置であって、
前記命令フェッチアドレス生成部は、発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブルを有し、分岐が発生したとき、発生した分岐の分岐先アドレスを含み、当該分岐先アドレスに対応する命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせ、
前記命令コード生成装置は、前記プログラムから実行形式の命令コードを生成し、前記命令コードにおいて分岐命令の分岐先アドレスと次の分岐命令が配置されるアドレスとの差に基づいて、当該分岐先アドレスに対応する命令プリフェッチ量を算出する、
命令コード生成装置。
【請求項１６】
請求項１５において、前記命令プリフェッチバッファは命令キャッシュであり、前記命令プリフェッチ量は前記命令キャッシュのキャッシュラインに命令コードをプリフェッチさせる命令プリフェッチ回数で規定される、
命令コード生成装置。
【請求項１７】
請求項１６において、前記テーブルは、それぞれのエントリがタグとマスクと命令プリフェッチ回数からなる複数のエントリを備え、入力される分岐先アドレスの一部のビットを前記マスクによって無効化したときに前記タグと一致するエントリに格納されている命令プリフェッチ回数を、入力された前記分岐先アドレスに対応する命令プリフェッチ回数として出力する、連想メモリであり、
前記命令コード生成装置は、対応する命令プリフェッチ回数が同じ値となる複数の分岐先アドレスが、一部のアドレスビットを共通とするアドレス空間に配置されるように、前記命令コードのアドレスマッピングを行い、前記共通するアドレスビットをタグとし、他のアドレスビットを無効化するビット列をマスクとし、前記同じ値を命令プリフェッチ回数として、前記連想メモリに供給する１個のエントリを構成する、
命令コード生成装置。
【請求項１８】
請求項１５において、前記命令コード生成装置は、高級言語で記述された前記プログラムが入力され、オブジェクトファイルを生成するコンパイラと、ライブラリオブジェクトファイルと、前記コンパイラによって生成されたオブジェクトファイルと前記ライブラリオブジェクトファイルから実行形式の命令コードを生成するリンカとを備え、前記リンカはさらに、分岐先アドレスに対応する命令プリフェッチ量を算出して出力する、
命令コード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサおよび高級言語等で記述されたプログラムから前記プロセッサで実行可能な命令コードを生成する命令コード生成装置に関し、特に命令キャッシュとプリフェッチ機能を内蔵するマイクロコンピュータ等のプロセッサ及びそれを用いたシステムに好適に利用できるものである。
【背景技術】
【０００２】
命令キャッシュを備えるプロセッサでは、キャッシュミス後のキャッシュフィルを待たされることによって処理性能が低下するのを防止するために、プリフェッチ機能が広く採用されている。プリフェッチ機能は、プロセッサが将来実行するであろう命令を予測し、キャッシュミスが発生する前に予め命令キャッシュ等のプリフェッチバッファに読み込んでおく機能である。現在実行されている命令のアドレスに連続するアドレスの命令を読み込む単純なプリフェッチ機能から、分岐予測を伴う高機能のプリフェッチ機能まで、種々のプリフェッチ機能が提案されている。
【０００３】
特許文献１には、ＦＩＦＯ（First In First Out）形式のプリフェッチバッファを備え、命令デコーダで求められた命令のワード数に基づいて、命令の単位ごとにプリフェッチを行う、プロセッサが開示されている。プリフェッチ機能によって命令をプリフェッチバッファに読み込むときに発生する、バスアービトレーションの頻度を少なくしてシステム全体のバス効率を向上することができるとされる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平２−２４２３３７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１について本発明者が検討した結果、以下のような新たな課題があることがわかった。
【０００６】
ＦＩＦＯ形式のプリフェッチバッファに代えて命令キャッシュに対して命令プリフェッチを行うと、１度に読み込む命令の量が多いため、バスを占有する期間がより長くなる。ＦＩＦＯ形式のプリフェッチバッファが１〜２バイトを１ワードとするワード単位で命令プリフェッチするのに対して、命令キャッシュでのキャッシュフィルの単位であるキャッシュライン（エントリサイズと一致させることが多い）は、例えば１２８バイトである。命令キャッシュを備えるプロセッサでは、１キャッシュラインの命令を実行する毎にキャッシュミスが発生してキャッシュフィルを行うように構成するとキャッシュフィルを待つことによる性能低下が著しいため、予め複数のラインを読み込んでおく投機的命令プリフェッチを行うことが有効である。ここで、命令プリフェッチを行う回数、即ちキャッシュフィルを行うライン数は、固定値またはレジスタ設定によって与えられる。分岐予測を伴わない場合には、現在実行されている命令のアドレスに連続するアドレスの命令を対象とする複数ライン分の命令プリフェッチが行われる。このとき、固定的な命令プリフェッチ回数では、実際には実行されない命令の投機的命令プリフェッチが発生するケースがあることがわかった。例えば、キャッシュミスに伴う１ラインのキャッシュフィルに続いて、固定的に２ラインの命令プリフェッチを実行すると仮定すると、最初の１ラインに含まれる命令を実行している途中で分岐が発生し、後続の命令が実行されない場合にも、後続の２ラインの命令プリフェッチをキャンセルすることはできず実行される。後続の２ラインの命令プリフェッチを実行するために、キャッシュフィルをするバスは占有され、分岐先アドレスの命令をフェッチするためのバス権の獲得が待たされることとなる。
【０００７】
このような課題は、命令プリフェッチバッファがキャッシュメモリで構成された場合に限らず、ＦＩＦＯ形式の場合も同様に発生し得る。
【０００８】
このような課題を解決するための手段を以下に説明するが、その他の課題と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００９】
一実施の形態によれば、下記の通りである。
【００１０】
すなわち、アドレスが連続する一群の命令をメモリからプリフェッチする命令プリフェッチバッファを備えるプロセッサにおいて、命令プリフェッチバッファにプリフェッチする命令のアドレスと命令プリフェッチ量を制御する、命令フェッチアドレス生成部を備える。命令フェッチアドレス生成部は、処理実行部で発生する分岐の分岐先アドレスに対応付けて命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブルを備える。命令フェッチアドレス生成部は、処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスを含み、当該分岐先アドレスに対応する命令プリフェッチ量の命令を、命令プリフェッチバッファにプリフェッチさせる。
【発明の効果】
【００１１】
前記一実施の形態によって得られる効果を簡単に説明すれば下記のとおりである。
【００１２】
すなわち、命令プリフェッチによってバスが必要以上に占有される事態の発生確率を低く抑えることができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、代表的な実施の形態に係るプロセッサの構成例を示すブロック図である。
【図２】図２は、プロセッサ全体の構成例を示すブロック図である。
【図３】図３は、比較例のプロセッサにおける命令フェッチアドレス生成部の構成を示すブロック図である。
【図４】図４は、代表的な実施の形態に係るプロセッサの命令フェッチアドレス生成部の構成例を示すブロック図である。
【図５】図５は、命令プリフェッチ回数テーブルのフルアソシアティブ連想メモリによる構成例を示す概念図である。
【図６】図６は、命令プリフェッチ回数テーブルのセットアソシアティブ連想メモリによる構成例を示す概念図である。
【図７】図７は、実施形態１の命令フェッチアドレス生成部の構成例を示すブロック図である。
【図８】図８は、命令プリフェッチ回数テーブルへのテーブル記録の手順を模式的に示す説明図である。
【図９】図９は、命令プリフェッチ回数テーブルからの命令フェッチ回数のテーブル読み出しの手順を模式的に示す説明図である。
【図１０】図１０は、比較例のプロセッサの動作例を模式的に示すタイミングチャートである。
【図１１】図１１は、代表的な実施の形態に係るプロセッサの動作例を模式的に示すタイミングチャートである。
【図１２】図１２は、実施形態１の命令フェッチアドレス生成部の別の構成例（分岐予測との組合せ）を示すブロック図である。
【図１３】図１３は、実施形態２のプロセッサ及びそれに搭載される命令フェッチアドレス生成部の構成例を示すブロック図である。
【図１４】図１４は、実施形態３の命令フェッチアドレス生成部の構成例を示すブロック図である。
【図１５】図１５は、実施形態４の命令フェッチアドレス生成部の構成例を示すブロック図である。
【図１６】図１６は、実施形態５の命令フェッチアドレス生成部の構成例を示すブロック図である。
【図１７】図１７は、実施形態６の命令フェッチアドレス生成部の構成例を示すブロック図である。
【図１８】図１８は、実施形態６の命令フェッチアドレス生成部に搭載される命令プリフェッチ回数テーブルの連想メモリによるエントリの構成例を示す説明図である。
【図１９】図１９は、実施形態７の命令コード生成装置の構成例を模式的に示す説明図である。
【図２０】図２０は、リンカによって生成される実行形式ファイルの一例を模式的に示す説明図である。
【図２１】図２１は、リンカによって生成される命令プリフェッチ回数情報の一例を模式的に示す説明図である。
【発明を実施するための形態】
【００１４】
１．実施の形態の概要
先ず、本願において開示される代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１５】
〔１〕＜命令プリフェッチ量管理テーブル＞
本願において開示される代表的な実施の形態は、アドレスが連続する一群の命令をメモリ（４０）からプリフェッチする命令プリフェッチバッファ（２０）と、前記命令プリフェッチバッファから命令を読み込んで実行する処理実行部（３０）と、命令フェッチアドレス生成部（１１）とを備えるプロセッサ（１００）であって、以下のように構成される。
【００１６】
前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブル（１、２、３）を有する。前記処理実行部で分岐が発生したとき、前記テーブルを参照して発生した分岐の分岐先アドレスに対応する命令プリフェッチ量を求め、当該分岐先アドレスの命令を含み、求めた前記命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせる（４〜７）。
【００１７】
これにより、命令プリフェッチによってバス（４１）が必要以上に占有される事態の発生確率を低く抑えることができる。
【００１８】
〔２〕＜動的テーブル＞
項１において、前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記テーブル（２）の当該分岐先アドレスに対応する命令プリフェッチ量を書き換える。
【００１９】
これにより、命令プリフェッチ量は、実際に発生した分岐に基づいて学習されるため、より高い精度で適正な命令プリフェッチ量を予測することができる。
【００２０】
〔３〕＜静的テーブル＞
項１において、前記テーブル（３）には、前記処理実行部が所定の命令を実行することによって、分岐先アドレスと対応する命令プリフェッチ量が書き込まれる。
【００２１】
これにより、割り込みなど頻繁に発生しない例外処理について、項２のように動的に命令プリフェッチ量が算出されることが期待できない場合、或いは動的に算出された命令プリフェッチ量が、次に参照される時まで保持されることが期待できない（スピルアウトしてしまう）場合に、確実に適切な命令プリフェッチ量を与えることができる。また、命令プリフェッチ量は、オフラインでプログラムを解析して、または、オペレーティングシステムなどのソフトウェアによって、適切に算出することもできる。
【００２２】
〔４〕＜静的テーブル＋動的テーブル＞
項３において、前記テーブルを静的テーブル（３）とする。前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶する動的テーブル（２）をさらに有する。前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記動的テーブルの当該分岐先アドレスに対応する命令プリフェッチ量を書き換える。前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したときに、前記静的テーブルと前記動的テーブルの両方またはいずれか一方を参照して（１５）、発生した分岐の分岐先アドレスに対応する命令プリフェッチ量を求め、当該分岐先アドレスの命令を含み、求めた前記命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせる（４〜７）。
【００２３】
これにより、項２の学習機能を持つ動的テーブル（２）と項３の静的テーブル（３）とを、適切に使い分けることができる。例えば、割り込み処理などの例外処理は頻繁に発生しないので、これらに伴う分岐先アドレスを動的テーブルで管理すると、頻繁に発生する分岐についての学習を行う過程で上書きされ消去されてしまう（スピルアウトしてしまう）恐れがある。そこで、例外処理に伴う分岐先アドレスに対応する命令プリフェッチ量は静的テーブルによって管理し、実際に例外処理による分岐が発生しても動的テーブルにはそのときの命令プリフェッチ量を書き込まないように構成する。これにより、頻繁に発生しない例外処理に伴う分岐先アドレスについては、スピルアウトすることなく静的テーブルによって管理され、頻繁に発生する分岐については、現に発生した分岐に基づいて学習する動的テーブルによって管理され、それぞれ適切な命令プリフェッチ量の命令をプリフェッチすることができる。
【００２４】
〔５〕＜動的テーブル＋分岐予測部＞
項２において、前記命令フェッチアドレス生成部は、分岐予測部（１９）をさらに備え、前記処理実行部で分岐が発生し、前記分岐予測部による分岐予測が成功したときには、前記テーブルへの当該分岐先アドレスに対応する命令プリフェッチ量の書き換えを停止する。
【００２５】
これにより、動的テーブルにおけるエントリの不必要な占有を抑えることができる。分岐予測が成功したときには、分岐予測に基づいて命令プリフェッチが行われることによってバスが必要以上に占有されることがないため、動的テーブルを使用する必要がないからである。
【００２６】
〔６〕＜命令プリフェッチ回数テーブル＞
本願において開示される代表的な実施の形態は、命令キャッシュ（２０）と、処理実行部（３０）と、命令フェッチアドレス生成部（１１）とを備えるプロセッサ（１００）であって、以下のように構成される。
【００２７】
前記命令キャッシュは、１ライン当たり所定数の命令コードで構成される複数のラインを保持し、前記命令フェッチアドレス生成部から供給される命令プリフェッチ要求アドレス毎に１ラインの命令コードをメモリ（４０）からプリフェッチする。
【００２８】
前記処理実行部は、前記命令キャッシュから所定数の命令コードで構成される命令を読み込んで実行する。
【００２９】
前記命令フェッチアドレス生成部は、前記処理実行部で発生する分岐の分岐先アドレスに対応付けて前記命令キャッシュにプリフェッチさせる命令プリフェッチ回数を記憶する命令プリフェッチ回数テーブル（１、２、３）を有する。
【００３０】
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、前記命令プリフェッチ回数テーブルを参照して、発生した分岐の分岐先アドレスを含む命令プリフェッチ要求アドレスに対応する命令プリフェッチ回数を求める。前記命令フェッチアドレス生成部は、当該命令プリフェッチ要求アドレスと連続し、求められた前記命令プリフェッチ回数に相当する数の命令プリフェッチ要求アドレスを、順次前記命令キャッシュに供給する（４〜７）。
【００３１】
これにより、命令プリフェッチによってバス（４１）が必要以上に占有される事態の発生確率を低く抑えることができる。
【００３２】
〔７〕＜動的命令プリフェッチ回数テーブル＞
項６において、前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記命令プリフェッチ回数テーブル（２）の当該分岐先アドレスに対応する命令プリフェッチ回数を書き換える。
【００３３】
これにより、命令プリフェッチ回数は、実際に発生した分岐に基づいて学習されるため、より高い精度で適正な命令プリフェッチ量を予測することができる。
【００３４】
〔８〕＜アドレスの差から命令プリフェッチ回数を算出＞
項７において、前記処理実行部は、分岐が発生したときに発生した分岐の分岐元アドレスと分岐先アドレスとを前記命令フェッチアドレス生成部に供給する、分岐要求部（３３）を有する。
【００３５】
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持し、当該分岐の次に分岐が発生したときに供給される分岐元アドレスから、保持されている前記分岐先アドレスを引いた差に基づいて、前記命令プリフェッチ回数テーブルの保持されている前記分岐先アドレスに対応する命令プリフェッチ回数を書き換える。
【００３６】
これにより、命令プリフェッチ回数は、分岐先アドレスと次に分岐が発生する命令が配置されるアドレス（次回分岐の分岐元アドレス）との差から計算されるため、正確に命令プリフェッチ回数を学習することができる。
【００３７】
〔９〕＜分岐要求部が命令プリフェッチ回数をカウンタにより算出＞
項７において、前記処理実行部は、分岐要求部（３３）を有する。
【００３８】
前記分岐要求部は、前記処理実行部で分岐が発生したときに発生した分岐の分岐元アドレスを前記命令フェッチアドレス生成部に供給する。
【００３９】
前記分岐要求部は、前記処理実行部で分岐が発生したときにカウントを開始し、前記処理実行部で実行する命令のアドレスが前記命令キャッシュの１ラインに対応するアドレス境界を越えた回数をカウントするカウンタ（３４）を備え、当該分岐の次に分岐が発生したときのカウント値を分岐間距離として前記命令フェッチアドレス生成部に供給する。
【００４０】
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持し（１２）、当該分岐の次に分岐が発生したときに供給される前記分岐間距離に基づいて、保持されている前記分岐先アドレスに対応する命令プリフェッチ回数を書き換える。
【００４１】
これにより、命令プリフェッチ回数は、分岐要求部においてカウンタ（３４）によって算出されるため、少ない回路規模で正確に命令プリフェッチ回数を学習することができる。
【００４２】
〔１０〕＜命令フェッチアドレス生成部が命令プリフェッチ回数をカウンタにより算出＞
項７において、前記処理実行部は、分岐要求部（３３）を有する。
【００４３】
前記分岐要求部は、前記処理実行部で分岐が発生したときに発生した分岐の分岐元アドレスを前記命令フェッチアドレス生成部に供給する。
【００４４】
前記命令フェッチアドレス生成部は、供給された分岐先アドレスを保持するレジスタ（１２）と、分岐先アドレスが供給されたときにカウントを開始し前記命令キャッシュに命令プリフェッチ要求アドレスを供給する回数をカウントするカウンタ（１４）とを備える。前記命令フェッチアドレス生成部は、当該分岐の次に分岐先アドレスが供給されたときに、前記カウンタのカウント値を、前記レジスタに保持されている分岐先アドレスに対応する命令プリフェッチ回数として、前記命令プリフェッチ回数テーブルに書き込む。
【００４５】
これにより、命令プリフェッチ回数は、命令フェッチアドレス生成部においてカウンタ（１４）によって算出されるため、項８の構成よりも少ない回路規模で正確に命令プリフェッチ回数を学習することができる。算出（カウント）される命令プリフェッチ回数は、項９の構成で算出（カウント）される命令プリフェッチ回数と等しいかより多くなるため、より多くの投機的フェッチが行われ、命令キャッシュにヒットする確率が向上する。
【００４６】
〔１１〕＜静的命令プリフェッチ回数テーブル＞
項６において、前記命令プリフェッチ回数テーブル（３）には、前記処理実行部が所定の命令を実行することによって、分岐先アドレスと対応する命令プリフェッチ回数が書き込まれる。
【００４７】
これにより、割り込みなど、頻繁に発生しない例外処理について、項７〜項１０のように動的に命令プリフェッチ回数が算出されることが期待できない場合、或いは動的に算出された命令プリフェッチ回数が、次に参照される時まで保持されることが期待できない（スピルアウトしてしまう）場合に、確実に適切な命令プリフェッチ回数を与えることができる。また、命令プリフェッチ回数は、オフラインでプログラムを解析し、または、オペレーティングシステムなどのソフトウェアによって、適切に算出し、静的命令プリフェッチ回数テーブルに書き込むこともできる。
【００４８】
〔１２〕＜静的＋動的命令プリフェッチ回数テーブル＞
項１１において、前記命令プリフェッチ回数テーブルを静的命令プリフェッチ回数テーブル（３）とする。
【００４９】
前記命令フェッチアドレス生成部は、動的命令プリフェッチ回数テーブル（２）をさらに備え、前記処理実行部で分岐が発生したとき、発生した分岐の分岐先アドレスと、当該分岐の次に分岐が発生するアドレスとの差に基づいて、前記動的命令プリフェッチ回数テーブルの当該分岐先アドレスに対応する命令プリフェッチ回数を書き換える。
【００５０】
前記命令フェッチアドレス生成部は、前記処理実行部で分岐が発生したときに、前記静的命令プリフェッチ回数テーブルと前記動的命令プリフェッチ回数テーブルの両方またはいずれか一方を参照して（１５）発生した分岐の分岐先アドレスに対応する命令プリフェッチ回数を求める。前記命令フェッチアドレス生成部は、発生した分岐の分岐先アドレスを含む命令プリフェッチ要求アドレスと、当該命令プリフェッチ要求アドレスと連続し、求めた前記命令プリフェッチ回数に相当する数の命令プリフェッチ要求アドレスとを、順次前記命令キャッシュに供給する（４〜７）。
【００５１】
これにより、項７の学習機能を持つ動的命令プリフェッチ回数テーブルと、頻繁に発生しない例外処理などにも対応可能な項１１の静的命令プリフェッチ回数テーブルとを、適切に使い分けることができ、項４と同様の効果を奏する。
【００５２】
〔１３〕＜動的命令プリフェッチ回数テーブル＋分岐予測部＞
項７から項１０のいずれか１項において、前記命令フェッチアドレス生成部は、分岐予測部（１９）をさらに備え、前記処理実行部で分岐が発生したとき、前記分岐予測部による分岐予測が成功したときに、前記命令プリフェッチ回数テーブルの当該分岐先アドレスに対応する命令プリフェッチ量の書き換えを停止する。
【００５３】
これにより、動的命令プリフェッチ回数テーブルにおけるエントリの不必要な占有を抑えることができる。分岐予測が成功したときには、分岐予測に基づいて命令プリフェッチが行われることによってバスが必要以上に占有されることがないため、動的命令プリフェッチ回数テーブルを使用する必要がないからである。
【００５４】
〔１４〕＜命令プリフェッチ回数テーブルは連想メモリ＞
項６から項１３のいずれか１項において、前記命令プリフェッチ回数テーブルは、分岐先アドレスが入力され、対応する命令プリフェッチ回数を出力する、連想メモリである。
【００５５】
これにより、公知の連想メモリの設計資産を利用して命令プリフェッチ回数テーブルを実装することができ、設計が容易化される。連想メモリは、フルアソシアティブでもセットアソシアティブでもよい。
【００５６】
〔１５〕＜命令プリフェッチ回数テーブルはマスク付き連想メモリ＞
項１４において、前記命令プリフェッチ回数テーブルとして機能する前記連想メモリは、それぞれのエントリがタグとマスクと命令プリフェッチ回数からなる複数のエントリを備える。前記連想メモリは、入力される分岐先アドレスの一部のビットを前記マスクによって無効化したときに前記タグと一致するエントリに格納されている命令プリフェッチ回数を、入力された前記分岐先アドレスに対応する命令プリフェッチ回数として出力する（１８）。
【００５７】
これにより、命令プリフェッチ回数テーブルとして機能する連想メモリの回路規模（エントリ数）を少なく抑えることができる。同じ命令プリフェッチ回数を出力する複数の分岐先アドレスをまとめて１つのエントリに登録することができるためである。
【００５８】
〔１６〕＜命令コード生成装置＞
本願において開示される代表的な実施の形態は、命令プリフェッチバッファ（２０）と命令フェッチアドレス生成部（１１）とを備えるプロセッサ（１００）に供給するプログラム（６１）の命令コードを生成する命令コード生成装置（５０）であって、以下のように構成される。
【００５９】
前記命令フェッチアドレス生成部は、発生する分岐の分岐先アドレスに対応付けて前記命令プリフェッチバッファにプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブル（１、２、３）を有し、分岐が発生したとき、発生した分岐の分岐先アドレスを含み、当該分岐先アドレスに対応する命令プリフェッチ量の命令を、前記命令プリフェッチバッファにプリフェッチさせる。
【００６０】
前記命令コード生成装置は、前記プログラムから実行形式の命令コード（６４）を生成し、前記命令コードにおいて分岐命令の分岐先アドレスと次の分岐命令が配置されるアドレスとの差に基づいて、当該分岐先アドレスに対応する命令プリフェッチ量を算出する。
【００６１】
これにより、プロセッサの実行形式の命令コードを生成するリンカ等からなる命令コード生成装置に、項３〜４に記載される静的テーブルまたは項１１〜１２に記載される静的命令プリフェッチ回数テーブルに書き込むための情報（分岐先アドレスと命令プリフェッチ量又は命令プリフェッチ回数）を生成する機能を追加することができる。本命令コード生成装置によって生成された、分岐先アドレスと命令プリフェッチ量又は命令プリフェッチ回数とを対応付ける情報は、項１〜２、４〜５に記載される動的テーブルまたは項６〜１０、１２〜１５に記載される動的命令プリフェッチ回数テーブルに、初期値として書き込まれても良い。
【００６２】
〔１７〕＜命令プリフェッチバッファは命令キャッシュ＞
項１６において、前記命令プリフェッチバッファは命令キャッシュ（２０）であり、前記命令プリフェッチ量は前記命令キャッシュのキャッシュラインに命令コードをプリフェッチさせる命令プリフェッチ回数で規定される。
【００６３】
これにより、キャッシュメモリによって命令プリフェッチバッファが実装されるプロセッサに対して、適切に、命令プリフェッチ量として命令プリフェッチ回数を与えることができる。
【００６４】
〔１８〕＜テーブルはマスク付き連想メモリ＞
項１７において、前記テーブルは、それぞれのエントリがタグとマスクと命令プリフェッチ回数からなる複数のエントリを備え、入力される分岐先アドレスの一部のビットを前記マスクによって無効化したときに前記タグと一致するエントリに格納されている命令プリフェッチ回数を、入力された前記分岐先アドレスに対応する命令プリフェッチ回数として出力する、連想メモリである。
【００６５】
前記命令コード生成装置は、対応する命令プリフェッチ回数が同じ値となる複数の分岐先アドレスが、一部のアドレスビットを共通とするアドレス空間に配置されるように、前記命令コードのアドレスマッピングを行う。次に、前記命令コード生成装置は、前記共通するアドレスビットをタグとし、他のアドレスビットを無効化するビット列をマスクとし、前記同じ値を命令プリフェッチ回数として、前記連想メモリに供給する１個のエントリを構成する。
【００６６】
これにより、命令プリフェッチ回数テーブルとして機能する連想メモリの回路規模（エントリ数）を少なく抑えることができる。命令コード生成装置は、同じ命令プリフェッチ回数を出力する複数の分岐先アドレスをまとめて１つのエントリに登録するための情報を生成することができる。
【００６７】
〔１９〕＜コンパイラ＋リンカ＞
項１６、項１７又は項１８において、前記命令コード生成装置は、コンパイラ（５１）と、ライブラリオブジェクトファイル（６３）と、リンカ（５２）とを備える。前記コンパイラは、高級言語で記述された前記プログラム（６１）が入力され、オブジェクトファイル（６２）を生成する。前記リンカは、前記コンパイラによって生成されたオブジェクトファイル（６２）と前記ライブラリオブジェクトファイルから実行形式の命令コード（６４）を生成する。前記リンカはさらに、分岐先アドレスに対応する命令プリフェッチ量（６５）を算出して出力する。
【００６８】
これにより、分岐先アドレスに対応する命令プリフェッチ量を算出する機能が、通常のコンパイラとリンカ等から成る統合されたプログラム開発環境に組み込まれ、当該機能を自動化して提供することができる。
【００６９】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００７０】
〔実施形態１〕＜命令プリフェッチ量管理テーブル＞
図１は、代表的な実施の形態に係るプロセッサ１００の構成例を示すブロック図である。プロセッサ１００は、命令フェッチ部１０と命令プリフェッチバッファ２０と処理実行部３０とメモリ４０とを備え、命令プリフェッチバッファ２０とメモリ４０とがバス４１によって互いに接続されている。命令プリフェッチバッファ２０はアドレスが連続する一群の命令をメモリ４０からバス４１を介してプリフェッチし、処理実行部３０は命令プリフェッチバッファ２０から命令を読み込んで実行する。
【００７１】
図示は省略されているが、データのロード／ストアのために、処理実行部３０とメモリ４０との間も同じメモリ４０とバス４１によって互いに接続されても良いし、他のメモリと他のバス（データバス）によって命令とは独立に接続されても良い。また、バス４１は階層化されていてもよい。特に制限されないが、プロセッサ１００は、メモリをオンチップに含み又は外付けされる構成により、例えば、公知のＣＭＯＳ（Complementary Metal-Oxide-Semiconductor field effect transistor）集積回路製造技術を用いて、シリコンなどの単一半導体基板上に形成される。なお、図１に図示される信号は、１本または複数の配線からなる１〜多数ビットのディジタル信号であるが、バス表記は省略される。これらの点は、本願で開示する他の実施形態、及び、引用する他のブロック図についても同様である。
【００７２】
命令フェッチ部１０は命令フェッチアドレス生成部１１を有し、命令フェッチアドレス生成部１１は処理実行部３０で発生する分岐の分岐先アドレスに対応付けて命令プリフェッチバッファ２０にプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブル１を備える。処理実行部３０で分岐が発生すると、発生した分岐の分岐先アドレスが命令フェッチ部１０の命令フェッチアドレス生成部１１に供給される。命令フェッチアドレス生成部１１は、テーブル１を参照して供給された分岐先アドレスに対応する命令プリフェッチ量を読み出す。命令フェッチアドレス生成部１１は、命令プリフェッチ要求アドレスを生成するなどの方法により、読み出した命令プリフェッチ量の命令をメモリ４０から命令プリフェッチバッファ２０にプリフェッチさせる。
【００７３】
これにより、分岐先アドレスに応じて適切な命令プリフェッチ量を適宜設定することができるので、命令プリフェッチによってバス４１が必要以上に占有される事態の発生確率を低く抑えることができる。
【００７４】
図２は、プロセッサ１００の全体の構成例を示すブロック図である。
【００７５】
命令プリフェッチバッファ２０は例えばキャッシュメモリで実現され、データアレイ２１と制御部２２とバスリクエストバッファ２３を含んで構成される（命令キャッシュ部２０と呼ぶ）。データアレイは複数のエントリで構成され、１エントリ当たりのキャッシュラインは例えば１２８バイトとされ、複数の命令コードを含む。制御部２２は所謂キャッシュコントローラであり、要求されるアドレスの命令コードがデータアレイ２１に格納されているかどうかを判定して、キャッシュヒットすれば処理実行部３０に供給し、格納されていなければキャッシュミスとして、そのアドレスを含む１キャッシュラインの命令コードをメモリ４０からデータアレイ２１に読み込む（キャッシュフィルする）。キャッシュミスに伴うメモリ４０へのデータのリード要求は、バスリクエストバッファ２３にバッファされる。バスリクエストバッファ２３は、バス権を獲得する度に、バッファされるリード要求をバス４１に対して順次発行する。
【００７６】
命令キャッシュ部２０とメモリ４０とは、メインバス４１を介して接続されている。メインバス４１の負荷の大きさと要求されるアクセス周波数によって、命令キャッシュ部２０とメインバス４１との間、メインバス４１とメモリ４０との間に、それぞれパイプラインを構成する中継バッファ４２＿１〜４が設けられている。この中継バッファの段数や構成は、メインバス４１の負荷の大きさ、要求されるアクセス周波数（スループット）やレイテンシによって決まる。
【００７７】
処理実行部３０は、命令デコーダ３２と、分岐要求部３３と、実行部３５を備える。命令デコーダ３２は命令キャッシュ２１から供給される命令の命令コードをデコードして解釈し、分岐要求部３３と実行部３５等を命令に則して制御する。実行部３５は、例えばロード／ストア命令実行部、演算実行部等で構成される。分岐要求部３３は、実行部３５の演算結果に依存する条件分岐や、無条件分岐を実行し、分岐先アドレスを命令フェッチ部１０に発行する。通常は分岐先アドレスとともに分岐要求を発行する。
【００７８】
本実施形態１においては、命令フェッチアドレス生成部１１は、上述のように、分岐先アドレスに対応付けて命令プリフェッチバッファ２０（命令キャッシュ部２０）にプリフェッチさせる命令の命令プリフェッチ量を記憶するテーブル１を備えるので、分岐先アドレスに応じて適切な命令プリフェッチ量を適宜設定することができる。
【００７９】
＜命令プリフェッチ回数テーブル＞
命令プリフェッチバッファ２０は、例えば上述のように命令キャッシュ部２０で実現し、命令プリフェッチ量はキャッシュフィルの回数によって規定することができる。以下に、命令プリフェッチ量が分岐先アドレスに依らず固定される比較例と、命令プリフェッチ量が分岐先アドレスに応じて適宜規定される本実施形態とを対比して説明する。
【００８０】
図３は、比較例のプロセッサの命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令フェッチアドレス生成部１１は、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ回数設定レジスタ９を備える。処理実行部３０で分岐が発生すると、分岐先アドレスと分岐要求が命令フェッチアドレス生成部１１に供給される。供給された分岐先アドレスは、セレクタ６を介してフリップフロップ７に格納され、命令プリフェッチバッファとして機能する命令キャッシュ２０に供給される。分岐先アドレスが命令キャッシュ２０においてキャッシュヒットすれば、対応する命令コードが読み出されて処理実行部３０に供給される。分岐先アドレスが命令キャッシュ２０においてキャッシュミスの場合は、キャッシュフィルを行った上で、対応する命令コードが読み出されて処理実行部３０に供給される。
【００８１】
分岐先アドレスは、これと並行してアドレス加算部５によってインクリメントされ、フリップフロップ７に保持される値が更新される。インクリメントされる量は、１キャッシュライン分であり、アドレス加算部５は例えば０ｘ１０の加算とされる。ここで「０ｘＹＹ」はＹＹが１６進表記の２桁の数であることを示す（本願明細書内で同様）。分岐先アドレスからインクリメントされた値は、命令プリフェッチ要求アドレスとして、命令キャッシュ２０に供給され、キャッシュミスの場合は、メモリ４０からプリフェッチされる。アドレス生成制御部４は、このインクリメント動作の繰り返しを制御する。本比較例では、命令プリフェッチ回数設定レジスタ９から供給される命令プリフェッチ回数だけ、インクリメントを繰り返し、その都度、命令プリフェッチ要求アドレスを発行して、命令キャッシュ２０にその回数に相当する命令プリフェッチを実行させる。
【００８２】
図４は、代表的な実施の形態に係るプロセッサ１００の命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令プリフェッチバッファ２０を命令キャッシュ２０で実現し、命令プリフェッチ量はキャッシュフィルの回数によって規定し、図１のテーブル１を命令プリフェッチ回数テーブル１とした構成例である。命令フェッチアドレス生成部１１は、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ回数テーブル１を備える。処理実行部３０で分岐が発生すると、分岐先アドレスと分岐要求が命令フェッチアドレス生成部１１に供給される。供給された分岐先アドレスは、セレクタ６を介してフリップフロップ７に格納され、命令キャッシュ２０に供給される。分岐先アドレスが命令キャッシュ２０においてキャッシュヒットすれば、対応する命令コードが読み出されて処理実行部３０に供給され、キャッシュミスの場合は、キャッシュフィルを行った上で、対応する命令コードが読み出されて処理実行部３０に供給される。
【００８３】
分岐先アドレスは、これと並行してアドレス加算部５によってインクリメントされ、フリップフロップ７に格納される値が更新される。インクリメントされる量は、１キャッシュライン分である。分岐先アドレスからインクリメントされた値は、命令プリフェッチ要求アドレスとして、命令キャッシュ２０に供給され、キャッシュミスの場合は、メモリ４０からプリフェッチされる。アドレス生成制御部４は、このインクリメント動作の繰り返しを制御する。図４に示した構成例では、処理実行部３０から供給された分岐先アドレスに対応する命令プリフェッチ回数が、命令プリフェッチ回数テーブル１から読み出されて、アドレス生成制御部４に供給される。アドレス生成制御部４は、命令プリフェッチ回数テーブル１から供給される命令プリフェッチ回数に応じてインクリメントを繰り返し、その都度、命令プリフェッチ要求アドレスを発行して、命令キャッシュ２０にその回数に相当する命令プリフェッチを実行させる。
【００８４】
命令プリフェッチ回数テーブル１は、分岐先アドレスを用いて対応する命令プリフェッチ回数を参照する連想メモリであり、その構成は一般的なフルアソシアティブ、セットアソシアティブとすることができる。
【００８５】
図５は、命令プリフェッチ回数テーブル１のフルアソシアティブ連想メモリによる構成例を示す概念図である。複数のエントリで構成され、各エントリはそれぞれバリッド（valid）フラグＶ、タグとしての分岐先アドレス、及び、対応する命令プリフェッチ回数により構成される。
【００８６】
図６は、命令プリフェッチ回数テーブル１のセットアソシアティブ連想メモリによる構成例を示す概念図である。それぞれが複数のエントリからなる複数（ｎ＋１）のウェイＷＡＹ０〜ＷＡＹｎで構成される。各ウェイ（ＷＡＹ）は例えばインデックス０〜０ｘＦＦの２５６エントリで構成され、各エントリは、それぞれバリッド（valid）フラグＶとタグと命令プリフェッチ回数により構成される。分岐先アドレスは例えばその下位８ビットがインデックスに対応し、それより上位がタグとしてアレイに格納される。
【００８７】
図７は、実施形態１の命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令フェッチアドレス生成部１１は、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ制御部８を備え、命令プリフェッチ制御部８は、命令プリフェッチ回数テーブル２、命令フェッチ回数計算部１３、及び、分岐先アドレス保持レジスタ１２を有する。命令プリフェッチ回数テーブル２はテーブル記録とテーブル読み出しの機能を持つ。テーブル記録とは、分岐先アドレスと対応する命令プリフェッチ回数を命令プリフェッチ回数テーブル２のエントリに書き込む機能であり、テーブル読み出しとは、入力された分岐先アドレスと一致する分岐先アドレスを探索し、ヒットしたときに対応する命令プリフェッチ回数を読み出す機能である。分岐先アドレス保持レジスタ１２は、分岐先の先頭の命令が格納されているアドレスである、分岐先アドレスを保持する。命令プリフェッチ制御部８には、次回分岐の分岐元アドレスが入力される。次回分岐の分岐元アドレスとは、分岐先アドレス保持レジスタ１２に格納された分岐先アドレスを指定する分岐の次の分岐を発生させた分岐命令が格納されているアドレスである。命令フェッチ回数計算部１３には、次回分岐の分岐元アドレスと分岐先アドレス保持レジスタ１２に保持されている分岐先アドレスとが入力され、命令プリフェッチ回数テーブル２に対するテーブル記録を行う。命令プリフェッチ回数テーブル２は、入力される分岐先アドレスに対応するプリフェッチ回数を読み出して、アドレス生成制御部４に供給する。分岐先アドレスに対応するエントリがない場合は、図１５に示すセレクタ１５と同様のセレクタを設け、このセレクタによってデフォルト（Default）値が供給されるように構成するとよい。デフォルト（Default）値は、従来と同様に固定値またはレジスタ設定によって与えられる。アドレス生成制御部４、アドレス加算部５、セレクタ６、及び、フリップフロップ７の構成と動作は、図４を引用した上述の構成と動作と同様であるので、説明を省略する。
【００８８】
図８と図９は、命令プリフェッチ回数テーブル２へのテーブル記録の手順と、命令フェッチ回数のテーブル読み出しの手順を、それぞれ模式的に示す説明図である。図８と図９には、実行されるプログラムを構成する命令が、アセンブリ言語のニーモニックで示され、各命令が格納されるアドレスが各行の先頭列に示される。アドレスAxにはラベルTarget0を分岐先とするブランチ命令br Target0が配置されている。分岐先である、ラベルTarget0で示されるアドレスAyにはムーブ命令movが配置され、以降アドレスAy+1、Ay+2、…、Ay+dには、ロード命令ld、加算命令add、…、ジャンプ命令jump Target1が、順次配置されている。アドレスAy+dのジャンプ命令jump Target1は、ラベルTarget1への無条件分岐命令である。分岐先である、ラベルTarget1で示されるアドレスAzには、ムーブ命令movが配置されている。
【００８９】
命令プリフェッチ回数テーブル２の初期状態は、例えば空、即ち何も書き込まれていない状態である。アドレスAxからのブランチ命令br Target0が実行されて初めて分岐が発生したとき、ラベルTarget0で示されるアドレスAyが分岐先アドレスとなり、分岐先アドレス保持レジスタ１２に格納される。図８に図示はされないが、分岐先アドレスをAyとするテーブル読み出しは、命令プリフェッチ回数テーブル２が空なのでミスヒットする。その後、ラベルTarget0で示されるアドレスAyから順次命令が実行され、アドレスAy+dでジャンプ命令jump Target1によるラベルTarget1への分岐が発生する。このとき、ラベルTarget1で示されるアドレスAzが分岐先アドレスとして、また、分岐を発生させたジャンプ命令jump Target1のアドレスAy+dが次回分岐の分岐元アドレスとして、それぞれ命令フェッチアドレス生成部１１に供給される。命令フェッチ回数計算部１３は、次回分岐の分岐元アドレスAy+dと分岐先アドレス保持レジスタ１２から分岐先アドレスAyとが入力され、その差（Ay+d−Ay＝d）である分岐間距離を算出する。命令フェッチ回数計算部１３は、算出した分岐間距離に基づいて適切な命令プリフェッチ回数を算出し、入力された分岐先アドレスAyと算出した命令プリフェッチ回数とを対応付けて命令プリフェッチ回数テーブル２のエントリに記録する。
【００９０】
その後、アドレスAxのブランチ命令br Target0が再度実行されて、２回目以降の分岐が発生したときには、図９に示すように、命令プリフェッチ回数テーブル２からのテーブル読み出しにより、ラベルTarget0で示される分岐先アドレスAyに対応する命令プリフェッチ回数が読み出され、命令キャッシュ２０に対する命令プリフェッチが実行される。このとき、分岐先アドレスAyに対応する命令プリフェッチ回数は、図８に示されるように、次回の分岐を発生させるジャンプ命令jump Target1のアドレスAy+dの命令までがプリフェッチされ、以降の不必要なプリフェッチが行われないように算出される。
【００９１】
図８と９には無条件分岐命令jump Target1を例示したが、これが条件分岐命令であるときには、実際に分岐を発生させた命令が配置されているアドレスまでを分岐間距離として命令プリフェッチ回数を算出し、逐次、テーブル記録を行う。これにより、分岐先アドレスに対応する命令プリフェッチ回数は、次回分岐が実際に発生するアドレスに基づいて適応的に学習される。
【００９２】
図１０と図１１は、比較例のプロセッサの動作例と、代表的な実施の形態に係るプロセッサの動作例とを、それぞれ模式的に示すタイミングチャートである。横軸には時刻が示され、縦軸方向には、命令キャッシュ２０に供給される命令プリフェッチ要求アドレスと、それに伴って発生する命令プリフェッチのためのバストランザクションが模式的に示される。
【００９３】
図１０に示される比較例のプロセッサでは、時刻ｔ１に分岐先アドレスAyが命令プリフェッチ要求アドレスとして発行されると、アドレスAyを含む１ライン分の命令プリフェッチ（１）が時刻ｔ２〜ｔ５の期間に実行される。その後、命令フェッチ部１０は固定的な回数の命令プリフェッチを要求する。図１０の例ではさらに２回の命令プリフェッチを要求し、アドレスAy+0x10、アドレスAy+0x20が命令プリフェッチ要求アドレスとして、それぞれ時刻ｔ３とｔ４に順次発行される。ここでは、命令プリフェッチ要求アドレスは１キャッシュライン毎に0x10ずつインクリメントされて発行される例が示されている。命令プリフェッチ要求アドレスAy+0x10、Ay+0x20の発行に伴って、アドレスAy+0x10を含む命令プリフェッチ（２）が時刻ｔ５〜ｔ８の期間に、アドレスAy+0x20を含む命令プリフェッチ（３）が時刻ｔ８〜ｔ１０の期間に、それぞれ実行される。これと並行して、命令プリフェッチ（１）でプリフェッチされた命令が実行され、時刻ｔ６にアドレスAzへの分岐要求が発生したとする。これに伴って、アドレスAz、Az+0x10、Az+0x20が命令プリフェッチ要求アドレスとして、それぞれ時刻ｔ６、ｔ７、ｔ９に順次発行される。しかし、時刻ｔ６の時点でバス４１は命令プリフェッチ（２）によって占有されており、アドレスAzに対する命令プリフェッチである分岐先命令フェッチは、命令プリフェッチ（３）が終わってバスが解放される、時刻ｔ１０まで待たされる。このため、プロセッサは、アドレスAzの命令の実行を待たされることとなる。
【００９４】
図１１に示される代表的な実施の形態に係るプロセッサの動作例でも、時刻ｔ１に分岐先アドレスAyが命令プリフェッチ要求アドレスとして発行され、アドレスAyを含む１ライン分の命令プリフェッチ（１）が時刻ｔ２〜ｔ５の期間に実行される。しかし、時刻ｔ１に分岐先アドレスAyが命令プリフェッチ要求アドレスとして発行された後、命令フェッチ部１０は分岐先アドレスAyに適する回数の命令プリフェッチを要求する。本願の代表的な実施の形態に係るプロセッサでは、次回の分岐が発生するアドレス（図８、９を引用すればアドレスAy+d）が、命令プリフェッチ（１）の範囲内に含まれるときは、その後の命令プリフェッチ要求アドレスを発行しない。即ち、時刻ｔ３、ｔ４には命令プリフェッチ要求アドレスが発行されない。そのため、時刻ｔ６にアドレスAzへの分岐要求が発生した時点では、バスはアイドル（IDLE）状態となっている。このため、時刻ｔ６におけるアドレスAzへの分岐に伴って発行される命令プリフェッチ要求アドレスAzに応じた分岐先命令フェッチは、時刻ｔ６の後直ちに時刻ｔ１０に開始することができる。このため、この分岐に伴うプロセッサの待ち時間は、通常のキャッシュミスと同程度の時間となり、不必要な待ち時間は発生しない。
【００９５】
以上説明したように、命令プリフェッチによってバス４１が必要以上に占有される事態の発生確率を低く抑えることができ、本来不要な命令プリフェッチ（２）（３）を停止することにより、バス４１とアクセス先のメモリ４０の動作電力を削減できる。さらに、図７に示したように命令プリフェッチバッファを命令キャッシュメモリで構成し、実施に発生した分岐に基づいて学習する命令プリフェッチ回数テーブル２を備えることにより、命令プリフェッチ回数は、実際に発生した分岐に基づいて学習されるため、より高い精度で適切な命令プリフェッチ量を予測することができる。また、命令プリフェッチ回数は、分岐先アドレスと次に分岐が発生する命令が配置されるアドレス（次回の分岐元アドレス）との差から計算されるため、正確に命令プリフェッチ回数を学習することができる。
【００９６】
図７には、命令プリフェッチバッファを命令キャッシュメモリで構成する例を示したが、命令プリフェッチバッファは必ずしもキャッシュメモリで構成する必要はなく、単純なＦＩＦＯ型のプリフェッチバッファでもよい。また、図７には、実際に発生した分岐に基づいて学習する命令プリフェッチ回数テーブル２を備えるプロセッサの構成例を示したが、分岐先アドレスに対応する適切な命令プリフェッチ回数の算出する方法は、図７に例示される構成には限られず、例えば後述の実施形態２又は３等に置き換えることができる。さらには、実際に発生した分岐に基づいて学習するのではなく、例えば実施形態４〜６に示されるように、学習を前提としない静的なテーブルとすることも、また、動的なテーブルと静的なテーブルを組合せることもできる。
【００９７】
＜動的命令プリフェッチ回数テーブル＋分岐予測部＞
図１２は、実施形態１の命令フェッチアドレス生成部１１の別の構成例として、分岐予測と組合せた例を示すブロック図である。命令フェッチアドレス生成部１１は、図７に示す構成に加え、分岐予測部１９を備える。分岐予測は、分岐が実際に発生するか否かが確定するより前に命令フェッチ部１０でその結果を予測し、分岐成立が予測される場合にはその分岐先を投機的に命令フェッチする技術である。分岐予測が成功したときには、予測分岐先アドレスをセレクタ６、フリップフロップ７を介して、命令プリフェッチ要求アドレスとして命令キャッシュ２０に供給する。また、分岐予測が成功する場合、上述の問題点である無用な投機的命令フェッチが発生しない。そこで分岐成立の分岐予測結果が正しい場合は、命令プリフェッチ回数テーブル２への記録をキャンセルして、エントリの占有を控える。
【００９８】
図１２には、図７に示される実施形態１の命令フェッチアドレス生成部１１に分岐予測部１９を組み込む構成例を示したが、分岐予測部１９は、以下に示すどの実施形態の命令フェッチアドレス生成部１１にも、同様に組み込むことができる。
【００９９】
〔実施形態２〕＜分岐要求部が命令プリフェッチ回数をカウンタにより算出＞
図１３は、実施形態２のプロセッサ１００及びそれに搭載される命令フェッチアドレス生成部１１の構成例を示すブロック図である。図７に示される実施形態１のプロセッサ１００は、命令フェッチアドレス生成部１１が分岐先アドレスに対応する命令プリフェッチ回数を算出する構成例であるが、本実施形態２のプロセッサ１００は、処理実行部３０に命令プリフェッチ回数を算出する回路が設けられている。プロセッサ１００は、図１と同様に、命令フェッチ部１０と命令プリフェッチバッファ２０と処理実行部３０とメモリ４０とを備え、命令プリフェッチバッファ２０とメモリ４０とがバス４１によって互いに接続されている。図１３には、命令フェッチ部１０に含まれる命令フェッチアドレス生成部１１と、命令プリフェッチバッファ２０として機能する命令キャッシュ２０と、処理実行部３０とが示され、他は図示が省略されている。
【０１００】
処理実行部３０は、命令キュー３１、命令デコーダ３２及び分岐要求部３３を備え、分岐要求部３３は命令フェッチ境界越えカウンタ３４を含んで構成され、命令フェッチアドレス生成部１１に分岐要求と分岐先アドレスと分岐間距離とを供給する。分岐要求部３３は、命令デコーダ３２から供給されるプログラムカウウンタ値ＰＣとデコード結果に基づいて、分岐要求と分岐先アドレスを出力する。このときに供給されるプログラムカウンタ値ＰＣを監視して、分岐の発生なしに命令フェッチの境界を越えた回数を命令フェッチ境界越えカウンタ３４でカウントする。ここで、命令フェッチの境界とは、命令キャッシュ２０のキャッシュラインのアドレス境界である。プログラムカウンタ値ＰＣが分岐の発生なしに順次インクリメントされ、次回の分岐が発生するまでに命令フェッチの境界を越えた回数は、当該分岐先アドレスに対応する分岐間距離であり、適切な命令プリフェッチ回数となる。分岐が発生したときに、分岐要求部３３は、その分岐の分岐先アドレスと分岐要求とを出力し、合せて、命令フェッチ境界越えカウンタ３４のカウント値を分岐間距離として出力し、命令フェッチ境界越えカウンタ３４をリセットする。
【０１０１】
命令フェッチアドレス生成部１１は、図７と同様に、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ制御部８を備え、命令プリフェッチ制御部８は、命令プリフェッチ回数テーブル２と分岐先アドレス保持レジスタ１２とを有するが、命令フェッチ回数計算部１３を備えないで構成されている。分岐が発生したときのテーブル記録の際には、分岐先アドレス保持レジスタ１２に保持される分岐先アドレスと、処理実行部３０から供給される分岐間距離とが、命令プリフェッチ回数テーブル２に書き込まれる。
【０１０２】
他の構成と動作は、図７等を引用した実施形態１と同様であるので、説明を省略する。
【０１０３】
これにより、命令プリフェッチ回数は、分岐要求部３３においてカウンタ３４によって算出されるため、命令フェッチアドレス生成部１１における命令フェッチ回数計算部１３が不要となり、少ない回路規模で正確に命令プリフェッチ回数を学習することができる。
【０１０４】
〔実施形態３〕＜命令フェッチアドレス生成部が命令プリフェッチ回数をカウンタにより算出＞
図１４は、実施形態３の命令フェッチアドレス生成部１１の構成例を示すブロック図である。図１３において分岐要求部３３に設けられていた命令フェッチ境界越えカウンタ３４に代えて、命令フェッチアドレス生成部１１の命令フェッチ制御部８に命令フェッチ回数カウンタ１４を備える。命令フェッチ回数カウンタ１４は、分岐が発生したときにアサートされる分岐要求によってリセットされ、次の分岐が発生するまでの間に、アドレス生成制御部４が要求する命令フェッチ要求アドレスの発行回数をカウントする。分岐が発生したときのテーブル記録の際には、分岐先アドレス保持レジスタ１２に保持される分岐先アドレスと、命令フェッチ回数カウンタ１４のカウント値とが、命令プリフェッチ回数テーブル２に書き込まれる。
【０１０５】
他の構成と動作は、図７等を引用した実施形態１と同様であるので、説明を省略する。
【０１０６】
実施形態２の構成例では、実際に命令デコードされた命令数に基づいて分岐間距離が算出され、学習される命令プリフェッチ回数が求められるのに対して、本実施形態３の構成例では命令プリフェッチ要求が発行された回数に基づいて学習される命令プリフェッチ回数が算出される。命令プリフェッチは実際の命令実行に先立って実行されるのであるから、本実施形態３の構成例で算出される命令プリフェッチ回数は、実施形態２の場合に比べて多くなる場合がある。例えば、本実施形態３の構成例で何回かの命令プリフェッチされたときに、実際には１回目のプリフェッチに含まれる命令で分岐が発生した場合である。本実施形態３の構成例では要求された命令プリフェッチの数が学習される命令プリフェッチ回数となるが、実施形態２の場合には、実際に分岐が発生する１回目のプリフェッチが命令プリフェッチ回数となる。このように、実施形態２の場合より多くの投機的なフェッチリクエストが発生し、投機フェッチが多く行われることで命令キャッシュヒットする機会が増え、実施形態２の場合よりも性能が向上される可能性がある。
【０１０７】
〔実施形態４〕＜静的命令プリフェッチ回数テーブル＞
ここまでは、実際に発生した分岐に基づいて分岐間距離を算出して、分岐先アドレスに対応する命令プリフェッチ回数を適応的に学習する、動的な命令プリフェッチ回数テーブル２を備える実施の形態について主に説明した。しかし、図１に示すプリフェッチ回数テーブル１は、必ずしも動的な命令プリフェッチ回数テーブル２によって構成されなければならないわけではない。
【０１０８】
図１５は、実施形態４の命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令フェッチアドレス生成部１１は、図７と同様に、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ制御部８を備える。命令プリフェッチ制御部８は、命令プリフェッチ回数テーブル２に代えて静的命令プリフェッチ回数テーブル３とセレクタ１５を有するが、図７とは異なり、分岐先アドレス保持レジスタ１２と命令フェッチ回数計算部１３とを備えていない。静的命令プリフェッチ回数テーブル３へのテーブル記録は、データバスアクセスによって行われる。即ち、処理実行部３０によって実行されるストア命令などによって値が書き込まれる。実際に発生した分岐の分岐先アドレスによって、対応する命令プリフェッチ回数が読み出され、アドレス生成制御部４によってフリップフロップ７、セレクタ６及びアドレス加算部５が制御されて、読み出された回数の命令プリフェッチ要求が、命令キャッシュ２０に対して発行される点は、実施形態１で説明した動作と同様である。実際に発生した分岐の分岐先アドレスが静的命令プリフェッチ回数テーブル３にヒットしない場合には、セレクタ１５によってデフォルト（Default）値が供給される。
【０１０９】
これにより、命令フェッチアドレス生成部１１は学習機能を備える必要がない。静的命令プリフェッチ回数テーブル３に書き込む、分岐先アドレスと対応する命令プリフェッチ回数は、例えば、実行されるプログラムの実行形式ファイルをオフラインで解析した結果、各分岐先アドレスとそれに対応する分岐間距離と命令プリフェッチ回数を算出しておき、電源投入シーケンスで静的命令プリフェッチ回数テーブル３に書き込む。或いは、オペレーティングシステムなどのソフトウェアによって動的に監視し、適切な命令プリフェッチ回数を算出して書き込んでもよい。
【０１１０】
〔実施形態５〕＜静的＋動的命令プリフェッチ回数テーブル＞
動的命令プリフェッチ回数テーブル２と静的命令プリフェッチ回数テーブル３の両方を備えて、適宜使い分けても良い。
【０１１１】
図１６は、実施形態５の命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令フェッチアドレス生成部１１は、図１５と同様に、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ制御部８を備え、命令プリフェッチ制御部８は、静的命令プリフェッチ回数テーブル３とセレクタ１５を有し、さらに、分岐間距離検出部１７と動的命令プリフェッチ回数テーブル２とを有する。分岐間距離検出部１７は、実際に発生した分岐の分岐先アドレスに適する命令プリフェッチ回数を算出して、動的命令プリフェッチ回数テーブル２に対するテーブル記録を行う回路であり、実施形態１〜３に示した回路又は他の分岐間距離検出回路であってもよい。セレクタ１５は、動的命令プリフェッチ回数テーブル２から読み出された命令プリフェッチ回数、静的命令プリフェッチ回数テーブル３から読み出された命令プリフェッチ回数、またはデフォルト（Default）値から１つを選択してアドレス生成制御部４に供給する。
【０１１２】
テーブル記録が行われる際、静的命令プリフェッチ回数テーブル３に記録されているタグと一致するエントリを動的命令プリフェッチ回数テーブル２にも記録すると、２重登録となる。この場合、テーブル参照時に一方の内容を優先して参照するか、もしくは、動的命令プリフェッチ回数テーブル２に記録する際に静的命令プリフェッチ回数テーブル３のタグを確認して重複記録を抑制するなどの制御を行うことができる。
【０１１３】
静的命令プリフェッチ回数テーブル３には、例えば予めソフトウェアによりテーブルの内容を設定しておく。分岐要求時は動的命令プリフェッチ回数テーブル２と静的命令プリフェッチ回数テーブル３の両方から命令プリフェッチ回数を読み出し、いずれかをセレクタ１５が選択する。いずれの命令プリフェッチ回数テーブルにもヒットしなければ、セレクタ１５はデフォルト（Default）値を選択する。セレクタ１５での選択は、通常の分岐／割り込み／例外といった分岐の種別などを用いたアルゴリズムを用いて制御されると好適である。割込みや例外ハンドラなどに伴う分岐先アドレスと対応する命令プリフェッチ回数の情報は、割込みや例外ハンドラに対する分岐が頻繁に発生するものではない場合には、動的命令プリフェッチ回数テーブル２からはスピルアウトしてしまう。しかし、静的に分岐間距離が分かるものについて静的命令プリフェッチ回数テーブル２の内容を用いることにより、より効果的に命令プリフェッチ回数を最適化できる。
【０１１４】
なお、実施形態１〜３においては、動的命令プリフェッチ回数テーブル２の初期状態を空とする形態を例示したが、上記のように、静的に分岐間距離が分かるものについては、これを電源投入時に書き込んで初期状態とすることもできる。これにより、動的命令プリフェッチ回数テーブル２が学習する以前の分岐について、必要以上の命令プリフェッチによるバス４１の占有を回避することができる。
【０１１５】
〔実施形態６〕＜命令プリフェッチ回数テーブルはマスク付き連想メモリ＞
図１７は、実施形態６の命令フェッチアドレス生成部１１の構成例を示すブロック図である。命令フェッチアドレス生成部１１は、図１５と同様に、フリップフロップ７、セレクタ６、アドレス加算部５、アドレス生成制御部４、及び、命令プリフェッチ制御部８を備えるが、命令プリフェッチ制御部８とアドレス生成制御部４以外は図示が省略されている。命令プリフェッチ制御部８は、静的命令プリフェッチ回数テーブル３と、複数のエントリヒット判定回路１８と、命令プリフェッチ回数選択回路１６とを有する。
【０１１６】
図１８は、実施形態６の命令フェッチアドレス生成部１１に搭載される静的命令プリフェッチ回数テーブル３の連想メモリによるエントリの構成例を示す説明図である。複数のエントリで構成され、各エントリはそれぞれバリッド（valid）フラグＶ、タグ（Tag）、及び、対応する命令プリフェッチ回数を含み、さらにマスク（Mask）フィールドが追加されている。
【０１１７】
エントリ毎に設けられたエントリヒット判定回路１８は、分岐要求時に分岐先アドレスを入力して静的命令プリフェッチ回数テーブル３を参照する際に、分岐先アドレスとマスク（Mask）フィールドでチェックアドレス（ChkAddr）を生成し、これとタグ（Tag）との一致比較を行う。即ち、入力された分岐先アドレスを構成する各ビットのうち、一部のビットはマスク（Mask）フィールドで無効化（マスク）され、残りの有効なビットがタグと比較される。命令プリフェッチ回数選択回路１６はヒットしたエントリに格納されている命令プリフェッチ回数を選択してアドレス生成制御部４に供給する。
【０１１８】
同じ命令プリフェッチ回数を出力する複数の分岐先アドレスをまとめて１つのエントリに登録することができるため、静的命令プリフェッチ回数テーブル３の回路規模（エントリ数）を少なく抑えることができる。
【０１１９】
〔実施形態７〕＜命令コード生成装置（コンパイラ＋リンカ）＞
図１９は、実施形態７の命令コード生成装置５０の構成例を模式的に示す説明図である。命令コード生成装置５０は、実施形態１〜６で説明したプロセッサ１００で実行されるプログラムの命令コードを生成する装置であって、特に制限されないが例えば、コンパイラ５１とリンカ５２とを備える。コンパイラ５１は、高級言語で記述されたプログラム６１が入力され、オブジェクトファイル６２を生成する。リンカ５２は、コンパイラ５１によって生成されたオブジェクトファイル６２と、命令コード生成装置５０に保持されるライブラリオブジェクトファイル６３から実行形式の命令コード（実行形式ファイル）６４を生成する。
【０１２０】
本実施形態７において、命令コード生成装置５０は、さらに静的命令プリフェッチ回数情報６５を算出して出力する。その算出方法は、例えばアドレスマッピングされた命令コードを解析する方法などである。リンカ５２により、オブジェクトファイル６２に含まれる各ルーチンをアドレス空間にマッピングするときに、それらのルーチンに含まれる分岐命令について、分岐先アドレスからその後初めて別の分岐命令が配置されるアドレスまでの距離を分岐間距離として算出し、これに基づいて静的命令プリフェッチ回数情報６５を算出する。
【０１２１】
算出された静的命令プリフェッチ回数情報６５は、実施形態４〜６で説明したプロセッサ１００に搭載される静的命令プリフェッチ回数テーブル３に書き込まれる。または、実施形態１〜３と５で説明したプロセッサ１００に搭載される動的命令プリフェッチ回数テーブル２に初期値として書き込まれてもよい。
【０１２２】
＜マスク付き連想メモリによる命令プリフェッチ回数テーブルとの連携＞
静的命令プリフェッチ回数テーブル３が、実施形態６で説明したように、マスク（Mask）フィールドを持つ連想メモリで構成される場合には、その特徴を活かすために、命令コード生成装置５０は、以下のような機能を備えると好適である。
【０１２３】
図２０は、リンカ５２によって生成される実行形式ファイル６４の一例を模式的に示す説明図である。リンカ５２にて実行形式ファイル６４を生成する際に、似たサイズ、つまり最適となる命令プリフェッチ回数が同じとなる複数のルーチンを、互いに近いアドレス領域に固めてマッピングする。図示される実行形式ファイル６４は、サイズの小さいルーチンをアドレス下位に、サイズの大きいルーチンをアドレス上位にマッピングした例である。アドレス0x0000、0x0010、0x0020に、それぞれルーチン０（Routine0）、ルーチン１（Routine1）、ルーチン２（Routine2）がマッピングされている。これらのルーチン０〜２（Routine0〜Routine2）は、分岐間距離が１６アドレス未満の小さなルーチンであり、これらに適する命令プリフェッチ回数は、例えば１とされる。アドレス0x0800、0x0840に、それぞれルーチン２０（Routine20）、ルーチン２１（Routine21）がマッピングされている。これらのルーチン２０〜２１（Routine20〜Routine21）は、分岐間距離が１０２４アドレス未満の中程度のルーチンであり、これらに適する命令プリフェッチ回数は、例えば４とされる。さらに、アドレス0x1000、0x1800に、それぞれルーチン５０（Routine50）、ルーチン５１（Routine51）がマッピングされている。これらのルーチン５０〜５１（Routine50〜Routine51）は、分岐間距離が２０２４アドレスに近い大きなルーチンである。
【０１２４】
図２１は、リンカ５２によって生成される静的命令プリフェッチ回数情報６５の一例を模式的に示す説明図である。実行形式ファイル６４のマッピングによって得られる、上記のような命令プリフェッチ回数を、タグ（Tag）フィールドと共に実施形態６で示したマスク（Mask）フィールドを付加して静的命令プリフェッチ回数情報６５として出力する。プログラム実行開始時に実施形態６に示したマスク（Mask）フィールドを持つ静的命令フェッチ回数テーブル３に静的命令プリフェッチ回数情報６５を転送することで、適切な命令プリフェッチを行うことができる。
【０１２５】
図２１に例示される１行目のエントリ、タグ（Tag）＝0x00、マスク（Mask）＝0xFC、命令プリフェッチ回数＝１は、マスク（Mask）＝0xFCによって下位２ビットがマスクされ上位がタグ（Tag）＝0x00である分岐先アドレスにヒットし、命令プリフェッチ回数＝１を出力する。図２０に示される例では、ルーチン０（Routine0）、ルーチン１（Routine1）、ルーチン２（Routine2）の先頭アドレス0x0000、0x0010、0x0020は、それぞれの分岐先アドレスであり、いずれも上記の条件を満たすので、図２１に例示される１行目のエントリにヒットし、命令プリフェッチ回数＝１が読み出される。図２１に例示される２行目のエントリ、タグ（Tag）＝0x08、マスク（Mask）＝0xF8、命令プリフェッチ回数＝４は、マスク（Mask）＝0xF8によって下位３ビットがマスクされ上位がタグ（Tag）＝0x08である分岐先アドレスにヒットし、命令プリフェッチ回数＝４を出力する。図２０に示される例では、ルーチン２０（Routine20）とルーチン２１（Routine21）の先頭アドレス0x0800と0x0840は、それぞれの分岐先アドレスであり、いずれも上記の条件を満たすので、図２１に例示される２行目のエントリにヒットし、命令プリフェッチ回数＝４が読み出される。このように、１行目のエントリには少なくとも３通りの分岐先アドレスに対応する命令プリフェッチ回数が、２行目のエントリには少なくとも２通りの分岐先アドレスに対応する命令プリフェッチ回数が、それぞれまとめて登録されるので、静的命令プリフェッチ回数テーブル３の回路規模（エントリ数）を少なく抑えることができる。
【０１２６】
また、リンカ５２にて実行形式ファイル６４を生成する際に、似たサイズ、つまり最適となる命令プリフェッチ回数が同じとなるルーチンが、互いに近いアドレス領域に固めてマッピングされているので、１エントリに登録できるルーチンの数が最大化される。
【０１２７】
本実施形態では、命令プリフェッチ回数情報６５を生成する機能をリンカ５２に追加した例を示した。このような機能は、一般のリンカに追加されるプラグインソフトウェアとして提供されても良いし、一般のリンカが生成する実行形式ファイル６４が入力される、独立のソフトウェアとして提供されてもよい。
【０１２８】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【０１２９】
例えば、実施形態１〜６で引用するブロック図における機能ブロック分割、及びその機能ブロックに対する命名は、便宜的なものであって、総体として上記要旨を逸脱しない範囲において、機能ブロックに実装される機能を統合、分割又は再編し、これに伴って名称を変更することは、適宜可能である。プロセッサ１００として命令キャッシュとバスとメモリによる構成のみを例示したが、多階層のキャッシュメモリ、命令とデータとを分離しないユニファイドキャッシュ、階層的なバス構成などに変更し、一般にプロセッサに搭載される他の機能ブロックは、適宜自由に搭載可能である。
【符号の説明】
【０１３０】
１  命令プリフェッチ量管理テーブル（命令プリフェッチ回数テーブル）
２  動的命令プリフェッチ回数テーブル
３  静的命令プリフェッチ回数テーブル
４  アドレス生成制御部
５  アドレス加算部
６  セレクタ
７  フリップフロップ
８  命令プリフェッチ制御部
９  命令プリフェッチ回数設定レジスタ
１０  命令フェッチ部
１１  命令フェッチアドレス生成部
１２  分岐先アドレス保持レジスタ
１３  命令フェッチ回数計算部
１４  命令フェッチ回数カウンタ
１５、１６  命令プリフェッチ回数セレクタ
１７  分岐間距離検出部
１８  ヒット判定回路
１９  分岐予測部
２０  命令プリフェッチバッファ（命令キャッシュ部）
２１  データアレイ
２２  制御部
２３  バスリクエストバッファ
３０  処理実行部
３１  命令キュー
３２  命令デコーダ
３３  分岐要求部
３４  命令フェッチ境界越えカウンタ
３５  実行部
４０  メモリ
４１  バス
４２  中継バッファ
５０  命令コード生成装置
５１  コンパイラ
５２  リンカ
６１  ソースプログラム
６２  オブジェクトファイル
６３  ライブラリオブジェクトファイル
６４  実行形式ファイル
６５  静的命令プリフェッチ回数情報
１００  プロセッサ
【図１】
0006457836.tif 000002
【図２】
0006457836.tif 000003
【図３】
0006457836.tif 000004
【図４】
0006457836.tif 000005
【図５】
0006457836.tif 000006
【図６】
0006457836.tif 000007
【図７】
0006457836.tif 000008
【図８】
0006457836.tif 000009
【図９】
0006457836.tif 000010
【図１０】
0006457836.tif 000011
【図１１】
0006457836.tif 000012
【図１２】
0006457836.tif 000013
【図１３】
0006457836.tif 000014
【図１４】
0006457836.tif 000015
【図１５】
0006457836.tif 000016
【図１６】
0006457836.tif 000017
【図１７】
0006457836.tif 000018
【図１８】
0006457836.tif 000019
【図１９】
0006457836.tif 000020
【図２０】
0006457836.tif 000021
【図２１】
0006457836.tif 000022