(57)【特許請求の範囲】
【請求項１】
ホスト・マイクロプロセッサ上で走らせるために、ターゲット・マイクロプロセッサのために設計された命令から変換された命令に対する変換コンテキストを維持する方法であって、
変換された各ホスト命令に関係する変換コンテキストを格納するステップと、
前記ホスト・プロセッサによって現在実行されているホスト命令に対する変換コンテキストを指示するステップと、
次のホスト命令のために格納されている変換コンテキストを、現在実行中のホスト命令に対する変換コンテキストと比較するステップと、
前記次のホスト命令の変換コンテキストと現在実行中のホスト命令の変換コンテキストとが一致した場合、前記次のホスト命令を実行するステップと、
前記次のホスト命令の変換コンテキストと、前記現在実行中のホスト命令の変換コンテキストが一致しない場合、前記現在実行中のホスト命令の変換コンテキストに相当する変換コンテキストを有する命令を検索するステップと、
から成る方法。
【請求項２】
請求項１記載の方法において、変換された各ホスト命令に関係する変換コンテキストを格納する前記ステップは、変換コンテキストの表現を、変換されたホスト命令の一部として格納することから成る方法。
【請求項３】
請求項２記載の方法において、前記表現は、変換コンテキストを格納してあるアドレスに対するポインタである方法。
【請求項４】
請求項２記載の方法において、前記表現は、変換コンテキストを示す１組のビットである方法。
【請求項５】
請求項２記載の方法において、前記表現は、変換コンテキストを示す１組のビットと、および追加の変換コンテキストを格納してあるアドレスに対するポインタである方法。
【請求項６】
請求項１記載の方法において、変換された各ホスト命令に関係する変換コンテキストを格納するステップは、変換されたホスト命令以外に変換コンテキストの表現を格納することから成る方法。
【請求項７】
請求項１記載の方法において、次のホスト命令のために格納されている変換コンテキストを、現在実行中のホスト命令に対する変換コンテキストと比較する前記ステップは、変換にアクセスするときに行われる方法。
【請求項８】
請求項１記載の方法であって、更に、変換されたホスト命令の第１のシーケンスの変換コンテキストと後続の変換されたホスト命令の変換コンテキストが一致した場合、前記変換されたホスト命令の第１のシーケンスを、前記変換されたホスト命令の後続のシーケンスとリンクするステップを含む方法。
【請求項９】
請求項８記載の方法において、次のホスト命令のために格納されている変換コンテキストを、現在実行中のホスト命令に対する変換コンテキストと比較する前記ステップは、第１の変換シーケンスを後続の変換シーケンスにリンクするときに行われる方法。
【請求項１０】
請求項１記載の方法であって、更に、後続の変換されたホスト命令に影響を与える第１の変換されたホスト命令の変換コンテキストが、前記後続の変換されたホスト命令の変換コンテキストと一致する場合、前記第１の変換されたホスト命令を前記後続の変換されたホスト命令にリンクするステップを含む方法。
【請求項１１】
１つ以上のターゲット命令から成るソースグループと、１つ以上のターゲット命令から成る目標グループとであって、前記ソースグループが次の命令が前記目標グループに有ることを示す終点を含むもの、を実行する方法であって、
前記ソースグループをソース変換に変換するステップと、
前記目標グループを目標変換コンテキストを伴う目標変換に変換するステップと、
前記目標変換コンテキストを記憶するステップと、
前記ソース変換を終点まで実行し、実行コンテキストを指示するステップと、
前記実行コンテキストと前記目標変換コンテキストとを比較するステップと、
前記比較が成功した場合、前記目標変換を実行するステップと、
から成る方法。
【請求項１２】
請求項１１記載の方法であって、更に、前記比較が成功した場合、前記ソース変換を前記目標変換にリンクするステップを含む方法。
【請求項１３】
請求項１２記載の方法であって、前記リンクするステップが更に、前記ソース変換を前記目標変換に直接ジャンプするように修正するステップを含む方法。
【請求項１４】
請求項１１記載の方法であって、更に、前記比較が成功した場合、前記ソース変換の次の実行後の前記比較ステップを負うことなく、前記ソース変換を修正するステップを含む方法。
【発明の詳細な説明】
【０００１】
（発明の背景）
発明の分野
本発明は、コンピュータ・システムに関し、更に特定すれば、異なるプロセッサによる実行のために設計されたプログラムから変換されたプログラムを実行する際にマイクロプロセッサの性能を向上させる装置および方法に関する。
従来技術の説明
最近、単純であるが高速のホスト・プロセッサ（「モーフ・ホスト」と呼ぶ）とソフトウエア（「コード・モーフィング・ソフトウエア」と呼ぶ）とを組み合わせ、モーフ・ホスト・プロセッサのそれとは異なる命令セットを有するターゲット・プロセッサ用に設計したアプリケーション・プログラムを実行する新たなマイクロプロセッサが開発された。モーフ・ホスト・プロセッサは、コード・モーフィング・ソフトウエアを実行し、ターゲット・アプリケーション・プログラムを、当該ターゲット・アプリケーション・プログラムの目的を達成出来るホスト・プロセッサ命令に動的に変換する。前記命令を変換する際、それらは変換バッファに格納され、それらは、更に変換を行わずにアクセスすることができる。プログラムの初期変換は低速であるが、一旦変換されれば、プログラムを実行するためにハードウエアで通常必要となるステップの多くは不要となる。新たなマイクロプロセッサは、単純で高速な低消費電力設計のプロセッサが、変換した「ターゲット」命令を、プログラムを設計した対象である「ターゲット」プロセッサと同等の速度で実行可能であることを実証した。
【０００２】
変換の問題を複雑化させているのは、コンピュータ・システムを動作させるために、ターゲット・コンピュータのハードウエアおよびそのオペレーティング・システムによって実行される種々の割込および例外である。ターゲット・コンピュータの動作中にターゲット例外が発生すると、その例外の時点におけるコンピュータの状態をセーブすべく、通例では、その動作を遂行するマイクロコード・シーケンスをコールし、正しい例外ハンドラを読み出し、例外を処理し、ついでプログラムを継続するためにプログラムにおける正しい地点を探しださなければならない。多くの場合、このためには、例外が発生した時点におけるターゲット・コンピュータの状態にプログラムを戻さなければならない。これらの動作を遂行するためにターゲット・コンピュータのハードウエアおよびソフトウエアによってもたらされる結果は、モーフ・ホスト・プロセッサがこれらの例外に正しく応答できるように、何らかの方法で変換のプロセスによって与えられなければならない。
【０００３】
他のプロセッサのために設計されたプログラムを高速で走らせることを可能にするために、モーフ・ホスト・プロセッサは多くのハードウエア強化策を盛り込んでいる。これら強化策の１つに、ゲート付きストア・バッファがある。これは、変換された命令シーケンスの実行の結果生じたメモリ・ストアを一時的に変換バッファに格納する。第２の強化策は、変換されているターゲット命令の任意のシーケンスの先頭におけるターゲット・プロセッサの状態を格納する、通常のワーキング・レジスタに追加された１組のホスト・レジスタである。ターゲット命令シーケンスは、ホスト命令に変換され実行される。シーケンスは、ターゲット状態が既知の時点で開始し終了する。変換された命令が例外を発生させることなく実行した場合、変換されたホスト命令の実行によって発生したメモリ・ストアを、コミット命令によってメモリに格納し（記憶し）、次いでターゲット状態を保持しているレジスタを、シーケンスが完了した時点におけるターゲット状態に更新する。
【０００４】
しかしながら、ホスト命令シーケンスの実行中に例外が発生した場合、処理を停止し、ターゲット・プロセッサの既知の状態が存在する、ターゲット命令シーケンスの先頭に、動作全体を戻せばよい。これによって、命令を動的に変換および実行しつつ、発生した例外の迅速かつ精確な処理が可能となる。
【０００５】
変換の実行が成功裏に完了するまで一時記憶ユニットに実行によって生成された結果を置いておくことによって、新たなマイクロプロセッサが変換の実行を処理する際に用いる方法は、実際上高速な推定方法であることが注目される。実際に、新たなマイクロプロセッサは、他の動作の成果(outcome)を推定するのと同じ回路を用いる。例えば、単純に変換された命令から、ソフトウエア・スケジューラによって並び替えられた命令シーケンスの実行結果を一時的に保持することによって、従来技術が企図したものよりも一層強力な並び替えを行うことができる。このように並び替えられた命令シーケンスを実行して正しい結果を得た時、並び替えたシーケンスの実行によって生じたメモリ・ストアをメモリに記憶することができ、ターゲット状態を更新することができる。並び替えたシーケンスが、実行中に、例外を発生した場合、プロセッサの状態は、シーケンスの先頭におけるターゲット状態にロールバックし、より保守的な手法を採用してシーケンスの実行を行う。
【０００６】
新たなマイクロプロセッサの最も有効な特徴の１つは、変換された命令の長いシーケンスを共にリンクできることにある。一度短いターゲット命令シーケンスが変換され、例外を発生することなく実行できることが見出されると、命令の長いシーケンスを形成するために、多数のこれらの短いシーケンスを共にリンクすることが可能である。これによって、変換されたプログラムを非常に高速で実行することが可能となる。何故なら、マイクロプロセッサは、ハードウエア・プロセッサが命令を実行するために通常行う（より短い変換されたシーケンスの各々を調べるような）ステップの全てを経る必要がないからである。予測したよりも更に高い速度を達成する場合もある。何故なら、一旦長いシーケンスをリンクすれば、多くの場合、最適化器は、生成される結果を変更することなく、長いシーケンスからステップの多くを排除することが可能となるからである。ハードウエアの最適化器は、際だった最適化を可能にするパターンを顕在化させることができるほど長い命令シーケンスの最適化をこれまで全くできなかった。
【０００７】
プロセッサが命令を実行しているときは何時でも、種々の特性を有する何らかの特定的なモードで走っている。アプリケーションの命令は、常に正しい結果を生成するために正しいモードで実行しなければならない。あるモードのこれらの特性は、実際上命令に対する背景であり、命令の一部と考えることもできる。プロセッサが命令を実行する際、これらの命令の内あるものは特性を変化させ、したがって動作モードを変化させる場合がある。このため、これら異なるモードを処理するためには、マイクロプロセッサの多数の特性を別々に設定しなければならない。命令が正しい結果をもたらすために正しく設定しなければならない機械状態の特性のことを、命令が実行するコンテキストと呼ぶのが通例である。コンテキストは、命令の実行から正しい結果を生成するために必要な機械の正しい状態と要約して言うこともできよう。
【０００８】
新たなプロセッサが、第１命令セットを有するターゲット・プロセッサのために設計された命令シーケンスを、異なる命令セットのホスト命令シーケンスに変換する際に、変換および実行しつつコンテキストを維持する必要性から重大な問題に直面する。
【０００９】
プログラムを実行する際、何千もの異なる事柄がコンテキストを構成する可能性がある。コンテキストを構成し得る多くの要素の内わずか数個をあげるだけでも、問題がいかに複雑であるか例示することになろう。当業者は、文字どおり何百もの可能な項目がコンテキストにはあることがわかるであろう。
【００１０】
多くのマイクロプロセッサは、使用するオペレーティング・システムの能力に応じて、８ビット、１６ビット、および３２ビット・ワード長の命令を有するアプリケーション・プログラムと共に機能するように設計されている。多くの場合、同じ命令が、異なるワード長の命令で書かれたアプリケーションで利用されている。しかしながら、マイクロプロセッサの特性が３２ビット命令を実行するために設定されているにも関わらず、１６ビット命令を実行しようとすると、恐らく命令は正しく実行しない。このように、命令のワード長は、実行の目的のためのターゲット・プロセッサ・コンテキストと見なすことができる。
【００１１】
別の例として、命令は異なるレベルのパーミッションで実行する。つまり、ある命令は最高レベルのアクセスを有するものでのみ実行可能であり、別の命令は、より低いレベルのユーザやより高いレベルのユーザによって実行可能な場合もある。変換された命令を実行する際、同じアクセス・レベルを維持し、アプリケーションが、無関係のアプリケーションの資産(asset)に干渉できないようにする必要がある。
【００１２】
Intel X86を基本とするマイクロプロセッサでは、コードおよびデータの様々な部分（セグメント）をメモリのどこに格納するか、アプリケーションに指定させている。例えば、プログラムは、当該プログラムのセグメントに対するベース・アドレスおよび長さを指定するので、コード・セグメントは１つのベース・アドレスで開始してあるメモリ量にわたって継続し、一方データ・セグメントは異なるベース・アドレスで開始して、異なるメモリ量を含むようにすることができる。あるいは、プログラムは、単一のフラット・セグメントを指定し、プログラムの全ての命令、データ、およびその他の要素を格納するために用いることも可能である。更に、１つのプログラムのセグメント全てを同じベース・アドレスで開始し、異なる終了アドレスまで及ばせることも可能である。したがって、利用するベース・アドレスの構成は、命令を実行する上で非常に重要な特性である。異なる用途に割り振ったメモリのエリアが混乱すると、恐らくプログラムは適正な結果が得られるような命令の実行が出来なくなるであろう。つまり、これはコンテキストの重要な要素となり得るのである。
【００１３】
アプリケーションが、ページングをイネーブルして実行するように設計されている場合、アプリケーションは、発生し得るページング例外に対処しなければならない。アプリケーションが、ページングをオフにして設計されている場合、ページング例外は発生し得ない。したがって、ページングも、コンテキストの重要な要素となり得る。
【００１４】
命令を実行するときにはいつでも、正しい結果を生成する命令に命令をコンパイルするときと同じでなければならない特性が他にも数多くある。Intel X85プロセッサが用いるような複雑な命令セットでは、コンテキストを構成する特性の数は非常に大きい。
【００１５】
ターゲット・プロセッサによる命令の実行と同様、ターゲット命令から変換されたホスト命令は、これら変換された命令を実行しホスト・システムによって同じ結果を生成しようとする場合、ターゲット命令を設計した対象である元のプロセッサのコンテキストを維持する必要がある。命令から異なる結果を得る可能性があるコンテキストの項目は、変換から実行まで一定のままでなければならないので、正しい結果が生成されることを保証するためには、文字通り何百ものコンテキストの要素を、各変換の一部とする必要があるように思われる。
【００１６】
いつプロセッサ上で命令を実行して正しい結果を生成するかは非常に重大であるが、できるだけ迅速に命令を実行することも望ましいのである。一般に、これを達成するには、できるだけ効率的に走るコードを生成する。コンテキストまたは機械状態は、どれくらい効率的にコードを作成できるかを制御するに過ぎない。命令を実行する機械状態には多くの特性があり、変換および実行の効率に影響を与え、命令をより速く走らせたり、実行に対して他の何らかの望ましい効果を有する場合もある。全ての場合において、ターゲット・マイクロプロセッサ上で特定のモードで実行される命令が、ホスト・システムにおける同じモードで命令を実行するように設定された特性を有する環境において実行されることが重要である。更に、ターゲット・コードの最適化変換を実行する変換コンテキストを、最適化コードを実行するときに維持しておくことが重要である。
【００１７】
したがって、異なる命令セットを有するターゲット・プロセッサのために設計された命令から変換された命令を実行するマイクロプロセッサが、ターゲット・プロセッサのコンテキストを維持することができ、変換された命令の実行によって正しい結果が得られるようにする装置および方法を提供することが望ましい。
【００１８】
同様に、動的変換によって確保された速度、および新たなプロセッサによって実用化した最適化を、元々設計されたのと同じコンテキストで変換を実行することを保証するプロセスにおいて維持することも望ましい。
（発明の概要）
したがって、本発明の目的は、変換された命令を、それらが元々変換されたのと同じ変換コンテキストで実行されることを保証し、可能なときはいつでも、変換された命令の実行速度を落とすことなく、これを行うことである。
【００１９】
本発明のこの目的およびその他の目的は、変換された命令の部分毎に変換コンテキストを維持し、変換された命令の新たな部分を実行すべきときにはいつでも、モーフ・ホストが機能する変換コンテキストを、変換された命令の当該部分の変換における変換コンテキストと比較し、変換コンテキストが同じである場合は実行を許可し、変換コンテキストが異なる場合は、異なる変換の検索、または変換された命令の部分が得られた元の命令の再変換を行わせる方法によって達成される。
【００２０】
本発明のこれらおよびその他の目的ならびに特徴は、図面と共に以下に続く詳細な説明を参照することによって、一層良く理解されよう。図面においては、いくつかの図を通じて同様の要素を同様の符号で示すこととする。
（詳細な説明）
先に多少詳しく説明したように、新たなマイクロプロセッサは、コード・モーフィング・ソフトウエアを実行する。コード・モーフィング・ソフトウエアは、ターゲット命令シーケンスをホスト命令シーケンスに変換し、これら変換した命令シーケンスを再利用のために変換バッファに格納し、これら変換した命令シーケンスを実行しようとし、変換したシーケンスが実行して正しい結果を生成した場合状態およびメモリを更新し、変換した命令シーケンスを実行しようとして、実行しても正しい結果を生成しない場合、その効果を破棄する。格納されている変換した命令シーケンスは、最適化され、多くの場合互いにリンクして変換した命令の長いシーケンスを生成することができる。これら長いシーケンスを更に最適化してその長さを短縮し、実行の効率を高めることにより、多くの場合新たなプロセッサが元の変換よりもはるかに速く動作を実行できるようにする。
【００２１】
変換した命令シーケンスが、元のターゲット命令によって生成される結果を生成するために、新たなプロセッサは、ターゲット命令の各々を正しくデコードしなければならない。これが意味するのは、新たなプロセッサは、変換した命令が元の命令のコンテキスト全てを含み、これら元の命令の意味が完全に変換されることを保証しなければならないということである。例えば、変換は、セグメント型、そのベース・アドレス、および適正なメモリ・アクセスを実行可能な範囲を規定する情報を決定できなければならない。変換は、実行中にページングがイネーブルされているか否か判断し、アドレスをどのように計算するか、そしてページ例外を受け入れるべきか否かを把握しなければならない。変換は、変換されたターゲット・シーケンスによって達成される結果が、変換されたシーケンスがホスト・プロセッサによって実行されるときにも得ることを可能にする、コンテキストの他の要素全てを決定できなければならない。
【００２２】
例えば、Ｘ８６プロセッサ用の以下のような命令
add $eax, 4($ebp);
は、Ｘ８６プロセッサに、「ebp」レジスタ内の値に４を加算して、セグメント・オフセットを決定するように指令する。このセグメント・オフセットをチェックして、これが、アクセスされているメモリ・セグメント（スタック・セグメント）のセグメント境界内にあるか否か判定を行う。加えて、Ｘ８６プロセッサは、命令が、アクセスされているメモリ・セグメントに対して読み出しおよび／または書き込みを行うことを許されているか否かチェックを行い、最後に、セグメント・オフセットをセグメント・ベースに加算して、線形アドレスを生成する。次に、線形アドレスを用いて、命令によってアクセスされたメモリ位置の物理アドレスを決定する。次に、物理アドレスを用いて、当該メモリ位置に格納されている値をフェッチし、このメモリの値を「eax」レジスタ内の値に加算する。
【００２３】
しかしながら、命令のこれらの要素に加えて、多数の暗示的要素がある。例えば、ここでは、「ebp」レジスタの使用は、スタック・セグメントの使用を暗示する。異なるレジスタの使用は、異なるセグメントの使用を伴うことを意味する場合もある。
【００２４】
Ｘ８６セグメントは、「拡大」(grow up)や「縮小」(grow down)をすることができる。スタック・セグメントは頻繁に縮小し、他のセグメントは大抵の場合拡大する。セグメント・オフセットが特定のセグメントに対して有効か否かについての判定は、アクセスされているセグメントが拡大するかまたは縮小するかによって異なる。拡大セグメントでは、有効なオフセットは０からセグメント限界までの範囲を取る。縮小セグメントでは、有効なオフセットはセグメント限界から、１６ビット・セグメントでは最大のオフセット（２16-１）および３２ビット・セグメントでは最大のオフセット（２32-１）までの範囲を取る。
【００２５】
線形アドレスを計算したなら、ページングがイネーブルされているか否か判定を行う。イネーブルされていない場合、線形アドレスはメモリ・データの物理アドレスである。ページングがイネーブルされている場合、物理アドレスを計算しなければならない。いずれの場合でも、メモリ・セグメントの限界を検査し、アドレスが正当か否か判定を行う必要があり、最終的にデータにアクセスし、eaxレジスタ内の値に加算する。
【００２６】
このように、この単純な命令では、ebpレジスタがスタック・レジスタであるという知識、メモリ内のスタックのベース・アドレス、セグメントが拡大するか縮小するかに依存するセグメントの有効オフセット範囲、ページングがイネーブルされているか否か、アドレスされているメモリ・セグメントの型、およびそのベース・アドレスは、全て、コンテキストを構成する特性であって、実行時に動作を適正に遂行できるためには、変換した命令について知っていなければならないことである。
【００２７】
実際、インタープリタ(interpreter)がターゲット命令を実行するとき、これら暗示的な（即ち、背景）ステップを全て実行し、命令を正しく実行するためにチェックを行う。暗示的ステップおよびチェックは、明示的に実行しなければならず、大きな負担となる虞れがある。同じことは、ターゲット命令からホスト命令への単純な(naive)変換にも言えよう。
【００２８】
当業者であれば認めるだろうが、命令は、動作モードを構成する特性の１つを変えることによって、命令が実行するコンテキストを変えることができる。このため、新たなプロセッサは、命令を追跡し、変換した命令シーケンスを実行すべきコンテキストをターゲット命令が変化させたとき、変換されたシーケンス内でコンテキストの要素が変化することを保証しなければならない。このようにして、変換したシーケンスのコンテキストが、変換したシーケンスが実行を完了するときに、新たなプロセッサに対して正しく表現されるようになる。
【００２９】
変換した命令シーケンスの各々が、コンテキストを構成する必要な特性全てを決定することができる情報を含まなければならないだけでなく、変換した命令シーケンスのいずれもが正しく実行され、次のシーケンスを実行しようとするときにはいつでも、新たなプロセッサは、現在それが動作しているコンテキストが、次のシーケンスの先頭を正しく実行するために必要なコンテキストであることを保証しなければならない。このため、新たなプロセッサは、変換した命令の最初のシーケンスの終了時に存在するコンテキストを検査し、これが、変換した命令の次のシーケンスが必要とするコンテキストと同一であることを保証しなければならず、そうして初めて次のシーケンスの実行を開始することができる。
【００３０】
同様に、変換した命令シーケンスを２つリンクして単一のシーケンスにするためには、新たなプロセッサは、第１シーケンスが実行を終了するときのコンテキストが、リンクされるシーケンスが実行を開始するときのコンテキストと同一であることを確認しなければならない。
【００３１】
以上からわかるように、変換した命令シーケンス各々にコンテキストの要素全てを含ませ、実行を開始する前に新たなシーケンス各々のコンテキストをチェックする必要性があるため、効率的なコードが生成できない。
【００３２】
本発明は、これらの問題を克服し、ターゲット・プロセッサが同じコードを実行する速度に匹敵する速度で効率的に実行するコードを生成する。本発明は、局在性(locality)の性質に基づいて、一層効率的に実行するコードを発生する。
【００３３】
更に具体的には、殆どの場合、いずれのプロセスまたはプログラムにおいてもプロセッサが実行する命令は、１回よりも多く実行されるか、または殆どの時間他の命令と共に実行される傾向がある。これは、ある命令シーケンスと次の命令シーケンスのコンテキストが同様または同一となるという効果を有する。例えば、コンテキストの要素の多くは、アクセスされる特定のメモリ・セグメントに依存し、セグメントのベース・アドレスおよび範囲、セグメントが拡大するのかまたは縮小するのか、ならびにセグメントは書き込み可能かまたは読み出しのみが可能かということは、全て、アクセスされるセグメントに依存する要素である。これらの要素は、セグメントがあるシーケンスと次のシーケンスで同じであれば、同じである。殆どの場合、第１のシーケンスに用いられるメモリ・セグメントは、次のシーケンスに用いられるセグメントと同じである。また、コンテキストの他の要素も、局在性の特性を表す。局在性の性質によって、本発明はシーケンス同士でコンテキストが同一であることを仮定することが可能となる。
【００３４】
コンテキストが同一であるという仮定によって、新たなプロセッサは、命令シーケンスを変換する際に、変換を適正に実行するためのコンテキストをある不変量としての様式で表現することが可能となる。次いで、変換に対するコンテキストが正しいことを判定するために必要な検査の各々を隈無く行う代わりに、プロセッサは、コンテキスト全体が同じであることを判定するために、前記表現を単にチェックするのみとする。これが同一であれば、変換したシーケンスを実行することができる。同一でない場合、プロセッサは、判断基準を満たす別の変換を探す。何も見つからない場合、新たな変換を発生しなければならない。概略的な方法を図１のフロー・チャートに示す。
【００３５】
尚、局在性の性質をこのように用いることによって、変換した命令シーケンスを、不変量として扱われているコンテキストの要素に内在する命令の分だけ、短縮できることがわかるであろう。図２は、インタープリタが前述の加算(add)関数のステップを実行するために必要なステップを表す動作シーケンスを示す。見てわかるように、これらのステップの内少なくとも１０個は、加算関数と同じ結果を与えるように動作が実行されることを保証するためにシーケンスに挿入されるコンテキストによって必要とされるステップである。アステリスクを付けた動作は、命令シーケンスから除去し、変換したシーケンスの先頭において何らかの方法で表すことができる。例えば、２つの状態の一方または他方であり得るコンテキストの要素は、各々、コンテキストの最初の表現（例えば、クアッド・ワード(quad word)）のいずれかの指定位置における単一ビットによって表すことができ、一方、より多くの状態を有する特性は、クアッド・ワードの他のいずれかの指定位置において、より多くのビット数を必要としよう。
【００３６】
図３は、変換した命令の第１のシーケンスの実行を完了し、次のシーケンスを開始する際における、新たなプロセッサの動作を示すフロー・チャートである。図示する第１のステップは、次の命令シーケンスのコンテキストの検査である。新たなプロセッサは、コンテキストの現在の表現を見て（第１のシーケンスが完了したときに機械が動作していたコンテキスト）、このコンテキストを次のシーケンスのコンテキストの表現と比較する。コンテキストが全体的に同じであれば、以前のシーケンスと同じコンテキストで、変換した命令の次のシーケンスを実行する。これによって、以前のシーケンスにおいて、コンテキストが正しいか否か判定するために必要とされたステップ全てが不要となる。図２においてアステリスクを付けたステップを実行する代わりに、新たなプロセッサは、各条件を満たすことを仮定し、それに応じて以下のステップを実行する。
【００３７】
コンテキスト全体が同じでない場合、次の命令シーケンスを実行しない。代わりに、新たなプロセッサは、次のシーケンスに対する判断基準を満たす、別の変換した命令シーケンスを検索する。通例、これは同じターゲット命令シーケンスの別の変換であるが最後に実行したシーケンスのコンテキスト表現と同じコンテキスト表現を有するものである。このようなシーケンスは存在しない可能性がある。その場合、新たなプロセッサは、コード・モーフィング・ソフトウエアを実行してかかる変換を作成し、この変換をそのコンテキスト表現と共に将来の利用のために変換バッファに格納する。
【００３８】
変換した命令シーケンスが実行するコンテキストが正しいことを保証するためには、コード・モーフィング・ソフトウエアがコンテキストの予測可能な変化を追跡し、何らかの変化が生じたときにはいつでも、コンテキストの表現を正しい表現に変更する必要がある。このようにして、ホスト・プロセッサが現在実行しているコンテキストは、次のシーケンスのコンテキストの検査を行うときには、正しく表現されることになる。
【００３９】
また、コード・モーフィング・ソフトウエアが、予測不可能にコンテキストを変化させる命令を検出することも重要である。例えば、命令が新たなセグメント・レジスタにロードする場合、セグメント毎に変化する可能性のある判断基準が全て変化する場合がある。セグメント・レジスタにロードした後、実際上新しいコンテキストがあれば、シーケンスにおけるその時点以降は、この新しいコンテキストを命令の実行に用いるべきである。影響を受けたコンテキストの部分に依存する後続の命令（例えば、ロードされたセグメント・レジスタにアクセスするあらゆる命令）はどれも、新たなコンテキストが適切であることを検証せずに実行することはできない。コード・モーフィング・ソフトウエアは、２つの間のいずれの地点においても変換を終了することが出来、および／またはコンテキストが変化した地点と、後続の命令が更新値に依存する地点との間でコンテキストを検証するように構成することが出来る。
【００４０】
変換した異なるシーケンスをリンクし、これらが単一のより長いシーケンスとして機能するようにすることによって、著しい実行の加速が得られるので、リンク・プロセスの使用は非常に望ましい。２つのシーケンスをリンクしようとする場合、より長いシーケンスの各部分が正しく実行しなければならないことは理解されよう。したがって、より長いシーケンスの各部分が正しく実行するためには、コンテキストが適切でなければならない。これを達成するには、本発明の一実施形態では、第２の変換したシーケンスのアドレスを用いることによって、第１の変換したシーケンスを第２のシーケンスにリンクする。新たなプロセッサでは、アドレスはプログラム制御ユニットに保持されるのが通例である。１つのシーケンスを他のシーケンスにリンクしようとする場合、第１のシーケンスは、プログラム制御におけるアドレスを指示することによって終了する。第２のシーケンスに入ると、変換がコンテキストの表現をチェックし、これが、第２のシーケンスが要求するコンテキストと同一であることを確認する。
【００４１】
ホストのコンテキストを、リンクしたシーケンス毎に第２のシーケンスが要求するコンテキストの表現と突き合わせて検査するには、ある数の動作サイクルを要する。このため、本発明の更に高度化した実施形態では、変換からコンテキスト検査を除去し、図４に示すように、元のリンク・プロセスにこれを置く。即ち、２つのシーケンスをリンクすることを最初に決定するときには、第１のシーケンスが終了する際にこれが実行しているコンテキストを、第２のシーケンスが実行を開始する際のコンテキストと比較する。この場合、各々のコンテキストの表現を比較する。コンテキストの表現が同じである場合、リンクを実施する。その後、より長いシーケンスを実行するときには、２つのシーケンスをリンクした時点におけるコンテキストの検査はもはや不要である。第１のシーケンスの終点は、単に第２のシーケンスのアドレスを示すだけであり、リンクが行われる。命令の実行を加速するには、リンクしたシーケンスを実行する毎にチェックするのではなく、元のリンク時点でのみコンテキストをチェックする。
【００４２】
同様に、変換の検索を実行するときにはいつでも、一実施形態では、特定の変換および特定のコンテキスト双方を探す。このようにして、機械動作コンテキストの要求変換コンテキストに対するチェックを、変換したシーケンスから完全に除去し、図５に示すように、コード・モーフィング・ソフトウエアのディスパッチ機能に置く。本質的に、ディスパッチ機能は、新たな変換が必要とされるときまたは提案されたリンクを実行すべきときにはいつでも、変換バッファを検索して正しい変換および正しいコンテキストを求めることによって、変換した命令の次のシーケンスを探して実行する。
【００４３】
本発明は、命令の実行速度を更に高める拡張機能を設ける。本発明によって設けられる拡張機能の１つは、命令が予測不可能にコンテキストを変化させる場合に、リンクを行うことを可能にする。この動作は、プログラム・コントローラによって保持されているアドレスへのリンク、次いで現コンテキストに対する新コンテキストの検査を行うことを可能にする。コンテキストの表現が同じであれば、リンクを継続することができる。
【００４４】
別の拡張機能（図５にも示されている）は、新たに変換したシーケンスが、正しい結果を生成するためには、ホストが実行中の現コンテキストと同じコンテキストを有することは常に必要な訳ではないという事実に依存する。変換したシーケンスの中には、ホストが実行中のコンテキストよりも少ないコンテキストの要素、または制限の少ないコンテキストの要素に依存するものもある。このようなシーケンスは、更に実行すべきシーケンスの正しい実行のために必要なコンテキストがある限り、実行し且つ以前のシーケンスにリンクすることができる。これは、実行すべき変換したシーケンスのコンテキストの表現を、ホストの現コンテキストの表現と比較し、異なるコンテキストの要素を判定することによって、検査することができる。次いで、異なる要素を検討し、これらが、実行すべきシーケンスに対して必要であるか否か判定を行い、必要であれば、相違は、実行すべきシーケンスにおいてこれらの制約が少なくなることであるか否か判定を行う。コンテキスト要素が必要でないかあるいは制約が少ない場合、シーケンスは実行またはリンクすることができる。
【００４５】
コンテキストを表現する態様は、図６に示すように、広い範囲にわたって様々に異なる可能性がある。例えば、互いに連結したときのコンテキスト要素全てが、機械レジスタ（例えば、３２または６４ビット）において容易に利用可能なビット以下を占める場合、コンテキストはこのような連結によって表現することができ、表現に対する単純なビット演算（例えば、ＸＯＲおよびＡＮＤ）を実行することによって、容易に検査を行うことができる。あるいは、コンテキストにおける要素の数およびサイズが、レジスタにおいて容易に利用可能なビット数を上回る場合、コンテキスト要素をメモリ内のデータ構造に格納すればよく、そのデータ構造内へのポインタを用いて、比較を行い正確なコンテキストの一致を求めることができる。すると、ポインタはコンテキストの表現となる。コンテキストの個々の要素に依存する、一層複雑な比較（正確な一致ではない）を行うのであれば、メモリ内のデータ構造にアクセスしなければならないであろう。
【００４６】
コンテキストを表現する別の方法は、これら２つの技法の混成である。要素の一部は直接表現することができ、一方他の要素はメモリに格納する。表現の残りは、メモリ内のデータ構造に対するポインタ／インデックスである。この場合も、正確な比較は単純であり、一方要素に依存する比較はより複雑である。
【００４７】
以上、好適な実施形態に関して本発明を説明したが、本発明の精神および範囲から逸脱することなく、種々の変更や変形が可能であることが当業者によって認められよう。したがって、本発明は、特許請求の範囲に関して判断するべきである。
【図面の簡単な説明】
【図１】  図１は、本発明による方法を示すフロー・チャートである。
【図２】  図２は、１つの特定の命令を実行する際に必要なステップを示す図である。
【図３】  図３は、本発明を実施する方法を示すフロー・チャートである。
【図４】  図４は、本発明の方法の一部を示すフロー・チャートである。
【図５】  図５は、本発明の方法の別の一部を示すフロー・チャートである。
【図６】  図６は、本発明によるコンテキストの表現を示す図である。
【図１】
0003786603.tif 000002
【図２】
0003786603.tif 000003
【図３】
0003786603.tif 000004
【図４】
0003786603.tif 000005
【図５】
0003786603.tif 000006
【図６】
0003786603.tif 000007