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
Application number
JP2000368729A
Other languages
English (en)
Inventor
Mamoru Sakamoto
守 坂本
Toyohiko Yoshida
豊彦 吉田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Priority to JP2000368729A priority Critical patent/JP2002169696A/ja
Priority to US09/995,837 priority patent/US6820252B2/en
Publication of JP2002169696A publication Critical patent/JP2002169696A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30174Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract 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

(57)【要約】 【課題】 非ネイティブコードを少ないハードウェア量
で高速に実行することが可能なデータ処理装置を提供す
る。 【解決手段】 データ処理装置は、非ネイティブコード
をプロセッサのネイティブコードに変換するハードウェ
アトランスレータ120と、ソフトウェアトランスレー
タと、プロセッサに対する非ネイティブコードを逐次解
釈し、プロセッサのネイティブコードを用いて実行する
ソフトウェアインタープリタとを含み、これらを所定の
基準にしたがって選択して動作させる回路121、12
2などを含む。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、データ処理装置に
関わるもので、特に、データ処理装置に搭載されている
プロセッサのネイティブコードに加えて、非ネイティブ
コードを実行するための機能を備えたデータ処理装置に
関わるものである。
【0002】
【従来の技術】プロセッサはあるアーキテクチャに基づ
いて設計され製作される。アーキテクチャでは命令体
系、命令形式などが決定され、そうした命令形式の命令
を効率よく実行するようにハードウェアが製作される。
データ処理装置において実行させるプログラムは、この
ように搭載されているプロセッサの命令コード(「ネイ
ティブコード」と呼ぶ。)で記述しておくのが通常であ
る。
【0003】ところがこれに反して、搭載されているプ
ロセッサ以外のプロセッサの命令コード(「非ネイティ
ブコード」と呼ぶ。)で記述されているプログラムを実
行させたいという場合もある。ひとつの例は、新しいプ
ロセッサ用のプログラム開発が間に合わない際に、古い
プロセッサ用のプログラムを新しいプロセッサで実行さ
せたいという場合である。別の例は、Java(「Ja
va」はSun Microsystems, Incの商標である。)バイ
トコードのように、仮想的なプロセッサ(「Java仮
想マシン」と呼ばれる。)用の言語で記述されたひとつ
のプログラムを、それぞれ異なるプロセッサを搭載した
複数種類の装置で実行させたいという場合である。
【0004】非ネイティブコードをプロセッサで実行す
るための手段として従来から用いられている手法には、
ソフトウエアインタープリタ、ソフトウェアトランスレ
ータ、ハードウェアトランスレータがある。
【0005】ソフトウェアインタープリタを用いる手法
では、以下の一連の処理ステップをプロセッサ上でソフ
トウェアインタープリタと呼ばれるソフトウェアを実行
することにより行なう。
【0006】(1) 非ネイティブコードのメモリから
の読み出し (2) 読み出した非ネイティブコードに対する処理ル
ーチンへのディスパッチ (3) 読み出した非ネイティブコードに対する処理ル
ーチンの実行 (4) 非ネイティブコードのプログラムカウンタの更
新 このソフトウエアインタープリタ自体は、搭載されてい
るプロセッサのネイティブコードで記述されている。
【0007】ソフトウェアは柔軟性が高く、処理速度を
考慮しなければ実際上どのような処理でも実現できるた
め、このソフトウェアインタープリタは容易に実現可能
である。しかしその半面、ステップ(3)での実際の処
理以外に、(1)、(2)および(4)の追加処理が必
要となるため、実行速度が低下するという問題がある。
【0008】一方、「トランスレータ」とは、非ネイテ
ィブコードのプログラムを、同等内容のネイティブコー
ドのプログラムに変換する装置のことをいう。変換をハ
ードウエアで行なうものがハードウエアトランスレータ
であり、ソフトウエアで行なうものがソフトウエアトラ
ンスレータである。
【0009】ハードウエアトランスレータについては、
たとえば、米国特許第5875336号に述べられてい
る。ハードウェアトランスレータは、非ネイティブコー
ドの各命令の動作をシミュレーションするためにハード
ウェアにより、非ネイティブコードの各コードと同等内
容の処理を実現するネイティブコードを生成する。しか
しこの際、以下の要因によって変換後のネイティブコー
ドの実行速度が低下するという問題がある。
【0010】第1に、トランスレータでは、非ネイティ
ブコードの読出のために、演算結果だけでなく非ネイテ
ィブコードのPC(プログラムカウンタ)値または必要
に応じてフラグまでシミュレーションしなければならな
い。そのため、1つの非ネイティブコードの動作を多数
のネイティブコードで置き換えることになってしまう。
【0011】第2に、プロセッサに備えられるレジスタ
数として非ネイティブコードが想定している数よりも、
プロセッサに備えられているレジスタの数のほうが多い
場合であっても、それを利用することができない。たと
えば、トランスレータでは、非ネイティブコードのメモ
リオペランドはネイティブコードにおいてもやはりメモ
リオペランドに変換され、レジスタには割当てられな
い。
【0012】変換後のネイティブコードの実行速度が低
下するという問題に対する解決策の一つが米国特許第5
898885号において提案されている。この手法は、
非ネイティブコードがJavaバイトコードのようなス
タックマシンのコードであることを前提としている。提
案された手法では、スタックへデータをプッシュする非
ネイティブコードにそのデータをポップする非ネイティ
ブコードが連続するような場合に、それらをまとめて実
行できるようなネイティブコードを生成する。これによ
り、メモリへのアクセス回数が減少するので、実行速度
の高速化を図ることができる。米国特許第602648
5号にも類似の技術の提案がある。
【0013】しかし、この方法は、その性質上、プッシ
ュの直後にそのデータのポップがなければ適用すること
ができないという制限がある。
【0014】ソフトウエアトランスレータにより変換す
る場合も、上記のような速度低下という問題はある。し
かし、ハードウエアトランスレータとは異なりソフトウ
エアトランスレータでは命令単位ではなくより大きなプ
ログラム単位(サブルーチン単位やクラス単位)での変
換処理を行うことができるという柔軟性があるため、無
駄なメモリアクセスなどをなくすことが可能で、速度低
下をある程度に押さえることができる。しかし、実行時
の速度低下が少ないネイティブコードを生成しようとす
れば、変換処理が複雑となり、変換処理時間が増大する
という問題がある。
【0015】このような変換処理時間のオーバーヘッド
を押さえるため、ソフトウエアトランスレータでは、一
度変換して生成したネイティブコードをメモリに保持し
ておく手法が用いられる。再度同じプログラム部分が実
行されるときには、変換処理を行なうことはせず、メモ
リに保持されている変換後のネイティブコードが再利用
される。しかしこうした、非ネイティブコードのプログ
ラムを変換した後のネイティブコードを保持するために
大容量のメモリを新たに必要とし、メモリのコストが増
大してしまうという別な問題が発生する。
【0016】変換後のネイティブコードを保持するため
のメモリ容量の増大を防ぐために、変換後のネイティブ
コード保持用のRAM(Random Access
Memory)を一定サイズとしておき、ソフトウエア
キャッシュとして用いる手法を考えることができる。こ
の手法では、サブルーチン(またはメソッド)単位に非
ネイティブコードをネイティブコードに変換してこのR
AMに追加保持していく。このRAMが一杯になったと
きには、実行が終わってそれ以後に実行する可能性が低
いサブルーチン(あるいはメソッド)のネイティブコー
ドをRAMから解放する。解放してできた空きRAM領
域に新たな変換後のネイティブコードからなるサブルー
チン(あるいはメソッド)を保持する。
【0017】このようなソフトウエアキャッシュを併用
するソフトウエアトランスレータは、メモリ容量増大の
防止に対してはある程度効果が期待される。しかし、メ
モリに全ての変換後の命令を保持する場合と比較して、
変換処理の回数が増えるため、そのオーバヘッドの増大
が問題となる。変換処理時間を短く押さえるために変換
処理の内容を単純化し非ネイティブコード単位で変換す
ると、変換後生成されたネイティブコードの実行速度が
低くなってしまうということになるのは既に述べたとお
りである。
【0018】
【発明が解決しようとする課題】以上のように、ソフト
ウェアインタープリタでは実行速度が極端に遅くなると
いう問題がある。一方、ハードウエアトランスレータで
もソフトウェアインタープリタほどではないにしろ、実
行速度の低下を防止することがある程度以上は困難であ
る。また非ネイティブコード全てをトランスレートする
ためにはハードウェア量が増大してしまうという問題が
ある。また、ソフトウエアトランスレータには実行速度
の向上とメモリ増加の防止とが両立しにくいという問題
がある。
【0019】本発明は上記のような従来の方法に残る課
題を解決するためになされたもので、非ネイティブコー
ドを少ないハードウェア量で高速に実行することが可能
な、非ネイティブコードのトランスレータを有するデー
タ処理装置を提供することを目的とする。
【0020】
【課題を解決するための手段】請求項1に記載の発明に
かかるデータ処理装置は、所定の命令群をネイティブコ
ードとするプロセッサ、プロセッサに対する非ネイティ
ブコードをプロセッサの1または2以上のネイティブコ
ードに変換するハードウェアトランスレータ、プロセッ
サ上で動作し、プロセッサに対する非ネイティブコード
をプロセッサの1または2以上のネイティブコードに変
換するソフトウェアトランスレータ、ソフトウェアトラ
ンスレータの出力するネイティブコードを記憶するため
の記憶手段、プロセッサ上で動作し、プロセッサに対す
る非ネイティブコードを逐次解釈し、プロセッサのネイ
ティブコードを用いて実行するソフトウェアインタープ
リタ、ならびに所定の基準にしたがって、ハードウェア
トランスレータによって出力されるネイティブコードの
実行、ソフトウェアトランスレータによって出力される
ネイティブコードの実行、ならびにソフトウェアインタ
ープリタの実行による非ネイティブコードの逐次解釈お
よび実行のいずれかを選択してプロセッサを動作させる
ための選択手段とを含む。
【0021】変換後のネイティブコードを記憶するため
の記憶手段を必要としないが、処理速度の点で劣るハー
ドウェアトランスレータおよびソフトウェアインタープ
リタと、記憶手段を必要とするが処理速度の点で優るソ
フトウェアトランスレータとを、所定の基準にしたがっ
て選択し使い分けることができる。そのため、非ネイテ
ィブコードを、比較的少ない容量の記憶手段を用いて実
行できる。ソフトウェアトランスレータを用いると処理
が高速に行なえるので、全体としての処理の高速化が可
能となる。また、ハードウェアトランスレータのハード
ウェア量を増大させるような命令についてはソフトウェ
アインタープリタで実行できるので、ハードウェアトラ
ンスレータは、限定された数の非ネイティブコードを変
換するだけでよい。そのハードウェアは比較的単純とな
る。またソフトウェアインタープリタで実行される命令
は限定されるので、その処理が遅くとも全体の処理速度
にはそれほどの影響は生じない。
【0022】請求項2に記載の発明にかかるデータ処理
装置は、請求項1に記載の発明の構成に加えて、選択手
段は、非ネイティブコードの種類または実行頻度、若し
くは記憶手段の状態に依存して、ハードウェアトランス
レータによって出力されるネイティブコードの実行、ソ
フトウェアトランスレータによって出力されるネイティ
ブコードの実行、ならびにソフトウェアインタープリタ
の実行による非ネイティブコードの逐次解釈および実行
のいずれかを選択してプロセッサを動作させるための手
段を含む。
【0023】非ネイティブコードの種類、実行頻度、記
憶手段の状態に依存していずれかを選択するため、非ネ
イティブコードの実行時の結果に基づいて適切にどのト
ランスレータまたはインタープリタを選択するかを決定
できる。そのため、ハードウェア量をより少なく、およ
び/または全体の処理速度をより高くすることができ
る。
【0024】請求項3に記載の発明にかかるデータ処理
装置は、請求項1に記載の発明の構成に加えて、選択手
段は、所定の基準にしたがって、ネイティブコードによ
って構成されるメソッドが呼出されるごとに、ハードウ
ェアトランスレータによって出力されるネイティブコー
ドの実行、ソフトウェアトランスレータによって出力さ
れるネイティブコードの実行、ならびにソフトウェアイ
ンタープリタの実行による非ネイティブコードの逐次解
釈および実行のいずれかを選択してプロセッサを動作さ
せるための手段を含む。
【0025】メソッドの呼出し時ごとに、ハードウェア
トランスレータ、ソフトウェアトランスレータおよびソ
フトウェアインタープリタのいずれかを動的に選択でき
る。データ処理装置の状況、プログラムの実行状況など
にあわせてデータ処理装置自体がいずれを選択するかを
決定できるため、ハードウェア量をより少なく、および
/または全体の処理速度をより高くすることができる。
【0026】請求項4に記載の発明にかかるデータ処理
装置は、請求項1に記載の発明の構成に加えて、ソフト
ウェアトランスレータは、非ネイティブコードに含まれ
るメモリオペランドの少なくとも一部を、プロセッサに
備えられたレジスタに割り付けるように非ネイティブコ
ードをネイティブコードに変換するためのコード変換手
段を含む。
【0027】メモリアクセスがレジスタへのアクセスに
置換されるため、時間を要するメモリアクセスが減少
し、変換後のプログラムの実行を高速化できる。
【0028】請求項5に記載の発明にかかるデータ処理
装置は、請求項4に記載の発明の構成に加えて、非ネイ
ティブコードは、所定のスタックマシンのネイティブコ
ードであり、コード変換手段は、メモリオペランドのう
ちのスタックオペランドのうち、スタックトップ側のス
タックオペランドが、プロセッサに備えられたレジスタ
に保持されるように、データ処理装置に接続されるメモ
リと、プロセッサのレジスタとの間で実行時にデータの
保存と復帰とを行なうようなネイティブコードを生成す
るための手段を含む。
【0029】スタックオペランドがメモリではなくレジ
スタに割当てられる。その結果、時間を要するメモリア
クセスが減少し、変換後のプログラムの実行を高速化で
きる。
【0030】請求項6に記載の発明にかかるデータ処理
装置は、請求項5に記載の発明の構成に加えて、コード
変換手段は、スタックへのデータの転送のみを行なう非
ネイティブコードを検出してその転送元と転送先とを対
応付けて記憶するための手段をさらに含み、生成するた
めの手段は、データの転送のみを行なう非ネイティブコ
ードの検出メモリオペランドのうちのスタックオペラン
ドのうち、スタックトップ側のスタックオペランドが、
プロセッサに備えられたレジスタに保持されるように、
データ処理装置に接続されるメモリと、プロセッサのレ
ジスタとの間で実行時にデータの保存と復帰とを行なう
ように、かつ、転送先をオペランドとして使用するコー
ドについては、転送先に代えて、記憶するための手段に
記憶された転送元をオペランドとするように、ネイティ
ブコードを生成するための手段を含む。
【0031】変換後のネイティブコードの数が、このよ
うな処理を行なわない場合と比較して減少する。実行す
べきコード数が減少するので、変換後のプログラムの実
行を高速化できる。
【0032】
【発明の実施の形態】以下に述べる本発明の実施の形態
にかかるデータ処理装置はいずれも、ソフトウエアによ
りJavaバイトコードをネイティブコードに変換する
ソフトウエアトランスレータ、ハードウエアによりJa
vaバイトコードをネイティブコードに変換するハード
ウエアトランスレータ、ソフトウエアでJavaバイト
コードを実行時に解析してシミュレートするソフトウエ
アインタープリタと、対象のJavaバイトコードの内
容に依存してこれら3つの手段を動的に切り替えるトラ
ンスレータを備えたものである。本発明がこれらの実施
の形態に限定されるわけではないことは当業者には明ら
かである。たとえば、以下の各実施の形態の説明では、
非ネイティブコードとしてJavaバイトコードを想定
するが、それ以外のコードを非ネイティブコードとして
実行する場合も同様の考えでトランスレータを実現する
ことができる。
【0033】第1の実施の形態 図1は、本発明の一実施の形態にかかるデータ処理装置
の概略構成を示したものである。図1を参照して、この
データ処理装置は、互いにバス107に接続されたプロ
セッサ101、RAM102と、所定アドレスに非ネイ
ティブコードを格納するROM(Read−Only
Memory)103とを含む。
【0034】単一の半導体チップで構成されたプロセッ
サ101は、プロセッサ101の本体であり従来のプロ
セッサと同等の機能を持つ演算部106と、演算部10
6とバス107との間に挿入され、バス107から受取
った命令がROM103の所定アドレスから読出された
非ネイティブコードであればそれを演算部106のネイ
ティブコードに変換して演算部106に与え、ROM1
03の所定アドレスから読出された非ネイティブコード
でなければ、そのまま演算部106に与える処理を行な
うための多機能命令デコーダ105とを含む。
【0035】RAM102は、演算部106のネイティ
ブコードのメソッドと、このメソッドが使用するデータ
とを格納するためのものである。
【0036】ROM103は、非ネイティブコードで記
述されたプログラムおよび後述する非ネイティブコード
のメソッド呼出し処理ルーチンをプロセッサ101で実
行するプログラム(プロセッサ101にソフトウェアト
ランスレータを動作させるためのプログラム、およびプ
ロセッサ101にソフトウェアインタープリタを動作さ
せるためのプログラムを含む)を記憶する、コンピュー
タ(プロセッサ101)に読取り可能な記憶媒体であ
る。本実施の形態の装置では、非ネイティブコードとし
て、Java仮想マシンの命令セットであるJavaバ
イトコードを使用する。メソッド呼出し処理ルーチン自
体はネイティブコードからなっている。
【0037】演算部106は三菱電機株式会社製32ビ
ットマイクロプロセッサであるM32Rの演算部の機能
を持つ。図2〜図4にこの演算部106の命令セットを
示す。M32Rプロセッサについては、「三菱32ビッ
トシングルチップマイクロコンピュータM32Rファミ
リソフトウエアマニュアル(Rev.1.1)」に詳細に説
明されている。なお本実施の形態ではM32Rを使用し
ているが、これに限定されるものではなく、他のプロセ
ッサの演算部であっても以下の説明から容易に同様のト
ランスレータを備えたデータ処理装置が実現可能である
ことは当業者には明らかである。
【0038】図5を参照して、バス107は、データバ
ス107Aとアドレスバス107Bとを含む。多機能命
令デコーダ105は、データバス107Aに接続され、
データバス107Aから与えられた非ネイティブコード
を演算部106のネイティブコードに変換するためのハ
ードウェアトランスレータ120と、ハードウェアトラ
ンスレータ120の出力を受ける第1の入力と、データ
バス107Aに接続された第2の入力とを有し、制御信
号の値によっていずれか一方の入力の信号を選択して演
算部106に与えるためのマルチプレクサ121と、ア
ドレスバス107Bに接続され、アドレスバス107B
上のアドレスを非ネイティブコードの格納領域を規定す
るアドレスと比較して、アドレスバス107B上のアド
レスが非ネイティブコードの格納領域のアドレスであれ
ばハードウェアトランスレータ120の出力を選択する
ように、それ以外の場合にはデータバス107Aからの
入力を選択するように、マルチプレクサ121を制御す
る制御信号を出力するための比較回路122とを含む。
【0039】多機能命令デコーダ105は、ROM10
3中の、プログラムカウンタが指すアドレス(アドレス
バス107B上)から読み出した命令が非ネイティブコ
ードであればそれを演算部106のネイティブコードに
変換して結果を演算部106に渡す。この処理は後述す
る図10を参照して説明する。
【0040】図6は本実施の形態におけるJavaバイ
トコードの変換例を説明するための変換対象とするメソ
ッドのJavaバイトコードを示したものである。Ja
vaでは、ソースプログラムから、Javaの実行環境
となる仮想マシン用の中間コードに変換を行ない、この
中間コードを各マシンに用意された仮想マシン実行環境
で実行する。この中間コードはバイト単位で可変長であ
るため、Javaバイトコードと呼ばれる。なお、Ja
va仮想マシンおよびJavaバイトコードについて
は、文献「T. Lindholm, F.Yellin, The Java(TM)
仮想マシン仕様」アジソン・ウェスレイ・パブリッシャ
ーズ・ジャパン、星雲社に詳しく述べられている。
【0041】図7は第1の実施の形態によるデータ処理
装置のプログラム実行手順を示したフローチャートであ
る。Javaバイトコードで記述されたプログラムを実
行するには、実行前準備処理301の後、最初に実行す
るJavaバイトコードのメソッドを呼出し実行する
(302)。なおここで、Javaバイトコードではサ
ブルーチンのことをメソッドと呼んでいるので、以下の
説明でもサブルーチンのことは一般的にメソッドと呼
ぶ。
【0042】図8は図7のステップ302におけるJa
vaバイトコードのメソッドの呼出し実行処理の手順を
示したフローチャートである。以下の説明では、ソフト
ウエアトランスレータによる実行の場合は、Javaバ
イトコードのメソッドをネイティブコードのサブルーチ
ンに変換した場合、変換結果のネイティブコードをRA
M103に設定されたソフトウエアキャッシュ内に格納
しておくことを前提としている。この場合、同じ非ネイ
ティブコードを呼出した場合、変換後のネイティブコー
ドをソフトウェアキャッシュから読出して実行すること
により、変換処理を軽減し実行速度を向上させている。
【0043】したがって非ネイティブコードのサブルー
チンの呼出し処理では、最初に以前にこのメソッドが呼
び出されたときの変換結果がRAM103に残っている
かどうかが調べられ(401)、残っていれば変換した
結果のネイティブコードのサブルーチンをRAM103
から呼出して実行する(405)。
【0044】このメソッドの変換結果がRAM103に
残っていない場合は、ステップ402においてハードウ
エアトランスレータ、ソフトウエアトランスレータおよ
びソフトウェアインタプリタのどれを使用してこのメソ
ッドを実行するかを選択する処理を行ない、選択された
実行方法にステップ403で分岐する。
【0045】ハードウエアトランスレータによる実行の
場合は、非ネイティブコードをサブルーチンコールする
(406)。あとは多機能命令デコーダ105がプログ
ラムカウンタのアドレスから読み出した非ネイティブコ
ードをネイティブコードに変換して演算部106がそれ
を実行する(図10)。
【0046】ソフトウェアインタプリタによる実行が選
択された場合には、読出されたコードを引数としてソフ
トウェアインタプリタサブルーチンをコールする処理を
行なう(407)。このサブルーチンは非ネイティブコ
ードを一コードずつ解釈して実行する。
【0047】ソフトウェアトランスレータによる処理が
選択された場合には、ステップ404で、呼び出そうと
している非ネイティブコードのサブルーチンをネイティ
ブコードのサブルーチンに変換する処理を行なう。変換
した結果はRAM103に一時ストアされ、この後、R
AM103をアクセスして変換した結果のネイティブコ
ードのサブルーチンを呼び出す処理が実行される(40
5)。
【0048】図9は図8のステップ402におけるサブ
ルーチン実行方法選択処理の処理手順を示したフローチ
ャートである。ここでは、ソフトウエアキャッシュの状
態と、実行しようとしているサブルーチンの実行頻度と
からハードウエアトランスレータで実行するか、ソフト
ウエアトランスレータで実行するかを切り替えている。
すなわち、実行しようとしているサブルーチンが呼び出
された回数があらかじめ設定された一定の回数を超えて
いる場合にはソフトウエアトランスレータで実行し、そ
うでない場合にはハードウエアトランスレータで実行す
る。この実施の形態では、この回数は、変換後のネイテ
ィブコードを格納しているソフトウエアキャッシュに空
きがある場合(この場合を「N」とする。)とない場合
(この場合を「M」とする。)とで分けている。
【0049】図9を参照して、このルーチンの最初では
ソフトウェアキャッシュに空きがあるか否かを判定する
(417)。空きがある場合には制御はステップ418
に進み、空きがない場合には制御はステップ420に進
む。
【0050】ステップ418では、呼び出そうとしてい
るルーチンの呼出し回数が前述したNより大きいか否か
を判定する。大きい場合には制御はステップ422に、
それ以外の場合には制御はステップ419に進む。
【0051】ステップ419では、ハードウェアトラン
スレータを使用することとし、図示しない、分岐制御の
ためのフラグをセットして処理を終了する。
【0052】ソフトウェアキャッシュに空きがない場合
には、ステップ420で呼び出そうとしているサブルー
チンの呼出し回数が前述したMより大きいか否かについ
て判定する。呼出し回数がMより大きい場合には制御は
ステップ422に、それ以外の場合には制御はステップ
419に、それぞれ進む。
【0053】ソフトウェアキャッシュに空きがあり、か
つサブルーチンの呼出し回数がNより大きい場合、およ
びソフトウェアキャッシュに空きがなく、かつサブルー
チンの呼出し回数がMより大きい場合には、ステップ4
22において、ソフトウェアキャッシュ中のネイティブ
コードのサブルーチンの一部を解放して、ソフトウェア
キャッシュ中に空き領域を作成することを試みる。
【0054】続くステップ423で、ステップ422の
処理の結果空き領域が作成されたか否かについての判定
を行なう。空き領域が作成された場合にはソフトウェア
トランスレータを使用することが決定され(421)、
作成できなかった場合にはソフトウェアインタープリタ
を使用することが決定される(424)。いずれの場合
にも、処理の分岐のためのフラグに適切な値が設定され
て処理を終了する。
【0055】図10は多機能命令デコーダ105の処理
を示したフローチャートである。図5および図10を参
照して、アドレスバス107B上に出力されたプログラ
ムカウンタのアドレス範囲があらかじめ設定された非ネ
イティブコードの格納された空間内であるかどうかを比
較回路122により判定し(432)、そうであればプ
ログラムカウンタの指すアドレスから読み出したコード
を非ネイティブコードとしてハードウェアトランスレー
タ120によりネイティブコードに変換する処理を行な
う(434)。結果のネイティブコードを演算部106
に渡す(435)。図5の例では、データバス107A
上のコードをハードウェアトランスレータ120により
ネイティブコードに変換し、その結果をマルチプレクサ
121で選択して演算部106に与える。
【0056】ステップ432において、プログラムカウ
ンタのアドレス範囲が非ネイティブコードの格納された
空間内でないと判定された場合には、プログラムカウン
タから読出されたコードはネイティブコードであるか
ら、そのまま演算部106に渡す(433)。図5の例
では、マルチプレクサ121により、ハードウェアトラ
ンスレータ120の出力ではなくデータバス107B上
のコードを選択して演算部106に渡す。
【0057】図10のステップ434における非ネイテ
ィブコードのネイティブコードへの変換処理の概略は以
下のとおりである。すなわち、通常の非ネイティブコー
ドの場合には、一つの非ネイティブコードに対して、1
または複数の、順次に実行されるネイティブコードを予
め対応付けておく。さらに非ネイティブコードのオペラ
ンドと、ネイティブコード内のオペランドとの対応関係
を予め定めておく。この際、非ネイティブコードがJa
vaのような仮想マシンである場合、スタックをメモリ
のスタック領域またはレジスタに割当てるようにする。
そして、非ネイティブコードの1命令を実行することに
相当する処理を行なうためのネイティブコードの数に応
じて、プログラムカウンタの値を適切な数だけ加算す
る。これが変換処理の基本である。
【0058】図11と図12とには、例外として、複雑
な処理を要する(すなわち変換後のネイティブコードの
サイズが大きくなる)非ネイティブコードに対する変換
処理と、メソッド呼び出しを行う非ネイティブコードin
vokestaticに対する変換処理とを示している。invokest
aticなど、非ネイティブコード(Javaバイトコー
ド)については図64を参照。
【0059】複雑な非ネイティブコード(faddなど)の
場合には、図11に示すような処理で変換が行われる。
すなわち、変換しようとする非ネイティブコードの処理
を実行するためのソフトウエアルーチン(あらかじめR
OM103内に格納してある。)を呼び出すようなネイ
ティブコードを生成する(436)。invokestaticに対
しても図12に示されるように同様にその処理ルーチン
を呼び出すが、ここで、この処理ルーチンはさらに図8
で示された非ネイティブコードのメソッド呼出し実行処
理を行うようになっている。したがって、一旦図12の
処理が実行されると、その中で図8の処理が繰り返し実
行されることで非ネイティブコードのプログラムが実行
されていくことになる。このように非ネイティブコード
の別のメソッドをコールする命令が一つのメソッドに存
在する場合も含め、本実施の形態では、メソッドが呼び
出される毎に図8に示す処理ルーチンが実行され、特
に、ハードウェアトランスレータ、ソフトウェアトラン
スレータおよびソフトウェアインタープリタの選択が行
なわれる。
【0060】なお、ソフトウエアトランスレータを使用
する場合も同様に、メソッド呼出しを行うJavaバイ
トコードに対応して変換後に生成されるネイティブコー
ドは、図8で示された非ネイティブコードのメソッド呼
出し実行処理を行うようになっている。図8が繰り返し
実行されることで非ネイティブコードのプログラムが実
行されていくことになる。
【0061】ソフトウエアインタープリタを使用する場
合も同様に、メソッド呼び出しを行うJavaバイトコ
ードに対応して、図8に示された非ネイティブコードの
メソッド呼出し実行処理を行い、図8の処理が繰り返し
実行されることで非ネイティブコードのプログラムが実
行されていくことになる。
【0062】なお、図8で示される非ネイティブコード
のメソッド呼出し実行処理を行うルーチンは予めROM
103に格納されている。
【0063】図13は図7のステップ301における実
行前処理の手順を示したフローチャートである。実行準
備処理の内容は、プログラムが使用するスタック領域の
RAM102への割当て(501)と、スタックポイン
タをレジスタに設定する処理(502)とである。スタ
ック領域の最終アドレスに4を加えた値をプロセッサ1
0における演算部106のSPレジスタに設定する。
【0064】図14はJavaバイトコードのメソッド
をネイティブコードのサブルーチンに変換する処理(図
8のステップ404)の手順を示したフローチャートで
ある。図14を参照して、まず変換開始処理を行い(6
01)、レジスタ割り当てを行い(602)、メソッド
変換処理を行う(603)。これら各処理について図1
5〜図20を参照して以下に述べる。
【0065】図15は変換開始処理601の手順を示し
たフローチャートである。図15を参照して、ステップ
701で、変換対象のJavaバイトコードの先頭アド
レス、すなわちメソッドの実行開始アドレスを変数jpcs
tartに代入し、最終アドレス+1を変数jpcendに代入す
る。
【0066】続いて、ローカル変数とスタックオペラン
ドとをメモリに割当てる(702)。集合REGに、割
当て可能なレジスタの番号を代入する(703)。スタ
ック深さリストを空にする(704)。繰返し制御変数
i(i=0〜nStack−1)に対して変数RSiを
0にする(705)。同様に繰返し制御変数j(j=0
〜nLocal−1)に対して変数RLjを0にする
(706)。ただしここでnStackはスタックオペ
ランドの数であり、nLocalはローカル変数の数で
ある。
【0067】図16は図14に示すレジスタ割当て処理
602の手順を示したフローチャートである。図16に
示す処理では、アドレスjpcをjpcstartからjpcendまで
変化させて、メソッド中のJavaバイトコードについ
て順にステップ804〜812を繰り返し処理する。
【0068】まずステップ801で、スタック深さの登
録リストを空にする。jpc=jpcstartの時点、すなわちメ
ソッド実行開始時点でのスタック深さは0であるので、
ステップ802ではJavaバイトコードのアドレスjp
cstartとそのアドレスでのスタック深さとを互いに対応
付けて[0,0]のような形でスタック深さリスト(図示
せず)に登録している。この処理の内容は後述する。ス
テップ803でjpcをjpcstartの値に初期化する。
【0069】ステップ804からステップ813までが
アドレスjpcをjpcstartからjpcendまで変化させて行な
う繰り返し処理である。
【0070】ステップ804〜806ではjpc実行時の
スタックの深さjs(アドレスjpcのJavaバイトコー
ドが実行終了した時点でのスタックポインタが示すスタ
ックの位置)を求めている。ステップ804で、アドレ
スjpcに対応付けて登録されたスタック深さがあるか否
かを判定する。なければ、ステップ805でjsにjsnext
を代入してステップ807に進む。あれば、ステップ8
06でjpcに対応付けて登録されているスタック深さをj
sに代入し、ステップ807に進む。
【0071】ステップ807で次のアドレスjpcnextを
求める。具体的には、ステップ807でアドレスjpcに
あるJavaバイトコードをjinstに代入し、jinstのコ
ードサイズを変数jinstsizeに代入し、jpc+jinstsizeを
jpcnextに代入する。ステップ807で求められるjinst
がjpcにおけるJavaバイトコード、jinstsizeがその
Javaバイトコードのサイズ(バイト単位)である。
【0072】jpcでのスタック深さがjpcであるとき、ji
nst実行後のスタック深さは 「js − jinstがスタックからポップするオペランド
数」+「jinstがスタックにプッシュするオペランド
数」 として求められる。そこで、ステップ808ではjinst
がスタックからポップするオペランド数を変数consume
に、jinstがスタックにプッシュするオペランド数を変
数produceに、それぞれ代入する。続いてステップ80
9で、js-consume+produceを変数jsnextに代入する。
【0073】ステップ810ではこのようにして求めた
jsnextをjinstの次に実行する可能性のあるアドレス
(次のJavaバイトコードのアドレスと、分岐先のア
ドレス)に対応して、スタック深さとして記録させてお
く。ステップ811ではjinstが参照するオペランドの
参照カウントを記録している。ステップ812でjpcを
求めた次のアドレスに更新する。さらにステップ813
でjpc<jpcendか否かを判定し、jpcがjpcendになるまで
ステップ804からステップ812までの処理をループ
させている。
【0074】ステップ811で求められた参照カウント
情報を元にステップ814でレジスタ割り当てを行って
いる。
【0075】図17は、図16のステップ802、81
0における、アドレスとスタック深さの登録処理の手順
を示したフローチャートである。最初に、登録しようと
しているアドレスを変数jpcrecordに代入し、登録しよ
うとしているスタック深さを変数jsrecordに代入する。
続いてアドレスjpcrecordに対応したスタック深さが既
に登録されているかどうかをチェックし(902)、さ
れていないならアドレスjpcrecordとスタック深さjsrec
ordとの対応を登録する(905)。登録済みなら登録
済みの値と今登録しようとしている値jsrecordとを比較
する(903)。両者が一致するなら処理を終了する。
両者が一致しなければ、実行する経路によってスタック
深さが異なるということであるが、このようなケースで
はスタックオペランドをレジスタに対応付けて割当てる
ことはできない(904)。したがってこの場合には図
示しない、対応付け不可のフラグを設定しておく。
【0076】図18は図16のステップ811における
オペランド参照カウントの記録処理の手順を示したフロ
ーチャートである。最初に変数jsminにjs - consumeの
値を代入する(1001)。ポップするスタックオペラ
ンドについて参照カウントRSiを+1し(1002)、プ
ッシュするスタックオペランドについて参照カウントRS
iを+1している(1003)。また、ローカル変数を参
照するか否かを判定し(1004)、参照するならば
(1004の判定結果が「YES」)、そのローカル変
数の参照カウントRLiを+1する(1005)。
【0077】図19は図16のステップ814における
レジスタ割当ての決定処理の手順を示したフローチャー
トである。最初に、図17のステップ904でスタック
オペランドのレジスタ割当てができないメソッドと判定
されたか否かをフラグを参照することにより判定する
(1101)。割当てが可能なメソッドであれば、参照
カウントRSiとRLiをソートして(1104)、大きい順
にレジスタを割当てる(1005)。スタックオペラン
ドをレジスタに対応付けて割当てることができないメソ
ッドであることが判明している場合には(1101の判
定結果が「YES」)、ローカル変数についてのみ同様
にしてレジスタに割当てる(1102、1103)。
【0078】図20は図14のステップ603における
メソッド変換処理の手順を示したフローチャートであ
る。まずメソッドのエントリにおいてネイティブコード
を生成する。これに付いては後述する図37の(1)に
示している(1201)。次に変数jpcの初期化処理と
してjpcstartの値を代入する(1202)。
【0079】以下、メソッド中のJavaバイトコード
について順にステップ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より小さ
ければ処理を終了する。
【0080】ステップ1207ではJavaバイトコー
ドの種類に応じて図21〜図28のようなネイティブコ
ードが生成される。これら図および以下の全図におい
て、「TX」はX番地のJavaバイトコードに対して生
成されたネイティブコードのアドレスを指す。各Jav
aバイトコードが対象とするオペランドがレジスタに割
当てられているかメモリに割当てられているかに応じて
生成するバイトコードを変化させている。
【0081】なお、図27における「エピローグのコー
ド」については、以降の実際の変換例の説明において詳
細が示される。図28における引数をプッシュするコー
ドについても、以降の実際の変換例の説明において詳細
が示される。図28において、methodIdは、呼び出そう
とするメソッドを表す文字列が格納されている領域のア
ドレスである。callJavaMethodは、レジスタR0が指す
領域に格納された文字列で指定されるメソッドを呼び出
すための処理を図8の手順に従って行うようなルーチン
である。
【0082】図29はネイティブコードのサブルーチン
におけるM32Rのレジスタの使用方法を示したもので
ある。本実施の形態ではサブルーチンの引数はスタック
に格納して渡すようにしているが、一部の引数をたとえ
ばr0-r3レジスタに格納して渡すようにすることも可
能である。
【0083】図30〜図33はネイティブコードのサブ
ルーチンにおけるスタックの使用方法を示したものであ
る。図30はサブルーチンが呼び出された時点でのスタ
ックの状態である。引数がスタック上に格納されてい
る。図31は、サブルーチンの最初のエントリコードを
実行した後の状態である。図30の状態から、さらに、
ローカル変数用の領域とスタックオペランド用の領域が
確保され、サブルーチン実行前後で保存しなければなら
ないレジスタ(r8-r14)の値がプッシュされる。図
中、nStackはスタックオペランドの数、nLocalはローカ
ル変数の数、nArgは引数の数である。なお、nLocalには
引数の数も含まれている。これらを図6の例に当てはめ
るとnStack=6、nLocal=3、nArg=2であり、スタック
使用状況は図32、図33のようになる。
【0084】以下、図6で示したJavaバイトコード
のメソッドを図14の処理手順に従ってネイティブコー
ドのサブルーチンに変換する処理について説明する。
【0085】ステップ601の実行後、すべてのオペラ
ンドは図33で示すメモリ領域に割当てられる。この割
当ての状態を図34に示す。たとえばローカル変数[0]
(第1引数)は、スタックポインタからのオフセットが
60バイトにある4バイトのメモリ領域に割当てられて
いる。
【0086】次にステップ602では、図16で示す処
理が実行される。図35および図36はこの処理を実行
中の様子を示したものである。
【0087】ステップ801の開始直前にはオペランド
の参照カウントRS0〜RS5、RL0〜RL2はすべ
て0に設定されている。(RS0〜RS5はスタックオ
ペランド[0]〜[5]の参照カウントであり、RL0〜R
L2はローカル変数[0]〜[2]の参照カウントであ
る。)ステップ801、802により、[アドレス0、
スタック深さ0]がスタック深さリストに登録される。
(スタック深さリストは図示していないが、たとえば登
録された順番をインデックスとしアドレス値とする配列
と、登録された順番をインデックスとしスタック深さを
値とするような配列とで容易に実現することができ
る。)次にステップ803により、jpc=0、jsnext=0
に設定される。以上が状態(1)に示した段階である。
【0088】状態(2)は、その後ステップ804〜8
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になる。
【0089】同様に、その後ステップ804〜813を
実行して再び813のyesの側に達する処理を繰り返す
ことで、状態(3)(4)...のように進行していく。
【0090】状態(8)では、ifge 21命令が次に実
行する可能性のあるのは、次のアドレス(jpcnext)で
ある9番地か、分岐先のアドレスである21番地のいず
れかであるため、[アドレス9,スタック深さ1]と[アド
レス21、スタック深さ1]のふたつがスタック深さリ
ストに登録されている。
【0091】状態(18)では、goto 28命令が次に
実行する可能性のあるのは、分岐先のアドレスである2
8番地であるため、[アドレス28,スタック深さ2]が
登録されている。
【0092】状態(23)では、invokestatic命令が次
に実行する可能性のあるのは、次のアドレスである28
番地であるため、[アドレス28,スタック深さ2]を登
録しようとするが、アドレス28に対するスタック深さ
は状態(18)において既に登録済みであるため、登録
済みのスタック深さと登録しようとするスタック深さと
の一致比較が行われる(ステップ902)。この場合は
一致するため、ステップ904はスキップされてアドレ
スとスタック深さの登録処理は終了する。
【0093】状態(25)では、ireturn命令が次に実
行する可能性のあるアドレスは実行時にだけ決定しこの
時点では不明であるため、スタック深さリストには何も
登録されない。
【0094】以上のようにして、最後の状態(25)の
RS0〜RS5、RL0〜RL2で示されるようなオペ
ランドの参照カウントカウントが求められる。また、状
態(1)〜(25)の「登録される命令アドレスとスタ
ック深さ」欄で示されるようなスタック深さがスタック
深さリストに登録されることになる。
【0095】ステップ814では、図19に示される処
理が行われる。ステップ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
が、それぞれ割当てられる。
【0096】以上でステップ602を終了し、次にステ
ップ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)」の意味である。
【0097】まず、ステップ1201では、状態(1)
で示すようなネイティブコードが生成される。このネイ
ティブコードの内容は、これを実行することによって、
図32から図33へスタックレイアウトを変更するため
のコードと、ローカル変数のうち、引数であってレジス
タに割当てられているもの(この例ではL<0>)について
メモリからレジスタに値を読み込んでおくためのコード
である。なお、nLocal、nStack、nArgについては、図3
0〜図33で使用したのと同じ意味である。
【0098】ステップ1202においてjpc=0となる。
ステップ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)で示す
ネイティブコードが生成されるまでの処理である。
【0099】以下同様にして、図37〜図38の(3)
〜(25)で示すネイティブコードが生成される。ここ
で、(25)のireturn命令に対して生成されるエピロ
ーグのネイティブコードは、スタックレイアウトを図3
3から図32へ戻すような処理を行っている。
【0100】以上のように、本発明の第1の実施の形態
による非ネイティブコードのプログラム実行方式によれ
ば、ローカル変数とオペランドスタックとがレジスタに
割当てられた結果、従来これらがメモリに割当てられて
いた場合に比べて、変換後のネイティブコード数が減少
するととともに、メモリアクセス頻度も減少し、その結
果実行速度も向上する。
【0101】第2の実施の形態 本発明の第2の実施の形態におけるデータ処理装置の構
成は多くの部分が第1の実施の形態と共通である。
【0102】まず図1〜図18までは第1および第2の
実施の形態は同じであるが、図16のステップ814に
おけるレジスタ決定処理は、この第2の実施の形態の装
置では、図19ではなく、図39のフローチャートで示
す手順に従って行われる。
【0103】スタックオペランドに対してはNS個のレ
ジスタを割当てる。今の例では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)。
【0104】また図20に示す処理の流れ自体は第1の
実施の形態の場合と同じであるが、ステップ1207に
おけるjinstのJavaバイトコードに対するネイティ
ブコードの生成処理は、図21〜図28ではなく、jins
tの種類に応じて図40〜図42のフローチャートで示
す手順に従って行われる。
【0105】またM32Rレジスタの使用方法は図29
ではなく図43で示すようになる。図40は図20のス
テップ1207において分岐しないJavaバイトコー
ドに対して行われるネイティブコード生成処理である。
ステップ2801では、使用されるスタックオペランド
を求めており、[low]〜[high-1]が使用されることにな
る。ステップ2802ではこれらのオペランドのうちS<
js>〜S<high-1>について、割当てられたレジスタをこ
れらオペランド用にリザーブする処理を行う。レジスタ
に保持されているのはオペランド[b]〜[js-1]であるの
で、これ以外のレジスタを使用する場合、[b-1]以下の
オペランドに付いてはメモリからレジスタにロードする
処理(2803、2804)を、[js]以上のオペランド
に付いてはレジスタをリザーブする処理(2802)を
行っている。
【0106】ステップ2805では第1の実施の形態の
図21〜図28(スタックオペランドがレジスタの場
合)で示したネイティブコードが生成される。ステップ
2806、2807、2809の処理は、実行経路の合
流地点(すなわち分岐先となるラベルのあるアドレス)
において、スタックオペランドのスタックトップ側のN
S(4)個のエントリに割当てられたレジスタに値が保
持されているようにするための処理である。スタックオ
ペランドに割当てられたレジスタには必ずしも値を保持
しているとは限らない(スタックトップ〜スタックオペ
ランド[b]がレジスタに保持されているが、bの値は合流
点に到達する実行経路ごとに異なる可能性がある)。し
たがってそのままでは、複数の経路の実行パスが合流す
る地点において、レジスタの状態が不明となりそれ以降
のネイティブコードの生成においてレジスタを利用する
ことができなくなってしまう。そこで、実行の合流地点
においては、必ずスタックオペランドのスタックトップ
側のNS個のスタックオペランドを割り当てられたレジ
スタに値を保持するようにしている。
【0107】図41は、図20のステップ1207にお
いて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を元に条件分岐する命令を生成す
る。
【0108】図42はステップ1207においてコード
gotoに対して行われるネイティブコード生成処理であ
る。コードgotoについては、図63の(18)を参照さ
れたい。まず合流用ネイティブコードを生成する(30
01、3002)。すなわち、この例では、分岐先のス
タック深さを表すjsをjsnextに代入し(3001)、S<
jsnext-1>から下のNS個のスタックオペランドをレジ
スタに保持するネイティブコードを生成する(300
2)。
【0109】次に分岐命令(この例では「bra TX」)
を生成する(3003)。次のアドレスにおいてはスタ
ックトップのNS個がレジスタに保持された状態を示す
ため、bを設定しなおす(3004、3005)。すな
わち、jpcnextに対応付けて登録されたスタック深さを
変数jsnextに代入する(3004)。次に、0とjsnext
-NSとのうち大きい方の値をbに代入する(300
5)。
【0110】図44は図40のステップ2802の処理
を示している。この処理ではS<p>〜S<q>レジスタのオー
バーフロー対処のためのネイティブコードを生成する。
そのため、i=p〜qについてステップ3102〜3105
を繰り返している。
【0111】最初に、繰返し制御変数iにpの値を代入
する(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に進む。
【0112】i−NSがレジスタに保持されていたら、
メモリに保存するために「st S<i-NS>, @SAVE<i-NS>」
というネイティブコードを生成する(3104)。次に
i−NSがもうレジスタに保持されていないことを示す
ため、bをi−NS+1に変更する(3105)。
【0113】図45は図40に示すステップ2804の
処理を示している。i=bottom〜topについて3204を
繰り返す。ステップ3201、3203、3205の処
理がその繰返し制御のための処理である。
【0114】すなわち、bottomがtop以下か否かを判定
し、以下であればステップ3202に進み、bottomがto
pより大きければ処理を終了する。
【0115】ステップ3202で、iにbottomの値を代
入する。ステップ3203では、iがtop以下か否かを
判定する。iがtop以下であれば制御はステップ3204
に進む。それ以外の場合にはステップ3206でbottom
までレジスタに保持されていることを示すため、bにbo
ttomの値を代入して処理を終了する。
【0116】ステップ3204では、S<i>を復帰するた
めに「ld S<i>, @SAVE<i>」というネイティブコードを
生成する。ステップ3205でiに1を加算して、制御
をステップ3203に戻す。以上の処理により、S<bott
om>〜S<top>レジスタのアンダフロー対処のためのネイ
ティブコードが生成された。
【0117】以下、図6で示したJavaバイトコード
のメソッドを、第2の実施の形態における図14の処理
手順に従ってネイティブコードのサブルーチンに変換す
る例について説明する。
【0118】レジスタ決定処理814までは第1の実施
の形態と同様に進行する。すなわち、ステップ601の
実行後、すべてのオペランドは図46の変換開始処理直
後の欄で示すようにメモリに割当てられる。これは第1
の実施の形態の図34と同様である。また、ステップ6
02では、第1の実施の形態と同様に、図16で示した
処理に従って図35で示すように処理が進行し、最後の
状態(25)のRS0〜RS5、RL0〜RL2で示さ
れるようなオペランドの参照カウントカウントが求めら
れ、状態(1)〜(25)の「登録される命令アドレス
とスタック深さ」欄で示されるようなスタック深さが登
録されることになる。
【0119】ステップ814において、図39に示され
る処理が行われる。ステップ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に示すようなレジスタ割当
て結果となる。
【0120】以上でステップ602を終了し、次にステ
ップ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)の意味で
ある。
【0121】まず、ステップ1201では、状態(1)
で示すようなネイティブコードが生成される。このコー
ドの内容は、これを実行することによって、図32から
図33へスタックレイアウトを変更するためのコード
と、ローカル変数のうち、引数であってレジスタに割当
てられているもの(この例ではL<0>とL<2>)についてメ
モリからレジスタに値を読み込んでおくためのコードで
ある。
【0122】次にステップ1202においてjpc=0とな
る。ステップ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に示す処理が行われる。
【0123】図40のステップ2801で求められるlo
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)で示すネイティブコードが生成されるまでの処
理である。
【0124】以下同様にして、図47の(3)〜(7)
で示すネイティブコードが生成される。
【0125】図47の(8)の変換処理では、ステップ
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) で示すネイテ
ィブコードが生成されるまでの処理である。
【0126】図47の(9)〜(11)に関しては
(2)と同様の処理により、図47に示すネイティブコ
ードが生成される。
【0127】図47の(12)の変換処理では、ステッ
プ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の処理は終
了する。
【0128】図40に戻り、ステップ2803からはNo
の側に進む。ステップ2805の処理は、第1の実施の
形態と同様の処理であるが、今の場合はJavaバイト
コードがiconst_3であるので、図21に示したネイテ
ィブコードが生成される。ここではスタック深さjs=4
におけるオペランドはS<4>であるが、オペランドS<4>は
レジスタR8に割当てられているので、図21のオペラ
ンド割当てがレジスタの場合のネイティブコード、すな
わち「ldi S<3>, #3」というネイティブコードが生成さ
れる。以上が図47の(12)で示すネイティブコード
が生成される処理である。
【0129】図47の(13)の変換処理においては、
(12)と同様にして図で示されるネイティブコードが
生成される。ここではステップ3106においてbは2
に更新される。
【0130】図47の(14)〜(16)では、(2)
と同様にして図で示されるネイティブコードが生成され
る。
【0131】図47の(17)の変換処理においては、
ステップ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)を表している。
【0132】さらにステップ3205、3203(No)
と処理は進み、ステップ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)で示す
ネイティブコードが生成される処理である。
【0133】図47の(18)の変換処理において、ス
テップ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>」と
いうネイティブコードが生成される。
【0134】さらに制御はステップ3205、3203
(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)で示すネイティブコードが生成される処理であ
る。
【0135】以下同様にして、図47および図48に示
すネイティブコードが生成される。以上のように、本発
明の第2の実施の形態による非ネイティブコードのプロ
グラム実行方式によれば、ローカル変数とオペランドス
タックとがレジスタに割当てられた結果、従来これらが
メモリに割当てられていた場合に比べて、変換後のネイ
ティブコード数が減少するととともに、メモリアクセス
頻度も減少し、その結果実行速度も向上することにな
る。
【0136】第3の実施の形態 本発明の第3の実施の形態に係るデータ処理装置の構成
は多くの部分が第2の実施の形態の装置と共通である。
【0137】まず図1〜図18と図39とは、第3の実
施の形態の装置で行なわれる処理は第2の実施の形態の
装置で行なわれる処理と同じである。
【0138】M32Rレジスタの使用方法は図43と同
じである。また図20の処理の流れ自体は同じである
が、ステップ1207におけるjinstのJavaバイト
コードに対するネイティブコードの生成処理は、図40
〜図42に示されるものではなく、対象とするJava
バイトコードの種類ごとに図50〜図62のフローチャ
ートに示す手順で行われる。
【0139】図50は、スタックへのデータ転送だけを
行うようなJavaバイトコードに対する処理である。
具体的な例ではiconst_<n>とiload_<n>が相当する。
この場合は、転送を行うネイティブコードを生成する代
わりに、ステップ3601において転送元の場所(ある
いは、転送元が即値の場合にはその即値)をP<i>に記録
しておくだけである。ここで、P<i> (i=0〜nStack-
1)は、即値か転送元の場所かを記録できるようなデー
タ構造である。P<i>は表1のいずれかの値をとる。以下
の説明や図中では、P<i>の値とその意味とはそれぞれ下
に示すような関係であるものとする。
【0140】
【表1】
【0141】ステップ3602は、実行の合流地点(す
なわち分岐先となるラベルのあるアドレス)において、
スタックオペランドのスタックトップ側のNS(4)個
のエントリに割当てられたレジスタに値が保持されてい
るようにするための処理である。スタックオペランドに
割当てられたレジスタには必ずしも値を保持していると
は限らない。したがってそのままでは、複数の経路の実
行パスが合流する地点において、レジスタの状態が不明
となりそれ以降のネイティブコードの生成においてレジ
スタを利用することができなくなってしまう。そこで、
実行の合流地点においては、必ずスタックオペランドの
スタックトップ側のNS個のスタックオペランドを割り
当てられたレジスタに値を保持するようにしている。そ
のためのネイティブコードは、次のような場合に挿入さ
れることになる。
【0142】実行が次のアドレスに継続するようなJa
vaバイトコードがラベルの直前にある場合(すなわち
次のアドレスにラベルがある場合)、そのJavaバイ
トコードに対するネイティブコードの直後(ラベルの
前)に挿入される(ステップ3602、3702、38
06、4003による)。このネイティブコードの挿入
処理は図56に示してある。
【0143】分岐を行なうようなJavaバイトコード
において、分岐するネイティブコードを生成する直前に
挿入される(ステップ4101〜4102、4203〜
4205、4208〜4210、4215〜4217に
よる)。
【0144】このネイティブコードの挿入処理は図51
および図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)。
【0145】S<k>レジスタをリザーブするためのネイテ
ィブコード生成処理(ステップ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)。
【0146】図53はスタックオペランド[k]からスタ
ックボトム側の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)。
【0147】図54はiaddに対するネイティブコードの
生成処理である。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と同
じ)である。
【0148】図56はjpcnextでの合流のためのネイテ
ィブコード挿入処理である。jpcnextにラベルがある場
合、すなわちプログラム実行経路がjpcnextにおいて合
流する場合にステップ4302〜4304の処理を行な
う。
【0149】ステップ4302ではjpcnextにおけるス
タック深さの登録値を求めてjpcnextの値とする。ステ
ップ4303では[0]〜[jsnext-1]のスタックオペラン
ドを有効化するためのネイティブコードの生成処理を行
なう(この処理は図51の通りである)。ステップ43
04ではS<jsnext-1>から下NS個のスタックオペラン
ドをレジスタに保持するためのネイティブコードの生成
処理を行なう。このステップの処理は図53の通りであ
る。
【0150】isub、imul、idivについてもiaddの時の加
算がそれぞれ減算、乗算、除算になる以外はiaddと同様
である。
【0151】図57はinvokestatic<int (int,int)>に
対するネイティブコードの生成処理である。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の通りである。
【0152】図58はireturnに対するネイティブコー
ドの生成処理である。まずP<js-1>に記録された転送元
のデータをr0レジスタに転送するネイティブコードを
生成する(3901)。このとき生成するネイティブコ
ードは、P<js-1>の値に応じて変化するが、ここでは図
示していない。引き続き生成するネイティブコード39
02は、第1の実施の形態と同様である。最後に次のア
ドレス以降のネイティブコードの生成に備えてP<i>を設
定している(3903、3904)。
【0153】図59はistore_<n>に対するネイティブ
コードの生成処理である。istore_<n>はローカル変数
[n]に書き込みを行なうが、ローカル変数への書き込み
を行なう前には、このローカル変数を転送元とするよう
なオペランドスタックへのデータ転送がペンディングに
なっている場合には、それらのデータ転送を実施してお
く必要がある。そこでそのためのネイティブコードの生
成をまず行なう(4001)。次にP<js-1>に記録され
た転送元のデータをローカル変数[n]に転送するネイテ
ィブコードを生成する。このとき生成するネイティブコ
ードはP<js-1>の値とL<n>がメモリかレジスタかによっ
て変化するが、ここでは図示していない。ステップ40
03以降の処理は図56の通りである。
【0154】ステップ4001における処理は図60に
示してある。ステップ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)。
【0155】図61はgotoに対するネイティブコードの
生成処理である。分岐のネイティブコード(bra)を生
成する(4103)が、その前に、スタックオペランド
[js-1]からスタックトップ側のNS個のエントリに割当
てられたレジスタに値を保持するためのネイティブコー
ドを生成する(4101,4102)。これらの処理は
図53、図52の通りである。
【0156】図62はifgeに対するネイティブコードの
生成処理である。P<js-1>に記録された転送元のデータ
と0を比較するネイティブコードと、その転送元のデー
タ>=0であるなら分岐するような条件分岐のネイティブ
コードとを生成するが、その前にスタックトップのNS
個のエントリに割当てられたレジスタに値を保持するた
めのネイティブコードを生成する。なおここでのスタッ
クトップはifgeの実行後のスタックトップであるのでk=
js-2である(ステップ4203〜4205、4208
〜4210、4215〜4217)。
【0157】以下、図6で示したJavaバイトコード
のメソッドを図14の処理手順に従ってネイティブコー
ドのサブルーチンに変換する例について説明する。
【0158】ステップ602までは第2の実施の形態と
同様に行なわれる。すなわち、図46に示すようなレジ
スタ割当て結果となる。
【0159】ステップ603では図20に示す処理が行
なわれる。図63はこの処理を実行するにつれて生成さ
れるネイティブコードを示したものである。
【0160】まず、ステップ1201では、図63の状
態(1)で示すようなネイティブコードが生成される。
これは、図32から図33へスタックレイアウトを変更
するためのネイティブコードと、ローカル変数のうち、
引数であってレジスタに割当てられているもの(この例
ではL<0>とL<2>)についてメモリからレジスタに値を読
み込んでおくためのネイティブコードである。
【0161】ステップ1202においてjpc=0となる。
ステップ1203において求められるアドレス0にある
Javaバイトコードjinstはiload_0である。ステッ
プ1204において求められるjinstsizeは1である。
ステップ1205において求められるjpcnextは1であ
る。図35の(1)に示すようにアドレス0に対応付け
てスタック深さ0が登録されているため、ステップ12
06において求められるjsは0となる。
【0162】ステップ1207では変換しようとするJ
avaバイトコードjinstに応じて図50〜図62に示
すような処理が行なわれる。今の例の場合は、jinstはi
load_0であるので、図50に示す処理が行なわれる。
ステップ4001においてP<0>にL<0>が記録される。ス
テップ3602からNoに進んで図50の処理は終了す
る。以上が図63の(2)の状態である。結局iload_
0に対するネイティブコードはこの(2)では生成され
ないことになる。
【0163】図63の(3)でも同様にP<1>にL<1>が記
録されるだけでネイティブコードは生成されない。
【0164】(4)ではステップ1207において図5
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の処理
を終了する。
【0165】図63の(5)の変換処理においては、ス
テップ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の処理を終了す
る。
【0166】図63の(6)に対する変換処理は(2)
の場合と同様であり、P<0>に即値1が記録され、ネイテ
ィブコードは生成されない。
【0167】(7)も同様にP<1>にL<0>が記録され、ネ
イティブコードは生成されない。(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
の処理は終了する。
【0168】図62のステップ4205では図53に示
す処理が行なわれる(k=0)が、この場合、SAVE<i>が記
録されているP<i>は存在しないので、ステップ4503
での判定結果が「NO」となり、ネイティブコードを生
成することなく図53の処理は終了する。ステップ42
06で「bra T21」というネイティブコードが生成され
る。
【0169】図63の(9)〜(13)は、それぞれ
(6)(2)(2)(6)(2)と同様に処理され、P<
1>〜P<5>にそれぞれ即値2、L<0>、L<1>、即値3、L<2>
が記録される。
【0170】図63の(14)ではステップ1207に
おいて図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の処理が終了する。
【0171】図54のステップ3702では図55に示
すネイティブコードが生成される。今の場合、スタック
深さjs=6におけるオペランドP<4>とP<5>はそれぞれ即
値3、L<2>(メモリ)であるので、ケース番号5のネイ
ティブコードが生成される。P<4>はS<4>に変更されて図
56の処理を終了し、図54の処理を終了する。
【0172】図63の(15)ではステップ1207に
おいて図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>に変更される。
【0173】ステップ3703では図56の処理が行な
われるが、ステップ4301の判定結果が「NO」とな
り処理を終了する。以上で図54の処理を終了する。
【0174】図63の(16)の変換処理では、ステッ
プ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の
処理を終了する。
【0175】図63の(17)の変換処理では、ステッ
プ1207において図54の処理が行なわれる(ただし
加算でなく乗算である)。ステップ3701では図52
に示す処理が行なわれる(k=js-2=1)が、ここではス
テップ4601での判定結果が「NO」となり、図52
の処理を終了する。
【0176】図54に戻り、ステップ3702では図5
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の処理を終了する。
【0177】図63の(18)の変換処理では、ステッ
プ1207において図61の処理が行なわれる。図61
のステップ4101では図51に示す処理が行なわれる
(k=js-1=1)が、今の場合、即値またはローカル変数
が記録されているP<i>は存在しないため、i=0、1の場
合ともにステップ4403(NO)、4407(NO)
と進行して図51の処理を終了する。
【0178】図61に戻り、ステップ4102では図5
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の処理を終了する。
【0179】図61に戻り、ステップ4103では「br
a T28」というネイティブコードが生成される。以上が
図63の(18)の状態である。
【0180】図61のステップ4104で求められるjs
nextは1であり、ステップ4105ではP<0>がS<0>にな
る。以上が図63の(18’)である。
【0181】図64の(19)の変換処理では(2)と
同様にしてP<1>にL<0>が記録され、ネイティブコードは
生成されない。
【0182】(20)では(6)と同様にしてP<2>に1
が記録され、ネイティブコードは生成されない。
【0183】(21)では(4)と同様にして図のネイ
ティブコードが生成される(ただし加算でなく減算とな
る)。この場合は図55のケース番号=25に相当す
る。P<1>がS<1>に変更される。
【0184】(22)では(2)と同様にしてP<2>にL<
2>が記録され、ネイティブコードは生成されない。
【0185】(23)ではステップ1207において図
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の処理が行なわれるが、ネイティブコー
ドは生成されない。
【0186】図64の(24)の変換処理では、(4)
と同様にして図のネイティブコードが生成される。この
場合は図55のケース番号14に相当する。P<0>がS<0>
に変更される。
【0187】(25)の変換処理では、ステップ120
7において図58の処理が行われる。P<0>はS<0>である
ので、ステップ3901で生成されるネイティブコード
はmvr0, S<0>となる。ステップ3902に進んで図64
の(25)のネイティブコードが生成される。
【0188】以上のようにこの第3の実施の形態のデー
タ処理装置によれば、データ転送だけを行なうJava
バイトコードについてはネイティブコードを生成せず、
転送先のオペランドに転送元を対応付けて記録してお
く。演算を行なうJavaバイトコードを変換する際
に、先に転送元が記録されているようなオペランドを使
用する際には記録しておいた転送元を使用して演算を行
うようなネイティブコードを生成する。そのため、変換
後のネイティブコード数が減少し、その結果実行速度も
向上することになる。
【0189】今回開示された実施の形態はすべての点で
例示であって制限的なものではないと考えられるべきで
ある。本発明の範囲は上記した説明ではなくて特許請求
の範囲によって示され、特許請求の範囲と均等の意味お
よび範囲内でのすべての変更が含まれることが意図され
る。
【0190】
【発明の効果】請求項1に記載の発明によれば、非ネイ
ティブコードを、比較的少ない容量の記憶手段を用い
て、高速に実行できる。
【0191】請求項2に記載の発明によれば、ハードウ
ェア量をより少なく、および/または全体の処理速度を
より高くすることができる。
【0192】請求項3に記載の発明によれば、ハードウ
ェア量をより少なく、および/または全体の処理速度を
より高くすることができる。
【0193】請求項4に記載の発明によれば、変換後の
プログラムの実行を高速化できる。請求項5に記載の発
明によれば、変換後のプログラムの実行を高速化でき
る。
【0194】請求項6に記載の発明にかかるデータ処理
装置は、請求項5に記載の発明の構成に加えて、コード
変換手段は、スタックへのデータの転送のみを行なう非
ネイティブコードを検出してその転送元と転送先とを対
応付けて記憶するための手段をさらに含み、生成するた
めの手段は、データの転送のみを行なう非ネイティブコ
ードの検出メモリオペランドのうちのスタックオペラン
ドのうち、スタックトップ側のスタックオペランドが、
プロセッサに備えられたレジスタに保持されるように、
データ処理装置に接続されるメモリと、プロセッサのレ
ジスタとの間で実行時にデータの保存と復帰とを行なう
ように、かつ、転送先をオペランドとして使用するコー
ドについては、転送先に代えて、記憶するための手段に
記憶された転送元をオペランドとするように、ネイティ
ブコードを生成するための手段を含む。
【0195】変換後のネイティブコードの数が、このよ
うな処理を行なわない場合と比較して減少する。実行す
べきコード数が減少するので、変換後のプログラムの実
行を高速化できる。
【図面の簡単な説明】
【図1】 第1〜第3の実施の形態におけるデータ処理
装置を示す図である。
【図2】 第1〜第3の実施の形態における演算部の命
令セットを示す図である。
【図3】 第1〜第3の実施の形態における演算部の命
令セットを示す図である。
【図4】 第1〜第3の実施の形態における演算部の命
令セットを示す図である。
【図5】 多機能命令デコーダ105のブロック図であ
る。
【図6】 第1〜第3の実施の形態の説明中、実行例で
使用する変換対象のJavaバイトコードで記述された
メソッドとJavaバイトコードの意味を示す図であ
る。
【図7】 第1〜第3の実施の形態における非ネイティ
ブコードのプログラム実行処理の手順を示すフローチャ
ートである。
【図8】 第1〜第3の実施の形態における非ネイティ
ブコードのサブルーチン呼出し処理の手順を示すフロー
チャートである。
【図9】 第1〜第3の実施の形態における実行方法選
択処理の手順を示すフローチャートである。
【図10】 第1〜第3の実施の形態における非ネイテ
ィブまたはネイティブコードの実行処理の手順を示すフ
ローチャートである。
【図11】 第1〜第3の実施の形態における複雑な処
理を要する非ネイティブコードをネイティブコードに変
換する処理の手順を示すフローチャートである。
【図12】 第1〜第3の実施の形態におけるinvokest
aticをネイティブコードに変換する処理の手順を示すフ
ローチャートである。
【図13】 第1〜第3の実施の形態における実行前準
備処理の手順を示すフローチャートである。
【図14】 第1〜第3の実施の形態における非ネイテ
ィブコードのサブルーチンをネイティブコードのサブル
ーチンに変換する処理の手順を示すフローチャートであ
る。
【図15】 第1〜第3の実施の形態における変換開始
処理の手順を示すフローチャートである。
【図16】 第1〜第3の実施の形態におけるレジスタ
割当て処理の手順を示すフローチャートである。
【図17】 第1〜第3の実施の形態におけるアドレス
とスタック深さの登録処理の手順を示すフローチャート
である。
【図18】 第1〜第3の実施の形態におけるjinstの
オペランド参照のカウント処理の手順を示すフローチャ
ートである。
【図19】 第1の実施の形態におけるレジスタ割当て
の決定処理の手順を示すフローチャートである。
【図20】 第1〜第3の実施の形態におけるメソッド
コード変換処理の手順を示すフローチャートである。
【図21】 第1の実施の形態、3におけるiconst_<n
>に対して生成されるネイティブコードを示す図であ
る。
【図22】 第1の実施の形態、3におけるiload_<n>
に対して生成されるネイティブコードを示す図である。
【図23】第1の実施の形態、3におけるistore_<n>
に対して生成されるネイティブコードを示す図である。
【図24】 第1の実施の形態、3におけるiaddに対し
て生成されるネイティブコードを示す図である。
【図25】 第1の実施の形態におけるifgeに対して生
成されるネイティブコードを示す図である。
【図26】 第1の実施の形態におけるgotoに対して生
成されるネイティブコードを示す図である。
【図27】 第1の実施の形態におけるireturnに対し
て生成されるネイティブコードを示す図である。
【図28】 第1の実施の形態におけるinvokestaticに
対して生成されるネイティブコードを示す図である。
【図29】 第1の実施の形態におけるM32Rのレジ
スタ使用方法を示す図である。
【図30】 第1〜第3の実施の形態におけるスタック
使用方法を示す図である。
【図31】 第1〜第3の実施の形態におけるスタック
使用方法を示す図である。
【図32】 第1〜第3の実施の形態におけるスタック
使用方法を示す図である。
【図33】 第1〜第3の実施の形態におけるスタック
使用方法を示す図である。
【図34】 第1の実施の形態におけるオペランドへの
レジスタ割当ての状態を示す図である。
【図35】 第1の実施の形態におけるレジスタ割当て
処理の実行例を示す図である。
【図36】 第1の実施の形態におけるレジスタ割当て
処理の実行例を示す図である。
【図37】 第1の実施の形態におけるメソッドコード
変換処理の実行例を示す図である。
【図38】 第1の実施の形態におけるメソッドコード
変換処理の実行例を示す図である。
【図39】 第2の実施の形態におけるレジスタ割当て
の決定処理の手順を示すフローチャートである。
【図40】 第2の実施の形態における分岐しないJa
vaバイトコードに対するネイティブコードの生成処理
の手順を示すフローチャートである。
【図41】 第2の実施の形態におけるifgeに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図42】 第2の実施の形態におけるgotoに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図43】 第2の実施の形態におけるM32Rレジス
タの使用方法を示す図である。
【図44】 第2の実施の形態におけるS<p>〜S<q>レジ
スタのオーバーフロー対処のためのネイティブコードの
生成処理の手順を示すフローチャートである。
【図45】 第2の実施の形態におけるS<bottom>〜S<t
op>レジスタのアンダフロー対処のためのネイティブコ
ードの生成処理の手順を示すフローチャートである。
【図46】 第2の実施の形態におけるオペランドへの
レジスタ割当ての状態を示す図である。
【図47】 第2の実施の形態におけるメソッドコード
変換処理の実行例を示す図である。
【図48】 第2の実施の形態におけるメソッドコード
変換処理の実行例を示す図である。
【図49】 第2の実施の形態におけるS<jnext-1>か
ら下のNS個のスタックオペランドをレジスタに保持す
るためのネイティブコードの生成処理の手順を示すフロ
ーチャートである。
【図50】 第3の実施の形態におけるスタックへのデ
ータ転送だけを行なうJavaバイトコードに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図51】 第3の実施の形態におけるP<i>を有効化す
るためのネイティブコードの生成処理の手順を示すフロ
ーチャートである。
【図52】 第3の実施の形態におけるS<k>レジスタを
リザーブするためのネイティブコードの生成処理の手順
を示すフローチャートである。
【図53】 第3の実施の形態におけるS<k>から下のN
S個のスタックオペランドをレジスタに保持するための
ネイティブコードの生成処理の手順を示すフローチャー
トである。
【図54】 第3の実施の形態におけるiaddに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図55】 第3の実施の形態におけるiaddに対して生
成されるネイティブコードを示す図である。
【図56】 第3の実施の形態におけるjpcnextでの合
流のためのネイティブコード生成処理を示す図である。
【図57】 第3の実施の形態におけるinvokestaticに
対するネイティブコードの生成処理の手順を示すフロー
チャートである。
【図58】 第3の実施の形態におけるireturnに対す
るネイティブコードの生成処理の手順を示すフローチャ
ートである。
【図59】 第3の実施の形態におけるistore_<n>に
対するネイティブコードの生成処理の手順を示すフロー
チャートである。
【図60】 第3の実施の形態におけるL<n>のパージ処
理を示す図である。
【図61】 第3の実施の形態におけるgotoに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図62】 第3の実施の形態におけるifgeに対するネ
イティブコードの生成処理の手順を示すフローチャート
である。
【図63】 第3の実施の形態のデータ処理装置におけ
るメソッドコード変換処理の実行例を示す図である。
【図64】 第3の実施の形態のデータ処理装置におけ
るメソッドコード変換処理の実行例を示す図である。
【符号の説明】 101 プロセッサ、102 RAM、103 RO
M、105 多機能命令デコーダ、106 演算部、1
07 バス、107A データバス、107Bアドレス
バス、110 ネイティブコードのメソッド、111
メソッドが使用するデータ、120 ハードウェアトラ
ンスレータ、121 マルチプレクサ、122 比較回
路。
─────────────────────────────────────────────────────
【手続補正書】
【提出日】平成13年2月7日(2001.2.7)
【手続補正1】
【補正対象書類名】図面
【補正対象項目名】図6
【補正方法】変更
【補正内容】
【図6】
【手続補正2】
【補正対象書類名】図面
【補正対象項目名】図40
【補正方法】変更
【補正内容】
【図40】
【手続補正3】
【補正対象書類名】図面
【補正対象項目名】図41
【補正方法】変更
【補正内容】
【図41】
【手続補正4】
【補正対象書類名】図面
【補正対象項目名】図44
【補正方法】変更
【補正内容】
【図44】
【手続補正5】
【補正対象書類名】図面
【補正対象項目名】図53
【補正方法】変更
【補正内容】
【図53】
【手続補正6】
【補正対象書類名】図面
【補正対象項目名】図55
【補正方法】変更
【補正内容】
【図55】
【手続補正7】
【補正対象書類名】図面
【補正対象項目名】図56
【補正方法】変更
【補正内容】
【図56】
【手続補正8】
【補正対象書類名】図面
【補正対象項目名】図61
【補正方法】変更
【補正内容】
【図61】
【手続補正9】
【補正対象書類名】図面
【補正対象項目名】図62
【補正方法】変更
【補正内容】
【図62】
【手続補正10】
【補正対象書類名】図面
【補正対象項目名】図63
【補正方法】変更
【補正内容】
【図63】
【手続補正11】
【補正対象書類名】図面
【補正対象項目名】図64
【補正方法】変更
【補正内容】
【図64】

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】 所定の命令群をネイティブコードとする
    プロセッサ、 前記プロセッサに対する非ネイティブコードを前記プロ
    セッサの1または2以上のネイティブコードに変換する
    ハードウェアトランスレータ、 前記プロセッサ上で動作し、前記プロセッサに対する非
    ネイティブコードを前記プロセッサの1または2以上の
    ネイティブコードに変換するソフトウェアトランスレー
    タ、 前記ソフトウェアトランスレータの出力するネイティブ
    コードを記憶するための記憶手段、 前記プロセッサ上で動作し、前記プロセッサに対する非
    ネイティブコードを逐次解釈し、前記プロセッサのネイ
    ティブコードを用いて実行するソフトウェアインタープ
    リタ、および所定の基準にしたがって、前記ハードウェ
    アトランスレータによって出力されるネイティブコード
    の実行、前記ソフトウェアトランスレータによって出力
    されるネイティブコードの実行、ならびに前記ソフトウ
    ェアインタープリタの実行による非ネイティブコードの
    逐次解釈および実行のいずれかを選択して前記プロセッ
    サを動作させるための選択手段とを含む、データ処理装
    置。
  2. 【請求項2】 前記選択手段は、非ネイティブコードの
    種類または実行頻度、若しくは前記記憶手段の状態に依
    存して、前記ハードウェアトランスレータによって出力
    されるネイティブコードの実行、前記ソフトウェアトラ
    ンスレータによって出力されるネイティブコードの実
    行、ならびに前記ソフトウェアインタープリタの実行に
    よる非ネイティブコードの逐次解釈および実行のいずれ
    かを選択して前記プロセッサを動作させるための手段を
    含む、請求項1に記載のデータ処理装置。
  3. 【請求項3】 前記選択手段は、前記所定の基準にした
    がって、前記ネイティブコードによって構成されるメソ
    ッドが呼出されるごとに、前記ハードウェアトランスレ
    ータによって出力されるネイティブコードの実行、前記
    ソフトウェアトランスレータによって出力されるネイテ
    ィブコードの実行、ならびに前記ソフトウェアインター
    プリタの実行による非ネイティブコードの逐次解釈およ
    び実行のいずれかを選択して前記プロセッサを動作させ
    るための手段を含む、請求項1に記載のデータ処理装
    置。
  4. 【請求項4】 前記ソフトウェアトランスレータは、前
    記非ネイティブコードに含まれるメモリオペランドの少
    なくとも一部を、前記プロセッサに備えられたレジスタ
    に割り付けるように非ネイティブコードをネイティブコ
    ードに変換するためのコード変換手段を含む、請求項1
    に記載のデータ処理装置。
  5. 【請求項5】 前記非ネイティブコードは、所定のスタ
    ックマシンのネイティブコードであり、前記コード変換
    手段は、前記メモリオペランドのうちのスタックオペラ
    ンドのうち、スタックトップ側のスタックオペランド
    が、前記プロセッサに備えられたレジスタに保持される
    ように、前記データ処理装置に接続されるメモリと、前
    記プロセッサのレジスタとの間で実行時にデータの保存
    と復帰とを行なうようなネイティブコードを生成するた
    めの手段を含む、請求項4に記載のデータ処理装置。
  6. 【請求項6】 前記コード変換手段は、 スタックへのデータの転送のみを行なう非ネイティブコ
    ードを検出してその転送元と転送先とを対応付けて記憶
    するための手段をさらに含み、 前記生成するための手段は、前記データの転送のみを行
    なう非ネイティブコードの検出前記メモリオペランドの
    うちのスタックオペランドのうち、スタックトップ側の
    スタックオペランドが、前記プロセッサに備えられたレ
    ジスタに保持されるように、前記データ処理装置に接続
    されるメモリと、前記プロセッサのレジスタとの間で実
    行時にデータの保存と復帰とを行なうように、かつ、前
    記転送先をオペランドとして使用するコードについて
    は、前記転送先に代えて、前記記憶するための手段に記
    憶された前記転送元をオペランドとするように、ネイテ
    ィブコードを生成するための手段を含む、請求項5に記
    載のデータ処理装置。
JP2000368729A 2000-12-04 2000-12-04 データ処理装置 Pending JP2002169696A (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

Patent Citations (7)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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