(57)【特許請求の範囲】
【請求項１】
データを処理する装置であって、
（ｉ）  ネイティブな命令集合のネイティブな命令を実行するよう動作可能なプロセッサ・コアと、
（ｉｉ）  非ネイティブな命令集合の非ネイティブな命令を前記プロセッサ・コアによって実行されるネイティブな命令へと解釈するよう動作可能な命令翻訳部とを具備し、
（ｉｉｉ）  前記命令翻訳部は、前記非ネイティブな命令集合内の非ネイティブな命令へのリターンに応答して、処理を非ネイティブな命令へと戻し、および
（ｉｖ）  前記命令翻訳部は、前記非ネイティブな命令集合内のネイティブな命令へのリターンに応答して、処理をネイティブな命令へと戻し、
前記非ネイティブな命令へと戻すことと、前記ネイティブな命令へと戻すこととは、異なる命令である、前記装置。
【請求項２】
前記命令翻訳部は、ハードウェアをベースとする命令翻訳部である請求項１に記載の装置。
【請求項３】
前記命令翻訳部は、ソフトウェアをベースとするインタープリタである請求項１に記載の装置。
【請求項４】
前記命令翻訳部は、ハードウェアをベースとする命令翻訳部とソフトウェアをベースとするインタープリタとの組み合わせである請求項１に記載の装置。
【請求項５】
前記非ネイティブな命令は、ジャバ・バーチャル・マシーンの命令である請求項１から４のいずれか一つに記載の装置。
【請求項６】
非ネイティブなサブルーチンは、非ネイティブなベニヤ・サブルーチンを介してネイティブなコードからコールされ、前記非ネイティブなサブルーチンの終了に際して、非ネイティブな命令へのリターンを用いて、処理を前記非ネイティブなベニヤ・サブルーチンへと戻し、前記非ネイティブなベニヤ・サブルーチン内のネイティブな命令へのリターンを用いて、処理を前記ネイティブなコードへと戻す請求項１から５のいずれか一つに記載の装置。
【請求項７】
前記非ネイティブなサブルーチンもまた、非ネイティブなコードからコールされる請求項６に記載の装置。
【請求項８】
前記非ネイティブなベニヤ・サブルーチンは、前記非ネイティブなサブルーチンがネイティブなコードからコールされるとき動的に作り出される請求項６および７のいずれか一つに記載の装置。
【請求項９】
前記非ネイティブなベニヤ・サブルーチンは、ネイティブなコード・オペレーションによって用いられるスタック・メモリ領域内に蓄積されて作り出される請求項８に記載の装置。
【請求項１０】
前記命令翻訳部は、複数のタイプの、非ネイティブな命令へのリターンに応答する請求項１から９のいずれか一つに記載の装置。
【請求項１１】
前記複数のタイプの、非ネイティブな命令へのリターンは、複数の異なるタイプのリターン値を用いて処理を戻す請求項１０に記載の装置。
【請求項１２】
前記リターン値の複数の異なるタイプには、
（ｉ）  ３２ビット整数リターン値
（ｉｉ）  ６４ビット整数リターン値
（ｉｉｉ）  オブジェクト参照リターン値
（ｉｖ）  １次有効浮動小数点リターン値
（ｖ）  ２次有効浮動小数点リターン値
（ｖｉ）  値を有さない空リターン値
の内の一つ以上が含まれている請求項１１に記載の装置。
【請求項１３】
前記命令翻訳部が、複数のタイプの、ネイティブな命令へのリターンに応答する請求項１から１２のいずれか一つに記載の装置。
【請求項１４】
前記複数のタイプの、ネイティブな命令へのリターンは、複数の異なるタイプのリターン値を用いて処理を戻す請求項１３に記載の装置。
【請求項１５】
データを処理する方法であって、
（ｉ）  プロセッサ・コアを用いてネイティブな命令集合のネイティブな命令を実行し、
（ｉｉ）  非ネイティブな命令集合の非ネイティブな命令を前記プロセッサ・コアによって実行されるネイティブな命令へと解釈するステップを具備し、
（ｉｉｉ）  前記非ネイティブな命令集合内の非ネイティブな命令へのリターンに応答して、処理を非ネイティブな命令へと戻し、および
（ｉｖ）  前記非ネイティブな命令集合内のネイティブな命令へのリターンに応答して、処理をネイティブな命令へと戻し、
前記非ネイティブな命令へと戻すことと、前記ネイティブな命令へと戻すこととは、異なる命令である、前記方法。
【請求項１６】
データ処理装置に、
（ｉ）  プロセッサ・コアを用いてネイティブな命令集合のネイティブな命令を実行するステップと、
（ｉｉ）  非ネイティブな命令集合の非ネイティブな命令を前記プロセッサ・コアによって実行されるネイティブな命令へと解釈するステップと、
（ｉｉｉ）  前記非ネイティブな命令集合内の非ネイティブな命令へのリターンに応答して、処理を非ネイティブな命令へと戻すステップと、
（ｉｖ）  前記非ネイティブな命令集合内のネイティブな命令へのリターンに応答して、処理をネイティブな命令へと戻すステップと、
を実行させるためのコンピュータ・プログラムであって、
前記非ネイティブな命令へと戻すことと、前記ネイティブな命令へと戻すこととは、異なる命令である、前記コンピュータ・プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、データ処理の分野に関する。より詳しくは、この発明は、ネイティブな命令と、解釈された非ネイティブな命令との双方をサポートするデータ処理システムであって、ネイティブなコードから非ネイティブなサブルーチンへのサブルーチン・コールを行うものに関する。
【０００２】
【従来の技術と発明が解決しようとする課題】
プログラム・ストラクチャ内でサブルーチン・コールを使用するのは、周知のコンピュータ・プログラミング技術である。そのようなサブルーチン・コールは、頻繁に用いられるコード・セグメントがコンピュータ・プログラム内の異なるポイントから再使用されることを可能とする。コンピュータ・プログラムが、サブルーチンの実行を開始することが望まれるポイントに到達すると、コール命令が実行されて、処理をそのサブルーチンの開始に変更する。そのサブルーチンの終わりで、リターン命令が実行され、サブルーチン・コールが行われたポイントの直後に続くプログラム・コードのアドレスへと処理制御をリターンさせる。
【０００３】
プロセッサ・コアによって直接実行されるネイティブな命令と、実行に先立ってネイティブな命令の形への解釈が必要とされる非ネイティブな命令とを混合して使用するコンピュータ・プログラムのオペレーションを提供することは周知である。典型的には、ネイティブな命令は、より迅速に実行されるが、よりコード密度が低く、非ネイティブな命令よりもプログラムするのが困難である。
【０００４】
添付図面の図１４には、非ネイティブな呼び出しルーティンが、非ネイティブなサブルーチンにサブルーチン・コールを行う周知の技術が示されている。コールは、処理制御を対応するサブルーチンのスタートに送る静的呼び出し（ｉｎｖｏｋｅ＿ｓｔａｔｉｃ）命令によって行われる。サブルーチンの終わりに、処理を、静的呼び出し命令の直後に続く非ネイティブな命令へとリターンさせるリターン命令が実行される。
【０００５】
添付図面の図１５には、ネイティブなサブルーチンをコールするのに用いられるネイティブな呼び出しプログラムが示されている。この例において、ネイティブなプログラムの呼び出しとネイティブなプログラムのサブルーチンは、ＡＲＭオブジェクト・コードの形（英国ケンブリッジのＡＲＭ株式会社により作られたＡＲＭプロセッサのネイティブな命令を用いる）で書かれている。その呼び出しプログラムは、ネイティブなコール命令ＢＬ＜ａｄｄｒｅｓｓ＞を発し、制御をネイティブなサブルーチン・プログラムの開始に送る。ＢＬ＜ａｄｄｒｅｓｓ＞はまた、プロセッサ・コアのレジスタ（この例においては、リンク・レジスタｌｒ）にリターン・アドレスを蓄積し、サブルーチン・コール命令に続くアドレスを指示する。ネイティブなサブルーチンの終わりに、ＭＯＶＳ  ｐｃ  ｌｒ形式のネイティブな命令のリターン命令が、蓄積されたリターン・アドレスをリンク・レジスタｌｒからプログラム・カウンタ・レジスタｐｃへと移動させ、それによってオリジナルの呼び出し命令の次のネイティブな命令の処理を再開するようにする。
【０００６】
添付図面の図１６には、ネイティブな呼び出しコードと、非ネイティブな呼び出しコードとによってコールされる共通の非ネイティブなサブルーチンが示されている。非ネイティブなサブルーチンは、非ネイティブなモードで実行されるので、サブルーチンが完了するとき、非ネイティブな呼び出しプログラムへとリターンが行われ、その場合には、モード・チェンジは必要とされず、またはその代わりにネイティブな呼び出しプログラムへとリターンが行われ、その場合には、モード・チェンジが必要とされるかどうか決定する必要がある。これを達成するために、非ネイティブなサブルーチンの終わりのリターン命令は、リターンが実際に行われる前に、リターンがネイティブな呼び出しプログラムへ行われるのか、非ネイティブな呼び出しプログラムへ行われるのかを決定するテストをしなければならない。これは、処理をスロー・ダウンさせる。適当な決定および必要ならばネイティブな呼び出しプログラムまたは非ネイティブな呼び出しプログラムへのリターンを実行するために、図１６のサブルーチンの終わりで、非ネイティブなリターン命令から解釈されるいくつかのＡＲＭオブジェクト・コード命令の一例が以下に示される。
ｄｏ＿ｒｅｔｕｒｎ
ＬＤＲ    Ｒｔｍｐ，［Ｒｆｒａｍｅ，＃ｐｒｅｖｉｏｕｓ＿ｆｒａｍｅ］
ＣＭＰ    Ｒｔｍｐ，＃０
ＢＥＱ    ｒｅｔｕｒｎ＿ｔｏ＿ｎａｔｉｖｅ
ｒｅｔｕｒｎ＿ｔｏ＿ｊａｖａ
非ネイティブのジャバ・コードへのリターンを行うコード
ｒｅｔｕｒｎ＿ｔｏ＿ｎａｔｉｖｅ
ネイティブのＡＲＭまたはサム（Ｔｈｕｍｂ）コードへのリターンを行うコード
この例のコードは、リターン命令は、コールが行われた前のフレーム値が＃０であったかどうかを決定するよう働く、ジャバ・ソフトウェア・インタープリタによってＡＲＭオブジェクト・コードへ解釈されるジャバ・バイトコード（ｂｙｔｅｃｏｄｅ）である。前のフレーム値が＃０なら、呼び出しプログラムがネイティブなプログラムであって、ネイティブなプログラム・モード（すなわち、ＡＲＭオブジェクト・コード）へのリターンが行われることを指示する。前のフレーム値が＃０でないならば、呼び出しプログラムは非ネイティブなプログラムであって、非ネイティブなプログラム（すなわち、ジャバ）へのリターンが行われる。
【０００７】
リターンが行われるたびごとに、呼び出しプログラムが、ネイティブな呼び出しプログラムであったか非ネイティブな呼び出しプログラムであったかを決定する余分な処理が必要となることは、パフォーマンスの損失であるということが理解される。これは特別な場合である、なぜなら、大半の場合、非ネイティブなサブルーチンは、非ネイティブな呼び出しプログラムからコールされ、またネイティブなサブルーチンは、ネイティブな呼び出しプログラムからコールされ、ネイティブと非ネイティブのルーティン間の相互呼び出しは比較的少ししかないからである。このように、非常に大多数の場合について検討してみると、モードは変化していないにもかかわらず、ネイティブと非ネイティブのコード間での相互呼び出しという比較的まれな場合を取り扱うために、各リターン命令で行われなければならないということを示す結果が生じる。
【０００８】
添付図面の図１７には、非ネイティブのベニヤ（ｖｅｎｅｅｒ）サブルーチンが、ネイティブな呼び出しコードから、メインの非ネイティブなサブルーチンの実行を引き起こす間接的な技術としてコールされる周知のシステムが示されている。そのようなベニヤ・サブルーチンを使うことは、有効なプログラミングのために周知の技術である。
【０００９】
命令集合と、他のバックグランドの情報の間の翻訳のための周知システムの例が、以下に見出せる。ＵＳ−Ａ−５，８０５，８９５、ＵＳ−Ａ−３，９５５，１８０、ＵＳ−Ａ−５，９７０，２４２、ＵＳ−Ａ−５，６１９，６６５、ＵＳ−Ａ−５，８２６，０８９、ＵＳ−Ａ−５，９２５，１２３、ＵＳ−Ａ−５，８７５，３３６、ＵＳ−Ａ−５，９３７，１９３、ＵＳ−Ａ−５，９５３，５２０、ＵＳ−Ａ−６，０２１，４６９、ＵＳ−Ａ−５，５６８，６４６、ＵＳ−Ａ−５，７５８，１１５、ＵＳ−Ａ−５，３６７，６８５、ＩＢＭ技術開示報告（ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ）１９８８年３月第３０８〜３０９頁「レデュースド・インストラクション・セット・コンピュータのためのシステム／３７０エミュレータ支援プロセッサ（Ｓｙｓｔｅｍ／３７０  Ｅｍｕｌａｔｏｒ  Ａｓｓｉｓｔ  Ｐｒｏｃｅｓｓｏｒ  Ｆｏｒ  ａ  Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９８６年７月第５４８〜５４９頁「完全機能シリーズ／１命令集合エミュレータ（Ｆｕｌｌ  Ｆｕｎｃｔｉｏｎ  Ｓｅｒｉｅｓ／１  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｅｍｕｌａｔｏｒ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９９４年３月第６０５〜６０６頁「ＲＩＳＣプロセッサにおける実時間ＣＩＳＣアーキテクチャＨＷエミュレータ（Ｒｅａｌ−Ｔｉｍｅ  ＣＩＳＣ  Ａｒｃｈｉｔｅｃｔｕｒｅ  ＨＷ  Ｅｍｕｌａｔｏｒ  ＯｎＡ  ＲＩＳＣ  Ｐｒｏｃｅｓｓｏｒ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９９８年３月第２７２頁「エミュレーション制御ブロックを用いる性能の向上（Ｐｅｒｆｏｒｍａｎｃｅ  Ｉｍｐｒｏｖｅｍｅｎｔ  Ｕｓｉｎｇ  Ａｎ  ＥＭＵＬＡＴＩＯＮ  Ｃｏｎｔｒｏｌ  Ｂｌｏｃｋ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９９５年１月第５３７〜５４０頁「レデュースト・インストラクション・セット・コンピュータ／サイクル・システムにおけるコード・エミュレーションのための高速命令デコード（Ｆａｓｔ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｄｅｃｏｄｅ  Ｆｏｒ  Ｃｏｄｅ  Ｅｍｕｌａｔｉｏｎ  ｏｎ  Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ／Ｃｙｃｌｅｓ  Ｓｙｓｔｅｍｓ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ１９９３年２月第２３１〜２３４頁「高性能二重アーキテクチャ・プロセッサ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｄｕａｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｐｒｏｃｅｓｓｏｒ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  ＤｉｓｃｌｏｓｕｒｅＢｕｌｌｅｔｉｎ  １９８９年８月第４０〜４３頁「システム／３７０  Ｉ／Ｏチャンネル・プログラム・チャンネル・コマンド・ワード・プリフェッチ（Ｓｙｓｔｅｍ／３７０  Ｉ／Ｏ  Ｃｈａｎｎｅｌ  Ｐｒｏｇｒａｍ  Ｃｈａｎｎｅｌ  Ｃｏｍｍａｎｄ  Ｗｏｒｄ  Ｐｒｅｆｅｔｃｈ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９８５年６月第３０５〜３０６頁「完全マイクロコード制御エミュレーション・アー���テクチャ（Ｆｕｌｌｙ  Ｍｉｃｒｏｃｏｄｅ−Ｃｏｎｔｒｏｌｌｅｄ  Ｅｍｕｌａｔｉｏｎ  Ａｒｃｈｉｔｅｃｔｕｒｅ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９７２年３月第３０７４〜３０７６頁「エミュレーションのための操作符号および状態取り扱い（Ｏｐ  Ｃｏｄｅ  ａｎｄ  Ｓｔａｔｕｓ  Ｈａｎｄｌｉｎｇ  Ｆｏｒ  Ｅｍｕｌａｔｉｏｎ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９８２年８月第９５４〜９５６頁「残余の命令をコード化するのに適した大きなシステムおよびプリミティブの最も頻繁に用いられる命令を備えたマイクロプロセッサのチップ上マイクロコーディング（Ｏｎ−Ｃｈｉｐ  Ｍｉｃｒｏｃｏｄｉｎｇ  ｏｆ  ａ  Ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ  Ｗｉｔｈ  Ｍｏｓｔ  Ｆｒｅｑｕｅｎｔｌｙ  Ｕｓｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎｓ  ｏｆ  Ｌａｒｇｅ  Ｓｙｓｔｅｍ  ａｎｄＰｒｉｍｉｔｉｖｅｓ  Ｓｕｉｔａｂｌｅ  ｆｏｒ  Ｃｏｄｉｎｇ  Ｒｅｍａｉｎｉｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎｓ）」、ＩＢＭ  Ｔｅｃｈｎｉｃａｌ  Ｄｉｓｃｌｏｓｕｒｅ  Ｂｕｌｌｅｔｉｎ  １９８３年４月第５５７６〜５５７７頁「エミュレーション命令（Ｅｍｕｌａｔｉｏｎ  Ｉｎｓｔｒｕｃｔｉｏｎ）」、Ｓファーバ（Ｓ  Ｆｕｒｂｅｒ）による書籍ＡＲＭシステム・アーキテクチャ（ＡＲＭ  Ｓｙｓｔｅｍ  Ａｒｃｈｉｔｅｃｔｕｒｅ）、ヘネシー（Ｈｅｎｎｅｓｓｙ）とパターソン（Ｐａｔｔｅｒｓｏｎ）による書籍コンピュータ・アーキテクチャ：量的アプローチ（Ｃｏｍｐｕｔｅｒ  Ａｒｃｈｉｔｅｃｔｕｒｅ：ＡＱｕａｎｔｉｔａｔｉｖｅ  Ａｐｐｒｏａｃｈ）およびティム・リンドホーム（Ｔｉｍ  Ｌｉｎｄｈｏｌｍ）とフランク・イェリン（Ｆｒａｎｋ  Ｙｅｌｌｉｎ）による書籍ジャバ・バーチャル・マシーン仕様（Ｔｈｅ  Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ）第１版および第２版。
【００１０】
【課題を解決するための手段】
一つの観点から見ると、本発明はデータを処理する装置を提供し、その装置は、
（ｉ）ネイティブな命令集合のネイティブな命令を実行するよう動作可能なプロセッサ・コアと、
（ｉｉ）非ネイティブな命令集合の非ネイティブな命令を前記プロセッサ・コアによる実行のためにネイティブな命令に解釈するよう動作可能な命令翻訳部とを具備し、ここで、
（ｉｉｉ）前記命令翻訳部は、前記非ネイティブな命令集合の非ネイティブな命令へのリターンに応答して、処理を非ネイティブな命令にリターンし、また、
（ｉｖ）前記命令翻訳部は、前記非ネイティブな命令集合のネイティブな命令へのリターンに応答して、処理をネイティブな命令にリターンする。
【００１１】
本発明は、ネイティブと非ネイティブの命令の間での相互呼び出しが、コールがネイティブかまたは非ネイティブのコードからなされたかどうかを各リターン命令でチェックする非効率性を供なうという、前述の問題を認識する。これらの問題を低減するために、発明は、別々に区別される命令を、非ネイティブな命令へのリターンおよびネイティブな命令へのリターンの形で提供し、それによって、処理がそれぞれ非ネイティブな命令およびネイティブな命令へとリターンされる。このようにして、ネイティブな命令または非ネイティブな命令へのリターンの柔軟性が、リターン命令に遭遇するごとに呼び出しプログラムの性質をチェックする更なるオーバーヘッドを必要とすることなしに提供される。その代わりに、特定のタイプのリターン命令を提供して、プログラムに、実行されるべきリターンの性質を効率的にコード化する。
【００１２】
命令翻訳部は、多くの異なる形状を取り得るということが理解される。とりわけ、命令翻訳部は、ハードウェアをベースとする命令翻訳部であっても、ソフトウェアをベースとするインタープリタであっても、それら２つの混合であってもよい。
【００１３】
解釈された命令は、多くの異なる形状を取り得る。しかしながら、発明は、とりわけ非ネイティブな命令がジャバ・バーチャル・マシーンの命令である実施例によく適合している。そのようなジャバ・バーチャル・マシーンの命令は、サブルーチン・コールを頻繁に用い、また、高パフォーマンスの適合した実施例では、ネイティブな命令とすぐに混合される。
【００１４】
別々のサブルーチンに、ネイティブおよび非ネイティブな呼び出しプログラムからのコールのためにそれぞれ用いられる、それら自体のリターン命令を個別に備えることが可能であるが、発明の好ましい実施例では、非ネイティブなサブルーチンは非ネイティブなベニヤ・サブルーチンを介して、ネイティブなコードからコールされ、前記非ネイティブなサブルーチンの完了に際し、非ネイティブな命令へのリターンを用いて、処理を前記非ネイティブなベニヤ・サブルーチンに戻すことができ、処理を前記ネイティブなコードへ戻す前記非ネイティブなベニヤ・サブルーチン内にはネイティブな命令へのリターンがある。
【００１５】
ネイティブなコードと非ネイティブなサブルーチンとの間で、非ネイティブなベニヤ・サブルーチンを用いることで、非ネイティブなリターンであるサブルーチンの終わりで、スタンダードなリターンに対して、ネイティブなコードからコールがなされることを可能とするよう、別々に提供される小さな非ネイティブなベニヤ・サブルーチンのみで、非ネイティブなサブルーチンの再使用が可能となる。
【００１６】
ベニヤ・サブルーチンを提供する必要性によって消費される更なるメモリは、非ネイティブなサブルーチンがネイティブなコードからコールされるとき、ベニヤ・サブルーチンが動的に作り出される発明の実施例において有利に低減されている。これを達成するのに特に好ましい方法は、ネイティブなコードの動作可能モードのスタック・メモリ領域内に非ネイティブなベニヤ・サブルーチンを作り出し、通常のシステムリソースをこの非ネイティブなベニヤ・サブルーチンが蓄積されるように使用することができ、また、サブルーチンの重ね合わせ（ｎｅｓｔｉｎｇ）が適宜サポートされるようにすることである。
【００１７】
発明の好ましい洗練された実施例においては、異なるタイプのリターン値、例えば、３２ビットの整数、６４ビットの整数オブジェクト基準値、１次有効浮動小数点値、２次有効浮動小数点値または値を有さない空値をリターンすることのできる非ネイティブな命令への複数のタイプのリターンが提供される。
【００１８】
実施例によっては、解釈された命令集合内に操作符号スペースを保存するようネイティブな命令への単一のリターンのみが提供されているが、他の実施例においては、解釈された命令集合内にネイティブな命令への複数のリターンを同様に提供することが好ましい。
【００１９】
別の観点から見て、本発明はデータを処理する方法を提供し、その方法は、
（ｉ）プロセッサ・コアを用いてネイティブな命令集合のネイティブな命令を実行する、そして
（ｉｉ）非ネイティブな命令集合の非ネイティブな命令を前記プロセッサ・コアによる実行のためにネイティブな命令に解釈する
ステップを具備し、ここで
（ｉｉｉ）前記非ネイティブな命令集合の非ネイティブな命令へのリターンに応答して処理を非ネイティブな命令にリターンする、そして
（ｉｖ）前記非ネイティブな命令集合のネイティブな命令へのリターンに応答して処理をネイティブな命令にリターンする。
【００２０】
この発明の前記およびその他の目的、特徴および利点は、添付図面と関係させて読まれる以下の例示的な実施例の詳細な説明から明らかとなる。
【００２１】
【発明の実施の形態】
図１は、ＡＲＭプロセッサをベースとするシステムにおいて用いられるのに適したタイプの第一例の命令パイプライン３０を示す。その命令パイプライン３０には、フェッチ・ステージ３２、ネイティブな命令（ＡＲＭ／サム命令）デコード・ステージ３４、実行ステージ３６、メモリ・アクセス・ステージ３８およびライト・バック・ステージ４０が含まれている。実行ステージ３６、メモリ・アクセス・ステージ３８およびライト・バック・ステージ４０は、実質的に従来のものである。フェッチ・ステージ３２の下流およびネイティブな命令デコード・ステージ３４の上流には、命令翻訳ステージ４２が提供される。命令翻訳ステージ４２は、多様な長さのジャバ・バイトコード命令をネイティブなＡＲＭ命令に翻訳する有限状態機械である。命令翻訳ステージ４２は、単一のジャバ・バイトコード命令が、命令パイプライン３０の残りに沿って送出される一連のＡＲＭ命令を生成して、そのジャバ・バイトコード命令によって特定される動作を行うマルチステップ動作が可能である。単純なジャバ・バイトコード命令は、単一のＡＲＭ命令のみがそれらの動作を行うことを要求し、一方、より複雑なジャバ・バイトコード命令、または周囲のシステム状態がそのように指令する環境においては、ジャバ・バイトコード命令によって特定される動作を提供するのにいくつかのＡＲＭ命令が必要とされる。このマルチステップ動作は、フェッチ・ステージ３２の下流で起こり、したがって、多重に翻訳されたＡＲＭ命令またはジャバ・バイトコードをメモリ・システムからフェッチしてくるのに電力は消費されない。ジャバ・バイトコード命令は、通常の方法でメモリ・システム内に蓄積され、ジャバ・バイトコード翻訳動作をサポートするためにそのメモリ・システムに更なる制約が加えられないようになっている。
【００２２】
図示されるように、命令翻訳ステージ４２は、バイパス経路に備えられる。命令翻訳モードで動作していないとき、命令パイプライン３０は、命令翻訳ステージ４２をバイパスして、本質的に変えられていない方法で動作してネイティブな命令のデコードを行う。
【００２３】
命令パイプライン３０において、命令翻訳ステージ４２が、対応するＡＲＭ命令を完全に表し、マルチプレクサを介してネイティブな命令デコーダ３４に送られる翻訳部出力信号を生成するものとして例示される。命令翻訳部４２はまた、ネイティブな命令デコーダ３４に送られるいくつかの付加的な制御信号を生成する。ネイティブな命令の符号化において、ビット・スペースの制約は、ネイティブな命令によって特定されるオペランドの範囲に制限を加える。これらの制限は、必ずしも非ネイティブな命令と共同ではない。付加的な制御信号は、メモリ内に蓄積されているネイティブな命令内では特定することができない非ネイティブな命令から提供される更なる命令の特定信号を通すように機能する。一例として、ネイティブな命令は、ネイティブな命令内の直接のオペランド・フィールドとして用いられる比較的少数のビットを提供するのみであり、一方、非ネイティブな命令は、拡大された範囲を可能とし、付加的な制御信号を用いることによって、これを利用することができ、直接オペランドの拡大された部分を、やはりネイティブな命令デコーダ３４に送られる、翻訳されたネイティブな命令の外のネイティブな命令デコーダ３４に送る。
【００２４】
図２は、更なる命令パイプライン４４を例示する。この例において、システムには、２つのネイティブな命令デコーダ４６，４８と非ネイティブな命令デコーダ５０が備えられる。非ネイティブな命令デコーダ５０は、それが、ネイティブな命令をサポートするよう備えられる実行ステージ５２、メモリ・ステージ５４およびライト・バック・ステージ５６によって特定し得る動作に固定されている。したがって、非ネイティブな命令デコーダ５０は、非ネイティブな命令をネイティブなオペレーション（それは単一のネイティブなオペレーションか一連のネイティブなオペレーションかである）へ効率よく翻訳し、そして、適切な制御信号を実行ステージ５２に供給してこれら１つ以上のネイティブなオペレーションを実行するようにしなければならない。この例においては、非ネイティブな命令デコーダは、ネイティブな命令を構成する信号を生み出すのではなく、ネイティブな命令（または拡大されたネイティブな命令）オペレーションを特定する制御信号を提供するということが理解される。その生成される制御信号は、ネイティブな命令デコーダ４６，４８によって生成される制御信号とは一致しない。
【００２５】
オペレーションにおいて、フェッチ・ステージ５８によってフェッチされる命令が、例示されたデマルチプレクサを用いる特定の処理モードに依存して、命令デコーダ４６，４８または５０の１つに選択的に供給される。
【００２６】
図３は、命令パイプラインのフェッチ・ステージをより詳細に概略的に例示する。フェッチング・ロジック６０は、固定長命令ワード（語）をメモリ・システムからフェッチして、これらを命令ワード・バッファ６２に供給する。命令ワード・バッファ６２は、処理中の命令ワードと次の命令ワードの双方を蓄積する２つの部分を有するスイング・バッファである。処理中の命令ワードが完全にデコードされていて、デコードが次の命令ワードにまで進行しているときはいつでも、フェッチ・ロジック６０は前の処理中の命令ワードをメモリからフェッチされる次の命令ワードと置き換えるよう働く、すなわち、スイング・バッファの各部は、それらが連続して蓄積する命令ワードをインターリーブされるように２つ増加する。
【００２７】
図示された例において、ジャバ・バイトコード命令の最大命令長は、３バイトである。したがって、ワード・バッファ６２のいずれの側内でも３つの隣り合ったバイトを選択し、命令翻訳部６４に供給することを可能とする３つのマルチプレクサが提供される。ワード・バッファ６２と命令翻訳部６４にはまた、ネイティブな命令がフェッチされてデコードされるとき用いられるバイパス経路６６が備えられる。
【００２８】
各命令ワードは、一旦メモリからフェッチされてワード・バッファ６２内に蓄積されることがわかる。単一の命令ワードは、命令翻訳部６４がＡＲＭ命令へのジャバ・バイトコードの翻訳を行うとき、それから読まれる多重のジャバ・バイトコードを有する。命令翻訳オペレーションは、命令パイプライン内に留められるので、ネイティブな命令の可変長の翻訳されたシーケンスが、多重メモリ・システムの読み取りを必要とせず、かつメモリ源を消費したり、メモリ・システムに他の制約を加えたりすることなく生成される。
【００２９】
プログラム・カウンタ値は、現在翻訳されている各ジャバ・バイトコードと関係する。このプログラム・カウンタ値は、各ステージが、必要ならば、それが処理している特定のジャバ・バイトコードに関する情報を用いることができるように、パイプラインのステージに沿って送られる。複数のＡＲＭ命令オペレーション・シーケンスへと翻訳するジャバ・バイトコードのためのプログラム・カウンタ値は、そのシーケンス内の最後のＡＲＭ命令オペレーションが実行され始めるまで増大されない。実行されつつあるメモリ内の命令に直接向けられ続けるようにプログラム・カウンタ値を保つことは、デバグやブランチ・ターゲット計算のようなシステムの他の観点を有利に単純化する。
【００３０】
図４は、命令バッファ６２から可変長ジャバ・バイトコード命令を読み取ることを概略的に示す。第１のステージでは、１という長さを有するジャバ・バイトコード命令が読み取られ、デコードされる。次のステージは、長さが３バイトであって、メモリからフェッチされている２つの隣接する命令ワード間にまたがるジャバ・バイトコード命令である。これらの命令ワードの双方は、命令バッファ６２内に存在しており、そのため命令のデコードおよび処理は、フェッチされた命令ワード間での可変長の命令のこのまたがり（ｓｐａｎｎｉｎｇ）によって遅延されない。一旦３つのジャバ・バイトコードが命令バッファ６２から読み取られているならば、命令ワードのより早くフェッチされたものの再充填は、その後の処理が、既に存在している以下の命令ワードからジャバ・バイトコードのデコードを続けるとき、開始される。
【００３１】
図４に例示される最終ステージは、読み取られる第２の３つのバイトコードの命令を示す。再び、これは命令ワード間にまたがる。先の命令ワードがまだその再充填を完了していないならば、命令の読み取りはパイプラインの中断（ｓｔａｌｌ）によって、適切な命令ワードが命令バッファ６２に蓄積されるまで遅延される。実施例では、パイプラインが、この種の振る舞いによって決して停止しないようにタイミングが採られている。ほとんどのジャバ・バイトコードは、図示された例よりも短いので、この例は比較的稀にしか発生しないものであり、したがって、２つの連続するデコードで命令ワード間の双方ともまたがることは、比較的稀である。有効信号が命令バッファ６２内の命令ワードの各々と関連付けられ、命令ワードがそこから読み取られたジャバ・バイトコードの前に適切に再充填されているかどうかの信号を送ることができるようになっている。
【００３２】
図５は、プロセッサ・コア１０４とレジスタ・バンク１０６を含むデータ処理システム１０２を示す。命令翻訳部１０８は、ジャバ・バーチャル・マシーンの命令をネイティブなＡＲＭ命令（またはそれに対応する制御信号）に翻訳し、そしてそれはプロセッサ・コア１０４に供給される命令の経路内に提供される。命令翻訳部１０８は、ネイティブなＡＲＭ命令がアドレス可能なメモリからフェッチされているとき、バイパスされる。アドレス可能なメモリは、更にオフチップＲＡＭメモリを有するキャッシュ・メモリのようなメモリ・システムであっても良い。翻訳が必要である密度の高い命令がメモリ・システム内に蓄積され、そして、プロセッサ・コア１０４に送られる直前にネイティブな命令に引き延ばされるだけであるので、命令翻訳部１０８をメモリ・システムの下流に設置すること、そしてとりわけ、キャッシュ・メモリは、メモリ・システムの蓄積キャパシティの効率の良い使用をもたらす。
【００３３】
この例におけるレジスタ・バンク１０６には１６の３２ビット凡用レジスタがあり、その内の４つが蓄積スタック・オペランドに用いられるよう割り当てられている、すなわち、スタック・オペランドを蓄積するレジスタの集合は、レジスタＲ０，Ｒ１，Ｒ２およびＲ３である。
【００３４】
そのレジスタの集合は、空であるかスタック・オペランドで部分的に充填されているかまたはスタック・オペランドで完全に充填されている。現在、スタック・オペランドの先頭を保持する特定のレジスタは、レジスタの集合内でいずれのレジスタであってもよい。したがって、命令翻訳部は、１７の異なるマッピング状態のいずれかであり、その状態は、全てのレジスタが空でありレジスタの集合内に保持されるスタック・オペランドの異なる数字とスタック・オペランドの先頭を保持する異なるレジスタに各々が対応する４つの状態の４つのグループであることが理解される。表１は、命令翻訳部１０８についての状態マッピングの１７の異なる状態を例示する。異なる数のレジスタをスタック・オペランド蓄積に割り当て、または特定のプロセッサ・コアが可能なレジスタ内に保持されるデータ値を操作する方法の制約の結果として、マッピング状態は相当に特定の実施例に依存するものであり、表１は、１つの特定の実施例の例示として与えられるに過ぎないということが理解される。
0004938187.tif 000002
【００３５】
表１内では、状態値の最初の３ビットが、レジスタの集合内の空でないレジスタの数を指示することが観察される。状態値の最後の２ビットは、スタック・オペランドの先頭を保持するレジスタのレジスタ番号を指示する。このように、状態値は、レジスタの集合の現在の占有状態およびスタック・オペランドの先頭の現在の位置を考慮するハードウェア翻訳部またはソフトウェア翻訳部のオペランドを制御するのに直ちに用いられる。
【００３６】
図５に例示されるように、ジャバ・バイトコードＪ１，Ｊ２，Ｊ３の流れは、アドレス可能メモリ・システムから命令翻訳部１０８に送出される。そして、命令翻訳部１０８は、入力ジャバ・バイトコードおよび命令翻訳部８の瞬時のマッピング状態ならびにその他の変数に依存してＡＲＭ命令の流れ（または等価な制御信号、可能ならば拡大されたもの）を出力する。図示された例は、ＡＲＭ命令Ａ1１およびＡ1２にマッピングされるジャバ・バイトコードＪ１示す。ジャバ・バイトコードＪ２は、ＡＲＭ命令Ａ2１，Ａ2２およびＡ2３にマッピングされる。最後に、ジャバ・バイトコードＪ３は、ＡＲＭ命令Ａ3１にマッピングされる。ジャバ・バイトコードの各々は、入力として１つ以上のスタック・オペランドを必要とし、出力として１つ以上のスタック・オペランドを生成する。この例におけるプロセッサ・コア１０４は、レジスタ内で保持されるデータ値のみが操作されるロード／ストアアーキテクチャを有するＡＲＭプロセッサ・コアであると仮定されており、命令翻訳部１０８は、必要に応じて、どの要求されるスタック・オペランドでもそれらが操作される前にレジスタの集合にフェッチし、または生成される結果のスタック・オペランドのために空き場所を作るレジスタの集合内の現在保持されるスタック・オペランドをアドレス可能なメモリに蓄積するＡＲＭ命令を生成するよう配置される。各ジャバ・バイトコードは、ジャバオペコードを表すＡＲＭ命令の実行に先立って利用できなければならないレジスタの集合内での空のレジスタの数を指示する「空要求」値と一緒に実行に先立ってレジスタの集合内に存在しなければならないスタック・オペランドの数を指示する関連した「充満要求」値を有するものと考えられるということが理解される。
【００３７】
表２は、初期マッピング状態値、充満要求値、最終状態値および関連したＡＲＭ命令の間の関係を例示する。初期状態値と最終状態値は、表１に例示されるマッピング状態に対応する。命令翻訳部１０８は、それが翻訳しつつある特定のジャバ・バイトコード（オペコード）と関係する充満要求値を決定する。命令翻訳部（１０８）は、それが有する初期マッピング状態に依存して、より多くのスタック・オペランドがジャバ・バイトコードを実行する前にレジスタの集合にローディングされる必要があるかどうかを決定する。
表１は、ジャバ・バイトコードの充満要求値に適用されるテストと一緒に初期状態を示し、それらは一緒に、スタック・オペランドが、関連するＡＲＭ命令（ＬＤＲ命令）を用いてレジスタの集合にローディングされる必要があるかどうか、またスタック・キャッシュ・ロード・オペレーション等の後に採用される最終マッピングの状態を決定するために適用される。実際上２つ以上のスタック・オペランドがジャバ・バイトコードの実行に先立ってレジスタの集合にローディングされる必要があるならば、多重マッピング状態の翻訳が起こり、各々スタック・オペランドをレジスタの集合のレジスタの１つにローディングする関連するＡＲＭ命令を備える。異なる実施例において、複数のスタック・オペランドを単一の状態移行でローディングし、したがって、マッピング状態の変化をこれらの表２に例示されたものを超えるものとすることが可能である。
0004938187.tif 000003
【００３８】
表２から分かるとおり、スタック・オペランドを蓄積するレジスタの集合にローディングされる新しいスタック・オペランドは、スタック・オペランドの新しい先頭を形成し、これは最初の状態に依存して、レジスタの集合内の特定のレジスタにローディングされる。
【００３９】
表３は、同様に、初期状態、空要求値、最終状態、および対象のジャバ・バイトコードの空要求値が、ジャバ・バイトコードが実行される前に、初期状態が得られることが必要であることを指示する時、初期状態と最終状態との間で動くようレジスタの集合の中でレジスタを空とする関連するＡＲＭ命令の間の関係を例示する。アドレス可能メモリにＡＴＲ命令と一緒に蓄積される特定のレジスタ値は、どのレジスタがスタック・オペランドの現在の先頭であるかに依存して変化する。
0004938187.tif 000004
【００４０】
前述のシステムの例において、充満要求および空要求状態は相互に排他的であり、そのため、充満要求または空要求状態の一方のみが、命令翻訳部が翻訳を試みている対象のジャバ・バイトコードについていつの時も真である。命令翻訳部１０８によって、ハードウェア命令翻訳部１０８でサポートするよう選択される命令と一緒に用いられる命令テンプレートは、この相互に排他的な要求に合致されるように選択される。この要求が適切でないならば、対象のジャバ・バイトコードが複数の入力スタック・オペランドがレジスタの集合の中に存在するように要求し、ジャバ・バイトコードが実行結果を要求されるレジスタ内に保持すべきとしたことを表す命令の実行の後、充分な空レシスターが利用可能とはなっていないという状態が生じ得る。
【００４１】
所定のジャバ・バイトコードは、消費されるスタック・オペランドの数とそのジャバ・バイトコードの実行に際して生成されるスタック・オペランドの数との間の差を表す、全体ネット・スタック・アクション（ｏｖｅｒａｌｌ  ｎｅｔ  ｓｔａｃｋ  ａｃｔｉｏｎ）を有するということが理解される。消費されるスタック・オペランドの数は、実行に先立っての要件であり、また生成されるスタック・オペランドの数は、実行後の要件であるので、例え、ネット全体アクションがそれ自体合致していても、各ジャバ・バイトコードと関連する充満要求および空要求値は、バイトコードの実行に先立って満足されなければならない。表４は、初期状態、全体スタック・アクション、最終状態およびレジスタ使用における変化と、スタック・オペランドの先頭（ＴＯＳ）の相対位置の間の関係を例示する。表２または表３に例示される１つ以上の状態移行は、ジャバ・バイトコードの充満要求および空要求値に依存する所定のジャバ・バイトコードについて前提条件を確立するために表４に例示される状態移行を実行する前に、実行される必要がある。
0004938187.tif 000005
0004938187.tif 000006
【００４２】
表２、表３および表４に例示される状態および条件の間の関係は、単一の状態移行表または状態図に組み合すことができるが、それらは、明確化のため前記では別々に示されている。
【００４３】
異なる状態、条件およびネット・アクションの間の関係は、命令翻訳部１０８のオペレーションのこの観点を制御するためにハードウェア状態機械（有限状態機械の形状にある）を定義するのに用いられる。代わりに、これらの関係は、ソフトウェアまたはハードウェアとソフトウェアの組み合わせによってモデル化することができる。
【００４４】
可能なジャバ・バイトコードの部分集合の例が以下に続き、その部分集合の各ジャバ・バイトコードについて、表２、表３および表４と関係して用いられるそのバイトコードについての関連する充満要求、空要求およびスタック・アクション値を指示している。
0004938187.tif 000007
0004938187.tif 000008
【００４５】
前述のジャバ・バイトコード命令の各々についての命令テンプレートの例もまた以下に続く。示される命令は、ジャバ・バイトコードの各々の要求される振る舞いを実行するＡＲＭ命令である。レジスタ・フィールド「ＴＯＳ−３」，「ＴＯＳ−２」，「ＴＯＳ−１」，「ＴＯＳ」，「ＴＯＳ＋１」および「ＴＯＳ＋２」は、現在採用されているマッピング状態に基づいて、表１から読み取られるような適切なレジスタ記述子（ｓｐｅｃｉｆｉｅｒ）と置き換えられる。記号「ＴＯＳ＋ｎ」は、スタック・オペランドの先頭を蓄積するレジスタから始まって、レジスタの集合の終わりに到達するまでレジスタ値の上に向かってカウントし、終点でレジスタの集合の最初のレジスタに戻されるように、スタック・オペランドの先頭を現在蓄積するレジスタの上方、Ｎ番目のレジスタを指示する。
0004938187.tif 000009
【００４６】
前述の技術に従ってハードウェア翻訳ユニット１０８によって実行される単一ジャバ・バイトコードの実行シーケンスの一例が、以下に例示される。その実行シーケンスは、実行される命令に依存する状態のシーケンスを通して進行する初期状態について示され、各状態の翻訳で行われる実行の結果として、ＡＲＭ命令のシーケンスを生成し、全体としてジャバ・バイトコードをＡＲＭ命令のシーケンスに翻訳する効果を有する。
0004938187.tif 000010
【００４７】
図６は、いくつかの更なるジャバ・バイトコード命令の実行を異なる方法で例示する。図６の先頭の部分はＡＲＭ命令のシーケンスおよびｉａｄｄジャバ・バイトコード命令の実行に際して生じるマッピング状態とレジスタ内容の変化を例示する。最初のマッピング状態は、レジスタ集合内の全てのレジスタは空であることに対応して、０００００である。生成された最初の２つのＡＲＭ命令は、２つのスタック・オペランドを、スタック・オペランドを蓄積するレジスタにＰＯＰし、かつスタックの先頭の「ＴＯＳ」レジスタをＲ０とするよう働く。第３のＡＲＭ命令は、実質的な追加のオペレーションを行い、その結果をレジスタＲ３（今スタック・オペランドの先頭になっている）に書き込み、その一方、レジスタＲ１内に以前保有されていたスタック・オペランドを消費し、そうして−１なる全体のスタック・アクションを生み出す。
【００４８】
そして処理は、それぞれが２つのスタック・オペランドのロング・ロードを表す２つのジャバ・バイトコードの実行に進む。第１のジャバ・バイトコードに対する２なる空要求状態は直ちに満足され２つのＡＲＭ  ＬＤＲ命令が発行され実行される。第１のロング・ロード・ジャバ・バイトコードの実行の後のマッピング状態は０１１０１である。この状態でレジスタの集合は単一の空のレジスタのみを含む。次のジャバ・バイトコードのロング・ロード命令は満足されていない２つの空要求値を有しており、従って要求される第１のアクションは、スタック・オペランドの、ＡＲＭ  ＳＴＲ命令を用いるアドレス可能メモリへのＰＵＳＨである。このことによって、２つの次のＬＤＲ命令の一部としてロードされる新しいスタック・オペランドによって使用されるようにレジスタの集合内のレジスタを解放する。前述されたとおり、命令の翻訳は、ハードウェア、ソフトウェアまたはその２つの組み合わせによって達成される。以下に与えられているのが、前述された技術に従って生成される一例のソフトウェア・インタープリタのサブセプションである。
0004938187.tif 000011
0004938187.tif 000012
0004938187.tif 000013
0004938187.tif 000014
【００４９】
図７は、スタック・ポジションの先頭から始まるデータの２つのワードによって特定されるデータ・アレイ内からのデータの２つのワードを読む機能を有するジャバ・バイトロード命令「ラロード（ｌａｌｏａｄ）」を例示する。そしてそのデータ例から読み取られる２つのワードは、それらの位置を特定する２つのワードを置き換えて一番上のスタック・エントリーを形成する。
【００５０】
「ラロード」命令が、データアレイ内のポジションとアレイを特定する入力スタック・オペランドを書き換えることなく、アレイからフェッチされたスタック・オペランドの一時的な蓄積のための十分なレジスタ・スペースを有するためには、ジャバ・バイトロード命令は、２つの空要求値を有するように設定され、すなわちスタック・オペランドの蓄積に専用とされるレジスタ・バンク内の２つのレジスタが、「ラロード」命令をエミュレートするＡＲＭ命令の実行に先立って、空にされなければならない。このジャバ・バイトコードに遭遇したとき、２つの空のレジスタがなければ、蓄積オペレーション（ＳＴＲｓ）が実行され、レジスタ内に現在保持されるスタック・オペランドをメモリにＰＵＳＨして、命令のための空要求値に必要であり、それを満足する一次蓄積のためのスペースを作る。
【００５１】
命令はまた、データのポジションがアレイの位置とアレイ内のインデックスによって２つの別々のスタック・オペランドとして特定されるとき、充満要求として２の値を有する。図は、すでに充満要求および空要求条件を満たし、かつ「０１００１」なるマッピング状態を有するものとして第１の状態を例示する。「ラロード」命令は、３つのＡＲＭ命令に細分化される。これらの内最初のものは、アレイの基準をスタック・オペランドのレジスタ・キャッシュとして動作するレジスタ集合の外の予備の作動レジスタにロードする。そして第２の命令は、このアレイの基準をアレイ内のインデックス値と関係付けて用い、スタック・オペランドの蓄積に専用とされた、空のレジスタの１つに書き込まれる第１のアレイ・ワードにアクセスする。
【００５２】
最初の２つのＡＲＭ命令を実行した後、システムのマッピング状態は変わっておらず、スタック・ポインタの先頭はスタートした所に留まっており、空として特定されたレジスタもそのままであることに注意することが重要である。
【００５３】
ＡＲＭ命令のシーケンス内の最後の命令は、第２アレイのワードを、スタック・オペランドを蓄積するためのレジスタ集合にロードする。これは最後の命令であるので、その間にインタラプトが発生したら、それは命令の完了後まで処理されず、これにより、スタック・オペランドを蓄積するレジスタのマッピング状態への変化によって、この命令で入力状態を変えるのを安全に行える。この例において、マッピング状態は「０１０１１」へと変化し、それはスタック・ポインタの新しい先頭を第２のアレイ・ワードに配置して、アレイ基準の入力変数およびインデックス値が今空のレジスタであることを示し、レジスタを空にすることはそれらが保持していた値をスタックから取り除くことに等しいことである。
【００５４】
「ラロード（ｌａｌｏａｄ）」命令の全体のスタック・アクションが、レジスタ内に保持されるスタック・オペランドの数を変えないにもかかわらず、マッピング状態スワップが生じることが認められる。最後のオペレーションの実行に際して行われるマッピング状態の変化は、翻訳されるジャバ・バイトコードの機能として命令翻訳部にハードウェアとして組み込まれており、また「ラロード」命令の特性として示される「スワップ」パラメータにより指示されている。
【００５５】
この図面の例は、１つの特定の命令ではあるが、設定された原理が、ＡＲＭ命令または他の種類の命令としてエミュレートされる、多くの異なるジャバ・バイトコード命令に拡大得るということが理解される。
【００５６】
図８は、前述の技術を概略的に例示するフロー・チャートである。ステップ１０で、ジャバ・バイトコードがメモリからフェッチされる。ステップ１２で、そのジャバ・バイトコードについての充満要求および空要求値が検査される。空要求または充満要求条件のいずれかが満足されないならば、スタック・オペランド（可能ならば複数のスタック・オペランド）のそれぞれのＰＵＳＨおよびＰＯＰオペレーションが、ステップ１４およびステップ１６で行われる。この特定のシステムでは、空要求および充満要求条件が同時に満たされないということはあり得ないことに注意すること。ステップ１４およびステップ１６を経る多重パスが、ステップ１２の条件が満たされるまで要求される。
【００５７】
ステップ１８で、関係するジャバ・バイトコードのための翻訳テンプレート内で特定される第１のＡＲＭ命令が選択される。ステップ２０で、選択されたＡＲＭ命令が、ステップ１０でフェッチされたジャバ・バイトコードのエミュレーションにおいて実行されるべき最後の命令であるかどうかについてチェックが行われる。実行されているＡＲＭ命令が最後の命令であるならば、ステップ２１は、実行される命令のシーケンスにおいて、次のジャバ・バイトコードを示すべくプログラム・カウンタ値を更新するよう働く。ＡＲＭ命令が最後の命令であるならば、インタラプトが今生じているか否かにかかわらず、それは実行を完了し、したがって、システムの状態がノーマルであり、インタラプトされておらず、ジャバ・バイトコードの完全な実行に到達するよう、プログラム・カウンタ値を次のジャバ・バイトコードに更新し、その点から実行を再開することを安全に行える。ステップ２０でのテストが、最後のバイトコードが到達されていないということを指示するならば、プログラム・カウンタ値の更新がバイパスされる。
【００５８】
ステップ２２は、現在のＡＲＭ命令を実行する。ステップ２４では、テンプレートの一部として実行を要求するＡＲＭ命令が更にあるのかどうかについてテストが行われる。更なるＡＲＭ命令があるならば、ステップ２６でこれらの次のものが選択され、処理はステップ２０にリターンする。更なる命令がないならば、処理はステップ２８に進み、対応するジャバ・バイトコードに特化されたマッピング・チェンジ／スワップが実行され、スタック位置の所望の先頭およびスタック・オペランドを保持する種々のレジスタの充満／空状態を反映させられる。
【００５９】
図８はまた、インタラプトが要求されている時、インタープラトが処理され、インタラプトの後、処理が再開される時点を概略的に例示する。バイトコード・シーケンスを有するリターン・ポイントとして蓄積される現在のプログラム・カウンタ値が何であれ、ステップ２２で現在進行中のＡＲＭ命令を実行した後に、インタラプトが処理され始める。実行中の現在のＡＲＭ命令が、テンプレート・シーケンス内の最後の命令であるならば、ステップ２１は、単にプログラム・カウンタ値を更新し、結果として次のジャバ・バイトコードを示すことになる（または、ＡＲＭ命令であり、命令カットのスイッチは初期化されていなければならない）。現在実行されているＡＲＭ命令が、シーケンスにおける最後の命令以外のものであるならば、プログラム・カウンタ値は、対応するジャバ・バイトコードの実行の開始時に示されていたものと同じであり、したがって、リターンが行われるとき、ジャバ・バイトコードの全体が再実行される。
【００６０】
図９は、ジャバ・バイトコードのストリームを受信し、翻訳されたＡＲＭ命令（または対応する制御信号）のストリームを出力して、プロセッサ・コアの実行を制御するジャバ・バイトコード翻訳ユニット６８を例示する。先に記述されたとおり、ジャバ・バイトコード翻訳部６８は、命令テンプレートを用いて単純なジャバ・バイトコードをＡＲＭ命令またはＡＲＭ命令のシーケンスに翻訳する。各ジャバ・バイトコードが実行されたとき、スケジューリング制御ロジック７０内のカウンタ値が減少する。このカウンタ値が０に到達するとき、ジャバ・バイトコード翻訳ユニット６８は、スレッドまたはタスク間のスケジューリングを適当なものに管理する、スケジューリング・コードに分枝するＡＲＭ命令を発する。
【００６１】
単純なジャバ・バイトコードが、これらのバイトコードを高速ハードウェアにより実行する、ジャバ・バイトコード翻訳ユニット６８自体によって取り扱われる一方で、更に複雑な処理オペレーションを必要とするバイトコードは、解釈ルーティン（そのようなルーティンの選択例はこの明細書の前の方に与えられている）の集合の形状で提供されるソフトウェア・インタープリタに送られる。更に詳しくは、ジャバ・バイトコード翻訳ユニット６８は、受信したバイトコードが、ハードウェア翻訳によってサポートされるものではなく、したがって、そのバイトコードを解釈するソフトウェア・ルーティンが見出されるまたは参照される、そのジャバ・バイトコードに依存するアドレスに分枝するものであることを決定することができる。この機構はまた、スケジューリング・ロジック７０が、スケジューリング・オペレーションがスケジューリング・コードへの分枝を生成することが必要であるということを指示するときにも使用できる。
【００６２】
図１０は、図９の実施例のオペレーションをより詳細に例示し、また、ハードウェアとソフトウェアとの間でのタスクの分離を例示する。全てのジャバ・バイトコードは、ジャバ・バイトコード翻訳ユニット６８で受信され、ステップ７２でカウンタを減少させるものとする。ステップ７４で、カウンタ値が０に到達したかどうかについてチェックが行われる。カウンタ値が０に到達しているなら（システムにハードウェアで組み込んだ所定の値、またはユーザが制御／プログラムした値かからカウントダウンされる）、ステップ７６でスケジューリング・コードに分枝がなされる。ステップ７６で、一旦スケジューリング・コードが完了するならば、制御がハードウェアに戻され、処理がステップ７２に進行し、ここで次のジャバ・バイトコードがフェッチされて、カウンタが再度減少される。カウンタが０に到達していたので、ここでそれは新しい０ではない値に廻り込む。その代わりに、ステップ７６でのスケジューリング・プロセスの存在の一部としてカウンタに新しい値が強制的に持ち込まれてもよい。
【００６３】
ステップ７４でのテストが、カウンタが０ではないということを示すと、ステップ７８でジャバ・バイトコードがフェッチされる。ステップ８０では、フェッチされたバイトコードが、ステップ８２でハードウェア翻訳によって実行される単純バイトコードであるか、あるいは、より複雑な処理を必要とし、したがって、ステップ８４でのソフトウェア解釈のために送出されるべきかについて決定がなされる。処理がソフトウェアの解釈に送出され、これが完了すると、制御はハードウェアに戻され、ステップ７２で、次のジャバ・バイトコードをフェッチするために、再度カウンタを減少させる。
【００６４】
図１１は、他の制御装置を例示する。ステップ８６での処理の開始において、命令信号（スケジューリング信号）が非有効（ｄｅａｓｓｅｒｔ）とされる。ステップ８８で、フェッチされたジャバ・バイトコードが検査されて、それが、ハードウェア翻訳がサポートする単純バイトコードであるかどうか見られる。ハードウェア翻訳がサポートしていないならば、ステップ９０で、制御が解釈ソフトウェアへと送出され、ＡＲＭ命令ルーティンを実行してジャバ・バイトコードを解釈する。バイトコードが、ハードウェア翻訳がサポートする単純なものであれば、処理はステップ９２へと進行し、マルチサイクル有限状態機械の形式で作動するジャバ・バイトコード翻訳ユニット６８により１つ以上のＡＲＭ命令がシーケンスで発行される。ステップ９０かまたはステップ９２かでジャバ・バイトコードが適切に実行されたならば、処理はステップ９４に進み、そこで命令信号は、ステップ８６で非有効とされるのに先立って、短期間有効（ａｓｓｅｒｔ）とされる。命令信号の有効表示は、外部回路に、解釈されたまたは翻訳された命令の部分的な実行により起るデータの完全性損失の危険を犯すことなく、タイマーをベースとするインタラプトのスケジューリングを行なうことができる、適切な安全ポイントに到達したことを示す。
【００６５】
図１２は、図１１において生成される命令信号の応答に用いられる回路例を例示する。タイマー９６は、所定の期間満了の後、タイマー信号を周期的に生成する。このタイマー信号は、クリア・タイマー・インタラプト信号によってそれがクリアされるまでラッチ９８内に蓄積される。ラッチ９８の出力は、ＡＮＤゲート１００によって、ステップ９４で有効とされた命令信号と論理的に結合される。ラッチがセットされ、命令信号が有効とされるとき、ＡＮＤゲート１００の出力としてインタラプトが生成され、インターラプトのトリガーとなる。これは、標準インタラプト処理のためシステム内に設けられているインタラプト処理機構を用いる、スケジューリング・オペレーションを実行する。インタラプト信号が生成されると、これは続いて、次回のタイマ出力パルスが生じるまでラッチ９８をクリアするクリア・タイマー・インタラプト信号の生成のきっかけとなる。
【００６６】
図１３は、図１２の回路のオペレーションを例示する信号図である。プロセッサ・コア・クロック信号は、規則的な周波数で生じる。タイマー９６は、所定の周期でタイマー信号を生成し、安全であるときにスケジューリング・オペレーションが開始されるべきであることを指示する。タイマー信号は、ラッチされる。命令信号は、特定のジャバ・バイトコードがいかに迅速に実行されるかに依存する不定な時間間隔で生成される。単純ジャバ・バイトコードは、単一のまたはより典型的には、２または３のプロセッサ・コア・クロック・サイクルで実行され、高レベルのマネージメント型機能を提供する複雑なジャバ・バイトコードは、ソフトウェア・インタープリタによって実行が完了されるまでに数百のプロセッサ・クロック・サイクルを取る。いずれの場合においても、保留されている有効とされたラッチ・タイマー信号は、スケジューリング・オペレーションが開始するのが安全であることを指示する命令信号が発せられるまで、スケジューリング・オペレーションのきっかけとなるよう作動しない。ラッチ・タイマー信号と命令信号が同時に生じることで、インタラプト信号が生成するきっかけとなり、その直後にラッチ９８をクリアにするクリア信号が続く。
【００６７】
図１８は、ネイティブな命令へのリターン１０４で終結される第１のサブルーチン１０２の規定を例示する。この非ネイティブなサブルーチン１０２は、処理を非ネイティブなサブルーチン１０２のスタートに送るリンク命令を備えるＡＲＭブランチを用いて、ネイティブな呼び出しプログラム１０６からコールされるようデザインされている。非ネイティブなサブルーチン１０２はまた、ネイティブな命令へのリターン１０４ではなく、非ネイティブな命令へのリターン１１０によって終結すること以外、同じ機能を生み出す第２の形態１０８に備えられる。この第２の非ネイティブなサブルーチンは、非ネイティブな呼び出しプログラム１１２からコールされるようにデザインされている。
【００６８】
ネイティブな命令への明示的なリターン１０４および非ネイティブな命令へのリターン１１０は、各サブルーチン１０２、１０８の終わりで、呼び出しプログラムがネイティブであったか非ネイティブであったかを能動的に決定する必要を無くし、それによって、最後での更なる処理オペレーションを避けることによって全体のサブルーチンの実行を早める。図１８の配列は、メモリリソースを消費する２つの非ネイティブなサブルーチン１０２および１０８を設ける必要があるという不利な点を有する。
【００６９】
図１９は、図１８のシステムの改良を例示する。図１９において、ベニヤ用の非ネイティブなサブルーチン１１４が、ネイティブな呼び出しプログラムと非ネイティブなサブルーチンとの間に備えられる。非ネイティブなサブルーチンの終わりで、非ネイティブな命令へのリターンが常に実行され、処理を非ネイティブな呼び出しプログラムにリターンするか非ネイティブなベニヤ・サブルーチンにリターンするかは、どこからそれがコールされたかに依存している。共通の非ネイティブなサブルーチンの規定は、メモリ・スペースを節約する。非ネイティブなベニヤ・サブルーチンの機能は、リターン・コールを非ネイティブなサブルーチンから受信し、そして制御をネイティブな命令へのリターンの実行を介して、ネイティブな呼び出しプログラムへと送り戻す。したがって、非ネイティブなベニヤ・サブルーチンは、小さくすることができる。
【００７０】
すでに小さなベニヤの非ネイティブなサブルーチン１１４によって消費されるメモリリソースを低減するために、これらは、要求された時ネイティブな呼び出しプログラム内の命令１１６によって動的に作り出される。非ネイティブなベニヤ・サブルーチンは、ネイティブな呼び出しモードのスタック・メモリにおいて便宜的に作り出される。スタック・メモリ領域は、既にシステム内に提供されている。更には、スタック装置を使用することで、ベニヤ用の非ネイティブなサブルーチンがお互いの中にネストされることが可能であり、またネストされたものは、リターンがなされるときに適切に巻戻される。
【００７１】
図２０は、図１９に例示されるデータ処理オペレーションを行うデータ処理システム１１８を概略的に示す。データ処理システムには、プロセッサ・コア１２０、ハードウェアによる命令翻訳部１２２およびメイン・メモリ１２４が含まれる。オペレーションにおいて、命令翻訳部１２２は、単純ジャバ・バイトコードのためのＡＲＭ命令にジャバ・バイトコードのハードウェア翻訳を提供し、より複雑なジャバ・バイトコードは、ソフトウェア・インタープリタ（図示されていない）を用いて翻訳される。メイン・メモリ１２４内で、ネイティブな命令プログラム１２６が実行される。非ネイティブなサブルーチンへのサブルーチン・コールの直前に、ベニヤ用の非ネイティブなサブルーチンが、ネイティブなスタック・ポインタによって示されるメイン・メモリ１２４のスタック・メモリ部分に作られる。ベニヤ用の非ネイティブなサブルーチンが作られた後、それは、ネイティブなブランチ命令ＢＬ＜ｖｅｎｅｅｒ＞によって分岐する。そして、ベニヤ用の非ネイティブなサブルーチンは、その望ましいデータ処理機能を行う非ネイティブなサブルーチン１２８をコールする。非ネイティブなサブルーチン１２８の終わりに、非ネイティブな命令へのリターンが実行され、処理をスタック・メモリ領域内のベニヤ用の非ネイティブなサブルーチンにリターンする。ベニヤ用の非ネイティブなサブルーチンの終わりに、ネイティブな命令へのリターンが実行され、処理を最終的にネイティブなコード１２６にリターンする。
【００７２】
図２１は、前述のオペレーションを例示するフロー・チャートである。ステップ１３０でネイティブな命令コードが実行されている。ステップ１３２で、データ処理システムのネイティブなスタック・メモリにおいて非ネイティブなベニヤ・サブルーチンが作られる。ステップ１３４で、ステップ１３２で作られた非ネイティブなベニヤ用のサブルーチンにブランチが作られる。ステップ１３６で、ベニヤ・非ネイティブなサブルーチンが、今度はメイン・非ネイティブなサブルーチンへのブランチを発する。ステップ１３８で、メインの非ネイティブなサブルーチンが実行されて、要求されるメイン・データ処理機能を達成する。ステップ１４０で、非ネイティブな命令へのリターンがメインの非ネイティブなサブルーチンの終わりに実行され、それによって制御を非ネイティブなベニヤ・サブルーチンにリターンする。ステップ１４２で、非ネイティブなベニヤ・サブルーチンは、制御をステップ１３０によって既に実行されたものの直後に続くコードに送り戻すネイティブな命令へのリターンで終端する。
【００７３】
ここで、発明の例示的な実施例が、添付図面を参照して詳細に記述されているが、発明は、これらの実施例に正確に限定されるものではなく、請求項によって定義される発明の範囲および精神から逸脱することなく、当業者によって種々の変更および修正が成し遂げられることが理解されるべきである。
【図面の簡単な説明】
【図１】命令パイプラインの配置例を概略的に表す。
【図２】命令パイプラインの配置例を概略的に表す。
【図３】フェッチ・ステージの配置をより詳細に例示する。
【図４】フェッチ・ステージ内の緩衝された命令ワード内からの、様々な長さの非ネイティブな命令の読み取りを概略的に例示する。
【図５】プロセッサ・コアのネイティブな命令と翻訳を要する命令の双方を実行するデータ処理システムを概略的に例示する。
【図６】命令および状態の例のシーケンスについて、スタック・オペランドの蓄積のために用いられるレジスタの内容、マッピング状態および翻訳を要する命令と、ネイティブな命令との間の関係を概略的に例示する。
【図７】ネイティブな命令のシーケンスとして非ネイティブな命令の実行を概略的に例示する。
【図８】命令翻訳部が、翻訳された命令のためにインタラプト待ち時間を保持するように作動する方法を例示するフロー・チャートである。
【図９】ハードウェアおよびソフトウェア技術を用いてＡＲＭ操作符号へとジャバ・バイトコードの翻訳を概略的に例示する。
【図１０】ハードウェアをベースとする翻訳部、ソフトウェアをベースとするインタープリタおよびソフトウェアをベースとするスケジューリング間の制御の流れを概略的に例示する。
【図１１】タイマーをベースとするアプローチを用いて、スケジューリング・オペレーションを制御する別の方法を例示する。
【図１２】タイマーをベースとするアプローチを用いて、スケジューリング・オペレーションを制御する別の方法を例示する。
【図１３】図１２の回路のオペレーションを制御する信号を例示する信号図である。
【図１４】呼び出しプログラムとネイティブおよび非ネイティブなプログラムにおけるサブルーチンとの間でコールを行う周知技術を概略的に例示する。
【図１５】呼び出しプログラムとネイティブおよび非ネイティブなプログラムにおけるサブルーチンとの間でコールを行う周知技術を概略的に例示する。
【図１６】呼び出しプログラムとネイティブおよび非ネイティブなプログラムにおけるサブルーチンとの間でコールを行う周知技術を概略的に例示する。
【図１７】呼び出しプログラムとネイティブおよび非ネイティブなプログラムにおけるサブルーチンとの間でコールを行う周知技術を概略的に例示する。
【図１８】ネイティブなコードか非ネイティブなコードかに明示的にリターンするサブルーチン・リターン命令を提供する第１の実施例を概略的に例示する。
【図１９】ネイティブな呼び出しプログラムと非ネイティブなサブルーチンとの間での非ネイティブなベニヤ・サブルーチンの使用を概略的に例示する。
【図２０】図１９で用いられるような非ネイティブなベニヤ・サブルーチンを動的に作り出すデータ処理システムを概略的に例示する。
【図２１】図２０のシステムにおいて行われる処理を概略的に例示するフロー・チャートである。
【符号の説明】
３０  命令パイプライン
３２  フェッチ・ステージ
３４  ネイティブな命令デコード・ステージ
３６，５２  実行ステージ
３８  メモリ・アクセス・ステージ
４０  ライト・バック・ステージ
４２  命令翻訳ステージ
４４  命令パイプライン
４６，４８  ネイティブな命令デコーダ
５０  非ネイティブな命令デコーダ
５４  メモリ・ステージ
５６  ライト・バック・ステージ
５８  フェッチ・ステージ
６０  フェッチング・ロジック
６２  命令ワード・バッファ
６４  命令翻訳部
６８  ジャバ・バイトコード翻訳ユニット
７０  スケジューリング制御ロジック
９６  タイマー
９８  ラッチ
１００  ＡＮＤゲート
１０２  データ処理システム
１０４，１２０  プロセッサ・コア
１０６  レジスタ・バンク
１２２  ハードウェア命令翻訳部
１２４  メイン・メモリ
【図１】
0004938187.tif 000015
【図２】
0004938187.tif 000016
【図３】
0004938187.tif 000017
【図４】
0004938187.tif 000018
【図５】
0004938187.tif 000019
【図６】
0004938187.tif 000020
【図７】
0004938187.tif 000021
【図８】
0004938187.tif 000022
【図９】
0004938187.tif 000023
【図１０】
0004938187.tif 000024
【図１１】
0004938187.tif 000025
【図１２】
0004938187.tif 000026
【図１３】
0004938187.tif 000027
【図１４】
0004938187.tif 000028
【図１５】
0004938187.tif 000029
【図１６】
0004938187.tif 000030
【図１７】
0004938187.tif 000031
【図１８】
0004938187.tif 000032
【図１９】
0004938187.tif 000033
【図２０】
0004938187.tif 000034
【図２１】
0004938187.tif 000035