(57)【特許請求の範囲】
【請求項１】
メモリーと；
ネイティブ命令セットを持つプロセッサコアと；
前記ネイティブ命令セットに属するネイティブ命令を、前記メモリーから前記プロセッサコアへ送って実行させるべく構成された、前記メモリーと前記プロセッサコアとの間のインターフェースとを具えて、
前記インターフェースが、前記メモリーからバーチャルマシン命令を読出して前記ネイティブ命令セットに属する被変換命令に変換し、前記被変換命令を前記プロセッサコアに供給して連続的に実行させるプリプロセッサを具えているデータ処理装置において、
前記プリプロセッサが、特別な型の他のバーチャルマシン命令を前記メモリーから読出し、前記特別な型のために予め定められたターゲットアドレスを検索し、前記他のバーチャルマシン命令に応答して、前記プロセッサコアに、前記メモリー中の前記ターゲットアドレスによって表示される位置にロードされた前記ネイティブ命令のサブルーチンを実行させるべく構成されていることを特徴とするデータ処理装置。
【請求項２】
前記プリプロセッサが、前記プロセッサコアを監視して前記サブルーチンの完了を検出し、完了の検出時に、前記プロセッサへの命令の供給を再開することを特徴とする請求項１に記載のデータ処理装置。
【請求項３】
前記プリプロセッサが、前記プロセッサコアによって発行された命令アドレスが予め定められた範囲内にあるか否か、及び前記サブルーチンの命令アドレス範囲が前記予め定められた範囲の外側にあるか否かを監視して、前記プロセッサコアが前記サブルーチンに制御を渡した後に前記予め定められた範囲内の命令アドレスを発行した時に、前記プリプロセッサが前記サブルーチンの完了を検出することを特徴とする請求項２に記載のデータ処理装置。
【請求項４】
前記プリプロセッサが、前記他のバーチャル命令に応答して、前記プロセッサコアに予備ネイティブ命令を供給してサブルーチン呼出しコンテクストを生成させ、これに続いて、前記プロセッサコアにネイティブ命令を発行して前記サブルーチンに制御を渡させることを特徴とする請求項１に記載のデータ処理装置。
【請求項５】
前記バーチャルマシン命令が、第１アーギュメント格納コンベンションによって定められた格納位置に格納されたアーギュメントを用い、前記サブルーチン呼出しコンテクストが、第２アーギュメント格納コンベンションによって予め定められた格納位置に格納された一つ以上の前記サブルーチンのアーギュメントを含み、前記第１アーギュメント格納コンベンションと前記第２アーギュメント格納コンベンションとが互いに異なる格納位置にあり、前記予備ネイティブ命令が、前記第１アーギュメント格納コンベンションに従った位置にあるオペランドを前記第２アーギュメント格納コンベンションに従った位置に移動させる命令を含むことを特徴とする請求項４に記載のデータ処理装置。
【請求項６】
前記プロセッサコア、前記インターフェース、及び前記メモリー用の接続線を具えた、請求項１に記載のデータ処理装置用のデータ処理回路。
【請求項７】
プロセッサを具えたデータ処理装置であって、前記プロセッサが第１命令を含む命令セットを有し、前記第１命令の各々が、当該命令に直接連続する前記命令セットからの命令が実行される前に、それぞれのオペレーションを前記プロセッサに実行させて、前記それぞれのオペレーションが、第１アーギュメント格納コンベンションによって予め定められた格納位置に格納された一つ以上のアーギュメントを用いるデータ処理装置において、
前記命令セットが、前記プロセッサにサブルーチンへのジャンプをさせる特別命令も含み、前記サブルーチンが、第２アーギュメント格納コンベンションによって予め定められた格納位置に格納された一つ以上のアーギュメントを用い、前記プロセッサが、前記特別命令に応答して、一つ以上のアーギュメントを、前記第１アーギュメント格納コンベンションによって予め定められた格納位置から前記第２アーギュメント格納コンベンションによって予め定められた格納位置に転送することを特徴とするデータ処理装置。
【請求項８】
前記プロセッサが、前記特別命令に応答して、前記サブルーチンのアドレスを予め定められた位置から読出し、一つ以上のアーギュメントを転送した後に、前記アドレスに制御を渡すことを特徴とする請求項７に記載のデータ処理装置。
【発明の詳細な説明】
本発明は請求項１の前段部分に記載したようなデータ処理装置に関する。
そのような処理装置は、本願と同一発明者による、同一譲受人に譲渡された未公開の欧州特許出願第97203033.2号(PHN16542)から既知である。この特許出願は参考文献として本明細書に含める。
通常、プロセッサコアは、ネイティブ命令セットのみからの命令を実行する機能を有する。種々の理由により、そのようなプロセッサコアが、このネイティブ命令セット以外の命令セットで表現されたプログラムを処理できることが望まれる。このような方法によれば、標準プロセッサコアを、ハードウェアの変更なしに、例えば、種々のプロセッサコア、例えばＪａｖａ（商標）命令を実行するためのコアによる処理をエミュレートするために用いることができる。プロセッサが実行することができる命令からなるネイティブ命令セットではなく、プログラムを記述するための前記のような他の命令セットは、バーチャル（仮想）マシン命令セットと呼ばれる。
一般的に、バーチャルマシン命令セットからの命令の処理は、プロセッサコアによって実行されるインタープリタプログラムによって実現される。これは、米国特許第4,443,865号によって例示されている。各バーチャルマシン命令について、インタープリタプログラムが、ネイティブ命令によって表現された対応する実行プログラムを含む。インタープリタにより、プロセッサコアがバーチャルマシン命令をメモリーから読出し、バーチャルマシン命令のための実行プログラムのアドレスを選択し、プロセッサコアの制御をその実行プログラムに渡す。インタープリタによるそのような処理は、実行プログラムの機能的タスクを遂行するために必要とするサイクルに加えて、プロセッサコアが実行プログラムのアドレスの選択及び制御の引渡しの処理サイクルを必要とするため、直接実行に比較して本質的に低速である。
欧州特許出願第97203033.2号は、バーチャルマシン命令セットで表現されるプログラムを処理する速度を改善している。これは、メモリーとプロセッサコアとの間にプリプロセッサを付加することによって達成されている。プリプロセッサは、各特定のバーチャルマシン命令毎に、その特定のマシン命令の機能を表す１つ以上のネイティブ命令を格納する。プリプロセッサは、メモリーからバーチャルマシン命令を読出し、ネイティブ命令即ちそのバーチャルマシン命令に対して定められた命令を選択し、それらの命令を実行するためにプロセッサコアに供給する。プロセッサコアは、バーチャルマシン命令によって定められた機能を遂行するネイティブ命令を連続的に実行する。それらのネイティブ命令のためのクロックサイクルの間、プロセッサコアが適当なネイティブ命令を選択するために追加的な命令を実行するためのプロセッサコアのクロックサイクルは用いられない。
更に、欧州特許出願第97203033.2号の処理装置は、プリプロセッサによる翻訳なしにメモリーからのネイティブ命令を実行することができる。これは、プロセッサコアによって発行される命令アドレスに基づいて行われる。プリプロセッサは、プロセッサコアによって発行される命令アドレスが予め定められた範囲にある時のみ、翻訳されたネイティブ命令を供給する。さもなければ、アドレスされた位置のメモリーの内容をプロセッサコアに供給する。
プリプロセッサによるバーチャルマシン命令の翻訳は、概ね満足なものであるが、バーチャルマシン命令の意味の定義の柔軟性を低下させること、及び、いくつかのバーチャルマシン命令が、プリプロセッサの中で多量のメモリーを必要とすることが見出されている。
本発明の目的は、メモリーとプロセッサコアとの間にプリプロセッサを具えるデータ処理装置を、更に柔軟性に富んだものとすることにある。
本発明によるデータ処理装置は、請求項１の特徴部分の記載によって特徴付けられる。即ち、選択されたバーチャルマシン命令（他のバーチャルマシン命令）に応答して、通常のようにローカルに格納されたネイティブ命令をプロセッサコアに供給する代わりに、プリプロセッサがプロセッサコアに、メモリーからのネイティブサブルーチンを実行させる。この方法においては、プリプロセッサが翻訳された命令の実行とネイティブサブルーチンの実行とを混合して連続的に実行することにより、バーチャルマシンプログラムを実行する。サブルーチンの呼出しによってバーチャル命令を処理することは、プロセッサコアに代わってプリプロセッサが他のバーチャル命令からネイティブサブルーチン呼出し命令を生成することを除いて、一般的なインタープリタがバーチャル命令を処理する方法と同等である。この方法においては、プロセッサコアの処理サイクルの最小値が失われる。
プリプロセッサは、ネイティブサブルーチンからリターンする（戻る）際に、翻訳されたネイティブ命令のプロセッサコアへの供給を再開する。リターンを検出するために、プリプロセッサは、例えばプロセッサコアによって発行される命令アドレス監視（モニター）することができる。
本発明による処理装置の一つの好適例においては、プリプロセッサが、高級言語からコンパイルされたサブルーチンを呼出すことができるようにする。バーチャルマシン命令は、第１アーギュメント格納コンベンション（規約）によって定められる格納位置に、これらのバーチャルマシン命令のアーギュメント（引数）を見出すことを期待する。高級言語コンパイラは、しばしば、サブルーチンを呼出す時に「コンテクスト」の存在を仮定する。このコンテクストは、通常、スタックポインターレジスタによって指示される多くの予め定められたレジスタ及び／又はメモリー位置のような、特定の予め定められた格納位置に格納されているサブルーチンについてのアーギュメントを含む。これらの格納位置の規定は、第２アーギュメント格納コンベンションによって固定され、第２アーギュメント格納コンベンションは、高級言語における全てのサブルーチンについて一様な方法で格納位置を定める。
一般的に、この第２アーギュメント格納コンベンションは、例えば特定のレジスタをアーギュメントのための位置として定めないので、高級言語で用いられる第１アーギュメント格納コンベンションと異なる。
そのような高級言語からコンパイルされたサブルーチンを用いるために、本発明は、請求項３によるデータ処理装置を提供する。プリプロセッサがプロセッサコアに対してネイティブ命令を発行して、このネイティブ命令によりプロセッサコアがサブルーチンに制御を渡す際には、プロセッサコアが実際にサブルーチンに制御を渡す前に、プリプロセッサはまず、プロセッサコアに、（バーチャルマシン命令のアーギュメントのために用いられる）第１アーギュメント格納コンベンションによって定められた格納位置から第２アーギュメント格納コンベンションによって定められた格納位置にアーギュメントを転送させる。
より一般的には、本発明は請求項７によるデータ処理装置に関する。この装置においては、プロセッサが、一つのアーギュメント格納コンベンションによって格納されたアーギュメントを用いるバーチャルマシン命令のような命令を実行することができる。特別な命令に遭遇すると、プロセッサは、サブルーチンを呼出す前に、他の格納コンベンションによって予め定められた格納位置へアーギュメントを転送することによって応答する。
本発明のこれら及び他の有利な態様は、以下の説明及び図面により、限定されない例示の方法によって説明する。
図１Ａ−Ｄは、処理装置内にプリプロセッサを配置するアーキテクチャの四つの可能な選択肢を示す図である。処理装置の三つの主要部分は、命令メモリー120、プロセッサコア112及びプリプロセッサ130である。プリプロセッサ130は、フェッチユニット134、コンバータ（変換器）132及びフィードユニット136の機能的カスケードである。
図１Ａにおいては、処理装置の主要部分が、ＰＩバスのような汎用周辺装置相互接続バス140を介して相互接続されている。プリプロセッサ130はバス上の周辺装置である。プリプロセッサ130は、メモリーマッピングされた周辺装置として動作することができ、その場合、予め定められた範囲のアドレスが割当てられる。プロセッサコア112が、この範囲内のアドレスを持つ命令の要求（リクエスト）をバス140上に発行したことに応答して、プリプロセッサ130は、バス140上にネイティブ命令を発行する。プリプロセッサ130は、必要な際に、バーチャルマシン命令を命令メモリー120からバス140を介して取込む。
図１Ｂ及び１Ｃにおいては、プリプロセッサ130が、電気的にプロセッサコア112と命令メモリー120との間に位置する。この場合、プリプロセッサ130は、命令メモリー120から入るネイティブ命令とバーチャルマシン命令とを区別する必要がある。従って、これらの構成は、命令メモリー120に格納されたネイティブ命令の実行を遅らせる可能性がある。分かり易くするため、図１Ａに図示された全ての素子を図１Ｂ、１Ｃ及び１Ｄには図示していない。
図１Ｄにおいては、プリプロセッサ130が、プロセッサ110の中に置かれている。プリプロセッサ130は、プロセッサ110の命令キャッシュ116とプロセッサコア112との間に位置することが望ましい。この構成によれば、最適性能が発揮されるが、図１Ａ、１Ｂ及び１Ｃの構成と異なり、プロセッサ110に対する内部変更が必要である。
プロセッサコアは、いわゆる「ネイティブ」（コア特有の）命令の予め定められたセットからのネイティブ命令を実行すべく構成されている。これは、プロセッサコアがメモリーに接続された際に、ネイティブ命令のプログラムを実行するために必要な全てのものを具えていることを意味する。例えば、プロセッサコアは命令及びデータのポートを具え、オペランドを格納するためのレジスタ、命令ポインターレジスタ（プログラムカウンター）、オペランドを処理しプログラムカウンターを修正する（例えばジャンプする）ための機能的要素、データポートを接続するデータパス、レジスタ及び機能的要素、並びに、ネイティブ命令の処理を制御するための命令デコーディング回路、その他を含む。内蔵されたソフトウェアを実行するために適した一つの例は、ＭＩＰＳ PR3001の範囲のマイクロプロセッサで用いられるようなＲＩＳＣ型コアである。
動作中には、命令メモリー120は、スタックマシンのための命令のようなバーチャルマシン命令を格納する。そのようなバーチャルマシン命令の例はＪａｖａバイトコードである。プロセッサコアのネイティブ命令は、バーチャルマシンのバーチャルマシン命令と異なる。プロセッサコア112は、それ自体では、命令メモリー120に格納されたバーチャルマシン命令を直接実行することはできない。プロセッサコア112の命令の要求に応答して、プリプロセッサ130がネイティブ命令を発行する。ネイティブ命令の生成を可能にするため、プリプロセッサ130は、バーチャルマシン命令カウンターを維持する（このカウンターは例えばプリプロセッサ又はプロセッサコア中のレジスタ（図示されていない）内に位置し、この場合、プリプロセッサ130からコア112へ送られる命令によって更新及び／又は読出される）。プリプロセッサ130は、フェッチユニット134を用い、バーチャルマシン命令カウンターによって指示されたアドレスにおいて、命令メモリー120からバーチャルマシン命令をフェッチする。
プリプロセッサ130は、命令メモリー120からフェッチされたバーチャルマシン命令を少なくとも一つのネイティブ命令に変換するためのコンバータ132を具える。一般に、バーチャルマシン命令はネイティブ命令のシーケンスに変換される。プリプロセッサ130は、更に、ネイティブ命令のシーケンスをプロセッサコア112へフィード（供給）して実行させるためのフィードユニット136を具える。バーチャルマシンプログラムを実行する場合、実際には、プロセッサコア112はプリプロセッサ130によって生成されるネイティブプログラムを実行する。プロセッサコア112の命令ポインターが通常のように、プロセッサコア112によって要求される次に実行すべき命令メモリー120内の命令を指示する場合には、ここで命令ポインターは、プリプロセッサ130に、次のネイティブ命令（あるいは前の命令の再供給）が要求されていることのみを指示する。プロセッサコア112は、バーチャルマシン命令又はバーチャルマシン命令ポインターについて（明確な）知識を持っていない。
命令メモリー120は更にネイティブ命令を含むことができることは明らかである。そのようなネイティブ命令は、例えば、システムを初期化するために、又はドライバ又は埋め込みソフトウェアアプリケーションの特別な部分のような特定のソフトウェアモジュールをネイティブ命令にコンパイルして最適に実行することを可能にするために用いられる。プリプロセッサ130は、バーチャルマシン命令から導出され変換されたネイティブ命令を供給するか、あるいはメモリーからの命令をネイティブ命令としてプロセッサコア112に実行させるかの決定を行う。プリプロセッサ130は、種々の方法によりこの決定を行うことができる。例えば、プリプロセッサ130はプロセッサコア112によって発行される命令アドレスを監視することができる。発行される命令アドレスが予め定められた範囲内にある場合は、プリプロセッサ130は変換された命令をプロセッサコア112に供給する。発行される命令アドレスが予め定められた範囲の外側にある場合は、発行された命令アドレスでアドレス指定されたメモリー120の位置の内容を、ネイティブ命令としてプロセッサコアに送る。バーチャルマシン命令の処理の間、プログラムカウンターを予め定められた範囲内に保つため、プロセッサコア112のプログラムカウンターが予め定められた範囲の終わりに近づく度に、プリプロセッサ130は、予め定められた範囲のスタートへ戻るジャンプ命令を供給することができる。
変換された命令を供給する決定を行うための他のメカニズムとして、プリプロセッサ130は、命令の現在の型（バーチャルマシン／ネイティブ）を示す特別なレジスタを用いることができる。この場合においては、型の変更が行われる度にレジスタの内容を変更するための命令を実行することが必要である。
プロセッサコア112が他に命令キャッシュを含むプロセッサの一部である場合は、プリプロセッサ130と実際のプロセッサコア112との間にあるこの命令キャッシュを利用することが望ましい。この方法においては、命令キャッシュ及びプロセッサコア112両者を統合したプロセッサの設計は、プリプロセッサ130と協働するための変更を必要としない。この場合、新たなキャッシュラインが要求される毎に、プリプロセッサ130は、複数の変換された命令を持つキャッシュラインを一度にキャッシュに供給することが望ましい。プリプロセッサは、実際の実行に先立って命令を変換するために、及び、キャッシュによるプリフェッチに備えて連続的な変換された命令をレジスタに置くために、一般的なパイプライン機構を用いることができる。
更に、命令キャッシュがプリプロセッサとプロセッサコア112との間に存在する場合においては、プリプロセッサ130は、プロセッサコア112が「古い」変換された命令をプリプロセッサ130から受ける代わりに命令キャッシュからフェッチすることのないことを保証する必要があり得る。この保証は、命令ポインターアドレスが予め定められた範囲にある際、及びプリプロセッサ130がプロセッサコア112にジャンプ命令を発行して命令ポインターを予め定められた範囲内に保持する際に、バーチャルマシン命令を供給する場合に、次の方法で行うことができる。変換された命令の実行についての決定のために用いられる命令アドレスの予め定められた範囲が充分に大きい場合、即ち、少なくともキャッシュサイズと同等の大きさである場合、プロセッサコアの命令ポインターが同一アドレスに戻る前に、命令キャッシュ中の命令が上書きされる。
コンバータ132は、命令メモリー120からフェッチされたバーチャルマシン命令を少なくとも一つのネイティブ命令に変換するために用いられる。例えば、整数加算のためにＪａｖａのバイトコード（0x60）（バーチャルマシン命令）は、スタックの上位二つの要素を加算し、これらの上位二つの要素をスタックから消去し、合計をスタック上にプッシュすることによって結果を得る。このバーチャルマシン命令は、下記のようなＭＩＰＳプロセッサ（32ビットマシン）のための命令（ネイティブ命令）のシーケンスに変換することができる。下記では$tospは、スタックの最初の空き位置（スタックの最上位より上）を指示しているレジスタである。
1w $a0,4($tosp)  //スタックの最上位の要素をレジスタ$a0にロードする
1w $a1,8($tosp)  //スタックの２番目の要素を$a1にロードする
add $a0,$a1,$a0  //$a0と&a1とを加算し、合計を$a0に置く
addi $tosp,$tosp,4  //１要素だけスタックを下げる
sw $a0,4(&tosp)  //スタックの新たな最上位に合計を格納する
コンバータ132は、バーチャルマシン命令をネイティブ命令のシーケンスに変換するためのテーブルを具えることが望ましい。テーブルの各セルが一つのバーチャルマシン命令に対応するネイティブ命令のシーケンスからなる、一次元テーブルを用いることができる。セル番号は、バーチャルマシン命令に対応する値に対応する。例えば、Ｊａｖａの整数加算（0x60）のためのネイティブ命令のシーケンスがセル９６（＝１６進表記で0x60）に位置する。種々のバーチャル命令に対するネイティブ命令のシーケンスの長さがかなり変動するので、テーブル中では、シーケンスを、相互に直ちに続くように配置すること、即ち明確なセル構造を持たないことが望ましい。
図２は翻訳テーブル200を示す図である。図２では、潜在的なセル境界が点線を用いて表示されている。バーチャルマシン命令のためのシーケンスを配置することができるようにするため、コードインデックステーブル210を用いる。このテーブルは、各バーチャルマシン命令（VMI 1乃至VMI N）の各々について、翻訳テーブル200中に対応するシーケンスの開始点を示す。VMI 3に対応する翻訳テーブル200のセルについて、これに関連するネイティブ命令NI 1乃至NI Mのシーケンス220が図示されている。
コンバータ132がバーチャルマシン命令Ｉを受けると、コンバータは、バーチャルマシン命令Ｉを、コードインデックステーブル210にアクセスするためのインデックスとして用いて、Ｉと同一の型の命令を処理する毎に実行すべきネイティブ命令のシーケンスの始点を検索する。続いてコンバータ132は、翻訳テーブル200の、コードインデックステーブル210から検索したコードインデックスによって表示される第１アドレスにアクセスして、第１ネイティブ命令を読出す。この第１ネイティブ命令は、フィードユニット136を介してプロセッサコア112に供給される。続いて、コンバータは、翻訳テーブル200の第１アドレスに続くアドレスにアクセスし、バーチャルマシン命令Ｉを実行するために用いられる他のネイティブ命令を読出す。全てのこれらの命令を読出し終わると、例えば翻訳テーブル200中のターミネーション（終了）エントリーによってこのことが示され、次のバーチャルマシン命令について処理を繰り返す。
変換の他の例は、Ｊａｖａバイトコードバイプッシュｎ（バイトｎを符号拡張して、その結果をスタックの最上位に置くために用いられる）について与えられる。このバーチャルマシン命令は２バイト（0x60及びｎ）からなり、第１バイトは動作を指定し、第２バイトはパラメータｎを示す。命令は、下記のネイティブＭＩＰＳ命令のシーケンスに変換される。
ori $a0,$0,n  /*レジスタ$a0に定数ｎをロードする*/
sl1 $a0,$a0,24  /*２４ビット左へシフトする*/
sra $a0,$a0,24  /*最後の最左ビットを複製することにより算術的右シフトを行い、符号拡張を生じさせる*/
sw $a0,0($tosp）  /*結果をスタックの新たな最上位に格納する*/
addi $tosp,-4  /*スタックサイズを増す*/
この例は、バーチャルマシン命令がパラメータ化できることを示し、オペレーションコードの次に少なくとも一つのオペランドが続いている。コンバータ132が、ネイティブ命令がフルコードか又は命令スケルトンかのいずれかによって表される翻訳テーブル200を持っていることが有利である。例えば命令addi $tosp,-4（上記の例のシーケンスの最後の命令）は、変数部分を含まず、その全体がテーブル中に４バイトエントリーとして配置される。命令ori $a0,$0,n（上記の例のシーケンスの最初の命令）は、変数部分を含み、変数部分(n)を指定せずにテーブル中にスケルトンとして配置される。テーブル中の命令スケルトン用のエントリーは、フル命令（ＭＩＰＳプロセッサについては例えば４バイト）と同一の幅であり、一様なテーブルを可能にすることが望ましい。ネイティブ命令スケルトンの未指定部分を満たす方法を示すための他の情報を、テーブル（又は別個のテーブル）中に配置することができる。未指定部分を満たすためにはマイクロプログラミングを用いることが有利である。従って、この他の情報は、マイクロコードを含むか又は表示することができる。命令スケルトン用には、フルネイティブ命令用と同一の構造（幅及び組成）を用いるのが有利であることは明らかである。しかしながら、他の構造を用いてもよい。
バーチャルマシンがスタック向きのマシンである場合は、スタック又は少なくともスタックの最上位の要素がプロセッサコア112のレジスタ上にマッピングされることが望ましい。このように、メモリースタックが（バーチャルマシンスタックと共に）、例えば、スタック上のより高い位置に進むにつれてアドレスが増加するメモリー位置、又は、スタック上のより高い位置に進むにつれてアドレスが減少するメモリー位置、及びこれとは独立に、スタック上のより高い位置に進むにつれてアドレスが増加するレジスタ位置、又は、スタック上のより高い位置に進むにつれてアドレスが減少するレジスタ位置を用いて）レジスタスタックにマッピングされる。
レジスタ$r1、$r2、及び$r3がメモリースタックの三つの連続する要素を含むと仮定する。ここで先ず$r1はメモリースタックの第１空き位置に対応し、$r2はメモリースタックの最上位を含み、$r3はメモリースタックの第２要素を含み、Ｊａｖａバイトコードバイプッシュｎは、下記のネイティブＭＩＰＳ命令のシーケンスに変換することができる。
ori $r1,$0,n
sl1 $r1,$r1,24
sra $r1,$r1,24
同様に、$r2がスタックの最上位である場合、Ｊａｖａバイトコード命令iaddは、
add $r3,$r2,$r3
に変換される。
この場合、プリプロセッサ130は同様に、スタックの最上位を格納するレジスタ（例えば$r2）を指示するポインターを保持する。バーチャルマシン命令が翻訳されると、プリプロセッサがネイティブ命令を生成する。その中では、レジスタの参照がスタックの最上位へのこのポインターの内容に従って適応される。ポインターはバーチャルマシン命令に従って更新される。例えば、バイプッシュ命令の後に１項目がスタックに加えられ、そしてこの例のバイプッシュ命令に次のバイプッシュ命令が続く場合には、スタックの最上位を$r1とすれば、こうした次のバイプッシュ命令の翻訳において、ネイティブ命令中で$r1の代わりに$r0を用いる（即ちori $r0,$0,n/sl1 $r0,$r0,24/sra $r0,$r0,24）。同様に、Ｊａｖａバイトコード命令iaddの後は、スタックは１項目少なく含み、これにより、この例のiadd命令にバイプッシュ命令が続く場合には、スタックの最上位を$r3とすれば、こうした次のバイプッシュ命令の翻訳において、ネイティブ命令中で$r1の代わりに$r2を用いる（即ちori $r2,$0,n/sl1 $r2,$r2,24/sra $r2,$r2,24）。
論理的には、プリプロセッサ130が、命令メモリー120中の現在（又は次）のバーチャルマシン命令を指示する独立のバーチャルマシン命令ポインターを管理する。プロセッサコア112は、それ自体の命令ポインター（プログラムカウンター）を持っており、そのプログラムカウンターに基づいて命令アドレスを発行する。プリプロセッサ130が動作している時は、これらの命令アドレスは、実行される個々のバーチャルマシン命令を選択するためには通常用いられない。この場合、プロセッサコアのプログラムカウンターは部分的に冗長になる。プロセッサコア112がそれ自体でネイティブプログラムを実行するために設計された標準的なコアであり、プリプロセッサはオプションとして付加されたものであることから、プロセッサコア112のプログラムカウンター及びその命令フェッチ機構は、いずれにしてもプロセッサコア112中に存在する。
バーチャルマシン命令の通常の処理を行う間には、プロセッサコア112によって発行される命令アドレスの値は、個々の命令を選択するためには無関係である。その代わりに、プリプロセッサ130が、それ自体のバーチャルマシン命令ポインターを用いて、ロードすべきバーチャルマシン命令を決定し、プリプロセッサ130中に格納されているそのバーチャルマシン命令に対するネイティブ命令をプロセッサコア112に供給する。これらの格納されているネイティブマシン命令は、通常、ジャンプ、ブランチ等、プロセッサコアのプログラムカウンターの値を変化させるような命令を含まない。
しかしながら、本発明によれば、プリプロセッサ130は、「サブルーチンへジャンプする」命令（又はこれと同等の命令）をプロセッサコア112に供給することにより、或る特別なバーチャルマシン命令に応答する。この命令のジャンプのターゲットアドレスは、ネイティブ命令中のサブルーチンの始点を含む命令メモリー120中の位置を指示する。このサブルーチン命令へのジャンプに応答して、プロセッサコア112はジャンプターゲットアドレスから命令アドレスの発行を開始し、メモリー120からサブルーチンを構成するネイティブ命令を受取り、プリプロセッサ130の介入なしにそれらの命令を実行する。サブルーチンを実行する間、プリプロセッサ130は変換された命令の発行を中断する。プリプロセッサ130は単に、プロセッサコア112の動作を監視して、元のジャンプサブルーチンに対応するサブルーチンからの戻り（リターン）が生じた否かを判定するだけである。プリプロセッサ130がそのようなサブルーチンからの戻りを検出した場合には、プリプロセッサ130はバーチャルマシン命令に基づくネイティブ命令の発行を再開する。
図３はプリプロセッサ130の動作の具体例のフローチャートである。このフローチャートは、分かり易くするため、連続的なステップのループを示す。実際には、これらのステップはパイプライン化することができる。ループの一回以上の繰り返しからのステップは同時に実行してもよい。フローチャートの第１ステップ30では、プリプロセッサ130がそのバーチャルマシンプログラムカウンターを進める。フローチャートの第２ステップ31では、プリプロセッサ130が、バーチャルマシンプログラムカウンターによって指示されたバーチャルマシン命令をフェッチする。第３ステップ32は、プリプロセッサ130がそのバーチャルマシン命令に対するネイティブ命令が存在するか否かをテストする。否の場合は、フローチャートは第１ステップ30から継続され、存在する場合は、プリプロセッサ130が第４ステップ33に進む。第４ステップ33では、プリプロセッサ130がネイティブサブルーチンを呼出すべきか否かをテストする。否の場合は、プリプロセッサ130が第５ステップ34を実行して、ここでは、プリプロセッサ130がネイティブ命令をプロセッサコア112に供給し、次いで第３ステップ32に進み、バーチャルマシン命令に対する他のネイティブ命令が残っているか否かを見る。
第４ステップ33で、プリプロセッサ130がネイティブサブルーチンを呼出すべきであると決定した場合は、プリプロセッサ130は、第６ステップ35に進み、適切なサブルーチン呼出し命令をプロセッサコア112に供給する。その後、第７ステップ36で、プリプロセッサ130はプロセッサコアの動作を監視し、第８ステップ37で、プロセッサコア112がサブルーチンから戻ったか否かを判定する。プリプロセッサ130は、プロセッサコア112がサブルーチンから戻るまで、プロセッサコア112を監視する動作を継続する。その後、プリプロセッサは第３ステップ32に戻る。
プロセッサコア112の動作を監視するための有利な方法は、プロセッサコア112によって発行される命令アドレスを観測することである。この場合においては、プリプロセッサ130は、プロセッサコア112によって発行される命令アドレスを用いて、変換された命令をプロセッサコア112に供給すべきか否か、あるいはプロセッサコア112がネイティブ命令を実行することを許可すべきか否かを検出する。例えば、発行されたアドレスが予め定められた範囲内にある場合にのみ変換された命令を供給する。この場合には、プロセッサコア112によってサブルーチン命令へのジャンプが発行された時には、発行された命令アドレスが予め定められた範囲内にある。ジャンプターゲットアドレスは予め定められた範囲の外側にあり、このため、メモリー120からのネイティブ命令を実行させ、サブルーチンからの戻りの際、プロセッサコア112によって発行される命令アドレスは予め定められた範囲内に戻り、このため、プリプロセッサ130が変換された命令の供給を再開する。
勿論、変換された命令の供給、サブルーチンのネイティブ命令の実行、及び戻りとの間の切替えは、種々の他の方法でも実現することができる。例えば、サブルーチンへジャンプする代わりに、サブルーチンの開始へのジャンプを用い、サブルーチンの終了の際に予め定められた範囲のいずれかにジャンプバックを実行することができる。これにより、更に、サブルーチンが完了したことをプリプロセッサが検出することを可能にする。
プリプロセッサは、一つ以上のサブルーチンのアドレスを格納するためにＲＡＭメモリーを用いることが望ましい。この場合、バーチャルマシン命令をネイティブ命令に変換するためのネイティブ命令テーブルは、選択した命令に対して、プリプロセッサ130がサブルーチンへのネイティブジャンプ命令をプロセッサコア112に供給すべきことを示すエントリー、及びサブルーチンへのジャンプ命令のターゲットアドレスが格納されているＲＡＭ中の位置を指示するポインターを含むことができる。そのようなエントリーに遭遇した際に、プリプロセッサ130は、サブルーチンへのジャンプ命令を、例えばこの命令中に代入されるターゲットアドレスと共にプロセッサコア112に供給するか、又は、ターゲットアドレスを格納しているＲＡＭ位置へのポインターを用いてサブルーチンへのジャンプの間接命令を供給する。
ターゲットアドレスを格納するためにＲＡＭを利用することにより、ハードウェアの構成を変えることなく、バーチャルマシン命令を極めて高速で実行するためにサブルーチンを変更することが可能になる。
プリプロセッサ130が、極めて複雑なバーチャルマシン命令を実行するためには、Ｃ言語のような高級言語（ＨＬＬ）からコンパイルされたネイティブ命令のサブルーチンを用いることが可能であることが望ましい。プロセッサコアがＨＬＬ言語からコンパイルされたネイティブ命令のサブルーチンを実行するためには、通常、プロセッサコアに対して特定の方法によりサブルーチンのアーギュメントが提供される必要がある。例えば、ＭＩＰＳプロセッサにおいては、最初にレジスタr4-r7に四つのサブルーチンのアーギュメントが存在する必要がある。同様に、結果は通常特定の方法で送出される。例えば、ＭＩＰＳプロセッサにおいては、結果はレジスタ$r2,$r3に送出される。サブルーチンのためのリターン（戻り）アドレスは、例えばレジスタ$r31のような、特別なレジスタにあることが期待される。
バーチャルマシンモデルにおいては、これらのアーギュメント及び結果は、仮想的格納位置に存在し、プリプロセッサがそれらを物理的レジスタ及びメモリー位置にマッピングする。しかしながら、これらのレジスタ及びメモリー位置は、ＨＬＬサブルーチン呼出しで用いられるものと異なっていてもよい。
従って、プリプロセッサは、一つ以上のバーチャルマシン命令に応答して先ずネイティブ命令をプロセッサコアに送るべく構成され、これらのネイティブ命令により、プロセッサコアが、バーチャルマシンのスタックの位置の内容を保持する記憶素子からの情報を、ＨＬＬからコンパイルされたサブルーチンを呼出すためのアーギュメントが存在するものと期待される記憶素子へ転送することが好ましい。続いて、プリプロセッサが命令をプロセッサコアに送りサブルーチンに制御を移し、このサブルーチンからの戻りの後、プリプロセッサがネイティブ命令をプロセッサコアに送り、サブルーチンの結果を予め定められた記憶素子からバーチャルマシンのスタックの位置の内容を保持する記憶素子へ転送する。プリプロセッサは、このように処理されるバーチャルマシン命令の少なくとも一つに応答して、プロセッサコアにサブルーチンのアドレスをＲＡＭ位置からフェッチさせることが望ましい。
ＨＬＬサブルーチンのアーギュメントは、コンパイルタイム（コンパイル）アーギュメント及びランタイム（実行時）アーギュメント又は両者の混合であってもよい。ランタイムアーギュメントはプログラム実行中に計算される。ランタイムアーギュメントは、従って、プログラムがコンパイルされている時（即ちコンパイルタイム）は利用できない。
コンパイル時にアーギュメントが利用できる単純なバーチャルマシン命令の例は、Ｊａｖａバイトコードbipush nである。ここでｎはコンパイラによって供給される。ランタイムアーギュメントを必要とするバーチャルマシン命令の例は、Ｊａｖａバイトコードiaddである（勿論、更に複雑な命令については、実際にはＨＬＬサブルーチンのみを用いることができる）。この命令は、スタックからの二つの整数のアーギュメントを加算し、結果をスタックに置く。このバーチャルマシン命令のための高級言語（例えばＣ）機能は、以下のように定義される。
int iadd(int a0,int a1)
｛return a0+a1;｝
ＭＩＰＳプロセッサのためのプログラムコンベンションは、レジスタ$r4乃至$r7中の最初の四つのアーギュメントを期待し、結果をレジスタ$r2及び$r3中に置き、次にレジスタ$r31によって指示されるアドレスに戻るために、ＨＬＬ言語からコンパイルされたサブルーチンを必要とする。ＨＬＬコンパイラは、ＨＬＬのiadd機能を、以下に示すＭＩＰＳ命令のシーケンスに翻訳する。
add $r2,$r4,$r5
jr $r31
これらの命令は、アーギュメントを用い、結果（加算）を生成し、ＨＬＬサブルーチンから戻ることを行う。プリプロセッサは、制御をＨＬＬサブルーチンに渡す前に、ランタイムデータを操作しなければならない。即ち、iadd機能を呼出す前に、上記の機能についてのアーギュメントが、プロセッサコンテクストからアーギュメントレジスタに移されなければならない。Ｊａｖａバーチャルマシンについては、ＪａｖａＶＭがスタック上に計算値を置くので、スタック値の操作が必要になる。プリプロセッサがその呼出しについてのプロセッサ命令を生成する場合には、以下に示すようなＭＩＰＳ命令のシーケンスを生成することができる。
lw $r4,4($sp)  //バーチャルマシンスタックからアーギュメントを取得する
lw $r5,8($sp)
addi $sp,$sp.8
jalr $r31,iadd  //ＨＬＬサブルーチンを呼出す
nop  //ＭＩＰＳプロセッサコアのブランチ遅延スロットを満たす
sw $2,0($sp)  //結果をスタックに戻す
addi $sp,$sp,-4
更に、プリプロセッサは、プロセッサコアに、ＨＬＬサブルーチンによって上書き可能な記憶素子からのあらゆる情報をセーブさせることができる。特に、バーチャルマシンスタックのうちレジスタに格納されている部分を、メモリーの、バーチャルマシン命令の通常の実行中に（即ち、ＨＬＬサブルーチンの実行なしに）バーチャルマシンスタックが格納されている位置へ転送することが望ましい。
ＨＬＬサブルーチンは、しばしばスタックも利用する。通常は、ＨＬＬサブルーチンが、スタックの「下位の」内容、即ちＨＬＬサブルーチンが呼出される前にスタック上に存在する内容を変更しないことが保証されている。従って、必要な場合は、原理的に、ＨＬＬサブルーチンが呼出される前に、（スタックの成長にふさわしいだけスタックポインターを増加又は減少することにより）充分な量のスタック空間を確保した後に、バーチャルマシン用及びＨＬＬサブルーチン用に同一の物理的スタック及びスタックポインターレジスタを用いることができる。
ランタイムアーギュメントを必要とするＪａｖａバイトコードの他の例はjsrn(現在の位置＋ｎのサブルーチンへジャンプする)である。このバーチャルマシン命令のためのＨＬＬ機能は、（例えば、インクルード・ファイルにおいて）以下の呼出しの定義を持つことができる。
void jsr(unsigned n,unsigned current);
この機能に対する呼出しを生成するプリプロセッサは、以下のＭＩＰＳ命令のシーケンスをプロセッサコアに送る。
ori $r4,$0,n
lui $r5,(current>>16)
ori $r5,$r5,(current&0xFF)
jarl $r31.jsr
nop
勿論、バーチャルマシン中の格納を表す位置から、ＨＬＬサブルーチンがアーギュメント情報が存在するものと期待する記憶素子へ、このアーギュメント情報を転送するための機構の利用は、プリプロセッサに限定されない。プロセッサコアの内部に、又はより一般的なプロセッサ内に、この種の機構を実現し、それにより、プロセッサが特別な命令に応答して、ＨＬＬサブルーチンによって利用される標準的な位置へ情報を転送し、そのサブルーチンに制御を移すことができる。従って、通常の命令に応答して、プロセッサは、例えばスタックポインターによって指示される位置から通常の命令毎のアーギュメントを取得することにより、第１アーギュメント格納コンベンションによって定義される格納位置からのアーギュメントを用い、通常の命令の機能を実行し、通常の格納位置に結果を書き戻し、そして次の命令を実行する。特別な命令に応答して、アーギュメントを転送して、次に実行すべき命令は、サブルーチンのエントリーポイントである。
図４は、アーギュメントの転送を実行するプロセッサの動作のフローチャートである。この図の左側は通常の実行ループである。第１ステップ40ではプログラムカウンターが増加され、第２ステップ41ではプログラムカウンターによって指示された命令がフェッチされ、第３ステップ42ではこの命令が特別な命令であるか否かをテストし、否の場合は第４ステップ43で命令を実行し、プロセッサは第１ステップ40に戻る。このループは、ステップのシーケンスとして図示されているが、勿論、そのループのいくつかの繰り返しからのステップをパイプラインで同時に実行することができる。命令の実行中に、プロセッサは、第１アーギュメント格納コンベンションによって定義される位置からその命令のアーギュメントを読出す。
第３ステップ42で命令が特別であることをプロセッサが見出した場合は、プロセッサは第５ステップを実行し、アーギュメントが存在するか否かをテストする。存在する場合は、プロセッサは第６ステップ46を実行し、第１格納コンベンションによって定義される格納位置からのアーギュメントを、第２格納コンベンション内の対応する格納位置へ転送し、第５ステップ45に戻り、更に他のアーギュメントが存在するか否かを見る。第５ステップ45においてプロセッサが他のアーギュメントは存在しないことを確認した場合は、第７ステップ47で、プロセッサはサブルーチンに制御を渡す。その後、プロセッサはサブルーチンを実行する（点線のステップ48で図示されている）。フローチャートがプリプロセッサ130によって実行される場合は、プリプロセッサ130は、このステップで、戻りが検出されるまでプロセッサコア112を監視する。
サブルーチンからの戻りの際に、第８ステップで、プロセッサは（存在する場合）サブルーチンの結果を、第２アーギュメント格納コンベンションによって定義される格納位置から第１アーギュメント格納コンベンションによって定義される格納位置へ転送する。その後、プロセッサは第１ステップ40から繰り返す（勿論、サブルーチンが呼出される時には、プログラムカウンターは既に増加されている場合があり、その場合は第１ステップは飛び越す）。
【図面の簡単な説明】
図１Ａ−Ｄは、処理装置内にプリプロセッサを配置するアーキテクチャの四つの可能な選択肢を示す図である。
図２は、バーチャルマシン命令をネイティブ命令のシーケンスに翻訳するための翻訳テーブルを示す図である。
図３は、プリプロセッサの動作の具体例のフローチャートである。
図４は、アーギュメントを転送するフローチャートである。
【図１Ａ】
0003816961.tif 000002
【図１Ｂ】
0003816961.tif 000003
【図１Ｃ】
0003816961.tif 000004
【図１Ｄ】
0003816961.tif 000005
【図２】
0003816961.tif 000006
【図３】
0003816961.tif 000007
【図４】
0003816961.tif 000008