JP2002169696A - データ処理装置 - Google Patents
データ処理装置Info
- Publication number
- JP2002169696A JP2002169696A JP2000368729A JP2000368729A JP2002169696A JP 2002169696 A JP2002169696 A JP 2002169696A JP 2000368729 A JP2000368729 A JP 2000368729A JP 2000368729 A JP2000368729 A JP 2000368729A JP 2002169696 A JP2002169696 A JP 2002169696A
- Authority
- JP
- Japan
- Prior art keywords
- native code
- execution
- stack
- code
- native
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/3017—Runtime instruction translation, e.g. macros
- G06F9/30174—Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Executing Machine-Instructions (AREA)
Abstract
で高速に実行することが可能なデータ処理装置を提供す
る。 【解決手段】 データ処理装置は、非ネイティブコード
をプロセッサのネイティブコードに変換するハードウェ
アトランスレータ120と、ソフトウェアトランスレー
タと、プロセッサに対する非ネイティブコードを逐次解
釈し、プロセッサのネイティブコードを用いて実行する
ソフトウェアインタープリタとを含み、これらを所定の
基準にしたがって選択して動作させる回路121、12
2などを含む。
Description
関わるもので、特に、データ処理装置に搭載されている
プロセッサのネイティブコードに加えて、非ネイティブ
コードを実行するための機能を備えたデータ処理装置に
関わるものである。
いて設計され製作される。アーキテクチャでは命令体
系、命令形式などが決定され、そうした命令形式の命令
を効率よく実行するようにハードウェアが製作される。
データ処理装置において実行させるプログラムは、この
ように搭載されているプロセッサの命令コード(「ネイ
ティブコード」と呼ぶ。)で記述しておくのが通常であ
る。
ロセッサ以外のプロセッサの命令コード(「非ネイティ
ブコード」と呼ぶ。)で記述されているプログラムを実
行させたいという場合もある。ひとつの例は、新しいプ
ロセッサ用のプログラム開発が間に合わない際に、古い
プロセッサ用のプログラムを新しいプロセッサで実行さ
せたいという場合である。別の例は、Java(「Ja
va」はSun Microsystems, Incの商標である。)バイ
トコードのように、仮想的なプロセッサ(「Java仮
想マシン」と呼ばれる。)用の言語で記述されたひとつ
のプログラムを、それぞれ異なるプロセッサを搭載した
複数種類の装置で実行させたいという場合である。
るための手段として従来から用いられている手法には、
ソフトウエアインタープリタ、ソフトウェアトランスレ
ータ、ハードウェアトランスレータがある。
では、以下の一連の処理ステップをプロセッサ上でソフ
トウェアインタープリタと呼ばれるソフトウェアを実行
することにより行なう。
の読み出し (2) 読み出した非ネイティブコードに対する処理ル
ーチンへのディスパッチ (3) 読み出した非ネイティブコードに対する処理ル
ーチンの実行 (4) 非ネイティブコードのプログラムカウンタの更
新 このソフトウエアインタープリタ自体は、搭載されてい
るプロセッサのネイティブコードで記述されている。
考慮しなければ実際上どのような処理でも実現できるた
め、このソフトウェアインタープリタは容易に実現可能
である。しかしその半面、ステップ(3)での実際の処
理以外に、(1)、(2)および(4)の追加処理が必
要となるため、実行速度が低下するという問題がある。
ィブコードのプログラムを、同等内容のネイティブコー
ドのプログラムに変換する装置のことをいう。変換をハ
ードウエアで行なうものがハードウエアトランスレータ
であり、ソフトウエアで行なうものがソフトウエアトラ
ンスレータである。
たとえば、米国特許第5875336号に述べられてい
る。ハードウェアトランスレータは、非ネイティブコー
ドの各命令の動作をシミュレーションするためにハード
ウェアにより、非ネイティブコードの各コードと同等内
容の処理を実現するネイティブコードを生成する。しか
しこの際、以下の要因によって変換後のネイティブコー
ドの実行速度が低下するという問題がある。
ブコードの読出のために、演算結果だけでなく非ネイテ
ィブコードのPC(プログラムカウンタ)値または必要
に応じてフラグまでシミュレーションしなければならな
い。そのため、1つの非ネイティブコードの動作を多数
のネイティブコードで置き換えることになってしまう。
数として非ネイティブコードが想定している数よりも、
プロセッサに備えられているレジスタの数のほうが多い
場合であっても、それを利用することができない。たと
えば、トランスレータでは、非ネイティブコードのメモ
リオペランドはネイティブコードにおいてもやはりメモ
リオペランドに変換され、レジスタには割当てられな
い。
下するという問題に対する解決策の一つが米国特許第5
898885号において提案されている。この手法は、
非ネイティブコードがJavaバイトコードのようなス
タックマシンのコードであることを前提としている。提
案された手法では、スタックへデータをプッシュする非
ネイティブコードにそのデータをポップする非ネイティ
ブコードが連続するような場合に、それらをまとめて実
行できるようなネイティブコードを生成する。これによ
り、メモリへのアクセス回数が減少するので、実行速度
の高速化を図ることができる。米国特許第602648
5号にも類似の技術の提案がある。
ュの直後にそのデータのポップがなければ適用すること
ができないという制限がある。
る場合も、上記のような速度低下という問題はある。し
かし、ハードウエアトランスレータとは異なりソフトウ
エアトランスレータでは命令単位ではなくより大きなプ
ログラム単位(サブルーチン単位やクラス単位)での変
換処理を行うことができるという柔軟性があるため、無
駄なメモリアクセスなどをなくすことが可能で、速度低
下をある程度に押さえることができる。しかし、実行時
の速度低下が少ないネイティブコードを生成しようとす
れば、変換処理が複雑となり、変換処理時間が増大する
という問題がある。
を押さえるため、ソフトウエアトランスレータでは、一
度変換して生成したネイティブコードをメモリに保持し
ておく手法が用いられる。再度同じプログラム部分が実
行されるときには、変換処理を行なうことはせず、メモ
リに保持されている変換後のネイティブコードが再利用
される。しかしこうした、非ネイティブコードのプログ
ラムを変換した後のネイティブコードを保持するために
大容量のメモリを新たに必要とし、メモリのコストが増
大してしまうという別な問題が発生する。
のメモリ容量の増大を防ぐために、変換後のネイティブ
コード保持用のRAM(Random Access
Memory)を一定サイズとしておき、ソフトウエア
キャッシュとして用いる手法を考えることができる。こ
の手法では、サブルーチン(またはメソッド)単位に非
ネイティブコードをネイティブコードに変換してこのR
AMに追加保持していく。このRAMが一杯になったと
きには、実行が終わってそれ以後に実行する可能性が低
いサブルーチン(あるいはメソッド)のネイティブコー
ドをRAMから解放する。解放してできた空きRAM領
域に新たな変換後のネイティブコードからなるサブルー
チン(あるいはメソッド)を保持する。
するソフトウエアトランスレータは、メモリ容量増大の
防止に対してはある程度効果が期待される。しかし、メ
モリに全ての変換後の命令を保持する場合と比較して、
変換処理の回数が増えるため、そのオーバヘッドの増大
が問題となる。変換処理時間を短く押さえるために変換
処理の内容を単純化し非ネイティブコード単位で変換す
ると、変換後生成されたネイティブコードの実行速度が
低くなってしまうということになるのは既に述べたとお
りである。
ウェアインタープリタでは実行速度が極端に遅くなると
いう問題がある。一方、ハードウエアトランスレータで
もソフトウェアインタープリタほどではないにしろ、実
行速度の低下を防止することがある程度以上は困難であ
る。また非ネイティブコード全てをトランスレートする
ためにはハードウェア量が増大してしまうという問題が
ある。また、ソフトウエアトランスレータには実行速度
の向上とメモリ増加の防止とが両立しにくいという問題
がある。
題を解決するためになされたもので、非ネイティブコー
ドを少ないハードウェア量で高速に実行することが可能
な、非ネイティブコードのトランスレータを有するデー
タ処理装置を提供することを目的とする。
かかるデータ処理装置は、所定の命令群をネイティブコ
ードとするプロセッサ、プロセッサに対する非ネイティ
ブコードをプロセッサの1または2以上のネイティブコ
ードに変換するハードウェアトランスレータ、プロセッ
サ上で動作し、プロセッサに対する非ネイティブコード
をプロセッサの1または2以上のネイティブコードに変
換するソフトウェアトランスレータ、ソフトウェアトラ
ンスレータの出力するネイティブコードを記憶するため
の記憶手段、プロセッサ上で動作し、プロセッサに対す
る非ネイティブコードを逐次解釈し、プロセッサのネイ
ティブコードを用いて実行するソフトウェアインタープ
リタ、ならびに所定の基準にしたがって、ハードウェア
トランスレータによって出力されるネイティブコードの
実行、ソフトウェアトランスレータによって出力される
ネイティブコードの実行、ならびにソフトウェアインタ
ープリタの実行による非ネイティブコードの逐次解釈お
よび実行のいずれかを選択してプロセッサを動作させる
ための選択手段とを含む。
の記憶手段を必要としないが、処理速度の点で劣るハー
ドウェアトランスレータおよびソフトウェアインタープ
リタと、記憶手段を必要とするが処理速度の点で優るソ
フトウェアトランスレータとを、所定の基準にしたがっ
て選択し使い分けることができる。そのため、非ネイテ
ィブコードを、比較的少ない容量の記憶手段を用いて実
行できる。ソフトウェアトランスレータを用いると処理
が高速に行なえるので、全体としての処理の高速化が可
能となる。また、ハードウェアトランスレータのハード
ウェア量を増大させるような命令についてはソフトウェ
アインタープリタで実行できるので、ハードウェアトラ
ンスレータは、限定された数の非ネイティブコードを変
換するだけでよい。そのハードウェアは比較的単純とな
る。またソフトウェアインタープリタで実行される命令
は限定されるので、その処理が遅くとも全体の処理速度
にはそれほどの影響は生じない。
装置は、請求項1に記載の発明の構成に加えて、選択手
段は、非ネイティブコードの種類または実行頻度、若し
くは記憶手段の状態に依存して、ハードウェアトランス
レータによって出力されるネイティブコードの実行、ソ
フトウェアトランスレータによって出力されるネイティ
ブコードの実行、ならびにソフトウェアインタープリタ
の実行による非ネイティブコードの逐次解釈および実行
のいずれかを選択してプロセッサを動作させるための手
段を含む。
憶手段の状態に依存していずれかを選択するため、非ネ
イティブコードの実行時の結果に基づいて適切にどのト
ランスレータまたはインタープリタを選択するかを決定
できる。そのため、ハードウェア量をより少なく、およ
び/または全体の処理速度をより高くすることができ
る。
装置は、請求項1に記載の発明の構成に加えて、選択手
段は、所定の基準にしたがって、ネイティブコードによ
って構成されるメソッドが呼出されるごとに、ハードウ
ェアトランスレータによって出力されるネイティブコー
ドの実行、ソフトウェアトランスレータによって出力さ
れるネイティブコードの実行、ならびにソフトウェアイ
ンタープリタの実行による非ネイティブコードの逐次解
釈および実行のいずれかを選択してプロセッサを動作さ
せるための手段を含む。
トランスレータ、ソフトウェアトランスレータおよびソ
フトウェアインタープリタのいずれかを動的に選択でき
る。データ処理装置の状況、プログラムの実行状況など
にあわせてデータ処理装置自体がいずれを選択するかを
決定できるため、ハードウェア量をより少なく、および
/または全体の処理速度をより高くすることができる。
装置は、請求項1に記載の発明の構成に加えて、ソフト
ウェアトランスレータは、非ネイティブコードに含まれ
るメモリオペランドの少なくとも一部を、プロセッサに
備えられたレジスタに割り付けるように非ネイティブコ
ードをネイティブコードに変換するためのコード変換手
段を含む。
置換されるため、時間を要するメモリアクセスが減少
し、変換後のプログラムの実行を高速化できる。
装置は、請求項4に記載の発明の構成に加えて、非ネイ
ティブコードは、所定のスタックマシンのネイティブコ
ードであり、コード変換手段は、メモリオペランドのう
ちのスタックオペランドのうち、スタックトップ側のス
タックオペランドが、プロセッサに備えられたレジスタ
に保持されるように、データ処理装置に接続されるメモ
リと、プロセッサのレジスタとの間で実行時にデータの
保存と復帰とを行なうようなネイティブコードを生成す
るための手段を含む。
スタに割当てられる。その結果、時間を要するメモリア
クセスが減少し、変換後のプログラムの実行を高速化で
きる。
装置は、請求項5に記載の発明の構成に加えて、コード
変換手段は、スタックへのデータの転送のみを行なう非
ネイティブコードを検出してその転送元と転送先とを対
応付けて記憶するための手段をさらに含み、生成するた
めの手段は、データの転送のみを行なう非ネイティブコ
ードの検出メモリオペランドのうちのスタックオペラン
ドのうち、スタックトップ側のスタックオペランドが、
プロセッサに備えられたレジスタに保持されるように、
データ処理装置に接続されるメモリと、プロセッサのレ
ジスタとの間で実行時にデータの保存と復帰とを行なう
ように、かつ、転送先をオペランドとして使用するコー
ドについては、転送先に代えて、記憶するための手段に
記憶された転送元をオペランドとするように、ネイティ
ブコードを生成するための手段を含む。
うな処理を行なわない場合と比較して減少する。実行す
べきコード数が減少するので、変換後のプログラムの実
行を高速化できる。
にかかるデータ処理装置はいずれも、ソフトウエアによ
りJavaバイトコードをネイティブコードに変換する
ソフトウエアトランスレータ、ハードウエアによりJa
vaバイトコードをネイティブコードに変換するハード
ウエアトランスレータ、ソフトウエアでJavaバイト
コードを実行時に解析してシミュレートするソフトウエ
アインタープリタと、対象のJavaバイトコードの内
容に依存してこれら3つの手段を動的に切り替えるトラ
ンスレータを備えたものである。本発明がこれらの実施
の形態に限定されるわけではないことは当業者には明ら
かである。たとえば、以下の各実施の形態の説明では、
非ネイティブコードとしてJavaバイトコードを想定
するが、それ以外のコードを非ネイティブコードとして
実行する場合も同様の考えでトランスレータを実現する
ことができる。
の概略構成を示したものである。図1を参照して、この
データ処理装置は、互いにバス107に接続されたプロ
セッサ101、RAM102と、所定アドレスに非ネイ
ティブコードを格納するROM(Read−Only
Memory)103とを含む。
サ101は、プロセッサ101の本体であり従来のプロ
セッサと同等の機能を持つ演算部106と、演算部10
6とバス107との間に挿入され、バス107から受取
った命令がROM103の所定アドレスから読出された
非ネイティブコードであればそれを演算部106のネイ
ティブコードに変換して演算部106に与え、ROM1
03の所定アドレスから読出された非ネイティブコード
でなければ、そのまま演算部106に与える処理を行な
うための多機能命令デコーダ105とを含む。
ブコードのメソッドと、このメソッドが使用するデータ
とを格納するためのものである。
述されたプログラムおよび後述する非ネイティブコード
のメソッド呼出し処理ルーチンをプロセッサ101で実
行するプログラム(プロセッサ101にソフトウェアト
ランスレータを動作させるためのプログラム、およびプ
ロセッサ101にソフトウェアインタープリタを動作さ
せるためのプログラムを含む)を記憶する、コンピュー
タ(プロセッサ101)に読取り可能な記憶媒体であ
る。本実施の形態の装置では、非ネイティブコードとし
て、Java仮想マシンの命令セットであるJavaバ
イトコードを使用する。メソッド呼出し処理ルーチン自
体はネイティブコードからなっている。
ットマイクロプロセッサであるM32Rの演算部の機能
を持つ。図2〜図4にこの演算部106の命令セットを
示す。M32Rプロセッサについては、「三菱32ビッ
トシングルチップマイクロコンピュータM32Rファミ
リソフトウエアマニュアル(Rev.1.1)」に詳細に説
明されている。なお本実施の形態ではM32Rを使用し
ているが、これに限定されるものではなく、他のプロセ
ッサの演算部であっても以下の説明から容易に同様のト
ランスレータを備えたデータ処理装置が実現可能である
ことは当業者には明らかである。
ス107Aとアドレスバス107Bとを含む。多機能命
令デコーダ105は、データバス107Aに接続され、
データバス107Aから与えられた非ネイティブコード
を演算部106のネイティブコードに変換するためのハ
ードウェアトランスレータ120と、ハードウェアトラ
ンスレータ120の出力を受ける第1の入力と、データ
バス107Aに接続された第2の入力とを有し、制御信
号の値によっていずれか一方の入力の信号を選択して演
算部106に与えるためのマルチプレクサ121と、ア
ドレスバス107Bに接続され、アドレスバス107B
上のアドレスを非ネイティブコードの格納領域を規定す
るアドレスと比較して、アドレスバス107B上のアド
レスが非ネイティブコードの格納領域のアドレスであれ
ばハードウェアトランスレータ120の出力を選択する
ように、それ以外の場合にはデータバス107Aからの
入力を選択するように、マルチプレクサ121を制御す
る制御信号を出力するための比較回路122とを含む。
3中の、プログラムカウンタが指すアドレス(アドレス
バス107B上)から読み出した命令が非ネイティブコ
ードであればそれを演算部106のネイティブコードに
変換して結果を演算部106に渡す。この処理は後述す
る図10を参照して説明する。
トコードの変換例を説明するための変換対象とするメソ
ッドのJavaバイトコードを示したものである。Ja
vaでは、ソースプログラムから、Javaの実行環境
となる仮想マシン用の中間コードに変換を行ない、この
中間コードを各マシンに用意された仮想マシン実行環境
で実行する。この中間コードはバイト単位で可変長であ
るため、Javaバイトコードと呼ばれる。なお、Ja
va仮想マシンおよびJavaバイトコードについて
は、文献「T. Lindholm, F.Yellin, The Java(TM)
仮想マシン仕様」アジソン・ウェスレイ・パブリッシャ
ーズ・ジャパン、星雲社に詳しく述べられている。
装置のプログラム実行手順を示したフローチャートであ
る。Javaバイトコードで記述されたプログラムを実
行するには、実行前準備処理301の後、最初に実行す
るJavaバイトコードのメソッドを呼出し実行する
(302)。なおここで、Javaバイトコードではサ
ブルーチンのことをメソッドと呼んでいるので、以下の
説明でもサブルーチンのことは一般的にメソッドと呼
ぶ。
vaバイトコードのメソッドの呼出し実行処理の手順を
示したフローチャートである。以下の説明では、ソフト
ウエアトランスレータによる実行の場合は、Javaバ
イトコードのメソッドをネイティブコードのサブルーチ
ンに変換した場合、変換結果のネイティブコードをRA
M103に設定されたソフトウエアキャッシュ内に格納
しておくことを前提としている。この場合、同じ非ネイ
ティブコードを呼出した場合、変換後のネイティブコー
ドをソフトウェアキャッシュから読出して実行すること
により、変換処理を軽減し実行速度を向上させている。
チンの呼出し処理では、最初に以前にこのメソッドが呼
び出されたときの変換結果がRAM103に残っている
かどうかが調べられ(401)、残っていれば変換した
結果のネイティブコードのサブルーチンをRAM103
から呼出して実行する(405)。
残っていない場合は、ステップ402においてハードウ
エアトランスレータ、ソフトウエアトランスレータおよ
びソフトウェアインタプリタのどれを使用してこのメソ
ッドを実行するかを選択する処理を行ない、選択された
実行方法にステップ403で分岐する。
場合は、非ネイティブコードをサブルーチンコールする
(406)。あとは多機能命令デコーダ105がプログ
ラムカウンタのアドレスから読み出した非ネイティブコ
ードをネイティブコードに変換して演算部106がそれ
を実行する(図10)。
択された場合には、読出されたコードを引数としてソフ
トウェアインタプリタサブルーチンをコールする処理を
行なう(407)。このサブルーチンは非ネイティブコ
ードを一コードずつ解釈して実行する。
選択された場合には、ステップ404で、呼び出そうと
している非ネイティブコードのサブルーチンをネイティ
ブコードのサブルーチンに変換する処理を行なう。変換
した結果はRAM103に一時ストアされ、この後、R
AM103をアクセスして変換した結果のネイティブコ
ードのサブルーチンを呼び出す処理が実行される(40
5)。
ルーチン実行方法選択処理の処理手順を示したフローチ
ャートである。ここでは、ソフトウエアキャッシュの状
態と、実行しようとしているサブルーチンの実行頻度と
からハードウエアトランスレータで実行するか、ソフト
ウエアトランスレータで実行するかを切り替えている。
すなわち、実行しようとしているサブルーチンが呼び出
された回数があらかじめ設定された一定の回数を超えて
いる場合にはソフトウエアトランスレータで実行し、そ
うでない場合にはハードウエアトランスレータで実行す
る。この実施の形態では、この回数は、変換後のネイテ
ィブコードを格納しているソフトウエアキャッシュに空
きがある場合(この場合を「N」とする。)とない場合
(この場合を「M」とする。)とで分けている。
ソフトウェアキャッシュに空きがあるか否かを判定する
(417)。空きがある場合には制御はステップ418
に進み、空きがない場合には制御はステップ420に進
む。
るルーチンの呼出し回数が前述したNより大きいか否か
を判定する。大きい場合には制御はステップ422に、
それ以外の場合には制御はステップ419に進む。
スレータを使用することとし、図示しない、分岐制御の
ためのフラグをセットして処理を終了する。
には、ステップ420で呼び出そうとしているサブルー
チンの呼出し回数が前述したMより大きいか否かについ
て判定する。呼出し回数がMより大きい場合には制御は
ステップ422に、それ以外の場合には制御はステップ
419に、それぞれ進む。
つサブルーチンの呼出し回数がNより大きい場合、およ
びソフトウェアキャッシュに空きがなく、かつサブルー
チンの呼出し回数がMより大きい場合には、ステップ4
22において、ソフトウェアキャッシュ中のネイティブ
コードのサブルーチンの一部を解放して、ソフトウェア
キャッシュ中に空き領域を作成することを試みる。
処理の結果空き領域が作成されたか否かについての判定
を行なう。空き領域が作成された場合にはソフトウェア
トランスレータを使用することが決定され(421)、
作成できなかった場合にはソフトウェアインタープリタ
を使用することが決定される(424)。いずれの場合
にも、処理の分岐のためのフラグに適切な値が設定され
て処理を終了する。
を示したフローチャートである。図5および図10を参
照して、アドレスバス107B上に出力されたプログラ
ムカウンタのアドレス範囲があらかじめ設定された非ネ
イティブコードの格納された空間内であるかどうかを比
較回路122により判定し(432)、そうであればプ
ログラムカウンタの指すアドレスから読み出したコード
を非ネイティブコードとしてハードウェアトランスレー
タ120によりネイティブコードに変換する処理を行な
う(434)。結果のネイティブコードを演算部106
に渡す(435)。図5の例では、データバス107A
上のコードをハードウェアトランスレータ120により
ネイティブコードに変換し、その結果をマルチプレクサ
121で選択して演算部106に与える。
ンタのアドレス範囲が非ネイティブコードの格納された
空間内でないと判定された場合には、プログラムカウン
タから読出されたコードはネイティブコードであるか
ら、そのまま演算部106に渡す(433)。図5の例
では、マルチプレクサ121により、ハードウェアトラ
ンスレータ120の出力ではなくデータバス107B上
のコードを選択して演算部106に渡す。
ィブコードのネイティブコードへの変換処理の概略は以
下のとおりである。すなわち、通常の非ネイティブコー
ドの場合には、一つの非ネイティブコードに対して、1
または複数の、順次に実行されるネイティブコードを予
め対応付けておく。さらに非ネイティブコードのオペラ
ンドと、ネイティブコード内のオペランドとの対応関係
を予め定めておく。この際、非ネイティブコードがJa
vaのような仮想マシンである場合、スタックをメモリ
のスタック領域またはレジスタに割当てるようにする。
そして、非ネイティブコードの1命令を実行することに
相当する処理を行なうためのネイティブコードの数に応
じて、プログラムカウンタの値を適切な数だけ加算す
る。これが変換処理の基本である。
な処理を要する(すなわち変換後のネイティブコードの
サイズが大きくなる)非ネイティブコードに対する変換
処理と、メソッド呼び出しを行う非ネイティブコードin
vokestaticに対する変換処理とを示している。invokest
aticなど、非ネイティブコード(Javaバイトコー
ド)については図64を参照。
場合には、図11に示すような処理で変換が行われる。
すなわち、変換しようとする非ネイティブコードの処理
を実行するためのソフトウエアルーチン(あらかじめR
OM103内に格納してある。)を呼び出すようなネイ
ティブコードを生成する(436)。invokestaticに対
しても図12に示されるように同様にその処理ルーチン
を呼び出すが、ここで、この処理ルーチンはさらに図8
で示された非ネイティブコードのメソッド呼出し実行処
理を行うようになっている。したがって、一旦図12の
処理が実行されると、その中で図8の処理が繰り返し実
行されることで非ネイティブコードのプログラムが実行
されていくことになる。このように非ネイティブコード
の別のメソッドをコールする命令が一つのメソッドに存
在する場合も含め、本実施の形態では、メソッドが呼び
出される毎に図8に示す処理ルーチンが実行され、特
に、ハードウェアトランスレータ、ソフトウェアトラン
スレータおよびソフトウェアインタープリタの選択が行
なわれる。
する場合も同様に、メソッド呼出しを行うJavaバイ
トコードに対応して変換後に生成されるネイティブコー
ドは、図8で示された非ネイティブコードのメソッド呼
出し実行処理を行うようになっている。図8が繰り返し
実行されることで非ネイティブコードのプログラムが実
行されていくことになる。
合も同様に、メソッド呼び出しを行うJavaバイトコ
ードに対応して、図8に示された非ネイティブコードの
メソッド呼出し実行処理を行い、図8の処理が繰り返し
実行されることで非ネイティブコードのプログラムが実
行されていくことになる。
のメソッド呼出し実行処理を行うルーチンは予めROM
103に格納されている。
行前処理の手順を示したフローチャートである。実行準
備処理の内容は、プログラムが使用するスタック領域の
RAM102への割当て(501)と、スタックポイン
タをレジスタに設定する処理(502)とである。スタ
ック領域の最終アドレスに4を加えた値をプロセッサ1
0における演算部106のSPレジスタに設定する。
をネイティブコードのサブルーチンに変換する処理(図
8のステップ404)の手順を示したフローチャートで
ある。図14を参照して、まず変換開始処理を行い(6
01)、レジスタ割り当てを行い(602)、メソッド
変換処理を行う(603)。これら各処理について図1
5〜図20を参照して以下に述べる。
たフローチャートである。図15を参照して、ステップ
701で、変換対象のJavaバイトコードの先頭アド
レス、すなわちメソッドの実行開始アドレスを変数jpcs
tartに代入し、最終アドレス+1を変数jpcendに代入す
る。
ドとをメモリに割当てる(702)。集合REGに、割
当て可能なレジスタの番号を代入する(703)。スタ
ック深さリストを空にする(704)。繰返し制御変数
i(i=0〜nStack−1)に対して変数RSiを
0にする(705)。同様に繰返し制御変数j(j=0
〜nLocal−1)に対して変数RLjを0にする
(706)。ただしここでnStackはスタックオペ
ランドの数であり、nLocalはローカル変数の数で
ある。
602の手順を示したフローチャートである。図16に
示す処理では、アドレスjpcをjpcstartからjpcendまで
変化させて、メソッド中のJavaバイトコードについ
て順にステップ804〜812を繰り返し処理する。
録リストを空にする。jpc=jpcstartの時点、すなわちメ
ソッド実行開始時点でのスタック深さは0であるので、
ステップ802ではJavaバイトコードのアドレスjp
cstartとそのアドレスでのスタック深さとを互いに対応
付けて[0,0]のような形でスタック深さリスト(図示
せず)に登録している。この処理の内容は後述する。ス
テップ803でjpcをjpcstartの値に初期化する。
アドレスjpcをjpcstartからjpcendまで変化させて行な
う繰り返し処理である。
スタックの深さjs(アドレスjpcのJavaバイトコー
ドが実行終了した時点でのスタックポインタが示すスタ
ックの位置)を求めている。ステップ804で、アドレ
スjpcに対応付けて登録されたスタック深さがあるか否
かを判定する。なければ、ステップ805でjsにjsnext
を代入してステップ807に進む。あれば、ステップ8
06でjpcに対応付けて登録されているスタック深さをj
sに代入し、ステップ807に進む。
求める。具体的には、ステップ807でアドレスjpcに
あるJavaバイトコードをjinstに代入し、jinstのコ
ードサイズを変数jinstsizeに代入し、jpc+jinstsizeを
jpcnextに代入する。ステップ807で求められるjinst
がjpcにおけるJavaバイトコード、jinstsizeがその
Javaバイトコードのサイズ(バイト単位)である。
nst実行後のスタック深さは 「js − jinstがスタックからポップするオペランド
数」+「jinstがスタックにプッシュするオペランド
数」 として求められる。そこで、ステップ808ではjinst
がスタックからポップするオペランド数を変数consume
に、jinstがスタックにプッシュするオペランド数を変
数produceに、それぞれ代入する。続いてステップ80
9で、js-consume+produceを変数jsnextに代入する。
jsnextをjinstの次に実行する可能性のあるアドレス
(次のJavaバイトコードのアドレスと、分岐先のア
ドレス)に対応して、スタック深さとして記録させてお
く。ステップ811ではjinstが参照するオペランドの
参照カウントを記録している。ステップ812でjpcを
求めた次のアドレスに更新する。さらにステップ813
でjpc<jpcendか否かを判定し、jpcがjpcendになるまで
ステップ804からステップ812までの処理をループ
させている。
情報を元にステップ814でレジスタ割り当てを行って
いる。
0における、アドレスとスタック深さの登録処理の手順
を示したフローチャートである。最初に、登録しようと
しているアドレスを変数jpcrecordに代入し、登録しよ
うとしているスタック深さを変数jsrecordに代入する。
続いてアドレスjpcrecordに対応したスタック深さが既
に登録されているかどうかをチェックし(902)、さ
れていないならアドレスjpcrecordとスタック深さjsrec
ordとの対応を登録する(905)。登録済みなら登録
済みの値と今登録しようとしている値jsrecordとを比較
する(903)。両者が一致するなら処理を終了する。
両者が一致しなければ、実行する経路によってスタック
深さが異なるということであるが、このようなケースで
はスタックオペランドをレジスタに対応付けて割当てる
ことはできない(904)。したがってこの場合には図
示しない、対応付け不可のフラグを設定しておく。
オペランド参照カウントの記録処理の手順を示したフロ
ーチャートである。最初に変数jsminにjs - consumeの
値を代入する(1001)。ポップするスタックオペラ
ンドについて参照カウントRSiを+1し(1002)、プ
ッシュするスタックオペランドについて参照カウントRS
iを+1している(1003)。また、ローカル変数を参
照するか否かを判定し(1004)、参照するならば
(1004の判定結果が「YES」)、そのローカル変
数の参照カウントRLiを+1する(1005)。
レジスタ割当ての決定処理の手順を示したフローチャー
トである。最初に、図17のステップ904でスタック
オペランドのレジスタ割当てができないメソッドと判定
されたか否かをフラグを参照することにより判定する
(1101)。割当てが可能なメソッドであれば、参照
カウントRSiとRLiをソートして(1104)、大きい順
にレジスタを割当てる(1005)。スタックオペラン
ドをレジスタに対応付けて割当てることができないメソ
ッドであることが判明している場合には(1101の判
定結果が「YES」)、ローカル変数についてのみ同様
にしてレジスタに割当てる(1102、1103)。
メソッド変換処理の手順を示したフローチャートであ
る。まずメソッドのエントリにおいてネイティブコード
を生成する。これに付いては後述する図37の(1)に
示している(1201)。次に変数jpcの初期化処理と
してjpcstartの値を代入する(1202)。
について順にステップ1203〜1207を繰返し行
う。すなわち、アドレスjpcにあるJavaバイトコー
ドをjinstに代入する(1203)。次に変数jinstsize
にjinstのコードサイズを代入する(1204)。そし
てjpcとjinstsizeとを加算した結果をjpcnextに代入す
ることで次のコードのアドレスを求める(1205)。
さらに、アドレスjpcに対応して登録されている、図1
6に示した処理で求められたスタック深さを変数jsに代
入する(1206)。そして、このようにして求められ
たjpc、jinstおよびjsをもとにネイティブコードを生成
している(1207)。続いてステップ1208でjpcn
extを変数jpcに代入し、さらにステップ1209でjpc
の値がjpcendより小さければ制御をステップ1203に
戻して以上の処理を繰返し、jpcの値がjpcendより小さ
ければ処理を終了する。
ドの種類に応じて図21〜図28のようなネイティブコ
ードが生成される。これら図および以下の全図におい
て、「TX」はX番地のJavaバイトコードに対して生
成されたネイティブコードのアドレスを指す。各Jav
aバイトコードが対象とするオペランドがレジスタに割
当てられているかメモリに割当てられているかに応じて
生成するバイトコードを変化させている。
ド」については、以降の実際の変換例の説明において詳
細が示される。図28における引数をプッシュするコー
ドについても、以降の実際の変換例の説明において詳細
が示される。図28において、methodIdは、呼び出そう
とするメソッドを表す文字列が格納されている領域のア
ドレスである。callJavaMethodは、レジスタR0が指す
領域に格納された文字列で指定されるメソッドを呼び出
すための処理を図8の手順に従って行うようなルーチン
である。
におけるM32Rのレジスタの使用方法を示したもので
ある。本実施の形態ではサブルーチンの引数はスタック
に格納して渡すようにしているが、一部の引数をたとえ
ばr0-r3レジスタに格納して渡すようにすることも可
能である。
ルーチンにおけるスタックの使用方法を示したものであ
る。図30はサブルーチンが呼び出された時点でのスタ
ックの状態である。引数がスタック上に格納されてい
る。図31は、サブルーチンの最初のエントリコードを
実行した後の状態である。図30の状態から、さらに、
ローカル変数用の領域とスタックオペランド用の領域が
確保され、サブルーチン実行前後で保存しなければなら
ないレジスタ(r8-r14)の値がプッシュされる。図
中、nStackはスタックオペランドの数、nLocalはローカ
ル変数の数、nArgは引数の数である。なお、nLocalには
引数の数も含まれている。これらを図6の例に当てはめ
るとnStack=6、nLocal=3、nArg=2であり、スタック
使用状況は図32、図33のようになる。
のメソッドを図14の処理手順に従ってネイティブコー
ドのサブルーチンに変換する処理について説明する。
ンドは図33で示すメモリ領域に割当てられる。この割
当ての状態を図34に示す。たとえばローカル変数[0]
(第1引数)は、スタックポインタからのオフセットが
60バイトにある4バイトのメモリ領域に割当てられて
いる。
理が実行される。図35および図36はこの処理を実行
中の様子を示したものである。
の参照カウントRS0〜RS5、RL0〜RL2はすべ
て0に設定されている。(RS0〜RS5はスタックオ
ペランド[0]〜[5]の参照カウントであり、RL0〜R
L2はローカル変数[0]〜[2]の参照カウントであ
る。)ステップ801、802により、[アドレス0、
スタック深さ0]がスタック深さリストに登録される。
(スタック深さリストは図示していないが、たとえば登
録された順番をインデックスとしアドレス値とする配列
と、登録された順番をインデックスとしスタック深さを
値とするような配列とで容易に実現することができ
る。)次にステップ803により、jpc=0、jsnext=0
に設定される。以上が状態(1)に示した段階である。
13を実行してステップ813のyesの側に達した時点
での状態を示している。まず、jpcは以前の状態(1)
での値0を引き継いでいる。次に、スタック深さリスト
に[アドレス0、スタック深さ0]が登録されているた
め、ステップ804、806を実行してjs=0となる。
ステップ807で求められるjinstはiload_0、jinsts
izeは1、jpcnextは1となる。iload_0命令はローカ
ル変数[0]の値をスタックにプッシュするものであるた
め、ステップ808で求められるconsume, produce は
それぞれ0、1である。したがって、ステップ809で
求められるjsnextはjs-consume+produce=0-0+1=1と
なる。iload_0の次に実行する可能性のあるのは次の
アドレスjpcnext(=1)のJavaバイトコードだけで
あるため、ステップ810では、[アドレス1、スタッ
ク深さ1]が登録される。iload_0が参照するのはロー
カル変数[0](読み出し)とスタックオペランド[0]
(書き込み)であるため、ステップ811ではこれらに
対応する参照カウントRL0とRS0がそれぞれ+1さ
れて、それぞれ1、1になる。
実行して再び813のyesの側に達する処理を繰り返す
ことで、状態(3)(4)...のように進行していく。
行する可能性のあるのは、次のアドレス(jpcnext)で
ある9番地か、分岐先のアドレスである21番地のいず
れかであるため、[アドレス9,スタック深さ1]と[アド
レス21、スタック深さ1]のふたつがスタック深さリ
ストに登録されている。
実行する可能性のあるのは、分岐先のアドレスである2
8番地であるため、[アドレス28,スタック深さ2]が
登録されている。
に実行する可能性のあるのは、次のアドレスである28
番地であるため、[アドレス28,スタック深さ2]を登
録しようとするが、アドレス28に対するスタック深さ
は状態(18)において既に登録済みであるため、登録
済みのスタック深さと登録しようとするスタック深さと
の一致比較が行われる(ステップ902)。この場合は
一致するため、ステップ904はスキップされてアドレ
スとスタック深さの登録処理は終了する。
行する可能性のあるアドレスは実行時にだけ決定しこの
時点では不明であるため、スタック深さリストには何も
登録されない。
RS0〜RS5、RL0〜RL2で示されるようなオペ
ランドの参照カウントカウントが求められる。また、状
態(1)〜(25)の「登録される命令アドレスとスタ
ック深さ」欄で示されるようなスタック深さがスタック
深さリストに登録されることになる。
理が行われる。ステップ1101ではステップ1104
に進む。ステップ1104ではここまでで求められてい
るオペランド参照カウントRS0〜RS5、RL0〜R
L2を降順にソートする。この例ではRS1、RS0、
RS2、RS3、RS4、RL0、RL2、RS5、R
L1の順になる。ステップ1105においてこの順には
じめの6つのオペランドにレジスタR8〜R13を割当て
ることで、図34に示すようなレジスタ割当て結果とな
る。すなわち、スタックオペランド[1]にレジスタR8
が、スタックオペランド[0]にレジスタR9が、スタッ
クオペランド[2]にレジスタR10が、スタックオペラ
ンド[3]にレジスタR11が、スタックオペランド[4]
にレジスタR12が、ローカル変数[0]にレジスタR13
が、それぞれ割当てられる。
ップ603の処理に移る。ステップ603では図20に
示す処理が行われる。図37および図38はこの処理を
実行するにつれて生成されるネイティブコードを示した
ものである。なおこの図において、S<0>〜S<5>、L<0>〜
L<2>の記号は、図34に示したオペランドを示してい
る。たとえば「ldi S<0>, #1」とは、「ldi R9, #1」の
意味であり、「ld S<3>,@L<1>」とは「ld R10, @(56,s
p)」の意味である。
で示すようなネイティブコードが生成される。このネイ
ティブコードの内容は、これを実行することによって、
図32から図33へスタックレイアウトを変更するため
のコードと、ローカル変数のうち、引数であってレジス
タに割当てられているもの(この例ではL<0>)について
メモリからレジスタに値を読み込んでおくためのコード
である。なお、nLocal、nStack、nArgについては、図3
0〜図33で使用したのと同じ意味である。
ステップ1203において求められるアドレス0にある
Javaバイトコードjinstはiload_0である。ステッ
プ1204において求められるjinstsizeは1である。
ステップ1205において求められるjpcnextは1であ
る。図35の(1)に示すようにアドレス0に対応付け
てスタック深さ0が登録されているため、ステップ12
06において求められるjsは0となる。ステップ120
7では、変換しようとするJavaバイトコードjinst
に応じて、図21〜図28に示されるようなネイティブ
コードの生成が行われる。今の例の場合は、jinstはilo
ad_0であるので図22に示すようなネイティブコード
が生成される。スタック深さjs=0におけるオペランドは
S<0>とL<0>であるが、図34に示すように、オペランド
S<0>はレジスタR9に、オペランドL<0>はレジスタR13
に割当てられているので、図22の最初の行で示される
mv S<0>, L<0>(すなわちmv R9, R13)というネイテ
ィブコードが生成される。以上が図37の(2)で示す
ネイティブコードが生成されるまでの処理である。
〜(25)で示すネイティブコードが生成される。ここ
で、(25)のireturn命令に対して生成されるエピロ
ーグのネイティブコードは、スタックレイアウトを図3
3から図32へ戻すような処理を行っている。
による非ネイティブコードのプログラム実行方式によれ
ば、ローカル変数とオペランドスタックとがレジスタに
割当てられた結果、従来これらがメモリに割当てられて
いた場合に比べて、変換後のネイティブコード数が減少
するととともに、メモリアクセス頻度も減少し、その結
果実行速度も向上する。
成は多くの部分が第1の実施の形態と共通である。
実施の形態は同じであるが、図16のステップ814に
おけるレジスタ決定処理は、この第2の実施の形態の装
置では、図19ではなく、図39のフローチャートで示
す手順に従って行われる。
ジスタを割当てる。今の例ではR8-R11の4つのレジ
スタを割当てるものであり、NS=4である。たとえば
レジスタR8はスタックオペランド[4n](n=0,
1,..)に割当てられることになるが、実行中はスタッ
ク深さをjsとして、スタックオペランド[b]〜スタック
オペランド[js-1]がレジスタに保持されるようなネイ
ティブコードが生成される。すなわちレジスタR8は、
4n < jsであるような最大のnに対するスタックオペラ
ンド[4n]を実行中は保持することになる。レジスタR
8に割当てられているが保持されていないスタックオペ
ランドは、メモリ中にいったん保存される。ローカル変
数に付いては第1の実施の形態と同様に割当てられる。
すなわちローカル変数の参照カウントをソートし(27
01)大きい順にレジスタに割当てる(2704)。
実施の形態の場合と同じであるが、ステップ1207に
おけるjinstのJavaバイトコードに対するネイティ
ブコードの生成処理は、図21〜図28ではなく、jins
tの種類に応じて図40〜図42のフローチャートで示
す手順に従って行われる。
ではなく図43で示すようになる。図40は図20のス
テップ1207において分岐しないJavaバイトコー
ドに対して行われるネイティブコード生成処理である。
ステップ2801では、使用されるスタックオペランド
を求めており、[low]〜[high-1]が使用されることにな
る。ステップ2802ではこれらのオペランドのうちS<
js>〜S<high-1>について、割当てられたレジスタをこ
れらオペランド用にリザーブする処理を行う。レジスタ
に保持されているのはオペランド[b]〜[js-1]であるの
で、これ以外のレジスタを使用する場合、[b-1]以下の
オペランドに付いてはメモリからレジスタにロードする
処理(2803、2804)を、[js]以上のオペランド
に付いてはレジスタをリザーブする処理(2802)を
行っている。
図21〜図28(スタックオペランドがレジスタの場
合)で示したネイティブコードが生成される。ステップ
2806、2807、2809の処理は、実行経路の合
流地点(すなわち分岐先となるラベルのあるアドレス)
において、スタックオペランドのスタックトップ側のN
S(4)個のエントリに割当てられたレジスタに値が保
持されているようにするための処理である。スタックオ
ペランドに割当てられたレジスタには必ずしも値を保持
しているとは限らない(スタックトップ〜スタックオペ
ランド[b]がレジスタに保持されているが、bの値は合流
点に到達する実行経路ごとに異なる可能性がある)。し
たがってそのままでは、複数の経路の実行パスが合流す
る地点において、レジスタの状態が不明となりそれ以降
のネイティブコードの生成においてレジスタを利用する
ことができなくなってしまう。そこで、実行の合流地点
においては、必ずスタックオペランドのスタックトップ
側のNS個のスタックオペランドを割り当てられたレジ
スタに値を保持するようにしている。
いてifgeに対して行われるネイティブコード生成処理で
ある。ifgeについては図63の(8)を参照されたい。
ifgeはS<js-1>を参照するので、まずこれがレジスタに
保持されていないなら(2901)、レジスタにロード
する(2902)。最終的には条件分岐するコードを生
成する(2906)が、その前に、2904、2905
での合流用ネイティブコードを挿入する必要がある。こ
の合流用ネイティブコードにおいて、レジスタS<js-1>
にスタックオペランド[js-5]の値を保持するようにな
る可能性があるので、前もってS<js-1>をレジスタr0
に移しておく(2903)。ステップ2904でアドレ
スjpcnextに対応付けて登録されたスタック深さを変数j
pnextに代入する。ステップ2905では、S<jsnext-1>
から下のNS個のスタックオペランドをレジスタに保存
するためのネイティブコードを生成する。ステップ29
06ではレジスタr0を元に条件分岐する命令を生成す
る。
gotoに対して行われるネイティブコード生成処理であ
る。コードgotoについては、図63の(18)を参照さ
れたい。まず合流用ネイティブコードを生成する(30
01、3002)。すなわち、この例では、分岐先のス
タック深さを表すjsをjsnextに代入し(3001)、S<
jsnext-1>から下のNS個のスタックオペランドをレジ
スタに保持するネイティブコードを生成する(300
2)。
を生成する(3003)。次のアドレスにおいてはスタ
ックトップのNS個がレジスタに保持された状態を示す
ため、bを設定しなおす(3004、3005)。すな
わち、jpcnextに対応付けて登録されたスタック深さを
変数jsnextに代入する(3004)。次に、0とjsnext
-NSとのうち大きい方の値をbに代入する(300
5)。
を示している。この処理ではS<p>〜S<q>レジスタのオー
バーフロー対処のためのネイティブコードを生成する。
そのため、i=p〜qについてステップ3102〜3105
を繰り返している。
する(3101)。繰返し部分では、S<i>レジスタがス
タックオペランド[i-NS]の値を保持しているかどうかを
調べる。[b]〜[js-1]が対応するレジスタに保持されて
いるわけなので、i-NSがb〜js-1の範囲にあれば保持さ
れていることになる。この判定をステップ3102およ
び3103で行なう。ステップ3102においてiがq
以下か否かを判定する。iがqより大きければ処理を終
了する。iがq以下であれば、ステップ3103で、i
−NSがbより小さいか否かを判定する。i−NSがb
より小さければ制御はステップ3104に進む、それ以
外の場合にはステップ3104、3105の処理を行な
わずステップ3106に進む。
メモリに保存するために「st S<i-NS>, @SAVE<i-NS>」
というネイティブコードを生成する(3104)。次に
i−NSがもうレジスタに保持されていないことを示す
ため、bをi−NS+1に変更する(3105)。
処理を示している。i=bottom〜topについて3204を
繰り返す。ステップ3201、3203、3205の処
理がその繰返し制御のための処理である。
し、以下であればステップ3202に進み、bottomがto
pより大きければ処理を終了する。
入する。ステップ3203では、iがtop以下か否かを
判定する。iがtop以下であれば制御はステップ3204
に進む。それ以外の場合にはステップ3206でbottom
までレジスタに保持されていることを示すため、bにbo
ttomの値を代入して処理を終了する。
めに「ld S<i>, @SAVE<i>」というネイティブコードを
生成する。ステップ3205でiに1を加算して、制御
をステップ3203に戻す。以上の処理により、S<bott
om>〜S<top>レジスタのアンダフロー対処のためのネイ
ティブコードが生成された。
のメソッドを、第2の実施の形態における図14の処理
手順に従ってネイティブコードのサブルーチンに変換す
る例について説明する。
の形態と同様に進行する。すなわち、ステップ601の
実行後、すべてのオペランドは図46の変換開始処理直
後の欄で示すようにメモリに割当てられる。これは第1
の実施の形態の図34と同様である。また、ステップ6
02では、第1の実施の形態と同様に、図16で示した
処理に従って図35で示すように処理が進行し、最後の
状態(25)のRS0〜RS5、RL0〜RL2で示さ
れるようなオペランドの参照カウントカウントが求めら
れ、状態(1)〜(25)の「登録される命令アドレス
とスタック深さ」欄で示されるようなスタック深さが登
録されることになる。
る処理が行われる。ステップ2701ではステップ27
02に進む。ステップ2702では、スタックオペラン
ドを4つのレジスタR8〜R11に割り付ける。この例で
は、スタックオペランド[0]とスタックオペランド[4]
とがレジスタR8に、スタックオペランド[1]とスタッ
クオペランド[5]とがレジスタR9に、スタックオペラ
ンド[2]がレジスタR10に、スタックオペランド[3]
がレジスタR11に、それぞれ割り付けられる。ステッ
プ2703ではローカル変数の参照カウントRL0〜R
L2が降順にソートされる。この例ではRL0、RL
2、RL1の順になる。ステップ2704においてこの
順にはじめの2つのローカル変数にレジスタR12、R1
3を割当てることで、図46に示すようなレジスタ割当
て結果となる。
ップ603の処理に移る。ステップ603では図20に
示す処理が行われる。図47および図48はこの処理を
実行するにつれて生成されるネイティブコードを示した
ものである。なおこの図において、S<0>〜S<5>、L<0>〜
L<2>の記号は、図46に示すオペランドを示している。
たとえばldi S<0>, #1とは、ldi R8, #1の意味であ
り、ld S<3>, @L<1>とはld R10, @(56,sp)の意味で
ある。
で示すようなネイティブコードが生成される。このコー
ドの内容は、これを実行することによって、図32から
図33へスタックレイアウトを変更するためのコード
と、ローカル変数のうち、引数であってレジスタに割当
てられているもの(この例ではL<0>とL<2>)についてメ
モリからレジスタに値を読み込んでおくためのコードで
ある。
る。ステップ1203において求められるアドレス0に
あるJavaバイトコードjinstはiload_0である。ス
テップ1204において求められるjinstsizeは1であ
る。ステップ1205において求められるjpcnextは1
である。図35の(1)に示すようにアドレス0に対応
付けてスタック深さ0が登録されているため、ステップ
1206において求められるjsは0となる。ステップ1
207では、変換しようとするJavaバイトコードji
nstに応じて、図40〜図42に示すような処理が行わ
れる。今の例の場合は、jinstはiload_0であるので、
図40に示す処理が行われる。
w、highはそれぞれ0、1である。ステップ2802で
は図44に示す処理が行われるが、この場合はjs=0、b
=0、low=0、high=1であるため、ステップ3101、
3102(Yes)、3103、3104(No)、310
7、3102(No)と進行し、ネイティブコードを生成
することなく終了する。次にステップ2803の判定が
行われ、No側に進行する。ステップ2805の処理は、
第1の実施の形態と同様の処理であり、図21〜図28
に示されている。今の例の場合は、図22に示すような
ネイティブコードが生成される。ここではスタック深さ
js=0におけるオペランドはS<0>とL<0>であるが、図4
6に示すように、オペランドS<0>はレジスタR8に、オ
ペランドL<0>はレジスタR12に割当てられているの
で、図22の最初の行で示される「mvS<0>, L<0>」(す
なわちmv R8, R12)というネイティブコードが生成
される。ステップ2806ではjpcnext(=1)にラベル
があるかどうか調べられるが、今の場合はラベルはない
のでNoへ進んで図40の処理は終了する。以上が図47
の(2)で示すネイティブコードが生成されるまでの処
理である。
で示すネイティブコードが生成される。
1207において図41に示す処理が行われる。js=
2、b=0なのでステップ2901でNoへ進み、ステップ
2903で「mv r0, S<1>」というネイティブコードが
生成される。図35の(8)で示すようにアドレス9に
対してはスタック深さ1が登録されているので、ステッ
プ2904で求められるjsnextは1である。ステップ2
905では図49で示す処理が行われる。さらにステッ
プ3301では図45に示す処理が行われる(bottom=M
AX(0,jsnext-NS)=0、top=b-1=-1)が、ステップ3
201における判定結果はNOとなり、処理を終了す
る。ステップ2906で「bge r0, T21」というネイテ
ィブコードが生成される。以上が(8) で示すネイテ
ィブコードが生成されるまでの処理である。
(2)と同様の処理により、図47に示すネイティブコ
ードが生成される。
プ1207では図40に示す処理が行われる。ステップ
2801で求められるlow、highはそれぞれ4、5であ
る。ステップ2802では図44に示す処理が行われる
が、この場合はp=4、q=4、b=0、low=4、high=5で
あるため、ステップ3103におけるi-NS=0となってス
テップ3104が実行される。すなわちスタックオペラ
ンド[0]をメモリに保存するためのネイティブコードが
生成される。今の例では、「st S<0>, @SAVE<0>」とい
うネイティブコードが生成される。ここで、SAVE<0>
は、レジスタ割当て処理を行う前にS<0>に対して割当て
られていたメモリ領域を表している。今の例では、(4
0,sp)である。ネイティブコード生成後、ステップ3
106においてbは1に更新される。ステップ3107
から、3102での判定がNOとなり図44の処理は終
了する。
の側に進む。ステップ2805の処理は、第1の実施の
形態と同様の処理であるが、今の場合はJavaバイト
コードがiconst_3であるので、図21に示したネイテ
ィブコードが生成される。ここではスタック深さjs=4
におけるオペランドはS<4>であるが、オペランドS<4>は
レジスタR8に割当てられているので、図21のオペラ
ンド割当てがレジスタの場合のネイティブコード、すな
わち「ldi S<3>, #3」というネイティブコードが生成さ
れる。以上が図47の(12)で示すネイティブコード
が生成される処理である。
(12)と同様にして図で示されるネイティブコードが
生成される。ここではステップ3106においてbは2
に更新される。
と同様にして図で示されるネイティブコードが生成され
る。
ステップ1207では図40に示す処理が行われる。ス
テップ2801で求められるlow、highはそれぞれ1、
3である。ステップ2802では図44に示す処理が行
われるが、この場合はp=3、q=2、b=2、low=1、high
=3であるため、ステップ3102における判定結果が
NOとなり図44の処理は終了する。ステップ2803
ではステップ2804に進む。ステップ2804では図
45に示す処理が行われる(top=b-1=1、bottom=low=
1)。ステップ3201、3202、3203からi=1
となってステップ3204が実行される。すなわちスタ
ックオペランド[1]をメモリからレジスタに復帰するた
めのネイティブコードが生成される。今の例では、「ld
S<1>, @SAVE<1>」といネイティブコードが生成され
る。ここで、SAVE<1>は、レジスタ割当て処理を行う前
にS<1>に対して割当てられていたメモリ領域(44,s
p)を表している。
と処理は進み、ステップ3206でb=1に変更されて図
45の処理は終了する。ステップ2805の処理は、第
1の実施の形態と同様の処理であるが、今の場合はJa
vaバイトコードがimulであるので、図24に示したネ
イティブコードが生成される。ここではスタック深さjs
=3におけるオペランドはS<2>、S<3>であるが、それぞ
れレジスタR10、R11に割当てられているので、図24の
オペランド割当てが両方ともレジスタの場合のネイティ
ブコード、すなわち「mul S<2>, S<3>」というネイティ
ブコードが生成される。以上が図47の(17)で示す
ネイティブコードが生成される処理である。
テップ1207では図42に示す処理が行われる。ステ
ップ3001で求められるjsnextは2である。ステップ
3002では図49に示す処理が行われる。ステップ3
301では図45に示す処理が行われる(top=b-1=
0、bottom=MAX(0,jsnext-NS)=0)。ステップ320
1、3202、3203からi=0となってステップ32
04が実行される。すなわちスタックオペランド[0]を
メモリからレジスタに復帰するためのネイティブコード
が生成される。今の例では、「ld S<0>, @SAVE<0>」と
いうネイティブコードが生成される。
(No)と進み、ステップ3206でb=0に変更されて図
45の処理は終了する。ステップ3003において「br
a T28」というネイティブコードが生成される。図35
の(8)で示すようにアドレス21に対してスタック深
さ1が登録されているので、ステップ3004において
求められるjsnextは1である。ステップ3005でb=MA
X(0, jsnext-NS)=0に変更される。以上が図47の
(18)で示すネイティブコードが生成される処理であ
る。
すネイティブコードが生成される。以上のように、本発
明の第2の実施の形態による非ネイティブコードのプロ
グラム実行方式によれば、ローカル変数とオペランドス
タックとがレジスタに割当てられた結果、従来これらが
メモリに割当てられていた場合に比べて、変換後のネイ
ティブコード数が減少するととともに、メモリアクセス
頻度も減少し、その結果実行速度も向上することにな
る。
は多くの部分が第2の実施の形態の装置と共通である。
施の形態の装置で行なわれる処理は第2の実施の形態の
装置で行なわれる処理と同じである。
じである。また図20の処理の流れ自体は同じである
が、ステップ1207におけるjinstのJavaバイト
コードに対するネイティブコードの生成処理は、図40
〜図42に示されるものではなく、対象とするJava
バイトコードの種類ごとに図50〜図62のフローチャ
ートに示す手順で行われる。
行うようなJavaバイトコードに対する処理である。
具体的な例ではiconst_<n>とiload_<n>が相当する。
この場合は、転送を行うネイティブコードを生成する代
わりに、ステップ3601において転送元の場所(ある
いは、転送元が即値の場合にはその即値)をP<i>に記録
しておくだけである。ここで、P<i> (i=0〜nStack-
1)は、即値か転送元の場所かを記録できるようなデー
タ構造である。P<i>は表1のいずれかの値をとる。以下
の説明や図中では、P<i>の値とその意味とはそれぞれ下
に示すような関係であるものとする。
なわち分岐先となるラベルのあるアドレス)において、
スタックオペランドのスタックトップ側のNS(4)個
のエントリに割当てられたレジスタに値が保持されてい
るようにするための処理である。スタックオペランドに
割当てられたレジスタには必ずしも値を保持していると
は限らない。したがってそのままでは、複数の経路の実
行パスが合流する地点において、レジスタの状態が不明
となりそれ以降のネイティブコードの生成においてレジ
スタを利用することができなくなってしまう。そこで、
実行の合流地点においては、必ずスタックオペランドの
スタックトップ側のNS個のスタックオペランドを割り
当てられたレジスタに値を保持するようにしている。そ
のためのネイティブコードは、次のような場合に挿入さ
れることになる。
vaバイトコードがラベルの直前にある場合(すなわち
次のアドレスにラベルがある場合)、そのJavaバイ
トコードに対するネイティブコードの直後(ラベルの
前)に挿入される(ステップ3602、3702、38
06、4003による)。このネイティブコードの挿入
処理は図56に示してある。
において、分岐するネイティブコードを生成する直前に
挿入される(ステップ4101〜4102、4203〜
4205、4208〜4210、4215〜4217に
よる)。
および図53に示してある。図51はスタックオペラン
ドへの即値またはローカル変数の転送がペンディングに
なっている場合に、実際の転送を行なうネイティブコー
ドを生成する処理である。ステップ4401、440
2、4411の制御によって、i=0〜kについてステッ
プ4403〜4410の処理を繰り返し行なう。すなわ
ち、P<i>が即値かL<n>である場合について、S<i>レジス
タをリザーブするための処理を行ない(ステップ440
4と4408)、次にS<i>レジスタに即値あるいはL<n>
の値をロードするネイティブコードを生成している(4
405、4409)。次にS<i>レジスタに有効値が保持
されたことを示すため、P<i>の値をS<i>に変更する(4
406、4410)。
ィブコード生成処理(ステップ3504と3707)は
図52に示すフローチャートに従って行なわれる。まず
S<k>レジスタがスタックオペランド[k-NS]の値を保持し
ているかどうかを調べる(4602)。保持していなけ
ればS<k>レジスタは空いている。保持しているようであ
れば、S<k>レジスタ(S<k-NS>レジスタと同じ)の値を保
存するために、「st S<k-NS>、@SAVE<k-NS>」というネ
イティブコードを生成する(4603)。次にS<k-NS>
レジスタの値が保存されたことを示すため、P<k-NS>の
値をSAVE<k-NS>に変更する(4604)。
ックボトム側のNS個のオペランドのうち、SAVE<i>に
格納されているオペランドを、それらに対して割当てら
れたレジスタにロードするネイティブコードを生成する
処理である。i=k-NS(ただしk<NSのときは0)〜kにつ
いてステップ4503〜4505の処理を繰り返し行な
う。すなわち、P<i>がSAVE<i>であれば(4504)、
「ld S<i>, @SAVE<i>」というネイティブコードを生成
し(4504)、S<i>レジスタに有効値が保持されたこ
とを示すため、P<i>の値をS<i>に変更する(450
5)。
生成処理である。iaddはスタックオペランド[js-2]に
書き込みを行なう(jsはiadd実行時のスタック深さ)の
で、これに対して割当てられたS<js-2>のレジスタをリ
ザーブするためのネイティブコードの生成処理をまず行
なう(3701)。次にステップ3702では、P<js-
2>とP<js-1>に記録された転送元のデータを加算してS
<js-2>レジスタに格納するようなネイティブコードの
生成を行なう。ここで生成するネイティブコードはP<js
-2>とP<js-1>の値の組み合わせに応じて図55のよう
になる。特別な場合としてケース1と6のようにネイテ
ィブコードを生成しないこともある。これらの場合はP<
js-2>には即値を記録しておくが、これ以外のケースで
はS<js-2>に有効な値が保持されたことを示すため、P<
js-2>をS<js-2>に変更する。ステップ3703以降の
処理は図56の通り(図50のステップ3602と同
じ)である。
ィブコード挿入処理である。jpcnextにラベルがある場
合、すなわちプログラム実行経路がjpcnextにおいて合
流する場合にステップ4302〜4304の処理を行な
う。
タック深さの登録値を求めてjpcnextの値とする。ステ
ップ4303では[0]〜[jsnext-1]のスタックオペラン
ドを有効化するためのネイティブコードの生成処理を行
なう(この処理は図51の通りである)。ステップ43
04ではS<jsnext-1>から下NS個のスタックオペラン
ドをレジスタに保持するためのネイティブコードの生成
処理を行なう。このステップの処理は図53の通りであ
る。
算がそれぞれ減算、乗算、除算になる以外はiaddと同様
である。
対するネイティブコードの生成処理である。invokestat
ic<int (int,int)>もリターン値を格納するためにiadd
と同様にスタックオペランド[js-2]に書き込みを行な
うので、iaddと同様にこれに対して割当てられたS<js-
2>のレジスタをリザーブするためのネイティブコード
の生成処理をまず行なう(3801)。次にP<js-2>と
P<js-1>に記録された転送元のデータを引数としてスタ
ックにプッシュするネイティブコードを生成する(38
02、3803)。P<js-2>とP<js-1>の値に応じて生
成されるネイティブコードは変化するが、iaddのときと
同様になるのでここでは図示していない。引き続き生成
するネイティブコード(3804、3805)は、第1
の実施の形態と同様である。ステップ3806以降の処
理は図56の通りである。
ドの生成処理である。まずP<js-1>に記録された転送元
のデータをr0レジスタに転送するネイティブコードを
生成する(3901)。このとき生成するネイティブコ
ードは、P<js-1>の値に応じて変化するが、ここでは図
示していない。引き続き生成するネイティブコード39
02は、第1の実施の形態と同様である。最後に次のア
ドレス以降のネイティブコードの生成に備えてP<i>を設
定している(3903、3904)。
コードの生成処理である。istore_<n>はローカル変数
[n]に書き込みを行なうが、ローカル変数への書き込み
を行なう前には、このローカル変数を転送元とするよう
なオペランドスタックへのデータ転送がペンディングに
なっている場合には、それらのデータ転送を実施してお
く必要がある。そこでそのためのネイティブコードの生
成をまず行なう(4001)。次にP<js-1>に記録され
た転送元のデータをローカル変数[n]に転送するネイテ
ィブコードを生成する。このとき生成するネイティブコ
ードはP<js-1>の値とL<n>がメモリかレジスタかによっ
て変化するが、ここでは図示していない。ステップ40
03以降の処理は図56の通りである。
示してある。ステップ4801、4802および480
7を用いた制御によって、i=0〜js-1についてステップ
4803〜4806の処理を繰り返し行なう。すなわ
ち、P<i>にL<n>が記録されているならば(4803)、
S<i>レジスタをリザーブし(4804)、S<i>レジスタ
にL<n>をロードするネイティブコードを生成し(480
4)、S<i>に有効値が保持されたことを示すため、P<i>
をS<i>に変更する(4806)。
生成処理である。分岐のネイティブコード(bra)を生
成する(4103)が、その前に、スタックオペランド
[js-1]からスタックトップ側のNS個のエントリに割当
てられたレジスタに値を保持するためのネイティブコー
ドを生成する(4101,4102)。これらの処理は
図53、図52の通りである。
生成処理である。P<js-1>に記録された転送元のデータ
と0を比較するネイティブコードと、その転送元のデー
タ>=0であるなら分岐するような条件分岐のネイティブ
コードとを生成するが、その前にスタックトップのNS
個のエントリに割当てられたレジスタに値を保持するた
めのネイティブコードを生成する。なおここでのスタッ
クトップはifgeの実行後のスタックトップであるのでk=
js-2である(ステップ4203〜4205、4208
〜4210、4215〜4217)。
のメソッドを図14の処理手順に従ってネイティブコー
ドのサブルーチンに変換する例について説明する。
同様に行なわれる。すなわち、図46に示すようなレジ
スタ割当て結果となる。
なわれる。図63はこの処理を実行するにつれて生成さ
れるネイティブコードを示したものである。
態(1)で示すようなネイティブコードが生成される。
これは、図32から図33へスタックレイアウトを変更
するためのネイティブコードと、ローカル変数のうち、
引数であってレジスタに割当てられているもの(この例
ではL<0>とL<2>)についてメモリからレジスタに値を読
み込んでおくためのネイティブコードである。
ステップ1203において求められるアドレス0にある
Javaバイトコードjinstはiload_0である。ステッ
プ1204において求められるjinstsizeは1である。
ステップ1205において求められるjpcnextは1であ
る。図35の(1)に示すようにアドレス0に対応付け
てスタック深さ0が登録されているため、ステップ12
06において求められるjsは0となる。
avaバイトコードjinstに応じて図50〜図62に示
すような処理が行なわれる。今の例の場合は、jinstはi
load_0であるので、図50に示す処理が行なわれる。
ステップ4001においてP<0>にL<0>が記録される。ス
テップ3602からNoに進んで図50の処理は終了す
る。以上が図63の(2)の状態である。結局iload_
0に対するネイティブコードはこの(2)では生成され
ないことになる。
録されるだけでネイティブコードは生成されない。
4の処理が行なわれる。ステップ3701では図52に
示す処理が行なわれる(i=js-2=0)が、ステップ46
01における判定結果が「NO」となり処理は終了す
る。ステップ3702でまず図55のネイティブコード
が生成される。今の場合、スタック深さjs=2における
オペランドP<0>とP<1>とはそれぞれL<0>(レジスタ)、
L<1>(レジスタ)であるので、ケース番号29のネイテ
ィブコードが生成される。P<0>はS<0>に変更されて図5
2の処理が終了する。ステップ3703では図56の処
理が行なわれるが、ステップ4301における判定結果
が「NO」となり処理を終了する。以上で図54の処理
を終了する。
テップ1207で図59の処理が行なわれる。図59の
ステップ4001では図60に示す処理が行なわれる。
今の場合L<2>が登録されているP<i>はないので、ステッ
プ4803における判定結果は常に「NO」となり、ネ
イティブコードは生成されずに終了する。スタック深さ
js=1においてP<0>は”S<0>"となっているので、ステッ
プ4002ではS<0>をローカル変数[2]に格納するよう
なネイティブコードを生成する。図46に示されるよう
にローカル変数[2]はメモリに割当てられているので、
「st S<0>, @L<2>」というネイティブコードが生成され
ることになる。ステップ4003では図56の処理が行
なわれるが、ステップ4301における判定結果がNO
となって処理を終了する。以上で図59の処理を終了す
る。
の場合と同様であり、P<0>に即値1が記録され、ネイテ
ィブコードは生成されない。
イティブコードは生成されない。(8)ではステップ1
207において図62の処理が行なわれる。今の場合ス
タック深さjs=2においてP<1>はL<0>となっているの
で、制御はステップ4201、4207、4208と進
む。ステップ4208で求められるjsnextは1である。
ステップ4209では図51に示す処理が行なわれる
(k=0)。ステップ4401、4402からi=0となっ
て制御はステップ4403に進む。P<0>は即値なので、
制御はステップ4404に進む。ステップ4404では
図52に示す処理が行なわれる(k=0)が、ステップ4
601からNoの側に進んで図52の処理は終了する。ス
テップ4405においてS<0>にP<0>の即値(1)をロー
ドするネイティブコードが生成される。ここでは「ldi
S<0>, #1」というネイティブコードが生成されること
になる。ステップ4406でP<0>はS<0>に書きかえられ
る。ステップ4409、4402からNoに進んで図51
の処理は終了する。
す処理が行なわれる(k=0)が、この場合、SAVE<i>が記
録されているP<i>は存在しないので、ステップ4503
での判定結果が「NO」となり、ネイティブコードを生
成することなく図53の処理は終了する。ステップ42
06で「bra T21」というネイティブコードが生成され
る。
(6)(2)(2)(6)(2)と同様に処理され、P<
1>〜P<5>にそれぞれ即値2、L<0>、L<1>、即値3、L<2>
が記録される。
おいて図54の処理が行なわれる。図54のステップ3
701では図52に示す処理が行なわれる(k=js-2=
4)。ここではステップ4601(Yes)、4602と
進む。P<0>にはSAVE<0>が記録されているので、ステッ
プ4603に進む。ステップ4603ではS<0>を保存す
るネイティブコードが生成される。すなわち、「st S<0
>, @SAVE<0>」というネイティブコードが生成される。
ステップ4604においてP<0>がSAVE<0>に変更されて
図52の処理が終了する。
すネイティブコードが生成される。今の場合、スタック
深さjs=6におけるオペランドP<4>とP<5>はそれぞれ即
値3、L<2>(メモリ)であるので、ケース番号5のネイ
ティブコードが生成される。P<4>はS<4>に変更されて図
56の処理を終了し、図54の処理を終了する。
おいて図54の処理が行なわれる(加算の代わりに減算
となる)。ステップ3701では図52に示す処理が行
なわれる(k=js-2=3)が、ここではステップ4601
の判定結果が「NO」となり処理を終了する。ステップ
3702では図55と同様のネイティブコードが生成さ
れる。今の場合、スタック深さjs=5におけるオペラン
ドP<3>とP<4>はそれぞれL<1>(レジスタ)、S<4>(レジ
スタ)であるので、ケース番号27のネイティブコード
が生成される(ただし、addではなくdivを使用する)。
P<3>はS<3>に変更される。
われるが、ステップ4301の判定結果が「NO」とな
り処理を終了する。以上で図54の処理を終了する。
プ1207において図54の処理が行なわれる。図54
のステップ3701では図52に示す処理が行なわれる
(k=js-2=2)が、ここではステップ4601での判定
結果が「NO」となり処理を終了する。ステップ370
2では図55のネイティブコードが生成される。今の場
合、スタック深さjs=4におけるオペランドP<2>とP<3>
はそれぞれL<0>(レジスタ)、S<3>(レジスタ)である
ので、ケース番号27のネイティブコードが生成され
る。P<2>はS<2>に変更される。ステップ3703では図
56の処理が行なわれるが、ステップ4301での判定
結果が「NO」となり処理を終了する。以上で図54の
処理を終了する。
プ1207において図54の処理が行なわれる(ただし
加算でなく乗算である)。ステップ3701では図52
に示す処理が行なわれる(k=js-2=1)が、ここではス
テップ4601での判定結果が「NO」となり、図52
の処理を終了する。
5のネイティブコードが生成される(ただし、addでは
なくmulを使用する)。今の場合、スタック深さjs=3に
おけるオペランドP<1>とP<2>はそれぞれ即値2、S<2>
(レジスタ)であるので、ケース番号2のネイティブコ
ードが生成される。即値2の掛け算は2ビット左シフト
で求められるので、mul命令でなくsll3命令が生成され
る。P<1>はS<1>に変更される。ステップ3703では図
56の処理が行なわれるが、ステップ4301での判定
結果が「NO」となり、何もせず図56の処理を終了す
る。以上で図54の処理を終了する。
プ1207において図61の処理が行なわれる。図61
のステップ4101では図51に示す処理が行なわれる
(k=js-1=1)が、今の場合、即値またはローカル変数
が記録されているP<i>は存在しないため、i=0、1の場
合ともにステップ4403(NO)、4407(NO)
と進行して図51の処理を終了する。
3の処理が行なわれる(k=js-1=1)。ステップ450
1で求められるiは0である。ステップ4502、45
03と進み、P<0>にSAVE<0>が記録されているのでステ
ップ4504に進む。ステップ4504ではSAVE<0>の
メモリ領域の値をレジスタS<0>にロードするネイティブ
コードが生成される。すなわちld S<0>, @SAVE<0>とい
うネイティブコードが生成される。ステップ4505で
はP<0>がS<0>に変更される。ステップ4506でi=1と
なってステップ4502、4503と進む。P<1>はS<1>
となっているので、ステップ4503での判定結果は
「NO」となる。したがってステップ4506でi=2と
なり、ステップ4502での判定結果が「NO」となり
図53の処理を終了する。
a T28」というネイティブコードが生成される。以上が
図63の(18)の状態である。
nextは1であり、ステップ4105ではP<0>がS<0>にな
る。以上が図63の(18’)である。
同様にしてP<1>にL<0>が記録され、ネイティブコードは
生成されない。
が記録され、ネイティブコードは生成されない。
ティブコードが生成される(ただし加算でなく減算とな
る)。この場合は図55のケース番号=25に相当す
る。P<1>がS<1>に変更される。
2>が記録され、ネイティブコードは生成されない。
57の処理が行なわれる。図57のステップ3801で
は図52の処理が行なわれる(k=js-2=1)が、ステッ
プ4601での判定結果が「NO」となって処理を終了
し図57のステップ3802に戻る。P<1>はS<1>である
のでステップ3802で生成されるネイティブコードは
push S<1>となる。P<2>はL<2>であり、L<2>はメモリに
割当てられているので、図57のステップ3803で生
成されるネイティブコードは 「ld r0, @L<2>」と「pus
h r0」とになる。ステップ3804、3805と進んで
図に示すネイティブコードが生成される。ステップ38
06では図56の処理が行なわれるが、ネイティブコー
ドは生成されない。
と同様にして図のネイティブコードが生成される。この
場合は図55のケース番号14に相当する。P<0>がS<0>
に変更される。
7において図58の処理が行われる。P<0>はS<0>である
ので、ステップ3901で生成されるネイティブコード
はmvr0, S<0>となる。ステップ3902に進んで図64
の(25)のネイティブコードが生成される。
タ処理装置によれば、データ転送だけを行なうJava
バイトコードについてはネイティブコードを生成せず、
転送先のオペランドに転送元を対応付けて記録してお
く。演算を行なうJavaバイトコードを変換する際
に、先に転送元が記録されているようなオペランドを使
用する際には記録しておいた転送元を使用して演算を行
うようなネイティブコードを生成する。そのため、変換
後のネイティブコード数が減少し、その結果実行速度も
向上することになる。
例示であって制限的なものではないと考えられるべきで
ある。本発明の範囲は上記した説明ではなくて特許請求
の範囲によって示され、特許請求の範囲と均等の意味お
よび範囲内でのすべての変更が含まれることが意図され
る。
ティブコードを、比較的少ない容量の記憶手段を用い
て、高速に実行できる。
ェア量をより少なく、および/または全体の処理速度を
より高くすることができる。
ェア量をより少なく、および/または全体の処理速度を
より高くすることができる。
プログラムの実行を高速化できる。請求項5に記載の発
明によれば、変換後のプログラムの実行を高速化でき
る。
装置は、請求項5に記載の発明の構成に加えて、コード
変換手段は、スタックへのデータの転送のみを行なう非
ネイティブコードを検出してその転送元と転送先とを対
応付けて記憶するための手段をさらに含み、生成するた
めの手段は、データの転送のみを行なう非ネイティブコ
ードの検出メモリオペランドのうちのスタックオペラン
ドのうち、スタックトップ側のスタックオペランドが、
プロセッサに備えられたレジスタに保持されるように、
データ処理装置に接続されるメモリと、プロセッサのレ
ジスタとの間で実行時にデータの保存と復帰とを行なう
ように、かつ、転送先をオペランドとして使用するコー
ドについては、転送先に代えて、記憶するための手段に
記憶された転送元をオペランドとするように、ネイティ
ブコードを生成するための手段を含む。
うな処理を行なわない場合と比較して減少する。実行す
べきコード数が減少するので、変換後のプログラムの実
行を高速化できる。
装置を示す図である。
令セットを示す図である。
令セットを示す図である。
令セットを示す図である。
る。
使用する変換対象のJavaバイトコードで記述された
メソッドとJavaバイトコードの意味を示す図であ
る。
ブコードのプログラム実行処理の手順を示すフローチャ
ートである。
ブコードのサブルーチン呼出し処理の手順を示すフロー
チャートである。
択処理の手順を示すフローチャートである。
ィブまたはネイティブコードの実行処理の手順を示すフ
ローチャートである。
理を要する非ネイティブコードをネイティブコードに変
換する処理の手順を示すフローチャートである。
aticをネイティブコードに変換する処理の手順を示すフ
ローチャートである。
備処理の手順を示すフローチャートである。
ィブコードのサブルーチンをネイティブコードのサブル
ーチンに変換する処理の手順を示すフローチャートであ
る。
処理の手順を示すフローチャートである。
割当て処理の手順を示すフローチャートである。
とスタック深さの登録処理の手順を示すフローチャート
である。
オペランド参照のカウント処理の手順を示すフローチャ
ートである。
の決定処理の手順を示すフローチャートである。
コード変換処理の手順を示すフローチャートである。
>に対して生成されるネイティブコードを示す図であ
る。
に対して生成されるネイティブコードを示す図である。
に対して生成されるネイティブコードを示す図である。
て生成されるネイティブコードを示す図である。
成されるネイティブコードを示す図である。
成されるネイティブコードを示す図である。
て生成されるネイティブコードを示す図である。
対して生成されるネイティブコードを示す図である。
スタ使用方法を示す図である。
使用方法を示す図である。
使用方法を示す図である。
使用方法を示す図である。
使用方法を示す図である。
レジスタ割当ての状態を示す図である。
処理の実行例を示す図である。
処理の実行例を示す図である。
変換処理の実行例を示す図である。
変換処理の実行例を示す図である。
の決定処理の手順を示すフローチャートである。
vaバイトコードに対するネイティブコードの生成処理
の手順を示すフローチャートである。
イティブコードの生成処理の手順を示すフローチャート
である。
イティブコードの生成処理の手順を示すフローチャート
である。
タの使用方法を示す図である。
スタのオーバーフロー対処のためのネイティブコードの
生成処理の手順を示すフローチャートである。
op>レジスタのアンダフロー対処のためのネイティブコ
ードの生成処理の手順を示すフローチャートである。
レジスタ割当ての状態を示す図である。
変換処理の実行例を示す図である。
変換処理の実行例を示す図である。
ら下のNS個のスタックオペランドをレジスタに保持す
るためのネイティブコードの生成処理の手順を示すフロ
ーチャートである。
ータ転送だけを行なうJavaバイトコードに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
るためのネイティブコードの生成処理の手順を示すフロ
ーチャートである。
リザーブするためのネイティブコードの生成処理の手順
を示すフローチャートである。
S個のスタックオペランドをレジスタに保持するための
ネイティブコードの生成処理の手順を示すフローチャー
トである。
イティブコードの生成処理の手順を示すフローチャート
である。
成されるネイティブコードを示す図である。
流のためのネイティブコード生成処理を示す図である。
対するネイティブコードの生成処理の手順を示すフロー
チャートである。
るネイティブコードの生成処理の手順を示すフローチャ
ートである。
対するネイティブコードの生成処理の手順を示すフロー
チャートである。
理を示す図である。
イティブコードの生成処理の手順を示すフローチャート
である。
イティブコードの生成処理の手順を示すフローチャート
である。
るメソッドコード変換処理の実行例を示す図である。
るメソッドコード変換処理の実行例を示す図である。
M、105 多機能命令デコーダ、106 演算部、1
07 バス、107A データバス、107Bアドレス
バス、110 ネイティブコードのメソッド、111
メソッドが使用するデータ、120 ハードウェアトラ
ンスレータ、121 マルチプレクサ、122 比較回
路。
Claims (6)
- 【請求項1】 所定の命令群をネイティブコードとする
プロセッサ、 前記プロセッサに対する非ネイティブコードを前記プロ
セッサの1または2以上のネイティブコードに変換する
ハードウェアトランスレータ、 前記プロセッサ上で動作し、前記プロセッサに対する非
ネイティブコードを前記プロセッサの1または2以上の
ネイティブコードに変換するソフトウェアトランスレー
タ、 前記ソフトウェアトランスレータの出力するネイティブ
コードを記憶するための記憶手段、 前記プロセッサ上で動作し、前記プロセッサに対する非
ネイティブコードを逐次解釈し、前記プロセッサのネイ
ティブコードを用いて実行するソフトウェアインタープ
リタ、および所定の基準にしたがって、前記ハードウェ
アトランスレータによって出力されるネイティブコード
の実行、前記ソフトウェアトランスレータによって出力
されるネイティブコードの実行、ならびに前記ソフトウ
ェアインタープリタの実行による非ネイティブコードの
逐次解釈および実行のいずれかを選択して前記プロセッ
サを動作させるための選択手段とを含む、データ処理装
置。 - 【請求項2】 前記選択手段は、非ネイティブコードの
種類または実行頻度、若しくは前記記憶手段の状態に依
存して、前記ハードウェアトランスレータによって出力
されるネイティブコードの実行、前記ソフトウェアトラ
ンスレータによって出力されるネイティブコードの実
行、ならびに前記ソフトウェアインタープリタの実行に
よる非ネイティブコードの逐次解釈および実行のいずれ
かを選択して前記プロセッサを動作させるための手段を
含む、請求項1に記載のデータ処理装置。 - 【請求項3】 前記選択手段は、前記所定の基準にした
がって、前記ネイティブコードによって構成されるメソ
ッドが呼出されるごとに、前記ハードウェアトランスレ
ータによって出力されるネイティブコードの実行、前記
ソフトウェアトランスレータによって出力されるネイテ
ィブコードの実行、ならびに前記ソフトウェアインター
プリタの実行による非ネイティブコードの逐次解釈およ
び実行のいずれかを選択して前記プロセッサを動作させ
るための手段を含む、請求項1に記載のデータ処理装
置。 - 【請求項4】 前記ソフトウェアトランスレータは、前
記非ネイティブコードに含まれるメモリオペランドの少
なくとも一部を、前記プロセッサに備えられたレジスタ
に割り付けるように非ネイティブコードをネイティブコ
ードに変換するためのコード変換手段を含む、請求項1
に記載のデータ処理装置。 - 【請求項5】 前記非ネイティブコードは、所定のスタ
ックマシンのネイティブコードであり、前記コード変換
手段は、前記メモリオペランドのうちのスタックオペラ
ンドのうち、スタックトップ側のスタックオペランド
が、前記プロセッサに備えられたレジスタに保持される
ように、前記データ処理装置に接続されるメモリと、前
記プロセッサのレジスタとの間で実行時にデータの保存
と復帰とを行なうようなネイティブコードを生成するた
めの手段を含む、請求項4に記載のデータ処理装置。 - 【請求項6】 前記コード変換手段は、 スタックへのデータの転送のみを行なう非ネイティブコ
ードを検出してその転送元と転送先とを対応付けて記憶
するための手段をさらに含み、 前記生成するための手段は、前記データの転送のみを行
なう非ネイティブコードの検出前記メモリオペランドの
うちのスタックオペランドのうち、スタックトップ側の
スタックオペランドが、前記プロセッサに備えられたレ
ジスタに保持されるように、前記データ処理装置に接続
されるメモリと、前記プロセッサのレジスタとの間で実
行時にデータの保存と復帰とを行なうように、かつ、前
記転送先をオペランドとして使用するコードについて
は、前記転送先に代えて、前記記憶するための手段に記
憶された前記転送元をオペランドとするように、ネイテ
ィブコードを生成するための手段を含む、請求項5に記
載のデータ処理装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000368729A JP2002169696A (ja) | 2000-12-04 | 2000-12-04 | データ処理装置 |
US09/995,837 US6820252B2 (en) | 2000-12-04 | 2001-11-29 | Selective conversion to native code using hardware translator, software translator, and software interpreter |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2000368729A JP2002169696A (ja) | 2000-12-04 | 2000-12-04 | データ処理装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2002169696A true JP2002169696A (ja) | 2002-06-14 |
Family
ID=18838891
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000368729A Pending JP2002169696A (ja) | 2000-12-04 | 2000-12-04 | データ処理装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US6820252B2 (ja) |
JP (1) | JP2002169696A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006126947A (ja) * | 2004-10-26 | 2006-05-18 | Hitachi Software Eng Co Ltd | 情報処理装置、情報処理方法、およびプログラム |
JP2006524382A (ja) * | 2003-04-22 | 2006-10-26 | トランジティブ リミテッド | インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置 |
JP2008243019A (ja) * | 2007-03-28 | 2008-10-09 | Toshiba Corp | ソースコード変換装置及びソースコード変換方法 |
WO2012011228A1 (ja) * | 2010-07-23 | 2012-01-26 | パナソニック株式会社 | アニメーション描画装置、アニメーション描画プログラム、及びアニメーション描画方法 |
Families Citing this family (31)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB9921720D0 (en) * | 1999-09-14 | 1999-11-17 | Tao Group Ltd | Loading object-oriented computer programs |
US7406682B2 (en) * | 2001-03-26 | 2008-07-29 | Emc Corporation | Translator-compiler for converting legacy management software |
JP2002318696A (ja) * | 2001-04-23 | 2002-10-31 | Mitsubishi Electric Corp | プログラム実行装置および方法 |
GB2376099B (en) * | 2001-05-31 | 2005-11-16 | Advanced Risc Mach Ltd | Program instruction interpretation |
CA2376327C (en) * | 2002-03-12 | 2009-04-28 | Ibm Canada Limited-Ibm Canada Limitee | Executing native code in place of non-native code |
US20040215444A1 (en) * | 2002-03-25 | 2004-10-28 | Patel Mukesh K. | Hardware-translator-based custom method invocation system and method |
TW591405B (en) * | 2002-04-19 | 2004-06-11 | Ind Tech Res Inst | Non-copy shared stack and register set device and dual language processor structure using the same |
JP4035004B2 (ja) * | 2002-06-26 | 2008-01-16 | 株式会社ルネサステクノロジ | 情報処理装置 |
US20040031022A1 (en) * | 2002-08-02 | 2004-02-12 | Masayuki Kabasawa | Information processing device for multiple instruction sets with reconfigurable mechanism |
US7444495B1 (en) * | 2002-08-30 | 2008-10-28 | Hewlett-Packard Development Company, L.P. | Processor and programmable logic computing arrangement |
US7103881B2 (en) * | 2002-12-10 | 2006-09-05 | Intel Corporation | Virtual machine to provide compiled code to processing elements embodied on a processor device |
US7444471B1 (en) | 2002-12-30 | 2008-10-28 | Transmeta Corporation | Method and system for using external storage to amortize CPU cycle utilization |
JP4602047B2 (ja) * | 2004-10-29 | 2010-12-22 | ルネサスエレクトロニクス株式会社 | 情報処理装置 |
US7389500B2 (en) * | 2005-07-08 | 2008-06-17 | Microsoft Corporation | Selective pre-compilation of virtual code to enhance boot time emulator performance |
US20070061551A1 (en) * | 2005-09-13 | 2007-03-15 | Freescale Semiconductor, Inc. | Computer Processor Architecture Comprising Operand Stack and Addressable Registers |
US7627852B1 (en) * | 2006-01-17 | 2009-12-01 | Xilinx, Inc. | Embedding an interpreter within an application written in a different programming language |
US7971032B2 (en) * | 2007-11-14 | 2011-06-28 | Vns Portfolio Llc | System for native code execution |
US8726248B2 (en) * | 2008-06-12 | 2014-05-13 | Oracle America, Inc. | Method and apparatus for enregistering memory locations |
US20100287571A1 (en) * | 2009-05-07 | 2010-11-11 | Cypress Semiconductor Corporation | Development, programming, and debugging environment |
JP2011257904A (ja) * | 2010-06-08 | 2011-12-22 | Hitachi Ltd | 制御装置及びそのデータ処理方法 |
EP2649522B1 (fr) * | 2010-12-06 | 2020-04-01 | Google LLC | Methode de mise a disposition d'une application en tant que librairie dans une machine virtuelle |
US20120143589A1 (en) * | 2010-12-07 | 2012-06-07 | Andrew Ward Beale | Multi-modal compiling apparatus and method for generating a hybrid codefile |
CN103282890B (zh) * | 2011-01-12 | 2015-11-25 | 株式会社索思未来 | 程序执行装置以及编译器系统 |
US9063760B2 (en) * | 2011-10-13 | 2015-06-23 | International Business Machines Corporation | Employing native routines instead of emulated routines in an application being emulated |
US10146545B2 (en) | 2012-03-13 | 2018-12-04 | Nvidia Corporation | Translation address cache for a microprocessor |
US9880846B2 (en) | 2012-04-11 | 2018-01-30 | Nvidia Corporation | Improving hit rate of code translation redirection table with replacement strategy based on usage history table of evicted entries |
US10241810B2 (en) * | 2012-05-18 | 2019-03-26 | Nvidia Corporation | Instruction-optimizing processor with branch-count table in hardware |
US20140189310A1 (en) | 2012-12-27 | 2014-07-03 | Nvidia Corporation | Fault detection in instruction translations |
US10108424B2 (en) * | 2013-03-14 | 2018-10-23 | Nvidia Corporation | Profiling code portions to generate translations |
AU2016396782B2 (en) | 2016-03-11 | 2021-07-22 | Lzlabs Gmbh | Load module compiler |
US11687338B2 (en) * | 2021-04-30 | 2023-06-27 | Seagate Technology Llc | Computational storage with pre-programmed slots using dedicated processor core |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10240546A (ja) * | 1997-02-28 | 1998-09-11 | Hitachi Ltd | 実行時プログラム翻訳方法 |
JPH1185534A (ja) * | 1997-06-30 | 1999-03-30 | Sun Microsyst Inc | インタプリタ状態及びレジスタキャシングを利用するインタプリタの発生及び実現 |
JP2000507015A (ja) * | 1996-11-13 | 2000-06-06 | ラツ,ヤイール | リアルタイムプログラム言語アクセラレータ |
WO2000034844A2 (en) * | 1998-12-08 | 2000-06-15 | Jedi Technologies, Inc. | Java virtual machine hardware for risc and cisc processors |
JP2000181724A (ja) * | 1998-10-30 | 2000-06-30 | Sun Microsyst Inc | コンパイルする方法をランタイムにおいて選択する方法及び装置 |
JP2000194668A (ja) * | 1998-12-25 | 2000-07-14 | Toshiba Corp | 計算機システム及び同システムに適用される中間コ―ド実行装置並びに中間コ―ド実行方法 |
JP2000267862A (ja) * | 1999-03-09 | 2000-09-29 | Hewlett Packard Co <Hp> | 資源の消費を最小限にするハイブリッド式ジャストインタイム・コンパイラ |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5590331A (en) * | 1994-12-23 | 1996-12-31 | Sun Microsystems, Inc. | Method and apparatus for generating platform-standard object files containing machine-independent code |
US6026485A (en) | 1996-01-24 | 2000-02-15 | Sun Microsystems, Inc. | Instruction folding for a stack-based machine |
US5896522A (en) * | 1996-12-31 | 1999-04-20 | Unisys Corporation | Selective emulation interpretation using transformed instructions |
US5875336A (en) | 1997-03-31 | 1999-02-23 | International Business Machines Corporation | Method and system for translating a non-native bytecode to a set of codes native to a processor within a computer system |
US5898885A (en) | 1997-03-31 | 1999-04-27 | International Business Machines Corporation | Method and system for executing a non-native stack-based instruction within a computer system |
DE69836902T2 (de) * | 1997-10-02 | 2007-10-18 | Koninklijke Philips Electronics N.V. | Auf variable instruktionen eingestellter computer |
US8489860B1 (en) | 1997-12-22 | 2013-07-16 | Texas Instruments Incorporated | Mobile electronic device having a host processor system capable of dynamically canging tasks performed by a coprocessor in the device |
JP2000347936A (ja) | 1999-06-04 | 2000-12-15 | Mitsubishi Electric Corp | プログラム実行システム |
US20020069402A1 (en) * | 2000-10-05 | 2002-06-06 | Nevill Edward Colles | Scheduling control within a system having mixed hardware and software based instruction execution |
US7574346B2 (en) * | 2000-10-30 | 2009-08-11 | Microsoft Corporation | Kernel emulator for non-native program modules |
-
2000
- 2000-12-04 JP JP2000368729A patent/JP2002169696A/ja active Pending
-
2001
- 2001-11-29 US US09/995,837 patent/US6820252B2/en not_active Expired - Fee Related
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000507015A (ja) * | 1996-11-13 | 2000-06-06 | ラツ,ヤイール | リアルタイムプログラム言語アクセラレータ |
JPH10240546A (ja) * | 1997-02-28 | 1998-09-11 | Hitachi Ltd | 実行時プログラム翻訳方法 |
JPH1185534A (ja) * | 1997-06-30 | 1999-03-30 | Sun Microsyst Inc | インタプリタ状態及びレジスタキャシングを利用するインタプリタの発生及び実現 |
JP2000181724A (ja) * | 1998-10-30 | 2000-06-30 | Sun Microsyst Inc | コンパイルする方法をランタイムにおいて選択する方法及び装置 |
WO2000034844A2 (en) * | 1998-12-08 | 2000-06-15 | Jedi Technologies, Inc. | Java virtual machine hardware for risc and cisc processors |
JP2000194668A (ja) * | 1998-12-25 | 2000-07-14 | Toshiba Corp | 計算機システム及び同システムに適用される中間コ―ド実行装置並びに中間コ―ド実行方法 |
JP2000267862A (ja) * | 1999-03-09 | 2000-09-29 | Hewlett Packard Co <Hp> | 資源の消費を最小限にするハイブリッド式ジャストインタイム・コンパイラ |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006524382A (ja) * | 2003-04-22 | 2006-10-26 | トランジティブ リミテッド | インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置 |
JP4844971B2 (ja) * | 2003-04-22 | 2011-12-28 | インターナショナル・ビジネス・マシーンズ・コーポレーション | インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置 |
JP2006126947A (ja) * | 2004-10-26 | 2006-05-18 | Hitachi Software Eng Co Ltd | 情報処理装置、情報処理方法、およびプログラム |
JP2008243019A (ja) * | 2007-03-28 | 2008-10-09 | Toshiba Corp | ソースコード変換装置及びソースコード変換方法 |
WO2012011228A1 (ja) * | 2010-07-23 | 2012-01-26 | パナソニック株式会社 | アニメーション描画装置、アニメーション描画プログラム、及びアニメーション描画方法 |
US8963929B2 (en) | 2010-07-23 | 2015-02-24 | Panasonic Intellectual Property Corporation Of America | Animation drawing device, computer-readable recording medium, and animation drawing method |
JP5715133B2 (ja) * | 2010-07-23 | 2015-05-07 | パナソニック インテレクチュアル プロパティ コーポレーション オブアメリカPanasonic Intellectual Property Corporation of America | アニメーション描画装置、アニメーション描画プログラム、及びアニメーション描画方法 |
Also Published As
Publication number | Publication date |
---|---|
US6820252B2 (en) | 2004-11-16 |
US20020099930A1 (en) | 2002-07-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2002169696A (ja) | データ処理装置 | |
US6332215B1 (en) | Java virtual machine hardware for RISC and CISC processors | |
US5721854A (en) | Method and apparatus for dynamic conversion of computer instructions | |
EP0938703B1 (en) | Real time program language accelerator | |
US6338160B1 (en) | Constant pool reference resolution method | |
US6826749B2 (en) | Java hardware accelerator using thread manager | |
US8473718B2 (en) | Java hardware accelerator using microcode engine | |
US9207958B1 (en) | Virtual machine coprocessor for accelerating software execution | |
US5925123A (en) | Processor for executing instruction sets received from a network or from a local memory | |
US5452426A (en) | Coordinating speculative and committed state register source data and immediate source data in a processor | |
US8239660B2 (en) | Processor with automatic scheduling of operations | |
WO2000034844A9 (en) | Java virtual machine hardware for risc and cisc processors | |
EP1380946A2 (en) | Program code conversion with reduced translation | |
US8769508B2 (en) | Virtual machine hardware for RISC and CISC processors | |
KR100368166B1 (ko) | 컴퓨터 처리 시스템에서 스택 레퍼런스를 변경하는 방법 | |
US7225436B1 (en) | Java hardware accelerator using microcode engine | |
WO2004003729A2 (en) | Apparatus for register file extension | |
JPH1078873A (ja) | エミュレーション・システムで非同期信号を処理する方法 | |
CN104346132A (zh) | 应用于智能卡虚拟机运行的控制装置及智能卡虚拟机 | |
JP4799016B2 (ja) | 機能を呼び出す方法と装置 | |
US20050149694A1 (en) | Java hardware accelerator using microcode engine | |
JP3701203B2 (ja) | 計算機システム | |
EP0101718B1 (en) | Computer with automatic mapping of memory contents into machine registers | |
US6604193B1 (en) | Processor in which register number translation is carried out | |
US20040148489A1 (en) | Sideband VLIW processor |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20071011 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20100120 |
|
A711 | Notification of change in applicant |
Free format text: JAPANESE INTERMEDIATE CODE: A712 Effective date: 20100519 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20100928 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20110208 |