(57)【特許請求の範囲】
【請求項１】
機械語で記述された命令列であるトレースをコンパイルする情報処理装置が実行するコンパイル方法であって、前記コンパイル方法は、前記情報処理装置が、
前記トレースから中間コードを生成するステップと、
間接分岐命令の基点となるアドレス値と、前記中間コードに含まれる第１の命令の処理直後に前記情報処理装置が参照すべき仮想アドレスが属するメモリページの開始アドレスとのオフセットを算出するステップと、
前記第１の命令に後続する第２の命令である間接分岐命令による移動量を前記オフセットに加算した値を使用して、前記間接分岐命令によって前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移るか否か判断するステップと、
前記判断するステップの結果を用いて前記中間コードを最適化するステップと
を含み、
前記最適化するステップは、
前記第２の命令である間接分岐命令によってページ境界を越えるか否か判断する処理を前記中間コードから削除するステップを含む、コンパイル方法。
【請求項２】
前記最適化するステップは、
前記判断するステップで前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断した場合に、
前記情報処理装置のプログラムカウンタを更新する処理を前記中間コードから削除するステップを含む、請求項１に記載のコンパイル方法。
【請求項３】
前記判断するステップは、
前記オフセットに前記間接分岐命令による移動量を加算した値が０以上かつ前記メモリページの１ページ分のメモリサイズ以下である場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断し、
それ以外の場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移ると判断するステップを含む、請求項１に記載のコンパイル方法。
【請求項４】
前記オフセットを算出するステップは、
前記第１の命令である間接分岐命令の分岐先として予測されるアドレス値の一部から前記移動量を減算して前記オフセットを算出するステップを含む、請求項１に記載のコンパイル方法。
【請求項５】
前記オフセットを算出するステップは、
前記第１の命令である呼び出し型命令の呼出先として予測されるアドレス値の一部を前記オフセットとして算出するステップを含む、請求項１に記載のコンパイル方法。
【請求項６】
前記オフセットを算出するステップは、
前記第１の命令によって越えるページ境界の数と前記メモリページの１ページ分のメモリサイズとの乗算値を前記第１の命令に先行する命令のオフセットから減算して、前記第１の命令のオフセットを算出するステップを含む、請求項１に記載のコンパイル方法。
【請求項７】
前記オフセットを算出するステップは、
前記第１の命令に先行する命令のオフセットから前記メモリページの１ページ分のメモリサイズを減算して、前記オフセットを算出するステップを含む、請求項１に記載のコンパイル方法。
【請求項８】
前記方法は、前記情報処理装置が、コンパイル対象の命令がインデックスレジスタを使用しない間接分岐命令であるか否か判断するステップをさらに含み、
コンパイル対象の命令がインデックスレジスタを使用しない間接分岐命令である場合に、前記情報処理装置が前記判断するステップを実行する、請求項１に記載のコンパイル方法。
【請求項９】
機械語で記述された命令列であるトレースをコンパイルする情報処理装置が実行するコンパイル方法を、前記情報処理装置が実行するためのプログラムであって、前記プログラムは、前記情報処理装置が、
前記トレースから中間コードを生成するステップと、
間接分岐命令の基点となるアドレス値と、前記中間コードに含まれる第１の命令の処理直後に前記情報処理装置が参照すべき仮想アドレスが属するメモリページの開始アドレスとのオフセットを算出するステップと、
前記第１の命令に後続する第２の命令である間接分岐命令による移動量を前記オフセットに加算した値を使用して、前記間接分岐命令によって前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移るか否か判断するステップと、
前記判断するステップの結果を用いて前記中間コードを最適化するステップと
を実行するためのプログラムであって、
前記最適化するステップは、
前記間接分岐命令によってページ境界を越えるか否か判断する処理を前記中間コードから削除するステップを含む、装置実行可能なプログラム。
【請求項１０】
前記最適化するステップは、
前記判断するステップで前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断した場合に、
前記情報処理装置のプログラムカウンタを更新する処理を前記中間コードから削除するステップを含む、請求項９に記載の装置実行可能なプログラム。
【請求項１１】
前記判断するステップは、
前記オフセットに前記間接分岐命令による移動量を加算した値が０以上かつ前記メモリページの１ページ分のメモリサイズ以下である場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断し、
それ以外の場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移ると判断するステップを含む、請求項９に記載の装置実行可能なプログラム。
【請求項１２】
前記オフセットを算出するステップは、
前記第１の命令である間接分岐命令の分岐先として予測されるアドレス値の一部から前記移動量を減算して、前記オフセットを算出するステップと、
前記第１の命令である呼び出し型の呼出先として予測されるアドレス値の一部を前記オフセットとして算出するステップと、
前記第１の命令によって越えるページ境界の数と前記メモリページの１ページ分のメモリサイズとの乗算値を前記第１の命令に先行する命令のオフセットから減算して、前記第１の命令のオフセットを算出するステップと、および／または
前記第１の命令に先行する命令のオフセットから前記メモリページの１ページ分のメモリサイズを減算して、前記第１の命令のオフセットを算出するステップとを含む、請求項９に記載の装置実行可能なプログラム。
【請求項１３】
前記プログラムは、前記情報処理装置が、
コンパイル対象の命令がインデックスレジスタを使用しない間接分岐命令であるか否か判断するステップをさらに含み、
コンパイル対象の命令がインデックスレジスタを使用しない間接分岐命令である場合に、前記情報処理装置が前記判断するステップを実行するための、請求項９に記載の装置実行可能なプログラム。
【請求項１４】
機械語で記述された命令列であるトレースをコンパイルする情報処理装置であって、
前記トレースから中間コードを生成するインタープリタと、前記中間コードをコンパイルする動的コンパイラとを備え、
前記動的コンパイラは、
間接分岐命令の基点となるアドレス値と、前記中間コードに含まれる第１の命令の処理直後に前記情報処理装置が参照すべき仮想アドレスが属するメモリページの開始アドレスとのオフセットに、前記第１の命令に後続する第２の命令である間接分岐命令による移動量を加算した値を使用して、前記間接分岐命令によって前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移るか否か判断し、前記判断の結果を用いて前記中間コードを最適化する最適化処理部を備え、
前記最適化処理部は、前記間接分岐命令によってページ境界を越えるか否か判断する処理を前記中間コードから削除する、情報処理装置。
【請求項１５】
前記最適化処理部は、
前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断した場合に、前記情報処理装置のプログラムカウンタを更新する処理を前記中間コードから削除する、請求項１４に記載の情報処理装置。
【請求項１６】
前記最適化処理部は、
前記オフセットに前記間接分岐命令による移動量を加算した値が０以上かつ前記メモリページの１ページ分のメモリサイズ以下である場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移らないと判断し、
それ以外の場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移ると判断する、請求項１４に記載の情報処理装置。
【請求項１７】
前記最適化処理部は、
前記第１の命令である間接分岐命令の分岐先として予測されるアドレス値の一部から前記移動量を減算して、前記オフセットを算出し、
前記第１の命令である呼び出し型の呼出先として予測されるアドレス値の一部を前記オフセットとして算出し、
前記第１の命令に先行する命令のオフセットから前記第１の命令によって越えるページ境界の数と前記メモリページの１ページ分のメモリサイズとの乗算値を減算して、前記第１の命令のオフセットを算出し、または
前記第１の命令に先行する命令のオフセットから前記メモリページの１ページ分のメモリサイズを減算して、前記第１の命令のオフセットを算出する、請求項１４に記載の情報処理装置。
【請求項１８】
前記最適化処理部は、
コンパイル対象の命令がインデックスレジスタを使用しない間接分岐命令である場合に、前記間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移るか否か判断する、請求項１４に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行時にコンパイルする動的コンパイル処理の最適化技術に関し、より詳細には、動的コンパイラがコンパイルコードを最適化するコンパイル方法、プログラムおよび情報処理装置に関する。
【背景技術】
【０００２】
従来、コンピュータの動作をエミュレートする仮想マシン（ＶＭ（Virtual Machine））が利用されている。このような仮想マシンには、インタープリタが機械語コードを低速実行し、動的コンパイラが当該機械語で記述された命令列であるトレースから中間コードを生成し、最適化を施してコンパイルコードを生成し、インタープリタがコンパイルコードを実行するものがある。
【０００３】
通常、コンパイル対象の機械語コードには、相対分岐命令や間接分岐命令などの種々の分岐命令が含まれている。相対分岐命令は、当該相対分岐命令のアドレスからの差分で分岐先を指定する命令であり、間接分岐命令は、ＣＰＵ等のプロセッサが内蔵するレジスタの値と、当該レジスタの値との差分で分岐先を指定する命令である。
【０００４】
間接分岐命令で使用するレジスタの値は、プログラムの実行時によって異なる。また、仮想マシンが行う物理アドレスから仮想アドレスへのマッピングでは、仮想メモリにマッピングされた仮想アドレスは、プログラムの実行時によって異なる。このため、コンパイル対象の機械語コードに間接分岐命令が含まれる場合には、当該間接分岐命令の分岐先として予測したアドレスが、コンパイルコードの実行時に実際に分岐するメモリアドレスと同一であるか確認する必要がある。
【０００５】
この点につき、特許文献１は、実際の分岐先のメモリアドレスと、分岐先として予測したメモリアドレスとが同一であるか確認するガードコードを利用するコンパイルの最適化方法を開示する。このような従来の最適化方法では、例えば、図８に示すようなガードコードをコンパイルコードに埋め込み、コンパイルコードの実行時に実際の分岐先のメモリアドレスと分岐先として予測したメモリアドレスとが同一であるか確認する。
【０００６】
具体的には、図８に示すガードコードでは、分岐先の仮想アドレスページ（branch-target-virtual-address&~0xfff）と現在の仮想アドレスページ（current-virtual-pc&~0xfff）が同一であるか判断することにより、間接分岐によって処理がページ境界を越える否か判断する。
【０００７】
ページ境界を越えない場合には、分岐先の仮想アドレスのページオフセットアドレス（branch-target-virtual-address & 0xfff）と、当該間接分岐命令の分岐先として予測された分岐アドレスのページオフセットアドレス（next-physical-pc-on-trace & 0xfff）とが同一であるか判断する。これらのアドレスが同一、すなわち、分岐予測が成功した場合には、コンパイルコードの実行を継続する。一方、ページオフセットアドレスが異なる場合には、コンパイルコードの実行を終了する（side-exit trace）。
【０００８】
一方、間接分岐によって処理がページ境界を越える場合には、実際の分岐先である仮想アドレスを当該仮想アドレスに対応する物理アドレスに変換し、当該物理アドレスが、分岐先として予測した物理アドレスと同一であるか判断する。これらのアドレスが同一であればコンパイルコードの実行を継続し、これらのアドレスが異なる場合には、コンパイルコードの実行を終了する（side-exit trace）。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００２−２５９１３５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、特許文献１に示す最適化方法は、間接分岐命令の分岐先として予測したアドレスと実際に分岐するメモリアドレスとが一致するか確認するガードコードをコンパイルコードに埋め込む必要があり、コンパイルコードを実行する度に、当該ガードコードによってＣＰＵ負荷が増大してプログラムの実行処理が遅延する虞があると共に、メモリを浪費するという問題があった。
【００１１】
本発明は上記の課題を解決するものであり、コンパイル対象である機械語コードに間接分岐命令が含まれる場合に、コンパイルコードに埋め込む必要のあるガードコードを削減し、ＣＰＵ負荷の軽減およびメモリ消費量の低減を可能にするコンパイル方法、プログラムおよび情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
すなわち、本発明によれば、機械語で記述された命令列であるトレースをコンパイルする情報処理装置が実行するコンパイル方法が提供される。このコンパイル方法は、情報処理装置が、トレースから中間コードを生成するステップと、間接分岐命令の基点となるアドレス値と、中間コードに含まれる第１の命令の処理直後に情報処理装置が参照すべき仮想アドレスが属するメモリページの開始アドレスとのオフセットを算出するステップと、第１の命令に後続する第２の命令である間接分岐命令による移動量を加算した値をオフセットに使用して、間接分岐命令によって間接分岐命令が割り当てられたメモリページから別のメモリページに処理が移るか否か判断するステップと、当該判断するステップの結果を用いて中間コードを最適化するステップとを含み、最適化するステップは、第２の命令である間接分岐命令によってページ境界を越えるか否か判断する処理を前記中間コードから削除するステップを含む。
【発明の効果】
【００１３】
本発明は上記構成を採用することにより、コンパイル対象である機械語コードに間接分岐命令が含まれる場合に、コンパイルコードに埋め込む必要のあるガードコードを削減することができ、ＣＰＵ負荷の軽減およびメモリ消費量の低減することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明のプログラムを実行する情報処理装置のハードウェア構成および機能構成を示す図。
【図２】図１に示す情報処理装置が実行する処理の一実施形態を示すフローチャート。
【図３】本発明の動的コンパイラが実行する最適化処理を示すフローチャート。
【図４】本発明の動的コンパイラが実行する最適化処理を示すフローチャート。
【図５】本発明の動的コンパイラが実行する変数設定処理を示すフローチャート。
【図６】本発明の仮想マシンが行う物理メモリおよび仮想メモリのマッピングの一実施形態を示す概念図。
【図７】本発明の仮想マシンが行う物理メモリおよび仮想メモリのマッピングの別の実施形態を示す概念図。
【図８】従来のコンパイル処理で使用されるガードコードを示す図。
【発明を実施するための形態】
【００１５】
以下、本発明について実施形態をもって説明するが、本発明は、後述する実施形態に限定されるものではない。図１は、本発明のプログラムを実行する情報処理装置１００のハードウェア構成および機能構成を示す図である。以下、図１を参照して、情報処理装置１００について説明する。
【００１６】
情報処理装置１００は、ＪＡＶＡ（登録商標）、ＪＡＶＡ  ＳＣＲＩＰＴ（登録商標）、Ｃ、Ｃ＋＋、アセンブラ、ＰＥＲＬ、ＰＨＰ、ＲＵＢＹ、ＰＹＴＨＯＮなどの種々のプログラム言語で記述されたプログラムを実行可能な情報処理装置である。
【００１７】
情報処理装置１００は、後述するＯＳの管理下で、上記プログラミング言語などで記述された装置読み取り可能な本発明のプログラムを実行することにより、後述する各機能を情報処理装置１００上に実現する。
【００１８】
情報処理装置１００は、プロセッサ１１０と、主記憶装置１１２と、補助記憶装置１３２とを含んで構成される。
【００１９】
プロセッサ１１０は、情報処理装置１００の全体制御を行うＣＰＵ（Central Processing Unit）やＭＰＵ（Micro Processing Unit）等の演算処理装置である。プロセッサ１１０は、主記憶装置１１２の物理アドレスを保持するレジスタ（図示せず）を備えている。主記憶装置１１２は、本発明のプログラムを実行するためのメモリ空間を提供するＲＡＭ等の記憶装置である。補助記憶装置１３２は、プログラムやデータなどを持続的に保持するハードディスク装置（ＨＤＤ）やフラッシュメモリなどの記憶装置である。
【００２０】
プロセッサ１１０は、補助記憶装置１３２から本発明のプログラムを読み出し、主記憶装置１１２に展開して実行することにより、ＯＳ（Operating System）１１４および仮想マシン１１６を主記憶装置１１２に展開する。
【００２１】
ＯＳ１１４は、情報処理装置１００が有する基本的な機能を提供するソフトウェアである。本実施形態では、Ｗｉｎｄｏｗｓ（登録商標）７、Ｗｉｎｄｏｗｓ  Ｖｉｓｔａ（登録商標）、Ｗｉｎｄｏｗｓ  ＸＰ（登録商標）、Ｗｉｎｄｏｗｓ２００Ｘ  Ｓｅｒｖｅｒ（登録商標）等のＷｉｎｄｏｗｓ（登録商標）シリーズ、Ｍａｃ  ＯＳ（登録商標）、ＵＮＩＸ（登録商標）、ＬＩＮＵＸ（登録商標）などの種々のＯＳを採用することができる。
【００２２】
仮想マシン１１６は、機械語コードの低速実行（interpret）、機械語コードのコンパイルおよびコンパイルコードの実行を行うエミュレータである。仮想マシン１１６は、インタープリタ１１８と、動的コンパイラ１２４と、コードキャッシュ１３０とを含んで構成される。
【００２３】
インタープリタ１１８は、処理対象の機械語コードおよびコンパイルコードを実行するソフトウェアモジュールであり、低速実行部１２０と、実行部１２２とを含んで構成される。
【００２４】
低速実行部１２０は、処理対象の機械語コードを低速に実行する。また、低速実行部１２０は、実行した機械語コードの命令列と、低速実行時に得られる機械語コードに含まれる間接分岐命令の分岐先を示す分岐アドレスを主記憶装置１１２に保存する。
【００２５】
実行部１２２は、動的コンパイラ１２４が生成したコンパイルコードを保存するメモリ領域であるコードキャッシュ１３０から当該コンパイルコードを取得して実行する。
【００２６】
動的コンパイラ１２４は、動的コンパイルを行うコンパイラである。動的コンパイラ１２４は、中間コード生成部１２６と、最適化処理部１２７と、コンパイル部１２８とを含んで構成される。本実施形態では、動的コンパイラ１２４としてＪＩＴコンパイラを採用することができる。
【００２７】
中間コード生成部１２６は、インタープリタ１１８が主記憶装置１１２に保存した機械語コードから中間コードを生成する。この中間コードには、図８に示すようなガードコードが含まれる。
【００２８】
最適化処理部１２７は、中間コード生成部１２６が生成した中間コードに対して最適化処理を施す。最適化処理部１２７は、中間コードに最適化処理を施すことにより、コンパイルコードに埋め込む必要のあるガードコードをできるだけ削除する。なお、最適化処理部１２７が実行する最適化処理については、図３、図４および図５を参照して詳細に説明する。
【００２９】
コンパイル部１２８は、最適化処理を施した中間コードをコンパイルしてコンパイルコードを生成し、当該コンパイルコードを保存すべきメモリ領域であるコードキャッシュ１３０に保存する。
【００３０】
図２は、図１に示す情報処理装置が実行する処理の一実施形態を示すフローチャートである。以下、図２を参照して、情報処理装置１００が実行する処理について説明する。
【００３１】
図２の処理は、ステップＳ２００から開始し、ステップＳ２０１では、仮想マシン１１６のインタープリタ１１８の低速実行部１２０が、処理対象の機械語コードを補助記憶装置１３２から読み出し、或る決定ポイント（例えば、後方分岐命令等）から次の決定ポイントまで当該機械語コードを低速に実行する。ステップＳ２０２では、インタープリタ１１８の実行部１２２が、コードキャッシュ１３０を参照し、次の命令から始まるコンパイルコードが存在するか否か判断する。コンパイルコードが存在する場合には（ｙｅｓ）、処理をステップＳ２０３に分岐する。ステップＳ２０３では、実行部１２２が、コードキャッシュ１３０に保存されたコンパイルコードを実行する。
【００３２】
一方、ステップＳ２０２でコンパイルコードが存在しないと判断した場合には（ｎｏ）、処理をステップＳ２０４に分岐する。ステップＳ２０４では、低速実行部１２０は、現在の決定ポイントをステップＳ２０１で実行した通算回数が所定の閾値を超えたか否か判断する。決定ポイントの数が所定の閾値を超えない場合には（ｎｏ）、処理をステップＳ２０１に戻す。本実施形態では、所定の閾値として、動的コンパイラ１２４が使用する任意の定数であるマジックナンバーが使用される。
【００３３】
一方、決定ポイントの数が所定の閾値を超える場合には（ｙｅｓ）、処理をステップＳ２０５に分岐する。ステップＳ２０５では、低速実行部１２０は、次の決定ポイントまで機械語コードを低速実行すると共に、間接分岐命令を低速実行した際の実際の分岐アドレスと、実行した機械語コードの命令列とを主記憶装置１１２に保存する。
【００３４】
ステップＳ２０６では、動的コンパイラ１２４が、低速実行部１２０が保存した機械語コードの命令列を主記憶装置１１２から取得し、中間コードを生成する。ステップＳ２０７では、動的コンパイラ１２４は、図３に示す最適化処理を当該中間コードに施す。ステップＳ２０８では、動的コンパイラ１２４は、最適化処理を施した中間コードをコンパイルしてコンパイルコードを生成し、当該コンパイルコードをコードキャッシュ１３０に保存し、ステップＳ２０１以降の処理が実行される。
【００３５】
図３は、本発明の動的コンパイラが実行する最適化処理を示すフローチャートである。以下、図３を参照して、動的コンパイラ１２４が実行する中間コードの最適化処理について説明する。
【００３６】
図３の処理はステップＳ３００から開始し、ステップＳ３０１で動的コンパイラ１２４の最適化処理部１２７が、最適化するＨＷイベントＸ毎に用意される変数（hw-event-X-page-updated）を「false」で初期化する。ステップＳ３０２では、最適化処理部１２７は、変数（code-base-register）を無効値「−１」で初期化する。ステップＳ３０３では、最適化処理部１２７は、中間コードに含まれる１の命令をフェッチする。ステップＳ３０４では、最適化処理部１２７は、フェッチした１の命令について、図４に示す命令単位の最適化処理を実行する。ステップＳ３０５では、最適化処理部１２７は、フェッチした１の命令について、図５に示す変数設定処理を実行する。
【００３７】
ステップＳ３０６では、最適化処理部１２７は、フェッチすべき次の命令が存在するか否か判断する。フェッチすべき次の命令が存在する場合には（ｙｅｓ）、処理をステップＳ３０４に戻す。一方、フェッチすべき次の命令が存在しない場合には（ｎｏ）、ステップＳ３０７に処理を分岐して終了する。
【００３８】
図４は、本発明の動的コンパイラが実行する最適化処理を示すフローチャートである。以下、図４を参照して、動的コンパイラ１２４が実行する命令単位の中間コードの最適化処理について説明する。
【００３９】
図４の処理は、ステップＳ４００から開始し、ステップＳ４０１で動的コンパイラ１２４が、処理対象の命令によって現在の仮想アドレスの保存を要求するＨＷイベントが生成されるか判断する。このＨＷイベントは、現在の仮想アドレスを保存させるイベントであり、仮想マシン１１６がエミュレートしているＨＷで発生する。例えば、ｚ／Ａｒｃｈｉｔｅｃｔｕｒｅの場合では、インデックスレジスタを使用しない成立した間接分岐命令（taken indirect branch with no index-register）、成立した相対分岐命令（taken relative branch instruction）、インデックスレジスタを使用した間接分岐命令（taken indirect branch with index register）等の分岐命令によってＨＷイベントが発生する。
【００４０】
ステップＳ４０１の判定でＨＷイベントが生成されないと判断した場合には（ｎｏ）、処理をステップＳ４０５に分岐する。一方、ステップＳ４０１の判定でＨＷイベントが生成されると判断した場合には（ｙｅｓ）、処理をステップＳ４０２に分岐する。ステップＳ４０２では、動的コンパイラ１２４は、変数（hw-event-X-page-updated）の値が「ｔｒｕｅ」であるか否か判断する。変数（hw-event-X-page-updated）の値が「ｔｒｕｅ」である場合には（ｙｅｓ）、処理をステップＳ４０３に分岐する。
【００４１】
ステップＳ４０３では、動的コンパイラ１２４は、中間コード生成部１２６が生成した中間コードから２回目以降のＨＷイベントの仮想ページを更新するコードを省略する。ＨＷイベントの仮想ページを更新するコードとは、エミュレートしているＣＰＵの内部データ領域を表すメモリアドレスに仮想ページアドレスを保存する処理であり、当該ＨＷイベントを発生する命令がエミュレートされるタイミングで実行される。
【００４２】
一方、変数（hw-event-X-page-updated）の値が「ｔｒｕｅ」でない場合には（ｎｏ）、ステップＳ４０４に処理を分岐する。ステップＳ４０４では、動的コンパイラ１２４は、変数（hw-event-X-page-updated）に「ｔｒｕｅ」を設定する。
【００４３】
ステップＳ４０５では、動的コンパイラ１２４は、処理対象の命令がインデックスレジスタを使用しない成立した間接分岐命令（taken indirect branch）であるか否か判断する。
【００４４】
ここで、間接分岐命令は、１または複数のレジスタの値と所定の移動量とを加算して分岐先のアドレスを算出する分岐命令である。間接分岐命令には、１のレジスタ（ベースレジスタ）の値と所定の移動量とを加算して分岐先のアドレスを算出する分岐命令と、ベースレジスタおよび他のレジスタ（インデックスレジスタ）の値と所定の移動量とを加算して分岐先のアドレスを算出する分岐命令とある。本発明では、前者の間接分岐命令を、インデックスレジスタを使用しない間接分岐命令とし、後者の間接分岐命令を、インデックスレジスタを使用する間接分岐命令とする。また、ベースレジスタのうち間接分岐命令で使用されるベースレジスタをコードベースレジスタとする。
【００４５】
処理対象の命令がインデックスレジスタを使用しない成立した間接分岐である場合には（ｙｅｓ）、ステップＳ４０６に処理を分岐する。ステップＳ４０６では、動的コンパイラ１２４は、当該間接分岐命令で使用されるベースレジスタのレジスタ番号（base-register）の値と、図５に示す変数設定処理で設定される変数（code-base-register）値とが一致するか否か判断する。これらが一致する場合には（ｙｅｓ）、ステップＳ４０７に処理を分岐する。一方、これらの変数が一致しない場合には（ｎｏ）、処理をステップＳ４１１に分岐する。
【００４６】
ステップＳ４０７では、動的コンパイラ１２４は、図５に示す変数設定処理で設定される変数（code-base-register-offset）の値に所定の移動量（displacement）を加算して得られた値が、０以上かつ仮想ページの１ページ分のメモリサイズである「０ｘ１０００」よりも小さいか否か判断することにより、処理対象の命令によってページ境界を越えないか判断することができる。具体的には、動的コンパイラ１２４は、当該加算によって得られた値が０以上かつ０ｘ１０００よりも小さい場合にはページ境界を越えないと判断し、当該値が０未満または０ｘ１０００以上である場合にはページ境界を越えると判断する。なお、本実施形態では、ページサイズを「０ｘ１０００」としているが、ページサイズはアーキテクチャに依存して任意のサイズを採り得ることに留意すべきである。
【００４７】
ページ境界を越えない場合には（ｙｅｓ）、処理をステップＳ４０８に分岐し、動的コンパイラ１２４が出力するガードコードを省略して最適化を行い、ステップＳ４１２で処理が終了する。
【００４８】
本実施形態では、コンパイル時に動的コンパイラ１２４が、ステップＳ４０７に示すように上記変数（code-base-register-offset）の値と所定の移動量とを加算して得られる値を用いて、間接分岐命令によってページ境界を越えた分岐が成されるか否か判断するため、ステップＳ４０８に示す最適化処理では、動的コンパイラ１２４が出力するガードコードから、間接分岐によってページ境界を越えるか否か判定する処理を省略することができる。具体的には、図８に示すガードコードに含まれる分岐先の仮想アドレスページ（branch-target-virtual-address&~0xfff）と現在の仮想アドレスページ（current-virtual-pc&~0xfff）とを比較する処理を省略することができる。
【００４９】
また、ステップＳ４０８に示す最適化処理では、図５に示す変数設定処理で設定した変数（code-base-register）が示すレジスタ番号のレジスタの下位１２ｂｉｔは、定数であることが保証されているため、動的コンパイラ１２４が出力するガードコードからページオフセットアドレスを比較する処理を省略することができる。具体的には、図８に示すガードコードに含まれる分岐先の仮想アドレスの下位１２ｂｉｔ（branch-target-virtual-address&0xfff）と、分岐先として予測された分岐アドレスの下位１２ｂｉｔ（next-physical-pc-on-trace&0xfff）とを比較する処理を省略することができる。
【００５０】
さらに、ステップＳ４０７の処理の結果、同一の仮想ページ内での分岐であることが判明しているため、ステップＳ４０８に示す最適化処理では、中間コード生成部１２６が生成した中間コードから、エミュレートしているＣＰＵのプログラムカウンタの仮想ページアドレス部分を分岐先の仮想ページアドレス部分に更新する処理を省略することができる。
【００５１】
一方、ステップＳ４０７の判定でページ境界を越えると判断した場合には（ｎｏ）、ステップＳ４０９に処理を分岐する。ステップＳ４０９では、動的コンパイラ１２４が出力するガードコードを省略して最適化を行う。
【００５２】
具体的には、ステップＳ４０９の最適化処理では、動的コンパイラ１２４が出力するガードコードから、間接分岐命令によってページ境界を越えた分岐が成されるか否か判断する処理を省略する。上述したように、ステップＳ４０７に示すように上記変数（code-base-register-offset）の値と所定の移動量とを加算して得られる値を用いて、間接分岐命令によってページ境界を越えた分岐が成されるか否か判断するため、当該処理を省略することができる。
【００５３】
また、ステップＳ４０９の最適化処理では、動的コンパイラ１２４が出力するガードコードに含まれる分岐先アドレスの変換処理および分岐アドレスの評価処理を、分岐先アドレスページの変換処理および分岐先アドレスページの評価処理に変換する。
【００５４】
具体的には、図８に示す従来のガードコードの分岐先アドレスの変換処理（translate branch-target-virtual-address to branch-target-physical-address）および分岐アドレスの評価処理（branch-target-physical-address==next-physical-pc-on-trace）を、分岐先の仮想アドレスページを分岐先の物理アドレスページに変換する分岐先アドレスページの変換処理（translate branch-target-virtual-page-address to branch-target-physical-page-address）および当該物理アドレスページが予測された分岐先アドレスページと同一であるか否か判断する分岐先アドレスページの評価処理（branch-target-physical-page-address==next-physical-pc-on-trace&~0xfff）に変換する。
【００５５】
より詳細には、従来のガードコードの分岐先アドレスの変換処理（translate branch-target-virtual-address to branch-target-physical-address）は、分岐先アドレスページの変換処理（translate branch-target-virtual-page-address to branch-target-physical-page-address）と、分岐先の物理アドレスページに分岐先の仮想アドレス（下位１２ｂｉｔ）を換算した値を分岐先アドレスの物理アドレスとする処理（branch-target-physical-address = branch-target-physical-page-address + (branch-target-virtual-address&0xfff))とである。そして、分岐アドレスの評価処理（branch-target-physical-address==next-physical-pc-on-trace）では、下位１２ｂｉｔの値も比較する。ここで、変数（code-base-register）が示すレジスタ番号のレジスタの下位１２ｂｉｔが定数であるため、従来のガードコードで行う必要のあるページオフセット部分の変換処理（branch-target-physical-address = branch-target-physical-page-address + (branch-target-virtual-address&0xfff))と、ページオフセット部分の評価処理（branch-target-physical-address==next-physical-pc-on-trace）が不要となる。
【００５６】
一方、ステップＳ４０５の判定で処理対象の命令がインデックスレジスタを使用しない成立した間接分岐でないと判断した場合には（ｎｏ）、ステップＳ４１０に処理を分岐する。ステップＳ４１０では、動的コンパイラ１２４は、処理対象の命令が（１）ページ境界を越える相対分岐命令、（２）ページの終端に存在する命令、（３）変数（hw-event-X-page-updated）に影響を及ぼすシステム命令（例えば、アドレスのサイズ（３２ｂｉｔや６４ｂｉｔ）を変更するアドレスモード変更等）、または（４）インデックスレジスタを使用した成立した間接分岐命令のいずれかに該当するか否か判断する。
【００５７】
ページ境界を越える相対分岐命令であるか否かは、当該相対分岐命令の物理アドレスに当該分岐命令による移動量を加算し、ページ境界を越えるか否か判断することによって判断することができる。
【００５８】
ステップＳ４１０の判定で処理対象の命令がこれらの命令に該当すると判断した場合には（ｙｅｓ）、ステップＳ４１１に処理を分岐する。ステップＳ４１１では、変数（hw-event-X-page-updated）を「false」で初期化する。
【００５９】
一方、ステップＳ４１０の判定で処理対象の命令がこれらの命令に該当しないと判断した場合には（ｎｏ）、ステップＳ４１２に分岐して処理が終了する。
【００６０】
図５は、本発明の動的コンパイラが実行する変数設定処理を示すフローチャートである。以下、図５を参照して、動的コンパイラ１２４が、図４に示す最適化処理で使用する変数を設定する変数設定処理について説明する。
【００６１】
図５に示す処理はステップＳ５００から開始し、ステップＳ５０１で動的コンパイラ１２４は、処理対象の命令の種類によって処理を分岐する。処理対象の命令が、インデックスレジスタの値を使用しないで分岐先アドレスを算出する成立した間接分岐命令（例えば、ｚ／Ａｒｃｈｉｔｅｃｔｕｒｅで使用される機械語命令であるＢＣ（Branch On Condition）等の条件付き分岐）である場合には、ステップＳ５０２に処理を分岐する。
【００６２】
ステップＳ５０２では、動的コンパイラ１２４は、コードベースレジスタの値を設定すべき変数（code-base-register）に、当該間接分岐命令のベースレジスタのレジスタ番号（base-register）を設定する。そして、動的コンパイラ１２４は、インタープリタ１１８が低速実行して主記憶装置１１２に保存した当該間接分岐命令の分岐先である予測された分岐アドレス（next-physical-pc-on-trace）の下位１２ｂｉｔの値から所定の移動量（displacement）を減算した値を変数（code-base-register-offset）に代入し、ステップＳ５０７に分岐して処理が終了する。変数（code-base-register-offset）は、間接分岐命令の基点となるアドレス値と、コンパイル対象である命令の処理直後に情報処理装置１００が参照すべき仮想アドレスが属するメモリページの開始アドレスとのオフセットである。この変数は、上述したステップＳ４０７において処理対象の命令によってページ境界を越えないか判断する処理で使用される。
【００６３】
また、ステップＳ５０１の判定で処理対象の命令が、不成立の呼び出し型（non-taken-call-type）の命令（例えば、ｚ／Ａｒｃｈｉｔｅｃｔｕｒｅで使用される機械語命令であるＢＡＬＲ等）であると判断した場合には、ステップＳ５０３に処理を分岐する。不成立の呼び出し型（non-taken-call-type）の命令とは、分岐先に分岐せず、戻りアドレスをレジスタにロードする命令である。
【００６４】
ステップＳ５０３では、動的コンパイラ１２４は、呼び出し命令のパラメータであるリターンアドレスが設定されるリターンレジスタのレジスタ番号（return-register）を変数（code-base-register）に設定する。そして、動的コンパイラ１２４は、リターンレジスタに設定される戻りアドレスの下位１２ｂｉｔ（next-physical-pc-on-trace&0xfff）の値を変数（code-base-register-offset）に代入し、ステップＳ５０７に分岐して処理が終了する。
【００６５】
さらに、ステップＳ５０１の判定で処理対象の命令が、成立した相対分岐命令（例えば、ｚ／Ａｒｃｈｉｔｅｃｔｕｒｅで使用される機械語命令であるＢＲＣ（Branch Relative on Condition）等）であると判断した場合には、ステップＳ５０４に処理を分岐する。ステップＳ５０４では、動的コンパイラ１２４は、関数page-increment-by-((current-physical-pc-on-trace&0xfff）+displacement）を使用して、当該相対分岐命令によって越えたページ境界の数と、当該仮想ページの１ページ分のメモリサイズとの乗算値を算出する。そして、動的コンパイラ１２４は、変数（code-base-register-offset）に設定されている値から当該乗算値を減算して得られた値を変数（code-base-register-offset）に代入し、ステップＳ５０７に分岐して処理が終了する。
【００６６】
さらに、ステップＳ５０１の判定で処理対象の命令がページの終端に存在する命令であると判断した場合には、ステップＳ５０５に処理を分岐する。ステップＳ５０５では、動的コンパイラ１２４は、変数（code-base-register-offset）から仮想ページの１ページ分のメモリサイズ（例えば、０ｘ１０００）を減算した値を変数（code-base-register-offset）に代入し、ステップＳ５０７に分岐して処理が終了する。
【００６７】
さらに、ステップＳ５０１の判定で処理対象の命令が、（１）インデックスレジスタの値を使用して分岐先アドレスを算出する成立した間接分岐命令、（２）コードベースレジスタの値を変更する命令、または（３）コードベースレジスタの値に影響を及ぼすシステム命令のいずれかに該当すると判断した場合には、ステップＳ５０６に処理を分岐する。ステップＳ５０６では、動的コンパイラ１２４は、変数（code-base-register）を無効値「−１」で初期化する。
【００６８】
さらに、ステップＳ５０１の判定で処理対象の命令が、その他の命令である場合には、ステップＳ５０７に分岐して処理が終了する。
【００６９】
図６は、本発明の仮想マシンが行う物理メモリおよび仮想メモリのマッピングの一実施形態を示す概念図である。以下、図６を参照して、仮想マシンがエミュレートするシステムの物理メモリ６００および仮想メモリ６２０のマッピングについて説明する。
【００７０】
トレース６０２は、インタープリタ１１８が低速実行して主記憶装置１１２保存した命令列であり、動的コンパイラ１２４のコンパイル対象である。図６に示す実施形態では、物理メモリ６００上の物理アドレス（０ｘ：４５６０００）および物理アドレス（０ｘ：７８９０００）が、仮想メモリ６２０のメモリ領域である仮想ページ６２２の開始アドレス（０ｘ：ｘｘｘ０００）および仮想ページ６２４の開始アドレス（０ｘ：ｙｙｙ０００）にマッピングされる（ここで、ｘ,ｙは任意の数である）。なお、割り当てられるメモリアドレスは、プログラムの実行時によって異なる。また、図６に示す実施形態では、仮想ページ６２２および仮想ページ６２４は連続する。
【００７１】
図６に示すトレース６０２は、インタープリタ１１８が低速実行して保存した命令列である。トレース６０２には、各命令と当該命令がロードされた物理メモリ６００の物理アドレスとが含まれる。物理メモリ６００の物理アドレス（０ｘ：１２３０００）は、トレース６０２の開始位置６０４であり、インタープリタ１１８が保存した命令列のうち最初の命令がロードされる。
【００７２】
物理アドレス（０ｘ：１２３１００）には、第１の間接分岐命令（ＢＣ  ０ｘｆ，０ｘ５００（Ｒ１５））６０６がロードされており、当該命令が実行されることにより、仮想メモリ６２０上では、当該間接分岐命令のパラメータであるベースレジスタの設定値「Ｒ１５」が示す仮想アドレスと、移動量「０ｘ５００」とを加算した値である仮想アドレスに処理が分岐する。図６に示す本施形態では、「Ｒ１５」に仮想アドレス（０ｘ：ｘｘｘ３００）が設定されていると仮定する。このため、当該間接分岐命令によって仮想アドレス（０ｘ：ｘｘｘ８００）に処理が分岐する。すなわち、当該間接分岐命令によって、予測された分岐先アドレスである物理アドレス（０ｘ：４５６８００）に処理が分岐する。なお、「Ｒ１５」に設定される仮想アドレスは、実行によって異なる。
【００７３】
また、物理メモリ６００の物理アドレス（０ｘ：４５６９００）には、第２の間接分岐命令（ＢＣＴＧ  Ｒ１，０ｘ１９００（Ｒ１５））６０８がロードされており、当該間接分岐命令６０８が実行されることにより、仮想メモリ６２０上では、間接分岐命令６０８のパラメータであるコードベースレジスタの設定値「Ｒ１５」が示す仮想アドレス（０ｘ：ｘｘｘ３００）と、移動量「０ｘ１９００」とを加算した値である仮想アドレス（０ｘ：ｙｙｙｃ００）に処理が分岐する。
【００７４】
本実施形態では、仮想ページ６２２および仮想ページ６２４は連続しており、また、仮想ページ６２２のメモリサイズは「０ｘ：１０００」であるため、仮想アドレス（０ｘ：ｘｘｘ３００）に移動量「０ｘ：１９００」を加算した値は、「０ｘ：ｙｙｙｃ００」となる。したがって、間接分岐命令６０８によって、仮想ページ６２２の仮想アドレス（０ｘ：ｘｘｘ９００）から仮想ページ６２４の仮想アドレス（０ｘ：ｙｙｙｃ００）に処理が移る。すなわち、当該間接分岐命令によって、予測された分岐先アドレスである物理アドレス（０ｘ：７８９ｃ００）に処理が分岐する。
【００７５】
さらに、物理メモリ６００の物理アドレス（０ｘ：７８９ｃ８０）には、第３の間接分岐命令（ＢＣＴＧ  Ｒ２，０ｘ１ａ００（Ｒ１５））６１０がロードされており、当該間接分岐命令６１０が実行されることにより、仮想メモリ６２０上では、間接分岐命令６１０のパラメータであるコードベースレジスタの設定値「Ｒ１５」が示す仮想アドレス（０ｘ：ｘｘｘ３００）と、移動量「０ｘ１ａ００」とを加算した値である仮想アドレス（０ｘ：ｙｙｙｄ００）に処理が移る。すなわち、当該間接分岐命令によって、予測された分岐先アドレスである物理アドレス（０ｘ：７８９ｄ００）に処理が分岐する。そして、物理アドレス（０ｘ：７８９ｅ００）および仮想アドレス（０ｘ：ｙｙｙｅ００）で処理が終了する。
【００７６】
第１の間接分岐命令（ＢＣ  ０ｘｆ，０ｘ５００（Ｒ１５））６０６に対する図３のステップＳ３０４および図４に示す処理では、変数（code-base-register）は初期値「−１」のままであり、変数（code-base-register）とレジスタ番号（base-register）とが相違するため、第１の間接分岐命令６０６に対して最適化処理は施されない。すなわち、図８に示すガードコードに含まれる処理が削減されない。そのため、コンパイルコードの実行時に「Ｒ１５」に仮想アドレス（０ｘ：ｘｘｘ３００）が設定されていない場合には、分岐予測に失敗したこととなり、ガードコードによってコンパイルコードの実行が終了する。
【００７７】
第１の間接分岐命令（ＢＣ  ０ｘｆ，０ｘ５００（Ｒ１５））６０６に対する図３のステップＳ３０５および図５に示す処理では、ステップＳ５０２で動的コンパイラ１２４が、当該間接分岐命令の分岐先として予測された分岐アドレス（next-physical-pc-on-trace）の下位１２ｂｉｔの値から所定の移動量（displacement）を減算した値を変数（code-base-register-offset）に代入する。
【００７８】
すなわち、第１の間接分岐命令（ＢＣ  ０ｘｆ，０ｘ５００（Ｒ１５））６０６では、当該間接分岐命令の分岐先として予測された分岐アドレス（next-physical-pc-on-trace）「０ｘ：４５６８００」の下位１２ｂｉｔの値「０ｘ：８００」から移動量「０ｘ：５００」を減算した値「０ｘ：３００」を算出し、この算出値「０ｘ：３００」を変数（code-base-register-offset）に代入する。
【００７９】
この変数（code-base-register-offset）に代入された当該算出値「０ｘ：３００」は、第１の間接分岐命令の分岐予測が成功した場合のベースレジスタの設定値（Ｒ１５）が示す仮想アドレス「０ｘ：ｘｘｘ３００」と、第１の間接分岐命令６０６による分岐先の仮想ページ６２２の開始アドレス「０ｘ：ｘｘｘ０００」とのオフセット（差分）に相当する。
【００８０】
第２の間接分岐命令（ＢＣＴＧ  Ｒ１，０ｘ１９００（Ｒ１５））６０８に対する図３のステップＳ３０４および図４に示す処理の実行時には、変数（code-base-register）には、ベースレジスタのレジスタ番号（base-register）が設定されていると共に、第１の間接分岐命令６０６に対する図３のステップＳ３０５および図５に示す処理で変数（code-base-register-offset）に「０ｘ：３００」が設定されている。このため、図４に示すステップＳ４０７が実行され、動的コンパイラ１２４は、変数（code-base-register-offset）の値「０ｘ：３００」に上記移動量「０ｘ：１９００」を加算した値が、０以上かつ仮想ページの１ページ分のメモリサイズ（０ｘ：１０００）よりも小さいか否か判断することにより、間接分岐命令６０８によって現在のメモリページから他のメモリページに処理が移るか否か、すなわち、ページ境界を越えるか否か判断する。
【００８１】
本実施形態では、変数（code-base-register-offset）の値「０ｘ：３００」と上記移動量「０ｘ：１９００」とを加算して得られる値が「０ｘ：１ｃ００」であることから、第２の間接分岐命令６０８によって現在のメモリページから他のメモリページに処理が移る、すなわち、ページ境界を越えると判断し、上述したステップＳ４０９の最適化処理を実行する。これにより、コンパイルコードの実行時には、ガードコードに含まれる分岐先アドレスページの変換処理（translate branch-target-virtual-page-address to branch-target-physical-page-address）および分岐先アドレスページの評価処理（branch-target-physical-page-address==next-physical-pc-on-trace&~0xfff）が実行され、仮想アドレス「０ｘ：ｙｙｙ０００」が物理アドレス「０ｘ：７８９０００」にマッピングされていない場合には分岐予測に失敗したこととなり、ガードコードによってコンパイルコードの実行が終了する。
【００８２】
第２の間接分岐命令（ＢＣＴＧ  Ｒ１，０ｘ１９００（Ｒ１５））６０８に対する図３のステップＳ３０５および図５に示す処理では、当該間接分岐命令の分岐先として予測された分岐アドレス（next-physical-pc-on-trace）「０ｘ：７８９ｃ００」の下位１２ｂｉｔの値「０ｘ：ｃ００」から移動量「０ｘ：１９００」を減算した値「０ｘ：−ｄ００」を算出し、この算出値を変数（code-base-register-offset）に代入する。
【００８３】
この変数（code-base-register-offset）に代入された当該算出値「０ｘ：−ｄ００」は、第２の間接分岐命令の分岐予測が成功した場合のコードベースレジスタの設定値（Ｒ１５）が示す仮想アドレス「０ｘ：ｘｘｘ３００」と、第２の間接分岐命令６０８による分岐先の仮想ページ６２４の開始アドレス「０ｘ：ｙｙｙ０００」とのオフセットに相当する。
【００８４】
第３の間接分岐命令（ＢＣＴＧ  Ｒ２，０ｘ１ａ００（Ｒ１５））６１０に対する図３のステップＳ３０４および図４に示す処理の実行時には、変数（code-base-register）には、ベースレジスタのレジスタ番号（base-register）が設定されていると共に、第２の間接分岐命令６０８に対する図３のステップＳ３０５および図５に示す処理で変数（code-base-register-offset）に「０ｘ：−ｄ００」が設定されている。このため、図４に示すステップＳ４０７で、動的コンパイラ１２４は、変数（code-base-register-offset）の値「０ｘ：−ｄ００」に上記移動量「０ｘ：１ａ００」を加算した値が、０以上かつ仮想ページの１ページ分のメモリサイズ（０ｘ：１０００）よりも小さいか否か判断することにより、間接分岐命令６１０によって現在のメモリページから他のメモリページに処理が移るか否か、すなわち、ページ境界を越えるか否か判断する。
【００８５】
本実施形態では、ステップＳ４０７の処理によって、変数（code-base-register-offset）の値「０ｘ：−ｄ００」と上記移動量「０ｘ：１ａ００」とを加算して得られる値が「０ｘ：ｄ００」となるため、動的コンパイラ１２４は、間接分岐命令６１０によって処理がページ境界を越えないと判断し、上述したステップＳ４０８の最適化処理を実行する。
【００８６】
図７は、本発明の仮想マシンが行う物理メモリおよび仮想メモリのマッピングの別の実施形態を示す概念図である。以下、図７を参照して、仮想マシンがエミュレートするシステムの物理メモリ７００および仮想メモリ７２０のメモリマッピングについて説明する。
【００８７】
処理対象である機械語コードを構成するトレース７０２の実行時には、当該トレース７０２が物理メモリ７００にロードされ、物理メモリ７００上の物理アドレス（０ｘ：１２３０００）、物理アドレス（０ｘ：４５６０００）および物理アドレス（０ｘ：７８９０００）が、仮想メモリ７２０のメモリ領域である仮想ページ７２２の開始アドレス（０ｘ：ｘｘｘ０００）、仮想ページ７２４の開始アドレス（０ｘ：ｙｙｙ０００）、仮想ページ７２６の開始アドレス（０ｘ：ｚｚｚ０００）にマッピングされる（ここで、ｘ,ｙ,ｚは任意の数である）。
【００８８】
なお、これらのマッピングはプログラムの実行時によって異なる。また、図７に示す実施形態では、仮想ページ７２２と仮想ページ７２４との間に他の仮想ページ（図示せず）が存在しており、これらの仮想ページは連続していない。一方、仮想ページ７２４および仮想ページ７２６は連続する。
【００８９】
物理メモリ７００の物理アドレス（０ｘ：１２３０００）には、トレース７０２の最初の命令がロードされており、物理アドレス（０ｘ：１２３０００）からトレース７０２が開始する。物理アドレス（０ｘ：１２３１００）には、不成立の呼び出し型（non-taken-call-type）命令である命令（ＢＡＬＲ  Ｒ３，Ｒ０）７０４がロードされており、当該命令が実行されることにより、当該物理アドレスに対応する仮想アドレスの次の仮想アドレスであるリターンアドレス（０ｘ：ｘｘｘ１０２）が、設定値（Ｒ３）としてリターンレジスタに設定される。なお、当該命令７０４では分岐処理は行われない。
【００９０】
トレース７０２をコンパイルする場合、動的コンパイラ１２４は、命令（ＢＡＬＲ  Ｒ３，Ｒ０）７０４が不成立の呼び出し型命令に該当するため、図５に示すステップＳ５０１で処理をステップＳ５０３に分岐する。そして、ステップＳ５０３で、動的コンパイラ１２４は、ステップＳ５０２と同様に、変数（code-base-register）にリターンレジスタのレジスタ番号（return-register）を設定すると共に、当該不成立の呼び出し型命令の呼出先を示すリターンアドレス（０ｘ：ｘｘｘ１０２）であるリターンレジスタの設定値（Ｒ３）の下位１２ｂｉｔの値「０ｘ：１０２」を変数（code-base-register-offset）に代入する。
【００９１】
この変数（code-base-register-offset）の値「０ｘ：１０２」は、リターンレジスタの設定値（Ｒ３）が示す仮想アドレス（０ｘ：ｘｘｘ１０２）と、当該仮想アドレスが属する仮想ページ７２２の開始アドレス（０ｘ：ｘｘｘ０００）とのオフセットに相当する。
【００９２】
また、物理メモリ７００の物理アドレス（０ｘ：１２３２００）には、相対分岐命令である命令（ＢＲＣ  ０ｘｆ，０ｘ１０００）７０６がロードされており、当該命令７０６が実行されることにより、処理が物理アドレス（０ｘ：４５６２００）に分岐すると予測される。ここで、ＢＲＣとはｚ／Ａｒｃｈｉｔｅｃｔｕｒｅ固有の命令であり、当該命令が割り当てられた仮想アドレスに、パラメータが指定する「０ｘ：１０００」の２倍である「０ｘ：２０００」を加算した仮想アドレスに処理が移動する。
【００９３】
具体的には、分岐元の物理アドレス（０ｘ：１２３２００）に対応する仮想ページ７２２内の仮想アドレス（０ｘ：ｘｘｘ２００）に「０ｘ：２０００」を加算した値である仮想アドレス（０ｘ：ｙｙｙ２００）に処理が分岐する。
【００９４】
本実施形態では、分岐元の仮想ページ７２２と、分岐先の仮想ページ７２４との間には、別の１の仮想ページ（図示せず）が存在するため、分岐元の仮想アドレス（０ｘ：ｘｘｘ２００）と「０ｘ：２０００」とを加算した値が、分岐先の仮想アドレス（０ｘ：ｙｙｙ２００）となる。
【００９５】
トレース７０２をコンパイルする場合、動的コンパイラ１２４は、命令（ＢＲＣ  ０ｘｆ，０ｘ１０００）７０６は相対分岐命令に該当するため、図５に示すステップＳ５０１で処理をステップＳ５０４に分岐する。そして、ステップＳ５０４で、動的コンパイラ１２４は、関数page-increment-by-((current-physical-pc-on-trace&0xfff）+displacement）を使用して、当該命令７０６によって越えたページ境界の数と当該仮想ページの１ページ分のメモリサイズとの乗算値「０ｘ：２０００」を算出する。
【００９６】
そして、動的コンパイラ１２４は、変数（code-base-register-offset）に設定されている値から当該乗算値を減算して得られた値を変数（code-base-register-offset）に代入する。このとき、変数（code-base-register-offset）には、上述した不成立の呼び出し型命令である命令７０４によって「０ｘ：１０２」が既に設定されているため、動的コンパイラ１２４は、ステップＳ５０４において変数（code-base-register-offset）の値「０ｘ：１０２」から上記乗算値「０ｘ：２０００」を減算した値「０ｘ：−１ｅｆｅ」を変数（code-base-register-offset）に代入する。
【００９７】
さらに、物理メモリ７００の物理アドレス（０ｘ：４５６ｆｆｅ）、すなわち、ページの終端７０８にロードされた命令が実行されることにより、次の物理ページの始端７１０である物理アドレス（０ｘ：７８９０００）に処理が移る。そして、以降の処理（図示せず）が順次実行され、トレース７０２の終了位置７１２である物理アドレス（０ｘ：７８９１００）で処理が終了する。
【００９８】
仮想メモリ７２０上では、ページの終端７０８にロードされた命令が実行されることにより、物理アドレス（０ｘ：４５６ｆｆｅ）に対応する仮想アドレス（０ｘ：ｙｙｙｆｆｅ）が属する仮想ページ７２４の次のページに該当する仮想ページ７２６の開始アドレス（０ｘ：ｚｚｚ０００）に処理が移り、物理アドレス（０ｘ：７８９１００）に対応する仮想アドレス（０ｘ：ｚｚｚ１００）で処理が終了する。
【００９９】
トレース７０２をコンパイルする場合、動的コンパイラ１２４は、コンパイル対象の命令がページの終端に存在する命令であるため、図５に示すステップＳ５０１で処理をステップＳ５０５に分岐する。そして、ステップＳ５０５で、動的コンパイラ１２４は、変数（code-base-register-offset）に設定されている値から仮想ページの１ページ分のメモリサイズ（０ｘ：１０００）を減算して得られた値を変数（code-base-register-offset）に代入する。このとき、変数（code-base-register-offset）には、上述した相対分岐命令である命令７０６によって「０ｘ：−１ｅｆｅ」が既に設定されているため、動的コンパイラ１２４は、ステップＳ５０５において変数（code-base-register-offset）の値「０ｘ：−１ｅｆｅ」から上記メモリサイズ「０ｘ：１０００」を減算した値「０ｘ：−２ｅｆｅ」を変数（code-base-register-offset）に代入する。
【０１００】
これまで本実施形態につき説明してきたが、本発明は、上述した実施形態に限定されるものではなく、当該実施形態の機能手段の変更や削除、他の機能手段の追加など、当業者が想到することができる範囲内で変更することができ、いずれの態様においても本発明の作用・効果を奏する限り、本発明の範囲に含まれるものである。
【符号の説明】
【０１０１】
１００…情報処理装置、１１０…プロセッサ、１１２…主記憶装置、１１４…ＯＳ、１１６…仮想マシン、１１８…インタープリタ、１２０…低速実行部、１２２…実行部、１２４…動的コンパイラ、１２６…中間コード生成部、１２７…最適化処理部、１２８…コンパイル部、１３０…コードキャッシュ、１３２…補助記憶装置
【図１】
0005840014.tif 000002
【図２】
0005840014.tif 000003
【図３】
0005840014.tif 000004
【図４】
0005840014.tif 000005
【図５】
0005840014.tif 000006
【図６】
0005840014.tif 000007
【図７】
0005840014.tif 000008
【図８】
0005840014.tif 000009