(57)【要約】【課題】Ｊａｖａバイトコードに対するハードウエアエグゼキュータを用いてサポートネイティブ命令とＪａｖａバイトコードの双方の実行をサポートする。双方がハードウエアによってサポートされていない場合はＪａｖａバイトコードに対するソフトウエア命令インタープリタを用いてその双方の実行をサポートする。【解決手段】Ｊａｖａバイトコードに対する処理を実行するソフトウエア命令インタープリタ内のネイティブ命令のシーケンスは、イネーブルされたハードウエアエグゼキュータが存在していることを検出されたかどうかによって作用が異なるシーケンス終了命令内で終了する。このハードウエアエグゼキュータの存在が検出されると、次のＪａｖａバイトコードが試行される。アクティブなハードウエアエグゼキュータが存在しない場合、次のＪａｖａバイトコードは直接、ソフトウエア命令インタープリタに渡される。【選択図】図１
2008123545.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラム命令セットからのプログラム命令又は第２のプログラム命令セットからのプログラム命令の制御下でデータを処理する装置において、該装置が、
プロセッサコアと、
前記プロセッサコアによって実行されることよって、前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスとして解釈するように動作するソフトウエア命令インタープリタと、
命令デコーダ回路と、
を備え、
前記命令デコーダ回路は、前記シーケンス終了命令に反応して、
（ｉ）前記第２の命令セットに対するハードウエア命令変換ユニットが利用可能でない場合、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタを用いて始動し、
（ｉｉ）前記第２の命令セットに対する前記ハードウエア命令変換ユニットが利用可能である場合、前記第２の命令セットの内の前記次のプログラム命令の変換を、前記ハードウエア命令変換ユニットを用いて始動する、
前記装置。
【請求項２】
前記ハードウエア命令変換ユニットが、
（ｉ）前記ハードウエア命令変換ユニットがイネーブルされていないため、又は
（ｉｉ）ハードウエア命令変換ユニットが存在しないため、
利用可能でない、請求項１に記載の装置。
【請求項３】
前記命令デコーダ回路は、少なくとも１つのハードウエア命令変換ユニットフラグに反応して、ハードウエア命令変換ユニットが利用可能であるかどうか検出する、請求項１又は２に記載の装置。
【請求項４】
前記ソフトウェア命令インタープリタは、前記第１の命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応しており、
前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を解釈するように働く前記第１の命令セットの内のプログラム命令の前記複数のシーケンスの内の更なるシーケンスの前記ソフトウエア命令インタープリタ内のソフトウエア解釈開始アドレスを指定し、前記ソフトウエア命令インタープリタが、前記ハードウエア命令変換ユニットが利用可能でない場合に前記複数のシーケンスの内の前記更なるシーケンスを用いる、請求項１、２又は３に記載の装置。
【請求項５】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするレジスタをオペランドとして指定する、請求項４に記載の装置。
【請求項６】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするため、所定のレジスタを用いる、請求項４に記載の装置。
【請求項７】
前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を指すハードウエア変換開始アドレスを指定し、前記ハードウエア変換開始アドレスを前記ハードウエア命令変換ユニットが使用して、前記ハードウエア命令変換ユニットが利用可能であれば、前記第２の命令セットの内の前記次のプログラム命令にアクセスする、請求項１〜６の内のどれかに記載の装置。
【請求項８】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするために、所定のレジスタを用いる、請求項７に記載の装置。
【請求項９】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするレジスタを指定するオペランドを含む、請求項７に記載の装置。
【請求項１０】
前記ソフトウエア命令インタープリタが、前記第１の命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応する、請求項１〜３の内のどれかに記載の装置。
【請求項１１】
前記ソフトウエア命令インタープリタが、前記複数のシーケンスを指すポインタのテーブルを含む、請求項１０に記載の装置。
【請求項１２】
前記ポインタテーブル内のエントリが、解釈される予定の、前記第２の命令セットの内のプログラム命令によって索引付けされる、請求項１１に記載の装置。
【請求項１３】
前記ポインタテーブルのベースアドレスが、ベースアドレスレジスタ内にストアされる、請求項１１及び１２の内のどちらか記載の装置。
【請求項１４】
前記第１の命令セットの内の前記プログラム命令が、前記プロセッサコアによって実行されるネイティブプログラム命令である、請求項１〜１３の内のどれかに記載の装置。
【請求項１５】
前記ハードウエア命令変換ユニットが、バイトコード命令を前記プロセッサコアによって実行される１つ以上のネイティブプログラム命令またはネイティブプログラム命令に相当する制御信号に変換する、請求項１４に記載の装置。
【請求項１６】
前記シーケンス終了命令が、前記第１の命令セットのメンバーである、請求項１〜１５の内のどれかに記載の装置。
【請求項１７】
第１のプログラム命令セットからのプログラム命令又は第２のプログラム命令セットからのプログラム命令の制御下でデータを処理する方法において、該方法は、
ソフトウエア命令インタープリタが、前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスと解釈するようにプロセッサコアが実行するステップと、
命令デコーダ回路が、前記シーケンス終了命令に反応して
（ｉ）前記第２のプログラム命令セットに対するハードウエア命令変換ユニットが利用可能でない場合、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタを用いて始動し、
（ｉｉ）前記第２のプログラム命令セットに対する前記ハードウエア命令変換ユニットが利用可能である場合、前記第２の命令セットの内の前記次のプログラム命令の変換を、前記ハードウエア命令変換ユニットを用いて始動する、
ステップと、
を含む方法。
【請求項１８】
前記ハードウエア命令変換ユニットが、
（ｉ）前記ハードウエア命令変換ユニットがイネーブルされていない、又は
（ｉｉ）ハードウエア命令変換ユニットが存在しない、
ために利用可能でない、請求項１７に記載の方法。
【請求項１９】
少なくとも１つのハードウエア命令変換ユニットフラグを用いて、前記命令デコーダ回路がハードウエア命令変換ユニットが利用可能であるかどうか検出する、請求項１７と１８のどちらかに記載の方法。
【請求項２０】
前記ソフトウエア命令インタープリタが、前記第１命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応しており、前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を解釈するように働く前記第１の命令セットの内のプログラム命令の前記複数のシーケンスの内の更なるシーケンスの前記ソフトウエア命令インタープリタ内のソフトウエア解釈開始アドレスを指定し、前記ソフトウエア命令インタープリタが、前記ハードウエア命令変換ユニットが利用可能でない場合に前記複数のシーケンスの内の前記更なるシーケンスを用いる、請求項１７、１８又は１９に記載の方法。
【請求項２１】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするレジスタをオペランドとして指定する、請求項２０に記載の方法。
【請求項２２】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするため、所定のレジスタを用いる、請求項１８に記載の方法。
【請求項２３】
前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を指すハードウエア変換開始アドレスを指定し、前記ハードウエ変換開始アドレスを前記ハードウエア命令変換ユニットが使用して、前記ハードウエア命令変換ユニットが利用可能であれば、前記第２の命令セットの内の前記次のプログラム命令にアクセスする、請求項１７〜２２の内のどれかに記載の方法。
【請求項２４】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするために、所定のレジスタを用いる、請求項２３に記載の方法。
【請求項２５】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするレジスタを指定するオペランドを含む、請求項２３に記載の方法。
【請求項２６】
前記ソフトウエア命令インタープリタが、前記第１命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応する、請求項１７〜１９の内のどれかに記載の方法。
【請求項２７】
前記ソフトウエア命令インタープリタが、前記複数のシーケンスを指すポインタのテーブルを含む、請求項２６に記載の方法。
【請求項２８】
前記ポインタテーブル内のエントリが、解釈される予定の、前記第２の命令セットの内のプログラム命令によって索引付けされる、請求項２８に記載の方法。
【請求項２９】
前記ポインタテーブルのベースアドレスが、ベースアドレスレジスタ内にストアされる、請求項２７及び２８の内のどちらかに記載の方法。
【請求項３０】
前記第１の命令セットの内の前記プログラム命令が、前記プロセッサコアによって実行されるネイティブプログラム命令である、請求項１７〜２９の内のどれかに記載の方法。
【請求項３１】
前記ハードウエア命令変換ユニットが、バイトコード命令を前記プロセッサコアによって実行される１つ以上のネイティブプログラム命令またはネイティブプログラム命令に相当する制御信号に変換する、請求項３０に記載の方法。
【請求項３２】
前記シーケンス終了命令が、前記第１の命令セットのメンバーである、請求項１７〜３１の内のどれかに記載の方法。
【請求項３３】
第１のプログラム命令セットからのプログラム命令又は第２のプログラム命令セットからのプログラム命令の制御下でデータを処理するデータ処理装置を制御するコンピュータプログラムを記録したデータストレージ媒体において、該コンピュータプログラムを記録したデータストレージ媒体は、
プロセッサコアによって実行されることによって、ソフトウエア命令インタープリタロジックが、前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスと解釈するように動作し、
該シーケンス終了命令が、
（ｉ）前記第２のプログラム命令セットに対するハードウエア命令変換ユニットが利用可能でない場合、命令デコーダ回路が、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタロジックを用いて始動し、
（ｉｉ）前記第２の命令プログラムに対する前記ハードウエア命令変換ユニットが利用可能である場合、命令デコーダ回路が、前記第２の命令セットの内の前記次のプログラム命令の変換を、前記ハードウエア命令変換ユニットを用いて始動する、
ように働く、前記ソフトウエア命令インタープリタロジック、
を含む前記コンピュータプログラムを記録したデータストレージ媒体。
【請求項３４】
前記ハードウエア命令変換ユニットが、
（ｉ）前記ハードウエア命令変換ユニットがイネーブルされていない、又は
（ｉｉ）ハードウエア命令変換ユニットが存在しない、
ために利用可能でない、請求項３３に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項３５】
少なくとも１つのハードウエア命令変換ユニットフラグを用いて、ハードウエア命令変換ユニットが利用可能であるかどうか検出する、請求項３３と３４のどちらかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項３６】
前記ソフトウェア命令インタープリタは、前記第１命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応しており、前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を解釈するように働く前記第１の命令セットの内のプログラム命令の前記複数のシーケンスの内の更なるシーケンスの前記ソフトウエア命令インタープリタ内のソフトウエア解釈開始アドレスを指定し、前記ソフトウエア命令インタープリタロジックが、前記ハードウエア命令変換ユニットが利用可能でない場合に前記複数のシーケンスの内の前記更なるシーケンスを用いる、請求項３３、３４又は３５に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項３７】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするレジスタをオペランドとして指定する、請求項３６に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項３８】
前記シーケンス終了命令が、前記ソフトウエア解釈開始アドレスをストアするため、所定のレジスタを用いる、請求項３６に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項３９】
前記シーケンス終了命令が、前記第２の命令セットの内の前記次のプログラム命令を指すハードウエア変換開始アドレスを指定し、前記ハードウエア変換開始アドレスを前記ハードウエア命令変換ユニットが使用して、前記ハードウエア命令変換ユニットが利用可能であれば、前記第２の命令セットの内の前記次のプログラム命令にアクセスする、請求項３３〜３８の内のどれかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４０】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするために、所定のレジスタを用いる、請求項３９に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４１】
前記シーケンス終了命令が、前記ハードウエア変換開始アドレスをストアするレジスタを指定するオペランドを含む、請求項３９に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４２】
前記ソフトウエア命令インタープリタが、前記第１命令セットの内のプログラム命令の複数のシーケンスを含み、前記複数のシーケンスが、前記第２の命令セットの内のプログラム命令にそれぞれ対応する、請求項３３〜３５の内のどれかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４３】
前記ソフトウエア命令インタープリタが、前記複数のシーケンスを指すポインタのテーブルを含む、請求項４２に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４４】
前記ポインタテーブル内のエントリが、解釈される予定の、前記第２のセットの命令の内のプログラム命令によって索引付けされる、請求項４３に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４５】
前記ポインタテーブルのベースアドレスが、ベースアドレスレジスタ内にストアされる、請求項４３及び４４の内のどちらかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４６】
前記第１の命令セットの内の前記プログラム命令が、前記プロセッサコアによって実行されるネイティブプログラム命令である、請求項３３〜４５の内のどれかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４７】
前記ハードウエア命令変換ユニットが、バイトコード命令を前記プロセッサコアによって実行される１つ以上のネイティブプログラム命令またはネイティブプログラム命令に相当する制御信号に変換する、請求項４６に記載のコンピュータプログラムを記録したデータストレージ媒体。
【請求項４８】
前記シーケンス終了命令が、前記第１の命令セットのメンバーである、請求項３３〜４７の内のどれかに記載のコンピュータプログラムを記録したデータストレージ媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
（技術分野）
本発明は、データ処理システムの分野に関する。より詳しくは、本発明は、２つ以上の命令セットからの命令を実行することが可能なデータ処理システムに関する。
【背景技術】
【０００２】
（背景技術）
２つ以上の命令セットからの命令を実行することが可能なデータ処理システムが提供されていることが周知である。このようなシステムの例としては、３２ビットＡＲＭ命令セットと１６ビットのＴｈｕｍｂ命令セットの双方を実行することが可能な英国のケンブジッリ市のＡＲＭ社製のプロセッサがある。
【０００３】
２つ以上の命令セットを実行する最近に開発されたタイプのデータ処理システムは、それ自身のネイティブな命令セットとＪａｖａ（登録商標）バイトコード命令の双方を実行することを追求するするものである。具体的には、Ｊａｖａバイトコードを実行する特定目的用のハードウエアを提供するＪａｖａ加速技法が提案され、開発されているいうことである。このような方式の例として、ネイティブなＡＲＭ命令もまた実行するプロセッサコアを用いてＪａｖａバイトコードの実行を提供する英国のケンブリッジ市のＡＲＭ社設計のＪａｚｅｌｌｅアーキテクチャ機能拡張がある。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
上記の技法の問題は、幾つかのＪａｖａバイトコードが、Ｊａｚｅｌｌｅがもたらす比較的単純なアーキテクチャのハードウエア機能拡張によって実行されるのにはあまり適していないという点である。そのため、より複雑なＪａｖａバイトコードは、サポートソフトウエアに送られて実行される。このような方式は、実行に際して遭遇し、また必要とされるＪａｖａのバイトコードをすべて完全にカバーしながらも、ハードウエアＪａｖａ加速システムの複雑さを抑制することが可能である。しかしながら、特定の状況に適すように開発され、また時間と共に進化するＪａｖａの加速用ハードウエアの様々な実現例は、様々なＪａｖａバイトコードを、与えられるハードウエアメカニズムによって実行されるのではなく、ソフトウエアの実行によってサポートすることを要求する。これは、別のサポート用ソフトウエアのセットを、Ｊａｖａの加速用ハードウエアの各バージョン毎に開発してテストしなければならず、不利点となる。これは、高価で時間がかかる。
【０００５】
上記の周知のＪａｖａの加速技法のさらなる問題は、Ｊａｖａのバイトコードを実行しているときに、システムの動作をデバッグしたりトレースするのが比較的困難であることである。特に、ハードウエアによって実行される１つのＪａｖａバイトコードは、実際には、プロセッサコアが実行しなければならない多くのディスクリートな処理動作を意味し、さらにＪａｖａバイトコードを加速用ハードウエアによって極小的に扱う方法では、ブレークポイント、ステップ毎の処理、あるいは他の有用な診断技法を容易に挿入することが不可能である。
【課題を解決するための手段】
【０００６】
（発明の開示）
１つの態様によれば、本発明は、第１のプログラム命令セットから得られたプログラム命令又は第２のプログラム命令セットから得られたプログラム命令の制御下においてデータを処理する装置であって、該装置は、
前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスとして解釈するように動作するソフトウエア命令インタープリタ（解釈手段）と、
前記シーケンス終了命令に応答して、
（ｉ）前記第２の命令セットに対するハードウエア命令実行ユニットが利用可能でない場合、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタを用いて始動し、
（ｉｉ）前記第２の命令セットに対する前記ハードウエア命令実行ユニットが利用可能である場合、前記第２の命令セットの内の前記次のプログラム命令の実行を、前記ハードウエア命令実行ユニットを用いて始動する、
命令デコーダと、
を備える。
【０００７】
本発明は、第２の命令セット（例えば、Ｊａｖａバイトコード）の内の命令を第１の命令セット（例えば、ネイティブ命令のシーケンス）の内の命令のシーケンスとして実行する場合に、シーケンス終了命令として用いられる新しい命令を提供する。このシーケンス終了命令は、利用可能なハードウエア命令実行ユニットの存在又は不在に応答して、第２の命令セットの内の次の命令の処理をハードウエア命令実行ユニットを用いて始動するか、又は、ソフトウエア命令インタープリタの使用を継続する。したがって、第２の命令セットの全ての命令を処理する能力を持つソフトウエア命令インタープリタが提供され、しかも、それが必要とされる場合にしか使用されない。それは、このようなハードウエア命令実行ユニットが利用可能（例えば、存在してイネーブルされている）である場合には、シーケンス終了命令は、デフォルトとして、次の命令をハードウエア命令実行ユニットに渡すからである。特定のハードウエア実行メカニズムが第２の命令セットの内の特定の命令をサポートしない場合、これは、ソフトウエア命令インタープリタに転送されて、必要に応じて実行されるが、ハードウエア実行メカニズムが存在すると、そのハードウエアを用いてバイトコードの実行が試行される。うまくいけば、より迅速であるからである。
【０００８】
第２の命令セットの内の次の命令に、ソフトウエア解釈又はハードウエア実行を受けさせるように動作可能なシーケンス終了命令を提供することは、双方の動作モードをサポートするための余分のセットアップと処理がソフトウエアインタープリタ内で必要となり、しかも、ハードウエア実行が全く起こらないということがあり得るため、不利点となると考えられる得る。しかしながら、実際は、後続のハードウエア処理を始動する準備に必要とされるタイプの処理動作は、しばしば、ソフトウエア解釈内で既に着手されているか、又は、レジスタのインターロック等、他の有用な処理が必ずしも可能でない処理サイクル内で容易に提供される。したがって、シーケンス終了命令は、双方のタイプの後続動作を、ソフトウエア命令インタープリタ内の驚くほど少ないオーバーヘッドでサポートすることが可能である。
【０００９】
アクティブなハードウエア実行手段（executor）の検出は、様々な形態を取り得ることが理解されるであろう。しかしながら、好ましい実施形態では、この検出には、少なくとも１つのハードウエア命令実行ユニットフラグが用いられる。このようなフラグは、ソフトウエアの制御下で比較的容易にセットされ、また、ハードウエア命令実行ユニットが存在するかどうか及び／又はハードウエア命令実行ユニットがアクティブであるかどうかなどの情報を提供することが可能である。
【００１０】
シーケンス終了命令の後で第２の命令セットの内の次の命令を引き続いて処理することを容易化してその速度を上げるためには、シーケンス終了命令は、ソフトウエア命令インタープリタ（もしこれが呼び出されるメカニズムであれば）によって使用されるソフトウエア解釈の開始アドレスを指定するのが望ましい。全体的な動作速度を向上させながらも現行の命令の実行速度を不当に損なうことなく次の命令の解釈を開始するポインタを準備する機会は、現行の命令のソフトウエア解釈の内によくあることが分かっている。
【００１１】
次の命令の解釈のためのこの開始アドレスは、ソフトウエア命令インタープリタに様々な方法で渡される。しかしながら、これを実現する好ましいメカニズムは、このアドレスを、シーケンス終了命令内のオペランドとして指定されたレジスタ内に、又は、この目的のためにシーケンス終了命令によって常に用いられる所定のレジスタ内に渡すことである。
【００１２】
ハードウエア実行開始アドレスをハードウエア命令実行ユニットによって使用されるように提供する類似のメカニズムもまた、提供される。
【００１３】
ソフトウエア命令インタープリタを提供する便利で、柔軟性があり強個な方法は、各々が第２の命令セット内の対応する命令を代理する第１の命令セットのプログラム命令の複数のシーケンスとして提供することである。これらのコードフラグメントは、オプションとして、第２の命令セット内のプログラム命令によってインデックスされたポインタのテーブルを介してアクセスされる。これらのポインタのテーブルのベースアドレスはベースアドレスレジスタ内に提供され、これは、ソフトウエア命令インタープリタコードをより融通性のあるものとする便利なメカニズムである。
【００１４】
本発明は広い範囲の状況下で応用可能であることが理解されるが、本発明は、第１の命令セットがプロセッサコアのネイティブな命令セットであり、第２の命令セットがＪａｖａバイトコード命令であり、また、シーケンス終了命令がプロセッサコアのネイティブな命令であるような状況下では特に良好に適していることが理解されよう。
【００１５】
別の態様によれば、本発明は、第１のプログラム命令セットからのプログラム命令又は第２のプログラム命令セットからのプログラム命令の制御下でデータを処理する方法であって、該方法は、
ソフトウエア命令インタープリタを用いて、前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスへ解釈するステップと、
前記シーケンス終了命令に応答して
（ｉ）前記第２のプログラム命令セットに対するハードウエア命令実行ユニットが利用可能でない場合、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタを用いて始動し、
（ｉｉ）前記第２の命令セットに対する前記ハードウエア命令実行ユニットが利用可能である場合、前記第２の命令セットの内の前記次のプログラム命令の実行を、前記ハードウエア命令実行ユニットを用いて始動する、
ステップと、
を含む。
【００１６】
さらに別の態様によれば、本発明は、第１のプログラム命令セットからのプログラム命令又は第２のプログラム命令セットからのプログラム命令の制御下でデータを処理するデータ処理装置を制御するコンピュータプログラムプロダクツを提供し、該コンピュータプログラムプロダクツは、
前記第２のプログラム命令セットの内のプログラム命令を、シーケンス終了命令で終了する、前記第１のプログラム命令セットの内のプログラム命令のシーケンスへ解釈するように動作するソフトウエア命令インタープリタロジックであり、該シーケンス終了命令が、
（ｉ）前記第２のプログラム命令セットに対するハードウエア命令実行ユニットが利用可能でない場合、前記第２の命令セットの内の次のプログラム命令の解釈を、前記ソフトウエア命令インタープリタロジックを用いて始動し、
（ｉｉ）前記第２のプログラム命令に対する前記ハードウエア命令実行ユニットが利用可能である場合、前記第２の命令セットの内の前記次のプログラム命令の実行を、前記ハードウエア命令実行ユニットを用いて始動する、
ように働く、前記ソフトウエア命令インタープリタロジック、
を含む。
【００１７】
このコンピュータプログラムプロダクツは、ハードウエアアクセラレータと関連して使用されるサポートコードという形態を取る。このサポートコードは、例えば、データストレージ媒体上に、又は、埋め込み処理システム内のファームウエアとしてもしくは、所望次第では、動的にダウンロードされて提供される。
本発明の実施形態は、添付図面を参照して、記載する。
【実施例】
【００１８】
（発明を実施するための最良の形態）
図１は、ＡＲＭプロセッサなどのプロセッサコア４とバイトコード変換ハードウエア６（Ｊａｚｅｌｌｅとも呼ばれる）とを組み込むデータ処理システム２を示す。プロセッサコア４は、レジスタバンク８と、命令デコーダ１０と、レジスタバンク８のレジスタ内にストアされているデータ値に対して様々なデータ処理演算を実行するデータ経路１２とを含む。バイトコード変換ハードウエア６が現時点でイネーブルされているかディスエーブルされているかを制御するフラグ２０を含むレジスタ１８が、備えられている。加えて、バイトコード変換ハードウエアが現時点でアクティブであるかインアクティブであるかを示すフラグ２１を含むレジスタ１９が、備えられている。言い換えれば、フラグ２１は、データ処理システムが現時点でＪａｖａバイトコードと実行しているかＡＲＭ命令を実行しているかを示す。他の実施形態では、レジスタ１８と１９は、フラグ２０と２１の双方を含む１つのレジスタであり得ることが理解されるであろう。
【００１９】
動作中、Ｊａｖａバイトコードが実行中であり、バイトコード変換ハードウエア６がアクティブであれば、Ｊａｖａバイトコードが、バイトコード変換ハードウエア６によって受領されて、（この特定の非制限的な実施形態では）対応するＡＲＭ命令のシーケンスを発生する、又は少なくともプロセッサコア制御信号を表すＡＲＭ命令を発生し、これらの命令は次にプロセッサコア４に渡される。したがって、バイトコード変換ハードウエア６は、１つのＪａｖａバイトコードを、プロセッサコア４によって実行される対応するＡＲＭ命令のシーケンスにマッピングする。バイトコード変換ハードウエアがインアクティブであれば、それはバイパスされ、ノーマルなＡＲＭ命令をＡＲＭ命令デコーダ１０に供給して、そのネイティブな命令セットにしたがってプロセッサコア４を制御することが可能となる。ＡＲＭ命令のこれらのシーケンスは、等しくＴｈｕｍｂ命令のシーケンス及び／又は様々な命令セットからの命令の混合物であり得るが、このような代替例は予見されることであり、範囲に含まれることが全体にわたって理解されるであろう。
【００２０】
バイトコード変換ハードウエア６は、単に、遭遇することがあり得るＪａｖａバイトコードのサブセットのためのハードウエア変換サポートにしかならないことが理解されるであろう。ある種のＪａｖａバイトコードは、ハードウエア中にあるこれらのコードを試行して、対応するＡＲＭ命令動作にマッピングすることは効率的ではないような広範囲でまた抽象的な処理を必要とする。したがって、バイトコード変換ハードウエア６は、このようなハードウエアによりサポートされていないバイトコードに遭遇すると、ＡＲＭネイティブ命令で書かれたソフトウエア命令インタープリタをトリガーして、このハードウエアサポートされていないＪａｖａバイトコードによって指定された処理を実行するようにさせる。
【００２１】
このソフトウエア命令インタープリタは、解釈される考えられるＪａｖａバイトコード全てに対するソフトウエアサポートとなるように作成してもよい。バイトコード変換ハードウエア６が存在していてイネーブルされると、通常ハードウエアサポートされていないＪａｖａバイトコードだけが、ソフトウエア命令インタープリタ内の関連のコードフラグメントに参照される。しかしながら、バイトコード変換ハードウエア６が存在しない場合又は（デバッグの最中などで）ディスエーブルされている場合、Ｊａｖａバイトコードはすべて、ソフトウエア命令インタープリタに参照される。
【００２２】
図２に、ソフトウエア命令インタープリタの作用を略式に示す。Ｊａｖａバイトコードのストリーム２２は、Ｊａｖａプログラムを表す。これらのＪａｖａバイトコードには、オペランドが散在している。したがって、所与のＪａｖａバイトコードの実行に続いて、次に実行されるＪａｖａバイトコードは、すぐ後のバイト位置出現するか、又は、オペランドバイトが介在している場合は数バイト後に出現する。
【００２３】
図２に示すように、バイト変換ハードウエア６によってサポートされていないＪａｖａバイトコードＢＣ４に遭遇する。これによって、バイトコード変換ハードウエア６内で例外がトリガーされ、このため、バイトコードＢＣ４を指標として用いてポインタテーブル２４内で検索が実行されて、ハードウエアサポートされていないバイトコードＢＣ４によって指定される処理を実行するコードフラグメント２６を指すポインタＰ＃４が読み取られる。ポインタテーブルのベースアドレス値もまた、レジスタにストアされる。次に、この選択されたコードセグメントに、Ｒ１４がサポートされていないバイトコードＢＣ４を指している状態で入る。
【００２４】
図示するように、バイトコードが取り得る値は２５６個あるので、ポインタテーブル２４は２５６個のポインタを含んでいる。同様に、最大で２５６個のＡＲＭネイティブ命令コードフラグメントが与えられ、これで、考えられるどのＪａｖａバイトコードによって指定される処理でも実行される。（２つのバイトコードが同じコードフラグメントを使用しているような場合では２５６個以下である場合もあり得る。）バイトコード変換ハードウエア６は、一般的には、単純なＪａｖａバイトコードの多くに対してハードウエアサポートを提供し、これで、処理速度が向上し、また、この場合、ソフトウエア命令インタープリタ内の対応するコードフラグメントは、デバッグ中又は、後述するようなプリフェッチアボートなどの状況下などで強制された場合を例外として、決して用いられることはない。しかしながら、これらは一般的には、単純で短いコードフラグメントであるため、これらを提供することによってもたらされる追加のメモリオーバーヘッドは比較的わずかである。さらに、このわずかな追加のメモリオーバーヘッドは、またソフトウエア命令インタープリタの一般的な性質と、バイトコード変換ハードウエアが存在しない又はディスエーブルされている状況での考えられるあらゆるＪａｖａバイトコードに対処するその機能とによって少なくとも埋め合わされる。
【００２５】
図２のコードフラグメント２６は各々が、シーケンス終了命令ＢＸＪによって終了されるのがわかるであろう。このシーケンス終了命令ＢＸＪの作用は、図３に図示するように、データ処理システム２の状態によって異なる。図３は、ソフトウエア命令インタープリタ内でコードフラグメント２６によって実行される処理を非常に略式な形態で図示するフローチャートである。ステップ２８では、解釈されているＪａｖａバイトコードによって指定された動作が実行される。ステップ３０では、次に実行されるＪａｖａバイトコードがバイトコードストリーム２２から読み取られ、この次のＪａｖａバイトコードに対応するＪａｖａバイトコードストリーム２２内のバイトコードポインタが、レジスタバンク８のレジスタ、すなわちＲ１４内にストアされる。このように、図２のＪａｖａバイトコードＢＣ４の場合、次のＪａｖａバイトコードはＢＣ５であり、レジスタＲ１４に、ＪａｖａバイトコードＢＣ５のメモリロケーションを指すポインタがロードされる。
【００２６】
ステップ３２では、次のＪａｖａバイトコードＢＣ５に対応するポインタテーブル２４内のポインタがポインタテーブル２４から読み取られて、レジスタバンク８のレジスタ、すなわちレジスタＲ１２内にストアされる。
【００２７】
図３では、ステップ２８、３０及び３２が別々にそして連続的に実行されているところが示されていることが理解されるであろう。しかしながら、周知のプログラム技法にしたがって、ステップ３０と３２の処理を、ステップ２８の処理内でインタリーブし、これによって、ステップ２８の処理内のさもなければ無駄になっていた処理機会（サイクル）を利用するようにすれば便利である。したがって、ステップ３０と３２の処理は、比較的少ない実行速度のオーバーヘッドで実行可能である。
【００２８】
ステップ３４は、オペランドとして指定されているレジスタＲ１４と供にシーケンス終了命令ＢＸＪを実行する。
【００２９】
ＢＸＪ命令をステップ３４で実行するのに先立って、システムの状態は、レジスタＲ１４内にストアされているＪａｖａバイトコードストリーム２２内の次のバイトコードを指すポインタと、レジスタＲ１２内にストアされているその次のＪａｖａバイトコードに対応するコードフラグメントを指すポインタとでセットアップされている。この特定のレジスタの選択は、シーケンス終了命令に対するオペランドとして指定されたり、アーキテクチャによって予め設定され定義された非選択、一方選択又は双方選択と変化し得る。
【００３０】
ステップ２８、３０、３２及び３４の大部分はソフトウエア的なステップである。図３におけるステップ３４に続くステップの大部分はハードウエア的なステップであり、別の識別可能プログラム命令無しで発生する。ステップ３６で、ハードウエアが、バイトコード変換ハードウエア６がアクティブであるかないか検出する。このハードウエアは、バイトコード変換ハードウエア６が存在してイネーブル状態にあるかを示すレジスタフラグを読み取ってよってこの検出を実行する。バイトコード変換ハードウエア６がアクティブ状態で存在するかどうかの判断は、他のメカニズムによってもよい。
【００３１】
バイトコード変換ハードウエア６が存在していてイネーブルされていれば、ステップ３８に進み、ここで、制御権が、バイトコードハードウエア６がその次のバイトコードとして実行することを試行すべきバイトコードストリーム２２内のバイトコードを指すバイトコードポインタを指定するレジスタＲ１４のコンテンツと共にバイトコード変換ハードウエア６に渡される。次に、図示されるコードフラグメント２６の作用が終了する。
【００３２】
反対に、バイトコード変換ハードウエア６が存在しない、又は、このバイトコード変換ハードウエアがディスエーブルされているとステップ３６で判断された場合、ステップ４０に進み、ここで、ＡＲＭ命令コード内のジャンプによって、レジスタＲ１２内にストアされているアドレスによって指し示されるソフトウエア命令インタープリタ内のコードフラグメントの実行が開始される。このように、次のコードフラグメントの迅速な実行が始動され、これによって、処理速度における利点が生じる。
【００３３】
図４に、特定のコードフラグメントを詳細に示す。この特定の例は、ｉａｄｄというニモニックを持つ整数加算Ｊａｖａバイトコードである。
【００３４】
第１のＡＲＭネイティブ命令は、１つインクレメントされたレジスタＲ１４中のバイトコードポインタを用いて、次のバイトコード値を読み取る（整数加算（add）命令にはそれに続くバイトコードオペランドはなく、したがって、次のバイトコードは直接現在のバイトコードに続く）。レジスタＲ１４中のバイトコードポインタもまた、インクレメントされた値に更新される。
【００３５】
第２と第３の命令は、加算されるべき２つの整数のオペランド値をスタックから検索する。
【００３６】
第４の命令は、されなければ、レジスタＲ０に関連するレジスタにより無駄になるであろう処理サイクルを利用して、レジスタＲ４中にストアされている次のバイトコードに対するコードフラグメントのアドレス値を検索して、このアドレスをレジスタＲ１２内にストアする。レジスタＲｅｘｃを用いて、ポインタ２４のテーブルの開始を指すベースポインタをストアする。
【００３７】
第５の命令は、Ｊａｖａバイトコードによって指定された整数加算を実行する。
第６の命令は、Ｊａｖａバイトコードの結果をスタックに戻しストアする。
【００３８】
最終的な命令は、オペランドＲ１２で指定されたシーケンス終了命令ＢＸＪである。レジスタＲ１２は、ソフトウエア解釈が要求された場合に次のＪａｖａバイトコードをソフトウエア解釈するために必要となるＡＲＭコードフラグメントのアドレスをストアしている。ＢＸＪ命令を実行することによって、バイトコード変換ハードウエア６がイネーブルされた状態で存在するかどうかが判断される。これが存在していれば、制御権は、次のバイトコードアドレスを指定するレジスタＲ１４中にストアされているオペランドと共にこのバイトコード変換ハードウエア６に渡る。バイトコード変換ハードウエア６がアクティブな状態で存在しない場合、レジスタＲ１２内のアドレス値によって指されている次のバイトコードに対するコードフラグメントの実行が開始される。
【００３９】
図５に、図１のそれと類似したデータ処理システム４２を略式に示すが、この場合、バイトコード変換ハードウエア６が与えられていない点が異なる。このシステムでは、フラグ２１は常に、ＡＲＭ命令が実行中であることを示し、ＢＸＪ命令でＪａｖａバイトコード実行を入れようとする試行が常に、フラグ２０が無視された状態で、バイトコード変換ハードウエア６がディスエーブルされているように扱われる。
【００４０】
図６に、Ｊａｖａバイトコードを実行する際のシステム４２によって実行される処理のフローチャートを示す。これは、同じソフトウエアインタープリタコードが使用されているという点で図３の処理に類似しているが、この場合、シーケンス終了命令ＢＸＪが実行された時、ハードウエアバイトコードサポートの可能性は全くなく、したがって、処理は常に、ジャンプ命令に続いて、Ｒ１２によって次のＪａｖａバイトコードに対するコードフラグメントであると指し示されるコードフラグメントを実行する点が異なる。
【００４１】
この場合、ソフトウエア命令インタープリタはＡＲＭネイティブ命令として与えられていることが理解されるであろう。ソフトウエア命令インタープリタ（及び他のサポートコード）は、本来、別のコンピュータプログラムプロダクツとして提供されることがある。このコンピュータプログラムプロダクツは、フロッピディスクやＣＤなどの記録媒体を介して配布されたり、又は、ネットワークリンクを介して動的にダウンロードされたりする。本発明が特に良好に適している埋め込み処理アプリケーションの文脈では、ソフトウエア命令インタープリタは、埋め込みシステム内にある読み出し専用メモリや他の不揮発性プログラムストレージデバイス内にファームウエアとして提供されたりする。
【００４２】
図７に、Ｊａｖａバイトコードとそれらが指定する処理動作との間の関係を示す。図７から分かるように、８ビットＪａｖａバイトコードは、互いの異なった２５６個のバイトコード値となり得る。これらのＪａｖａバイトコードの内の最初の２０３個は、以前に説明したｉａｄｄなど、Ｊａｖａ基準内で指定されている対応する処理動作へ、固定に結合されている。最後の２つのＪａｖａバイトコード、すなわち２５４と２５５は、Ｊａｖａ仮想マシン規格中に、定義済みの実現例であるとして記載されている。したがって、Ｊａｖａ実現例は、自由に、これらのバイトコードに対して固定の結合を割り当てる。代替例では、Ｊａｖａ実現例は、これらを、プログラム可能な結合を有するものとして扱うことを選ぶ。Ｊａｚｅｌｌｅは、これらのバイトコードに対して固定の結合を指定する。バイトコード値２０３と２５３との間（双方の値を含めて）で、プログラム可能な結合をユーザの所望のように指定される。これらは一般的に、バイトコードと処理動作間に結合を与えるために用いられるが、この例には、実行時間中に分解される迅速形態のバイトコードがある（アジソン・ウエスレイ(Addison Wesley)出版、リンドホルム(Tim Lindholm)とエリン(Frank Yellin)によって著された「Ｊａｖａ仮想マシン規格」、ＩＳＢＮ  ０−２−１−６３４５２−Ｘを参照）。
【００４３】
図７を見れば、ハードウエア加速された解釈技法は固定の結合を取り扱うにはよく適しているが、プログラム可能な結合を取り扱うにはあまり適していないことが理解されるであろう。対応するコードフラグメントによって表される関連のバイトコードの解釈のように、プログラム可能な結合の全てをソフトウエア解釈技法を用いて扱うことは可能であるが、これは性能が重要なバイトコードの場合には遅いものとなり得る。
【００４４】
図８に、プログラム可能変換テーブルの１形態を示す。このプログラム可能変換テーブル１００は、連想メモリ（content addressable memory）という形態を取っている。変換されるバイトコードは、ＣＡＭルックアップアレイ１０２に入力される。このアレイ１０２が一致するバイトコードエントリを含んでいれば、ヒットが発生し、これは、対応する動作指定値を出力させるが、すなわち、
【００４５】
ＣＡＭテーブル中に一致するバイトコードエントリがあれば、ハードウエアは動作指定コードを用いて、ハードウエア中で実行されるべき動作を決定して、その動作を実行して、次のバイトコードに移り、
【００４６】
ＣＡＭテーブル中に一致するバイトコードエントリがなければ、バイトコードはハードウエアのサポートがなされていないものとして扱われ、そのコードフラグメントがコールされる。
【００４７】
この例では、動作指定値は４ビット値であり、また、ヒットを生じたＣＡＭエントリは、バイトコードｂｃ６に対応している。図７を見れば理解されるように、このようなプログラム可能変換を受けるバイトコードはすべて、その最上位の２ビットが“１”であり、したがって、このバイトコードの最下位の６ビットだけを、アレイ１０２に入力する必要がある。
【００４８】
この例のプログラム可能変換テーブル１００は、８個のエントリを有している。存在するエントリの数は、個のタスクに対して専用とすることが望ましいハードウエアリソースの分量によって異なる。ある例では、たった４つのエントリが与えられているが、他の例では、１０個のエントリが適切であったりする。また、考えられるプログラム可能な結合のバイトコード１毎にエントリを与えることも可能である。
【００４９】
利用可能なプログラム可能マッピングリソースが、最初に最も重要な変換で満たされると、より重要でない変換はソフトウエア解釈されることが理解されるであろう。ソフトウエアインタープリタをプログラム可能変換テーブルと組み合わせて提供することによって、システムの構成とテーブルのプログラミングとが、どれほど多くのエントリが利用可能であるかを知る必要なく可能となるが、それは、テーブルがオーバーフローしても、必要とされる変換が、ソフトウエアインタープリタによってトラップされて実行されるからである。
【００５０】
図９に、第２の例のプログラム可能変換テーブル１０４を示す。この例では、変換テーブルはランダムアクセスメモリという形態を取っているが、ここで、変換されるバイトコードは、デコーダ１０６に入力されることになっており、このデコーダが、バイトコードを、各々が動作指定コードを表す４ビットワードのＲＡＭアレイ１０８に対するアドレスとして扱う。この場合、動作指定コードは、常に、バイトコードに対するものである。その結果、このタイプのテーブルは、１つの付加動作指定コードを用いるが、これは、「このバイトコードに対するコードフラグメントをコール」することを指定するものである。
【００５１】
図１０は、図８の例の形態を取ったプログラム可能マッピングハードウエアインタープリタの初期化と構成を示す略式のフローチャートである。実際問題として、このフローチャートに図示された作用の様々な部分は、ソフトウエア初期化命令とこれらの命令に対応するハードウエアとによって、それぞれ実行される。
【００５２】
ステップ１１０では、既存の全てのテーブルエントリをクリアし、テーブル中のトップのエントリを指すポインタをセットする働きをするテーブル初期化命令が実行される。これに続いて、初期化コードが、コプロセッサレジスタロードなどのプログラム命令を用いてマッピングを変換テーブル中にロードする。これらテーブルロード命令の様々な形態は、特定の状況と環境によって異なる。プログラム可能マッピングハードウエアインタープリタシステムは、これらの命令に応答して、Ｊａｖａバイトコードなどのプログラム命令値とこれと関連する動作値とをステップ１１２で受領する。ステップ１１４で、非サポート動作トラップハードウエアが、プログラムされている動作値が、このプログラム可能マッピングハードウエアインタープリタによってサポートされている値であることをチェックする。動作値のセットが異なれば、これをサポートするプログラム可能マッピングハードウエアインタープリタも異なり、したがって、それ自身の固有のトラップハードウエアを備えられる。このトラップハードウエアは、特定のシステムが、例えば、それが動作値０、１、２、３、４、５、６、７、８及び１０をサポートしているが９はしていないことが分かっていれば比較的単純なものとなる。ハードウエアコンパレータは、ステップ１１４で、動作値を、それが９という値と比較してそれと等しいか調べ、９が検出されれば、プログラミングを拒絶して、ステップ１１６に処理を分岐させる。
【００５３】
ステップ１１４が、動作値がサポートされていることを示していると、ステップ１１８は、プログラム可能マッピングテーブルの最後まで既に達しているかどうかチェックして判断する。プログラム可能マッピングテーブルが既にいっぱいであれば、新しいマッピングが追加されることなく、再度ステップ１１６に進む。ステップ１１８をハードウエア内に設けることは、サポートコードは、どれほどのエントリが利用可能であるかを知ることなく、プログラム可能マッピングテーブルをプログラムすることを試みて、オーバーフローエントリを単に拒絶するだけであることを意味する。したがって、プログラマは、最も重要なマッピングをテーブルプログラミングの最初に位置付けして、これらのマッピングが利用可能なスロットを獲得することを保証すべきである。どれほどのプログラム可能スロットが利用可能であるかをサポートコードが知る必要がないということは、１つのセットのサポートコードが複数のプラットフォーム上で動作することを意味する。
【００５４】
テーブルが空のエントリを有していると、新しいマッピングがこのエントリ中にステップ１２０で書き込まれ、次に、テーブルポインタがステップ１２２で進められる。
【００５５】
ステップ１１６で、システムは、より多くのプログラム命令値をプログラム可能マッピングテーブル中にプログラムすべきであるかテストする。ステップ１１６は一般的には、サポートコードが、システムの初期化中に、可能な限り多くのマッピングをプログラムすることを試みるソフトウエアステップである。
【００５６】
図９に示すようにＲＡＭテーブルを初期化する場合、図１０に関連して述べたプロセスは、次の修正を受けて実行される：
【００５７】
ステップ１１０では、テーブルは、図９のアレイ１０８中の全てのテーブルエントリを、各エントリがどのバイトコードにも一致しないように図８中のアレイ１０２をセッティングすることによってではなく、図９中のアレイ１０８中の全てのテーブルエントリを「このバイトコードに対するバイトコードフラグメントをコールする」ようにセッティングすることによってクリアされる；
ステップ１１０では、初期化する変換テーブルポインタは無い；
ステップ１１８は存在しない、それは、変換テーブルポインタが無いからであり；
ステップ１２０は「プログラム命令値によって示されたテーブルエントリに対する書き込み動作値」となり；
ステップ１２２は存在しない、それは変換テーブルポインタが無いからである。
【００５８】
図１１に、Ｊａｖａバイトコード解釈に用いられる処理パイプラインの１部分を示す。処理パイプライン１２４は、変換ステージ１２６とＪａｖａデコードステージ１２８を含んでいる。後続のステージ１３０は、実現例によって様々な形態を取り得る。
【００５９】
Ｊａｖａバイトコードストリームから取られたワードは、スイングバッファ１３２の２つの半分に交番にロードされる。通常は、マルチプレクサ１３３は、現行のバイトコードとそのオペランドをスイングバッファ１３２から選択して、それをマルチプレクサ１３７を介してラッチ１３４に送付する。スイングバッファ１３２が、パイプラインがフラッシュされていたり他の理由によって空である場合、マルチプレクサ１３５は、Ｊａｖａバイトコードストリームの入力ワードから直接該当するバイトコードを選択して、それをラッチ１３４に送付する。
【００６０】
バイトコードに対して第１のデコーディングサイクルが、ラッチ１３４中のバイトコードに、第１サイクルデコーダ１４６によって実行される。ハードウエアサポートされているバイトコードがオペランドを持っている場合に備えて、マルチプレクサはさらにオペランドをスイングバッファ１３２から選択して、それらを第１サイクルデコーダ１４６に送付する。これらのマルチプレクサは、図中には示されていないが、マルチプレクサ１３３に類似のものである。一般的に、第１サイクルデコーダ１４６は、バイトコード入力に対してよりもオペランドに対してはより緩やかなタイミング要件を有しており、このため、マルチプレクサ１３５及び１３７並びにラッチ１３４によって形成されるバイパス経路に類似したバイパス経路は、オペランドに対しては必要ない。
【００６１】
スイングバッファ１３２が、ラッチ１３４中のバイトコードに対して持っているオペランドバイトが不十分である場合、第１サイクルデコーダ１４６は、十分なオペランドバイトが利用可能となるまで中断する。
【００６２】
第１サイクルデコーダ１４６の出力は、ＡＲＭ命令（又はＡＲＭ命令を表すプロセッサコア制御信号のセット）であり、これが、後続のパイプラインステージ１３０にマルチプレクサ１４２を介して渡される。第２の出力は、ラッチ１３８に対してマルチプレクサ１３９を介して書き込まれた動作指定コードである。この動作指定コードは、これが１サイクルバイトコードであるかどうかを指定するビット１４０を含んでいる。
【００６３】
次のサイクルでは、後続のバイトコードが、第１サイクルデコーダ１４６によって前述したようにデコーディングされる。ビット１４０が１サイクルバイトコードであることを示していれば、そのバイトコードはデコーディングされ、後続のパイプラインステージ１３０を前述したように制御する。
【００６４】
ビット１４０が、複数サイクルバイトコードであることを示している場合、第１サイクルデコーダ１４６は中断し、マルチサイクル又は変換済みデコーダ１４４がラッチ１３８中の動作指定コードをデコードして、ＡＲＭ命令（又はＡＲＭ命令を表すプロセッサコア制御信号のセット）を発生し、これをマルチプレクサ１４２が、第１サイクルデコーダ１４６の対応する出力の代わりに後続のパイプラインステージ１３０に渡す。マルチサイクル又は変換済みデコーダはまた、さらなる動作指定コードを生成し、これが、また第１サイクルデコーダ１４６の対応する出力の代わりに、ラッチ１３８にマルチプレクサ１３９を介して書き込まれる。このさらなる動作指定コードもまた、これが、複数サイクルバイトコードに対して生成される最後のＡＲＭ命令であるかどうかを指定するビット１４０を含む。このマルチサイクル又は変換済みデコーダ１４４は、ビット１４０が、最後のＡＲＭ命令が生成されたことを示すまで、上記のようにさらなるＡＲＭ命令を発生し続け、次に、第１サイクルデコーダ１４６は、中断状態であることを止めて、後続のバイトコードのために第１のＡＲＭ命令を生成する。
【００６５】
上記のプロセスは、ラッチ１３４中のバイトコードを変換する必要がある場合、３つの方法で修正される。第１の方法として、バイトコードが、スイングバッファ１３２からマルチプレクサ１３３によって抽出され、バイトコードトランスレータ１３６によって変換されて、動作指定コードが発生され、これがラッチ１３８にマルチプレクサ１３９を介して書き込まれる。この動作指定コードは、そのビット１４０が、再度のＡＲＭ命令が現行のバイトコードに対して生成されたものではないことを示すようにセットされており、これで、マルチプレクサ１４２とマルチプレクサ１３９は、マルチサイクル又は変換済みデコーダ１４４の出力を、第１サイクルデコーダ１４６の出力の代わりに、変換されたバイトコードの第１のサイクルで選択する。
【００６６】
第２の方法として、マルチサイクル又は変換済みデコーダ１４４は、後続のパイプラインステージ１３０に渡されるべきＡＲＭ命令の全てと、ラッチ１３８に戻して書き込まれるべきその対応するさらなる動作指定コードとを発生し、変換を必要としないバイトコードの場合のように第１のサイクル後ではこれらを発生しない。
【００６７】
第３の方法として、バイトコードが直接にラッチ１３４に対してマルチプレクサ１３５を介して書き込まれており、したがって、スイングバッファ１３２中には存在せず、直前のサイクルでバイトコードトランスレータ１３６によって変換されているわけがない場合、第１サイクルデコーダ１４６は、バイトコードトランスレータ１３６に対して、それが、再スタートしてあるサイクルにわたって中断しなければならないことを信号で通知する。これによって、第１サイクルデコーダ１４６が中断を止めた場合に、ラッチ１３８が、変換済みのバイトコードに対する有効な動作指定コードを保持することが保証される。
【００６８】
図１１から分かるように、変換パイプラインのステージは、プログラム可能変換ステップによって必要とされる処理を、パイプライン中に効果的に隠す、即ち畳み込むことが可能となる、これは、バッファリングされた命令が、事前に変換され、必要に応じてパイプラインの残余の部分に流し込まれるからである。
【００６９】
図１１から分かるように、この例の実施形態では、固定されたマッピングハードウエアインタープリタは、第１サイクルデコーダ１４６と、自身が第１サイクルデコーダ１４６による第１サイクルのデコーディングを受けたマルチサイクルのバイトコードをデコーディングするモードで動作するマルチサイクル又は変換済みデコーダ１４４とから主として形成されているものと考えることが可能である。この例におけるプログラム可能マッピングハードウエアインタープリタは、バイトコードトランスレータ１３６と、この場合、プログラム可能バイトコードの変換に続いて動作するマルチサイクル又は変換済みデコーダ１４４とから形成されているものと考えることが可能である。固定マッピングハードウエアインタープリタとプログラム可能マッピングハードウエアインタープリタは、互いに異なった様々な方法で提供されるが、また、抽象的な観点からすれば互いに異なった自身の機能を保持しながらも、かなり共通のハードウエアを共有している。これら様々な可能性はすべて、上記の本技法の範囲に含まれる。
【００７０】
図１２に、仮想メモリのページ境界２０４にまたがる２つの３２ビット命令ワード２００と２０２を示す。これは、１ｋＢのページ境界であるが、他のページサイズも可能である。
【００７１】
第１の命令ワード２００は、仮想メモリシステム内の適切にマッピングされている仮想メモリページ中にある。第２の命令ワード２０２は、仮想メモリシステム内にマッピングされているこのステージにはない仮想メモリページ中に存在する。したがって、第１バイトが命令ワード２００内にあり第２バイトが命令ワード２０２内にある２バイトの可変長命令２０６は、その第２バイトと関連するプリフェッチアボートを有する。例えば、命令ワードがアラインメントされた命令をサポートするだけの従来のプリフェッチアボート処理メカニズムは、この状況を取り扱うことが不可能であり、また、例えば、実際にアボートに至ったその可変長命令ワード２０６の第２バイトを含む命令ワード２０２に焦点を合わせるのではなく、可変長命令２０６の第１バイトとを含む命令ワード２００のフェッチ動作を調査して修復することをシークしかねない。
【００７２】
図１３に、図１２に示すタイプのプリフェッチアボートを処理するメカニズムを含むＪａｖａバイトコードを処理するデータ処理システム内の命令パイプライン２０８の部分を示す。命令バッファは、２つの命令ワードレジスタ２１０と２１２を含み、これらは各々が３２ビットの命令ワードをストアする。Ｊａｖａバイトコードは、各々が、８ビット長であり、ゼロ又は１つ以上のオペランド値がそれに伴っている。マルチプレクサ２１４のグループは、デコーディングされるべき現行のＪａｖａバイトコード命令の第１バイトのアドレスを示す現行のＪａｖａバイトコードポインタ位置によって、適切なバイトを命令ワードレジスタ２１０と２１２内から選択する働きをする。
【００７３】
命令ワードレジスタ２１０と２１２の各々に対して、それぞれ命令アドレスレジスタ２１６及び２１８並びにプリフェッチアボートフラグレジスタ２２０及び２２２が関連している。これらの関連したレジスタは、それぞれが、自身が関連する命令ワードのアドレスと、その命令ワードがメモリシステムからフェッチされたときにプリフェッチアボートが発生したかどうかとをストアする。この情報は、パイプラインを通じて、命令ワード自身と共に渡されるが、それは、この情報が一般的には、パイプラインをさらに下って必要とされるからである。
【００７４】
マルチプレクサ２２４、２２６及び２２８によって、入力バッファ装置を、所望次第でバイパスすることが可能となる。このタイプの動作は既述した。命令パイプライン２０８は、分かりやすいように、既述した命令パイプラインの全ての特徴を図示しているわけではないことが理解されるであろう。同様に、既述の命令パイプラインは、命令パイプライン２０８の全ての特徴を図示しているわけではない。実際、システムは、この２つの命令パイプラインに示す機能の組み合わせを備えている。
【００７５】
命令パイプライン２０８のバイトコードデコーディングステージ内で、バイトコードデコーダ２３０は、マルチプレクサ２２４からの少なくともＪａｖａバイトコードに、また、オプションとして、マルチプレクサ２２６と２２８からの１バイト又は２バイトのオペランドに応答して、マッピングされた１つ以上の命令又は対応する制御信号を発生し、パイプライン中のさらなるステージまで達して、デコーディングされたＪａｖａバイトコードに対応する処理を実行する。
【００７６】
図１２に示すタイプのプリフェッチアボートが発生すると、Ｊａｖａバイトコード自身は有効であるが、それに続くオペランド値は有効ではなく、また、正しい動作は、プリフェッチアボートが修復されない限り発生しない。バイトコード例外ジェネレータ２３２は、レジスタ２１６及び２１８からの命令ワードアドレス並びにレジスタ２２０及び２２２からのプリフェッチアボートフラグに応答して、図１２に示す状況のタイプの発生を検出する。バイトコード例外ジェネレータ２３２は、このような状況を検出すると、マルチプレクサ２３４に対して、バイトコードデコーダ２３０によってではなく、バイトコード例外ジェネレータ自身によって発生された命令又は制御信号を後続のステージに対して、発行させる。バイトコード例外ジェネレータ２３２は、図１２のプリフェッチアボート状況を検出すると、それに応答して、ハードウエアにそのＪａｖａバイトコードを解釈されるのではなくて、アボートされているＪａｖａバイトコードをエミュレートするＡＲＭ３２ビットコードフラグメントの実行をトリガーする。このようにして、プリフェッチアボートを受けた可変長Ｊａｖａ命令は自身は実行されないが、その替わり、３２ビットＡＲＭ命令のシーケンスによって置き換えられる。命令をエミュレートするために用いられたＡＲＭ命令は、１つ以上のオペランドバイトをロードするときにデータのアボートを受ける可能性が高く、これらのデータアボートは、プリフェッチアボートが、これらのバイトが元来第２の命令ワード２０２の１部としてフェッチされたという同じ理由で発生し、また、さらなるプリフェッチ及びデータアボートが、ＡＲＭ３２ビットコードフラグメントの実行中に発生する可能性がある。これらのアボートの全てが、ＡＲＭ命令の実行中に発生し、したがって、既存のアボート例外ハンドラルーチンによって処理されるであろう。
【００７７】
バイトコードがフェッチされたときに発生したプリフェッチアボートはこのように抑制される（すなわち、ＡＲＭコアまでは達しない）。その替わりに、ＡＲＭ命令シーケンスが実行され、また、これらのＡＲＭ命令で発生するいかなるアボートは、問題があったバイトコードをステップオーバーされるような既存のメカニズムを用いて取り扱う。バイトコードをアボートで取って換えるエミュレート用ＡＲＭ命令が実行された後で、バイトコードの実行が再開される。
【００７８】
バイトコード自身にプリフェッチアボートがあると、プリフェッチアボートと印付けされたＡＲＭ命令が、ＡＲＭパイプラインの残余に渡される。パイプラインの実行ステージに到達すると、それは、プリフェッチアボート例外を発生させるが、これはＡＲＭ命令に対するプリフェッチアボートを処理する完全に標準的な方法である。
【００７９】
バイトコードにプリフェッチアボートは存在しないが、図１２に示すように、そのオペランドの内の１つ以上がそうであるばあい、そのバイトコードに対するソフトウエアコードフラグメントがコールされる。ＡＲＭパイプラインの残余に渡されて、コードフラグメントをコールさせたいかなるＡＲＭ命令も、プリフェッチアボートを印付けされず、したがって、それがパイプラインの実行ステージに到達すると正常に実行される。
【００８０】
図１４に、図１２に示す状況のタイプを検出するためにバイトコード例外ジェネレータ２３２によって用いられるタイプの論理式を示す。図１３（ブロック２１０、２１６及び２２０が１つの半分を形成し、一方、ブロック２１２、２１８及び２２２が他方の半分を形成しているが、これは、図１３中のこれらのエレメントの周りの鎖線によって示されている）で“Ｈａｌｆ１”で示されているが、スイングバッファのどちらか一方の半分が、第１の命令ワード（図１２中の２００）を現時点で保持しており、また、“Ｈａｌｆ２”で示されるスイングバッファの他方の半分が、第２の命令ワード（図１２中の２０２）を保持している。ここで、ＰＡ（Ｈａｌｆ１）は、ブロック２２０と２２２のどちらであれそのコンテンツはＨａｌｆ１中にあり、Ｈａｌｆ２も同様であることを意味するものとする。
【００８１】
次に、図１２に記載する状況は、ＰＡ（Ｈａｌｆ１）が偽であり、ＰＡ（Ｈａｌｆ２）が真であり、また、バイトコードおよびそのオペランドが、スイングバッファの２つの半分同士間の境界にまたがっていることを示している。（印付けされたページ境界が有るという事実は、単純に通常は、２つのＰＡ（）値が互いに異なっていることが可能であるための要件であるからである。）
【００８２】
スイングバッファの半分が各々ワードをストアしており、また、ハードウエアサポートされているバイトコードが最大で２つのオペランドに制限されているような好ましい設計においては、バイトコードおよびそのオペランドが境界にまたがるかどうかを判断するための式は：
（（オペランドの数＝１）ＡＮＤ（ｂｃａｄｄｒ［１：０］））
ＯＲ（（オペランドの数＝２）ＡＮＤ（ｂｃａｄｄｒ［１］＝１））
ここで、ｂｃａｄｄｒは、バイトコードのアドレスである。これによって、図１４に示す論理式を誘導することが可能である。
【００８３】
プリフェッチアボートを識別する他の技法、例えば、メモリページの境界から所定の距離内から始まる可変長命令を用いてもよい。
【００８４】
図１５に、Ｊａｖａバイトコードの解釈と関連するサポートコードの構造体を略式に示す。これは、前述の図に類似しているが、この場合、バイトコード例外イベントによってトリガーされるバイトコード例外処理コードフラグメントを指すポインタが含まれていることを示している。したがって、Ｊａｖａバイトコードは各々が、その動作をエミュレートする関連のＡＲＭコードフラグメントを有している。さらに、発生するバイトコード例外は各々が、ＡＲＭ例外処理コードの関連部分を有している。図示されている場合では、バイトコードプリフェッチアボート取り扱いルーチン２３６が、既述のタイプのプリフェッチアボートがバイトコード例外ジェネレータ２３２によって検出されるとトリガーされるように備えられている。このアボート処理コード２３６が作用して、そのトリガーを生じさせた可変長命令の開始時でバイトコードを識別し、次に、コードフラグメントの集合内のそのバイトコードに対する対応するエミュレーションコードを呼び出す。
【００８５】
図１６は、バイトコード例外ジェネレータ２３２の動作と後続の処理を略式に示すフローチャートである。ステップ２３８は、図１４の式が真であるかどうか判断する働きをする。この式が偽であれば、このプロセスは終了する。
【００８６】
ステップ２３８が、図１２中に示す状況のタイプを示している場合、バイトコード例外ジェネレータ２３２によって始動されるべきバイトコードプリフェッチアボート例外をトリガーするステップ２４６が、実行される。バイトコード例外ジェネレータ２３２は、ＡＲＭコードバイトコードプリフェッチアボートハンドラ２３６の実行を単純にトリガーする。アボートハンドラ２３６は、ステップ２４８で、可変長命令を開始させるバイトコードを識別する働きをし、次にステップ２５０で、この識別されたバイトコードをエミュレートするＡＲＭ命令のコードフラグメントの実行をトリガーする。
【００８７】
プリフェッチアボートを取り扱う上記のメカニズムは、オペランドの数が４つ以下（すなわち、合計で５バイト以下）である状況では良好に作用するが、そうでない場合、バイトコードとそのオペランドが第２のバッファからオーバーフローする可能性がある。実際、それに対してハードウエア加速メカニズムを提供することが望ましいバイトコードはすべて、０、１又は２つのオペランドを有し、残余のバイトコードはあらゆる場合にソフトウエアで処理されるが、これは主としてそれが複雑であるからである。
【００８８】
図１７に、複数のユーザモードプロセッサ３０２、３０４、３０６及び３０８を制御するオペレーティングシステムを示す。オペレーティングシステム３００は、スーパーバイザモードで動作し、他のプロセス３０２、３０４、３０６及び３０８はユーザモードで動作するが、このユーザモードは、オペレーティングシステム３００がスーパーバイザモードで動作する場合よりシステムの構成制御パラメータに対して有するアクセス権が小さい。
【００８９】
図１７に図示するように、プロセス３０２と３０８は、それぞれ別のＪａｖａ仮想マシンに関連している。これらのＪａｖａ仮想マシン３０２と３０８は各々、それ自身の構成データがバイトコード変換マッピングデータ３１０及び３１２並びに構成レジスタデータ３１４及び３１６から形成されている。実際、１セットのＪａｖａ加速ハードウエアが、プロセス３０２と３０８の双方を実行するために設けられているが、これら互いに異なるプロセスがＪａｖａ加速ハードウエアを用いているときは、これらは各々が、それが、自身の関連する構成データ３１０、３１２、３１４及び３１６で構成されていることを必要とすることが理解されるであろう。したがって、オペレーティングシステム３００が、直前のプロセスが使用していたものとは異なったＪａｖａ加速ハードウエアを用いて、あるプロセスに実行を切り替えると、そのＪａｖａ加速ハードウエアは、再初期化して再構成しなければならない。オペレーティングシステム３００は、Ｊａｖａ加速ハードウエアの再初期化と再構成を自分自身では実行しないが、Ｊａｖａ加速ハードウエアと関連する構成有効インジケータを無効な状態にセットすることによってそれが実行されるべきであることを示す。
【００９０】
図１８に、ネイティブ命令セット（例えば、ＡＲＭ命令セット）と関連のＪａｖａ加速ハードウエア３２２を有するプロセッサコアを含むデータ処理システム３１８を略式に示す。メモリ３２４は、ＡＲＭ命令又はＪａｖａバイトコードという形態を持つコンピュータプログラムコードをストアする。Ｊａｖａバイトコードの場合、これらは、Ｊａｖａ加速ハードウエア３２２中を通過し、ここで、解釈されてＡＲＭ命令（又はＡＲＭ命令に対応する制御信号）のストリームとなり、これが次にプロセッサコア３２０によって実行される。Ｊａｖａ加速ハードウエア３２２は、それに対してＪａｖａバイトコードを実行することが望ましいＪａｖａ仮想マシンの各々に対してプログラミングを必要とするバイトコード変換テーブル３２６を含んでいる。さらに、構成データレジスタ３２８とオペレーティングシステム制御レジスタ３３０が、Ｊａｖａ加速ハードウエア３２２内に備えられていて、その構成を制御している。オペレーティングシステム制御レジスタ３３０内には、構成有効インジケータがフラグＣＶという形態で含まれているが、このフラグは、セットされていると、Ｊａｖａ加速ハードウエア３２２の構成が有効であり、セットされていないと、それが無効であることを示す。
【００９１】
Ｊａｖａ加速ハードウエア３２２は、それがＪａｖａバイトコードを実行することを求めるときには、構成有効インジケータに反応して、構成有効インジケータが、無効形態にあるＪａｖａ加速ハードウエア３２２に対する構成データに対応していれば、構成無効例外をトリガーする。構成無効例外ハンドラは、プリフェッチアボートハンドラについて上述したそれと類似した仕方で提供されるＡＲＭコードルーチンであったりする。ハードウエアメカニズムはＪａｖａ加速ハードウエア３２２内に装備されるが、このハードウエアは、構成有効インジケータを、構成データが有効であることを示す形態にセットするが、それは、構成例外がトリガーされており、しかも、それが、新しい有効構成データが、実際に、しかるべき位置に書き込まれる以前であるからである。このように、構成データが実際に書き込まれる前に構成有効インジケータをセットすることは直感に反するように思われるかも知れないが、この方式は、かなり利点があって、構成データのセッティングの途中でプロセスがスワップすると発生することがある問題を避けることが可能である。次に、構成例外ルーチンは、自身が対応するＪａｖａ仮想マシンに対する必要とされる構成データを、バイトコード変換テーブルエントリを既述したように書き込み、また、他の構成データレジスタ値３２８を必要に応じて書き込むことによってセットアップする。構成例外コードは、構成データの書き込みが、他のどのようなタスクがＪａｖａ加速ハードウエア３２２によって実行されるにしても、それ以前に完了することを保証しなければならない。
【００９２】
図１９に、オペレーティングシステム３００の動作を略式に示す。ステップ３３２で、オペレーティングシステムは、プロセスの切り替えが検出されるのを待つ。プロセスの切り替えが検出されたら、ステップ３３４で、新しいプロセスが、Ｊａｖａ加速ハードウエア３２２（また、前述したように、Ｊａｚｅｌｌｅとも呼ばれる）を用いるプロセスであるかどうか判断する。Ｊａｖａ加速ハードウエア３２２が使用されていない場合、ステップ３３６に進み、ここで、Ｊａｖａ加速ハードウエア３２２はディスエーブルされ、次に、ステップ３３９に進み、ここで、新しいプロセスが実行される。Ｊａｖａ加速ハードウエア３２２が用いられている場合、ステップ３３８に進み、ここで、読み出されている新しいプロセスが、オペレーティングシステム３００によって記録されているのと同じ、Ｊａｖａ加速ハードウエア３２２のストア済みの現行のオーナであるかどうか判断される。オーナが変わっていなかった場合（すなわち、新しいプロセスが、事実、Ｊａｖａ加速ハードウエア３２２を最後に使用したプロセスである場合）、ステップ３３７に進み、ここで、Ｊａｖａ加速ハードウエア３２２はイネーブルされて、次に、ステップ３３９に進む。この新しいプロセスがストアされている現行のオーナではない場合、ステップ３４０に進み、ここで、構成有効インジケータがセットされて、Ｊａｖａ加速ハードウエア３２２の現行の構成が有効ではないことを示す。これが、この構成の変化を管理するオペレーティングシステム３００の責任の限界であり、構成データの実際の更新は、自分自身の例外処理メカニズムと共に動作するＪａｖａ加速ハードウエア３２２のタスクとして委ねられる。
【００９３】
ステップ３４０の後、ステップ３４２が、ステップ３３７と次にステップ３３９に実行制御が渡される以前に、ストアされている現行のオーナを新しいプロセスとなるように更新する働きをする。
【００９４】
図２０に、Ｊａｖａ加速ハードウエア３２２によって実行される動作を示す。ステップ３４４で、Ｊａｖａ加速ハードウエア３２２は、実行すべきバイトコードが受領されるのを待つ。バイトコードが受領されると、ハードウエアは、構成有効インジケータが、Ｊａｖａ加速ハードウエア３２２の構成が有効であることを示しているかどうか、ステップ３４６を用いてチェックする。この構成が有効であれば、ステップ３４８に進み、ここで、受領されたバイトコードが実行される。
【００９５】
構成が無効であれば、ステップ３５０に進み、ここで、Ｊａｖａ加速ハードウエア３２２は、ハードウエアメカニズムを用いて、構成有効インジケータを、それが、構成が有効であることを示すようにセットする。これはまた、所望次第で例外ハンドラ内のプログラム命令によって実行することも可能である。構成無効例外ハンドラは、コードフラグメントを指すポインタのテーブルと関連の例外の各々を処理するための適切なコードフラグメントとの組み合わせ、例えば、命令のソフトウエアエミュレーション、この場合におけるようなプリフェッチアボート（それは双方とも既述した）又は構成例外として提供してもよい。
【００９６】
ステップ３５４は、構成無効例外を作成し、また、必要な構成データをＪａｖａ加速ハードウエア３２２に書き込む働きをするＡＲＭコードを実行する働きをする。このＡＲＭコードは、プログラム可能変換テーブル３２６に存在するコプロセッサレジスタ書き込みと、他の構成レジスタ３３０とから成るシーケンスという形態を取り得る。ステップ３５４の後で、ステップ３５６は、Ｊａｖａバイトコードプログラムにジャンプして戻り、オリジナルのバイトコードの実行を再試行する。
【００９７】
ステップ３５４又はステップ３５８中にプロセスの切り替えが発生すれば、それまでの構成のセットアップが、他のプロセスによって無効とされ、また、構成有効インジケータがオペレーティングシステムによってクリアされる可能性がある。図２０の手順では、この結果、３４４−３４６−３５０−３５２−３５４とループを再度巡回する、すなわち、再構成が最初から再試行されることになる。バイトコードが結局、実際的に実行されると、構成は有効であることが保証される。
【００９８】
図２１に、さらに浮動小数点サブシステムを組み込む図１に示すようなデータ処理システムを示す。非対応（unhandled）浮動小数点演算が発生すると、浮動小数点サブシステムは、この非対応浮動小数点演算をＡＲＭコードで処理するメカニズムとなる。
【００９９】
このようなサブシステムの例に、英国ケンブリッジ市のＡＲＭ社製のＶＦＰソフトウエアエミュレータシステムがある。ＶＦＰソフトウエアエミュレータシステムの場合、全ての浮動小数点演算は、非対応浮動小数点演算として扱われるが、それは、浮動小数点演算を実行するハードウエアが存在しないからである。したがって、浮動小数点演算はすべて、ＶＦＰの動作をＡＲＭコードでエミュレートする備えられたメカニズムを用いて処理される。
【０１００】
このようなシステムの場合、非対応浮動小数点演算は正確である、すなわち、非対応浮動小数点演算の検出のポイントは、非対応浮動小数点演算の発生のポイントと同じである。
【０１０１】
図２２に、浮動小数点演算レジスタと非対応動作状態フラグをさらに組み込む、図１と２１に示すようなデータ処理システムを示す。
【０１０２】
このようなサブシステムの例に、英国のケンブリッジ市のＡＲＭ社製のＶＦＰハードウエアシステムがある。ＶＦＰハードウエアシステムの場合、あるタイプの浮動小数点演算だけが、非対応浮動小数点演算として扱われ、残余はＶＦＰハードウエアによって処理される。
【０１０３】
非対応浮動小数点演算を受ける演算のクラスには、次のものがある：
−ゼロによる除算
−ＮａＮを伴う演算
−無限を伴う演算
−非正規化された数を伴う演算
【０１０４】
このようなシステムの場合、非対応浮動小数点演算は不正確である、すなわち、非対応浮動小数点演算の検出のポイントは、必ずしも非対応浮動小数点演算の発生のポイントと同じではない。
【０１０５】
非対応ＶＦＰ演算は、ＶＦＰコプロセッサが、通常はＡＲＭ命令ストリームの１部を形成するが、図１に示すバイトコードトランスレータの存在下では、バイトコードがＡＲＭ命令とＶＦＰ命令の組み合わせに変換された結果であるＶＦＰ命令を受け入れることを拒絶すると発生する。
【０１０６】
非対応ＶＦＰ演算がＡＲＭ命令ストリームの１部として発生する場合、非対応ＶＦＰ演算を処理するＡＲＭメカニズムが、非対応命令例外を発生して、未定義命令ベクトル上にインストールされた未定義命令ハンドラを実行することになっている。
【０１０７】
ＶＦＰソフトウエアシステムの場合、全てのＶＦＰ演算は非対応ＶＦＰ演算として扱われて、同じＡＲＭメカニズムが適用され、未定義命令例外が発生されて、未定義命令ハンドラが実行される。
【０１０８】
非対応ＶＦＰ演算がＡＲＭ命令ストリームの１部として発生すると、未定義命令ハンドラは、命令ストリームを検査することによって、非対応ＶＦＰ演算をもたらした命令が実際にＶＦＰ命令であり、他の未定義命令ではないことを理解することが可能であり、また、未定義命令ハンドラは、特権モードで実行されるに連れて、必要とされるコプロセッサ命令を発行して、ＶＦＰプロセッサから必要とするいかなる内部状態でも抽出して、この必要とされた命令をソフトウエアで完了することが可能である。未定義命令ハンドラは、ＡＲＭ命令ストリーム中で識別された命令とＶＦＰの内部状態との双方を用いて、非対応演算を処理する。
【０１０９】
ＶＦＰを実現すると、非対応演算をもたらした命令は、非対応演算が検出された時に実行中であった命令とは同じではない場合が多い。非対応演算は、前に発行され、後続のＡＲＭ命令と平行に実行されているが、非対応状態に遭遇する命令によってもたらされている。ＶＦＰは、これを、後続のＶＦＰ命令を受け入れることを拒絶することによって信号通知し、ＶＦＰに質問して非対応演算のオリジナルの原因を発見することが可能なＶＦＰ未定義命令ハンドラを入力させる。
【０１１０】
Ｊａｚｅｌｌｅが、ＶＦＰサブシステムを含むシステムに統合されると、次のことが当てはまる：
−Ｊａｖａ浮動小数点命令が、対応するＶＦＰ命令を直接にコア内で、ＶＦＰ命令との直接的対応性を有する信号のセットを用いて発行する。
−ＶＦＰは、非対応動作に遭遇すると、非対応動作状態を信号通知する。
−Ｊａｚｅｌｌｅは、非対応動作信号を、それがコアに送られることを防止することによって、また、非対応命令ハンドラが、ＡＲＭ命令ストリーム中のＶＦＰ命令が不正確動作（であること）を信号通知すると発生するように実行することを防止することによってインターセプトする。替わりに、Ｊａｚｅｌｌｅは、ＪａｚｅｌｌｅＶＭサポートコードによって処理されるＪａｚｅｌｌｅＶＦＰ例外を発生する。
【０１１１】
ＶＭサポートコードは、このようなＶＦＰ例外に遭遇すると、ＦＭＲＸ  Ｒｄ命令や、ＦＰＳＣＲ命令などのＶＦＰ‘ｎｏ−ｏｐｅｒａｔｏｎ‘命令、すなわち、Ｊａｚｅｌｌｅ状態をそのままに残すなんらかのＶＦＰ命令を実行すべきである。これによって、ＶＦＰハードウエアがサポートコードに同期し、また、浮動小数点演算レジスタが、この場合非対応動作としてセットされるべき非対応動作状態フラグと共に指定したいかなるＶＦＰ演算も完了する。一旦演算が完了したら、非対応動作状態フラグはクリアされる。
【０１１２】
この方式は、Ｊａｚｅｌｌｅによって発行された命令シーケンスは、参照してその全体をここに組み込む、２０００年１０月５日に提出された英国同時係属特許出願第００２４４０４．０号に記載されておるように再開始可能であるという事実を利用している。この技法と共に上記の参考文献に記載の技法を用いることによって、非対応動作をもたらしたＶＦＰ命令の発生をもたらした命令を再開始することが可能となる。
【０１１３】
図２３に、Ｊａｖａバイトコードトランスレータによって発行された対応するＶＦＰ命令を、Ｊａｖａ浮動小数点演算の各々に対して示す。ここで、発行されたＶＦＰ命令だけを図示しており、Ｊａｖａバイトコードトランスレータは、ＶＦＰ命令と共に追加のＡＲＭ命令を発行することがあることに注意されたい。Ｊａｚｅｌｌｅバイトコードトランスレータはまた、追加のＶＦＰロードを発行して、浮動小数点値をロード又はストアする。
【０１１４】
図２４に、‘ｄｍｕｌ’バイトコード命令とそれに続く‘ｄｃｍｐｇ’命令から成るＪａｖａバイトコードのシーケンスに対するＪａｚｅｌｌｅによって発行される、命令又は命令に対応する信号のシーケンスを示す。図示のシーケンスは、（ｄｍｕｌ、ｄｃｍｐｇ）バイトコードシーケンスを、倍精度レジスタＤ０、Ｄ１及びＤ２がＪａｖａ実行スタックのトップから３番目のエレメント、トップから２番目のエレメント及びトップのエレメントをそれぞれ保持し、また、バイトコードシーケンスの整数結果が整数レジスタＲ０中に置かれる時点で実行することになっている場合に発生する。
【０１１５】
図２５、２７、２９及び３０に、非対応浮動小数点演算が、変換された命令シーケンスの様々なポイントで発生するときの動作のシーケンスを示す。図２５と２９は、非対応浮動小数点演算が、ＦＭＵＬＤ命令によってもたらされたときの動作のシーケンスを示す。図２７と３０は、非対応浮動小数点演算がＦＣＭＰＤ命令によってもたらされたときの動作のシーケンスを示す。図２５と２７は、非対応浮動小数点演算の信号通知が不正確であるときの動作のシーケンスを示す。図２９と３０は、非対応浮動小数点演算の信号通知が正確であるときの動作のシーケンスを示す。
【０１１６】
上記から分かるように、次に示す４つのイベントシーケンスが考えられる：
１）図２５：不正確な非対応動作検出、システムは不正確な非対応動作検出を用いているにもかかわらず、非対応動作を信号通知するＪａｖａバイトコードは、それをもたらしたものと同じである。
２）図２７：不正確な非対応動作検出、システムは不正確な非対応動作検出を用いているにもかかわらず、非対応動作を信号通知するＪａｖａバイトコードは、それをもたらしたものと同じである。これは、第２のＪａｖａバイトコード‘ｄｃｍｐｇ’が、１つのＪａｖａバイトコードに対して２つのＶＦＰ命令を発行し、この内の最初のものが非対応動作をもたらし、２番目のものがそれを信号通知するからである。
３）図２９：正確な非対応動作検出、非対応動作を信号通知するＪａｖａバイトコードは、それをもたらしたものと同じである。
４）図３０：正確な非対応動作検出、非対応動作を信号通知するＪａｖａバイトコードは、それをもたらしたものと同じであるが、‘ｄｃｍｐｇ’バイトコードを実行した結果発行されたこの２つのＶＦＰ命令の内のどちらが非対応動作をもたらして信号通知したか分からない。
【０１１７】
上記の再開始技法をこの技法と組み合わせると、これらの考えられるイベントシーケンスの全てを正確に処理することが可能となる。
【０１１８】
図２６と２８に、それぞれ図２５と２７に図示する動作のシーケンスに対応してもたらされた非対応動作の直後の時点における浮動小数点演算レジスタの状態と非対応動作状態フラグを示す。
【０１１９】
すべて２０００年１０月５日に提出された英国同時係属特許出願第００２４３９９．８号、第００２４４０２０．０号、第００２２４４０４．６号及び第００２４３９６号並びに、これまたＪａｖａバイトコード解釈システムを記載している、２０００年１１月２０日に提出された英国特許出願第００２８２４９．１号及び２０００年１２月７日に提出された米国特許出願第０９／７３１，０６０号を参照のこと。これらの同時係属出願は、その全体を参照してここに組み込む。
【図面の簡単な説明】
【０１２０】
【図１】バイトコード変換ハードウエアを組み込むデータ処理システムの図である。
【図２】バイトコードのソフトウエア命令解釈を示す略図である。
【図３】シーケンス終了命令で終了するソフトウエア命令インタープリタ内のコードセグメントの動作を略式に表すフローチャートである。
【図４】バイトコードの代わりに実行されるコードフラグメントの例の図である。
【図５】ハードウエアバイトコード実行サポートを有しない例示のデータ処理システムの例の図である。
【図６】図５のシステムで動作する場合のソフトウエア命令インタープリタの作用を示すフローチャートである。
【図７】Ｊａｖａバイトコードと処理動作間のマッピングの図である。
【図８】コンテンツアドレス可能メモリという形態でのプログラム可能変換テーブルの図である。
【図９】ランダムアクセスメモリという形態でのプログラム可能変換テーブルの図である。
【図１０】プログラム可能変換テーブルの初期化とプログラミングを示す略式のフローチャートである。
【図１１】Ｊａｖａバイトコード解釈を実行するシステム内の処理パイプラインのある部分を示す略図である。
【図１２】２つの命令ワードと２つの仮想メモリページにまたがる可変長命令を示す略図である。
【図１３】図１２に示すタイプのプリフェッチアボートを取り扱うメカニズムを含むデータ処理システムパイプラインのある部分を示す略図である。
【図１４】図１２に示すタイプのプリフェッチアボートがどのようにして検出されるかを指定する１つの方法である論理式を示す図である。
【図１５】アボートの取り扱いと命令のエミュレーションのためのサポートコードの配置を示す略図である。
【図１６】可変長バイトコード命令のプリフェッチアボートを取り扱うために実行される処理を示す略式のフローチャートである。
【図１７】オペレーティングシステムとこのオペレーティングシステムによって制御される様々なプロセス間の関係を示す図である。
【図１８】プロセッサコアとＪａｖａアクセラレータを含む処理システムを示す図である。
【図１９】Ｊａｖａアクセラレータの構成を制御する際におけるオペレーティングシステムの略式に動作を示すフローチャートである。
【図２０】Ｊａｖａ仮想マシンが、Ｊａｖａ加速メカニズムの構成を制御する際に自身が使用しているＪａｖａ加速メカニズムと共に実行する動作を示す略式のフローチャートである。
【図２１】図１に示すようなバイトコード変換ハードウエアとさらに浮動小数点サブシステムを組み込むデータ処理システムを示す図である。
【図２２】図１のようなバイトコード変換ハードウエアと、図２１のような浮動小数点サブシステムと、さらに、浮動小数点演算レジスタ及び非対応動作状態フラグを組み込むデータ処理システムを示す図である。
【図２３】Ｊａｖａ浮動小数点命令に対して発生されたＡＲＭ浮動小数点命令を示す図である。
【図２４】Ｊａｖａの‘ｄｍｕｌ’命令と‘ｄｃｍｐｇ’命令とに対するＪａｖａ加速ハードウエアによって発生されるＡＲＭ命令のシーケンスを示す図である。
【図２５】‘ｄｍｕｌ’命令を実行し、次に、‘ｄｃｍｐｇ’命令を実行する場合の動作のシーケンスを示す図であり、ここで、非対応浮動小数点演算が、Ｊａｖａの‘ｄｍｕｌ’命令に対するＪａｖａ加速ハードウエアによって発生されたＦＣＭＰＤ命令の実行によって引き起こされ、図示されるこの動作のシーケンスは、図２２に対応する不正確な非対応動作の検出を使用するシステム用である。
【図２６】図２５のＦＭＵＬＤ命令の実行後の、浮動小数点演算レジスタと非対応動作状態フラグの状態を示す図である。
【図２７】‘ｄｍｕｌ’命令を実行し、次に、‘ｄｃｍｐｇ’命令を実行する場合の動作のシーケンスを示す図であり、ここで、非対応浮動小数点演算が、Ｊａｖａの‘ｄｃｍｐｇ’命令に対するＪａｖａ加速ハードウエアによって発生されたＦＣＭＰＤ命令の実行によって引き起こされ、図示されるこの動作のシーケンスは、図２２に対応する不正確な非対応動作の検出を使用するシステム用である。
【図２８】図２７のＦＣＭＰＤ命令の実行後の、浮動小数点演算レジスタと非対応動作状態フラグの状態を示す図である。
【図２９】‘ｄｍｕｌ’命令を実行し、次に、‘ｄｃｍｐｇ’命令を実行する場合の動作のシーケンスを示す図であり、ここで、非対応浮動小数点演算が、Ｊａｖａの‘ｄｍｕｌ’命令に対するＪａｖａ加速ハードウエアによって発生されたＦＭＵＬＤ命令の実行によって引き起こされ、図示されるこの動作のシーケンスは、図２１に対応する正確な非対応動作を検出するシステム用である。
【図３０】‘ｄｍｕｌ’命令を実行し、次に、‘ｄｃｍｐｇ’命令を実行する場合の動作のシーケンスを示す図であり、ここで、非対応浮動小数点演算が、Ｊａｖａの‘ｄｃｍｐｇ’命令に対するＪａｖａ加速ハードウエアによって発生されたＦＣＭＰＤ命令の実行によって引き起こされ、図示されるこの動作のシーケンスは、図２１に対応する正確な非対応動作を検出するシステム用である。
【図１】
2008123545.tif 000003
【図２】
2008123545.tif 000004
【図３】
2008123545.tif 000005
【図４】
2008123545.tif 000006
【図５】
2008123545.tif 000007
【図６】
2008123545.tif 000008
【図７】
2008123545.tif 000009
【図８】
2008123545.tif 000010
【図９】
2008123545.tif 000011
【図１０】
2008123545.tif 000012
【図１１】
2008123545.tif 000013
【図１２】
2008123545.tif 000014
【図１３】
2008123545.tif 000015
【図１４】
2008123545.tif 000016
【図１５】
2008123545.tif 000017
【図１６】
2008123545.tif 000018
【図１７】
2008123545.tif 000019
【図１８】
2008123545.tif 000020
【図１９】
2008123545.tif 000021
【図２０】
2008123545.tif 000022
【図２１】
2008123545.tif 000023
【図２２】
2008123545.tif 000024
【図２３】
2008123545.tif 000025
【図２４】
2008123545.tif 000026
【図２５】
2008123545.tif 000027
【図２６】
2008123545.tif 000028
【図２７】
2008123545.tif 000029
【図２８】
2008123545.tif 000030
【図２９】
2008123545.tif 000031
【図３０】
2008123545.tif 000032