(57)【特許請求の範囲】
【請求項１】
命令デコーダと、複数のレジスタ領域からなる汎用レジスタと、少なくとも１つの演算器とを有するプロセッサと、Ｊａｖａバイトコード列を上記プロセッサに固有の命令列に変換して上記命令デコーダに供給するＪａｖａアクセラレータとからなるプロセッサシステムにおいて、
上記Ｊａｖａアクセラレータが、上記汎用レジスタの各レジスタ領域の使用状態を示す状態情報を記憶するための手段と、上記状態情報に基づいて空き状態にあるレジスタ領域または解放すべきレジスタ領域を選択することによって、Ｊａｖａのオペランドスタックを上記汎用レジスタに動的にマッピングするための手段とを備えたことを特徴とするプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプロセッサシステムに関し、特にＪａｖａアクセラレータを備えたプロセッサシステムに関する。
【背景技術】
【０００２】
近年、マイクロプロセッサの組み込み用途では、アプリケーションソフトとしてＪａｖａが広く使われ始めている。その理由は、ハードウェアまたはソフトウェアの形式でＪＶＭ(Java Virtual Machine)が実装されたマシンであれば、プロセッサの種類やシステムの構成に関係なくＪａｖａプログラムを動作できるというプログラムの可搬性に優れているからである。Ｊａｖａプログラムでは、スタック演算を基本としており、プログラム命令（Ｊａｖａでは「バイトコード」と称されている）にオペランド指定部が不要であることから、オブジェクトコードのサイズが小さいと言う利点がある。また、Ｊａｖａプログラムでは、データ型式についての概念が厳密で、且つ、プログラムの実行前にバイトコードのベリフィケーションが行われるため、セキュリティに優れると言う利点もある。
【０００３】
Ｊａｖａを利用した組み込みシステムの多くは、ＪＶＭ機能をソフトウェアで実現している。その理由は、Ｊａｖａプログラムが、Ｊａｖａ以外のソフトウェア、例えば、ＯＳやＭＰＧ４のようなマルチメディア・アプリケーションプログラムなどと同一プロセッサで実行できるためである。しかしながら、ソフトウェアで実現されたＪＶＭ環境下でＪａｖａプログラムを実行した場合、同一の処理内容をプロセッサに固有の命令で記述したプログラムを実行した場合と比較して、プログラムの実行速度の方が極端に遅くなるという問題がある。例えば、Dhrystoneベンチマーク・プログラムをＣ言語で記述し、これをコンパイルして実行した場合と、上記プログラムをＪａｖａで記述してＪＶＭ上で実行した場合を比較すると、数十倍の性能差がある。その主な原因として、次の２点が挙げられる。
【０００４】
（１）ＪＶＭ上では、Ｊａｖａ命令（バイトコード）がインタプリタによって実行されるため、インタプリタのオーバヘッドが生じる。
（２）Ｊａｖａの実行モデルは、スタック上での演算を仮定しているため、Ｊａｖａプログラムをレジスタベースの通常のプロセッサで実行した場合、必然的にメモリアクセスが頻発し、演算器で余計な実行サイクルを必要とする。
【０００５】
Ｊａｖａプログラムを高速に実行するための従来技術として、ソフトウェアで構成されたＪＩＴ（Just In Compiler）と、ハードウェアで構成されたアクセラレータが知られている。但し、ＪＩＴは大きなメモリ容量を必要とするため、今後、メモリ容量に制約のある組み込み用途の多くは、ハードウェア・アクセラレータを採用する傾向にある。
【０００６】
ハードウェア・アクセラレータとしては、専用プロセッサタイプのものから、既存のプロセッサの一部にアクセラレータ機能を組み込んだタイプのものまで、種々の形態のものが提案されている。後者のアクセラレータとしては、例えば、ARM社のJazelleや、Nazomi Communication社のJSTARなどがある。
【０００７】
例えば、文献"Java to Go：Part1, Microprocessor Report, Feb 12, 2001"（非特許文献１）や、WO 00/34844（PCT/US99/28782）号公報（特許文献１）に記載された“Java Virtual Machine Hardware for RISC and CISC Processors”では、命令キャッシュから読み出したバイトコードをハードウェア・トランスレータでプロセッサに固有の命令に変換することによって、原因（１）のインタプリタ・オーバヘッドを低減してプログラムの実行速度を高速化している。
【０００８】
ＪＶＭは、例えば、第６図に概略的に示すように、インタプリタ９０が参照する領域として、バイトコード列８１とコンスタントプール８２とが定義されるクラスデータ領域８０と、配列オブジェクト８４とインスタンス変数などのフィールド８５が定義されるインスタンスデータ領域８３と、フレームスタック８６とを含む。フレームスタック８６は、それぞれオペランドスタック８８とローカル変数領域８９とからなる複数のフレーム８７からなり、ＪＶＭ内で演算に使用される変数は、基本的に各フレームスタック８６内のローカル変数領域８９に定義される。ＪＶＭのインタプリタ９０は、バイトコード列８１から順次にバイトコードを読み込み、各バイトコードが示すＪａｖａ命令をプロセッサ９１に固有の命令形式に次々と変換する。第６図において、括弧内は、代表的なＪａｖａ命令を上述した各領域と対応付けて例示したものである。
【０００９】
Ｊａｖａプログラムでは、各演算に先立って、ローカル変数領域８９に定義された変数のうち、演算に必要なものをオペランドスタック８８のスタックトップに積み込む操作が行なわれる。この操作は、バイトコードで指定されたロード命令（例えば、iload）によって行われ、演算に必要なオペランドがオペランドスタック８８に積み込まれた後、上記スタックトップを暗黙的なオペランドとして指定した演算命令が発行される。上記演算命令によって、スタックトップの内容をオペランドとした演算動作が実行され、演算結果は、オペランドスタック８８のスタックトップに一時的に格納される。上記演算結果は、最終的にはフレームスタック内のローカル変数領域８９に格納する必要があり、演算結果のローカル変数領域８９への格納は、次のバイトコードが示すストア命令（例えば、istore）によって実現される。
【先行技術文献】
【特許文献】
【００１０】
WO 00/34844（PCT/US99/28782）号公報
【非特許文献】
【００１１】
Java to Go: Part1, Microprocessor Report, Feb 12, 2001
【発明の概要】
【発明が解決しようとする課題】
【００１２】
このように、ＪＶＭの実行環境においては、各演算の都度、ローカル変数をスタックトップに移し、演算結果をスタックトップからローカル変数領域に移すという動作が発生するため、汎用レジスタをオペランド領域として使用する通常のプロセッサでＪａｖａプログラムを実行しようとすると、汎用レジスタへのアクセスが頻繁に発生する。
【００１３】
前述したWO 00/34844（PCT/US99/28782）号公報では、汎用レジスタのうち、例えば、Ｒ０〜Ｒ５をオペランドスタックの上位６つにマッピングし、Ｒ６とＲ７をローカル変数用にマッピングしている。また、文献"Java to Go: Part1, Microprocessor Report, Feb 12, 2001" では、第３頁に記載されているように、汎用レジスタのＲ０〜Ｒ３をオペランドスタックの上位４つにマッピングし、Ｒ４に０番目のローカル変数をマッピングしている。
【００１４】
然るに、これらの従来技術では、汎用レジスタへのオペランドスタックとローカル変数のマッピングが双方とも固定的なものとなっているため、汎用レジスタの使用に柔軟性を欠き、汎用レジスタの使用効率を低下させている。また、これらの従来技術では、レジスタベースのプロセッサによって、バイトコード列が指定する全てのＪａｖａ命令を忠実に実行しており、Ｊａｖａプログラム実行速度の遅延原因（２）として指摘した余計な実行サイクルの回避について何ら考慮されていない。
【００１５】
本発明の目的は、冗長な命令の実行サイクルを省略し、Ｊａｖａプログラムの実行速度を向上させたプロセッサシステムを提供することにある。
本発明の他の目的は、オペランドスタックとローカル変数の汎用レジスタへのマッピングを柔軟に制御できるＪａｖａアクセラレータを備えたプロセッサシステムを提供することにある。
【課題を解決するための手段】
【００１６】
上記課題を解決するために、本発明は、命令デコーダと、複数のレジスタ領域からなる汎用レジスタと、少なくとも１つの演算器とを有するプロセッサと、Ｊａｖａバイトコード列を上記プロセッサに固有の命令列に変換して上記命令デコーダに供給するＪａｖａアクセラレータとからなるプロセッサシステムにおいて、上記Ｊａｖａアクセラレータが、上記プロセッサにとって冗長となるバイトコードを検出するための手段を備え、該検出手段によって冗長バイトコードが検出された時、上記命令デコーダへの固有命令の供給を抑制することを特徴とする。
【００１７】
更に詳述すると、上記Ｊａｖａアクセラレータは、Ｊａｖａバイトコード列を前記プロセッサに固有の命令列に変換するバイトコードトランスレータと、上記バイトコードトランスレータで処理中のＪａｖａバイトコードに応じて、Ｊａｖａのオペランドスタックを前記汎用レジスタの何れかのレジスタ領域にマッピングするためのレジスタ状態制御ユニットとからなり、
上記バイトコードトランスレータにおいてオペランドスタックへのローカル変数のロード命令を示すバイトコードが処理されている間に、上記レジスタ状態制御ユニットが、上記バイトコードが冗長か否かを判定し、冗長バイトコードとして検出された時、上記バイトコードトランスレータに対して固有命令の出力抑制信号を発行する。
【００１８】
本発明の１つの特徴は、上記レジスタ状態制御ユニットが、上記汎用レジスタの各レジスタ領域の使用状態を記憶するための手段を備え、上記汎用レジスタの使用状態に応じてＪａｖａのオペランドスタックを上記汎用レジスタの何れかのレジスタ領域に動的にマッピングすることにある。
【００１９】
本発明の１実施例では、上記レジスタ状態制御ユニットが、汎用レジスタの各レジスタ領域と該レジスタ領域に設定されている変数との対応関係を記憶するためのレジスタ内容管理手段を有し、上記バイトコードトランスレータにおいてオペランドスタックへの変数ロード命令を示すバイトコードが処理されている時、上記変数ロード命令で扱う変数と上記レジスタ内容管理手段に記憶された変数とを照合することによって、上記バイトコードが冗長か否かを判定する。
【発明の効果】
【００２０】
本発明のプロセッサシステムによれば、Ｊａｖａアクセラレータをバイトコードトランスレータとレジスタ状態制御ユニットで構成し、レジスタ状態制御ユニットで汎用レジスタの各レジスタ領域の使用状態を管理することによって、Ｊａｖａのオペランドスタックを汎用レジスタの何れかのレジスタ領域に動的にマッピングすることが可能となる。
【図面の簡単な説明】
【００２１】
【図１】第１図は、本発明によるＪａｖａアクセラレータ３０を備えたプロセッサの概略的な構成を示すブロック図。
【図２】第２図は、第１図に示したＪａｖａアクセラレータ３０を構成するバイトコードトランスレータ４０の１実施例を示すブロック図。
【図３】第３図は、第１図に示したＪａｖａアクセラレータ３０を構成するレジスタ状態制御ユニット５０の１実施例を示すブロック図。
【図４】第４図（Ａ）〜（Ｃ）は、それぞれＪａｖａバイトコード列と、バイトコードトランスレータ４０で変換されたバイトコード列と、Ｊａｖａバイトコード列の他の例を示す図。
【図５】第５図は、本発明によるプロセッサの組み込み用途の１例を示すシステム構成図。
【図６】第６図は、ＪＶＭの特徴を説明するための図。
【発明を実施するための形態】
【００２２】
以下、本発明によるプロセッサシステムの実施例について図面を参照して説明する。
第１図は、本発明によるＪａｖａアクセラレータ３０を備えたプロセッサの概略的な構成を示す。
プロセッサ１は、主記憶２と接続されている。主記憶２には、プロセッサ１に固有の命令形式で記述された通常のプログラムとデータの他に、Ｊａｖａプログラムを実行するためのＪＶＭ、バイトコード列、フレームスタックなどが保持されている。プロセッサ１は、主記憶２に格納されたプログラム（プロセッサ１に固有の命令列またはＪａｖａバイトコード列）の一部を保持するための命令キャッシュ１０と、主記憶２に格納されたデータまたはフレームスタックの一部を保持するためのデータキャッシュ１１と、主記憶２に接続された主記憶制御ユニット１２とを有し、該主記憶制御ユニット１２によって、主記憶２と命令キャッシュ１０およびデータキャッシュ１１の間のデータ受け渡しが制御される。
【００２３】
一般的なプロセッサと同様に、プロセッサ１は、命令バッファ２０と、命令デコーダ２２と、汎用レジスタ６１と、演算器６０と、命令フェッチユニット２３とを備えている。ここでは、便宜的に、演算器６０が一つのブロックとして表示されているが、上記演算器６０は、複数個の演算器から構成されるものであってもよい。命令デコーダ２２がデコードする命令は、例えば、日立製作所が提供する制御用マイコンＳＨ３の命令セットのように、このプロセッサに固有の命令のみである。命令キャッシュ１０に一時的に保持されたプロセッサ固有の命令コード列またはＪａｖａのバイトコード列は、命令フェッチユニット２３からの制御信号に応答して信号線（内部バス）Ｓ１０に読み出され、命令バッファ２０とＪａｖａアクセラレータ３０に入力される。
【００２４】
Ｊａｖａアクセラレータ３０は、Ｊａｖａのバイトコード列をプロセッサ１に固有の命令列に変換するバイトコードトランスレータ４０と、汎用レジスタ６１の状態を管理するレジスタ状態制御ユニット５０とから構成されている。
【００２５】
プロセッサ１に固有のプログラムを実行中は、命令バッファ２０の出力が有効となり、命令バッファ２０の出力がセレクタ２１を介して命令デコーダ２２に入力される。一方、Ｊａｖａプログラムを実行中は、バイトコードトランスレータ４０の出力が有効となり、命令キャッシュ１０から読み出されたＪａｖａのバイトコード列が、上記バイトコードトランスレータ４０でプロセッサ１に固有の命令列に変換された後、セレクタ２１を介して命令デコーダ２２に入力される。
【００２６】
第２図は、バイトコードトランスレータ４０の１実施例を示す。
バイトコードトランスレータ４０は、命令キャッシュ１０から読み出されたバイトコード列を一時的に保持するためのバッファjava_inst４２０と、該java_inst４２０から読み出されたバイトコードをプロセッサ１に固有の命令コードに変換するためのトランスレートエンジン４３０と、上記java_inst４２０へのバイトコード列の読み込みを制御するためのバッファ管理ユニット４００と、入力バイトコードがローカル変数領域からオペランドスタックへの変数ロード命令（iload、aloadなど）か否かを検出するためのロード検出ユニット４１０と、入力バイトコードがオペランドスタックへのローカル変数ロード命令であった場合に、入力バイトコードが示すindexを出力するためのゲート４１１を備える。
【００２７】
トランスレートエンジン４３０は、ソフトウェアで記述されたＪＶＭのインタプリタの機能をハードウェア（ＬＳＩ）にマッピングしたものであり、例えば、ソフトウェア記述のインタプリタ部分をVerilogのようなハードウェア記述言語に変換し、論理合成する方法によって形成される。トランスレートエンジン４３０で入力バイトコードを固有命令コードに変換する際に、バイトコードの種類によっては、１つのバイトコードが複数個の固有命令コードに分割される場合がある。カウンタcnt４４０は、このように１つのバイトコードを複数個の固有命令コードに分割する場合に、それまでに変換された固有命令の数あるいはサイクル数をカウントするためのものである。
【００２８】
トランスレートエンジン４３０で生成された固有命令のうち、オペレーションコード部は、信号線４３０Ａを介して出力バッファtr_inst４２１に入力される。オペランド部は、第１オペランドが信号線４３０Ｂ、第２オペランドが４３０Ｃに出力され、それぞれセレクタ４３１、４３２を介して出力バッファtr_inst４２１に入力される。本実施例では、プロセッサ１の命令アーキテクチャが、日立製作所のＳＨプロセッサのように２オペランド形式ものを仮定しているが、ＭＩＰＳやＡＲＭのような一般的プロセッサで採用されている３オペランド命令形式の場合は、オペランドの出力信号線とセレクタの数を３本にすればよい。
【００２９】
ここで、セレクタ４３１、４３２を設けた理由は、本発明では、バイトコードトランスレータ４０の出力オペランドとして、トランスレートエンジン４３０の出力オペランドに代えて、後述するレジスタ状態制御ユニット５０からの出力値が使用される場合があるからである。レジスタ状態制御ユニット５０の動作は、入力バイトコードがオペランドスタックに対するローカル変数のロード命令（iloadなど）の場合にオン状態となるロード検出ユニット４１０からの出力信号load_vldと、ゲート４１１の出力信号load_indexによって制御されている。
【００３０】
第３図は、レジスタ状態制御ユニット５０の１実施例を示す。
レジスタ状態制御ユニット５０は、汎用レジスタ６１の各エントリと対応して設けられた複数のレジスタ内容管理ロジック５００−ｉ（ｉ＝１〜Ｎ）と、第６図に示したＪＶＭのオペランドスタック８８の汎用レジスタ６１へのマッピングを管理するためのスタック管理レジスタid_stack５４０とを備えている。
【００３１】
各レジスタ内容管理ロジック５００−ｉは、汎用レジスタの対応エントリがＪａｖａ実行環境において有効なデータを保持しているか否かを示す有効性表示メモリreg_valid５０１と、上記汎用レジスタの対応エントリがＪＶＭにおけるオペランドスタック用として使用中か否かを示すオペランドスタック表示メモリstack_vld５０２と、上記汎用レジスタの対応エントリに設定されたローカル変数のインデックス値を記憶するためのインデックスメモリreg_idx５０３とを含んでいる。
【００３２】
ＪＶＭの規定では、任意のローカル変数は、フレームスタック８６におけるカレントフレーム８７を示すポインタと、当該ポインタからの相対位置であるインデックスのみによって指定されており、例えば、Ｃ言語のように、任意の変数をアドレスポインタによって参照することは禁止されている。従って、ローカル変数領域８９に設定された任意のローカル変数は、仮にカレントフレームが固定されているとすれば、インデックス値のみで特定することができる。この特性を利用すれば、各ローカル変数に関して、それがロードされた汎用レジスタ６１のエントリ番号（レジスタ番号）とインデックス値とを１対１の対応関係で管理することが可能となる。
【００３３】
スタック管理レジスタid_stack５４０は、汎用レジスタ６１のエントリ数と同数またはこれよりも少数のエントリからなる。id_stack５４０のエントリ位置は、トップポインタtop_ptr５３０とボトムポインタbtm_ptr５３１によってリングバッファ的に管理され、各エントリには汎用レジスタ６１のレジスタ番号が保持される。但し、上記id_stack５４０は、概念的にスタック構造を実現できるものであればよく、上述したリングバッファ構造に限定されるものではない。レジスタ状態制御ユニット５０は、上記レジスタ内容管理ロジック５００−ｉ（ｉ＝１〜Ｎ）とスタック管理レジスタid_stack５４０の他に、エンコーダやセレクタなど種々の回路要素を備えているが、これらの回路要素の機能については、後述する詳細動作説明において明らかにする。
【００３４】
ここで、本発明のＪａｖａアクセラレータ３０に入力されるＪａｖａバイトコード列と、Ｊａｖａアクセラレータ３０から出力されるプロセッサ１に固有の命令コード列との関係について、第４図を参照して説明する。
【００３５】
第４図（Ａ）は、Ｊａｖａバイトコード列の１例を示し、（Ｂ）は、上記バイトコード列を変換して得られる固有命令コード列を示す。ここで、"iload_1"（１）と"iload_2"（２）は、それぞれローカル変数領域８９の第１、第２エントリにあるデータ(変数ａとｂ)を第６図に示したオペランドスタック８８に順次にロードすることを指示するバイトコード（命令）である。また、"iadd"（３）は、上記iload命令（１）、（２）によってオペランドスタックに積まれた上位２つのデータ“ａ”と“ｂ”を加算し、加算結果“ｃ”をオペランドスタック８８のトップに積み込むことを指示する命令であり、"istore_3"（４）は、オペランドスタックのトップにあるデータ“ｃ”をローカル変数領域８９の第３エントリにストアすることを指示する命令である。
【００３６】
これらのバイトコードをプロセッサ１に固有の命令に変換する場合、対象となるプロセッサ１のアーキテクチャがレジスタベースとなっているため、汎用レジスタ６１の一部を上記オペランドスタック８８として使用する必要がある。第４図（Ｂ）に示した例では、汎用レジスタ６１の第９レジスタ領域：Ｒ９と第１０レジスタ領域：Ｒ１０がオペランドスタックとして使用されている。
【００３７】
第４図（Ａ）に示したバイトコード（１）〜（４）は、主記憶２から命令キャッシュ１０に移され、命令キャッシュ１０からＪａｖａアクセラレータ３０のバイトコードトランスレータ４０に順次に供給される。バイトコードトランスレータ４０では、例えば、最初のバイトコード"iload_1"を、トランスレートエンジン４３０に実装された命令変換機構によって、第４図（Ｂ）に示す最初の固有命令"MOV.L @(1,fp),R9"に変換する。
【００３８】
ここで、MOV.Lは、４バイト幅のデータ転送を意味しており、fpはフレームポインタ、R9は汎用レジスタ６１の第９レジスタ領域を示している。フレームポインタfpは、実際には汎用レジスタ６１の特定の領域に格納された値であるが、本明細書では、理解を容易にするためにfpというニーモニックで表すことにする。上記固有命令"MOV.L @(1,fp),R9"は、データキャッシュの「フレームポインタ＋（１×４）」で示されるアドレス位置の内容（ローカル変数）を汎用レジスタ６１の第９レジスタ領域：Ｒ９にロードすることを意味している。
【００３９】
トランスレートエンジン４３０で変換された固有命令は、一時的に出力バッファtr_inst４２１に蓄積された後、セレクタ２１を経由して命令デコーダ２２に取り込まれる。上記命令デコーダ２２に取り込まれた固有命令は、プロセッサ１における通常の命令実行時と同様のプロセスで実行される。すなわち、命令で指定されたデータが汎用レジスタ６１から読み出され、演算器６０に送付される。固有命令"MOV.L @(1,fp), R9"の場合は、フレームポインタfpの値と即値１が演算器６０に送付され、演算器６０によって「フレームポインタ＋（１×４）」のアドレス値が演算され、データキャッシュ１１から上記アドレス位置の内容が演算器６０に読み込まれ、汎用レジスタ６１の第９レジスタ領域：Ｒ９に格納される。命令キャッシュ１０に格納されたバイトコード列は、Javaアクセラレータ３０のバイトコードトランスレータ４０にパイプライン的に供給され、それぞれ対応する固有命令に変換された後、実行される。
【００４０】
第４図（Ａ）に示したバイトコード列は、最も単純な加算ルーチンの１例を示しているが、更に複雑なバイトコード列として、配列されたデータの総和を算出するルーチンを実行する場合を考える。第４図（Ｃ）は、このような総和算出ルーチンのバイトコード列の１例を示す。ここで注目すべきことは、Ｊａｖａはスタックマシンであるため、演算の都度、必要なデータをローカル変数領域８９からオペランドスタック８８に積み込むためのiload（またはaload）命令が実行されるという点にある。
【００４１】
第４図（Ｃ）において下線を付したバイトコード（iloadまたはaload）は、ループを繰り返す度に実行されるが、毎回同じ値をローカル変数領域からオペランドスタックにロードしている。これらのバイトコードを固有命令に変換して命令デコーダ２２に供給した場合、演算器６０は、値に変化のないデータあるいは既に汎用レジスタに格納済みとなっているデータ（演算結果）について、冗長なロード命令を何回も繰り返して実行すると言う無駄な動作が発生する。
【００４２】
本発明は、レジスタ状態制御ユニット５０において、このような冗長なロード命令を検出し、実行しても意味のない固有命令がバイトコードトランスレータ４０から命令デコーダ２２に供給されるのを阻止することによって、Ｊａｖａプログラムの実行速度を高速化することを特徴とする。例えば、第４図（Ｃ）に示したバイトコード列の場合、本発明を適用することによって、２回目以降の各イタレーションで実行される固有命令の個数を従来の１０命令から６命令に減少でき、ループの繰り返し回数は増えれば増える程、演算所要時間の短縮効果が顕著になる。
【００４３】
以下、第１図〜第３図を参照して、本発明によるＪａｖａアクセラレータ３０の機能と動作について詳細に説明する。
命令キャッシュ１０からバイトコードトランスレータ４０に供給されたＪａｖａバイトコードは、バッファjava_inst４２０に一時的に格納された後、トランスレートエンジン４３０に取り込まれ、各バイトコードに対応した固有命令に変換される。トランスレートエンジン４３０で生成された固有命令うち、オペコード部は、信号線４３０Ａを介して出力バッファtr_inst４２１に入力される。
【００４４】
一方、信号線４３０Ｂ、４３０Ｃに出力されるオペランド部に関しては、もし、そのオペランド部が既に汎用レジスタに存在し、汎用レジスタから読み出し可能なものであれば、トランスレートエンジン４３０からの出力オペランドに代えて、レジスタ状態制御ユニット５０から出力されるレジスタ番号、すなわち、dst_reg_idと、src_reg_id1と、src_reg_id2がセレクタ４３１、４３２で選択され、出力バッファtr_inst４２１に入力される。尚、オペランドが、入力バイトコードで暗黙的に指定される場合や、例えば、入力バイトコードの次のバイトで明示的に指定される場合は、トランスレートエンジン４３０で生成したオペランドが選択され、出力バッファtr_inst４２１に入力される。
【００４５】
例えば、第４図（Ａ）に示したバイトコード列において、iadd命令（３）がトランスレートエンジン４３０に入力された場合、出力バッファtr_inst４２１には、オペコード部として、トランスレートエンジンで生成された固有命令のADDが入力され、第１オペランドと第２オペランドとして、レジスタ状態制御ユニット５０から出力されたレジスタ番号Ｒ９、Ｒ１０が入力される。レジスタ状態制御ユニット５０におけるレジスタ番号の生成方法については後述する。
【００４６】
もし、或るバイトコードと対応して複数の固有命令が生成される場合、バイトコードの変換処理に複数サイクルを要する。この場合、トランスレートエンジン４３０は、入力バイトコードの種類とカウンタcnt４４０の値によって生成すべき固有命令を決定する。入力バイトコードが、例えば、iload命令のようにローカル変数領域の内容をオペランドスタックに移動する命令の場合、これをロード検出ユニット４１０によって検出し、load_vld信号としてレジスタ状態制御ユニット５０に通知する。また、上記ロード検出ユニット４１０によって、フレームスタックへの変数ロード命令が検出された場合、暗黙的に指定されているインデックスの値や、次バイトにより明示的に指定されたインデックスの値が、load_index信号としてレジスタ状態制御ユニット５０に通知される。
【００４７】
バッファ管理ユニット４００は、上記バッファjava_inst４２０に有効なバイトコードが存在するか否かを監視し、もし有効なバイトコードが無くなった場合、バイトコード・フェッチ要求信号java_fetch_reqをアサートし、命令フェッチユニット２３に次バイトコードのフェッチを要求する。
【００４８】
次に、レジスタ状態制御ユニット５０の動作について説明する。
最初に、バイトコードトランスレータ４０が上述したフレームスタックへの変数ロード命令以外の一般的な入力バイトコードを処理している場合のレジスタ状態制御ユニット５０の動作について述べる。
【００４９】
バイトコードトランスレータ４０が一般的な入力バイトコードを処理している時、ロード検出回路４１０の出力信号load_vldはオフ（ネゲート）状態となる。信号load_vldがネゲート状態にあるとき、レジスタ状態制御ユニット５０は、変換後の固有命令のソースオペランド用として使用するために、スタック管理レジスタid_stack５４０のトップにあるレジスタ番号を信号線src_reg_id1またはsrc_reg_id2経由でバイトコートトランスレータ４０に送付する。
【００５０】
すなわち、スタック管理レジスタid_stack５４０から、トップポインタtop_ptr５３０が指定するエントリの内容をセレクタ５４１で選択して、src_reg_id1として出力する。もし、入力バイトコードがオペランドスタックの上位２つをオペランドとして使用している場合は、デクリメンタ５４４によって上記top_ptr５３０の値から１を減算し、上記id_stack５４０から上記デクリメンタ５４４の出力で指示されたエントリの内容をセレクタ５４２で選択して、src_reg_id2として出力する。
【００５１】
バイトコードトランスレータ４０で生成される固有命令が２つのソースオペランドを使用する場合、第１オペランドのソースレジスタが演算結果のディスティネーションレジスタとして使用される。この場合、信号src_reg_id1がディスティネーションレジスタの指定信号として兼用される。固有命令で使用するソースオペランドが１個の場合は、汎用レジスタ６１の中から使用可能なレジスタ（エントリ）を検索し、これをディスティネーションレジスタとして用いる。使用可能なレジスタの検索は、例えば、次の条件で行われる。
【００５２】
（ａ）  レジスタ内容管理ロジック５００−１〜５００−Ｎの中から、有効性表示メモリreg_valid５０１の値が“０”で、且つ、オペランドスタック表示メモリstack_vld５０２の値が“０”となっている管理ロジックを選択する。上記条件を満たす管理ロジックが１個以上見つかった場合は、プライオリティエンコーダ５２１によって、１つの管理ロジックを選択し、その管理ロジックの番号を使用可能なレジスタ番号としてセレクタ５２３に入力する。これによって、汎用レジスタ６１の中から、オペランドスタック用またはローカル変数用としてマッピングされていない未使用エントリが選択され、新たなディスティネーションレジスタ候補に指定される。
【００５３】
（ｂ）  レジスタ内容管理ロジック５００−１〜５００−Ｎの中から、有効性表示メモリreg_valid５０１の値が“１”で、且つ、オペランドスタック表示メモリstack_vld５０１の値が“０”の管理ロジックを選択する。上記条件を満たす管理ロジックが１個以上見つかった場合は、プライオリティエンコーダ５２０によって１つの管理ロジックを選択し、その管理ロジック番号を使用可能なレジスタ番号としてセレクタ５２３に入力する。これによって、汎用レジスタ６１の中から、オペランドスタック用にはなっていないが、ローカル変数用として使用中のエントリが選択され、新たなディスティネーションレジスタ候補に指定される。
【００５４】
（ｃ）  スタック管理レジスタid_stack５４０に登録されている汎用レジスタ６１のエントリ番号の中から、セレクタ５４３によって、ボトムポインタbtm_ptr５３１で指示されたエントリ番号を使用可能なレジスタ番号として選択し、セレクタ５２３に入力する。これによって、オペランドスタック用として既にマッピング済みの汎用レジスタ・エントリのうち、オペランドスタックの最も下に位置するエントリが選択され、新たなディスティネーションレジスタ候補に指定される。上記ディスティネーションレジスタ候補がセレクタ５２３でディスティネーションレジスタとして選択された場合は、当該レジスタの内容についてスピルアウト処理が必要となるため、バイトコードトランスレータ４０にスピルアウト用ストア命令を発行させるための信号ovr_flwをポインタ制御回路５２３から出力する。
【００５５】
上記条件（ａ）、（ｂ）、（ｃ）で選択されたディスティネーションレジスタ候補は、セレクタ５２３において、（ａ）、（ｂ）、（ｃ）の順番で優先順位付けされ、使用可能なレジスタ番号が選択される。セレクタ５２３で選択されたレジスタ番号は、dst_reg_id信号として、バイトコードトランスレータ４０に通知される。尚、条件（ｂ）によって指定されたレジスタがセレクタ５２３でディスティネーションレジスタとして選択された場合、該レジスタに対応するレジスタ内容管理ロジック５００−ｋの有効性表示メモリreg_vld５０１の設定値を“０”に変更する必要がある。上記メモリreg_vldの設定値変更は、平易な論理回路で実現できるため、第３図では省略してある。
【００５６】
レジスタ状態制御ユニット５０では、ＪＶＭで仮想的に定義されている図６に示したオペランドスタック８８を管理する必要がある。すなわち、ソースオペランド用として使用された汎用レジスタ・エントリのレジスタ番号については、スタック管理レジスタid_stack５４０からポップ（pop）し、ディスティネーションオペランド用として使用されたエントリのレジスタ番号については、スタック管理レジスタid_stack５４０にプッシュ（push）する必要がある。
【００５７】
そこで、本実施例では、バイトコードトランスレータ４０のトランスレートエンジン４３０に、入力バイトコードの解読結果に応じてスタック・インクリメント信号stack_incを発生させ、レジスタ制御ユニット５０のポインタ制御５３２に、上記stack_incに応じてトップポインタtop_ptr５３０の値を更新させる。例えば、オペランドスタックで２つのソースオペランドをポップし、１つのディスティネーションをプッシュするバイトコード列を実行する場合、トランスレートエンジン４３０から、−１を示すstack_incを出力し、ポインタ制御５３２に、トップポインタtop_ptr５３０の値を現在値より１だけ減算させる。セレクタ５２３から出力されたディスティネーション用のレジスタ番号は、格納制御回路５３３によって、スタック管理レジスタid_stack５４０中の上記top_ptr５３０が指定するエントリに格納（push）される。
【００５８】
スタック管理レジスタid_stack５４０に新しいレジスタ番号ｋがpushされた時、格納制御回路５３３によって、上記レジスタ番号ｋに対応するレジスタ内容管理ロジック５００−ｋのオペランドスタック表示メモリstack_vld５０２に“１”をセットする。なお、スタック管理レジスタid_stack５４０からpopされたレジスタ番号については、該レジスタ番号ｉに対応するレジスタ内容管理ロジック５００−ｉにおいて、オペランドスタック表示メモリstack_vld５０２の値をクリアする必要がある。上記レジスタ番号ｉは、スタック管理レジスタid_stack５４０の読出し用セレクタ５４１、５４２から信号src_reg_id1またはsrc_reg_id2として出力されている。従って、上記stack_vldのクリア制御信号は、これらのセレクタ５４１、５４２の出力信号をデコードする比較的簡単な論理回路（図示せず）によって生成できる。
【００５９】
次に、本発明で特徴とするオペランドスタックへの変数ロード命令を含むバイトコードの変換時におけるＪａｖａアクセラレータの動作について述べる。
先ず、繰り返しループにおける上記ロード命令の第１回目の変換処理、すなわち、当該ロード命令によって読み出されるローカル変数がまだ汎用レジスタ６１にマッピングされていない場合の動作について説明する。
【００６０】
バッファjava_inst４２０に格納された変数ロード命令は、ロード検出ユニット４１０により解読され、その結果、信号load_vldがアサートされ、上記ロード命令で扱うローカル変数のインデックスがゲート４１１を介してload_indexとして出力される。信号load_vldがオン状態となった時、レジスタ状態制御ユニット５０では、通知されたインデックスload_indexに基づいて、オペランドスタックにロードすべきローカル変数が既に汎用レジスタ６１にマッピングされているか否かを検索する。
【００６１】
すなわち、各レジスタ内容管理ロジック５００−１〜５００−Ｎにおいて、インデックスメモリreg_idx５０３の内容と上記通知インデックスload_indexとを比較回路５０４で比較し、各管理ロジックのＡＮＤ回路５０５から出力される判定信号をＯＲ回路５１０に入力することによって、通知インデックスload_indexが汎用レジスタ６１の何れかのエントリに登録済みか否かを示す検知信号reg_hitを得る。この論理は、一般的なキャッシュメモリにおけるヒット検出論理に類似している。変数ロード命令を含むバイトコードの第１回目の変換時には、通知インデックスload_indexは汎用レジスタに未登録状態となっているため、検知信号reg_hitはアサートされない。
【００６２】
この場合、バイトコードトランスレータ４０から変換後の変数ロード命令を発行し、レジスタ状態制御ユニット５０からローカル変数のディスティネーションレジスタを指定する必要がある。セレクタ５２３は、検知信号reg_hitがオフ状態の時、前述した条件（ａ）、（ｂ）、（ｃ）で指定された候補の中からディスティネーションレジスタを選択し、レジスタ番号をdst_reg_idとして出力する。
【００６３】
オペランドスタックへの変数ロード命令が発行され、ローカル変数が汎用レジスタ６１の上記dst_reg_idが示すエントリにマッピングされることになった場合、変数とレジスタ番号との関係を記憶し、上記変数ロード命令の次回の処理に備える必要がある。このために、本実施例では、変数のディスティネーションレジスタ番号ｋと対応するレジスタ内容管理ロジック５００−ｋにおいて、上記変数ロード命令が使用したインデックス値load_indexをインデックスメモリreg_idx５０３に登録し、有効性表示メモリreg_vld５０１に“１”を設定する。この動作は、reg_idx書き込み制御５１２によって行なわれる。reg_idx書き込み制御５１２は、検知信号reg_hitがオフ状態となった時、セレクタ５２３から出力されるレジスタ番号dst_reg_idをデコードし、該レジスタ番号と対応するレジスタ内容管理ロジック５００−ｋのメモリreg_valid５０１とreg_idx５０３に書き込みイネーブル信号を与えることによって、有効性表示メモリreg_valid５０１とオペランドスタック表示メモリreg_idx５０３の内容を更新する。
【００６４】
第４図（Ｃ）に示したバイトコード列の場合、上記動作によって、iload命令（２）、（４）、（６）で指定されたローカル変数”ｉ”、”sum”、”array pointer”と、aload命令（５）で指定されたreferenceタイプの変数”array pointer”が、それぞれセレクタ５２３で選択されたレジスタ番号dst_reg_idと対応するレジスタ内容管理ロジックに記憶されることになる。
【００６５】
次に、繰り返しループにおける変数ロード命令を含むバイトコードの２回目以降の変換時におけるＪａｖａアクセラレータの動作について説明する。
バイトコードトランスレータ４０から出力された信号load_vldがアサートされ、変数ロード命令のインデックス値がload_indexにより通知されると、何れかのレジスタ内容管理ロジック５００−ｋにおいて、インデックスメモリreg_idx５０３の内容と通知インデックスload_indexとが一致し、ＡＮＤ回路５０５の出力がオン状態となる。この時、ＯＲ回路５１０から出力される検知信号reg_hitがアサートされる。また、上記ＡＮＤ回路５０５に接続されたエンコーダ５１１から、上記レジスタ内容管理ロジック５００−ｋと対応するレジスタ番号ｋが出力される。
【００６６】
変数ロード命令のインデックス値が既に汎用レジスタに格納済みとなっていた場合、演算器６０で上記変数ロード命令を実行する必要はなく、従って、バイトコードトランスレータ４０で生成した固有命令を命令デコーダ２２に与える必要ない。この場合にＪａｖａアクセラレータ３０で実行すべき動作は、既に汎用レジスタ６１にマッピングされているローカル変数をオペランドスタックに積むこと、換言すれば、レジスタ状態制御ユニット５０において、上記ローカル変数用のレジスタ番号ｋをスタック管理レジスタid_stack５４０にpushすることである。
【００６７】
ＯＲ回路５１０から出力される検知信号reg_hitは、バイトコードトランスレータ４０のトランスレートエンジン４３０に、変数ロード命令の変換抑止信号として入力されている。検知信号reg_hitがアサート状態になると、トランスレートエンジン４３０は、現在変換中のバイトコードを廃棄し、バッファjava_inst４２０から取り込んだ次のバイトコードの変換処理を開始する。
【００６８】
検知信号reg_hitがアサート状態になると、セレクタ５２３が上記エンコーダ５１１から出力されたレジスタ番号を選択する。この結果、ローカル変数を保持しているレジスタの番号が、スタック管理レジスタid_stack５４０内のトップポインタtop_ptr５３０で指定されたエントリに格納され、上記レジスタ番号に対応するレジスタ内容管理ロジック５００−ｋのメモリstack_vld５０２に“１”がセットされる。この動作は、前述した一般的なバイトコードの変換処理時と同様である。
【００６９】
１つのフレームについて処理が完了し、フレームスタック８６内の別フレームのローカル変数を処理する場合、フレームの切替えに伴って、インデックス値と実際のローカル変数との対応関係が変わる。この場合、レジスタ内容管理ロジック５００−１〜５００−Ｎにおける有効性表示メモリreg_valid５０１の設定値を全てクリアする必要がある。この動作は、フレームポインタfpの変更、すなわち、フレームポインタfp用として割当てられている汎用レジスタ６１の特定領域へのデータ書込みを検出して、各有効性表示メモリreg_valid５０１にクリア信号を発行する制御回路（図示せず）によって制御される。
【００７０】
第５図は、上述した本発明のプロセッサを利用した組み込みシステムの１例として、携帯電話システムのブロック構成図を示す。
本発明のＪａｖａアクセラレータを備えたプロセッサは、アプリケーション処理プロセッサ１として使用される。Ｊａｖａプログラムは、上記プロセッサ１に接続されたアプリケーションメモリ２に予め登録される。但し、Ｊａｖａプログラムの一部は、ネットワークを介して上記メモリ２にダウンロードされてもよい。この場合、アンテナ６で受信されたＪａｖａプログラムは、ＲＦインターフェース５を介してベースバンド処理プロセッサ３に入力され、フォーマット変換された後、プロセッサ１を介してアプリケーションメモリ２に格納される。
Ｊａｖａプログラムは、マイク７１またはテンキー７３からの入力に応答して実行され、実行結果は、Ｉ／Ｏ処理部７を介して液晶ディスプレイ７０あるいはスピーカ７２に出力される。上記システム構成により、予めメモリに内蔵されたＪａｖａアプリケーションプログラム、あるいはインターネットを介して配信されるＪａｖａアプリケーションプログラムを高速に実行可能な携帯端末システムを提供できる。
【産業上の利用可能性】
【００７１】
以上の説明から理解されるように、本発明プロセッサシステムによれば、上記レジスタ状態制御ユニットで冗長バイトコードを検出した時、バイトコードトランスレータから命令デコーダへの固有命令の供給を抑制することによって、プロセッサによる余計な命令実行を回避し、Ｊａｖａプログラムの実行速度を向上させることが可能となる。
【００７２】
一般的に、Ｊａｖａプログラムでは、オペランドスタックへのローカル変数のロード命令が全バイトコードの３割程度を占めているが、本発明によれば、繰り返しループに含まれるローカル変数のロード命令を冗長バイトコードとして扱い、その実行を省略すること可能となるため、Ｊａｖａプログラムの内容によっては、実行速度において従来の２０％〜３０％の性能向上を図ることができる。
【符号の説明】
【００７３】
１：プロセッサ、２：主記憶、１０：命令キャッシュ、
１１：データキャッシュ、１２：主記憶制御ユニット、
２０：命令バッファ、２１：セレクタ、２２：命令デコーダ、
２３：命令フェッチユニット、３０：Ｊａｖａアクセラレータ、
４０：バイトコードトランスレータ、５０：レジスタ状態制御ユニット、
６０：演算器、６１：汎用レジスタ。
【図１】
0004418509.tif 000002
【図２】
0004418509.tif 000003
【図３】
0004418509.tif 000004
【図４】
0004418509.tif 000005
【図５】
0004418509.tif 000006
【図６】
0004418509.tif 000007