(57)【特許請求の範囲】
【請求項１】
エミュレータ中でサブジェクトレジスタを表す方法であって、エミュレータ装置が、
（ａ）  サブジェクトマシンのサブジェクトレジスタを表すエミュレートされた抽象レジスタ（Ｘ）を、ターゲットマシン内の第１の位置（ＸＡ）及び第２の位置（ＸＢ）にマップするステップであって、前記第１の位置及び前記第２の位置の一方（ＸＡ、ＸＢ）が前記抽象レジスタの推測バージョンを表し、一方前記第１の位置及び前記第２の位置の他方（ＸＢ、ＸＡ）が前記抽象レジスタの確定バージョンを表し、前記第１の位置（ＸＡ）及び前記第２の位置（ＸＢ）それぞれはメモリ位置またはターゲットレジスタである、前記マップするステップと、
（ｂ）  前記第１の位置及び前記第２の位置の一方（ＸＡ、ＸＢ）が例外処理中に前記エミュレータによる使用のために前記抽象レジスタの確定バージョンを表し、一方前記第１の位置及び前記第２の位置の他方（ＸＢ、ＸＡ）が前記抽象レジスタの推測バージョンを表すように、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替えるステップと
を実行することを含み、サブジェクトコードの所定セクションがサブジェクトコードの１つまたは複数の基本ブロックを表し、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替えることが前記基本ブロック単位で交互に行われる、前記方法。
【請求項２】
サブジェクトコードの所定セクションについて、前記第１の位置または前記第２の位置の一方（ＸＡ、ＸＢ）が、前記所定セクションに入ったときの抽象レジスタ（Ｘ）の確定値を保持し、前記第１の位置または前記第２の位置の他方（ＸＢ、ＸＡ）が、前記所定セクション中に使用するための抽象レジスタ（Ｘ）の推測現行値を保持する、請求項１に記載の方法。
【請求項３】
マッピングを入れ替えるステップ（ｂ）が、サブジェクトコードの前記所定セクションの最後に達すると実行される、請求項２に記載の方法。
【請求項４】
マッピングを入れ替えるステップ（ｂ）が、抽象レジスタ（Ｘ）の推測バージョンの内容がサブジェクトコードの前記所定セクション中に更新されている場合にのみ実行される、請求項１又は３に記載の方法。
【請求項５】
ステップ（ａ）が、
（ａ１）  それぞれがサブジェクトマシンのレジスタを表す複数の抽象レジスタ（Ｘ、Ｙ）を提供するステップと、
（ａ２）  複数の抽象レジスタ（Ｘ、Ｙ）をそれぞれ、ターゲットマシン内の第１の位置セットの各位置（ＸＡ、ＸＢ）または第２の位置セットの各位置（ＸＢ、ＹＢ）にマップするステップと
を含み、
ステップ（ｂ）が、前記第１の位置セットと前記第２の位置セットの各セットの各位置の間で、少なくとも１つの抽象レジスタ（Ｘ、Ｙ）についてのマッピングを入れ替えるステップを含む、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記エミュレータが動的バイナリ変換において実行される、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
サブジェクトプロセッサに適したサブジェクトコードと、ターゲットプロセッサに適したターゲットコードとの間でプログラムコード変換を行う方法であって、エミュレータ装置が、
（ａ）  それぞれがサブジェクトプロセッサのレジスタを表すエミュレートされた少なくとも１つの抽象レジスタ（Ｘ、Ｙ）を提供するステップと、
（ｂ）  前記１つの抽象レジスタ（Ｘ又はＹ）または各抽象レジスタ（Ｘ、Ｙ）をそれぞれ、ターゲットプロセッサ内の対応する位置ペア（ＸＡ、ＸＢ、ＹＡ、ＹＢ）にマップするステップであって、前記位置ペアの第１の位置及び第２の位置の一方（例えばＸＡ、ＹＡ）が、前記抽象レジスタ（Ｘ、Ｙ）の推測現行値を保持し、一方前記第１の位置及び前記第２の位置の他方（例えばＸＢ、ＹＢ）が、前記抽象レジスタ（Ｘ、Ｙ）の確定値を保持し、前記第１の位置（ＸＡ）及び前記第２の位置（ＸＢ）それぞれはメモリ位置またはターゲットレジスタである、前記マップするステップと、
（ｃ）  サブジェクトコードの所定セクションについて、第１の位置及び第２の位置の一方（例えばＸＡ、ＹＡ）が、例外処理中に前記エミュレータによる使用のために前記所定のセクションに入ったときの前記抽象レジスタ（Ｘ、Ｙ）の確定値を保持し、一方前記第１の位置及び前記第２の位置の他方（例えばＸＢ、ＹＢ）が、前記所定のセクション中に前記エミュレータによる更新のために前記抽象レジスタ（Ｘ、Ｙ）の推測現行値を保持するように、前記位置ペアの第１のペア（ＸＡ、ＹＡ）と前記位置ペアの第２のペア（ＸＢ、ＹＢ）との間で少なくとも１つの抽象レジスタ（Ｘ、Ｙ）のマッピングを入れ替えるステップと
を実行することを含み、サブジェクトコードの所定セクションがサブジェクトコードの１つまたは複数の基本ブロックを表し、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替えることが前記基本ブロック単位で交互に行われる、前記方法。
【請求項８】
マッピングを入れ替えるステップ（ｃ）が、サブジェクトコードの前記所定セクションの終わりに達すると実行される、請求項７に記載の方法。
【請求項９】
マッピングを入れ替えるステップ（ｃ）が、サブジェクトコードの前記所定セクション中に更新された前記１つの抽象レジスタまたは各抽象レジスタ（Ｘ、Ｙ）についてのみ実行される、請求項７又は８に記載の方法。
【請求項１０】
エミュレータ装置に、請求項１〜９のいずれか一項に記載の方法の各ステップを実行させるコンピュータプログラム。
【請求項１１】
エミュレータ装置であって、
（ａ）  サブジェクトマシンのサブジェクトレジスタを表すエミュレートされた抽象レジスタ（Ｘ）を、ターゲットマシン内の第１の位置（ＸＡ）及び第２の位置（ＸＢ）にマップし、ここで、前記第１の位置及び前記第２の位置の一方（ＸＡ、ＸＢ）が前記抽象レジスタの推測バージョンを表し、一方前記第１の位置及び前記第２の位置の他方（ＸＢ、ＸＡ）が前記抽象レジスタの確定バージョンを表し、前記第１の位置（ＸＡ）及び前記第２の位置（ＸＢ）それぞれはメモリ位置またはターゲットレジスタであり、
（ｂ）  前記第１の位置及び前記第２の位置の一方（ＸＡ、ＸＢ）が例外処理中に前記エミュレータによる使用のために前記抽象レジスタの確定バージョンを表し、一方前記第１の位置及び前記第２の位置の他方（ＸＢ、ＸＡ）が前記抽象レジスタの推測バージョンを表すように、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替え、ここで、サブジェクトコードの所定セクションがサブジェクトコードの１つまたは複数の基本ブロックを表し、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替えることが前記基本ブロック単位で交互に行われる、前記エミュレータ装置。
【請求項１２】
サブジェクトコードの所定セクションについて、前記第１の位置または前記第２の位置の一方（ＸＡ、ＸＢ）が、前記所定セクションに入ったときの抽象レジスタ（Ｘ）の確定値を保持し、前記第１の位置または前記第２の位置の他方（ＸＢ、ＸＡ）が、前記所定セクション中に使用するための抽象レジスタ（Ｘ）の推測現行値を保持する、請求項１１に記載のエミュレータ装置。
【請求項１３】
サブジェクトプロセッサに適したサブジェクトコードと、ターゲットプロセッサに適したターゲットコードとの間でプログラムコード変換を行うエミュレータ装置であって、
それぞれがサブジェクトプロセッサのレジスタを表すエミュレートされた少なくとも１つの抽象レジスタ（Ｘ、Ｙ）と、
エミュレータであって、
前記１つの抽象レジスタ（Ｘ、Ｙ）または各抽象レジスタ（Ｘ、Ｙ）をそれぞれ、ターゲットプロセッサ内の対応する位置ペア（ＸＡ、ＸＢ、ＹＡ、ＹＢ）にマップし、ここで、前記位置ペアの第１の位置及び第２の位置の一方（例えばＸＡ、ＹＡ）が、前記抽象レジスタ（Ｘ、Ｙ）の推測現行値を保持し、一方前記第１の位置及び前記第２の位置の他方（例えばＸＢ、ＹＢ）が、前記抽象レジスタ（Ｘ、Ｙ）の確定値を保持し、前記第１の位置（ＸＡ）及び前記第２の位置（ＸＢ）それぞれはメモリ位置またはターゲットレジスタであり、
サブジェクトコードの所定セクションについて、第１の位置及び第２の位置の一方（例えばＸＡ、ＹＡ）が例外処理中に前記エミュレータによる使用のために前記所定のセクションに入ったときの抽象レジスタ（Ｘ、Ｙ）の確定値を保持し、一方前記第１の位置及び前記第２の位置の他方（例えばＸＢ、ＹＢ）が、前記所定のセクション中に前記エミュレータによる更新のために前記抽象レジスタ（Ｘ、Ｙ）の推測現行値を保持するように、前記位置ペアの第１のペア（ＸＡ、ＹＡ）と前記位置ペアの第２のペア（ＸＢ、ＹＢ）との間で少なくとも１つの抽象レジスタ（Ｘ、Ｙ）のマッピングを入れ替える、前記エミュレータと
を備えており、サブジェクトコードの所定セクションがサブジェクトコードの１つまたは複数の基本ブロックを表し、前記第１の位置（ＸＡ）と前記第２の位置（ＸＢ）との間で抽象レジスタ（Ｘ）のマッピングを入れ替えることが前記基本ブロック単位で交互に行われる、前記エミュレータ装置。
【請求項１４】
マッピングを入れ替えることが、サブジェクトコードの前記所定セクションの終わりに達すると実行されるか、或いは、サブジェクトコードの前記所定セクション中に更新された前記１つの抽象レジスタまたは各抽象レジスタ（Ｘ、Ｙ）についてのみ実行される、請求項１３に記載のエミュレータ装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、一般にはコンピュータシステムのプログラムコード変換の分野に関し、詳細には、限定はしないが、動的バイナリ変換を使用したエミュレーションの分野に関する。
【０００２】
【従来の技術】
コンピュータプログラムはいくつかの異なる形態をとる。通例、プログラムはまず人間のプログラマが容易に理解できる高級言語で書かれる。プログラムは高級言語から、コンピュータのプロセッサおよび関連する構成要素の制御により適した低級言語へとコンパイルされる。
【０００３】
しかし、プロセッサを機能させるために、プログラムコードは、ロード動作、シフト演算、加算演算、および記憶動作などプロセッサの基本動作を指示するマシン可読形態で提供しなければならない。
【０００４】
より高速に作動するために、プロセッサには、それぞれが基本命令のシーケンスを表す拡張命令セットを使用するものもある。これは複雑命令セットコンピュータ（ＣＩＳＣ）として知られる。しかし、第１のプロセッサ専用に書かれた（あるいはコンパイルされた）特定の命令セットを備えるプログラムコードは、各種プロセッサ用の命令セット間の違いのために、大半の場合は他のタイプのプロセッサでは実行することができない。
【０００５】
エミュレータは、第１のタイプのプロセッサ（「サブジェクト」プロセッサ）のために書かれたプログラムコードを、第２タイプのプロセッサ（「ターゲット」プロセッサまたは「ホスト」プロセッサ）で実行することを可能にするものである。このエミュレーションプロセスの１形態は、サブジェクトプロセッサに適した実行可能バイナリコードを、ターゲットプロセッサに適した実行可能バイナリコードに変換することからバイナリ変換として知られている。
【０００６】
静的バイナリ変換は、プログラム全体を変換してから変換済みプログラムをターゲットプロセッサで実行するものであるが、これにはかなりの遅延が伴う。したがって、ターゲットプロセッサで直ちに実行できるように、動的バイナリ変換を用いてソースプログラムの小セクションを変換するエミュレータが開発されている。
【０００７】
ソースコードの大きなセクションは実際には使用されないか、まれにしか使用されないのでこれははるかに効率的である。動的変換システムを用いるエミュレータは、プログラム実行と平行して、需要に応じてソースプログラムの必要な部分だけを変換するために選択する。
【０００８】
続いて、本発明の好ましい実施形態に用いることができるエミュレータ用の動的バイナリ変換を簡単に要約して説明する。動的バイナリ変換分野のより詳細な背景は、「ＰＲＯＧＲＡＭ  ＣＯＤＥ  ＣＯＮＶＥＲＳＩＯＮ（プログラムコード変換）」という名称の本出願人の同時係属出願ＧＢ９８  ２２０７５．９に与えられ、その内容は不用な重複を避けるために参照として本明細書に取り込む。
【０００９】
動的バイナリ変換を実行する際、エミュレータはサブジェクトコードにとって、サブジェクトコードが適切なサブジェクトプロセッサで実行されているように見える。エミュレータは、エミュレータが仮想のサブジェクトマシンを提供するために、例えばサブジェクトプロセッサのレジスタを含めてサブジェクトマシンを複製する。エミュレートされたレジスタを本明細書では「抽象レジスタ」と称し、これはサブジェクトコードが使用するサブジェクトプロセッサのレジスタセットに対応する。
【００１０】
好ましい動的変換プロセスでは、エミュレータはまずサブジェクトコードの所定の小セクションを、サブジェクトコードの命令を汎用フォーマットで表す中間表現に変換し、任意選択で中間表現の最適化を行い、次いで最適化した中間表現をターゲットプロセッサ用の実行可能バイナリコードに変換する。サブジェクトコードの小セクションは、一意の入口点にある第１の命令で開始し、かつ一意の出口点にある最後の命令で終了する「基本ブロック」に相当することが好ましい。通例、ブロックの最後の命令はジャンプ命令、コール命令または分岐命令（条件つきまたは無条件）である。
【００１１】
バイナリ変換の分野では、例外処理に関連して問題が生じる。例外処理とは、それを処理しなければ処理を続けられない条件が発生することを指す。これには、サブジェクトコード中の命令として実行される明示的な例外処理（例えば、あるレジスタの値が第２のレジスタの値より大きい場合には例外が報告される）、および例えば現在使用できないメモリページに対するメモリ読み取り操作または書き込み操作の結果生じる例外処理が含まれる。どちらの場合も、サブジェクトコードに書かれた例外ハンドラに例外処理が報告されることが望ましい。
【００１２】
しかし、多くのサブジェクトマシンアーキテクチャ定義では、所定の規則セットに従ってサブジェクトコード命令間の境界で例外処理を報告することを必要としている。例えば、サブジェクトアーキテクチャ定義は、例外処理が報告された場合、それより前のすべてのサブジェクト命令の効果が完了しており、実行されていないサブジェクトコードの最初の命令をその例外処理がポイントし、そのサブジェクト命令またはどの後続の命令からの効果もまだ生じていないことを必要とすることがある。さらに、特定プロセッサのアーキテクチャ定義は、異なるタイプの例外処理について異なる規則を有することもある。
【００１３】
バイナリ変換のコンテキストでは、ターゲットプロセッサで実行される、例外処理を報告させるターゲット命令自体は、サブジェクトコードに書かれた例外ハンドラに例外処理を報告する条件を満たさないことは明白である。命令は大抵の場合、それに対応するサブジェクトコードブロック中の命令の順序と比較すると、ターゲットプロセッサでは異なる順序で実行される。これは、第１には、サブジェクトコードがそのために書かれたサブジェクトプロセッサの命令セットと、変換したターゲットコードを実行するターゲットプロセッサ間の違いが原因であり、第２には、通例は変換中に行われる中間表現の最適化が原因である。
【００１４】
例外処理は、ターゲットプロセッサで変換済みターゲットコードを実行するのに応答して発生する可能性があり、またターゲットプロセッサでのエミュレータコードの実行中、すなわち変換中にも生じる可能性がある。例外処理をサブジェクト例外ハンドラに報告するために、サブジェクトプロセッサのレジスタの正確な状態を含めて、エミュレータによって表される仮想サブジェクトプロセッサの状態はサブジェクト例外ハンドラから入手可能でなければならない。
【００１５】
この問題に対するアプローチの１つとしては、仮想サブジェクトマシンを、変換または実行しているコードセクションに入るときに適用された条件に戻すこと、すなわち仮想サブジェクトマシンを、変換または実行しているサブジェクトコード命令の現在のブロックへの入口点で用いられた（ｐｒｅｖａｉｌｉｎｇ）条件に戻すことがある。係るアプローチでは例外ハンドラはソースコードブロックの命令を個々に順次ステップスルーして、例外処理を起こしている命令を識別することができる。
【００１６】
米国特許第５８３２２０５号（Ｋｅｌｌｙ他）は、各サブジェクトコードセクションのエミュレート中に「作業」レジスタのセットを使用するエミュレータを開示する。これら各作業レジスタの内容は、ゲート化したストアバッファを使用して、サブジェクトコードセクションの最後に「オフィシャル」の仮想サブジェクトレジスタセットにコピーされる。したがって、サブジェクトコードセクションのエミュレート中に例外処理が発生した場合、これは作業レジスタにしか影響せず、仮想サブジェクトマシンの状態は、そのサブジェクトコードセクションへの入口点で「オフィシャル」レジスタから回復することができる。
【００１７】
しかしながら、上記従来技術のように、「作業」レジスタおよび「オフィシャル」レジスタを使用すると、各サブジェクトコードセクションの終わりに「作業」レジスタからそれに対応する「オフィシャル」レジスタに情報をコピーするため、ターゲットプロセッサにおけるエミュレーションプロセスのオーバーヘッドが著しく増してしまう。
【００１８】
【発明が解決しようとする課題】
本発明の目的は、エミュレータ中でサブジェクトレジスタを表す方法を提供することであり、この方法はハンドラ規則に従って例外を正確にサブジェクト例外ハンドラに報告することを可能にし、同時にエミュレータ中のオーバーヘッドを最小限に抑える。本発明の他の目的は、サブジェクトレジスタを表すことにより正確な例外処理を可能にするエミュレーションの方法および装置を提供することである。
【００１９】
【課題を解決するための手段】
本発明によると、エミュレータ中でサブジェクトレジスタを表す方法が提供され、この方法は、（ａ）サブジェクトマシンのサブジェクトレジスタを表す抽象レジスタを、ターゲットマシン内の第１の位置または第２の位置にマップするステップと、（ｂ）第１の位置または第２の位置の一方の内容が、例外処理中にエミュレータが使用するための抽象レジスタの確定的なバージョンを表し、同時に第１の位置または第２の位置の他方が抽象レジスタの推測バージョンを表すように、第１の位置と第２の位置の間で抽象レジスタのマッピングを入れ替えるステップとからなる。
【００２０】
サブジェクトコードの所定セクションについて、第１の位置または第２の位置の一方が、そのセクションに入ったときの抽象レジスタの確定値を保持し、かつ、第１の位置または第２の位置の他方が、そのセクション中に使用する抽象レジスタの推測現行値を保持することが好ましい。
【００２１】
サブジェクトコードセクションの最後に達すると、第１の位置または第２の位置のそれまでとは逆の位置に抽象レジスタがマップされることが好ましい。そのサブジェクトコードセクションで例外が発生していないことが確認されると、推測バージョンが確定的なものになる。抽象レジスタの推測バージョンの内容が所定のサブジェクトコードセクション中に更新されている場合にのみ、マッピング変更ステップが行われることが理想的である。
【００２２】
ステップ（ａ）は、（ａ１）それぞれがサブジェクトマシンのレジスタを表す複数の抽象レジスタを提供するステップと、（ａ２）複数のその抽象レジスタをそれぞれ、ターゲットマシン内の第１の位置セットの各位置か、または第２の位置セットの各位置にマップするステップを含むことが好ましい。ステップ（ｂ）は、第１の位置セットと第２の位置セットそれぞれの間で、各抽象レジスタについてのマッピングを入れ替えるステップを含むことが好ましい。
【００２３】
第１の位置および／または第２の位置は、ターゲットマシン内のメモリ位置であることが好ましい。あるいは、第１の位置および／または第２の位置がターゲットマシンのレジスタであることが好ましい。
【００２４】
本発明に係る方法は、動的バイナリ変換を実行するエミュレータとともに使用することが好ましい。サブジェクトコードの所定のセクションが、サブジェクトコードの１つまたは複数の基本ブロックを表すと適当である。
【００２５】
また本発明によると、サブジェクトプロセッサに適したサブジェクトコードとターゲットプロセッサに適したターゲットコードの間でプログラムコード変換を行うエミュレータが例外処理で使用する方法が提供される。
【００２６】
この方法は、それぞれがサブジェクトプロセッサのレジスタを表す少なくとも１つの抽象レジスタ（Ｘ、Ｙ）を提供するステップと、（ｂ）前記１つの抽象レジスタまたは各抽象レジスタを、ターゲットプロセッサ内の対応する位置のペアにマップするステップと、（ｃ）サブジェクトコードの所定のセクションについて、第１の位置または第２の位置の一方が、例外処理中にエミュレータが使用する、そのセクションに入ったときの抽象レジスタの確定値を保持し、一方、第１の位置または第２の位置の他方が、そのセクション中にエミュレータが更新を行うための抽象レジスタの推測現行値を保持するように、位置ペアの第１の位置と位置ペアの第２の位置の間で前記１つの抽象レジスタまたは各抽象レジスタのマッピングを入れ替えるステップを含む。
【００２７】
さらに、本発明の他の態様によると、本明細書中の著述内容による方法を実行するためのエミュレータ方法およびエミュレータ装置が提供される。本発明はまた、本明細書中の任意の著述内容による方法を実行するようにプログラムした場合はコンピュータに、本明細書中の任意の著述内容による方法を実行するためのコンピュータプログラムに、および本明細書中の任意の著述内容による方法を実行するためのコンピュータ可読命令を含んだコンピュータプログラム製品にわたる。
【００２８】
【発明の実施の形態】
本発明をよりよく理解するため、本発明の実施形態がどのように実施されるかを添付の概略図面を参照しつつ示す。
【００２９】
図１を参照すると典型的な従来技術による配列が示され、これはサブジェクトプロセッサ１１でサブジェクトコード１０が直接実行されるサブジェクトマシンの構成を表している。このサブジェクトコードは実行可能バイナリコードであると適切である。しかし、当分野の技術者には知られているように、サブジェクトコードは、サブジェクトコード１０とサブジェクトプロセッサ１１の間に中間層（コンパイラなど）を有する任意の適切な言語で表すことが可能である。
【００３０】
次いで図２を参照すると、典型的な従来技術による構成が示され、これはサブジェクトコード１０をターゲットプロセッサ３１が実行することを可能にする中間層としてバイナリ変換タイプエミュレータ２０を使用する例を表している。本発明の好ましい実施形態は特に、サブジェクトコード１０を、ターゲットプロセッサ３１で実行可能なターゲットコード３０に動的バイナリ変換するエミュレータ２０とともに使用することを目的とする。
【００３１】
次いで図３を参照すると、好ましい実施形態のエミュレータ２０をより詳しく示しており、これはフロントエンド２１、コア２２、およびバックエンド２３から構成される。
【００３２】
フロントエンド２１は、エミュレートするサブジェクトプロセッサ１１固有の構成になっている。フロントエンド２１は、サブジェクトコード１０の命令を、サブジェクトコードの基本ブロックごとに総称的な中間表現に変換する。基本ブロックはそれぞれ、一意の入口点を表す最初の命令と、一意の出口点にある最後の命令（ジャンプ命令、コール命令、あるいは分岐命令など）との間に連続した命令のセットを含むことが適切である。特に好ましい実施形態では、エミュレータ２０は、コード生成および最適化のために１つの単位として選択された２つ以上の基本ブロックからなるグループブロックを選択する。さらに、エミュレータ２０は、異なる入口条件下で、サブジェクトコードの同一の基本ブロックを表すアイソブロックをサポートする。サブジェクトコード１０の各所定セクションは中間表現のブロック（「ＩＲブロック」）になる。
【００３３】
コア２２は、本明細書では詳細に説明する必要のない最適化技術を用いて、フロントエンド２１が生成した各ＩＲブロックを最適化する。バックエンド２３は最適化済みのＩＲブロックをコア２２から持って行き、ターゲットプロセッサ３１で実行可能なターゲットコード３０を生成する。
【００３４】
図４に示すように、使用の際は、サブジェクトコード１０の最初の所定セクションは例えば基本ブロック１００として識別され、変換モードのターゲットプロセッサ３１上で実行されるエミュレータ２０によって変換される。ターゲットプロセッサ３１は次いで、ターゲットコード３０の対応する最適化済みかつ変換済みのブロック３００を実行する。
【００３５】
好ましいエミュレータ２０は、図３のコア２２に提供されると適切である複数の抽象レジスタを含み、これはサブジェクトプロセッサ１１でサブジェクトコード１０を実行するために使用される物理レジスタを表す。抽象レジスタは、サブジェクトプロセッサレジスタに対するサブジェクトコード命令の予測される効果を表すことにより、エミュレート中のサブジェクトプロセッサ１１の状態を定義する。
【００３６】
図５に示すように、好ましい実施形態では、ここでセットＡおよびセットＢと称する２セットの抽象レジスタが提供される。初期化時に、これら２セットのうち第１のセット、例えばセットＡは「確定」値を保持している。すなわちセットＡのレジスタは、エミュレートされるサブジェクトプロセッサ１１の物理レジスタの予測される内容を表す、有効であると知られている初期値を保持するものと定義される。
【００３７】
この例でセットＢと称する抽象レジスタの第２のセットは、初め「推測」値を表すように定義される。すなわち、初期化時に抽象レジスタの第２セット（セットＢ）もサブジェクトプロセッサ１１の物理レジスタの予測される初期内容を保持しているが、このセットＢの値は有効であるとは信頼されない。
【００３８】
変換プロセス中に、エミュレータ２０は抽象レジスタの推測セット（すなわちセットＢ）を使用するが、この際その内容を更新して、サブジェクトコード１０のブロック１００の実行後のサブジェクトプロセッサ１１の物理レジスタの予測状態を示す。最初のブロックの変換中には、抽象レジスタの確定セット（すなわちセットＡ）の内容は変更されない。
【００３９】
基本ブロック１００の変換中または実行中に例外が発生した場合、エミュレータ２０はブロック１００に入ると、確定データを保持しているとマークされた抽象レジスタ（すなわちセットＡ）を使用してサブジェクトレジスタの状態を直ちに回復する。すると例外ハンドラはソースコード１０のブロック１００の命令を順次ステップスルーして、その例外を引き起こしている命令を識別することができる。ここで、抽象レジスタの状態は各命令の後に更新される。したがって、その例外の原因となっているサブジェクトコード命令を識別すると、エミュレータによって表される仮想サブジェクトマシンの状態が、そのマシンの規則に従ってサブジェクトコード例外ハンドラに報告される。サブジェクトコード例外ハンドラは処理プロセスに従って例外を回復し、その例外に適したサブジェクトコード中のポイントに戻る。例えば、例外ハンドラが、エミュレータをソースコード１０の次の未実行命令に戻すことが一般的である。変換プロセスまたは実行プロセスはそのポイントから継続させることができる。
【００４０】
ターゲットコード３００の変換済みブロックを正常に実行すると、推測値を保持するセット（すなわちセットＢ）のレジスタが更新され、サブジェクトコード１０の基本ブロック１００の終わりにおけるエミュレート中のサブジェクトプロセッサ１１の対応レジスタの予測内容を保持することになる。この時点で、第１セット（すなわちセットＡ）の抽象レジスタは、サブジェクトコードのブロック１００に入ったときのサブジェクトプロセッサの状態を保持しており、第２セット（すなわちセットＢ）の抽象レジスタは、ブロック１００の終わりにおける状態を保持している。ブロック１００は正常に変換および実行されているので、今度はセットＢの抽象レジスタが確定値を保持していると定義され、セットＡの抽象レジスタが推測値を保持していると定義される。
【００４１】
セットＡおよびセットＢの抽象レジスタはレジスタペアを形成することが適切である。セットＡの各レジスタは、セットＢに対応するパートナレジスタを有する。ペアの一方がその抽象レジスタの確定値を保持し、他方が推測値を保持する。コードの各セクションの終わりにこれら２レジスタの定義を逆にし、次のコードセクション中にはペアの各レジスタが反対の機能を実行するようにする。各レジスタペアの２レジスタの機能を入れ替えることにより、現在のコードセクションについて入口条件を維持する単純で明快な方法が提供される。
【００４２】
他の利点としては、各コードセクションを正常に完了した際に、すべての抽象レジスタの状態を更新しなくともよい。そのセクション中に変更されたレジスタだけを更新し、その新機能を示せばよい。特定の抽象レジスタの値がコードセクション中に変更されない場合、その値は次のセクション中もそのまま保たれ、同じ確定機能または推測機能を適宜実行する。
【００４３】
次いで図５および図６を参照して、単純化した例示的実施形態を説明する。図５のステップ１で、サブジェクトプロセッサ１１のレジスタＸを表す第１抽象レジスタ（ＲｅｇＸＡ）は確定値を保持し、第２抽象レジスタ（ＲｅｇＸＢ）は推測値を保持している。抽象レジスタはメモリ位置内に保持されることが適当であり、レジスタＸの作業マップは推測バージョンＲｅｇＸＢの位置をポイントしている。同様に、この例のレジスタＹについては、初めＲｅｇＹＡが確定で、ＲｅｇＹＢが推測である。サブジェクトコード１０のブロック１００など１つまたは複数の命令の実行後、抽象レジスタのマッピングは図６に示すようにステップ２で更新される。この例では、推測レジスタＹの内容が変わり、したがって今度はＲｅｇＹＢが後続ブロックで使用される確定バージョンと見なされる。レジスタＹのマップは更新され、ＲｅｇＹＡを推測バージョンとしてポイントする。それに対して、レジスタＸはブロック１００中の１つまたは複数の命令によっては影響されておらず、したがって、ＲｅｇＸＡは確定バージョンのままであり、ＲｅｇＸＢは推測バージョンのままである。
【００４４】
コードセクション間でレジスタ内容の連続性を可能にするには、現在のコードセクション中に出会う最初の読み取り操作が、各特定抽象レジスタの確定バージョンを使用することが適切である。確定バージョンは、現在のコードセクションに入ったときのそのレジスタの状態を表しており、したがってそれより前のセクションとの連続性を維持する。その後の読み取り操作も、書き込み操作に出会うまで各抽象レジスタの確定バージョンを使用する。最初の書き込み操作は、各特定抽象レジスタの推測バージョンを使用する。したがって確定バージョンは変更されず、今度は推測バージョンが関連抽象レジスタの現行値を保持する。その後の読み取り操作および書き込み操作は、そのコードセクションの残りにわたって推測バージョンを使用する。
【００４５】
上記のように、本発明の好ましい実施形態では、サブジェクトプロセッサ１１の各物理レジスタに対応する抽象レジスタが提供され、この抽象レジスタは２つの所定位置にマップされている。抽象レジスタ位置の各ペアのうち１つは確定値を保持し、他方は推測値を保持する。これら２つの位置の機能を容易に逆転させ、確定的な内容を保持する位置を入れ換える。したがって時間のかかるコピー動作が回避される。
【００４６】
好ましい実施形態では、各抽象レジスタの２つのバージョンは２セットのメモリ位置にマップすることによって実現され、確定バージョンと推測バージョンの入れ換えは、これら２つの位置間でメモリマッピングを入れ換えることによって実現される。サブジェクトプロセッサの物理レジスタを複製するためにターゲットマシン内に保持されている抽象レジスタのマップを更新することは、変換時に迅速かつ簡単に実行され、変換コードをおそらくは多数回実行する際にオーバーヘッドが生じない。
【００４７】
別の好ましい実施形態では、メモリ位置のペアを使用する代わりに、抽象レジスタの確定バージョンおよび推測バージョンの一方または両方をターゲットマシンレジスタのペアに（十分な容量を持ったターゲットマシンに）記憶することができる。
【００４８】
本発明の好ましい実施形態の一態様は、分岐、特にサブジェクトコードの現在のブロックから以前に変換されたブロックへの分岐（あるいはループ）間にわたってレジスタ参照を固定するという問題を扱う。コードブロック間の分岐は実際には一般的に見られるものであるが、しばしばサブジェクトコード内の複数の他の位置から同じコードブロックを参照することを伴い、それにより異なる入口条件を生成してしまう。解決法の１つは、抽象レジスタの確定バージョンから推測バージョンに内容をコピーし、これにより入口条件を、以前に変換したコードブロックが使用するのに適したものにすることである。例えば、ブロックを最初に変換したとき、第１のバージョンＲｅｇＸＡは確定であった。したがって、変換したコードの同じブロックを後に再び使用することになり、抽象レジスタの第２バージョンＲｅｇＸＢが確定である条件の下でそのブロックに達した場合、継続する前にレジスタＸＢの内容をレジスタＲｅｇＸＡにコピーしなければならない。これは、以前に変換したコードブロックへの分岐を実施する際にコピーオーバーヘッドを生じさせる。本発明の実施形態で用いる好ましい解決法は、ブロックを今度は分岐時に用いられていた条件で再度変換し、以前に変換したコードの複数のバージョンをそれぞれ入口条件の特定セットと関連付けた状態で存在させることによりこのコピー動作を回避している。より多くの変換作業が必要となるが、実行中のコピーオーバーヘッドは回避される。一般に、サブジェクトコードセクション（任意の数の基本ブロックを含む）をもう１度変換すると、そのループ中に奇数回更新された特定レジスタに必要とされていた補償コピーを行わずに済む。
【００４９】
上記の実施形態は動的バイナリ変換を用いるエミュレータに関連するが、当方法は、大きなコードセクションを実行前に変換する静的変換にも応用することができる。静的変換では、変換のために選択されたコードセクションは通例、プログラム全体またはプログラムの大半部分を表す。それでも、コード変換および変換コードの実行中に生じる例外を処理し、少なくともそのコードセクションに入ったときの状態から例外処理を実行できるようにする上記の方法を使用することは都合がよい。さらに当方法は、サブジェクトマシンおよびターゲットマシンが、同一のまたは少なくとも互換性のある命令セットおよびアーキテクチャを有するプログラムコード最適化に応用することができる。
【００５０】
本発明は、上記の方法を実行するようにプログラムされた場合はコンピュータに、上記の方法を実行するためのコンピュータプログラムに、および上記の方法を実行するためのコンピュータ可読命令を保持するコンピュータプログラム製品にわたる。
【００５１】
読者の注意は、本願との関連で本明細書と同時にあるいは本明細書より以前に提出され、本明細書とともに公衆の便覧に公開されるすべての書類および文書に向けられ、これら書類および文書すべての内容は参照として本明細書に組み込む。
【００５２】
本明細書（添付の請求項、要約、および図面を含む）に開示したすべてのフィーチャ、および／またはここに開示する方法またはプロセスのすべてのステップは、そのようなフィーチャおよび／またはステップの少なくとも一部が相互に排他的である組み合わせを除いて、どのような組み合わせで組み合わせてもよい。
【００５３】
本明細書（添付請求項、要約、および図面を含む）に開示した各フィーチャは、特別に明確に述べない限り、同じ目的、同等の目的、あるいは類似の目的を満たす代替フィーチャで置き換えてもよい。したがって、特別に明確に述べない場合は、開示する各フィーチャは同等のフィーチャまたは類似のフィーチャの一般的なシリーズの一例にすぎない。
【００５４】
本発明は、前述した実施形態（１つまたは複数）の詳細には限定しない。本発明は、本明細書（添付請求項、要約、および図面をいずれも含む）に開示するフィーチャの任意の新しいフィーチャ、または任意の新しい組み合わせ、またはここに開示する方法またはプロセスのステップの任意の新しいステップ、あるいは任意のその新しい組み合わせにわたる。
【図面の簡単な説明】
【図１】  従来技術による典型的なサブジェクトプロセッサの構成の図である。
【図２】  バイナリ変換を使用する典型的なエミュレータの図である。
【図３】  本発明の好ましい実施形態で使用可能なバイナリ変換を使用するエミュレータの構成を表す図である。
【図４】  使用される好ましいバイナリ変換タイプエミュレータの図である。
【図５】  例示的抽象レジスタセットの図である。
【図６】  例示的抽象レジスタセットの図である。
【図１】
0004709394.tif 000002
【図２】
0004709394.tif 000003
【図３】
0004709394.tif 000004
【図４】
0004709394.tif 000005
【図５】
0004709394.tif 000006
【図６】
0004709394.tif 000007