(57)【要約】【課題】ＪＡＶＡ仮想マシン命令シーケンスを実行する際のオペレーションの数を減らし、処理サイクルを短くする。【解決手段】ＪＡＶＡ仮想マシン命令の命令デコーダが、オペランドをスタックの一番上にプッシュする命令であって、単にスタックオペランドの一番上に作用する第２の命令の先行処理として実行されるに過ぎないものを、中心のオペレーションに一体化、即ちフォールディング処理する。この命令デコーダは、フォールディング処理可能な命令シーケンスを特定して、実行ユニットに一つの等価なフォールディング処理済オペレーションを供給する。【選択図】      図１１
2006216069.tif 000002
【特許請求の範囲】
【請求項１】
レジスタストレージに存在するデータを操作するべく動作可能な実行ユニットと、
複数の連続したスタックベースの命令をデコードし、デコードされた前記複数の連続したスタックベースの命令に対応する１個のレジスタベースのオペレーションを前記実行ユニットに実行させるべく動作可能な命令デコーダとを有することを特徴とする装置。
【請求項２】
前記１個のレジスタベースのオペレーションが、前記レジスタストレージにおける処理結果の格納位置、及び前記レジスタストレージにおける２以上のソースの格納位置を明示的に特定することを特徴とする請求項１に記載の装置。
【請求項３】
前記命令デコーダが、前記レジスタストレージの複数のエントリを選択するべく動作可能であり、選択された前記複数のエントリは、デコードされた前記複数の連続したスタックベースの命令によって明示的及び暗示的に標的とされるスタック及びローカル変数の格納位置の部分集合に対応することを特徴とする請求項１に記載の装置。
【請求項４】
前記レジスタストレージにおけるスタック及びローカル変数の部分をさらに含み、デコードされた前記複数の連続したスタックベースの命令の少なくとも１つが、１つのローカル変数から前記スタックの先頭への情報の転送を定義することを特徴とする請求項１に記載の装置。
【請求項５】
スタックベースの命令のシーケンスをフェッチする過程と、
複数の連続したスタックベースのめ異例をデコードする過程と、デコードされた前記複数の連続したスタックベースの命令に対応する１個のレジスタベースのオペレーションを前記実行ユニットに実行させる過程とを含むことを特徴とする方法。
【請求項６】
コンピュータシステムであって、
命令ソースと、
レジスタストレージと、
プロセッサと、
前記命令ソースからスタックベースの命令を受け取り、前記プロセッサに、前記レジスタストレージにおけるソースと処理結果の位置に対する明示的な識別子を用いて前記レジスタに存在する存在するデータを操作させる手段であって、前記手段は、前記スタックベースの命令の一部である複数の連続した命令群を、１個の対応するレジスタベースのオペレーションに変換する、該手段とを有することを特徴とするコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はスタックマシン用の命令デコーダに関するものである。本発明は、特に、多数の命令のシーケンスに対して複数の命令を一つの命令に一体化するフォールディング処理を施し、その命令群を一つのフォールディング処理済オペレーションに変換する方法及び装置に関するものである。
【背景技術】
【０００２】
コンピュータ業界及び通信業界の多くの業界人や組織は、インターネットを、地球上で最も急成長しているマーケットであると、もてはやしている。１９９０年代において、インターネットのユーザの数は指数関数的に増加し、いまだとどまるところを知らない。１９９５年６月時点でのインターネットに接続しているホストの数は推計６，６４２，０００であり、同年１月の推計値４，８５２，０００に対して増加が見られた。ホスト数は年間約７５％増加している。ホストの中には、約１２０，０００のネットワークサーバ、及び２７，０００以上のＷｅｂサーバが存在していた。Ｗｅｂサーバの数は５３日毎に約２倍になっているとみなせる。
【０００３】
１９９５年７月には、アクティブユーザが１００万人以上、ＵＳＥＮＥＴニュースグループが１２，５０５以上、ＵＳＥＮＥＴの購読者が１０００万人以上に達し、インターネットは、様々な情報及びマルチメディアサービスの巨大なマーケットとなるべく運命付けられた。
【０００４】
加うるに、公共のキャリアネットワークあるいはインターネットに対し、多くの会社及び他のビジネスが、企業ネットワーク、あるいは私的なネットワークの中でいっそう効率的に情報を共有するための方法としてイントラネットにそれらの内部情報システムを移行しつつある。イントラネットのための基本的なインフラはサーバーとデスクトップを結ぶ内部のネットワークである、そしてそれはファイアウォールを通してインターネットに接続してもよく、接続しなくてもよい。これらのイントラネットは業界で確立している標準的な開放ネットワークプロトコルに従ってデスクトップにサービスを提供する。イントラネットにより、それらを採用している企業は、内部の情報管理の単純化や、ブラウザパラダイムを用いる内部の通信の改善といった多くの利益が得られる。インターネット技術を会社の企業インフラ及び旧式なシステムと統合することは、イントラネットを使用するグループに対する既存の技術投資のてこ入れにもなる。上に論じられているように、イントラネットとインターネットは、イントラネットがビジネスの中での内部的で保全性が高いコミュニケーションのために使われ、インターネットがビジネスにおいて外の世界との連絡、つまり外部取引のために使われており、このような状況の下で密接に関連し合っている。本明細書においては、用語「ネットワーク」はインターネットとイントラネットの両方を含む。しかしながら、インターネットとイントラネットの区別については、それが適用可能である場合には、記憶に留めおかれたい。
【０００５】
１９９０年に、サン・マイクロシステムズ（Sun Microsystems）社のプログラマーが普遍的なプログラミング言語を書いた。この言語は最終的にJavaプログラミング言語と命名された。（Javaは米国カリフォルニア州Mountain Viewのサン・マイクロシステムズの商標である。）Javaプログラミング言語は初めにC++プログラミング言語でコード化されることを意図したプログラムの努力から生まれた。それ故、Javaプログラミング言語はC++プログラミング言語と多くの共通性を持っている。しかしながら、Javaプログラミング言語は単純で、オブジェクト指向で、分散型で、インタプリート型であるが高性能で、強靭であるが安全で、保全性が高く、ダイナミックで、アーキテクチャによらず、移植性がある、マルチスレッド型の言語である。
【０００６】
Javaプログラミング言語は、多くのハードウェア会社やソフトウェア会社がサン・マイクロシステムズから使用許諾を得たときから、特にインターネット用のプログラミング言語として出現した。Javaプログラミング言語及び環境は、最近のプログラミングの実行における問題を解決するよう設計されている。Javaプログラミング言語では、C++プログラミング言語における、めったに使われず理解されにくく紛らわしい多くの機能を取り除いてある。これらの取り除かれた機能には、主として、オペレーターに負担をかけ過ぎる機能、多重継承、及び広範囲の自動強制型変換などがある。Javaプログラミング言語は自動ガーベジコレクション機能を有し、この自動ガーベジコレクションは、Ｃプログラミング言語のように割り当てられたメモリ及び開放メモリが必要ではないため、プログラミングのタスクが単純化される。Javaプログラミング言語は、Ｃプログラミング言語で定義されているポインタの用途を限定し、その代わりに、配列の上下限が明示的にチェックされる真数配列を持っており、これにより、多くのウイルスといやらしいバグに対する脆弱さなくしている。また、Javaプログラミング言語はオブジェクティブ−Ｃインタフェースと特定の例外ハンドラを有している。
【０００７】
また、Javaプログラミング言語は、TCP/IPプロトコル(Transmission Control Protocol based on Internet protocol)、HTTP(Hypertext Transfer Protocol)とFTP(File Transfer Protocol)に容易に対処できるようにするためのルーチンの広範囲のライブラリを持っている。Javaプログラミング言語はネットワークで結ばれた分散環境における使用を意図されている。Javaプログラミング言語により、ウイルスがなく、破壊工作から守られたシステムの建設が可能となった。また、その認証技術は公開鍵暗号化に基づいている。
【０００８】
従来技術として、ＷＯ−Ａ−９４／２７２１４には、命令シーケンスの個々の命令のデコードやタスク指名のオーバヘッドを取り除くゲスト命令のシーケンスをデコードする方法が開示されている。
【０００９】
また従来技術として、ＥＰ−Ａ−０  ０７１  ０２８には、ある多重命令シーケンスが関与するアドレス発生インターロック（ＡＧＩ）の問題を回避するための命令置換機構が開示されている。
【発明の開示】
【発明の効果】
【００１０】
Java仮想マシンはスタック指向の抽象的な演算マシンである、そしてそれは物理的な演算マシンのように命令セットを持ち、種々の記憶領域を使用する。Java仮想マシンはJavaプログラミング言語を理解する必要はなく、代わりにそれは、classファイルフォーマットを理解する。classファイルは、Java仮想マシン命令（あるいはバイトコード）と、他の補助的な情報と同様シンボルテーブルを含む。Javaプログラミング言語で（あるいは他の言語で）書かれたプログラムはコンパイルされてJava仮想マシン命令のシーケンスが生成され得る。
【００１１】
一般にスタックを用いる演算マシンにおいては、命令は通常オペランドスタックの先頭のデータに作用する。ローカル変数命令からのロードのような、１又は２以上の最初の命令が実行され、このような命令に後続する命令の実行の先行動作として、オペランドデータがオペランドスタック上にプッシュされる。例えばＡＤＤオペレーションのような次に続く命令は、オペランドデータをスタックの最上部からＰＯＰして、そのオペランドデータに作用し、そして演算結果をオペランドスタックの先頭にプッシュし、オペランドスタックの先頭のデータと置き換えている。
【００１２】
適切に構成された命令デコーダにより、スタックオペランドの先頭に作用する第２の命令に対する単なる先行動作としての、オペランドをスタックの最上部の上にプッシュする命令を一体化、即ちフォールディング処理することができる。この命令デコーダは、フォールディング処理可能な命令（一般に２、３、あるいは４つの命令）のシーケンスを識別し、そして等価な１つのフォールディング処理済オペレーション（一般に１つのオペレーション）を実行ユニットに供給し、これによって、この処理を行わなければ必要となる、フォールディング処理された命令シーケンスの多数の命令に対応する多数のオペレーションの実行のための処理サイクルを減らす。本発明による命令デコーダを用いて、多数のロード命令とストア命令を、命令シーケンスのそれらの命令の間に現われる命令の実行の中に一体化、即ちフォールディングすることができる。例えば、（ローカル変数からスタックの先頭に整数オペランドをロードするための）１対のロード命令、（スタックの整数オペランドをＰＯＰして、それらを加算し、スタックの先頭に演算結果を置くための）ＡＤＤ命令、（演算結果をスタックからＰＯＰして、そして結果をローカルな変数に格納するための）ストア命令のような命令シーケンスを、ランダムにアクセス可能なスタック及びローカル変数のストレージにおけるソースアドレスと行先アドレスとを指定する、一つの等価なオペレーションに一体化、即ちフォールディングすることができる。
【００１３】
本発明の一実施例の装置は、命令記憶装置、オペランドスタック、データ記憶装置、実行ユニット、及び命令デコーダを含む。命令デコーダは命令記憶装置に接続され、その中に表現される命令のフォールディング可能なシーケンスを識別する。フォールディング可能なシーケンスは第１命令及び第２命令を含み、第１命令は、単に第２命令のための第１ソースオペランドとして、第１オペランド値をデータストアからオペランドスタックにプッシュするためのものである。命令デコーダは実行ユニットに接続され、実行ユニットに、フォールディング処理可能なシーケンスと等価で、データストアにおける第１オペランド値に対して選択的な第１オペランドアドレス識別子を含む、一つのフォールディング済オペレーションを供給する。これにより、第１命令に対応する明示的なオペレーションが取り除かれる。
【００１４】
更に別の実施例では、命令バッファにおいて表される命令のシーケンスがフォールディング可能なシーケンスでない場合には、命令デコーダが、第１の命令のみに対応するオペレーション識別子及びオペランドアドレス識別子を実行ユニットに供給する。
【００１５】
更に別の実施例では、指示デコーダがフォールディング可能なシーケンスにおいて更に第３の命令を識別する。この第３の命令は、第２命令のための単なる第２ソースオペランドとして、データストアから第２のオペランド値をオペランドスタックの上にプッシュするための命令である。一つのフォールディングされたオペレーションは、フォールディング可能なシーケンスと等価で、データストアにおける第２のオペランド値に対して選択的な第２のオペランドアドレス識別子を含み、これによって第３の命令に対応する明示的なオペレーションが取り除かれる。
【００１６】
更に別の実施例では、命令デコーダは更にフォールディング可能なシーケンスにおける第４の命令を識別する。この第４の命令は第２の命令の結果をオペランドスタックからＰＯＰし、その結果をデータストアの演算結果の場所にストアするためのものである。一つのフォールディングされたオペレーションは、フォールディング可能なシーケンスと等価で、データストアにおける演算結果の領域に対して選択的な行先アドレス識別子を含む、これによって第４の命令に対応する明示的なオペレーションが取り除かれる。
【００１７】
更に別の実施例によれば、命令デコーダが標準的なフォールディングされたデコード経路及びスイッチング手段を含む。スイッチング手段は、フォールディング処理されたデコード経路からのフォールド表示に応じて、そこからオペレーション、オペランド、及び行先識別子を選択し、フォールド表示がない場合には、通常のデコード経路であるノーマルでコード経路からオペレーション、オペランド、及び行先識別子を選択するための手段である。
【００１８】
様々な他の実施例における装置は、命令がオペランドスタックの最上部のエントリからオペランドを取出したり、そこに演算結果を入れる、仮想マシン命令プロセッサ用の装置である。このような別の実施例の１つにおいては、仮想マシン命令プロセッサは、ハードウェアの仮想マシン命令プロセッサであり、命令デコーダは、デコードロジックを有する。更に別の実施例の１つでは、仮想マシン命令プロセッサが、ジャストインタイム（just-in-time）コンパイラインプリメンテーションを含み、命令デコーダはハードウェアプロセッサ上で実行可能なソフトウェアを含む。ハードウェアプロセッサは実行ユニットを含む。更に別の実施例では、仮想マシン命令プロセッサが、ハードウェアプロセッサ上で実行可能なソフトウェアを含む命令デコーダとバイトコードインタプリターインプリメンテーションとを含む。ハードウェアプロセッサは実行ユニットを含む。
【００１９】
本発明の別の実施例による方法は、仮想マシン命令のシーケンスの第１の命令が、単に第２命令のために第１オペランド値をデータストアからオペランドスタックにプッシュするための命令であるか否かを判定する（ａ）過程と、（ａ）過程の判定の結果がイエスである場合は、第１の命令と第２の命令とを含むフォールディング可能なシーケンスと等価な一つのフォールディングされたオペレーションを実行ユニットに供給する過程とを含む。この一つのフォールディングされたオペレーションは、第１オペランド値に対して選択的な第１オペランド識別子を含み、これによって第１の命令に対応している明示的なオペレーションが取り除かれる。
【００２０】
別の実施例では、前記方法が、（ａ）過程の判定の結果がノーである場合には、仮想マシン命令シーケンスにおける第１命令に等価なオペレーションを実行ユニットに供給する過程を含む。
【００２１】
更に別の実施例では、前記方法が、仮想マシン命令シーケンスの第３命令が、オペランドスタックから第２命令の演算結果値をＰＯＰし、その演算結果をデータストアの演算結果領域にストアするための命令であるか否かを判定する（ｂ）過程と、（ｂ）過程の判定の結果がイエスである場合には、結果領域に対して選択的な演算結果識別子を一つの等価なフォールディングされたオペレーションに含める過程を含む。これによって、第３命令に対応する明示的なオペレーションが取り除かれる。更に別の実施例では、前記方法が、（ｂ）過程の判定の結果がノーである場合には、仮想マシン命令シーケンスにおけるオペランドスタックの先頭領域に対して選択的な結果識別子を一つの等価なフォールディングされたオペレーションに含める過程を含む。実施例によっては、（ａ）の判定過程と（ｂ）の判定過程とが概ね同時並行的に実行される。
【００２２】
本発明の更に別の実施例によれば、スタックベースの仮想マシンインプリメンテーションが、ランダムアクセス可能なオペランドスタック表現、ランダムアクセス可能なローカル変数ストレージ表現、及び仮想マシン命令を選択的にデコードし、選択されたシーケンスと共にフォールディングして、オペランドスタック上の不必要なオペランドの一時ストレージをなくすための仮想マシン命令デコーダを含む。
【００２３】
様々な別の実施例において、スタックベースの仮想マシンインプリメンテーションは、ハードウェアスタックキャッシュ、ハードウェア命令デコーダ、及び実行ユニットを備えたハードウェア仮想マシン命令プロセッサ（１）であるか、またはコンピュータが読み出し可能な媒体上にコード化されハードウェアプロセッサ上で実行可能なソフトウェア（２）を含む。ハードウェア仮想マシン命令プロセッサの実施例では、（ａ）ランダムアクセス可能なオペランドスタックローカル変数ストレージ表現が、少なくとも部分的にハードウェアスタックキャッシュ内に存在し、（ｂ）仮想マシン命令デコーダが、オペレーションコード（オペコード）、オペランド、及びそれぞれハードウェア仮想マシン命令プロセッサオペレーション及びハードウェアスタックキャッシュにおける領域に対して選択的な結果識別子を、仮想マシン命令の選択されたシーケンスと等価な一つのハードウェア仮想マシン命令プロセッサオペレーションとして、実行ユニットに供給するように接続されている。ソフトウェアの実施例では、（ａ）ランダムアクセス可能なオペランドスタックローカル変数ストレージ表現が、少なくとも部分的にハードウェアプロセッサのレジスタ内に存在し、（ｂ）仮想マシン命令デコーダが、少なくとも部分的にソフトウェアにおいて実現され、（ｃ）仮想マシン命令デコーダが、オペレーションコード（ＯＰコード）、オペランド、及びそれぞれハードウェアプロセッサオペレーション及びレジスタ内の領域に対して選択的な結果識別子を、仮想マシン命令の選択されたシーケンスと等価な一つのハードウェアプロセッサオペレーションとして、供給するように接続されている。
【００２４】
本発明の更に別の実施例では、ハードウェア仮想マシン命令デコーダが、ノーマルデコード経路、フォールドデコード経路、及びスイッチング手段を有する。フォールドデコード経路は、仮想マシン命令のシーケンスをデコードし、そのシーケンスがフォールディング可能な場合は、（ａ）一つのオペレーション識別子、（ｂ）１又は２以上のオペランド識別子、及び（ｃ）行先識別子を供給する。これらの識別子は、全体として仮想マシン命令のシーケンスと等価である。スイッチング手段は、フォールディングされたデコード経路に応答し、フォールディングされたデコード経路からのフォールド表示に応じてそこからオペレーション、オペランド、及び行先識別子を選択し、そのフォールド表示がない場合には、ノーマルデコード経路からオペレーション、オペランド、及び行先識別子を選択する。
【発明を実施するための最良の形態】
【００２５】
図１に示すのは、多数の命令のシーケンスを一体化、即ちフォールディング処理して一つのフォールディング済オペレーションに変換する本発明による命令デコーダ１３５を含み、プロセッサアーキテクチャに依存しない仮想マシン命令を直接実行する仮想マシンハードウェアプロセッサ１００（以下ハードウェアプロセッサ１００）の一実施例である。仮想マシン命令の実行におけるハードウェアプロセッサ１００の性能は、インテルのPENTIUMのマイクロプロセッサやサンマイクロシステムズULTRASPARCプロセッサのようなハイエンドのCPUよりずっと優れている（ULTRASPARCはサンマイクロシステムズ社の商標であり、PENTIUMはインテル社の商標である）。ソフトウェアJAVAインタプリタや、JAVAジャストインタイムコンパイラ（just-in-time compiler）で同じ仮想マシンをインタプリートすることは、低コストであって、電力消費量も低い。この結果、ハードウェアプロセッサ１００は、移植性があるアプリケーションに非常に適したものとなる。ハードウェアプロセッサ１００は、他の仮想マシンスタックベースのアーキテクチャや、ガーベジコレクション、スレッド同期などのような機能を用いてる仮想マシンに対しても似たような利点をもたらす。
【００２６】
これらの特徴の点から言えば、ハードウェアプロセッサ１００に基づいたシステムは、最も良い全体的な性能について言うのでなければ、ソフトウェアインタプリタやジャストインタイムコンパイラを含む他の仮想マシン実行環境と比較して魅力的なコストパフォーマンスを提供する。しかし、本発明は、仮想マシンハードウェアプロセッサの実施例に限定されず、本発明の範囲には、JAVA仮想マシン命令を特定のハードウェアプロセッサにネイティブなマシン命令にコンパイル（バッチかあるいはジャストインタイムコンパイルの何れかで）するソフトウェアインタプリタとしてJAVA仮想マシンをエミュレートするインプリメンテーションを備えたインプリメンテーションや、或いはJAVA仮想マシンをマイクロコードとして実現する、或いは直接チップ上に実現する、又はそれらの組み合わせとして実現するハードウェアを提供する、適当なスタックベースの、又は非スタックベースの演算マシンインプリメンテーションも含まれている。
【００２７】
コストパフォーマンスについては、ハードウェアプロセッサ１００は、２５０キロバイト（Kbytes）〜５００キロバイトのメモリストレージが不要であるという利点を有している。例えば一般にソフトウェアインタプリタによって必要とされるROM或いはRAMが不要である。ハードウェアプロセッサ１００のシュミレーションにより、ハードウェアプロセッサ１００が、そのプロセッサ１００と同じクロックレートで同じ仮想マシン命令を実行するPENTIUMプロセッサ上の様々なアプリケーション上を走るソフトウェアインタプリタと比較して２０倍高速で仮想マシンを実行することが分かった。別のハードウェアプロセッサ１００のシュミレーションにより、ハードウェアプロセッサ１００は、そのプロセッサ１００と同じクロックレートで、同じ仮想マシン命令を実行するPENTIUMプロセッサ上を走るジャストインタイムコンパイラと比較して５倍高速で仮想マシンを実行することが分かった。
【００２８】
ソフトウェア仮想マシン命令インタプリタが必要とするメモリ消費が禁じられているような環境の下では、ハードウェアプロセッサ１００は有利である。これらのアプリケーションは、例えばネットワーク機器、携帯電話プロセッサ、及び他の遠距離通信用集積回路、若しくは埋め込み型プロセッサやポータブルデバイスのような低電力低コストの他のアプリケーションのためのインターネットチップを含む。
【００２９】
ここに説明するように、命令デコーダ１３５は、スタックオペランドの先頭に作用する第２のJAVA仮想マシン命令に対する単なる先行処理としてオペランドをスタックの最上部にプッシュするJAVA仮想マシン命令を第2の命令に一体化、即ちフォールディング処理を行うことができる。このような命令デコーダは、フォールディング可能な命令のシーケンスを識別して、実行ユニットに１つの等価なフォールディング処理済オペレーションを供給する。これによって、この処理を行わなければフォールディング処理された命令のシーケンスの多数の命令に対応する多数のオペレーション実行に必要であった処理サイクルを減らすことができる。ここに開示された命令デコーダの実施例は、２、３、４個の命令のフォールディング処理、或いはもっと多くの命令のフォールディング処理が可能である。例えば、ここに開示された命令デコーダの一実施例では、２つのロード命令とストア命令を、それらの命令の間の命令シーケンスに現れる命令に対応するオペレーションの中にフォールディングすることができる。
【００３０】
本明細書において、仮想マシンとは、現実の演算マシンのように命令セットを有し、様々なメモリエリアを使用する抽象的な演算マシンである。仮想マシンの使用は、例えばハードウェアプロセッサ１００のような仮想マシンインプリメンテーションにより実行されるプロセッサアーキテクチャに依存しない仮想マシン命令セットを定義する。各仮想マシン命令は実行される特定のオペレーションを定める。仮想演算マシンは、仮想マシン命令を生成するのに用いられるコンピュータ言語や、仮想マシンの下に位置するインプリメンテーションを理解する必要がない。理解する必要があるのは仮想マシン命令用の特定のファイルフォーマットのみである。好適実施例では、仮想マシン命令はJAVA仮想マシン命令である。各JAVA仮想マシン命令は、情報、オペランド、及び他の必要な情報を特定する命令をコード化する１又は２以上のバイトを含んでいる。
【００３１】
付録IはJAVA仮想マシン命令セットを説明したものであり、その全体を本明細書と一体に参照されたい。但し、使用された特定の仮想マシン命令のセットは、本発明において不可欠な要素ではない。付録I及びこの明細書における仮想マシン命令を参照することにより、当業者は特定の仮想マシン命令セットやJAVA仮想マシン仕様の変更に対して、発明を変更して実施することができよう。
【００３２】
コンピュータプラットフォーム上で実行するJAVAコンパイラのJAVAC（図２参照）は、JAVAプログラム言語で書かれたアプリケーション２０１を、JAVA仮想マシン仕様に従って、コンパイル済命令セットを含むコンパイル済命令シーケンス２０３をコード化するアーキテクチャに対して中立なオブジェクトファイルフォーマットに変換する。しかしながら、本発明において必要なのは、仮想マシン命令のソースコード及び関連情報のみである。仮想マシン命令のソース及び関連情報を生成するのに用いられる方法及び技術は本明細書において不可欠の要素ではない。
【００３３】
コンパイル済命令シーケンス２０３は、ハードウェアプロセッサ１００上で実行可能であると共に、例えばソフトウェアインタプリタやジャストインタイムコンパイラを用いるJAVA仮想マシンを実現する任意のコンピュータプラットフォーム上で実行可能である。しかし、上述のように、ハードウェアプロセッサ１００はソフトウェアインプリメンテーションより著しく優れた性能上の利点をもたらす。
【００３４】
この実施例において、ハードウェアプロセッサ１００（図１参照）は、JAVAバイトコードを含む仮想マシン命令を処理する。ハードウェアプロセッサ１００は、後により完全に説明するように、バイトコードの大部分を直接実行する。しかし、バイトコードのいくつかの実行は、マイクロコードを介して実現される。
【００３５】
ハードウェアプロセッサ１００によって直接実行される仮想マシン命令を選択するための１つの戦略について、以下実例を通して説明する。JAVA仮想マシン命令の３０％は純粋なハードウェア翻訳である。即ち、このようにして実現される命令には、定数ローディング及び単なるスタックオペレーションが含まれる。仮想マシン命令の次の５０％は、完全にではないが大抵ハードウェアで実行され、若干のファームウェアによる補助を必要とする命令である。このような命令には、スタックを利用するオペレーション及び配列命令が含まれる。JAVA仮想マシン命令の次の１０％は、ハードウェア上で実現されるがファームウェアによる補助はほとんど不要な命令である。このような命令には関数呼び出し及び関数復帰命令が含まれる。JAVA仮想マシン命令の残りの１０％は、ハードウェアではサポートされていないが、ファームウェアトラップかマイクロコードの何れか、或いはその両方によってサポートされている命令である。これらの命令には例外ハンドラのような関数が含まれる。ここで、ファームウェアとは、ハードウェアプロセッサ１００のオペレーションを実行時に制御する、ROMに格納されたマイクロコードを意味する。
【００３６】
一実施例において、ハードウェアプロセッサ１００は、I/Oバス及びメモリインタフェースユニット１１０、命令キャッシュ１２５を含む命令キャッシュユニット１２０、命令デコードユニット１３０、一体に統合（unified）された実行ユニット１４０、スタックキャッシュ１５５を含むスタック管理ユニット１５０、データキャッシュ１６５を含むデータキャッシュユニット１６０、及びプログラムカウンタ及びトラップコントロールロジック１７０を有する。これらの機能ユニットのそれぞれについては、後に完全に説明する。
【００３７】
同じく、図１に示すように、それぞれのユニットがいくつかの要素を含む。図面において明確に示すため、又注意が発明の内容からそれることを避けるために、図１にはユニットの中の要素間の相互接続は示していない。しかし、次の説明を参照することにより、当業者は、ユニット内の各要素間の、及び様々なユニット間の相互接続及びその改変について理解されよう。
【００３８】
図１に示すユニット群を用いて実現されたパイプライン処理段には、フェッチ段階、デコード段階、実行段階、及びライトバック段階が含まれる。必要ならば、メモリアクセスや例外解決のための別の段階がハードウェアプロセッサ１００内に設けられる。
【００３９】
図３は、プロセッサ１００の実施例における命令の実行のための４段パイプラインを図解したものである。フェッチ段階３０１においては、仮想マシン命令がフェッチされ命令バッファ１２４（図１）に置かれる。仮想マシン命令は、（ｉ）命令キャッシュ１２５からの固定サイズキャッシュラインか、（ｉｉ）実行ユニット１４０内のマイクロコードROM１４１の何れか一方からフェッチされる。
【００４０】
命令のフェッチ（取出し）については、命令tableswitch及びlookupswitchは別にして、（付録I参照）各仮想マシン命令は１バイトから５バイトの間の長さを有する。従って、処理の単純化のため、与えられた命令の全てを確実にフェッチできるようにするために少なくとも４０ビットは必要である。
【００４１】
別の形態では、常に所定のバイト数、例えばオペコードで始まる４バイトをフェッチする。このバイト数は、JAVA仮想マシン命令の９５％に対して十分なバイト数である（付録I参照）。３バイト以上のオペランドが必要な命令に対しては、４バイトがフェッチされる場合にはフロントエンドでの別の処理サイクルが許容されなければならない。この場合、命令の実行は、たとえオペランドの全ての組が利用可能でない段階でも、フェッチされた第１オペランドで開始することができる。
【００４２】
デコード段階３０２（図３）においては、命令バッファ１２４（図１）の前で仮想マシン命令がデコードされ、可能ならば命令フォールディング処理が実行される。スタックキャッシュ１５５へのアクセスは、仮想マシン命令が要求した場合のみ行われる。スタック４００（図４）の先頭を指定するポインタOPTOPを含むレジスタOPTOPも、デコード段階３０２（図３）において更新される。
【００４３】
ここで説明の便宜上、レジスタにおける値及びレジスタは、同じ符号を付して示した。更に、次の議論において、ポインタをストアするためのレジスタの使用は、一実施例についてのみ説明する。本発明の特定の実施例によれば、ポインタは、ハードウェアレジスタ、ハードウェアカウンタ、ソフトウェアカウンタ、ソフトウェアポインタ、又は他の当業者に周知の等価な要素を用いて実現され得る。選択された特定のインプリメンテーションは、本発明において必要不可欠なものではなく、その選択の仕方は価格と性能のトレードオフに基づいて通常決められるものである。
【００４４】
実行段階３０３において、仮想マシン命令は、１又は２以上の処理サイクルで実行される。一般に、実行段階３０３において、定数ユニット１４２（図１）におれるALUは、算術演算を行うか、或いはデータキャッシュユニット（DCU）１６０からのロードやそこへのストアのアドレスを計算するために用いられる。必要ならば、トラップが優先順位付けされて、実行段階３０３（図３）の終わりに行われる。制御フロー命令に対しては、実行段階３０３において分岐アドレスが、分岐が従属している条件と共に計算される。
【００４５】
キャッシュ段階３０４はパイプライン処理に含まれない非パイプラインの段階である。データキャッシュ１６５（図１）は、実行段階３０３（図３）の間に必要があればアクセスされる。段階３０４がパイプライン処理に含まれない理由は、ハードウェアプロセッサ１００がスタックベースのマシンだからである。従って、ロードに続く命令は、大抵ロード命令によって戻された値に依存している。この結果、この実施例においては、このパイプラインはデータキャッシュアクセスのための１サイクルの間保持される。これにより、パイプライン段階が少なくなり、パイプラインによって占められて他が使用不可能な領域を他のレジスタやバイパスのために開放することができる。
【００４６】
ライトバック段階３０５はパイプラインの最終段階である。段階３０５において、計算されたデータがスタックキャッシュ１５５にライトバックされる。
【００４７】
ハードウェアプロセッサ１００は、この実施例においては、JAVA仮想マシンスタックベースアーキテクチャ（付録Ｉ参照）をサポートするスタック４００（図４Ａ）を直接的に実現する。スタック４００上の６４個のエントリは、スタック管理ユニット１５０のスタックキャッシュ１５５に含められる。スタック４００のエントリのいくつかは、スタックキャッシュ１５０に複製され得る。データ上のオペレーションは、スタックキャッシュ１５０を介して実行される。
【００４８】
ハードウェアプロセッサ１００のスタック４００は、主にメソッド用の情報のリポジトリとして使用される。任意の時点において、ハードウェアプロセッサ１００は１つのメソッドを実行している。それぞれのメソッドは、メモリ空間、即ちローカル変数、オペランドスタック、及び実行環境構造の組に対して割り当てられたスタック４００上のメソッドフレームを有する。
【００４９】
新たなメソッドフレーム、例えばメソッドフレーム４１０は、実行段階３０３（図３）におけるメソッド呼び出し時にハードウェアプロセッサ１００により割り当てられ、現在フレーム、即ちその時点で処理されているメソッドのフレームとなる。現在フレーム４１０（図４Ａ）は、他のメソッドフレームと共に、様々なメソッド呼び出し状況に応じて、以下の６つのエントリの全て又は一部を含み得る。その６つのエントリとは即ち、
１．オブジェクト参照
２．渡される引数
３．ローカル変数
４．呼び出しを行ったメソッドコンテキスト
５．オペランドスタック
６．メソッドからの戻り値
である。
【００５０】
図４Ａにおいて、オブジェクト参照、渡される引数、及びローカル変数は、引数及びローカル変数エリア４２１に含められる。呼び出しを行ったメソッドコンテキストは、フレーム状態とも称される実行環境４２２に含められ、それは更にメソッド呼び出し命令の隣の仮想マシン命令、例えばJAVAオペコードのアドレスである復帰プログラムカウンタ値４３１、呼び出しメソッドのフレームの位置である復帰フレーム４３２、呼び出しメソッドのコンスタントプールテーブルを指定する復帰コンスタントプールポインタ４３３、現在メソッドのベクトルテーブルである現在メソッドベクトル４３４、及び現在メソッドのモニタのアドレスである現在モニタアドレス４３５を含む。
【００５１】
このオブジェクト参照は、メソッド呼び出しのために標的にされたオブジェクトを表すオブジェクトストレージに対する間接ポインタである。JAVAコンパイラJAVAC（図２参照）は、このポインタを呼び出し命令が発生する前にオペランドスタック４２３にプッシュする命令を発生する。このオブジェクト参照は、メソッドの実行の間にローカル変数ゼロとしてアクセス可能である。間接ポインタは、スタティックメソッド呼び出しに対して定義されたターゲットオブジェクトが存在しないのでスタティックメソッド呼び出しは利用不可能である。
【００５２】
渡される引数のリストは、呼び出しメソッドから呼び出されたメソッドへ情報を転送する。オブジェクト参照のように、渡される引数は命令によって生成されたJAVAコンパイラによりスタック４００上にプッシュされ、ローカル変数によってアクセスされ得る。JAVAコンパイラJAVAC（図２参照）は、現在メソッド４１０（図４Ａ）に対する引数のリストをスタティックに生成し、ハードウェアプロセッサ１００はリストから引数の数を求める。非スタティックメソッド呼び出しに対するオブジェクト参照がフレーム内に存在するとき、第１引数は、ローカル変数１としてアクセス可能である。スタティックメソッド呼び出しに対しては、第１引数がローカル変数ゼロになる。
【００５３】
６４ビット引数に対しては、一般の６４ビットエントリと同様に、上側の３２ビット、即ち６４ビットエントリの最上位３２ビットが、スタック４００の上側の位置に置かれる。即ちスタックの最下位にプッシュされる。例えば、６４ビットエントリがスタック４００の先頭にある時、６４ビットエントリの最上位３２ビット部分は、スタックの先頭にあり、６４ビットエントリの下位３２ビット部分は、スタック４００の先頭に隣接するストレージ位置に存在する。
【００５４】
現在メソッド４１０に対してスタック４００（図４Ａ）上のローカル変数エリアは割り当てられた一次変数ストレージ空間を表し、メソッド４１０の呼び出しの間有効である。JAVAコンパイラJAVAC（図２）は、必要なローカル変数の数をスタティックに決定し、ハードウェアプロセッサ１００はそれに従って一次変数ストレージ空間を割り当てる。
【００５５】
メソッドがハードウェアプロセッサ１００上で実行されている間、ローカル変数は、通常スタックキャッシュ１５５内に存在し、ポインタVARS（図１及び図４Ａ）からのオフセットとして処理される。このポインタVARSは、ローカル変数０の位置を指定するポインタである。ローカル変数の値をオペランドスタック４２３にロードし、オペランドスタックからローカル変数エリア４２１に値をストアするための命令が供給される。
【００５６】
実行環境４２２における情報には、呼び出しを行うメソッドコンテキストが含まれる。新たなフレームが現在メソッドのために構築されたとき、ハードウェアプロセッサ１００は呼び出しを行うメソッドコンテキストを新たに割り当てられたフレーム４１０にプッシュし、後にリターンが行われる前に呼び出しを行うメソッドコンテキストを再びストアするためにこの情報を利用する。ポインタFRAME（図１及び図４Ａ参照）は、現在メソッドの実行環境を指定するためのポインタである。ここに示す実施例においては、レジスタセット１４４（図１）のそれぞれのレジスタが３２ビットの幅を有する。
【００５７】
オペランドスタック４２３は現在メソッド内の仮想マシン命令の実行をサポートするために割り当てられる。プログラムカウンタレジスタPC（図１）は、次の命令のアドレス、例えば実行されるオペレーションのオペコードを含む。オペランドスタック４２３（図４Ａ）上の位置を用いて、命令実行のためのソースストレージ位置及びターゲットストレージ位置の双方を提供する仮想マシン命令のオペランドを格納する。オペランドスタック４２３のサイズは、JAVAコンパイラJAVAC（図２）にスタティックに決定され、ハードウェアプロセッサ１００はそれに従ってオペランドスタック４２３用の空間を割り当てる。レジスタOPTOP（図１及び図４Ａ）は、オペランドスタック４２３の先頭を指定するポインタを保持する。
【００５８】
呼び出されたメソッドは、その実行の結果を呼び出しを行ったスタックの先頭に戻し、従って呼び出しを行った側は、オペランドスタック参照を有するリターン値にアクセスできることになる。このリターン値は、オブジェクト参照又は引数がメソッドの呼び出しの前にプッシュされる領域に置かれる。
【００５９】
JAVA仮想マシン上でのシミュレーションの結果により、メソッド呼び出しは、実行時間の多くの部分を（２０〜４０％）を占めていることが分かった。仮想マシン命令の実行を促進するためのこの魅力的な目標が与えられたことにより、メソッド呼び出しのためのハードウェアサポートは、後に完全に説明するようにハードウェアプロセッサ１００に含められる。
【００６０】
新たに呼び出されたメソッドのスタックフレームの始まり、即ち呼び出した側によって渡される引数及びオブジェクト参照は、オブジェクト参照及び入ってくる引数が呼び出し側のスタックの先頭から来ているため、スタック４００上に既にストアされている。上に説明したように、スタック４００上のこれらの項目に後続して、ローカル変数がロードされ、次いで実行環境がロードされる。
【００６１】
このプロセスをスピードアップするための１つの方法は、ハードウェアプロセッサ１００がバックグラウンドで実行環境をロードし、それまでに何がロードされたかを、例えば単純な１ビットのスコアボードにより示すことである。ハードウェアプロセッサ１００は、例えスタック４００が完全にロードされていなくても、呼び出されたメソッドのバイトコードをできる限り速く実行しようとする。既にロードされた変数にアクセスがなされる場合、スタック４００のロードと実行がオーバーラップし、そうでない場合には、ハードウェアインターロックが生じ、ハードウェアプロセッサ１００が、ロードされるべき実行環境における変数を待つ状態となる。
【００６２】
図４Ｂに示すのはメソッド呼び出しを加速する他の方法である。スタック４００にメソッドフレーム全体をストアする代わりに、各メソッドフレームの実行環境が、メソッドフレームのオペランドスタック及びローカル変数エリアは別にストアされる。従って、この実施例では、スタック４００Ｂが改変されたメソッドフレーム、例えばローカル変数エリア４２１及びオペランドスタック４２３のみを有する改変されたメソッドフレーム４１０Ｂを含むことになる。メソッドフレームの実行環境４２２は、実行環境メモリ４４０にストアされる。実行環境メモリ４４０実行環境をストアすることにより、スタックキャッシュ１５５におけるデータ量が少なくなる。従って、スタックキャッシュ１５５のサイズを小さくすることができる。更に、実行環境メモリ４４０及びスタックキャッシュ１５５は同時にアクセスすることになる。従って、メソッド呼び出しは、スタック４００Ｂへのデータのロード又はストアと同時並行的に実行環境のロード又はストアを行うことにより加速できることになる。
【００６３】
スタック管理ユニット１５０の一実施例では、実行環境メモリ４４０のメモリアーキテクチャもスタック式である。改変型メソッドフレームがスタックキャッシュ１５５を介してスタック４００Ｂにプッシュされる時、対応する実行環境が実行環境メモリ４４０にプッシュされる。例えば、図４Ｂに示すような改変型メソッドフレーム０〜２は、スタック４００Ｂにあるので、実行環境（EE）０〜２はそれぞれ実行環境メモリ回路４４０にストアされる。
【００６４】
メソッド呼び出しを更に強化するために、実行環境キャッシュを追加して、メソッド呼び出しの間実行環境をセーブしたり取り出したりする速度を高めることができる。後により完全に説明するスタックキャッシュ１５５、ドリブル管理ユニット１５１、及びスタック４００のキャッシングのためのスタックコントロールユニット１５２に対するアーキテクチャも、実行環境メモリ４４０のキャッシングに適用することができる。
【００６５】
図４Ｃに示すのは、スタック４００Ｂ及び実行環境メモリ４４０の双方をサポートするように改変されたスタック管理ユニット１５０の実施例である。詳述すると、図４Ｃにおけるスタック管理ユニット１５０の実施例は、実行管理スタックキャッシュ４５０、実行環境ドリブル管理ユニット（execution environment dribble manager unit）４６０、及び実行管理スタック制御ユニット４７０を加えている。一般に、実行ドリブル管理ユニット４６０は、スピル（spill）オペレーション又はフィル（fill）オペレーションの間に、実行環境キャッシュ４５０と実行環境メモリ４４０との間で実行環境全体を転送する。
【００６６】
Ｉ／Ｏバス及びメモリインタフェースユニット
I/Oバス及びメモリインタフェースユニット１１０（図１）はインタフェースユニット１１０とも称し、ハードウェアプロセッサ１００と、実施例においては外部メモリを含み、所望に応じてハードウェアプロセッサ１００と同じチップ上のメモリストレージ及びインタフェース或いはその何れかを含み得るメモリ階層を実現する。この実施例においては、I/Oコントローラ１１１が外部I/Oデバイスに対してインタフェースし、メモリコントローラ１１２が、外部メモリに対してインタフェースする。ここで、外部メモリとは、ハードウェアプロセッサ１００の外部にあるメモリを意味する。しかし、外部メモリは、ハードウェアプロセッサ１００と同じチップ上に含められても良く、或いはハードウェアプロセッサ１００を含みチップの外部に設けられても良く、又はチップの内外双方に設けられても良い。
【００６７】
別の実施例では、I/Oデバイスに対するリクエストはメモリコントローラ１１２を通り、メモリコントローラ１１２はハードウェアプロセッサ１００を含むシステム全体のアドレスマップを保持する。この実施例のメモリバス上では、ハードウェアプロセッサ１００が唯一のマスタ（master）であり、メモリバスの使用を調整する必要はない。
【００６８】
従って、I/Oバス及びメモリインタフェースユニット１１０をインタフェースする入出力バスの別の実施例は、PCI、PCMCIA、又は他の標準的なバスに対する直接のサポートを提供する、サポーティングメモリマップスキームを含む。高速グラフィックス（w/VIS又は他の技術）は、所望に応じてハードウェアプロセッサ１００と同一のチップ上に含められ得る。
【００６９】
I/Oバス及びメモリインタフェースユニット１１０は、外部メモリに対する読み出し及び書き込みリクエストを発生する。詳述すると、インタフェースユニット１１０は、命令キャッシュ及びデータキャッシュコントローラ１２１及び１６１を外部メモリに対してインタフェースする。インタフェースユニット１１０は、命令キャッシュコントローラ１２１及びデータキャッシュコントローラ１６１からの内部リクエストに対する管理ロジックを含み、これによって外部メモリにアクセスし、リクエストに応じてメモリバス上の外部メモリに対する読み出し又は書き込みリクエストの何れかを開始するデータキャッシュコントローラ１２１からのリクエストは、常に命令キャッシュコントローラ１６１からのリクエストに対して高いプライオリティを持つものとして取り扱われる。
【００７０】
インタフェースユニット１１０は、リクエストしている命令キャッシュコントローラ１２１又はデータキャッシュコントローラ１６１に対して、読み出しサイクルの間に肯定応答信号を供給し、リクエストしているコントローラがそのデータをキャッチできるようにする。書き込みサイクルにおいては、インタフェースユニット１１０からの肯定応答信号は、フローコントロールのために用いられ、リクエストしている命令キャッシュコントローラ１２１又はデータキャッシュコントローラ１６１は、ペンディングが生じている場合新たなリクエストを発生しない。インタフェースユニット１１０は又、メモリバス上で外部メモリに対して発生されたエラーも取り扱う。
命令キャッシュユニット
命令キャッシュユニット（ICU）１２０（図１）は、命令キャッシュ１２５から仮想マシン命令をフェッチして、その命令を命令デコードユニット１３０に供給する。この実施例においては、命令キャッシュヒット時に、命令キャッシュコントローラ１２１が、１サイクルにおいて、命令キャッシュ１２５から命令を命令バッファ１２４に転送し、そこでこの命令は定数実行ユニットIEU（後に完全に説明する）が命令を処理できるようになるまで保持する。これによって、ハードウェアプロセッサ１００におけるパイプライン３００（図３）のフェッチ段階３０１と残りの段階とが分離される。命令−バッファタイプの編成をサポートする複雑さを避けることが望ましくないならば、１命令レジスタが大抵の目的に十分である。しかし、後に説明するように、命令のフェッチング、キャッシング、及びバッファリングは、命令フォールディング処理をサポートできるだけの十分な命令バンド幅を提供するべきである。
【００７１】
ハードウェアプロセッサ１００のフロントエンドは、ハードウェアプロセッサ１００の残りの部分から完全に独立している。理想的には、１サイクルあたり１命令が実行パイプラインに供給される。
【００７２】
この命令は、命令デコードユニット１３０からの信号に応じてバイトアライナ回路１２２により任意の８ビット境界の上に位置あわせされる。従って、ハードウェアプロセッサ１００のフロントエンドは、任意のバイト位置からのフェッチングを効果的に取り扱うことができる。同様に、ハードウェアプロセッサ１００はキャッシュ１２５の複数のキャッシュラインに渡る命令の問題を処理する。この場合、オペコードが常に最初のバイトであるため、オペランドに対するフェッチ支援の余分な処理サイクルを保養できる。従って、バイトコードのフェッチングと実行との間の非常に単純な非干渉化が可能となる。
【００７３】
命令キャッシュミスの場合には、命令キャッシュコントローラ１２１が、I/Oバスとメモリインタフェースユニット１１０にミスとなった命令の外部メモリリクエストを生成する。命令バッファ１２４が空であるか、ほとんど空である場合には、命令キャッシュミスが生じたとき、命令デコードユニット１３０が機能停止する。即ちパイプライン３００が機能停止する。詳述すると、命令キャッシュコントローラ１２１はキャッシュミス時に機能停止信号を発生し、これは命令バッファエンピティ信号と共にパイプライン３００を機能停止するか否かを決定するために用いられる。命令キャッシュ１２５は自己修正コードを受け入れるべく無効にすることができる。例えば、命令キャッシュコントローラ１２１が命令キャッシュ１２５における特定のラインを無効にすることができる。
【００７４】
従って、命令キャッシュコントローラ１２１はフェッチされるべき次の命令を決定する。即ち命令キャッシュ１２５におけるアクセスされることが必要な命令を決定し、命令キャッシュ１２５におけるデータ及びタグRAMに対するアドレス、データ、及びコントロール信号を発生する。キャッシュヒット時には、４バイトのデータが１つの処理サイクルの間に命令キャッシュ１２５からフェッチされ、命令バッファ１２４には最大４バイトを書き込むことができる。
【００７５】
バイトアライナ回路１２２は、命令キャッシュRAMからのデータを位置合わせし、位置合わせされたデータを命令バッファ１２４に入れる。後に詳細に説明するように、命令バッファ１２４における初めの２バイトがデコードされて、仮想マシン命令の長さが決定される。命令バッファ１２４はキューにおける有効な命令を追跡し、エントリを更新する。これについては後に詳細に説明する。
【００７６】
命令キャッシュコントローラ１２１も、データ経路及び命令キャッシュミスを処理するための制御を提供する。命令キャッシュミスの発生時には、命令キャッシュコントローラ１２１は、I/Oバス及びメモリインタフェースユニット１１０にキャッシュフィルリクエストを発生する。
【００７７】
外部メモリからデータを受け取ったとき、命令キャッシュコントローラ１２１はそのデータを命令キャッシュ１２５に書き込み、そのデータは又命令バッファ１２４にバイパスされる。データは、それが外部メモリから利用可能になるとすぐに、又キャッシュフィルが終了する前に命令バッファ１２４にバイパスされる。
【００７８】
命令キャッシュコントローラ１２１は、命令バッファ１２４が一杯になるか、分岐又はトラップが生ずるまで、連続したデータをフェッチし続ける。一実施例においては、命令バッファ１２４は命令バッファ１２４に８バイト以上の有効エントリが存在する場合、一杯になっていると見なされる。従って、一般に８バイトのデータが命令キャッシュユニット１２０によってインタフェースユニット１１０に送られたキャッシュフィルリクエストに応じて外部メモリから命令キャッシュ１２５に書き込まれる。命令キャッシュミスの処理中に分岐又はトラップが生じた場合は、ミスの処理が終了した直後にトラップ又は分岐が実行される。
【００７９】
命令キャッシュフィルの発生時にエラーが生じたときには、フォールト表示が生成され、仮想マシン命令と共に命令バッファ１２４にストアされる。即ちフォールトビットがセットされる。このラインが命令キャッシュ１２５には書き込まれない。従って、誤りキャッシュフィルトランザクションはフォールトビットがセットされる点を除いてキャッシュ不可能なトランザクションのような役目を果たす。この命令がデコードされた時、割り込みが実行される。
【００８０】
命令キャッシュコントローラ１２１もキャッシュ不可能な命令読み出しを提供する。レジスタセット１４４内のプロセッサステータスレジスタにおける命令キャッシュイネーブル（ICE）ビットが、ロードがキャッシュされ得るか否かを定めるために用いられる。命令キャッシュイネーブルビットがクリアされた場合には、命令キャッシュユニット１２４が全てのロードオペレーションをキャッシュ不可能なロードとして取り扱う。命令キャッシュコントローラ１２１は、キャッシュ不可能な命令のためにインタフェースユニット１１０にキャッシュ不可能なリクエストを発行する。データがキャッシュ不可能な命令のためにキャッシュフィルバス上で利用可能である時、このデータは命令バッファ１２４にバイパスされ、命令キャッシュ１２５には書き込まれない。
【００８１】
この実施例において、命令キャッシュ１２５は直接マッピングされる、８バイトラインサイズのキャッシュである。命令キャッシュ１２５は１サイクルの遅延を有する。このキャッシュサイズは０K、１K、２K、４K、８K、及び１６Kバイトサイズに構成されている。ここでKはキロを意味する。デフォルトサイズは４Kバイトである。各ラインはそのラインが関係するキャッシュタグエントリを有する。デフォルトの４Kバイトサイズでは、それぞれのキャッシュタグは、２０ビットのアドレスタグフィールド及び１つの有効ビットを有する。
【００８２】
命令バッファ１２４は、この実施例においては、１２バイトの深さのFIFOバッファであって、性能上の理由からフェッチ段階３０１（図３）をパイプライン３００の残りの段階から分離している。バッファ１２４（図１）におけるそれぞれの命令は関連する有効ビット及びエラービットを有する。この有効ビットがセットされている時、その有効ビットに関連する命令は、有効な命令である。エラービットがセットされている時、そのエラービットが関連する命令のフェッチはエラーの処理であった。命令バッファ１２４はデータを命令バッファ１２４とやり取りする信号を発生し、命令バッファ１２４における有効エントリ、即ちセットされた有効ビットを追跡する命令バッファコントロール回路（図示せず）を有する。
【００８３】
類似した実施例において、所定のサイクルにおいて４バイトを命令バッファ１２４に読み込ませることができる。最大２つの仮想マシン命令を表す最大５バイトは、所定のサイクルで命令バッファ１２４から読み出すことができる。別の実施例では、複数のバイトの仮想マシン命令をフォールディング処理したり、或いは２以上の仮想マシン命令のフォールディングをすることにより、より大きい入出力のバンド幅が提供される。当業者は、例えば位置あわせロジック、環状バッファ等を含む様々な適当な命令バッファの設計を理解されよう。分岐又は割り込みが生じた時、命令バッファ１２４における全てのエントリはヌル化され、分岐／割り込みデータは命令バッファ１２４の先頭に移動する。
【００８４】
図１の実施例においては、統合型実行ユニット１４０が示されている。しかし、他の実施例では、命令デコードユニット１２０、整数ユニット１４２、及びスタック管理ユニット１５０は、１つの整数実行ユニットと考えられ、浮動小数点実行ユニット１４３は別のオプションのユニットである。更に別の実施例では、実行ユニットにおける様々な要素が、他のプロセッサの実行ユニットを用いて実現され得る。一般に、図１の様々なユニットに存在する様々な要素は、一実施例のみの典型的な例である。それぞれのユニットは、図示された要素の全て又はその一部を用いて実現され得る。設計上の決定は、価格と性能のトレードオフに基づいて行われる。
【００８５】
命令デコードユニット
上述したように、仮想マシン命令はパイプライン３００のデコード段３０２（図３）においてデコードされる。典型的な実施例では、２バイトが、２つの仮想マシン命令に対応することができ、命令バッファ１２４（図１）からフェッチされる。２バイトは並列にデコードされ、２バイトが２つの仮想マシン命令、例えば、１つの等価な演算にフォールディングされることができる、第１のロードトップスタック命令及び第２のアドトップ２スタックエントリ命令、に対応するか否かを判定される。フォールディングは、２つ或いは３つ以上の仮想マシン命令に対応する１つの等価な演算を供給することである。
【００８６】
典型的なハードウエアプロセッサ１００の実施例では、１バイト第１命令が第２命令にフォールディングされる。しかしながら、別の実施例は、命令デコーダの複雑化及び命令バンド幅の増加という損失はあるものの、２つより多い仮想マシン命令、例えば２〜４仮想マシン命令、並びに多数バイト仮想マシン命令のフォールディングを提供する。本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０３６にて同じ日に出願された、「INSTRUCTION FOLDING FOR A STACK-BASED MACHINE」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay and James Michael O'Connor）を参照されたい。これを参照して、全体をここに組み込んでいる。典型的なプロセッサ１００の実施例では、第１バイトが、第１の仮想マシン命令に対応し、多数バイト命令であるなら、第１及び第２の命令はフォールディングされない。
【００８７】
付加的な現在オブジェクトローダフォルダ１３２は、上記の、さらにより詳細には本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０３６にて同じ日に出願された、「INSTRUCTION FOLDING FOR A STACK-BASED MACHINE」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay and James Michael O'Connor）に記載されており、参照して全体をここに組み込んでいるような、命令フォールディングを、シミュレーション結果が特に頻繁に、それゆえ最適化のための所望のターゲットになるように示される仮想マシン命令シーケンスにおいて利用する。特に、メソッド呼出し（method invocation）は一般的に、スタックオペランド上の対応するオブジェクトに対するオブジェクトリファレンスをロードし、そのオブジェクトからフィールドをフェッチする。命令フォールディングにより、ほとんど共通の仮想マシン命令シーケンスが、等価的にフォールディングされた演算を用いて実行されるようになる。
【００８８】
高速型命令（quick variant）は、仮想マシン命令セットの一部ではなく（付録Ｉの第３章を参照されたい）、ＪＡＶＡ仮想マシンインプリメンテーリョンの外側には現れない。しかしながら、仮想マシンインプリメンテーリョンの内側では、高速型命令は有効に最適化されいることがわかる（本明細書の不可欠な部分である、付録Ｉの付録Ａを参照されたい）。非高速−高速翻訳（quick translator）キャッシュ１３１において、種々の命令を高速型命令に更新するための書込みをサポートすることにより、通常の仮想マシン命令は高速仮想マシン命令に変更され、高速型命令によりもたらされる大きな利点を利用することができる。特に、より詳細に、本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０３９にて同じ日に出願された、NON-QUICK INSTRUCTION ACCELERATOR AND METHOD OF IMPLEMENTING SAMEというタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Mark Tremblay and James Michael O'Connor）に記載されており、参照して全体をここに組み込んでいように、命令の実行を開始するために必要とされる情報が初めにアセンブルされているとき、その情報は非高速−高速翻訳キャッシュ１３１におけるタグとしてプログラムカウンタＰＣと共にキャッシュ内にストアされ、その命令は高速型命令として識別される。１つの実施例では、これが自己修飾コード（self-modifying code）を用いて行われる。
【００８９】
その命令の後続呼出しにおいて、命令デコードユニット１３０は、その命令が高速型命令として識別され、実際、非高速−高速翻訳キャッシュ１３１の命令の実行を開始するために必要とされる情報を回収するということを検出する。非高速−高速翻訳キャッシュはハードウエアプロセッサ１００の付加的な機構である。
【００９０】
分岐に関しては、ほとんどのインプリメンテーリョンに対して高速分岐分解を有する非常に短いパイプで十分である。しかしながら適切で簡単な分岐予測機構、例えば分岐予測回路１３３を別に導入することができる。分岐予測回路１３３に対するインプリメンテーリョンは、オペコードに基づく分岐、オフセットに基づく分岐、或いは２ビットカウンタ機構に基づく分岐を含む。
【００９１】
ＪＡＶＡ仮想マシン仕様は、実行の際にメソッドを呼出す、命令invokenonvirtual、オペコード１８３を定義する。そのオペコードには、インデクスバイト１及びインデクスバイト２が後続する（付録Ｉ参照）。オペランドスタック４２３は、この命令が実行されるとき、１つのオブジェクトに対する１つのリファレンス及びいくつかの数の引数（argument）を含む。
【００９２】
インデクスバイト１及び２は、現在クラスのコンスタントプール内にインデクスを発生させるために用いられる。そのインデクスにおけるコンスタントプール内の項目は、完全なメソッドシグネチャ及びクラスを指示する。シグネチャは付録Ｉにおいて定義され、その記載は参照してここに組み込んでいる。
【００９３】
メソッドシグネチャ、すなわち各メソッドに対する、短い、固有の識別子は、指示されるクラスのメソッドテーブルにおいて探索される。その探索（lookup）の結果は、メソッドのタイプとそのメソッドに対する引数の数を示すメソッドブロックである。オブジェクトリファレンス及び引数は、このメソッドのスタックからポップされ、新しいメソッドのローカル変数の初期値になる。その後実行が新しいメソッドの第１の命令を用いて再開される。実行の際に、命令invokevirtual、オペコード１８２及びinvokestatic、オペコード１８４は、まさに記載された処理と同様の処理を呼出す。各場合に、ポインタがメソッドブロックを探索するために用いられる。
【００９４】
メソッド引数キャッシュ１３４は、ハードウエアプロセッサ１００の付加的な機構でもあり、第１の実施例において、タグとなるそのメソッドブロックに対するポインタと共に、そのメソッドに対する第１の呼出し後に用いるためのメソッドのメソッドブロックをストアするために用いられる。命令デコードユニット１３０は、インデクスバイト１及び２を用いてポインタを発生させ、その後ポインタを用いてキャッシュ１３４におけるそのポインタに対するメソッドブロックを回収する。これにより、後続するメソッドの呼出しにおいて、背景内でより迅速に新たに呼出されるメソッドに対するスタックフレームを構築することができるようになる。別の実施例は、キャッシュ１３４内のリファレンスとして、プログラムカウンタ或いはメソッド識別子を用いることもある。もしキャッシュミスがあるなら、その命令は通常の形態において実施され、キャッシュ１３４は適宜更新される。どのキャッシュエントリが上書きされるかを判定するために用いられる特定の処理は本発明の本質的面ではない。例えば、ごく最近用いられている判定基準がインプリメントされることができる。
【００９５】
別の実施例では、メソッド引数キャッシュ１３４が、タグとなるそのプログラムカウンタＰＣの値と共に、そのメソッドに対する第１の呼出し後に用いるために、そのメソッドブロックに対するポインタをストアするために用いられる。命令デコードユニット１３０は、プログラムカウンタＰＣの値を用いて、キャッシュ１３４にアクセスする。プログラムカウンタＰＣの値がキャッシュ１３４内のタグの１つに等しければ、キャッシュ１３４は、命令デコードユニット１３０に対するそのタグを用いてストアされたポインタを供給する。命令デコードユニット１３９は、供給されたポインタを用いて、そのメソッドに対するメソッドブロックを回収する。これらの２つの実施例から見て、他の別の実施例が当業者には、明らかになるであろう。
【００９６】
ワイドインデクスフォワーダ１３６は、ハードウエアプロセッサ１００の付加構成要素であり、命令wideに対する命令フォールディングの特定の具体例である。ワイドインデクスフォワーダ１３６は、直後に後続する仮想マシン命令に対するインデクスオペランドの拡張をエンコードするオペコードを取り扱う。このようにして、ワイドインデクスフォワーダ１３６により、命令デコードユニット１３０は、ローカル変数の数が命令wideに対する別々の実行サイクルを招くことなく、１つバイトインデクスを用いてアドレス指定可能な数を越えるとき、ローカル変数記憶装置４２１内に誘導することができる。
【００９７】
命令デコーダ１３５、特に命令フォールディング、非高速−高速翻訳キャッシュ１３１、現在オブジェクトローダフォルダ１３２、分岐予測部１３３、メソッド引数キャッシュ１３４並びにワイドインデクスフォワーダ１３６の態様は、これらの構成要素がソフトウエアインタプリタ或いはジャストインタイムコンパイラの演算を促進するために用いることができるため、ソフトウエアインタプリタ或いはジャストインタイムコンパイラを利用するインプリメンテーリョンにおいても有用である。そのようなインプリメンテーリョンでは、一般的に、仮想マシン命令はインタプリタ或いはコンパイラを実行するプロセッサ、すなわち例えばＳｕｎ社製プロセッサ、ＤＥＣ社製プロセッサ、Ｉｎｔｅｌ社製プロセッサ或いはＭｏｔｏｒｏｌａ社製プロセッサの任意の１つ対する命令に翻訳され、その構成要素の演算はそのプロセッサ上の実行をサポートするように変更される。仮想マシン命令から他のプロセッサ命令への翻訳は、ＲＯＭ内の翻訳部、或いは単にソフトウエア翻訳部のいずれかを用いて行われる。デュアル命令セットプロセッサのさらなる例としては、本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０４２にて同じ日に出願された、「A PROCESSOR FOR EXECUTING INSTRUCTION SETSRECEIVED FROM A NETWORK OR FROM A LOCAL MEMORY」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay and James Michael O'Connor）を参照されたい。これを参照して、全体をここに組み込んでいる。
【００９８】
上に説明したように、プロセッサ１００の一実施例は、プロセッサ１００の性能を高める命令フォールディング処理を実現する。一般に、本発明による命令フォールディング処理は、例えば、ハードウェアプロセッサのインプリメンテーション、ソフトウェアインタプリタのインプリメンテーション、ジャストインタイムコンパイラのインプリメンテーション等を含むスタックベースの仮想マシンインプリメンテーションにおいて利用され得る。従って、命令フォールディング処理のさまざまな実施例について以下ハードウェアプロセッサを用いた実施例で詳細に説明するが、当業者は、この説明を参照して、命令フォールディング処理の、他のスタックベースの仮想マシンインプリメンテーションへの適切な拡張を理解されよう。
【００９９】
図７には、本発明の原理に基づく、第１スタック命令及び第２スタック命令のフォールディング処理された実行が示されている。この実施例において、スタック７１０の先頭エントリであるトップオブスタック（TOS）エントリ７１１aには、加算命令のための第１オペランドが存在している。第２オペランドは、スタック７１０のエントリ７１２に存在している。エントリ７１２がトップオブスタックエントリ７１１aの物理的に隣の位置に存在しておらず、スタック７１０の内部に存在していることに注意されたい。命令ストリームは、第２オペランドをスタックの先頭にプッシュするためのロードトップオブスタック命令（付録Iの命令iloadの説明を参照）及びスタック７１０の最上部の２つのエントリに存在する第１及び第２オペランドに作用する加算命令（付録Iの命令iaddの説明を参照）を含む。しかし、命令ストリームの実行速度を上げるために、ロードトップオブスタック命令及び加算命令は１つのオペレーションにフォールディングされ、これによりロードトップオブスタック命令の明示的で連続的な実行と関連実行サイクルが取り除かれることになる。その代わりに、加算命令に対応するフォールディング済オペレーションは、スタック７１０のTOSエントリ７１１a及びエントリ７１２に存在する第１及び第２オペランドに作用する。フォールディング処理済オペレーションの演算結果はスタック７１０のTOSエントリ７１１bにプッシュされる。従って、本発明の原理によるフォールディング処理により、計算能力を、同じ命令シーケンスの実行をフォールディングしないで行う場合と比較して高めることができる。
【０１００】
命令フォールディング処理を行わない場合は、加算命令の第１オペランドは、スタック６１０（図６参照）の先頭であるトップオブスタック（TOS）エントリ６１１aに存在する。第２オペランドは、スタック６１０のエントリ６１２に存在する。ロードトップオブスタック命令は、この第２オペランドをスタック６１０のトップにプッシュし、通常実行サイクルを要求する。このプッシュにより第２オペランド及び第１オペランドはそれぞれTOSエントリ６１１bと（TOS-1）エントリ６１３に存在することになる。このため、加算命令は、別の実行サイクルにて、スタックアーキテクチャの意味論に基づき、スタック６１０の最上位の２つのエントリ、即ちTOSエントリ６１１b及び（TOS-1）エントリ６１３に適切に存在する第１及び第２オペランドに作用する。加算命令の演算結果は、スタック６１０のTOSエントリ６１１cにプッシュされ、加算命令の実行が終わった後、この演算結果は第１及び第２オペランドデータがスタック６１０にプッシュされなかったかのような状態となる。上述のように、フォールディング処理により加算処理を完逐するのに必要な実行サイクルが減り、命令ストリームの実行速度が高められる。更に複雑なフォールディング処理、例えばストア命令のフォールディング処理及びより多くの数の命令を含むフォールディング処理については以下に詳細に説明する。
【０１０１】
一般に、命令デコードユニット１３０（図１）は、命令のストリームにおける複数の命令を検証する。命令デコードユニット１３０は第１の命令及び第２の隣接する命令を共にフォールディングし、命令デコードユニット１３０が第１及び第２命令が構造的な独立性もソースからの独立性も有しておらず、第２命令が第１命令によって供給されたデータに作用することを検出した時、実行ユニット１４０によって実行するための１つの等価なオペレーションを供給する。１つのオペレーションの実行により、実行サイクルが取り除かれた点を除いて第１命令に相当するオペレーションの実行の後、第２命令に相当するオペレーションの実行が行われた場合と同じ結果が得られる。
【０１０２】
上述のように、JAVA仮想マシンはスタックベースで、命令セット、レジスタセット、オペランドスタック、及び実行環境を特定する。本発明はJAVA仮想マシンに関連して説明されているが、当業者は、本発明がJAVA仮想マシン命令を実現する実施例や、或いはJAVA仮想マシン命令に関連する実施例に限定されず、仮想的なもの及び物理的なものの双方の様々なスタックマシン環境に対するシステム、もの、方法、及び装置を含むことを理解されよう。
【０１０３】
図４Ａに示すように、JAVA仮想マシン使用に従って、各メソッドは、オペランドスタック及びローカル変数の組に対して割り当てられたストレージを有する。同様に、図８の実施例（図４Ａも参照）においては、一連のメソッドフレーム、例えばスタック８０３上のメソッドフレーム８０１及びメソッドフレーム８０２がそれぞれJAVAプログラムの実行経路に沿って呼び出される各メソッドに対するオペランドスタックインスタンス、ローカル変数ストレージインスタンス、及びフレームステート情報インスタンスを含む。メソッドが呼び出される度に新たなフレームが生成され現在フレームとなり、メソッドの実行が終了するとそれは破壊される。そのメソッドが別のメソッドを呼び出す場合、フレームは現在フレームであることをやめる。メソッドが戻されたとき、現在フレームはそのメソッド呼び出しの結果があればそれをスタック８０３を介して前フレームに戻す。次いで現在フレームは廃棄され、前フレームが現在フレームとなる。本発明に基づくフォールディング処理については後に完全に説明するが、フレームのようなメソッドのためのメモリ空間を割り当てたり定義するために用いられる特定の処理から独立しており、一般にスタックベースのアーキテクチャにおいて使用することができる。
【０１０４】
この一連のメソッドフレームは、例えばレジスタ／キャッシュ／メモリ階層を含む様々な適切なメモリ階層の任意のものにおいて実現され得る。しかし、選択されたメモリ階層に関わりなく、オペランドスタックインスタンス８１２（図８）は、ランダムにアクセス可能なストレージ８１０においてインプリメントされる。即ち、オペランドスタックインスタンス８１２のエントリの少なくとも一部には、オペランドスタックインスタンス８１２の先頭以外の位置からもアクセス可能である。これはスタックの先頭エントリ或いは先頭のエントリにのみアクセス可能な従来のスタックインプリメンテーションとは対照的である。上述のように、レジスタOPTOPは、現在メソッドが関係するオペランドスタックインスタンス８１２の先頭を指定するポインタを格納する。レジスタOPTOPに格納された値は、現在メソッドに対応するオペランドスタックインスタンスの先頭エントリが指定されている状態を維持する。
【０１０５】
加えて、現在メソッドに対するローカル変数は、ランダムにアクセス可能なストレージ８１０において表現される。レジスタVARSにストアされたポインタは、現在メソッドが関係するローカル変数ストレージインスタンス８１３の開始アドレスを特定する。レジスタVARSの値は、現在メソッドに対応するローカル変数ストレージインスタンスのベースアドレスを特定した状態を維持される。
【０１０６】
オペランドスタックインスタンス８１２及びローカル変数ストレージインスタンス８１３におけるエントリは、それぞれレジスタOPTOP及びVARSに表された値のインデクシングオフ（indexing off）により参照される。これらのレジスタOPTOP及びVARSは、図１の実施例において、レジスタセット１４４に含められ、図８の実施例においては、ポインタレジスタ８２２に含められている。ポインタレジスタ８２２は、JAVA仮想マシンを実現するプロセッサの物理的レジスタにおいて表されるが、若しくは所望に応じてランダムにアクセス可能なストレージ８１０において表され得る。好適実施例において、一般に使用されるオフセットOPTOP-1、OPTOP-2、VARS+1、VARS+2、及びVARS+3は、それぞれレジスタOPTOP及びVARSから誘導される。別の形態では、追加のオフセットがポインタレジスタ８２２にストアされ得る。
【０１０７】
現在メソッドが関係するオペランドスタックインスタンス８１２及びローカル変数ストレージインスタンス８１３は、好ましくはフラットな６４エントリキャッシュ、例えばその内容が更新し続けられ、オペランドスタック及びローカル変数ストレージエントリの機能している組がキャッシュされることになるようなスタックキャッシュ１５５（図１参照）において表現される。しかし、現在フレームのサイズに応じて、オペランドスタックインスタンス８１２及びローカル変数ストレージインスタンス８１３を含む現在フレームはキャッシュにおいて全体的に或いは部分的に表され得る。現在フレーム以外のフレームに対するオペランドスタック及びローカル変数ストレージエントリも、空間があればキャッシュ内に表され得る。本発明のフォールディング処理に使用するために適切なキャッシュの適切な表現は、Mark Tremblay及びJames Michael O'Connorを発明者とし、本発明の譲受人に譲渡された、METHODS AND APPARATI FOR STACK CACHINGなる名称の米国特許出願においてより詳細に説明されている。上述の特許出願と共に、発明者を同じくし本発明の譲受人に譲渡されたMETHOD FRAME STORAGE USING MULTIPLE MEMORY CIRCUITSなる名称の米国特許出願も同様に参照されたい。しかし、分離された、キャッシュされない、或いはその両方のオペランドスタック及びローカル変数ストレージエリアを含む他の表現も適応可能である。
【０１０８】
メソッドフレーム及びそれらの関係するオペランドスタック及びローカル変数ストレージインスタンスに加えて定数エリア８１４がJAVA仮想マシンをインプリメントするプロセッサのアドレス空間内に設けられる。これは共通に使用される定数、例えば命令iconstのようなJAVA仮想マシン命令により指定された定数のための領域である。場合によっては、オペランドソースがインデクスとして定数エリア８１４に表される。図８の実施例では、定数エリア８１４がランダムにアクセス可能なストレージ８１０において表されている。所望に応じて、定数エリア８１４のエントリも例えばスタックキャッシュ１５５にキャッシュされ得る。
【０１０９】
当業者は各メソッドに対するオペランドスタック及びローカル変数ストレージインスタンスを保持することの利点を、スタック指向の構造におけるオペランドスタック及びローカル変数ストレージの様々なインスタンスを維持することによって生成されるパラメータ及び演算結果を渡すための機会の利点と共に理解されようが、以下の記述は、それぞれが現在メソッドに関連する特定のインスタンス（オペランドスタックインスタンス８１２及びローカル変数ストレージインスタンス８１３）に焦点をあてたものである。以下、オペランドスタック及びローカル変数ストレージのこれら特定のインスタンスを、単にオペランドスタック８１２及びローカル変数ストレージ８１３と称する。説明のための単純化を行ってはいるが、当業者は、オペランドスタック８１２及びローカル変数ストレージ８１３は、インスタンスを結合して複合表現にする表現及び各メソッドに対する個別のインスタンスを維持する表現を含む、現在メソッドが関係するオペランドスタック及び変数ストレージの任意のインスタンスを意味することを理解されよう。
【０１１０】
JAVA仮想マシン命令に対するオペランドソース及び演算結果ターゲットは、通常オペランドスタックインスタンス８１２又はローカル変数ストレージインスタンス８１３のエントリを特定する。即ちそれらは現在メソッドに対するオペランドスタック及びローカル変数ストレージのエントリを特定する。１例として、限定を意図するものではないが、代表的なJAVA仮想マシン命令は、付録Iに含められるJAVA仮想マシン使用の第３章に記述されている。
【０１１１】
JAVA仮想マシン命令はオペランド及び演算結果の行先の双方を明示的に示すことは滅多にない。代わりに、ソース又は行先の何れかはオペランドスタック８１２の先頭に暗示的に示されている。JAVAバイトコードのいくつかはソース及び行先の何れも明示的に示さない。例えば、命令iconst_0は、定数である整数０をオペランドスタック８１２にプッシュする。この定数０は、命令内に暗示されているが、命令は０オペランドに対するソースとして、定数エリア８１４のような定数のプールから値０の表現を用いて特定のJAVA仮想マシンインプリメンテーションによって実際に実現され得る。命令iconst_0をこのように実現するJAVA仮想マシンインプリメンテーション用の命令デコーダは、ソースアドレスとして定数０が表現される定数エリア８１４のエントリのインデクスを発生し得る。
【０１１２】
（ｐ２４ｃ）現在メソッドが関係するオペランドスタック及びローカル変数ストレージ構造に焦点を当て、図９Ａ〜図９Ｄを参照すると、JAVA仮想マシン定数加算命令iaddは、第１及び第２整数オペランド（それぞれオペランド１及びオペランド２と称する）の合計を発生する。これらのオペランドはオペランドスタック８１２の最上部の２つの位置に存在する。この最上部の２つの位置は、命令iaddの実行時に、レジスタOPTOPにおけるポインタOPTOP及びポインタOPTOP-1によって特定される。命令iaddの実行の結果、即ち第１及び第２整数オペランドの合計はオペランドスタック８１２にプッシュされる。
【０１１３】
図９Ａに示すのは、一対のJAVA仮想マシン整数ロード命令iloadの実行の前に、第１及び第２値（値１及び値２とも称される）を含むオペランドスタック８１２及びローカル変数ストレージ８１３の状態である。図９Ａにおいて、ポインタOPTOPは値AAC0hを有する。
【０１１４】
図９Ｂは、一対の命令iload（ローカル変数ストレージ８１３からの整数をオペランドスタック８１２にロードする命令）の実行の後のオペランドスタック８１２である。命令の実行時には、レジスタVARSにおけるポインタVARS及びポインタVARS+2により特定された位置からの値１及び値２が位置AAC4hにあるオペランド１及び位置AAC8hにあるオペランド２としてオペランドスタック８１２にプッシュされ、処理中にポインタOPTOPが値AAC8hに更新される。図９Ｃに示すのは命令iaddが実行された後のオペランドスタック８１２の状態である。命令iaddの実行によりオペランド１及びオペランド２がオペランドスタック８１２からポップされ、オペランド１とオペランド２の合計が計算されて、その合計値がAAC4hの位置にあるオペランドスタック８１２にプッシュされる。命令iaddの実行の後、ポインタOPTOPは値AAC0hを有し、その合計値をストアしているオペランドスタック８１２のエントリを指定する。
【０１１５】
図９Ｄは、命令istoreが実行された後のオペランドスタック８１２の状態を示した図である。命令istoreの実行により、オペランドスタック８１２から合計値がポップされ、その合計値がポインタVARS+2によって特定される位置のローカル変数ストレージ８１３のエントリにストアされる。
【０１１６】
オペランドをオペランドスタック８１２にプッシュしたりオペランドスタック８１２のトップに存在する値に作用する他の命令に対する変数は、当業者には明らかであろう。例えば、多数のオペランドスタック８１２エントリを要求するデータタイプの為の及び別のオペレーションのための変数、例えば倍長整数値や倍精度浮動小数点値等はここに開示される内容を参照すれば当業者には明らかであろう。
【０１１７】
図１０Ａ〜図１０Ｃのフォールディング処理の例は、図９Ａ〜図１０Ｄを参照して説明したものと類似しているが、ここではロードのフォールディング処理のみが説明されている。JAVA仮想マシン配列長命令arraylengthを実行することにより、そのオブジェクト参照ポインタobjectrefがオペランドスタック８１２のトップにあり。オペランドスタック８１２に長さをプッシュする配列長が決定される。図１０Ａに示すのは、ローカル変数ストレージ８１３からのオブジェクト参照をオペランドスタック８１２のトップにロードするのに用いられるJAVA仮想マシン参照ロード命令aloadの実行の後のオペランドスタック８１２及びローカル変数ストレージ８１３の状態を示した図である。図１０Ａにおいて、ポインタOPTOPは値AAC0hを有する。
【０１１８】
図１０Ｂは、命令aloadの実行により、オブジェクト参照ポインタobjectrefがオペランドスタック８１２のトップにプッシュ即ちコピーされ、処理中にポインタOPTOPがAAC4hに更新された後のオペランドスタック８１２の状態を示した図である。
【０１１９】
図１０Ｃは、命令arraylengthが実行された後のオペランドスタック８１２の状態である。命令arraylengthの実行により、オブジェクト参照ポインタobjectrefがオペランドスタック８１２からポップされ、これによって参照された配列の長さが計算され、その長さがオペランドスタック８１２にプッシュされる。この命令arraylengthの適切なインプリメンテーションにより、オブジェクト参照ポインタobjectrefを実行ユニット例えば実行ユニット１４０に供給することができる。この実行ユニットはオブジェクト参照ポインタobjectrefに値の長さを続けて書き込む。オブジェクト参照ポインタobjectrefがオペランドスタック８１２からポップされても、或いは単にオーバーライトされても、命令arraylengthの実行の後に、ポインタOPTOPは値AAC4hを有し、値の長さをストアするオペランドスタック８１２のエントリを指定している。
【０１２０】
図１１は、プロセッサ１１００を示した図であり、このプロセッサ１１００では、図９Ａ及び図９Ｂ及び図１０Ａ及び図１０Ｂに示すようなロード処理が後続の命令の実行、例えば後続する命令iadd又は命令arraylengthにフォールディング処理で一体化される。このようにして、命令iaddについてはオペランド１及びオペランド２、命令arraylengthについてはポインタobjectrefのオペランドスタック８１２のトップへのローディングの関係する直後の実行サイクルが取り除かれ得る。この結果、JAVA仮想マシン命令のグループ、例えば命令iload、aload、iadd、及びistore、又は命令aload及びarraylengthのグループの１サイクルでの実行がプロセッサ１１００により行われる。プロセッサ１１００の一実施例はハードウェアプロセッサ１００として図１に提示されている。しかし、ハードウェアプロセッサ１１００は、ハードウェアプロセッサ１００の様々な最適化を含まない他の実施例も包含している。更に、以下に説明するフォールディング処理は、ソフトウェアインタプリタ、又は内部に含められたジャストインタイムコンパイラにおいても実現され得る。図１１のプロセッサ１１００の実施例においては、図９Ｄに示されているようなストアが前の命令の実行、例えば図９Ｄにおけるすぐ前の命令iaddの実行にフォールディングされる。
【０１２１】
命令フォールディング処理は、主として命令デコーダ１１１８によって行われる。命令デコーダ１１１８は命令バッファ１１１６からフェッチされた命令を検索し、フェッチされた命令シーケンスにおける命令の性質に応じて、実行ユニット１１２０に命令シーケンスを１つのフォールディングされたオペレーションとして実現するオペランドアドレシング情報及びデコード済オペレーションを供給する。命令バッファ１１１６からの命令シーケンスが準拠するJAVA仮想マシン命令セットの命令とは異なり、命令デコーダ１１１８により実行ユニット１１２０に供給されたデコードされたオペレーションはローカル変数ストレージ８１３、オペランドスタック８１２、及び定数エリア８１４のエントリに表現されたオペランド値に作用する。
【０１２２】
図１１の実施例においては、有効オペランドソースがポインタVARS、VARS+1、VARS+2、及びVARS+3により特定されたローカル変数ストレージ８１３のエントリを、ポインタOPTOP、OPTOP-1、及びOPTOP-2により特定されたオペランドスタック８１２のエントリと共に含む。同様に、有効結果ターゲットは、オペランドVARS、VARS+1、VARS+2、及びVARS+3により特定されたローカル変数ストレージ８１３のエントリを含む。図１１による実施例は、有効オペランドソースとして定数エリア８１４のエントリを、オペランドスタック８１２及びローカル変数ストレージ８１３における他の位置と共に供給し得る。
【０１２３】
図１１及び図１２では、JAVA仮想マシン命令のシーケンスがメモリからフェッチされ、命令バッファ１１１６にロードされている。この結果、命令バッファ１１１６はJAVAバイトコード用のシフトレジスタとして編成される。各命令サイクルにおいて命令デコーダ１１１８が複数のバイトコードをデコードし、オペレーションが命令デコードバスinstr_dec上に、コードされたオペレーションの形態で実行ユニット１１２０に供給され、かつ、このオペレーションは命令アドレスバスinstr_addr上をオペランドソース及び結果行先アドレシング情報と関連付けられる。命令デコーダ１１１８も、命令有効信号instr_validを実行ユニット１１２０に供給する。信号instr_validがアサートされた時、それは命令デコードバスinstr_dec上の情報が有効なオペレーションを指定していることを表している。
【０１２４】
１又は２以上のバイトコードは、デコード済オペレーション及びオペランドアドレシング情報の実行ユニット１１２０の供給に対応する各サイクルにおいて、命令バッファ１１１６からシフトされて命令デコードユニット１１１８に移される。後続のデコードされていないバイトコードは、シフトされて命令バッファ１１１６に入れられる。ノーマルデコードオペレーションの場合は、１つの命令が命令バッファ１１１６からシフトして出され、命令デコードユニット１１１８によりデコードされる。１つの対応するオペレーションは、各命令サイクルの間に実行ユニット１１２０により実行される。
【０１２５】
これに対し、フォールディングされたデコードオペレーションの場合は、多数の命令、例えば命令のグループが命令バッファ１１１６からシフトされて命令デコードユニット１１１８に移される。この多数の命令に応じて、命令デコードユニット１１１８は１つの等価なフォールディングされたオペレーションを発生し、このオペレーションは実行ユニット１１２０により各命令サイクルにおいて実行される。
【０１２６】
図９Ａ〜図９Ｄと共に以前に説明した命令シーケンスについては、命令デコーダ１１１８は以下の４つのJAVA仮想マシン命令が関係するバイトコードを選択的にデコードする。
【０１２７】
１．iload値１
２．iload値２
３．iadd
４．istore
これらの命令については図９Ａ〜図９Ｄを参照しつつ前に説明した。）で説明するように、命令iload及び命令istoreの双方は命令デコーダ１１１８によりフォールディングされて、命令iaddに対応する加算オペレーションに組み込まれる。命令デコーダ１１１８のオペレーションは、４つの命令のフォールディング可能なシーケンスを用いて示されているが、当業者は、本発明の適応対象がこの４つの命令に限定されないことは理解されよう。２、３、４、５、或いはそれ以上の命令から成るフォールディング可能なシーケンスが考えられる。例えば、命令istoreに類似した１以上の命令及び命令iloadに類似した２以上の命令がフォールディング可能なシーケンスに含められ得る。
【０１２８】
命令デコーダ１１１８はデコードされたオペレーション情報を、バスinstr_decを介して、又関係するオペランドソース及び結果行先アドレシング情報をバスinstr_addrを介して供給する。これにより実行ユニット１１２０がポインタVARSにより特定されるローカル変数ストレージ８１３の位置０の内容と、ポインタVARS+2によって特定されるローカル変数ストレージ８１３の位置２の内容とを加算し、その結果をポインタVARS+2によって特定されるローカル変数ストレージ８１３の位置２にストアすることが指定される。このようにして、２つのロード命令がフォールディングされ、命令iaddに対応するオペレーションの実行に一体化される。図９Ｂに示す２つの命令サイクル及び中間のデータ状態はなくなる。加えて、命令istoreもフォールディングされて、命令iaddに相当するオペレーションの実行と一体化され、他の命令サイクル、全部で３つの命令サイクル及び図９Ｃにおける中間のデータ状態がなくなることになる。様々な他の実施例において、本発明による命令フォールディング処理によりロード、ストア、又はロードとストアの双方をなくすことができる。
【０１２９】
図１３に示すのはバイトコードのフォールディング処理を行うデコーディング及びフォールディング処理を行わないデコーディングの双方を提供する命令デコーダ１１１８の実施例である。命令デコーダ１１１８のフォールディング動作モードか、非フォールディング動作モードかの選択は、フェッチされて命令バッファ１１１６に入れられ、次いで命令デコーダ１１１８によってアクセスされるバイトコードの特定のシーケンスに基づいている。命令デコーダ１１１８のノーマルデコード部１３０２及びフォールドデコード部１３０４は、パラレルに配置されており、非フォールディング及びフォールディングされた実行のそれぞれをサポートする。
【０１３０】
図１３の実施例では、フォールドデコード部１３０４が命令バッファ１１１６にフェッチされたバイトコードシーケンスにおけるバイトコードのフォールディング処理実行の機会を検出する。このようなフォールディング可能なシーケンスが検出されると、ノーマルデコード部１３０２ではなくフォールドデコード部１３０４の出力が実行ユニット１１２０への供給源として選択されることがトリガされる。有益なことは、フォールディングされたデコーディング又はフォールディングされないデコーディングの選択が実行ユニット１１２０に対して透過的であることである。これによりオペレーション情報がバスinstr_decを介して、関係するオペランドソース及び結果行先アドレシング情報がバスinstr_addrを介して受け取られ、単なる命令なのか、又はフォールディングされた命令シーケンスに相当する情報なのかを知る必要がなくなる。
【０１３１】
ノーマルデコード部１３０２は、各命令サイクルの間に命令バッファ１１１６からの１つのバイトコードを検査し、それに応答して以下の表示を発生する。即ち、
１．デコードされた命令に対応するオペレーション、例えば整数加算を特定するノーマル命令デコード信号n_instr_decが、スイッチ１３０６の第１の入力端の組に供給される。
【０１３２】
２．デコードされた命令に対する明示的なソース及び行先アドレス、例えば命令iaddに対する第１オペランドアドレス＝OPTOP、第２オペランドアドレス＝OPTOP-1、及び行先アドレス＝OPTOP-1も作り出すノーマルアドレス信号n_adrがスイッチ１３１０の第１のバス入力に供給される。
【０１３３】
３．例えば図１３の実施例における、命令iaddに対するネットの変化＝−１であるポインタOPTOPにおけるネットの変化n_delta_optopがノーマルアドレス信号n_adrの成分としてエンコードされる。
【０１３４】
４．ノーマル命令デコード信号n_instr_decが有効のオペレーションを特定しているか否かを示す命令有効信号instr_validがスイッチ１３０８の第１の入力端に供給される。
【０１３５】
ノーマルデコード部８０２に対して、以下に詳細に説明するように、命令デコーダ６１８のフォールドデコード部８０４は命令バッファ６１６からのバイトコードのシーケンスを検査し、こけらのシーケンス（例えばローカル変数０からのiload値１、ローカル変数２からのiload値２、iadd、及びローカル変数２に対する合計のistore）がフォールディングされて、オペランドスタック上の命令オペランド及び／又は結果の一次ストレージで不必要なものを取り除くことができるか否かを判定する。フォールドデコード部８０４がバッファ６１６におけるバイトコードのシーケンスがフォールディング可能である場合には、フォールドデコード部８０４が以下の表示を発生する。
【０１３６】
１．等価なオペレーション、例えばフォールディングされた命令シーケンスに対応する整数加算オペレーションを特定するフォールディングされた命令デコード信号f_instr_decがスイッチ１３０６の第２の入力端の組に供給される。
【０１３７】
２．等価なオペレーションに対するソース及び行先アドレス、例えば第１オペランドアドレス＝VARS、第２オペランドアドレス＝VARS+2、及び行先アドレス＝VARS+2を特定するフォールディングされたアドレス信号f_adrがスイッチ１３１０の第２のバス入力に供給される。
【０１３８】
３．例えば図１３の実施例において上のシーケンスのネットの変化＝０であるポインタOPTOPにおけるネットの変化信号f_delta_optopが、ノーマルアドレス信号n_adrの成分としてエンコードされる。
【０１３９】
４．フォールディングされた命令デコード信号f_instr_decが有効なオペレーションを指定しているか否かを表示するフォールド済命令有効信号f_validがスイッチ１３０８の第２入力末端に供給される。
【０１４０】
フォールドデコード部８０４又、命令バッファ１１１６におけるバイトコードのシーケンスがフォールディング可能であるか否かを表示するフォールドラインf/nf上の信号を発生する。フォールドラインf/nf上の信号は、スイッチ１３０６、１３１０及び１３０８のコントロール入力に供給される。命令バッファ１１１６におけるバイトコードのシーケンスがフォールディング可能である場合、フォールドラインf/nf上の信号は、スイッチ１３０６、１３１０、及び１３０８に、実行ユニット１１２０への供給のための各第２入力の選択、即ちソースフォールド済命令デコード信号f_instr_dec、フォールド済アドレス信号f_adr、及びフォールド済命令有効信号f_validをフォールドデコード部８０４から供給するために各第２入力を選択させる。命令バッファ１１１６におけるバイトコードのシーケンスがフォールディング不可能である場合には、フォールドラインf/nf上の信号によりスイッチ１３０６、１３１０、及び１３０８が、フォールドデコード部８０４から実行ユニット１１２０へのソースノーマル命令デコード信号f_instr_dec、ノーマルアドレス信号n_adr、及びノーマル命令有効信号n_validの供給の為の各第１入力を選択する。
【０１４１】
本発明によるいくつかの実施例においては、フォールドデコード部１３０４のオペレーションが外部の命令デコーダ１１１８から供給されたアクティブ抑制フォールディング信号suppress_foldに応じて抑制される。アサートされた抑制フォールディング信号suppress_fold（図１４参照）に応じて、フォールドラインf/nf上の信号は、命令バッファ１１１６により提供された特定のバイトコードシーケンスかそうでなければフォールディングのトリガとなる場合ですら、スイッチ１３０６、１３１０、及び１３０８の各第１入力を選択した状態に維持される。例えば、このような実施例の１つでは、フォールディング抑制信号suppress_foldが、ポインタVARSにより特定されたローカル変数ストレージ８１３のエントリがキャッシュされない時、例えばオペランドスタック８１２におけるエントリがスタックキャッシュ１５５からローカル変数ストレージ８１３を置き換えたとき、アサートされる。ここに開示される実施例では、オペランドスタック８１２及びローカル変数ストレージ８１３の少なくとも１部分を表すスタックキャッシュ及びキャッシュコントロール機構が、ローカル変数ストレージ８１３又はオペランドスタック８１２のフォールディングされるエントリがスタックキャッシュ１５５に存在しない場合、抑制フォールディング信号suppress_foldをアサートし得るという利点がある。
【０１４２】
図１４は、命令デコーダ１１１８のフォールドデコード部１３０４をより詳細に示した図である。フォールド判定部１４０４は、選択的に命令バッファ１１１６におけるバイトコードのシーケンスを検査する。（図１５を参照しつつ以下に説明するように）２のバイトコード及び１又は２以上の後続のバイトコードがフォールディング可能なオペレーションのシーケンスを表す場合、フォールド判定部１４０４がフォールドラインf/nf上にフォールド表示信号を、及び等価なフォールディング処理済オペレーションを特定するフォールド済命令デコード信号f_instr_decを供給する。フォールディングされた命令デコード信号f_instr_decは、コードされた命令instr_decとして実行ユニット１１２０に供給される。好適実施例では、フォールディング可能なオペレーションのシーケンスが、命令デコーダ１１１８から２、３、又は４つのバイトコードが関係するオペレーションを含む。即ち、オペランドをオペランドスタック８１２にロードする最大２個のバイトコード、オペランドをポップする１個のバイトコード、そのオペランドに作用する１個のバイトコード、結果をオペランドスタック８１２にプッシュする１個のバイトコード、及び結果をオペランドスタック８１２からポップしてストアする１個のバイトコードである。等価なフォールディングされたオペレーションは、フォールド命令デコード信号f_instr_decによりエンコードされ、フォールディングされた実行アドレシング情報と結合されたとき、オペランドスタック８１２へのロード及びそこからのデータのストアをなくすオペレーションを特定する。
【０１４３】
別の実施例は２つの命令のみをフォールディングし得る。例えば命令iloadを命令iaddに、若しくは命令istoreをすぐその前の命令iaddにフォールディングする。他の実施例は、オペランドをオペランドスタックにプッシュする命令、例えば１又は２以上の命令iloadを命令iaddにフォールディングするか、或いはオペランドスタックから演算結果をポップする命令のみ、例えば命令istoreをすぐその前の命令iaddにフォールディングし得る。更に別の実施例は、特定の仮想マシン命令セットの命令に基づき、オペランドをオペランドスタックにプッシュする多数の命令及び／又は演算結果をオペランドスタックからポップする多数の命令をフォールディングし得る。このような実施例では、命令シーケンスの通常のデコーディング及び実行と比較して上述のような利点が得られる。
【０１４４】
フォールド判定部１４０４は、成分第１オペランドインデクス信号first _adr_ind、第２オペランドインデクス信号second_adr_ind及び行先インデクス信号dest_adr_indを含む一連のフォールドアドレスインデクス複合信号f_adr_indを発生する。上述の成分はそれぞれ等価なフォールディングされたオペレーションに対する第１オペランドアドレス、第２オペランドアドレス、及び行先アドレスに対して選択的である。フォールド判定部１４０４は、等価なフォールディングされたオペレーションに対するオペランド及び行先アドレスを供給する場合において使用するためのアドレスジェネレータ１４０２をフォールドする複合信号f_adr_indを供給する。フォールド判定部１４０４は、スイッチ１３０６、１３１０、及び１３０８（図１３参照）を制御するためのフォールドラインf/nf上のフォールド表示信号をアサートし、信号f_instr_dec、f_adr、及びf_validを信号instr_dec、instr_adr、及びinstr_validとして供給する。他の場合、各信号はノーマルデコード部１３０２から実行ユニット１１０２に供給される。
【０１４５】
フォールド判定部１４０４の動作について図１５のフローチャートを参照しつつここに説明する。開始１５０１において、フォールド判定部１４０４は命令デコードサイクルを開始し、処理を初期インデクス１５０２に進める。初期インデクス１５０２において、命令バッファ１１１６にはいる命令インデクスinstr_indexが初期化され、命令バッファ１１１６におれるバイトコードシーケンスの次のバイトコードを特定する。好適実施例では、命令インデクスinstr_indexは、１に初期化され、次のバイトコードが命令バッファ１１１６における最初のバイトコードとなる。というのは、前のバイトコードが既に命令バッファ１１１６からシフトアウトされているからである。しかし、様々な他のインデキシング及び命令バッファ管理スキームも適切なものとなり得る。処理の完了時に、初期化インデクス１５０２は、処理を第１命令チェック１５０４に進める。
【０１４６】
第１命令チェック１５０４において、フォールド判定部１４０４は、instr_index、即ち例えば整数値、浮動小数点値、参照値等の値をオペランドスタック８１２にプッシュするオペレーションに相当する第１バイトコードにより命令が特定されているか否かを判定する。JAVA仮想マシンの実施例では、第１命令チェック１５０４が、インデクスinstr_indexにより指定された命令が、第１データ項目をオペランドスタックにプッシュするためのものとしてJAVA仮想マシン仕様（付録I参照）が定義するものであるか否かを判定する。そうである場合は、第１オペランドインデクス信号first_adr_indが（第１オペランドアドレスセッティング１５０６において）アサートされ、第オペランド値のソースを特定する。好適実施例では、第１オペランドインデクス信号first_adr_indが、OPTOP、OPTOP-1、OPTOP-2、VARS、VARS+1、VARS+2、及びVARS3の１つに対して選択的であるが、別の実施例は、例えば、定数エリア８１４におけるソースアドレスを含むソースアドレスのより大きい、より小さい、又は異なる組をコードし得る。後続のバイトコードに応じて、この第１バイトコードは、後続のオペレーションの実行にフォールディングされ得るオペレーションに相当するものであり得る。しかし、第１バイトコードが第１命令チェック１５０４の基準を満たさない場合には、フォールディング処理が適合せず、フォールド判定部１４０４は、フォールドラインf/nf上に非フォールド表示信号を供給し、そこで、ノーマルデコード部１３０２からの表示がデコーディングを提供する。
【０１４７】
第１バイトコードが第１命令チェック１５０４の基準を満たすものと仮定すると、インデクスinstr_indexは、（インプリメンテーション１５０８において）実現され、命令バッファ１１１６における次のバイトコードを指定する状態となる。次いで、第２命令チェック１５１０において、フォールド判定部１４０４は、インデクスinstr_indexによって指定された命令、即ち第２バイトコードが、例えば整数値、浮動小数点値、参照値等の値をオペランドスタック８１２にプッシュするオペレーションに相当するか否かを判定する。JAVA仮想マシンの実施例の場合には、第２命令チェック１５１０が、インデクスinstr_indexによって特定された命令が、第１データ項目をオペランドスタックにブッシュするためのものとしてJAVA仮想マシン仕様（付録I参照）が定義したものであるか否かを判定する。そうである場合には、第２オペランドインデクス信号second_adr_indが、（第２オペランドアドレスセッティング１５１２において）アサートされ、第２オペランド値のソースが表示され、インデクスinstr_indexは、（インプリメンティング１５１４において）インプリメントされ、命令バッファ１１１６における次のバイトコードを指定する状態となる。前に説明したように、第２オペランドインデクス信号second_adr_indは、OPTOP、OPTOP-1、OPTOP-2、VARS、VARS+1、VARS+2、及びVARS3の１つに対して選択的であるが、別の実施例も適切であり得る。フォールド判定部１４０４は、第３命令チェック１５１６において命令バッファ１１１６における第２バイトコード又は第３バイトコードの何れかを指定するインデクスinstr_indexについて継続する。
【０１４８】
第３命令チェック１５１６において、フォールド判定部１４０４は、インデクスinstr_indexによって指定される命令、即ち第２バイトコード又は第３バイトコードの何れかが、例えば整数値、浮動小数点値、参照値等の、オペランドスタック８１２の先頭エントリからのオペランド値に作用し、このようなオペランド値をオペランドスタック８１２から効果的にポップし、演算結果をオペランドスタック８１２にプッシュするオペレーションに相当するか否かを判定する。オペレーション値のポップは、明示的なものであり得るか、単に、オペランドスタック８１２の先頭エントリに演算結果を書き込み、ポインタOPTOPをそのエントリがオペランドスタック８１２の先頭として特定されるように更新するネットの効果を有するものであり得る。JAVA仮想マシンの実施例では、第３命令チェック１５１６が、インデクスinstr_indexによって特定された命令が、JAVA仮想マシン仕様（付録I参照）が、オペランドスタックからデータ項目をポップし、ポップされたデータ項目に作用し、演算結果をオペランドスタックにプッシュするものとして定義したオペレーションに対応するか否かを判定する。そうである場合は、インデクスinstr_indexが（インプリメンティング１５１８において、インプリメントされ、命令バッファ１１１６内の次のバイトコードを指定する状態となる。そうでない場合は、フォールディング処理が適合せず、フォールド判定部１４０４は、フォールドラインf/nfに非フォールド表示信号を供給し、そこでノーマルデコード部１３０２がデコーディングを行う。
【０１４９】
第４命令チェック１５２０において、フォールド判定部１４０４は、インデクスinstr_indexにより特定された命令、即ち第３バイトコード又は第４バイトコードの何れかが、オペランドスタック８１２から値をポップし、その値をローカル変数ストレージ８１３のようなデータストアに格納するオペレーションに相当するか否かを判定する。JAVA仮想マシンの実施例では、第４命令チェック１５２０が、インデクスinstr_indexによって特定された命令が、JAVA仮想マシン仕様（付録I参照）が、演算結果データ項目をオペランドスタックからポップするものとして定義したオペレーションに相当するか否かを判定する。そうである場合には、インデクス信号dest_adr_indが、（行先アドレスセッティング１５２２において）アサートされ、等価なフォールディングされたオペレーションの演算結果値の行先を特定された状態となる。そうでない場合には、命令バッファ１１１６のインデクスinstr_indexによって特定された位置にあるバイトコードが第４命令チェック１５２０の判定基準を満たしていない場合には、インデクス信号dest_adr_indが、（行先アドレスセッティング１１２４）においてアサートされ、オペランドスタック８１２の先頭を指定する状態となる。JAVA仮想マシン命令の実施例では、インデクスinstr_indexによって特定された命令が、第４命令チェック１５２０の基準に一致しない場合には、インデクス信号dest_adr_indが、（行先アドレスセッティング１１２４において）アサートされ、ポインタOPTOPが特定される。オペランドスタック８１２の先頭又はストアオペレーションの何れかが選択され、フォールディングされた命令有効信号f_validが（有効フォールドアサーティング１１２６において）アサートされ、ラインf/nf上のフォールド表示信号が供給されて、スイッチ１３０６、１３０８、及び１３１０のフォールドデコード入力が実行ユニット１１２０への供給のために選択される。フォールド判定部１４０４は、終了１５５０において命令デコードサイクルを終了する。
【０１５０】
単純化のため、ハードウェアプロセッサ１００のための命令デコーダ、例えば命令デコーダ１３５は、フォールドデコーディングを、２つの命令の命令シーケンスへの、及び／又は１つのバイトコード命令のシーケンスへのフォールドデコーディングに限定され得る。当業者は、命令デコーダ１１１８のフォールドデコード部１３０４に対する適切な単純化を理解されよう。
【０１５１】
図１６は、第１オペランドアドレスジェネレータ１６０２、第２オペランドアドレスジェネレータ１６０４、及び行先アドレスジェネレータ１６０６の３つのアドレスジェネレータを含むフォールドアドレスジェネレータ１４０２を示した図である。この３つのジェネレータはそれぞれ、そこに供給されたインデクス及びポインタレジスタ８２２からのポインタVARS及びポインタOPTOPに基づいて対応する第１オペランド、第２オペランド、及び行先アドレスを供給する。好適実施例では、第１オペランドアドレスジェネレータ１６０２、第２オペランドアドレスジェネレータ１６０４、及び行先アドレスジェネレータ１６０６が、オペランドスタック８１２及びローカル変数ストレージ８１３エントリのサブセットに対応するランダムにアクセス可能なストレージ８１０におけるアドレスを供給する。別の実施例では、ランダムアクセスメモリ以外のストレージ、例えば物理的レジスタ（特にJAVA仮想マシンインプリメンテーションが下層を成すオペランドスタック及びローカル変数ストレージを供給するもの）に対して選択的な識別子を供給し得る。
【０１５２】
第１オペランドアドレスジェネレータ１６０２は、フォールド判定部１４０４からの第１オペランドインデクス信号first_adr_indを受け取り、ポインタレジスタ８２２からのポインタVARS及びポインタOPTOP値を用いて、等価なフォールディングされたオペレーションのための第１オペランドに対する第１オペランドアドレス信号first_op_adrを発生する。第２オペランドアドレスジェネレータ１６０４及び行先アドレスジェネレータ１６０６の動作は類似している。第２オペランドアドレスジェネレータ１６０４は、第２オペランドインデクス信号second_adr_indを受け取り、等価なフォールディングされたオペレーションの為の第２オペランド（もしあれば）に対する第２オペランドアドレス信号second_op_adrを発生する。行先アドレスジェネレータ１６０６は、行先インデクス信号dest_adr_indを受け取り、等価なフォールディングされたオペレーションの演算結果のための行先アドレス信号dest_adrを発生する。図１３、図１４、及び図１６の実施例では、第１オペランドアドレス信号first_op_adr、第２オペランドアドレス信号second_op_adr、及び行先アドレス信号dest_adrが、集団で等価なフォールディングされたオペレーションのための第１オペランド、第２オペランド、及び行先アドレスとして実行ユニット１１２０に供給するためのフォールドアドレス信号はf_adrとしてスイッチ１３１０に供給される。
【０１５３】
図１７には、第１オペランドアドレスジェネレータ１６０２の好適実施例が示されている。第２オペランドアドレスジェネレータ１６０４及び行先アドレスジェネレータ１６０６はこれに類似したものである。図１７の実施例では、第１オペランドアドレス信号first_op_adrが、ローカル変数ストレージ８１３及びオペランドスタック８１２の位置のサブセットから選択される。別の実施例では、より大きい、より小さい、又は異なるオペランドスタック８１２及びローカル変数ストレージ８１３の位置のサブセットから、或いはランダムにアクセス可能なストレージ８１０におけるより広い幅の位置からオペランド及び行先アドレスが生成され得る。例えば、別の実施例は、定数エリア８１４における位置に対して選択的なアドレスを発生し得る。図１７の実施例に適切な変更を加えることは、当業者には明らかであろう。第１オペランドアドレスジェネレータ１６０２、第２オペランドアドレスジェネレータ１６０４、及び行先アドレスジェネレータ１６０６は、位置の異なる組を定義できるという利点を有する。例えば、定数エリア８１４における位置及びオペランドスタック８１２の内部における位置がオペランドソースとして有効であるが、これらの位置は通常適切な演算結果のターゲットではない。このため、行先アドレスジェネレータ１６０６の実施例によって与えられる位置の組は、ローカル変数ストレージ８１３エントリ及びオペランドスタック８１２の先端エントリに限定されるが、別の位置の組を利用することも可能である。
【０１５４】
図１７では、ポインタOPTOPがレジスタ１７０２に供給され、レジスタ１７０２はこの値をラッチし、ラッチされた値をデータセレクタ１７５０の第１入力に供給する。同様に、ポインタOPTOPはレジスタ１７０４及び１７０６に供給され、これらのレジスタはそれぞれこの値から１及び２を引いた数をラッチし、ラッチされた値をデータセレクタ１７５０の第１入力に供給する。同様に、ポインタOPTOPはレジスタ１７０４及び１７０６に供給され、これらのレジスタはそれぞれこの値から１及び２を引いた数をラッチし、ラッチされた値をデータセレクタ１７５０の第１入力及び第３入力に供給する。このようにして、値OPTOP、OPTOP-1、及びOPTOP-2によって特定されたアドレスが、データセレクタ１７５０による選択のために利用可能となる。同様に、ポインタVARSは、一連のレジスタ１７０８、１７１０、１７１２、及び１７１４に供給され、これらのレジスタはそれぞれ値VARS、VARS+1、VARS+2、及びVARS+3を、デーダセレクタ１７５０の第４、第５、第６、及び第７入力への供給のためにラッチする。このようにして、値VARS、VARS+1、VARS+2、及びVARS+3で特定されたアドレスは、データセレクタ１７５０の選択のために利用可能となる。ここに開示した実施例では、ポインタVARSからのオフセットは防いである。この理由は、ローカル変数ストレージ８１３が（ポインタVARSによって特定される）そのベースからアドレス指定されるからである。ポインタOPTOPに対するオフセットはマイナスであるが、この理由はオペランドスタック８１２が（ポインタOPTOPにより特定される）そのトップからアドレス指定されるからである。
【０１５５】
データセレクタ１７５０は、その入力において利用可能となったラッチされたアドレスの中から選択を行う。第１オペランドアドレスジェネレータ１６０２の図１７の実施例によるフォールド判定部１４０４の実施例では、値VARS、VARS+1、VARS+2、及びVARS+3でアドレス指定されたものでなくローカル変数ストレージ８１３におけるロードソースアドレスが、フォールディング不可能なものとして取り扱われ、ノーマルデコード部１３０２によってデコードされる。しかし、ロードアドレスにサポートされた組を拡張するための適切な改変は、当業者には明らかであろう。第２オペランドアドレスジェネレータ１６０４及び行先アドレスジェネレータ１６０６は、類似した設計であるが、行先アドレスジェネレータ１６０６は定数エリア８１４に対するアドレス指定をサポートしていない。
【０１５６】
本発明による一実施例では、信号RS1_Dがデータセレクタ１７５０の０番目の入力に供給される。この実施例では、追加のデコードロジック（図示せず）により、別の命令セットをサポートするためのレジスタ識別子情報の直接の供給が可能となる。このような別の命令セットをサポートするための追加のデコードロジックについてはも本出願の譲受人に譲渡された、Marc Tremblay及びJames Michael O′Connorを発明者とする“A PROCESSOR FOR EXECUTING INSTRUCTION SETS RECEIVED FROM A NETWORK OR FROM A LOCAL MEMORY」なる名称の米国特許出願に詳細に記載されており、本明細書と一体にこれを参照されたい。
【０１５７】
図１３に戻ると、フォールドデコード部１３０４のフォールド判定部１４０４がフォールディング可能なバイトコードシーケンスを特定したとき、フォールド判定部１４０４はラインf/nf上にフォールド表示信号をアサートし、フォールドされた命令デコード信号f_instr_decとして等価なフォールディングされたオペレーションを供給し、且つフォールディング可能なバイトコードシーケンスからのロード及びストア命令に基づいて、第１オペランドアドレスジェネレータ１６０２、第２オペランドアドレスジェネレータ１６０４、及び行先アドレスジェネレータ１６０６によって維持されているラッチされたアドレスに対するインデクスを供給する。フォールドデコード部１３０４は、フォールディングされたアドレス信号f_adrとしてインデクス付けされたアドレスを供給する。ラインf/nf上の信号に応じて、スイッチ１３０６、１３０８、１３１０は、等価なフォールディングされたオペレーションに対するデコード情報を実行ユニット１１２０に供給する。
【０１５８】
フォールドデコード部８０４については、４つの命令フォールディング可能なシーケンスの例をとって説明してきたが、実施例はこれに限定されない、ここに開示した内容に基づき、当業者は追加の命令のフォールディング及びより長いフォールディング可能な命令シーケンス、例えば５個以上の命令のシーケンスのフォールディングをサポートできるような適切な拡張した実施例を考えることができよう。実施例によれば、限定を意図するものではないが、追加のオペランドアドレス信号、例えば第３オペランドアドレス信号及び／又は追加の行先アドレス信号、例えば第２行先アドレス信号をサポートする形態も可能である。
【０１５９】
整数実行ユニット
図１に示すように、整数実行ユニットＩＥＵは、命令デコードユニット１３０、整数ユニット１４２並びにスタック管理ユニット１５０を含む、浮動小数点関連命令を除く、全ての仮想マシン命令の実行を支配する。浮動小数点関連命令は浮動小数点ユニット１４２において実行される。
【０１６０】
整数実行ユニットＩＥＵは、命令キャッシュユニット１２０とフロントエンドにて対話し、浮動小数点命令を実行するための浮動小数点ユニット（ＦＰＵ）１４３を用いて、最終的にはロード／ストア命令関連命令を実行するためのデータキャッシュユニット（ＤＣＵ）１６０を用いて、命令をフェッチする。また整数実行ユニットＩＥＵは、マイクロコードＲＯＭを有し、マイクロコードＲＯＭは、整数演算に関連する一定の仮想マシン命令を実行するような命令を含む。
【０１６１】
整数実行ユニットＩＥＵは、スタック４００のキャッシュ部分、すなわちスタックキャッシュ１５５を含む。スタックキャッシュ１５５は、現在メソッド（current method）に関連するオペランドスタックエントリ及びローカル変数エントリ（local variable entry）、すなわちオペランドスタック４２３エントリ及びローカル変数記憶４２１エントリを迅速に記憶する。スタックキャッシュ１５５は、現在の命令に関連する全てのオペランドスタックエントリ及びローカル変数エントリを十分に記憶することができるが、オペランドスタックエントリ及びローカル変数エントリの数によっては、全てのローカル変数エントリより少ない数、或いはローカル変数エントリとオペランドスタックエントリの両方の数より少ない数が、スタックキャッシュ１５５において表されるかもしれない。同様に付加的なエントリ、すなわち呼出しメソッド（calling method）に対するオペランドスタックエントリ及びローカル変数エントリは、もし空間的に許容されるなら、スタックキャッシュ１５５において表されるかもしれない。
【０１６２】
スタックキャッシュ１５５は、６４エントリ３２ビット幅のレジスタ配列であり、１つの実施例ではレジスタファイルとして物理的にインプリメントされる。スタックキャッシュ１５５は３つの読出しポートを有しており、その内の２つは整数実行ユニットＩＥＵ専用であり、残りの１つはドリブル（dribble）管理ユニット１５１用である。またスタックキャッシュ１５５は、２つの書込みポートを有し、１つは整数実行ユニットＩＥＵ専用であり、もう１つはドリブル管理ユニット１５１用である。
【０１６３】
整数ユニット１４２は、種々のポインタを保持しており、ポインタは、スタックキャッシュ１５５内にあるローカル変数のような変数値、並びにオペランドスタック値にアクセスするために用いられる。また整数ユニット１４２はスタックキャッシュヒットが起こるか否かを検出するためのポインタを保持する。実行時例外は捕捉され、マイクロコードＲＯＭ１４９及び回路１７０における情報を用いてインプリメントされる例外ハンドラにより処理される。
【０１６４】
整数ユニット１４２は、算術演算をサポートするための３２ビットＡＬＵを含む。ＡＬＵによりサポートされる演算は、加算、減算、けた送り（シフト）、論理積、論理和、排他的論理和、比較、超過（greater than）、未満（less than）並びに読飛ばし（バイパス）を含む。またＡＬＵは、別々の比較器が分岐命令の結果を判定する間に、条件付き分岐のアドレスを判定するための用いられる。
【０１６５】
パイプラインを介して手際よく実行される大部分の共通命令セット（most common set of instructions）は、ＡＬＵ命令の集合体である。ＡＬＵ命令はデコード段３０２内のスタック４００の先頭からオペランドを読出し、結果を計算するための実行段３０３においてＡＬＵを用いる。その結果はライトバック段３０５内のスタック４００にライトバックされる。２段階のバイパスがあり、連続ＡＬＵ演算がスタックキャッシュ１５５にアクセスしている場合に、必要とされることがある。
【０１６６】
スタックキャッシュポートは本実施例では３２ビット幅であるため、倍精度及び長データ演算は２サイクルかかる。またシフタはＡＬＵの一部として存在する。もしオペランドがデコード段３０２内の命令に対して利用できない、すなわち実行段３０３の初めにおいて最大であるなら、実行段３０３前にインターロックがパイプライン段をホールドする。
【０１６７】
整数実行ユニットＩＥＵの命令キャッシュユニットインターフェースは有効／許容インターフェースであり、そこで命令キャッシュユニット１２０は、固定フィールドにおける整数デコードユニット１３０に、有効ビットと共に命令を引き渡す。命令デコーダ１３５は、アライナ（aligner）回路１２２がシフトするために何バイト必要とするか、或いは命令デコードユニット１３０がデコード段３０２において何バイト消費するかをシグナリングすることにより応答する。また命令キャッシュユニットインタフェースは命令キャッシュユニット１２０に対して、分岐誤り予測（branch mis-predict）条件、並びに実行段３０３における分岐アドレスをシグナリングする。また、必要なときには、同様にトラップが命令キャッシュユニット１２０に対して指示される。命令キャッシュユニット１２０は、命令デコードユニット１３０に対していかなる有効データもアサートしないことにより、整数ユニット１４２をホールドすることができる。命令デコードユニット１３０はバイトアライナ回路１２２に対してシフト信号をアサートしないことにより命令キャッシュユニット１２０をホールドすることができる。
【０１６８】
また整数実行ユニットＩＥＵのデータキャッシュインターフェースは、有効−許容インターフェースであり、そこでは整数ユニット１４２が、実行段３０３において、データキャッシュユニット１６０内のデータキャッシュコントローラ１６１に対して、例えば非キャッシュ、特殊ストア（special store）等の属性と共に、ロード或いはストア演算をシグナリングする。データキャッシュユニット１６０は、ロード演算中のデータを復帰し、データコントロールユニットホールド信号を用いて整数ユニット１４２を制御することができる。データキャッシュヒット中に、データキャッシュユニット１６０は要求データを復帰し、それからパイプラインを解放する。
【０１６９】
またストア演算中に整数ユニット１４２は、実行段３０３内にアドレスと共にデータを供給する。データキャッシュユニット１６５は、もしデータキャッシュユニット１６５がビジー、すなわちラインフィルであるなら、キャッシュ段３０４内のパイプラインをホールドすることができる。
【０１７０】
浮動小数点演算は、整数実行ユニットＩＥＵにより専用に処理される。命令デコーダ１３５は、浮動小数点ユニット１４３関連命令をフェッチし、かつデコードする。命令デコーダ１３５は、デコード段３０２における浮動小数点ユニット１４２に対して実行するための浮動小数点演算オペランドを送出する。浮動小数点ユニット１４３が浮動小数点演算を実行ビジーの間に、整数ユニット１４２はパイプラインを停止し、浮動小数点ユニット１４３が、整数ユニット１４２に対して、結果が利用可能であるということをシグナリングするまで待機する。
【０１７１】
浮動小数点ユニット１４３からの浮動小数点実行可能信号は浮動小数点演算の実行段３０３が終了したということ示す。浮動小数点実行可能信号に応じて、その結果が整数ユニット１４２によりスタックキャッシュ１５５内にライトバックされる。浮動小数点ユニット１４３及び整数ユニット１４２がスタックキャッシュ１５５内に見出されるため、浮動小数点ロード及びストア演算は、整数実行ユニットＩＥＵにより完全に処理される。
【０１７２】
スタック管理ユニット
スタック管理ユニット１５０は情報をストアし、実行ユニット１４０に対するオペランドを提供する。またスタック管理ユニット１５０はスタックキャッシュ１５５のオーバーフロー及びアンダーフロー条件を処理する。
【０１７３】
１つの実施例では、スタック管理ユニット１５０は、上述のように１つの実施例では３つの読出しポート、２つの書込みポートであるスタックキャッシュ１５５、実行ユニット１４０に対するオペランドを回収し、ライトバックレジスタ、すなわちデータキャッシュ１６５から戻されるデータをスタックキャッシュ１５５内にストアするために用いられる２つの読出しポート及び１つの書込みポートに必要な制御信号を供給するスタック制御ユニット１５２、並びにスタックキャッシュ１５５においてオーバーフロー或いはアンダーフローが生じるときはいつでも、スタックキャッシュ１５５に入るデータ及びスタックキャッシュ１５５から出るデータをメモリ内に投機的にドリブルするドリブル管理部１５１を含む。図１の典型的な実施例では、メモリはデータキャッシュ１６５及びメモリインターフェースユニット１１０によりインターフェースされる任意のメモリ記憶装置を含む。一般に、メモリは、キャッシュ、アドレス指定可能読出し／書込みメモリ記憶装置、第２の記憶装置、等を含む任意の適切なメモリ階層を含む。またドリブル管理部１５１は、背景でのドリブル目的に対して専用に用いられるスタックキャッシュ１５５の１つの読出しポート及び１つの書込みポートに対する必要な制御信号を供給する。
【０１７４】
ある実施例では、スタックキャッシュ１５５は、そのスタックがある予測メソッドに基づいて増減し、オーバーフロー及びアンダーフローを防ぐことを確実にする循環バッファとして管理される。データキャッシュ１６５への値及びデータキャッシュ１６５からの値の退避及び再生は、ある実施例では、高水位マーク（high-water mark）及び低水位マークを用いてドリブル管理部１５１により制御される。
【０１７５】
スタック管理ユニット１５０は、実行ユニット１４０に、所定のサイクルにおける２つの３２−ｂｉｔオペランドを供給する。スタック管理ユニット１５０は、所定のサイクルにおける１つの３２−ｂｉｔ結果をストアすることができる。
【０１７６】
ドリブル管理部１５１は、データキャッシュ１６５からスタックキャッシュ１５５への、並びにスタックキャッシュ１５５からデータキャッシュ１６５へのデータを投機的にドリブルすることにより、スタックキャッシュ１５５のスピル（spill）及びフィル（fill）を処理する。ドリブル管理部１５１は、パイプラインストール信号（pipeline stall signal）を発生させ、スタックオーバーフロー条件或いはアンダーフロー条件が検出されるとき、パイプラインをストールする。またドリブル管理部１５１はデータキャッシュユニット１６０に送出される要求のスタックを保持する。データキャッシュユニット１６０に対する１つの要求は３２−ｂｉｔ連続ロード或いはストア要求である。
【０１７７】
スタックキャッシュ１５５のハードウエア構成は、長オペランド（長い整数及び倍精度浮動小数点数）の場合を除き、オペコードに対する暗黙のオペランドフェッチにより、オペコードの実行に対する待ち時間が加わらないようにする。スタックキャッシュ１５５において維持されるオペランドスタック４２３（図４Ａ）及びローカル変数記憶装置４２２におけるエントリの数は、ハードウエア／パフォーマンスのトレードオフを表す。少なくとも数個のオペランドスタック４２３及びローカル変数記憶装置エントリが良好なパフォーマンスを得るために必要とされる。図１の典型的な実施例では、少なくともオペランドスタック４２３及び最初の４つのローカル変数記憶装置４２２エントリの上位の３エントリがスタックキャッシュ１５５内に好適に表される。
【０１７８】
スタックキャッシュ１５５により供給される１つの重要な機能（図１）は、レジスタファイルをエミュレートすることであり、上位２つのレジスタへのアクセスが余分なサイクルを用いずに常に可能である。もし適用な知的機能が、背景においてメモリから値をロードするために、或いはメモリに値をストアするために与えられ、従って入ってくる仮想マシン命令のためにスタックキャッシュ１５５を準備するなら、小さいハードウエアスタックでも十分である。
【０１７９】
上述のように、スタック４００上の全アイテムが（サイズに関係なく）、３２−ｂｉｔワード内に置かれる。これは、もし数多くの小さなデータアイテムが用いられるなら、空間を無駄にしてしまうが、比較的簡単に、かつ多くのタギング（tagging）或いはマクシング（muxing）から束縛されずにデータアイテムを保持できる。従ってスタック４００内の１つのエントリは、１つの値を表し、多くのバイトを表さない。長整数及び倍精度浮動小数点数は、２つのエントリを必要とする。読出し及び書込みポート数を少なくしておくために、２つの長整数或いは２つの倍精度浮動小数点数を読出すために２サイクルが必要となる。
【０１８０】
スタックキャッシュ１５５から出てメモリに入るオペランドスタックをドリブル管理部１５１によりフィル及びスピルするための機構は、いくつかの別の形態のうちの１つを呈することができる。ある時点において１つのレジスタが、フィル或いはスピルされるか、或いはいくつかのレジスタのブロックが同時にフィル或いはスピルされることができる。１つのスコアボードされたメソッドは、スタック管理に対して適切である。その最も簡単な形態では、１つのビットが、スタックキャッシュ１５５内のそのレジスタが現在有効であるか否かを示す。さらにスタックキャッシュ１５５のいくつかの実施例は、そのレジスタのデータ内容がスタック４００に退避されるか否か、すなわちそのレジスタが汚れているか否かを示すために１つのビットを用いる。ある実施例では、高水位マーク／低水位マークが、いつエントリがそれぞれ、スタック４００に退避される、或いはスタック４００から再生されるかを自発的に判定する（図４Ａ）。別法では、先頭スタックが、固定された、或いはプログラマブルなエントリ数だけスタックキャッシュ１５５の底部４０１に近づくとき、ハードウエアがスタック４００からスタックキャッシュ１５５内へのレジスタのロードを開始する。スタック管理ユニット１５０及びドリブル管理部ユニット１５１の詳細な実施例は、以下に、並びに本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０３８にて同じ日に出願された、「METHOD FRAME STORAGE USING MULTIPLE MEMORY CIRCUITS」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者James Michael O'Connor and Marc Tremblay）に記載されており、参照して、全体をここに組み込んでいる。
【０１８１】
ある実施例では、スタック管理ユニット１５０は、付加的なローカル変数ルックアサイド（look-aside）キャッシュ１５３を含む。キャッシュ１５３は応用時に最も重要であり、あるメソッドに対するローカル変数及びオペランドスタック４２３（図４Ａ）がスタックキャッシュ１５５上に配置されない。キャッシュ１５３がハードウエアプロセッサ１００に含まれないような場合には、ローカル変数がアクセスされるとき、スタックキャッシュ１５５においてミスがあり、実行ユニット１４０はデータキャッシュユニット１６０にアクセスし、次々に実行を遅らせる。対照的に、キャッシュ１５３を有する場合は、ローカル変数はキャッシュ１５３から回収され、実行に遅れは生じない。
【０１８２】
ローカル変数ルックアサイドキャッシュ１５３のある実施例は、スタック４００のメソッド０〜２の場合に、図４Ｄに示される。ローカル変数０〜Ｍは、Ｍが整数の場合に、メソッド０に対して、キャッシュ１５３の面４２１Ａ＿０においてストアされ、面４２１Ａ＿０はメソッド番号４０２が０のときアクセスされる。ローカル変数０〜Ｎは、Ｎが整数の場合に、メソッド１に対して、キャッシュ１５３の面４２１Ａ＿１においてストアされ、面４２１Ａ＿１はメソッド番号４０２が１のときアクセスされる。ローカル変数０〜Ｐは、Ｐが整数の場合に、メソッド１に対して、キャッシュ１５３の面４２１Ａ＿２においてストアされ、面４２１Ａ＿２はメソッド番号４０２が２のときアクセスされる。キャッシュ１５３の種々に面は異なるサイズである場合もあるが、一般にそのキャッシュの各面は経験的に画定される固定サイズを有するということに注意されたい。
【０１８３】
新しいメソッド、例えばメソッド２が呼出されるとき、キャッシュ１５３の新しい面４２１Ａ＿２がそのメソッドのローカル変数と共にロードされ、ある実施例ではカウンタであるメソッド番号レジスタ４０２が、変更、すなわちインクリメントされ、その新しいメソッドに対するローカル変数を含むキャッシュ１５３の面を示す。ローカル変数はキャッシュ１５３の面内にオーダされ、キャッシュ１５３は有効に直接マップ化（direct-mapped）キャッシュとなることに注意されたい。従って、ローカル変数が現在メソッドに対して必要とされるとき、その変数はキャッシュ１５３の最も新しい面、すなわちメソッド番号４０２により識別される面から直接アクセスされる。現在メソッドが、例えばメソッド２に戻るとき、メソッド番号レジスタ４０２は変更、例えばデクリメントされ、キャッシュ１５３の以前の面４２１Ａ＿１を示す。キャッシュ１５３は必要とされる広さ及び深さになることができる。
【０１８４】
データキャッシュユニット
データキャッシュユニット１６０（ＤＣＵ）は、データキャッシュ１６５内のデータに対する全ての要求を管理する。データキャッシュ要求は、ドリブル管理部１５１或いは実行ユニット１４０から起こる。データキャッシュ制御部１６１は、実行ユニット要求に先行して与えられるこれらの要求間の調整をする。ある要求に応じて、データキャッシュ制御部１６１は、そのデータに対するアドレス、データ並びに制御信号を発生し、データキャッシュ１６５内のＲＡＭにタグ付けする。データキャッシュヒットに対して、データキャッシュ制御部１６１はデータＲＡＭ出力をリオーダし、その正確なデータを与える。
【０１８５】
またデータキャッシュ制御部１６１は、データキャッシュミスの場合、並びにキャッシュ不可能なロード及びストアの場合に、Ｉ／Ｏバス及びメモリインタフェースユニット１１０に対する要求を発生する。データキャッシュ制御部１６１はデータパス及び制御ロジックを与え、キャッシュ不可能要求、並びにキャッシュミスを処理するためのデータパス及びデータパス制御機能を処理する。
【０１８６】
データキャッシュヒットに対して、データキャッシュユニット１６０は、ロードに対する１サイクル内に、データを実行ユニット１４０に戻す。またデータキャッシュユニット１６０は、書込みヒットに対して１サイクルかかる。キャッシュミスの場合に、データキャッシュユニット１６０は、要求データが外部メモリから利用可能になるまで、パイプラインをストールする。キャッシュ不可能ロード及びストアに対して、データキャッシュ１６１はバイパスされ、要求はＩ／Ｏバス及びメモリインタフェースユニット１１０に送られる。データキャッシュ１６５に対する非配列化（non-aligned）ロード及びストアはソフトウエアにおいてトラップされる。
【０１８７】
データキャッシュ１６５は、双方向セット連想型、ライトバック、ライトアロケート（write allocate）、１６−ｂｙｔｅラインキャッシュである。キャッシュサイズは０，１，２，４，８，１６Ｋｂｙｔｅサイズに構成可能である。デフォルトサイズは８Ｋｂｙｔｅである。各ラインはそのラインに関連するキャッシュタグストアエントリを有する。キャッシュミス時に、１６ｂｙｔｅのデータが外部メモリからキャッシュ１６５内に書き込まれる。
【０１８８】
各データキャッシュタグは、２０−ｂｉｔアドレスタグフィールド、１つの有功ビット、１つのダーティビットを含む。また各キャッシュタグは、置換えポリシー（replacement policy）のために用いられる最低使用頻度ビット（least recently used bit）に関連する。多重キャッシュサイズをサポートするために、タグフィールドの幅は変更することができる。もしプロセッササービスレジスタ内のキャッシュイネーブルビットがセットされていないなら、ロード及びストアはデータキャッシュ制御部１６１により、キャッシュ不可能命令のように扱われる。
【０１８９】
１つの１６−ｂｙｔｅライトバックバッファが、置換えられるために必要となるダーティキャッシュラインをライトバックするために与えられる。データキャッシュユニット１６０は、読出し時に４ｂｙｔｅの最大値を与えることができ、データの４ｂｙｔｅの最大値は１サイクル内にキャッシュ１６１に書き込まれることができる。診断読出し及び書込みは、キャッシュ上で行うことができる。
【０１９０】
メモリ割当てアクセラレータ
１つの実施例において、データキャッシュユニット１６５はメモリ割当てアクセラレータ１６６を含む。一般に、新しいオブジェクトが生成されるとき、そのオブジェクトに対するフィールドは外部メモリからフェッチされ、データキャッシュ１６５内にストアされ、それからそのフィールドは０にクリアされる。これがメモリ割当てアクセラレータ１６６により削除される処理にかかる時間である。新しいオブジェクトが生成されるとき、いかなるフィールドも外部メモリから回収されない。むしろ、メモリ割当てアクセラレータ１６６は単に、データキャッシュ１６５内に０の列をストアし、データキャッシュ１６５のその列をダーティとしてマークする。メモリ割当てアクセラレータ１６６はライトバックキャッシュについて特に有利である。メモリ割当てアクセラレータ１６６は、新しいオブジェクトが生成される度に、外部メモリにアクセスすることを削除するので、ハードウエアプロセッサ１００のパフォーマンスが向上する。
【０１９１】
浮動小数点ユニット
浮動小数点ユニット（ＦＰＵ）１４３は、マイクロコードシーケンサ、入力／出力レジスタを有する入出力部分、浮動小数点加算器、すなわちＡＬＵ、並びに浮動小数点乗算／除算ユニットを含む。マイクロコードシーケンサは、マイクロコードフロー及びマイクロコード分岐を制御する。入出力部分は入出力データトランザクションを制御し、入力データロードレジスタ及び出力データ非ロードレジスタを与える。またこれらのレジスタは中間結果記憶領域を与える。
【０１９２】
浮動小数点加算器ＡＬＵは、浮動小数点加算、浮動小数点減算並びに変換演算を実行するために用いられる組み合わせロジックを含む。浮動小数点乗算／除算ユニットは乗算／除算及び剰余を実行するためのハードウエアを含む。
【０１９３】
浮動小数点ユニット１４３は、３２−ｂｉｔデータパスを有するマイクロコード用エンジンとして構成される。このデータパスは、その結果の計算中、何回も再利用される。倍精度演算は、単精度演算としてのサイクル数のおよそ２倍〜４倍を必要とする。浮動小数点実行可能信号は、所定の浮動小数点演算の完了に先行する１サイクルにアサートされる。これにより整数ユニット１４２は、全くインタフェースサイクルを無駄にせず、浮動小数点ユニット出力レジスタを読出すことができる。従って、出力データは、浮動小数点実行可能信号がアサートされた後の１サイクルで読出すために利用することができる。
【０１９４】
実行ユニットアクセラレータ
付録ＩのＪＡＶＡ仮想マシン仕様はハードウエアに依存しないので、仮想マシン命令は特定の汎用タイプのプロセッサ、例えば複雑命令セットコンピュータ（ＣＩＳＣ）プロセッサ、或いは限定命令セットコンピュータ（ＲＩＳＣ）プロセッサに対して最適化されてない。実際に、ある仮想マシン命令はＣＩＳＣ性を有し、他のものはＲＩＳＣ性を有する。この二重性は演算及びハードウエアプロセッサ１００の最適化を複雑にする。
【０１９５】
例えば、ＪＡＶＡ仮想マシン仕様は、従来のスイッチステートメントである、命令lookupswitchに対するオペコード１７１を定義する。命令キャッシュユニット１２０に対するデータストリームは、オペコード１７１を含み、オペコード１７１によりＮ方向スイッチステートメントを識別し、３ｂｙｔｅの埋込みバイトに０を生じさせる。埋込みバイト数は、第１のオペランドバイトが４の倍数であるアドレスで開始するように選択される。ここで、データストリームは、特定の要素、ブロック、素子或いはユニットに提供される情報を包括的に示すために用いられる。
【０１９６】
データストリーム内の埋込みバイトに後続するのは、一連の符号付４ｂｙｔｅ量の組である。第１組内の第１のオペランドは、スイッチステートメントに対するデフォルトオフセットであり、整数キー、或いは現在照合（match）値として参照される、そのスイッチステートメントの引数が、そのスイッチステートメント内のいかなる照合値とも等しくないとき用いられる。第１組内の第２のオペランドは、データストリーム内に後続する組数を定義する。
【０１９７】
データストリーム内の各後続するオペランドの組は、照合値である第１のオペランド及びオフセットである第２のオペランドを有する。もし整数キーが照合値の１つに等しいなら、その組のオフセットはそのスイッチステートメントのアドレスに加えられ、実行が分岐するアドレスを定義する。逆にもしその整数キーがいかなる照合値にも等しくないなら、第１組のデフォルトオフセットがそのスイッチステートメントに加えられ、実行が分岐するアドレスを定義する。この仮想マシン命令の直接の実行が多くのサイクルを必要とする。
【０１９８】
ハードウエアプロセッサ１００のパフォーマンスを向上させるために、ルックアップスイッチアクセラレータ１４５がプロセッサ１００に含まれる。ルックアップスイッチアクセラレータ１４５は、１つ或いは２つ以上のルックアップスイッチステートメントに関連する情報をストアする連想メモリを含む。各ルックアップスイッチステートメント、すなわち各命令lookupswitchの場合、この情報はルックアップスイッチ識別子値、すなわちルックアップスイッチステートメントに関連するプログラムカウンタ値、複数の照合値並びに対応する複数のジャンプオフセット値を含む。
【０１９９】
ルックアップスイッチアクセラレータ１４５はハードウエアプロセッサ１００により受信される現在命令が連想メモリ内にストアされるルックアップスイッチステートメントに対応するか否かを判定する。ルックアップスイッチアクセラレータ１４５はさらに、その現在命令に関連する現在照合値が、その連想メモリ内にストアされる照合値の１つに一致するか否かを判定する。ルックアップスイッチアクセラレータ１４５は、その現在命令がメモリ内にストアされるルックアップスイッチステートメントに対応し、かつ現在照合値がメモリ内にストアされる照合値の１つに一致するとき、連想メモリからのジャンプオフセット値にアクセスする。そのアクセスされたジャンプオフセット値は現在照合値に一致する。
【０２００】
ルックアップスイッチアクセラレータ１４５はさらに、その連想メモリが、現在ルックアップスイッチステートメントに関連する照合値及びジャンプオフセット値をまだ含んでいないとき、現在ルックアップスイッチステートメントに関連する照合値及びジャンプオフセット値を回収するための回路を含む。ルックアップスイッチアクセラレータ１４５は、本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０４０にて同じ日に出願された、「LOOK-UP SWITCH ACCELERATOR AND METHOD OF OPERATING SAME」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay and James Michael O'Connor）にさらに詳細に記載されており、参照して、全体をここに組み込んでいる。
【０２０１】
あるオブジェクトのメソッドの実行を開始するための処理において、実行ユニット１４０は、メソッドベクトルにアクセスし、メソッドベクトル内のメソッドポインタの１つ、すなわち無方向（indirection）の１つのレベルを回収する。その後実行ユニット１４０は、アクセスされるメソッドポインタを用いて、対応するメソッド、すなわち無方向の第２のレベルにアクセスする。
【０２０２】
実行ユニット１４０内の無方向のレベルを減少させるために、各オブジェクトは、そのオブジェクトによりアクセスされるべき各メソッドの専用の複製を与える。その後実行ユニット１４０は、無方向の１つのレベルを用いてそのメソッドにアクセスする。すなわち、各メソッドはそのオブジェクトから導出されるポインタにより、直接アクセスされる。これはそのメソッドポインタにより予め導入されていた無方向のレベルを削除する。無方向のレベルを減少させることにより、実行ユニット１４０の演算を加速することができる。実行ユニット１４０により経験された無方向のレベルを減少させることによる実行ユニット１４０の加速は、本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０４３にて同じ日に出願された、「REPLICATING CODE TO ELIMINATE A LEVEL OF INDIRECTION DURING EXECUTION OF AN OBJECT ORIENTED COMPUTER PROGRAM」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay and James Michael O'Connor）にさらに詳細に記載されており、参照して、全体をここに組み込んでいる。
【０２０３】
ゲットフィールド−プットフィールドアクセラレータ
他の特定の機能ユニット及び種々の翻訳ルックアサイドバッファ（ＴＬＢ）タイプの構造は、ハードウエアプロセッサ１００に任意に含まれ、コンスタントプールへのアクセスを加速する。例えば、ＪＡＶＡ仮想マシン仕様は、実行時にオブジェクト内にフィールドをセットする、命令putfield、オペコード１８１、並びに実行時にオブジェクトからフィールドをフェッチする、命令getfield、オペコード１８０を定義する。これら両方の命令では、そのオペコードには、インデクスバイト１及びインデクスバイト２が後続する。オペランドスタック４２３は、命令getfieldの場合のオブジェクトに対する参照のみを除いて、命令putfieldに対する値により後続されるオブジェクトに対する参照を含む。
【０２０４】
インデクスバイト１及び２は、現在クラスのコンスタントプール内にインデクスを発生させるために用いられる。そのインデクスでのコンスタントプールにおける項目は、クラス名及びフィールド名に対するフィールド参照である。その項目は、バイト状態でのフィールド幅及びバイト状態でのフィールドオフセットの両方を有するフィールドブロックポインタに分解される。
【０２０５】
実行ユニット１４０内の任意のゲットフィールド−プットフィールドアクセラレータ１４６は、タグとしてフィールドブロックポインタに分解されたコンスタントプール内の項目を識別するために用いられるインデクスと共に、命令の最初の呼出し後に用いるために、キャッシュ内に命令getfield及び命令putfieldに対するフィールドブロックポインタをストアする。引き続いて、実行ユニット１４０はインデクスバイト１及び２を用いて、インデクスを発生させ、ゲットフィールド−プットフィールドアクセラレータ１４６にインデクスを供給する。もしそのインデクスがタグとしてストアされたインデクスの１つに一致する、すなわちヒットであるなら、そのタグに関連するフィールドブロックポインタは回収され、実行ユニット１４０により用いられる。逆にもし一致が見出されなければ、実行ユニット１４０は、上述の演算を実行する。ゲットフィールド−プットフィールドアクセラレータ１４６は、上述の迅速な命令翻訳の１つの実施例において用いられた自己修飾コード（self-modifying code）を用いることなくインプリメントされる。
【０２０６】
１つの実施例では、ゲットフィールド−プットフィールドアクセラレータ１４６はタグとして機能するインデクスを保持する第１の部分、及びフィールドブロックポインタを保持する第２の部分を有する連想メモリを含む。あるインデクスが、入力部分を通して、その連想メモリの第１の部分に加えられる、かつストアされたインデクスの１つに一致するとき、入力インデクスに一致したストアされたインデクスに関連するフィールドブロックポインタは、その連想メモリの第２の部分から出力される。
【０２０７】
境界チェックユニット
実行ユニット１４０内のバウンドチェックユニット１４７（図１）は、任意のハードウエア回路であり、配列（array）の要素への各アクセスをチェックし、そのアクセスがその配列内の位置に対するものであるか否かを判定する。そのアクセスがその配列内の位置に対するものであるとき、境界チェックユニット１４７は、実行ユニット１４０に対して、アクティブ配列境界例外信号を発行する。アクティブ配列境界例外信号に応じて、実行ユニット１４０は、マイクロコードＲＯＭ１４１内にストアされた、その境界外配列アクセス（out of bounds array access）を処理する例外ハンドラの実行を開始する。
【０２０８】
１つの実施例では、境界チェックユニット１４７は、配列に対する配列識別子、例えばプログラムカウンタ値、並びにその配列に対する最大値及び最小値をストアされた連想メモリ素子を含む。ある配列がアクセスされる、すなわちその配列に対する配列識別子が連想メモリ素子に適用されるとき、さらにその配列がその連想メモリ素子において表されると仮定するとき、ストアされた最小値は、比較素子とも呼ばれる、第１の比較器素子に対する第１の入力信号であり、ストアされた最大値は、比較素子とも呼ばれる、第２の比較器素子に対する第１の入力信号である。その第１及び第２の比較器素子に対する第２の入力信号は、配列の素子のアクセスに関連する値である。
【０２０９】
もし配列の素子のアクセスに関連する値が、ストアされた最大値以下で、かつストアされた最小値以上であるなら、いずれの比較器素子も出力信号を発生しない。しかしながら、もしこれらの条件のいずれかが正しくないなら、適切な比較器素子がアクティブ配列境界例外信号を発生する。境界チェックユニット１４７の１つの実施例のさらに詳細な内容は、本発明の譲渡人に譲渡され、代理人整理番号ＳＰ２０４１にて同じ日に出願された、「PROCESSOR WITH ACCELERATED ARRAY ACCESS BOUNDS CHECKING」というタイトルの米国特許出願第０８／ｘｘｘ，ｘｘｘ号（発明者Marc Tremblay, James Michael O'Connor, and William N. Joy）にさらに詳細に記載されており、参照して、全体をここに組み込んでいる。
【０２１０】
ＪＡＶＡ仮想マシン仕様は、一定の命令は一定の例外を引き起こすことを定義している。この例外条件に対するチェックはインプリメントされ、それらを処理するためのハードウエア／ソフトウエア機構が、マイクロコードＲＯＭ１４９、並びにプログラムカウンタ及びトラップ制御ロジック１７０内の情報により、ハードウエアプロセッサ１００に与えられる。代替の機構は、トラップベクトルスタイル或いは単一のトラップターゲットを有し、スタック上のトラップタイプをプッシュし、専用のトラップハンドラルーチンが適切な動作を画定するような機構を含む。
【０２１１】
ハードウエアプロセッサ１００には、いかなる外部キャッシュも必要ではない。いかなる翻訳ルックアサイドバッファのサポートも必要ではない。
【０２１２】
図５は固有のシステムを形成するためのハードウエアプロセッサ１００に対するいくつかの可能なアドオンを示す。そこに示す任意の８つの機能をサポートする回路、すなわちＮＴＳＣエンコーダ５０１、ＭＰＥＧ５０２、イーサネット制御部５０３、ＶＩＳ５０４、ＩＳＤＮ５０５、Ｉ／Ｏ制御部５０６、ＡＴＭアセンブリ／リアセンブリ５０７、並びに無線リンク５０８は、本発明のハードウエアプロセッサ１００と同じチップ内に集積化される。
【０２１３】
本発明の様々な実施例について説明してきたが、これらの実施例は例示に過ぎず本発明の範囲を限定しようとするものではないということは理解されよう。例えば第１命令、第２命令、第３命令等の用語は、内容を区別するために使用した用語に過ぎず、命令の特定の順序付けを必要とするように構成する必要はない。ここに開示した実施例の多くの様々な改変、追加、及び改良が可能である。例えば、本発明のJAVAプログラム言語及びJAVA仮想マシンに関連した実施例のみについて説明したが、実施例はこれに限定されず、代わりに様々なスタックマシン環境（仮想環境及び物理的環境の双方）に対するシステム、もの、方法、及び装置が本発明の範囲に含まれる。更に、ここに開示した実施例はハードウェアの実施例であるが、上述の内容に基づく命令フォールディング処理を組み込んだ適切な仮想マシンインプリメンテーション（JAVAが関連するもの又はそうでないもの）が、命令フォールディングバイトコードインタプリタ、特定のマシンアーキテクチャにネイティブなオブジェクトコードにおけるフォールディングされたオペレーションを生成するジャストインタイムコンパイラ、及び仮想マシンをインプリメントする命令フォールディングハードウェアを提供するソフトウェアもその範囲に含まれている。これらの及び他の様々な変更及び追加及び改良は、請求の範囲に記載の本発明の範囲を逸脱することなく実現され得る。
【図面の簡単な説明】
【０２１４】
【図１Ａ】図１Ｂとともに、本発明による命令フォールディング処理が可能な命令デコーダを含む、仮想マシンハードウェアプロセッサの一実施例を示すブロック図である。
【図１Ｂ】図１Ａとともに、本発明による命令フォールディング処理が可能な命令デコーダを含む、仮想マシンハードウェアプロセッサの一実施例を示すブロック図である。
【図２】本発明の一実施例において用いられる仮想マシン命令の生成のためのプロセスフロー図である。
【図３】図１のハードウェアプロセッサにおいて実現された命令パイプラインを示した図である。
【図４Ａ】スタック構造の論理的編成の一実施例を示した図であり、ここでは各メソッドフレームが、図１のハードウェアプロセッサが使用するローカル変数ストレージエリア、環境ストレージエリア、及びオペランドスタックを含む。
【図４Ｂ】スタック構造の論理的編成の別の実施例を示した図であり、ここでは各メソッドフレームが、ローカル変数ストレージエリア及びスタック上のオペランドスタックを含み、メソッドフレームのための環境ストレージエリアが、個別実行環境スタック上に含められている。
【図４Ｃ】図４Ｂの実行環境スタック及びスタック用のスタック管理ユニットの別の実施例を示した図である。
【図４Ｄ】第１のスタック管理ユニットにおけるローカル変数ルックアサイドキャッシュの一実施例を示した図である。
【図５】図１のハードウェアプロセッサに対するいくつかの可能なアドオンを示した図である。
【図６】スタックデータ構造のコンテキストにおける、一対のスタック構造が関与するデータフローを示した図であり、ここではスタックから最上部２つのスタックエントリをポップし、それらの合計をスタックの先頭にプッシュする第２スタック命令により消費されるのみであるスタックの先頭に第１スタック命令がデータ項目をプッシュする。
【図７】図６に示されたもののような第１及び第２スタック命令のフォールディングされた実行を対照して示した図であり、ここでは、本発明の実施例により第１オペレーション（データ項目をスタックの先頭にプッシュする）が不要になっている。
【図８】本発明の実施例による。オペランドスタック、ローカル変数ストレージ、及びメモリストレージのコンスタントプール部分、並びにそれにアクセスするためのレジスタ変数の間の関係を示したブロック図である。
【図９Ａ】オペランドスタック及びローカル変数ストレージに作用するiload（整数ロード）／iadd（整数加算）／istore（整数ストア）命令シーケンスを示した図であり、iload命令前のオペランドスタックの内容を示した図である。
【図９Ｂ】オペランドスタック及びローカル変数ストレージに作用するiload（整数ロード）／iadd（整数加算）／istore（整数ストア）命令シーケンスを示した図であり、iload命令の後iadd命令の前のオペランドスタックの内容を示した図である。図９Ｂ及び図９Ｃに示す中間段階は、本発明の実施例による命令フォールディング処理により省くことができる。
【図９Ｃ】オペランドスタック及びローカル変数ストレージに作用するiload（整数ロード）／iadd（整数加算）／istore（整数ストア）命令シーケンスを示した図であり、iload命令の後iadd命令の前のオペランドスタックの内容を示した図である。図９Ｂ及び図９Ｃに示す中間段階は、本発明の実施例による命令フォールディング処理により省くことができる。
【図９Ｄ】オペランドスタック及びローカル変数ストレージに作用するiload（整数ロード）／iadd（整数加算）／istore（整数ストア）命令シーケンスを示した図であり、istoreの後のオペランドスタックの内容を示した図である。
【図１０Ａ】オペランドスタック及びローカル変数ストレージ上に作用するaload（オブジェクト参照ロード）／arraylength（定数加算）命令シーケンスを示した図であり、aload命令前のオペランドスタックの内容を示している。
【図１０Ｂ】オペランドスタック及びローカル変数ストレージ上に作用するaload（オブジェクト参照ロード）／arraylength（定数加算）命令シーケンスを示した図であり、aload命令後arraylength前の（命令フォールディングなし）オペランドスタックの内容を示している。図１０Ｂに示す中間段階は、本発明の実施例による命令フォールディング処理によって省くことができる。
【図１０Ｃ】オペランドスタック及びローカル変数ストレージ上に作用するaload（オブジェクト参照ロード）／arraylength（定数加算）命令シーケンスを示した図であり、arraylength命令後のオペランドスタックの内容を示している。
【図１１】本発明の実施例による命令フォールディング処理を提供する命令デコーダを含むスタックを利用するプロセッサの機能ブロック図である。
【図１２】本発明の実施例による命令デコーダを示すフローブロック図であり、フォールディング処理済オペレーションを実行ユニットに供給し、オペランドアドレスをアドレススタック、ローカル変数ストレージ、又はコンスタントプールに供給し、行先アドレスをオペランドスタック又はローカル変数ストレージに供給するように外部命令デコーダが接続されているところが示されており、供給される１つのオペレーション及びアドレスはフォールディングされていない命令のシーケンスと等価である。
【図１３】本発明の実施例による命令フォールディング処理をサポートしている命令デコーダの機能ブロック図である。
【図１４】本発明の実施例による命令フォールディング処理をサポートしている命令デコーダのフォールドデコード部の機能ブロック図である。
【図１５Ａ】図１５Ｂとともに、本発明の実施例によるフォールディング可能な命令シーケンスを特定するためのオペレーションのシーケンスの１例を示した流れ図である。
【図１５Ｂ】図１５Ａとともに、本発明の実施例によるフォールディング可能な命令シーケンスを特定するためのオペレーションのシーケンスの１例を示した流れ図である。
【図１６】本発明の実施例によるフォールドアドレスジェネレータの行先アドレスジェネレータ及び構成要素オペランドを示した機能ブロック図である。
【図１７】本発明の実施例による、オペランドアドレスジェネレータのための構造の例を示した機能ブロック図である。
【図１Ａ】
2006216069.tif 000003
【図１Ｂ】
2006216069.tif 000004
【図２】
2006216069.tif 000005
【図３】
2006216069.tif 000006
【図４Ａ】
2006216069.tif 000007
【図４Ｂ】
2006216069.tif 000008
【図４Ｃ】
2006216069.tif 000009
【図４Ｄ】
2006216069.tif 000010
【図５】
2006216069.tif 000011
【図６】
2006216069.tif 000012
【図７】
2006216069.tif 000013
【図８】
2006216069.tif 000014
【図９Ａ】
2006216069.tif 000015
【図９Ｂ】
2006216069.tif 000016
【図９Ｃ】
2006216069.tif 000017
【図９Ｄ】
2006216069.tif 000018
【図１０Ａ】
2006216069.tif 000019
【図１０Ｂ】
2006216069.tif 000020
【図１０Ｃ】
2006216069.tif 000021
【図１１】
2006216069.tif 000022
【図１２】
2006216069.tif 000023
【図１３】
2006216069.tif 000024
【図１４】
2006216069.tif 000025
【図１５Ａ】
2006216069.tif 000026
【図１５Ｂ】
2006216069.tif 000027
【図１６】
2006216069.tif 000028
【図１７】
2006216069.tif 000029
【手続補正書】
【提出日】平成18年3月29日(2006.3.29)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
レジスタストレージに存在するデータを操作するべく動作可能な実行ユニットと、
複数の連続したスタックベースの命令をデコードし、デコードされた前記複数の連続したスタックベースの命令に対応する１個のレジスタベースのオペレーションを前記実行ユニットに実行させるべく動作可能な命令デコーダとを有することを特徴とする装置。
【請求項２】
前記１個のレジスタベースのオペレーションが、前記レジスタストレージにおける処理結果の格納位置、及び前記レジスタストレージにおける２以上のソースの格納位置を明示的に特定することを特徴とする請求項１に記載の装置。
【請求項３】
前記命令デコーダが、前記レジスタストレージの複数のエントリを選択するべく動作可能であり、選択された前記複数のエントリは、デコードされた前記複数の連続したスタックベースの命令によって明示的及び暗示的に標的とされるスタック及びローカル変数の格納位置の部分集合に対応することを特徴とする請求項１に記載の装置。
【請求項４】
前記レジスタストレージにおけるスタック及びローカル変数の部分をさらに含み、デコードされた前記複数の連続したスタックベースの命令の少なくとも１つが、１つのローカル変数から前記スタックの先頭への情報の転送を定義することを特徴とする請求項１に記載の装置。
【請求項５】
前記命令デコーダが、命令フォールディングジャストインタイムコンパイラの一部であることを特徴とする請求項１に記載の装置。
【請求項６】
前記命令デコーダが、仮想マシンを実現する命令フォールディングバイトコードインタプリタの一部であることを特徴とする請求項１に記載の装置。
【請求項７】
前記命令デコーダが、命令フォールディングハードウェアを含むことを特徴とする請求項１に記載の装置。
【請求項８】
前記実行ユニットにネイティブなオブジェクトコードを生成するべく実行可能なジャストインタイムコンパイラをさらに含むことを特徴とする請求項１に記載の装置。
【請求項９】
スタックベースの命令のシーケンスをフェッチする過程と、
複数の連続したスタックベースの命令をデコードする過程と、
デコードされた前記複数の連続したスタックベースの命令に対応する１個のレジスタベースのオペレーションを実行ユニットに実行させる過程とを含むことを特徴とする方法。
【請求項１０】
前記スタックベースの命令のデコードを、ジャストインタイムコンパイラにおいて行って、前記実行ユニットを含むプロセッサにネイティブなオブジェクトコードを生成することを特徴とする請求項９に記載の方法。
【請求項１１】
前記スタックベースの命令のデコードを、命令フォールディングジャストインタイムコンパイラを用いて行うことを特徴とする請求項９に記載の方法。
【請求項１２】
前記スタックベースの命令のデコードを、命令フォールディングバイトコードインタプリタを用いて行うことを特徴とする請求項９に記載の方法。
【請求項１３】
前記スタックベースの命令のデコードを、命令フォールディングハードウェアを用いて行うことを特徴とする請求項９に記載の方法。
【請求項１４】
レジスタストレージの複数のエントリを選択する過程であって、前記選択されるエントリは、前記複数のデコードされたスタックベースの命令によって明示的及び暗示的に標的とされるスタック及びローカル変数の格納位置の部分集合に対応する、該過程をさらに有することを特徴とする請求項９に記載の方法。
【請求項１５】
コンピュータシステムであって、
命令ソースと、
レジスタストレージと、
プロセッサと、
前記命令ソースからスタックベースの命令を受け取り、前記スタックベースの命令の一部である複数の連続した命令群を１個の対応するレジスタベースのオペレーションに変換し、前記プロセッサに、前記レジスタストレージにおけるソースと処理結果の位置に対する明示的な識別子を用いて前記レジスタに存在するデータを操作させる変換手段とを有することを特徴とするコンピュータシステム。
【請求項１６】
前記変換手段が、前記プロセッサにネイティブなオブジェクトコードを生成するべく前記スタックベースの命令をコンパイルする手段を含むことを特徴とする請求項１５に記載のコンピュータシステム。
【請求項１７】
前記変換手段が、ジャストインタイムコンパイラを用いて命令をフォールディングする手段を含むことを特徴とする請求項１５に記載のコンピュータシステム。
【請求項１８】
前記変換手段が、バイトコードインタプリタを用いて命令をフォールディングする手段を含むことを特徴とする請求項１５に記載のコンピュータシステム。
【請求項１９】
前記変換手段が、ハードウェアデコーダを用いて命令をフォールディングする手段を含むことを特徴とする請求項１５に記載のコンピュータシステム。