JP3553834B2 - コンピュータアーキテクチャエミュレーションシステム - Google Patents

コンピュータアーキテクチャエミュレーションシステム Download PDF

Info

Publication number
JP3553834B2
JP3553834B2 JP29957699A JP29957699A JP3553834B2 JP 3553834 B2 JP3553834 B2 JP 3553834B2 JP 29957699 A JP29957699 A JP 29957699A JP 29957699 A JP29957699 A JP 29957699A JP 3553834 B2 JP3553834 B2 JP 3553834B2
Authority
JP
Japan
Prior art keywords
branch
compiler
instruction
interpreter
code
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.)
Expired - Lifetime
Application number
JP29957699A
Other languages
English (en)
Other versions
JP2000132408A (ja
Inventor
エー.レティン リチャード
エー.バンク ジョセフ
ディー.ガレット チャールズ
美加代 和田
三男 櫻井
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JP2000132408A publication Critical patent/JP2000132408A/ja
Application granted granted Critical
Publication of JP3553834B2 publication Critical patent/JP3553834B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

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/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)
  • Debugging And Monitoring (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は、第2のオペレーティングシステムをエミュレートするため、ホスト処理システム上で動作するオブジェクトコード変換プログラムの技術に関し、更に詳しくは、ホストプロセッサオブジェクトコード命令セットを有するホストプロセッサの実行時に、オリジナルオブジェクトコード命令セットの分析及び計算を実時間で行う動的オブジェクトコード変換プログラムの技術に関する。
【0002】
【従来の技術】
オブジェクトコード変換プログラムの分野では、1つのコンピュータ用に開発されたオブジェクトコードを、異なるコンピュータアーキテクチャを有する別のコンピュータ用に変換することが必要になる。そうしたオブジェクトコード変換方法には、“静的オブジェクトコード変換方法”と称する従来の方法があり、この方法では、命令文はその実行以前に、先ず第2のコンピュータアーキテクチャのオブジェクトコードに変換される。また、第2の従来方法としては、“動的オブジェクトコード変換方法”と称する方法があり、この方法では、命令を実行する間に、第1のオブジェクトコードを第2のオブジェクトコードに変換する。
【0003】
静的オブジェクトコード変換方法の技術では、実行時間は変換に要する時間による影響を受けない。しかし、静的オブジェクトコード変換の実行に当たっては、変換されたオブジェクトコードの物理サイズは大きくなる。言い換えれば、静的オブジェクトコード変換方法では、変換されたオブジェクトコードの操作ステップ数の増加は避けられない。その結果、変換されたオブジェクトコードのパフォーマンスは悪くなり、非能率となる問題がある。
【0004】
他方、動的オブジェクトコード変換方法では、静的オブジェクトコード変換方法に較べて、変換されたオブジェクトコードの物理サイズは相対的に小さくなる。しかし、この従来型の動的オブジェクトコード変換方法は、まれにしか使用しないオブジェクトコードも含めて、全てのオブジェクトコードが変換されてしまうと言う問題を抱えている。言い換えれば、従来型動的オブジェクトコード変換方法は、何回も実行されるオブジェクトコードの効率的な認識ができず、効率を犠牲にして、オリジナルオブジェクトコードの変換に必要な時間を増加せしめている。
【0005】
【発明が解決しようとする課題】
したがって、本発明の目的は、従来技術の諸問題に取り組むと共に、変換されたオブジェクトコードの動的最適化を行うオブジェクトコード変換プログラムを提供することにある。
【0006】
また、本発明の他の目的は、コンパイラがコンパイルを完了するまで、主要プログラムをプロファイルすることである。コンパイラはこのプロファイルを用いて、主要プラグラムをコンパイルし、かつ最適化する。
【0007】
また、本発明の更に他の目的は、動的最適化及びコンパイル時に、変換されてないコードから変換されたコードへのジャンプ動作を可能にすることである。
【0008】
また、本発明の更に他の目的は、コンパイラに送られた変換要求数と変換完了数との差を計算するソフトウェアフィードバックを備えた動的最適化オブジェクトコード変換プログラムを提供することである。
【0009】
また、本発明の更に他の目的は、1つのマシン語表現によるコンピュータプログラムをその実行時に、他のマシン語表現によるコンピュータプログラムに動的に変換することである。
【0010】
更にまた、本発明の目的は、変換元オブジェクトコードのブランチ(分岐)に対応する複数のシードから変換用のセグメントを決定する動的オブジェクトコード変換プログラムを提供することである。
【0011】
【課題を解決するための手段】
本発明の目的は、変換先コンピュータアーキテクチャシステムに関して、変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムによって達成される。このシステムは、変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、変換元オブジェクトコードのブランチ命令の実行数を決定するインタプリタと、対応するブランチ命令の実行数が閾値を越えたとき、変換元オブジェクトコードの命令をセグメントにグループ化し、このセグメントを動的にコンパイルするコンパイラとを含んでいる。
【0012】
更に、本発明の目的は、変換先コンピュータアーキテクチャシステムに関して、変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムによって達成される。このシステムは、変換元オブジェクトコードを、対応する変換されたオブジェクトコードに、それぞれ変換すると共に、それぞれが変換されたオブジェクトコード命令の実行の間に、実時間で変換元オブジェクトコードのブランチ情報をプロファイルする複数のインタプリタと、これら複数のインタプリタの何れかからの変換元オブジェクトコード命令を、変換元オブジェクトコードに於ける対応するブランチ命令に基づいてセグメントにグループ化すると共に、対応するブランチ命令の実行数が閾値より大きいとき、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラと、を含んでいる。
【0013】
また更に、本発明の目的は、変換先コンピュータアーキテクチャシステムに関して、変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムによって達成される。このシステムは、変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換すると共に、変換元オブジェクトコードのブランチ命令を、各ブランチ命令に関する実行数を記憶し、その実行数を閾値と比較することによってプロファイルし、閾値を越えたブランチ命令をシードとするインタプリタと、このシードに基づいて、変換元オブジェクトコードの命令をセグメントにグループ化し、上記インタプリタによる変換及びプロファイリングの間に、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラと、を含んでいる。
【0014】
また更に、本発明の目的は、多重タスキング変換先コンピュータアーキテクチャに関して、変換元コンピュータアーキテクチャをエミュレートする多重タスキングコンピュータアーキテクチャエミュレーションシステムによって達成される。このシステムは、変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、変換元オブジェクトコードのブランチ命令の実行数を決定するインタプリタタスクと、対応するブランチ命令の実行数が閾値を越えたとき、変換元オブジェクトコードの命令をセグメントにグループ化し、このセグメントを動的にコンパイルする多重タスキング転送先コンピュータアーキテクチャの上記インタプリタと共に動作するコンパイラタスクと、を含んでいる。
【0015】
本発明のこれら及びその他の目的、並びにその利点は、添付図面を参照して以下に述べる本発明の好適実施形態の説明から容易に理解されよう。
【0016】
【発明の実施の形態】
好適実施形態の詳細な説明
添付図面にその例を示す本発明の好適実施形態について詳細に説明する。尚、添付図面中、同一参照番号は同一要素を示すものとする。
【0017】
本発明の第1実施形態
I. システムの概観
本発明は全体として最適化オブジェクトコード変換プログラム(optimizing object code translator) (以下、“OOCT” と言う)に関し、プログラムはコンピュータアーキテクチャエミュレーションシステムの一部として、マイクロプロセッサ命令セットの動的コンパイルを実行する。実行時以前には、アプリケーション命令セットへの単純なアクセスもないから、コンパイルは動的である。オブジェクトコード変換システムの一部としてコンパイラを使用することによって、このシステムはテンプレートベースの変換及びテンプレートベースの解釈(interpretation)に関するエミュレーション性能を改善する分析及び最適化を行うことができる。
【0018】
エミュレーション用のホストプロセッサは、例えばインテル社のPentium Pro 等、市場で入手可能なものが好ましい。Pentium Pro の命令セットアーキテクチャは、サイズの異なるデータを容易に操作できるので、16ビット及び18ビットのオブジェクトコード命令両者のエミュレーションが楽に行える。16ビット及び18ビットオブジェクトコード命令は、第2のプロセッサ、例えば富士通社のK−シリーズプロセッサ側のオリジナルアプリケーションに対して設計することもできる。
【0019】
意味のあるコンパイラ型最適化の実施は、命令のフローグラフに関する情報が有る時に、はじめて可能になる。伝統的なコンパイラでは、最適化を開始する以前に、全ルーチンが完全に解析されるから、フローグラフが与えられ、そして十分に定義される。OOCTの場合はこれとは違って、プログラムを走らせる前には、メモリイメージに於ける命令の記憶場所は未知である。このことは、命令はその長さを種々変化すると共に、非命令データセットを任意に介在させているからである。全ての結合点が命令中にあるため、命令の記憶場所は未知となる。
【0020】
それ故、フローグラフを決めるには、プログラムを走らさなければならない。初めに、インタプリタがプログラムを走らせる。インタプリタはプログラムの実行に当たって、1つのブランチオペレーションを実行する毎に、それに関する情報をOOCTに報告する。この情報ロギング(記録)から、幾つかの命令及び幾つかの結合点が識別される。プログラムの進行につれて、フローグラフに関する情報は全体として決して完全とは言えないまでも、より完全になって行く。OOCTシステムは、フローグラフについての部分情報によっても動作するように設計されている。即ち、システムは最適化を潜在性のある不完全なフローグラフで実行し、より多くの情報が利用可能になったとき、最適化コードをそれと交換できるように構成されている。
【0021】
動的コンパイルは、インタプリタによって収集されたプロファイリング情報に基づいて、テキストのどの部分を最適化すべきかを選択する。或るブランチの実行回数が閾値を越えた時、そのブランチのデスティネーションがコンパイル用のシード(seed)となる。このシードは、1つのユニットとしてコンパイルされるK命令の一部分を解析するための始点である。このユニットをセグメントと呼ぶ。
【0022】
セグメントは、シードからオリジナルプロセッサ命令を最適化した結果生じるホストプロセッサ命令を含んでいる。セグメントは1つのユニットとして導入(インストール)されたり、導入されなかったりする。インタプリタがOOCTをコールして、ブランチについて報告すると、OOCTはその報告にデスティネーションコードが在れば、制御をセグメントに移行すること選択する。同様に、セグメントは制御をインタプリタへ返却移行するためのコードを含んでいる。
【0023】
セグメント自身は、オリジナルプログラムからの可能なフロー経路のサブセットを表すだけの不完全なものであっても良い。しかし、この不完全な代表性は、エミュレーションの正確な動作を妨げるものではない。オリジナルコードを介して新たな予想外のフロー経路が生じた場合には、制御フローはインタプリタに戻り、その後、同セグメントは新たな制御フローのために置き換えられる。
【0024】
II. OOCTコードの構造
本発明の実施形態によれば、OOCTは従来のオペレーティングシステム環境、例えばウインドウズ環境下で動作する。しかし、本発明の第2実施形態によれば、第2のオペレーティングシステム、例えば富士通社のKOI オペレーティングシステムのエミュレーションファームウエアとリンクして構成することもできる。
【0025】
III. アーキテクチャ
図1は、OOCTシステム100の高レベルアーキテクチャを示す。また、図1は、2つのタスク、即ちインタプリタ110及びコンパイラ104を示す。多重タスクオペレーティングシステムの下では、インタプリタ110及びコンパイラ104は同時に動作する。2つのタスクは共にブランチロガー112によってブランチログにアクセスすることができ、またコンパイルされたコードセグメント108にもアクセスすることができる。更に、インタプリタ110はコンパイラに対してコンパイル要求を送ることができる。2つのタスク間に於ける通信に関しては、以下の通信に関する項でより完全な説明を行う。
【0026】
コンパイル制御フロー
図2は、オリジナルコードの1つのセクションをコンパイルするための制御フローと共に、OOCT100の主要構成要素を示す。主なOOCT処理段階は以下の通りである。先ず、インタプリタ110はブランチロガー112と交信して、ブランチ情報をプロファイルする。次いで、ブランチロガー112はシード選択法を用いて、どのシードをコンパイラ104に送るかを決定する。次に、ブロックピッカ114はシードとブランチプロファイル情報を用いて、コンパイルするオリジナルコードの1つのセクションを選択する。次いで、ブロックピッカ114は、コンパイルするオリジナル命令を描く制御フローグラフ(CFG) を生成し、このCFG をブロックレイアウトユニット116に渡す。
【0027】
次いで、ブロックレイアウトユニット116は、制御フローグラフを命令の線形リストに単層化する。最適化コード発生ユニット118は、オリジナル命令を実際にコンパイルし、変換コードセグメント命令を生成する。この生成された変換コードは最終的には、変換されるセグメントに関する情報と共に、セグメント導入ユニット120に渡される。このユニット120は、このコードをインタプリタ110が利用できるようにする。
【0028】
OOCT実行時の制御フロー
図3は、OOCTの通常実行時に於ける制御フローを示す。インタプリタ110がコードを実行している間に、或る命令を実行する際には、OOCTはブランチロガー112に入ることができる。ブランチロガー112は、インタプリタ110に戻るか、或いはブランチのデスティネーションが既にコンパイルされている場合には、コンパイルされたコードの導入されたセグメントの1つに入ることができる。このコンパイルされたコードから、セグメントからセグメントへの遷移をするか、又はインタプリタ110へ戻ることができる。コンパイルされたコードは、インタプリタ110をコール(呼出)して単一オリジナル命令を実行するか、又はインタプリタ110にジャンプして全ての制御をインタプリタ110に渡すことができる。
【0029】
本願の第1実施形態に関する説明は、以下の各項に分けて行う。第1の項では、インタプリタ110とコンパイラ104のインタフェースについて述べる。第2の項では、OOCT用のインタプリタ110について実施した修正について述べる。第3の項では、コンパイラ104について述べる。そして最後の項では、ウィンドウズのテスト環境について説明する。
【0030】
本発明の第2実施形態から第9実施形態までの説明は、第1実施形態の説明の後に続けて行う。
【0031】
IV. 通 信(共通ユニット)
インタプリタ110とコンパイラ104は、幾つかの方法で相互に通信を行う。インタプリタ110は、ブランチロガー112と交信することによって、ブランチ情報をブランチログに記録する。また、コンパイラ104はブランチログを読むことが可能である。コンパイラ104はコンパイルされたコードセグメントを生成し、それらを変換テーブル中のそれぞれのエントリポイントに格納する。インタプリタ110は変換テーブルを読むことができる。また、インタプリタ110はコンパイラ104に対し、バッファを介してシードアドレスを送る。この交信にコンパイラ104及びインタプリタ110両者が用いる変換元コードは、共通ディレクトリにある。この項では、如何に通信が行われるかについて述べる。
【0032】
共用OOCTバッファ
コンパイラ104とインタプリタ110との間の全ての通信は、大きな共用メモリ領域であるOOCTバッファを介して行われる。また、或る通信では、インタプリタ110とコンパイラ104の間でメッセージのやりとりをするのに、システムコールを用いる。
【0033】
以下に述べるテーブル1は、OOCTバッファの静的割当(配分)部分を示す。バッファの残りの部分は、異なるデータ構造用として以下のテーブル2に示すように動的に割当られる。OOCTバッファの静的割当部分の中の或るフィールドは、動的割当部分のデータ構造を指す。これらのポインタは、それらが何を指しているかを示す上付数字を有している。例えば、静的割当部分のゾーンフィールドは数字2を有し、そしてゾーンフィールドは、数字2を有する動的割当部分のゾーンメモリデータ構造を指す。
【0034】
【表1】
Figure 0003553834
【0035】
【表2】
Figure 0003553834
【0036】
【表3】
Figure 0003553834
【0037】
【表4】
Figure 0003553834
【0038】
【表5】
Figure 0003553834
【0039】
【表6】
Figure 0003553834
【0040】
OOCTバッファの動的割当部分に於いては、データ構造のサイズは幾つかの変数に依存する。その1つは、オリジナルプロセッサのためのオペレーティングシステム、例えば富士通社のASPが使用するシステムページの数である。変換対象となる命令を含むASPアドレススペースの各ページに対して、変換テーブルには1つの変換されたページがある。もう1つの変数は、システムが記録(ログ)することを予想するブランチ命令の数である。現在、BRANCH RECORDアレイ及びブランチヘッダテーブルのサイズに影響を与えるブランチ命令数は、220と予想する。各タスク毎に1つのキャシュがあるから、インタプリタ110の数は、L1ブランチロガーキャシュのサイズに影響を与える。
【0041】
図4は、各種変数を設定した時のOOCTバッファの概略図である。この図4に於いて、ASPのページ数はASP命令について10MB、インタプリタ110の数は4、そしてOOCTバッファ全体のサイズは128MBでる。
【0042】
【表7】
Figure 0003553834
【0043】
ブランチログ(ブランチロガー112)
ブランチログデータ構造は、BRANCH RECORDアレイ、ブランチヘッダテーブル、及びブランチL1キャシュから成っている。ブランチロガー112の動作説明については、以下に述べるインタプリタ修正に関する項を参照されたい。この項では、インタプリタ110からコンパイラ104への情報通信に関して、ブランチログがどの様に使われるかを説明する。
【0044】
図4は、初期化の後のOOCTバッファを示す。種々の領域のサイズは基準化して示してある。例えば、OOCTバッファのサイズは128MB、ASPページ数は2560、インタプリタ110の数は2、及びブランチ命令の予想数は220として示してある。
【0045】
コンパイラ104は、ブランチログから、条件付きブランチ命令が何回実行され、また何回実行されなかったかを読み取る。コンパイラは、この情報を2つの方法で使用する。第1に、コンパイラ104が命令を解析するとき、コンパイラは、最も頻繁に実行された命令だけの解析する。条件付きブランチ命令が発生した場合、コンパイラは、それが何回分岐したか、何回分岐しなかったかをチェックする。第2に、コンパイラ104がコードを発生するとき、コンパイラはブランチ命令の直ぐ後に条件付きブランチの最も相応しいサクセサ(後継)命令を置く。これによって発生コードの高速実行を可能にする。どのサクセサが最も相応しいかを決めるのに、コンパイラ104はブランチログ情報を利用する。詳細については、以下に述べるコンパイラ情報を参照されたい。
【0046】
BRANCH Get Record(ooct/compiler/branch.c)コンパイラ104がブランチログ情報を読み取る際、コンパイラはブランチ命令のアドレスを用いてBRANCH Get Record手続きをコールする。この手続きは、ブランチログ内のブランチを参照し、BRANCH RECORDアレイの要素の1つにポインタを戻す。斯うして、コンパイラ104は、ブランチ命令が何回実行されたか、何回分岐されたか、そして実行も、分岐もされなかったか回数を知ることができる。
【0047】
変換テーブル(TRANS UNIT)
変換テーブルは、ASPアドレススペースの全ての命令に関する情報を含んでいる。変換テーブルは、命令がブランチのデスティネーションであるか否か(JOIN)、命令がコンパイラ104にシードとして送られたか否か(BUFFERED)、及びセグメントに対するコンパイルされたコードのエントリポイントがあるか否かを記録する(ENTRY) 。OOCTが初期化されると、変換テーブルはクリヤされる。ブランチ情報が記録されると、それらのデスティネーションがJOINポイントとして記録される。もしブランチが閾値より多くの回数実行すると、デスティネーションはコンパイラ104にシードとして送られ、変換テーブルエントリはBUFFEREDとマークされる。コンパイラ104が変換されたバージョンをコンパイルし終わった後、コンパイラは、変換テーブルのエントリポイントのアドレスを記憶し、それらをENTRY として記録する。
【0048】
図5(a)、(b)及び(c)は、本発明の好適実施形態による変換テーブルの構造を示す。図5(a)に示すように、ASPアドレスは2つの部分に分かれている。高位20ビットはページ番号、そして低位12ビットはページオフセットである。
【0049】
図5(b)は、ページ番号が第1レベル変換テーブルに於いてインデックスとして利用されることを示している。ASPが作用するページは第1レベルページである。ASPが使用しないページは、そのページ番号を持つ命令が決してないから、ポインタを有することはない。ポインタは第2レベルの変換テーブルを指す。ページオフセットをポインタに加えることによって、変換テーブルのエントリが与えられる。
【0050】
図5(c)が示すように、各エントリは32ビットの長さを持ち、そのフィールドは図の底部に示されている。第1ビットは、ASP命令がジョインポイントか否かを示す。第2ビットは、命令のためのセグメントエントリポイントがあるか否かを示す。第3ビットは、命令がコンパイラ104に対してシードとして送られたか否かを示す。変換テーブルエントリの他のビットは、もし1で有れば命令にに関するエントリポイントのアドレスであり、エントリポイントがなければゼロである。
【0051】
Kマシンアーキテクチャは可変長命令を有しているから、変換テーブルは命令中央にあるアドレス及びデータアドレスを含む全てのASPアドレスに対するエントリを有している。このことはテーブルを非常に大きくするが、アドレスに対して変換テーブルエントリを位置づける仕事を簡単にする。変換テーブルの構造は図5(a)、(b)及び(c)に示されている。上記のように、第2レベルの変換テーブルは、全てのASPアドレスに対して32ビットのエントリを有している。それ故、ASPが10MBのスペースを使用する場合には、第2レベル変換テーブルは40MBを使用する。変換テーブルのエントリを読み取り、書き込みする手続き及びマクロは幾つかある。即ち、
【0052】
TRANS Set Entry Flag(ooct/common/trcommon.h)TRANS Set Entry Flagマクロは、変換テーブルエントリのフラグの1つ、JOIN、ENTRY 又はBUFFEREDをonにする。このマクロはロックプレフィックス(lock prefix) を持つアセンブリ言語命令を使用して、ビットを最小単位に(atomically)セットする。
【0053】
TRANS Reset Entry Flag(ooct/common/trcommon.h)TRANS Reset Entry Flagマクロは、変換テーブルエントリのフラグの1つ、JOIN、ENTRY 又はBUFFEREDをoffにする。このマクロは、ロックプレフィックスを持つアセンブリ言語命令を使用してビットを最小単位にリセットする。
【0054】
TRANS Entry FlagP(ooct/common/trcommon.h) TRANS Entry FlagP マクロは、変換テーブルエントリのフラグの1つ、JOIN、ENTRY 又はBUFFEREDの状態を読み取り、そして戻す。
【0055】
TRANS Test And Set Entry Flag(ooct/common/trcommon.h)TRANS Test And Set Entry Flag手続きは、フラグの1つ、JOIN、ENTRY 又はBUFFEREDの状態を最小単位で読み取り、それが既にonされていなければonし、手続きをコールする前のフラグの状態に戻す。
【0056】
TRANS Set Entry Address(ooct/common/trcommon.h) TRANS Set Entry Address 手続きは、変換テーブルエントリのエントリポイントアドレスを書き込む。この手続きでは、ロックプレフィックスを持つアセンブリ言語命令を使用してアドレスを最小単位で書き込む。セグメントロッキングがない場合、エントリポイントアドレスはターゲット命令のアドレスであるが、セグメントロックキングがある場合には、SEGMENT GATEデータ構造のアドレスであることに注意。
【0057】
TRANS Get Entry Address(ooct/common/trcommon.h) TRANS Get Entry Address 手続きは、変換テーブルエントリのエントリポイントアドレスを読み取り、そして戻す。セグメントロッキングがない場合、エントリポイントアドレスはターゲット命令のアドレスであるが、セグメントロックキングがある場合には、 SEGMENT GATEデータ構造のアドレスであることに注意。
【0058】
セグメント
セグメントは、KOI システムが実行するコンパイルされたコードの単位である。以下に述べるコンパイラ104のマテリアルは、どの様にしてセグメントが生成され、そして削除されるかについて説明する。この項では、コンパイラ104はセグメントについて、どの様にインタプリタ110に告げるか、インタプリタ110はどの様にしてセグメントに入り、其処から出るか、及びコンパイラ104はインタプリタ110に対して、1つのセグメントの使用を停止し、他のセグメントに切り換えるよう、どの様に命令するか、について説明する。
【0059】
セグメントが生成されると、インタプリタ110が入ることが可能な幾つかのASP命令アドレスがある。これらアドレスの各々に対して、コンパイラ104はセグメントへのエントリポイントを生成する。エントリポイントはセグメントに於ける特別な点であって、インタプリタ110は其処にジャンプすることができる。セグメント内の他の点では、コンパイルされたコードは或る値がレジスタにあると想定するので、其処にジャンプすることは安全ではない。これらエントリポイントが何処にあるかをインタプリタ110に知らせるため、コンパイラ104は各n番目の TRANS Get Entry Address について、 TRANS Set Entry Address をコールする。
【0060】
インタプリタ110は、コンパイルされたコードがブランチロガー112に入る時、コンパイルされたコードに関してチェックを行う。コンパイルコードは TRANS Entry FlagP をコールし、現在のASPアドレスがエントリポイントを持っているかを調べる。もし持っていれば、 TRANS Get Entry Address をコールして、アドレスを読み取る。セグメントロッキングがonの場合には、コンパイルされたコードはセグメントをロックする(以下参照)。もしoffであれば、コンパイルされたコードは、エントリポイントにジャンプする。コンパイルされたコードは、何時ブランチロガーから出るかを決定する。通常、この決定は、同じセグメントの部分ではない命令を実行する必要があるときに起こり、決定後、インタプリタ110にジャンプする。
【0061】
コンパイラ104は、1つのコンパイルされたコードセグメントを削除し、もう1つ他のコンパイルされたコードセグメントを使用するよう、インタプリタ110に命令することができる。コンパイラ104は、変換テーブルエントリのENTRY ビットをoffにし、エントリポイントアドレスを変更し、再度ENTRY ビットをonにする。
【0062】
セグメントロッキング
セグメントロッキングは、OOCTシステムの任意選択の機能である。システムの稼働と共にブランチロガー112はより多くの情報を得るから、コンパイラ104は古いセグメントよりも更に良い新たなバージョンのセグメントを作成することができる。コンパイラ104はセグメントロッキングによって、古いセグメントを新しいセグメントに換え、古いセグメントが使用したメモリを再生使用することができる。しかし、生憎なことに、セグメントロッキングはブランチロガー112及びコンパイルされたコードを低速化してしまう。そこで、OOCTコードを実行する時間と、それに使用するスペースとの間にはトレードオフ(交換)がある。この項では、セグメントロッキングの動作について説明する。
【0063】
セグメントロッキングコードは2つの主要な部分を有している。第1の部分はセグメントロッキング実施部分を除くOOCTシステム全ての部分に対するインタフェースである。このインタフェースは、セグメントが4つの明確な状態の1つにだけ入ることができ、明確な方法でそれらの状態を変更することを保証する。第2の部分はセグメントロッキング自身の実施部分であって、上記インタフェースによる保証を満足する。
【0064】
設 計
セグメントが取ることのできる状態はテーブル3に示されている。セグメントは到達可能か、又は到達不能かの何れかの状態を取ると共に、ロック又アンロックの状態を取る。セグメントは、変換テーブルに1つ以上のエントリポイントがあるとき到達可能であり、変換テーブルにセグメントへのエントリポイントがないとき到達不能である。エントリポイントは、ロック及び命令アドレスを含む構造である。1つ以上のインタプリタ110によって同時に使用されるロックは、幾つのインタプリタ110がエントリポイント及びそれを含むセグメントを使用したかをカウントする。セグメントの1つ以上のエントリポイントがロックされたとき、セグメントはロックされ、セグメントの全てのエントリポイントがアンロックされたとき、セグメントはアンロックされる。
【0065】
コンパイラ104は、セグメントが到達不能、且つアンロックの状態にあれば、セグメントの再生使用及び削除ができるが、セグメントが到達可能又はロックの状態にあれば、セグメントの再生使用はできない。コンパイラ104がセグメントを生成すると、全てのセグメントは状態U/Uにある。コンパイラ104が変換テーブルにエントリポイントを書き込むと、セグメントは状態R/Uに移動する。インタプリタ110のセグメントへの入出に応じて、セグメントは状態R/Lに移動し、また状態R/Uに戻る。コンパイラ104は、古いセグメントと同じ命令を変換する新たなセグメントを生成することができる。この場合、コンパイラは変換テーブルに古いセグメントのエントリポイントを上書きし、そのセグメントを到達不能とする。コンパイラ104がセグメントの最終エントリを上書きするとき、インタプリタ110がそれを使用している場合には、セグメントは状態R/LからU/Lに移動し、使用していない場合には、セグメントは状態R/UからU/Uに移動する。結局、セグメントを使用する全てのインタプリタ110はロックを解放し、セグメントは状態U/Uを取る。このとき、何れのインタプリタ110もセグメントを使用しておらず、そこにも入れないから、コンパイラ104はセグメントの再生使用もできるし、またセグメントの削除もできる。
【0066】
【表8】
Figure 0003553834
【0067】
図6は、本発明の実施形態によって、インタプリタ110がセグメント122に入り、其処から出るまでを示す図である。図中央のセグメント122は、コンパイラ104によって作られたコードの単位である。セグメント122は、インタプリタ110によって使用される際には、常時ロックされていなければならない。従って、ロックカウンタ(図示せず)は、インタプリタがセグメント122にはいる以前には増分(加算)され、セグメント122から出た後は減分(減算)される。インタプリタ110は、エントリポイントをルックアップできず、エントリポイントを最小単位にロックするから、ロック後にエントリポイントが変化しなかったかを決定しなければならない。
【0068】
図7は、コンパイラがセグメントを生成し、インタプリタ110によるセグメントへの到達を可能にし、古いセグメントへの到達を不能にし、そして古いセグメントを削除する方法を示す。ステップS200に於いて、コンパイラ104は新しいセグメントを生成し、関連するエントリポイントを変換テーブルに加える。エントリポイントがステップS200に加えられると、古いエントリポイントは書き換えられる。これによって、古いエントリポイントは到達不能となり、従ってタスク(例えば、インタプリタ110又はコンパイラ104)がそれをロックオン状態に保持していなければ、再利用できる。古いエントリポイントは再生使用リスト(図示せず)に書き込まれる。
【0069】
ステップS202は、コンパイラ104がどの様に再生使用リストを使用するかを示す。ステップS202はエントリポイントがロックされているか否かをチェックする。エントリポイントがロックされていなければ、エントリポイントはどのインタプリタ110によっても使用されておらず、それ故、このエントリポイントを有するセグメントから取り除くことができる。しかし、そのセグメントが最早エントリポイントを持っていなければ、セグメントはタスク(例えば、インタプリタ110又はコンパイラ104)によって使用されず、如何なるタスクもそのセグメントには入れない。それ故、そのセグメントは削除することができる。
【0070】
セグメントロッキングインタフェースは、OOCTの殆どの部分が同期に関する詳細を無視することを許す。その理由は、セグメントは常に明確な状態にあり、そして全ての状態遷移は最小単位で起きるからである。しかし、セグメントロッキングコード内部では、インテルターゲットは、ハードウェアに於けるそうした複雑な動作を支持しないから、遷移は最小単位で起きてはいない。それ故、セグメントロッキングコードは遷移を自動的にさせる。
【0071】
実 施
インタプリタ101及びコンパイラ104の実行手続きは、図6及び図7にそれぞれ図示されている。これら2つの手続きは、確実に遷移が自動的に行われるように共働する。以下の説明に於ける括弧内の参照番号は、図6及び図7を参照する。
【0072】
セグメントインタフェースの4つの状態の間には、6つの可能な遷移があり、それらは4つのグループに分かれる。第1の遷移は、コンパイラ104がセグメントのエントリポイントを変換テーブルに書き込むことによって、セグメントを到達可能にしたときのもので、U/UからR/Uへの遷移である(*6 )。コンパイラ104は変換テーブルに書き込みができる唯一のタスクであるから、この遷移を自動的にするのに如何なる同期も必要ない。
【0073】
第2の遷移グループは、R/UからU/Uの遷移と、R/LからU/Lへの遷移である。これらの遷移は、コンパイラ104がセグメントの最終エントリポイントを変換テーブルに上書きした時に起こる(*306 )。コンパイラ104は変換テーブルに新たなエントリポイントを書き込むことができるが、インタプリタ110はエントリポイントを最小単位に読み取ることができず、それをロックする(*301 、*302 )。従って、インタプリタ110は、1つの動作でエントリポイントを読み取り、もう1つの動作でそれをロックしなければならない。もしインタプリタ110が、変換テーブルから古いエントリポイントを読み取り、次いでコンパイラ104が新たなエントリポイントを書き込み、そしてインタプリタ110が古いエントリポイントをロックするとしたら、これは潜在的問題を露呈することになる。この場合、コンパイラ104は、エントリポイントは到達不能であるが、インタプリタ110はセグメントに入れると想定する。これは誤りである。この問題を防止するため、インタプリタ110は変換テーブルがロッキング後、同じエントリポイントを含んでいるかをチェックする(*303 )。変換テーブルが同じエントリポイントを含んでいれば、エントリポイントは到達可能であり、安全にセグメントには入れる。変換テーブルが同じエントリポイントを含んでいなければ、インタプリタ110はそのロックを解かなければならず、セグメントに入ってはならない。
【0074】
第3の遷移グループは、R/UからR/Lへの遷移と、その反対のR/LからR/Uへの遷移である。前者の遷移は、インタプリタが変換テーブルからエントリポイントを読み込み、それをロックしたときに起こる(*302 )。後者の遷移は、インタプリタ110がセグメントのexit(*304 )に於いてセグメントから離れて、アンロック手続き(*305 )に移行するときに起こる。ロッキング及びアンロッキング命令は、それ自体セグメントには無く、セグメントは如何なる時もアンロック状態にあるから、コンパイラ104がそれを削除できる(*3011)ことは重要である。
【0075】
第4の遷移は、U/LからU/Uへの遷移である。この遷移もインタプリタ110がセグメントを離れて(*304 )、アンロック手続き(*305 )に移行するときに起こる。この遷移が起こった後、セグメントはアンロックされ、コンパイラ104は2つのテストを通り(*309 、*3010)、そしてセグメントを削除する(*3011)。
【0076】
インタプリタ110は任意の時間期間、セグメントのロックを保持できるから、コンパイラ104をそのロック時間待たせることは非効率である。それ故、コンパイラ104は、インタプリタ110がエントリポイントを使うのを防止するため、エントリポイントのロックを行わない。その代わり、コンパイラはセグメントを到達不能とし、後でロックが解放されたか否かをチェックする(*309 )。一旦ロックが解かれれば、エントリポイントはフリーとなり、再利用することができる。
【0077】
モニタメッセージ待ち行列
インタプリタ110は、コンパイラ104に対してシードアドレスを送る。このシードアドレス送信には、2つのメッセージ待ち行列が使用される。第1の待ち行列はシード送受信のため、KOI システムコール ScMsgSnd 及び ScMsgRcv を使用する。第2の待ち行列は、OOCTバッファの共用メモリ領域を使用する。この共用領域は、branch Seed Bufferと呼ばれる。
【0078】
2つの待ち行列を使用する理由は、それら各々が1つの利点と、1つの不利な点を持っているからである。KOI システムコールは、インタプリタ110が使用するには費用が掛かり、そう頻繁には使用すべきではない。しかし、KOI システムコールは、コンパイルするシードがないとき、コンパリラ104がブロックすることを許す。このことは、KOI システムがコンパイラ104を使ってCPUが何か他の仕事をすることを許すことになる。共用メモリ領域の利点は、インタプリタ110がそれを非常に安価に使用できる点であるが、その不利な点はシードがない時、ブロックできない点である。
【0079】
これら両方の待ち行列を用いることによって、OOCTはこれら2つの方法の利点を得ることができる。コンパイラ104が非動作状態にあるとき、ScMsRcv をコールしてブロックする。この場合、インタプリタ110は ScMsgSnd コールを用いて次のシードを送り、コンパイラ104を起こす。コンパイラ104が動作状態にあるときは、高速のbranch Seed Buffer領域を介してシードを送る。コンパイラ104は1つのコンパイル動作を終了した後、 sch Seed Buffer領域をチェックする。もし何か他にシードがあれば、コンパイラはそれらをコンパイルする。全てのシードのコンパイルが完了したとき、コンパリラは再度 ScMsgRvc をコールし、ブロックする。
【0080】
V. インタプリタの修正(EXECユニット)
OOCTの設計は、インタプリタ110に対する三種類の修正を含んでいる。その第1は、OOCTをインタプリタ110によって初期化できるようにするための修正、第2はインタプリタ110がブランチロギングを使用できるようにするための修正、最後はインタプリタ110がコンパイルされたコードへの遷移及び其処からの遷移ができるようにするための修正である。ここでは、これら修正の詳細について述べる。
【0081】
OOCTのインタプリタコードは、2つのモード、OOCT PERFORMANCE MODE及びOOCT DEBUG MODEで実行することができる。ここでは、OOCT PERFORMANCE MODEの全ての特徴を説明すると共に、OOCT DEBUG MODEと何処が違うかについて述べる。
【0082】
初期化
OOCTがコードをコンパイルし又はブランチをログする前に、インタプリタ110はOOCT INITをコールして、OOCTデータ構造の初期化を行う。OOCT INIT及びそれがコールする手続きは、以下のステップを実行する。
【0083】
変換テーブルを初期化する。MCD命令はOOCTにシステムアドレススペースのページ数を告げる。手続き TRANS Execution Initは、システムページに関するエントリが、第2レベルの変換テーブルアレイを指すように第1レベル変換テーブルを生成する。これらアレイは、初期化の時にゼロにされる。変換テーブルについての更なる詳細は通信に関する項を参照。
【0084】
ブランチロガー112を初期化する。手続きBRANCH Execution Initは、幾つかのデータ構造のためにOOCT bufferのメモリを初期化する。これらの構造としては、第1にブランチ命令についてのプロファイル情報を含むブランチログ自身がある。第2には、ブランチロガー112を高速動作させるレベル1(L1)キャッシュがある。第3に、ブランチロガー112からコンパイラ104に送られるシードを含むシードバッファがある。第4に、コンパイルされたコードがコールする幾つかの大域機能(global functions)がある。これらのアドレスは、BRANCH Execution Initの実行中に、OOCT bufferに記憶される。ブランチログ及びレベル−1キャシュに関する更なる情報については、上記ブランチロガー112に関する項を参照。
【0085】
コンパイラ104のスタックメモリへの割当。コンパイラ104は、OOCT bufferに割当られた特に大きいスタックを使用する。
1.コンパイラ104のゾーンメモリへの割当。コンパイラ104はコンパイル中、OOCT bufferのこのメモリを使用する。
2.コンパイルされたセグメントメモリの割当。コンパイルされたコードはOOCT bufferのこの領域に置かれる。
3.統計的情報をゼロ化。OOCTが初期化される際、OOCTの統計的領域に於ける殆どの情報がリセットされる。
【0086】
ブランチロガー
インタプリタを有するインタフェース
インタプリタ110がシステムコードで書いたブランチ命令を実行し、OOCTモードビットが設定されると、インタプリタ110は下記のルーチンの1つを介して、ブランチロガー112をコールする。
【0087】
declspec(naked)OOCT Log Unconditional Fixed Branch()
ブランチを有するインタプリタによってコールされる。
増補: exc: ブランチ命令のアドレス
復帰: 復帰せず(IC FETCHO2 へのジャンプのように作用する)
【0088】
declspec(naked)OOCT Log Unconditional Non Fixed Branch()
ブランチを有するインタプリタによってコールされる。
増補: exc: ブランチ命令のアドレス
復帰: 復帰せず(IC FETCHO2 へのジャンプのように作用する)
【0089】
declspec(naked)OOCT Log Conditional Fixed Branch Taken()
ブランチを有するインタプリタによってコールされる。
増補: exc: ブランチ命令のアドレス
復帰: 復帰せず(IC FETCHO2 へのジャンプのように作用する)
【0090】
declspec(naked)OOCT Log Conditional Fixed Branch Not Taken()
ブランチを有するインタプリタによってコールされる。
増補: exc: ブランチ命令のアドレス
復帰: 復帰せず(IC FETCHO2 へのジャンプのように作用する)
【0091】
これら4つのルーチンは、デスティネーションアドレスに対するコンパイルされたコードエントリポイントをチェックし、もし在ればそのエントリポイントにジャンプする。もしなければ、ルーチンは、branch L1 Touch (次の項を参照)をコールして、ブランチログを更新し、インタプリタ110の取り出し(fetch )ルーチンへジャンプする。
【0092】
ブランチログテーブル更新
図8は、本発明の好適実施形態によるBRANCH RECORDの構造を示す。
【0093】
ブランチロギングコードは、ブランチが何回実行したかをカウントする。ブランチロガー112がカウントの記憶に使用するデータ構造は2つ在る。その1つはブランチログであって、これは多重プロセッサシステムに於いて、全ての模擬的プロセッサによって共用される。もう1つは、多重プロセッサの各模擬的プロセッサに対する1つのレベル1(L1)キャシュである。ブランチ実行カウントは、先ずキャシュに書き込まれ、次いでブランチログに書き込まれる。この項ではL1キャシュ及びブランチログの構造について説明する。また、ブランチロガー112がどの様にしてそれらを使用するかについても説明する。
【0094】
各ブランチに関する情報は、BRANCH RECORDと称する構造に記憶される。この構造は、ブランチのアドレス、ブランチのデスティネーション、ブランチに続くフォールスルー(fall through)命令、ブランチが実行した大凡の回数、及びブランチが取られた(taken) 大凡の回数を含む。BRANCH RECORDの最終フィールドは、もう1つ他のBRANCH RECORDに対するポインタであって、連結リストにBRANCH RECORDを接続するのに使用される。
【0095】
ハッシュテーブルは、連結リストのアレイとして構成される。
【0096】
図9は、ブランチログの構造を示す。それはBRANCH RECORDを記憶する大きなハッシュテーブルである。各インタプリタ110は、可変 local branch header table 自身のコピーを持っているが、それら全てはOOCTバッファ領域に於ける同じアレイを指す。 local branch header table の要素は、BRANCH RECORDのリストに対するポインタである。ブランチに関するるBRANCH RECORDの探索手続きは以下の3ステップである。
1.デスティネーションアドレスをハッシュする。(index =BRANCH HASH(destination address)% BRANCH TABLE SIZE) 。
2.リストのヘッドを取得する。(list =local branch header table[index])
3.同じブランチアドレスを持つ記録が見つかるまで探索する。(while(list-> branch address! =branch addres)list = list->next)
【0097】
図9は特に、可変 local branch header table が、リストに対するポインタアレイであることを示している。各リストは同じデスティネーションアドレスを有するBRANCH RECORDを含んでいる。リストがない場合、 local branch header table のポインタは空である。
【0098】
ブランチログはブランチに関する情報の全てを含んでいるが、2つの問題を抱えている。その1つは、BRANCH RECORDの探索及び挿入動作が遅い点である。インタプリタ110が常時ブランチの記録を取るには遅すぎる。もう1つの問題は、全てのインタプリタ110が同じブランチログを使用する点である。BRANCH RECORDのリストを一貫して矛盾無く保つために、一度に1つのExecだけしかブランチログにアクセスできない。このことは、単一のプロセッサシステムの場合はもとより、多重プロセッサシステムの動作を更に減速させる。この問題を解決するために、各インタプリタ110には、1つのL1キャシュがある。このL1キャシュには高速でアクセスができると共に、インタプリタ110はこれと平行に、それらのL1キャシュにアクセスすることができる。各L1キャシュは、BRANCH L1 RECORD構造の2次元アレイとして構成される。このアレイのベース(基底、基準)アドレスは可変branch L1 table に記憶される。
【0099】
図10はL1キャシュの構造を示す。L1キャシュは、BRANCH L1 RECORDの2次元アレイである。第1次元はBRANCH L1 SETS(現在32)であり、第2次元はBRANCH L1 SETSIZE (現在4)である。アレイの各行は1つのセットである。同じブランチ命令は、常にキャシュの同じセットを使用するが、それは異なる場所に於いても可能である。
【0100】
図10に示すように、L1キャシュは複数のセットで構成される。ブランチに対するセット数は、(branch address + branch destination )% BRANCH L1SETSに等しい。セットの4つの要素は同じセット数の4つの最新ブランチを保持する。これは4−ウェイセット連想法(4−way set associativity) と言われる。同じセット数を有し、ほぼ同時に実行される幾つかのブランチが在るとき、キャシュの性能は改善される。
【0101】
図11は、本発明の実施形態によるインタプリタ110によって、L1キャシュの動作を実行させる方法を示す。即ち、図11はL1キャシュを用いたブランチロギング方法を示す。
【0102】
最適化オブジェクトコード変換方法は、コンパイル未了ブランチを記録するのに、2つの形のメモリを利用する。即ち、
1.記録されたブランチの数に比例する動的可変サイズを有するブランチログ、及び
2.限られた数のコンパイル未了の記録されたブランチが、アクセスを高める順序に従って記録される、L1キャシュと称するブランチキャシュ、
を利用する。これらブランチログ及びL1キャシュは、オペレーティングシステムによって管理される仮想記憶位置を表す。それ故、ここでの用語“L1キャシュ”は、コンパイル未了ブランチを記憶するキャシュに任意に与えられる用語であって、一般に、Pentium Pro 等のプロセッサに見られる“L1キャシュ”と混同してはならない。
【0103】
本発明による最適化オブジェクトコード変換プログラムは、インタプリタ110が複数の異なるブランチルーチンをコールすることができるようにする。しかし、各ブランチロギングルーチン自身は、コンパイルされたコードへジャンプするか、又はブランチ命令を記録するかを決めるサブルーチンをコールする。図11は、このサブルーチンを詳しく示している。
【0104】
上記説明を考慮しつつ、L1キャシュを使用したブランチロギング方法を実行するため、先ずステップS400からこの方法を始める。ステップS401において、インタプリタ110は、ブランチのデスティネーションに対するコンパイルされたコードのエントリポイントをチェックする(即ち、問題のセグメントが事前にコンパイルされているか否かをチェックする)。もしエントリポイントが在れば、即ち“yes”ならば、コンパイルされたセグメントが在り、直ちにコンパイルされたコードセグメントを実行するためステップS402へジャンプする。このコンパイルされたコードセグメントの実行は、エンドフラグに到達するまで続けられ、これが終了すると、次のセグメント実行に戻る。勿論、ブランチが既にコンパイルされているので、ブランチはブランチログに記録されない。
【0105】
ステップS401で、エントリポイントがなければ、即ち“no”ならば、ブランチ命令に対応するコンパイルされたセグメントはなく、ステップS404に移り、インタプリタ110はL1キャシュを調べて、L1キャシュに記憶された複数のブランチに一致するブランチがあるか否かを決定する。
【0106】
ステップS404は、L1キャシュに記憶された複数のブランチに一致するブランチがあるか否かを決定する。L1キャシュは複数のセットに分かれており、各セットは固有のセット番号によって指定されている。本発明の実施形態では、各セットは4つのブランチを含んでいる。
【0107】
ステップS404は、最初に現在のブランチアドレスに対応するキャシュセットの数“S”を決める。ここで、S=(branch address + branch destination )% BRANCH L1 SETSである。次に、branch L1 table[S]の各要素は、現在のブランチのアドレス及びデスティネーションに関して順次チェックされる。もし一致するブランチが検出されると、即ち“yes”ならば、ステップS406に進み、フィールド“encountered sub count ”(何回ブランチに出合ったかを示すフィールド)及び“taken sub count”(何回ブランチが取られたかを示すフィールド)が更新され、次にステップS407に進む。
【0108】
ステップS407では、現在のブランチアドレスが、所定の閾値より大きいか否かが決定される。好適な閾値は1000ビットのオーダーである。こうして、フィールド encountered sub count は、ステップ407で閾値と比較される。もしそれが閾値を越えていれば、即ち“yes”ならば、ステップS410に進み、このブランチに関するキャシュされた情報は、ブランチログに書き戻される。他方、閾値を越えていなければ、即ち“no”ならば、ステップS412に進む。ステップS412は、IC−FETCHO2へジャンプする現在のサブルーチンの終わりであり、即ちインタプリタ110のエントリポイントである。
【0109】
もし正しいブランチがキャシュになければ、即ちステップS404で“no”ならば、ステップS408に進んで、上記“S”によって指定されたセットの1つBRANCH L1 RECORD(即ち、 encountered sub count 、及び taken sub count 等の更新可能な全てのフィールドを含む記録)はL1キャシュから除かれ、ブランチログに書き込まれる。次に、現在のブランチ情報は“S”よって指定されるセットに書き込まれる。更に、現在のブランチ記録をセット“S”に書込み中、この現在のブランチ記録はセットの第1要素として置かれる。これは、同じブランチが再度実行される可能性があり、これによってシステムの性能及び効率が上がるからである。言い換えれば、ステップS404は高速で実行される。ブランチがキャシュに在る時でさえ、即ち“yes”の場合、もしそのブランチが何回も何回も実行されたとしても、最終的にフラッシュされるので、そのブランチをブランチログにコピーしておくこともできる。
【0110】
L1キャシュを使用する際、ステップの順序は大凡常に、S400、S404、S406、S407、そしてS412の順である。従って、本発明はそれらのステップを出来るだけ高速にすることを求める。現在のブランチ情報がセットの第1要素に入力されると、インタプリタ110は同じブランチを再度実行するようになるから、そのブランチ情報がステップS404を高速化する。
【0111】
上記のブランチロギング方法は、前もってコンパイルされたコードを実行し、そしてコンパイルの閾値レベルに達していないブランチ命令へのアクセスを高めることによって、プロセッサへの負担を軽減する。この点について、OOCTの主目的は、ステップS400が殆ど常に分岐“yes”を取るようにすることである。ブランチを頻繁に実行する場合には、そのデスティネーションに関するコンパイルされたコードセグメントがなければならない。
【0112】
第2の目的は、ステップS401に続く経路“no”を高速化し、まだコンパイルされてないブランチがプログラムの実行速度を目立って落とさないようにすることである。この経路“no”の最も遅い部分を“フラッシュ”と呼ぶ。両ステップS408及びS410では、ブランチ情報はL1キャシュから“フラッシュ”され、ブランチログに書き込まれる。シードをコンパイラに送るには、ブランチ情報をフラッシュすることが必要になり、このことがコンパイルされたコードを発生させ、ステップS400がやがて、このブランチに対し“yes”と応えるようにさせる。
【0113】
しかし、コンパイル未了のブランチアドレスを実行するたびに、ブランチの情報をフラッシュする必要はない。100回乃至はそれ以下の実行毎にフラッシュを掛ければ良い。それ故、本発明はフラッシュを含まないステップS400、S404、S406、S407及びS412の実行速度を上げることを求める。従って、二者択一状態が起こらない限り、より高速な経路を常に選択するようにする。ステップS404では、ブランチ情報がセットに見つからない可能性がある。そこで、ステップS408への経路“no”を取る。ステップS407で、もしブランチが“閾値”回数以上に実行されるようであれば、フラッシュを含むステップS410へ経路“yes”を取る。
【0114】
OOCT DEBUG MODEでも、L1キャシュ方法が使用されるが、キャシュをフラッシュするための閾値は1にセットされ、情報はブランチの実行毎にブランチログに書き込まれる。これは、OOCT DEBUG MODEを更に遅くする。
【0115】
シード選択
ブランチ命令が頻繁に実施されるとき、ブランチロガー112は、そのデスティネーションアドレスをコンパイラ104に送る。このアドレスは“シード”と呼ばれ、そしてシードの選択はOOCTシステムの非常に重要な部分である。
【0116】
シードは、手続きの開始又はループのヘッドに於けるアドレスでなければならない。それ故、ブランチロガー112は無条件ブランチのデスティネーションであるシードを送るだけである。シードは頻繁に実行されるアドレスでなければならない。従って、 encountered count フールドが閾値より大きい場合にだけ、ブランチのデスティネーションがシードとなる。閾値は、seed production threshold と称するフィールドのOOCTバッファに記憶される。閾値は時間を切り換えることができる。これについては、次の項で説明する。
【0117】
閾値設定
シードを送るか否かを決めるのに固定閾値を使用することについては、2つの欠点がある。その第1は、コンパイラ104が遊休状態(idle)にある間、固定閾値が高すぎる嫌いがある。この場合、コンパイラ104には為すべき有効な作業があるが、ブランチロガー112はコンパイラ104に対して、何をすべきかを指示しない。また、第2として、メッセージ待ち行列が一杯の状態にある間、固定閾値が低すぎる嫌いがある。この場合、ブランチロガー112は、たとえシードが待ち行列に適合しなくても、シードを送ろうとする。これは時間の浪費に繋がる。
【0118】
幸いなことに、これら2つの状態、即ちコンパイラ104の遊休状態及びメッセージ待ち行列の満杯状態は検出することができ、そして閾値を変えることができる。ブランチロガー112は、OOCTバッファの num monitor seed messagesと称するフィールドを読み取ることによって、コンパイラ104が手続きbranch Update Entry に於いて遊休していることを検出する。このフィールドが0の場合、コンパイラ104は、送られてきた全てのシードを完了している。閾値が高すぎると、ブランチロガー112はそれを下げる。ブランチロガー112がシードを送ろうとして、手続きbranch Send Seedで満杯のメッセージシードを検出すると、ブランチロガーはメッセージが送れなかったことを示すエラーコードを受け取る。閾値が低すぎると、ブランチロガー112はそれを上げる。
【0119】
OOCT DEBUG MODEでは、閾値は決して変化しない。この場合、その値はOOCTINIT手続きの第3引数にセットされる。
【0120】
多重タスキング処理
OOCTは複数のインタプリタ110を有する多重プロセッサ上で作動する。これらのタスクは個々にブランチL1キャシュを有しているが、同じブランチログテーブルを使用する。ブランチ情報がL1キャシュからブランチログテーブルにフラッシュされると、インタプリタ110は、如何なる他のExecとも競合しないログをテーブル上で入手する。ブランチログロックに関するコンテンション(競合)を扱うには2つの方法がある。第1の方法は、ロックが使用可能になるまでインタプリタ110を待機させ、次いでロック使用が可能になったら、そのブランチ情報を書き込む方法である。この方法は、インタプリタ110の実行速度をより遅くするが、ブランチログをより正確にする。また、第2の方法は、もしインタプリタ110がロックを得られなければ、ブランチ情報を書き込まずにあきらめる方法である。この方法は、インタプリタ110を高速にするが、或るブランチロギング情報を失うことになる。インタプリタ110のスピードは、ブランチログの正確さより重要なので、OOCTは第2の方法を使用する。ブランチログ情報は、システムがうまく機能する程度に大凡の正確さを持っていることが必要なだけである。
【0121】
OOCTが複数のインタプリタ110と共に動作する際、複数タスクの1つは、OOCTバッファ及びブランチロギングデータ構造を初期化するために、OOCT INITをコールする特別なマスタータスクである。その他のタスクは、幾つかのローカル変数及びそれらのブランチL1キャシュを初期化しなければならないだけの従属タスクである。従属タスクは、マスタータスクがOOCT bufferの初期化を完了した後に、 SlaveOOCT Initをコールする。マスタータスクと従属タスクとの間の同期を取るには下記の方法を使用する。即ち、
【0122】
マスタータスクに対する方法
1.MCD命令を実行してOOCTをonする。
2.OOCTバッファ及びブランチロギングデータ構造を初期化するOOCT INITをコールする。
3.従属タスクを作動させる。
4.インタプリタへジャンプする。
【0123】
従属タスクに対する方法
1.休眠状態に入る。マスタータスク(上記ステップ3)の実行により作動開始。
2.タスク個々のブランチL1キャシュを初期化する SlaveOOCT Initをコールする。
3.インタプリタへジャンプする。
【0124】
ユーザ/システムスペース変換
OOCTシステムはASPアドレススペースのシステムページからの命令をコンパイルするだけであって、ユーザページは無視する。インタプリタ110の個々の領域のOOCTSTS ビットは、ブランチロガー112をコールするか否かを制御する。このバットは、二つのマクロNEXT CO及びNEXT OUN によって主として制御される。しかし、OOCTコードがこのビットをセットしなければならない場合が1つある。コンパイルされたコードセグメントが非固定ブランチ命令で終わるとき、OOCTコードは PSW IAをシステムスペースからユーザスペースに移動させ、OOCTSTS を0にセットする。それ故、非固定ブランチ命令で終わるコンパイルされたコードセグメントは、デスティネーションアドレスをチックしすると共に、OOCTSTS ビットを正しくセットするルーチンbranch Exit Log にジャンプする。
【0125】
コンパイルされたコードインフェース
コンパイルされたコードへ/からの遷移
インタプリタ110がブランチロガールーチンをコールするとき、実行をコンパイルされたコードに移行し、ブランチのデスティネーション向けにコンパイルされたセグメントを見つける(図11参照)。セグメントロッキングがoffの時、インタプリタ110はエントリポイントへ直接ジャンプする。セグメントロッキングがonの時、インタプリタ110は、エントリポイントへジャンプする前に、セグメントのロックを試さなければならない。セグメントをロックできたら、インタプリタ110はエントリポイントへジャンプする。もしできなければ、インタプリタ110へジャンプバックする。
【0126】
制御がコンパイルされたコードセグメントから出るための実行方法には幾つかある。これをテーブル4に示す。これら全ての場合、制御がインタプリタ110に戻るとき、ESI及びEDIレジスタは正しい値を持ち、インタプリタ110の個々の領域は完全なK状態を持っている。
【0127】
【表9】
Figure 0003553834
【0128】
セグメントロッキングがonの時、インタプリタ110はコンパイルされたコードを実行する間、コンパイルされたコードセグメントのロックを保持する。インタプリタ110はセグメントを出た後、このロックを解除しなければならないから、コンパイルされたコードは、ロックを解除し、インタプリタ110へジャンプするブランチロガー112の幾つかの手続きをコールする。
【0129】
割り込み
コンパイルされたコードの実行中にできる割り込みには、入出力(IO)割り込み、又はMCHK割り込み等の幾つかのものがある。コンパイルされたコードは個々の領域のINTINFフィールドをチェックして、割り込みが起こったかを検出する。コンパイルされたコードはできる限り無限ループのこのフィールド内部をチェックし、常に確実に割り込みを見逃さないようにする。割り込みが起きた場合には、コンパイルされたコードは、完全なK状態にあるインタプリタ110のルーチンIU OINTCHK をコールする。それはインタプリタ110がコンパイルされたコードに戻ることを期待する。
【0130】
インタプリタコールバック
K演算コードの或るものは、OOCTによって変換されない。その代わり、コンパイルされたコードはインタプリタ110のサブルーチンIC OOCTをコールし、その演算コードを変換してコンパイルされたコードに戻す。コンパイルされたコードは、IC OOCTをコールする前に、ESI及びEDIレジスタが正しい値を有すること、及び個々の領域が完全なK状態を有していることを確認する。
【0131】
インタプリタ110は、サブルーチンIC OOCTを実行中にエラーを検出した場合には、手続きOOCT EXCPをよびだし、コンパイルされたコードには戻らない。セグメントロッキングがonの場合、OOCT EXCPはセグメントロックを解除する。
【0132】
例 外(異常)
変換された演算コードが、マスクを外した(unmasked)例外、例えば演算異常、即ちゼロ除数異常等を有している場合、コンパイルされたコードはインタプリタのサブルーチンIC PGMxx をコールする。ここで、xxは01hと21hとの間のエラーコード番号である。インタプリタ110は例外を処理して、戻ろうとする。インタプリタ110が戻れない場合、如何なるセグメントロックも解除するOOCT EXCPをコールする。
【0133】
大域機能の利用
K演算コードの或るもの、例えば文字処理用演算コードは、多数のターゲット演算コードに変換される。これら演算コードの多重変換は、コンパイルされたコードがこれら演算コードを実行するためにコールする大域機能と称するサブルーチンに関するセグメントメモリを多量に使用する。これら大域機能は、それらがコンパイルされたコードからコールされ、コンパイルされたコードに戻るように特別に書かれている点を除けば、丁度、K演算コードを実行するインタプリタ110のサブルーチンのようなものである。5つの演算コードSBE、CC、MV、TS、及びCについて大域機能がある。実験によれば、大域機能はインタプリタ110のIC OOCTエントリポイントをコールするよりも遥かに高速であり、また演算コードをターゲット命令に複数回コンパイルする場合に較べて、遥かにメモリの使用量が少なくなることが示されている。
【0134】
VI. コンパイラ
概観
コンパイル動作の詳細について調べる前に、コンパイラ104の主要目的及びその構造を十分に理解することが重要である。コンパイラ104の目的は、現在実行中のプログラムの多量に実行された部分を最適化ターゲットコードに変換し、実行に当たって、インタプリタ110がこのコードを利用できるようにすることである。
【0135】
図12はコンパイラ104の全体構造を詳しく示す。コンパイラ104は上記ブランチロガー112からシードを受け取り、コンパイル動作を開始する。このシードは、現在実行中のプログラムに於いて多くのブランチのターゲット(目標)であったオリジナル命令のアドレスである。このことは、現在実施中のプログラムの多量実行部分を探索するための始点を与える。ブロックピッカ114はこのシードを、ブランチロガー112によって与えられるその他の情報と併せて使用し、コンパイルされるプログラム部分を取り出す。
【0136】
コンパイル対象のオリジナルコードが選択されると、それは3つの主要段階を経て実行される。第1段階では、K演算コードを、コンパイラ104の残りによって使用される中間言語(IL)に変換する。中間言語は、IL発生器124によって発生される。第2段階では、ILに関する種々の解析及び最適な変換が上記の最適化方法を使用して実施される。この段階は、オプティマイザ(最適化器)126として図示されている。第3段階、即ち最終段階では、ILを再配置可能なマシン語に変換する。この段階は、最適化コード発生ユニット118として図示されている。
【0137】
コンパイラ104の最終の仕事は、インタプリタ110が最適化コードを利用できるようにすることである。セグメントデータ構造は、セグメント導入ユニットを用いて、最適化コードのコピーによって生成される。次いで、セグメントはOOCTバッファ(図示せず)内の共用領域に導入される。変換テーブルは最終的には更新されるので、コンパイルされたKコードに対するインタプリタ110による如何なるブランチも、この新たなオブジェクトコードを代わりに使用する。
【0138】
この項の残りの部分では、上記コンパイラ104のそれぞれの段階を追って詳しく説明する。また、その他種々多くの実施段階の詳細については、この項の終わりで説明する。
【0139】
ブロックピッキング
コンパイラ104は単一シードアドレスを受けて、コンパイル動作を開始する。コンパイラは手続き本体らしきものを読むまで、オリジナル命令を読み取る。次いで、コンパイラは104は次の段階であるIL発生器に、このオリジナル命令セットを送る。コンパイラ104が読んだ命令単位は、基本ブロックと呼ばれ、それ故、この段階をブロックピッカ、即ちブロックピッカ114と言う。
【0140】
この基本ブロックは、制御が最初の命令にしか入れず、また最後の命令からしか出られない一連の命令である。このことは、最初の命令だけがブランチのターゲットであって、最後の命令だけがブランチ命令であることを意味する。また、このことはブロックの最初の命令が実行されると、全ての命令が実行されることを意味する。
【0141】
ブロックピッカ
図13は本発明の一実施形態によるブロックピッカ114の一例を示す。手続きOOCT ParseFrom はブロックピッカ114を具体化する。ブロックピッカは、一度に1つの基本ブロックを読取る。基本ブロックは次の5つの理由の1つに該当するとき終了する。
1.もしパーザ(parser:構文解析系)がブランチ命令を読み取ると、基本ブロックはそのブランチで終了する。
2.もし次の命令が既に構文解析されていると、K演算コードは、1つのセグメントに一度しか現れないから、基本ブロックは現在の命令で終了する。
3.もし次の命令が結合点であれば、結合点は基本ブロックの最初になければならないから、基本ブロックは現在の命令で終了する。
4.もし現在の命令が演算対象となる因子(ファクタ)でって、命令の代わりにデータを伴うことが出来ると、基本ブロックは現在の命令で終了する。
5.もし現在の命令が違法命令であれば、基本ブロックは現在の命令で終了する。
【0142】
ブロックピッカ114は各ブロックを読んだ後、そのブロックの終わり方によって、次に取るべき動作を決める。以下、これら可能な動作をテーブル5に示す。
【0143】
【表10】
Figure 0003553834
【0144】
一例を図13に示す。ブロックピッカ114はシード命令、即ちLB命令で動作を開始する。その命令は終了命令のブランチ又は因子でもないので、ブロックピッカは次の命令に進む。その命令は、条件付きブランチであるTH命令である。ブロックピッカ114は、それが条件付きブランチであるため、それを読むのを停止する。次に、ブロックピッカはLH及びLF両命令に於いて新たなブロックの読取りを継続する。ブロックピッカがSVC命令を読むと、SVCは終了命令の因子であるから、そのブロックを終了する。ブロックピッカはGO命令を読むと、GOはブランチ命令であるから、そのブロックを終了する。L8命令はブランチデスティネーション命令であるから、ブロックピッカはL8命令に於ける読みを継続する。ST8命令を読んだ後、ブロックピッカ114は次の命令を既に読んであるので、そのブロックを終了する。
【0145】
ブロックピッカ114が読む命令の数には上限がある。この制限の目的は、コンパイラ104が変換元命令のコンパイルの間に、メモリを使い果たすのを防止するためである。この制限は、OOCT trace.c の定数 MAX KINST NUM によって設定される。現在の例では500に設定されている。
【0146】
ブロックピッカ114が命令を読もうとするとき、ページフォールトが起こることがある。もしこのページフォールトが起きると、ブロックピッカ114は現在のブロックを読むことを停止しするが、まだ試してない何れかのブランチデスティネーションから読む動作を継続する。このことは、たとえブロックピッカが、シードから到達できる全ての命令を解析できない場合でも、コンパイラ104がセグメントを生成することを可能にする。
【0147】
ブロックレイアウト
ブロックピッカとなる基本ブロックを選択した後、手続きOOCT GenerateILをコールし、コンパイラ104の残りが使用するIL命令を生成する。この時、ブロックの順序を再配置することが出来る。これはブロックレイアウトを呼ばれ、フォワード条件付きブランチを取らない場合には、Pentium Pro は高速で走行するから、コンパイラ104が、Pentium Pro プロセッサにとって更に良いコードを作成する助けとなる。
【0148】
図13の例について考えてみる。この例は1つの条件付きブランチ、即ちTH命令を有している。オリジナル命令に於いて、フォールスルー基本ブロックはLHで始まるブロックであり、デスティネーションブロックはLFで始まるブロックである。条件付きブランチが75%の割合で取られる場合(即ち、分岐する場合)、LF基本ブロックをフォールスルー位置に置き、LH基本ブロックをブランチテイクン(分岐実行)位置に置けば、条件付きブランチは更に速く走行する。
【0149】
OOCT GenerateILはブランチログの情報に従ってブロックを配置する。OOCT GenerateILは可能な限り、条件付きブランチの最も一般的なサクセサをフォールスルー位置に置いて行く。この手続きによって、コンパイラ104の最適化段階に渡されるIL命令のリストが作成される。
【0150】
中間言語(IL)の発生
この項では、K演算子に関するコンパイラ104の中間言語(IL)表現の発生過程を説明する。ILが如何に発生されるかを直接説明する前に、ILの概要を述べ、ILの理解に重要なデータ構造を説明する。
【0151】
ILの概容
コンパイラ104の主な解析及び変換パスは、特別なマシン独立命令セットである中間言語を用いて実施される。中間言語の使用は、2つの主な理由から、標準的なコンパイラ104の技術である。その理由の第1は、ILが解析及び変換を簡単にする典型的な構造を有していること。その第2は、ILによって多くの異なる変換元言語が同じ最適化及びコード発生段階を用いることができ、また異なるプラットフォーム対する再対象化を容易にするからである。
【0152】
OOCTが使用するIL(以下、単にILと言う)は、ここではテーブル6に掲げた40の演算コードから構成される。これらの命令は3つの主なカテゴリに分類される。その第1は、標準マシン演算コードへの簡単なマッピング機能を有するADD及びLOAD等の機能演算コードである。第2は、LABEL及びCGOTO等の制御の流れを扱う演算コードである。そして最後は、バックエンドによって発生されるコードに直接に対応しない、コンパイラ104が特別なマーカとして使用する多くの特別コードである。これら特別マーカコードについては、別の項で説明する。ILは仮想マシン(仮想計算機)を表すから、更に機能が要求される場合はILに対する他の演算コードの追加は簡単である。
【0153】
ILは命令から構成され、それぞれ命令は演算コードの1つ、形式、及び多数の擬似レジスタ引数を特定する。コンパイラ104が支持する形式は符号付及び符号なしの8ビット、16ビット及び32ビット値である。SET演算コードによって用いられる即時値、及びLOAD演算コードによってメモリからロードされる値は別として、全ての引数は擬似レジスタに渡される。この擬似レジスタは、単にILマシンのレジスタである。コンパイラ104は任意の数の擬似レジスタを許容し、これらレジスタはそれぞれ所定のサイズ(例えば、16ビット)を有している。各擬似レジスタは特定の記憶場所に直接対応している。OOCTに関して、これら記憶場所は、個々の領域のOOCT特別部分にある。記憶場所への擬似レジスタのマッピングには2つの利点が有る。その第1は、ILを連続的に流す。共通使用の値を一時的にロードし、それらをメモリに戻して記憶する、と言ったIL動作は必要がなくなる。第2に、コンパイラ104は共通使用の値をマシンレジスタに頻繁に割り当てることが出来るので、余分なロード又は記憶動作を省くことが出来る。
【0154】
【表11】
Figure 0003553834
【0155】
【表12】
Figure 0003553834
【0156】
特別IL演算コード
OOCTのILは特別なオブジェクトを持った幾つかの演算コードを含んでいる。殆どのIL演算コードは、バックエンドで発生されるコードに対応する。その代わり、これら特別命令は、何か特別なことが起きたことをコンパイラ104に知らせる信号として作用する。ILは次の特別演算コード、ENTRY 、SYNC、EXTMOD、及びOASSIGN を含んでいる。この項では、これら演算コードの最初の3つについて説明する。OASSIGN については、上記テーブルで十分に説明されている。
【0157】
ENTRY 演算コードは<制御がフローグラフに入れる点をマークする。OOCTによって発生されるコードは、外部結合点を表す複数の外部エントリポイントを有することができる。各外部エントリポイントは、対応するENTRY IL命令を有している。ENTRY 命令はコードの終わりで発生し、その直ぐ後にコードの主本体内のラベルにジャンプするGOTO命令が続いている。ラベルに直接ジャンプする外部エントリジャンプを持つ代わりにエントリを使用する理由は、ENTRY とラベルへのジャンプとの間に、コード発生器によるフィル(fill)挿入を可能にするためである。
【0158】
図14は、ENTRY 命令とGOTO命令との間に、フィルを挿入した2つの外部エントリポイントを持つコードの概略を示す。即ち、図14は本発明の実施形態によるエントリの例を特に示した図である。
【0159】
SYNIC 演算コードは、擬似レジスタの1つの範囲がメモリにフラッシュされたことを保証するのに用いる。特に、OOCTはSYNCを用いて、インタプリタ110が全てのKレジスタを見出せると期待する記憶場所に、全てのKレジスタがあることを保証する。SYNCはレジスタのアロケータに対するディレクティブ(指示)として作用し、修正されたマシンレジスタにある擬似レジスタをフラッシュすべきことを示す。また、SYNCは、Kレジスタを修正する効果しか持たないコードを除去するデッド(不動作)コードから、コンパイラ104を保護する如何なるライブ(生)データも使用する。
【0160】
EXTMOD演算コードは、擬似レジスタが修正されたが、コンパイラ104はその修正の詳細は持っていないことを示す。従って、EXTMODは2つの効果を有する。その第1は、定数畳込み、又はコピー伝播等の最適化に対する障壁として作用する。第2には、擬似レジスタの次の使用前に、コンパイラ104のレジスタアロケータにフィル挿入を実行させる。OOCTに於いて、EXTMOD命令はインタプリタ110にコールバックした後、どのKレジスタが修正されたかを指示するのに用いられる。
【0161】
ILデータ構造
ILがどの様にしてK演算コードから構成されるかを説明する前に、コンパイラ104で使用される主なデータ構造に親しんでおくのは有効である。
【0162】
ZONE(compiler/zone.[h,c])
コンパイラ104に於けるメモリの割付は、ZONEと称する抽象化(論理化)によって取り扱われる。ZONE抽象化は効率的なメモリの割付方法であって、一挙に割付解除もできる。ZONE抽象化によって割付は高速化すると共に、ZONEの破壊は用いた全てのメモリを再利用するので、プログラマはメモリのリークを心配する必要がない。
【0163】
コンパイラ104に於いて、ZONEは生成され、メモリを割り付ける全てのコール(即ち、通常 malloc calls )は、初期に生成されたZONEを用いてZONE ALLOCをコールする。コンパイラ104が実行されると、コンパイラは、全ZONEを割り当て解除するZONE Destroy をコールする(即ち、全てのメモリの割当解除と同等のことをする)。
【0164】
ZONEの基本的実施では、メモリの“チャンク(chunk :大きな塊)”を使用する。例えばZONEを生成するとき、サイズが0x2000バイトのブロックをマロック(malloc)する。ZONE Allocに対するコールは、メモリのその“チャンク”を使い切るまで使用する。最初の0x2000バイトでは、ZONE Allocの要求に応える余裕がない場合には、新たな“チャンク”が生成される。そして、ZONE Allocはその“チャンク”を使い切るまで使用する。
【0165】
コンパイラ104の場合、メモリは全て事前に割り付けられているため、事態は些か複雑になり、そのためマロックをコールすることが不可能である。其処で、代わりとして特別なZONEアロケータユニット(即ち、ZALLOCユニット)を使用する。ZONEアロケータは大きなメモリプール(例えば、0x10000 バイト)によって初期化される。この初期化によって、メモリはZONEが割付に使用する同サイズのチャンクに分割され、自由なチャンクのリストが保持される。従って、“マロック”要求は、メモリの自由な“チャンク”を返すZALLOC get chunk に対するコールによって置き換えられる。同様に、ZONE Destroy の“free”へのコールは、ZALLOC free chunk へのコールによって置き換えられる。現在の実施形態では、ZONE Alloc が扱う最大割付サイズは、初期チャンクサイズである。この制限は、単に1つのサイズを扱う代わりに、可変サイズの割付を扱うようにZALLOCユニットを変更することによって、“固定化”することができる(この種のアロケータの例については、セグメントアロケーションユニットを参照)。ここで上記のような変更をしなかったのには、2つの理由がある。その第1は、可変サイズアロケータは更に複雑であって、記憶領域の断片化等の問題を生成するからである。第2は、チャックサイズは不利な影響なしに大きくできるものではないからである。チャックサイズが十分に大きい場合、もしコンパイラ104がメモリを越えて走っても、コンパイラ104はチャックサイズより大きい単一割付を要求するだけである。従って、可変サイズの割付を扱うためにZALLOCユニットを一般化することに何ら現実的利益はない。
【0166】
IL CTXT(compiler/oc common/include/il internal.h)
コンパイラ104は、コンパイル動作の現状トラックを保持する単一データ構造IL CTXTを維持している。このIL CTXTデータ構造は、現在コンパイルされているコードを表すIL NODEの連結リストに対するポインタを記憶している。また、IL CTXTは、ZONE及びIL FRAME 構造等、コンパイル処理を通して用いられる種々のフィールドを数多く記憶している。コンパイラ104の各段階は、引数としてのIL CTXTを有し、そのデータ構造に対して、例えば多くの段階がIL NODEを追加又は削除する等の修正を行う。
【0167】
IL NODE(compiler/oc common/include/il internal.h)
IL NODEデータ構造は、K演算コードから変換されるコンパイラ104の中間言語の単一抽象命令を表す。
【0168】
K演算コードから発生されるIL NODEは、二重連結リストに保持される。このリストの最初と最後の要素に対するポインタは、IL CTXTに保持される。このリストはコンパイラ104が現在動作しているコードを表す。コンパイラ104の各パスはこのリストを横断し、リストのコードに関する情報を発生するか、又はリストを変換する。
【0169】
各LI NODEは命令の基本性質を示す演算フィールド“op”を含んでいる。また各LI NODEは命令のオペランドを表すオペランドフィールドのベクトルを含んでいる。オペランドフィールドの解釈は命令の演算形式に依存している。演算及びオペランドフィールドに加えて、全てのIL NODEは、全てのノード形式によって共用される多くのフィールド、例えばノードを変換する命令のK pc、ノードのために発生されたターゲットマシンコードの開始アドレス等を含むんでいる。
【0170】
ノードに於けるオペランドフィールドの数は、演算形式によって変化する。事実、場合によっては、同じ形式の2つのノードが異なる数のオペランドを持つこともある。例えば、コール動作のためのオペンランド数は、ターゲット方法に対してパスされた引数の数に依存する。このオペンランド数の変化は、IL NODEが一貫したサイズではなく、オペランドベクトルがIL NODE構造に於ける最終項であることを意味する。オペランドベクトルは一エントリ長さであると宣言され、そしてIL NODEは、共通フィールド及びオペランドフィールドに必要な全記憶量を計算/割り付けし、割り付けられたメモリをIL NODEポインタにキャストすること(casting) によって割り付けされる。
【0171】
全てではないが殆どの場合、各オペランドは、オペランドベクトルに関して、2つの連続したエントリを実際に要求する。オペランドは、擬似レジスタのエントリオペランド[i] に見出される。もしオペランドがデスティネーションオペランドであれば、オペランド[i+1] は、この演算によって定義される値を用いるノードリストを指し、もしオペランドがソースオペランドであれば、オペランド[I+1] は、値に関する定義を含むノードリストを指す。
【0172】
もし演算がデスティネーションオペランドを持っていれば、そのオペランドは常にオペランド[0] 及びオペランド[1] に記憶される。
【0173】
もしオペランド[i] がソース(入力又は使用)オペランドであれば、オペランド[i+2] もまたソースオペランドである。即ち、全てのソースレジスタはオペランドリストの終わりに来なければならない。
【0174】
ノード中のオペランドフィールドには直接アクセスはできない。むしろ、アクセスはILOP xxx(N)形の大きなマクロセットによって行われる。ここで、NはILNODEに対するポインタである。これらマクロは、種々の命令形式全てに関して、如何に種々のオペランドがオペランドベクトルに記憶されているかを知っている。
【0175】
ノード形式のいくつかを以下に示す(このリストは、全てを含むものではない)。
【0176】
単項演算
これらは、割当を含む種々の簡単な単項(1ソースオペランド)命令を表す。
形式:演算の形式
ILOP DEST(N)
結果が向かうデスティネーションレジスタ
ILOP DEST use(N)
デスティネーションレジスタを使う命令のリスト
ILOP SRC(N)
ソースレジスタ
ILOP SRC def(N)
ソースを定義する命令のリスト
【0177】
2進演算
多くの2進(2ソースオペランド)命令はこのカテゴリによって表される。
形式:演算の形式
ILOP DEST(N)
結果が向かう行く先レジスタ
ILOP DEST use(N)
デスティネーションレジスタを使う命令のリスト
ILOP SRC1(N)
第1ソースレジスタ
ILOP SRC1 def(N)
第1ソースを定義する命令のリスト
ILOP SRC2(N)
第2ソースレジスタ
ILOP SRC2 def(N)
第2ソースを定義する命令のリスト
ILOP DIVEX(N):
このオペランドは、DIV 及びREM 演算にのみ現れ、もしゼロによる除算例外が在ればその開始を表すノードを含む(単独)リストを指す。
【0178】
LABEL
LABEL命令は、コード内のポイントを表し、このポイントに向かってブランチは分岐する。この命令は、以下のオペランドを含む。
ILOP LABEL(N)
ラベルを識別する固有の整数
ILOP LABEL refs(N)
このラベルを参照する命令のリスト
ILOP LABEL live(N)
何れのレジスタがこのレベルで活性であるかを示すBITSET
ILOP LABEL rd(N)
このラベルに到達する各レジスタの定義リストのベクトル
ILOP LABEL misc(N)
このレベルに関する専用情報(private info)を掛ける(hang)ための何れかのパスの場所
【0179】
GOTO
GOTO命令は、ラベルへの無条件ブランチを表す。
ILOP LABEL(N)
ターゲットラベルを識別する固有の整数
ILOP LABEL refs(N)
このターゲットLABEL 命令の単独リスト
【0180】
CGOTO
CGOTO命令は、ラベルへの条件付ブランチを表し、GOTO命令と同じオペランドを含むと共に、幾つかの追加オペランドを含む。
ILOP COND(N)
レジスタは分岐するための条件を含んでいる。このレジスタはブール形式の値を含む。この分岐は条件がTRUEであるときに行われる。
ILOP COND defs(N)
このレジスタを定義する命令のリスト
ILOP COND live(N)
分岐が行われない場合、何れのレジスタが活性であるかを示すBITSET
【0181】
特殊な命令マクロILOPに加えて、何れの命令にも使用できる多くの汎用マクロがある。
ILOP HasDEST
命令がデスティネーションレジスタを有していれば、TRUEを返す。この場合、ILOP DEST及びILOP DEST use マクロは、この命令に関して使用できる。
IL OP START 、 IL OP DONE 、IL OP NEXT
命令のソースレジスタを介したくり返し動作に用いられる。IL OP START は第1のそうしたソースレジスタを参照して、IL OP INDEX に帰り、IL OP DONEはIL OP INDEX をテストして、ソースレジスタを参照したか否かを調べ、IL OP NEXTは次のソースレジスタに進むのに使用される。
IL OP 、IL OP def
これらは、与えられたIL OP NEXTに対して特定のソースレジスタ及びそれに関する定義リストを返す。これら5つのマクロは、一般に、以下の形のループで使用される。 for(op=IL OP START(n);!IL OP DONE(n,op);op=IL OP NEXT(n,op)) }use IL OP (n,IL FRAME(compiter/oc common/include/il frame.h, compiler/OOCT Frame.c)。
【0182】
IL FRAME データ構造はコンパイルされたコードが実行する文脈に関する情報を与えるのに使用される。フレームは、各擬似レジスタに関するサイズ及び記憶場所、擬似レジスタが他の擬似レジスタと如何に重なり合うか、レジスタアロケータで使用するのに何れのマシンレジスタが正当であるかを決める。更にIL FRAME 構造はコードをコンパイルする上で、Cスタックフレームが必要か否かを決める。OOCTでは、Cスタックフレームは使用しない。
【0183】
コンパイラ104では、IL FRAME 構造はOOCT Frame.c の機能によって初期化される。これらの機能は、Kレジスタ及びPSW場所に対応する各擬似レジスタを準備する。更にコンパイラ104の一時的擬似レジスタは、インタプリタ110の作業空間領域に対応するように設定される。また如何にKレジスタが重なり合うかについての情報も準備される。
【0184】
NL LIST(compiler/oc common/[include, src]/nl nodelist.h)
コンパイラ104がIL NODEのリストを使用する多くの場所で、NL LISTデータ構造は、これらノードリスト操作のための抽象化(論理化)を与える。例えば、上述のUseDef解析は、与えられた定義を用いるIL NODEのリスト、及び与えられた使用に対する定義であるIL NODEのリストを生成する。NL LISTは簡明であって、ノードリストに関する生成、加算、削除、検索、並びに反復等の能力を与える。
【0185】
K演算コードのIL変換
上述のブロックピッカ114が、何れのK演算コードをコンパイルするかを選択した後、K演算コードのILへの変換は3つの主な段階を含んでいる。第1の段階は、そのコードが基本ブロックに対して発生される順番を決める段階である。ブロックレイアウト法については先に述べた通りである。第2段階は、K演算コードの基本ブロックがブロックレイアウト法によって選択された時、その演算コードを調べて、それらが“論理演算コード”と組合せ可能か否かを決定する段階である。最後の第3段階は、K演算コード及びその引数に基づいて、IL発生手続きをコールする段階である。
【0186】
Opcode Combination(compiler/ooct opcode combine.c)K演算コードの幾つかのシーケンスは、単一の“論理”コードとして書くことができる。例えば、2つのTR命令からなるシーケンスを用いて、32ビットレジスタ対の値を、それら命令の各半分をテストすることによってテストすることにした。これら2つのTR命令は、Kアーキテクチャでは利用できない論理32ビットのテスト演算コードを表す。IL形成手続きが2つのTR命令に関して生成するコードは、多かれ少なかれ、このパターンが認識された場合に生成されるコードに較べて能率的である。幸い、OOCTはソフトウエアであるから、新たな演算コードを加え、パターンを認識する特別なユニットを具備し、能率的なIL発生を代行させることは容易である。
【0187】
与えられた演算コードに対して標準ILを発生する前に、OOCT opcode combine ルーチンがコールされる。このルーチンは、定義された全てのパターンについて、“論理”演算コードを使用することが適当かどうかを繰り返し試す。現在、2つのパターンだけが定義されているが、追加の組合せを定義することは簡単である。パターンの1つが一致すれば、その論理演算コードのIL形成手続きは、IL命令の生成に使用され、OOCT opcode combine は通常のIL形成手続きをコールする必要がないことを示す“真”を返してくる。
【0188】
IL形成手続き(compiler/ooct il build.c)
各K演算コード対して、特定のIL形成手続きがある。IL形成手続きは2種類の引数、命令のアドレス、及びオリジナル命令のフィールドである引数リストを採る。また、IL形成手続きは、ILを発生する間に、擬似レジスタ及びラベルのトラックを保持するのに使用される共用大域変数global gen state を使用する。各IL形成手続きは、IL命令をIL CTXT構造に加える。コンパイル時に検出される例外のチェックを取り扱う、数少ない特別な場合を除けば、ラベルの識別子(ラベルがもう1つ別のオリジナル命令のターゲットでなければ、ラベルは最適化過程で早期に削除される)は、一般に最適化を実施しようとせず、それを後段のコンパイラ104の段階に残すので、全てのIL発生ルーチンは、オリジナル命令のアドレスを有する LABEL IL ODE を生成する。
【0189】
IL形成手続きの殆どは、コードが発生されるIL及びオリジナル命令が一旦分かれば簡単である。このコードの理解を助ける幾つかのヒントがある。
【0190】
ILの形成は与えられた演算コードのコンパイル動作がデバッギングに際して、容易にoffできるように設計されてきた。これは主として、REALLY COMPILE マクロ及び COMPILE SECTION XXマクロによって制御される。REALLY COMPILE がoffされると、全てのIL形成ルーチンは、簡単にインタプリタ110へのコールバック(又はジャンプ)を形成する。 COMPILE SECTION X がoffされると、区画番号Xの演算コードに対する全てのIL形成ルーチンは、簡単にインタプリタ110へのコールバック(又はジャンプ)を形成する。
【0191】
ILには所定の形式があるから、正しい形式を持った正しいサイズの擬似レジスタを使うことが重要である。例えば、16ビットの値を32ビットのレジスタにロードするには、先ず初めに16ビットロードを16ビットレジスタに対して実施し、次いでCVT演算を用いて16ビットの値を32ビットの値にキャストする(LOAD CVT32 マクロがこの動作を行う)。
【0192】
インタプリタへのコールバック又はジャンプを挿入する際には何時でも、インタプリタ110がKレジスタに対して正しい値を持っていることを確かめるため、SYNCを追加しなければならない。コンパイルされたコードは、ESIレジスタの値をそのままに保とうとはしない(事実、それは他の値を保持するのに用いられる)。それ故、発生したコードはインタプリタ110をコール又はそれにジャンプする前に、正しい値をESIに入れなければならない。またコールバックをする場合、コードはコールバックによって修正された全ての擬似レジスタに対するEXTMOD命令を含んでいなければならない(MODIFIES REG マクロがこれを実行する)。
【0193】
例外条件(例えば、オーバフロー)を扱うコードはインラインには設けられていない。その代わり、コードはIL命令リストの終わりで発生される。斯うして共通ケースをフォールスルーとしてコンパイルすることができ、発生されたコードの性能が典型的に改善される。
【0194】
エントリポイント、割り込みポイント
ブロックピッカ114によって選択された各K演算コードに対して発生されるILに加えて、ILはエントリポイント、割り込みチェックに対しても発生される。
【0195】
最適化動作をより多く起こすために、全てのブランチデスティネーションは外部エントリポイントとして含まれてはいない(外部エントリポイントは最適化動作に対してバリアとして作用する)。特に、外部エントリポイントの中へ作られるデスティネーションだけが、セグメントの外側からのジャンプの対象となるデスティネーションである。与えられたセグメントをコンパイルするとき、何れのデスティネーションがブランチログに於るこの基準に適合するかについての部分情報は利用可能である(ブランチログに関する情報については先の説明を参照)。コンパイラ104はこの情報を使って、何れの基本ブロックが外部エントリを持っているかを選択する。これらエントリの各々に対して、ENTRY IL NODEは、エントリオリジナル命令に対して発生されたILにジャンプするGOTO IL NODEと共に発生される。
【0196】
OOCTスペックは、コンパイラ104が如何なるループにも割り込みチェックを挿入すべきことを指示する。ILを発生する際、セグメント内の逆方向ブランチに対し計算されたジャンプ命令以前に、割り込みチェックを入れることによって、保守的概算を行う。割り込みチェックは、基本ブロックの最終オリジナル命令に対するラベルの後に入れられる。他の例外条件の場合、割り込みのためのILコードはラインから発生されるから、通常の場合は条件付きブランチの簡単なフォールスルーである。
【0197】
コンパイラのミドルエンドに関する説明
ミドルエンドの概容
コンパイラ104の“ミドルエンド”の主な目的はコード発生の段階で、更に良好なコードが発生するように、ILの品質を改善することである。コンパイラ104の残りの部分は、ILの解析又はILを修正する変換の何れか1つを実施する一連のパスとして構成される。これらのパスの間には或る依存性があるが、それらは複数回適用できる。この点から、コンパイラの残りの部分はK命令について何ら特別な情報を持たず、ただILを処理するだけである。
【0198】
この項の残りの部分を以下のように分ける。第1部では、OASSIGN 挿入を実施する段階について述べる。また、第2部では、コンパイラ104の解析パスについて述べる。最終部では、コンパイラ104の変換パス(主な最適化を実施する)について述べる。
【0199】
OASSIGN 挿入(compiler/ooct add overlap defs.c)
図15はOASSIGN 挿入の一例を示す。OASSIGN 演算コードは、擬似レジスタ間のエイリアシング(aliasing)を明確にする特別なマーカ命令である。OOCTに於いて、或るK演算コードは16ビットのレジスタを使用し、一方では、他の演算が16ビットレジスタとは別の32ビットのレジスタを使用するので、OASSIGN に対する必要性が生じてくる。OOCTでは、16ビット及び32ビットのレジスタ全てに対して別々の擬似レジスタが使用される。それ故、擬似レジスタの或るものは、互いに暗黙の重なりを形成する。その結果、2つの問題が起こってくる。先ず、第1の問題は不正確な変換を実行する最適化パスの問題である。各擬似レジスタの定義に関して、コンパイラ104はその定義を使って命令のトラックを保持し、そして各擬似レジスタの使用に関しては、コンパイラ104はその定義のトラックを保持する。この情報はuse/def 情報と呼ばれる。コンパイラ104は、例えばConstant Foldingパス等のパスではこのuse/def 情報を使用する。擬似レジスタが互いに別物である場合には、use/def 計算とその情報を使うコンパイラ104のパスが要求されるため、事態は更に複雑となる。擬似レジスタの重なりから起こる第2の問題はレジスタの割当問題である。レジスタアロケータが2つの重なり合う擬似レジスタを同時にマシンレジスタに割り当てる場合、1つのレジスタに対する修正は他のレジスタを無効にすることを要求する。一般に、情報トラックの保持は非常に困難で、不必要な複雑さを惹起する。
【0200】
これらの難問に取りくみ、それらをコンパイラ104の複雑さに加える代わりに、コンパイラ104が問題を無視できるような、特別マーカのOASSIGN 命令の挿入方法が設計された。この方法によれば、IL発生直後、特別コンパイラはこのOASSIGN を挿入する。このコンパイラ104のパスの後、他の解析パスは擬似レジスタと重なりを持っていないと仮定することができる(use/def 解析に関して)。更に、レジスタ割り当てはOASSIGN を用いて全く容易に取り扱われる。レジスタアロケータがOASSIGN に到達すると、アロケータはその定義に於いてソースを除いて、OASSIGN の後にデスティネーションを入れる。この方法は別のメモリを使用して、重なり定義の如何なる使用も、正しい値を使用していることを保証する。
【0201】
OASSIGN 挿入は2つの段階で取り扱われる。その第1はUseDef解析の特別バージョンが実行される段階である。UseDefのこのバージョンは擬似レジスタの重なりに気付いて、重なり擬似レジスタを含む使用リスト及び定義リストを生成する。コンパイラ104の残りの部分は、重なり擬似レジスタを含むuse/def リストを取り扱うようには用意されていないため、Use/Def に対するこのオプションは、一般には使用されるべきではない。この解析が行われた後、手続きOOCT Add Overlap DefsはOASSIGN を実際に挿入する。OASSIGN は重なり定義(即ち、使用擬似レジスタと重なる擬似レジスタを定める定義)を持つ全ての使用、及びラベルに於ける重なり到達定義に関して挿入される。
【0202】
図15はOASSIGN が挿入される場合の例を示す。この例では、擬似レジスタGRPAIR1とGR1 が重なり合っているので、コードの第1ラインのGRPAIR1 に対する割付は、GR1 の暗黙の修正である。OASSIGN はこれを明確にする。
【0203】
解析パス
UseDef(compiler/oc common/src/oc usedef.c)
与えられた定義の使用、及び与えられた使用に対する潜在的定義の計算は、最も基本的なコンパイラ104解析の1つである。全てのコンパイラ104の最適化パスはuse/def 情報を使用する。各IL命令は(a dest)に書き込まれる1つの擬似レジスタ引数、及び(a src) から読み込まれる1つ又はそれ以上の擬似レジスタ引数を有している。Use/Def 解析の後、各destはその解析に関連し、その値(du chainと呼ぶ)を使用する全IL命令に対するポインタを記憶するリストを有する。同様に、各src はその解析に関連し、その値(ud chainと呼ぶ)を定義する全IL命令を記憶するリストを有する。use/def 情報を計算する方法を以下に述べる。この方法は、固定点への到達を試みる反復方法(即ち、繰り返しても変化が起こらなくなるまで繰り返す方法)である。
【0204】
如何なるラベルに於いても、到達定義に変化が起こらなくなるまで、以下のステップを繰り返す。
regdefs (擬似レジスタによって指標付けしたNL LISTs 配列)に於ける各擬似レジスタに関する定義リストをクリヤする。
静的プログラム順にIL NODEs を繰り返す。
もし命令が擬似レジスタを使用していれば、擬似レジスタの定義をregdefs からオペランドのud chainにコピーする。
もし命令がブランチであればregdefs をブランチのLABEL に記憶されている到達定義と組み合わせる。到達定義の変更によって、全ループが繰り返される。
もし命令がLABEL であれば、regdefs を既にLABEL に在る到達定義と組み合わせる。
もし命令が擬似レジスタを定義していれば、regdefs の定義リストがこの命令だけを含むようにセットする。
もし命令が無条件ブランチであれば、regdefs 配列を次のLABEL に記憶されている到達定義のセットに変える。これは、次の理由から実行される。即ち、命令はそれらの静的順に処理され、そして無条件ブランチへの到達定義は、その静的サクセサに到達する定義とは同じではないからである。
【0205】
ライブ変数解析(compiler/oc common/src/oc usedef.c)
もう1つの解析の形は、ライブ変数情報に対するものである。ライブ変数解析は主にレジスタの割付に用いられるが、誘導変数変換及びデッドコード削除にも使用できる。擬似レジスタは、もしそれが再定義される以前に実行経路に沿って用いられる場合には、プログラムの特定の点に於いてライブ変数と考えられる。またライブ変数解析は与えられた擬似レジスタの最終使用をマークする(擬似レジスタの再定義以前に、擬似レジスタが使用される可能性のある実行経路がなければ、その使用が最終使用となる)。ライブ変数情報の計算に用いる基本的な方法を以下に述べる。この方法は固定点に到達するまで、コードに関する逆方向パスを繰り返し実行する。
【0206】
如何なるラベルに於いても、到達定義に変化が起こらなくなるまで、以下のステップを繰り返す。
ライブ変数をクリヤする(擬似レジスタのbitset)。
逆静的プログラム順にIL NODEs を繰り返す。
もし命令が擬似レジスタを使用していてかつそれを最終使用としてマークする以前にライブでなければ、擬似レジスタのビットをライブ変数にセットする。
もし命令がブランチであれば、ライブ変数をブランチのLABEL に記憶されているライブレジスタと組み合わせる。ライブレジスタの変更によって、全ループが繰り返される。
もし命令がLABEL であれば、ライブ変数を既にLABEL に在るライブ擬似レジスタと組み合わせる。
もし命令が擬似レジスタを定義していれば、擬似レジスタをライブ状態からクリヤする。
もし命令が無条件ブランチであれば、ライブ状態をクリヤする。これは、次の理由から実行される。すなわち、命令をそれらの逆静的順で処理するため、無条件ブランチに於けるライブ変数はそのサクセサのものとは同じではないからである。
【0207】
レジスタの割付(compiler/oc common/src/oc regalloc.c) コンパイラ104に於けるレジスタの割付は二段階で実施される。第1段階ではコードの解析を行って、ターゲットマシンの高レベルモデルに基づいて一組の推奨レジスタ割付セットを決定する。第2段階では、物理レジスタを使用するために、第1段階に於ける解析結果を更に抽象性の少ないマシンモデルと共に用いて、実際にコードを修正する。この項では、第1段階について説明する。
【0208】
レジスタ割付方法はグラフ着色を用いる伝統的技術に基づいて行われる。“グラフ”のノードは、重なり合うライブ範囲の間にあるエッジを持つ擬似レジスタのライブ範囲である。N個のカラーによるグラフ着色は、各ノードに対してN個のカラーの1つを割り当てる。従って2つの連結したノードが同じカラーを持つことはない。もしライブ範囲のグラフがN個のカラーで着色できれば(N:利用可能な物理レジスタの数)、レジスタは各ライブ範囲に割り付けられる。しかし、不幸なことに、このグラフ着色にはNP困難(NP−hard) 問題(即ち、それは指数的時間を要求する)があるため、実際には、発見的(試行錯誤的)方法が用いられる。
【0209】
レジスタ割付は複雑な多重ステップ処理で構成されている。これらのステップを以下に詳しく説明する。
【0210】
1.独立ライブ範囲の分割、及びREGINFO 構造の割付
これらの処理は、ComputeRegInfo機能によって行われる。この機能は各擬似レジスタを独立なライブ範囲に分割し、その各々に対してREGINIFO構造を割り当てる。REGINFO 構造はレジスタ割付に用いられる問題のライブ範囲に関する情報を保持するのに使用され、最終的には“ターゲット”レジスタ(ライブ範囲に割り当てられる物理レジスタ)を保持する。擬似レジスタライブ範囲(論理構造)とREGINFO 構造との間には1対1の対応があるので、REGINFO 項はライブ範囲とデータ構造の両者を参照するのに屡々使用される。
【0211】
ComputeRegInfoは、REGINFO 構造を割り付ける際の殆ど副次的効果としてライブ範囲の分割を行う。ComputeRegInfoは、未だREGINFO を持たない定義から始めて、それに対して新たなREGINFO を生成し、次いで繰り返しその使用の全て及びそれらの定義の全て(及びそれらの使用の全て...)を調べて、新たなREGINFO を到達可能な全ての定義及び使用と組み合わせる。
【0212】
一旦、全てのREGINFO が生成されると、それらは“簡単な”ものと、“複雑な”ものとに分けられる。“簡単な”REGINFO は、
正確に1つの定義と1つの使用を有している。
使用は定義の直ぐ後に続く。
使用はBINOP (ターゲット特別要件)の第2オペランドではない。
【0213】
その他のREGINFO は全て複雑である。各REGINFO には固有のIDが与えられる。複雑なREGINFO は、 [0..c−>ri complex)の範囲にあり、簡単なものは、[c−>ri complex..c−>ri total)の範囲にある。この分割の目的は、全てのREGINFO にBITSETとして記憶されているコンフリクト(競合)マトリックスを保持するメモリを節約することである。
【0214】
2.コンフリクトと互換性の計算
次のステップは、REGINFO 構造のコンフリクトグラフを計算するステップである。2つのREGINFO は、それらのライブ範囲が重なり合うとコンフリクトを起こす。しかし、もしそれらがコピーで接続されていれば互換性を持つ。コンフリクトするREGINFO は同じレジスタには割り当てられない。何故なら、それらは同時に生きているからである。2つの互換可能なREGINFO は出来れば同じレジスタに割り付けすべきである。そうすればコピーは削除される。
【0215】
コンフリクトはグラフ(各REGINFO に対するノード、及び各REGINFO ノードとそれとコンフリクトする各その他のノードを結ぶ無向性エッジ−−これはグラフ着色法によって用いられる視点である)として、又は対称2進マトリックスとして考えられる。後者の形はコンフリクトが実際に記憶される仕方により近い。
【0216】
各REGINFO はコンフリクトマトリックスの一行(部分)である単一BITSETを含んでいる。2つの簡単なREGINFO はコンフリクトしないから、マトリックスの下部右4分画は全て0である。また、マトリックスは対称であるから、上部右4分画は下部左の入れ換えである。結果として、マトリックスの左側は全て記憶される必要がある。従って、コンフリクトBITSETは、 c−>ri total の代わりに、それぞれ c−>ri complex ビットだけである。
【0217】
2つのREGINFO 、A及びB、がBITSETとコンフリクトしているか否かを決めるには、先ずそれらが簡単か又は複雑かを見るためのテスト(idと c−>ri complex との比較)が必要である。もし何れかが複雑であれば、そのIDに対応するビットを、他のREGINFO のコンフリクトBITSETに於いて調べる。もし両者が複雑であれば、何れかのビットを調べる;それらは同じでなければならない。もし何れも複雑でなければ、それらはコンフリクトしない。
【0218】
コンフリクトはIL(ComputeLive によって発生される)に記憶されたライブ情報から計算される。ComputeConflictsはILコードに関して単一パスを実行し、現在点に於けるセット擬似レジスタライブから、その点に於ける複雑なREGINFO のBITSETを発生する。各複雑なREGINFO はライブセットに加えられるから、それは既にライブセットにある全てのREGINFO とコンフリクトしている、とマークされる。各簡単なREGINFO に出合うと、それは現在のライブセットとコンフリクトしている、とマークされる。
【0219】
3.“レジスタ優先順位”関するREGINFO の分類
OC SortRIは、種々の調整可能なパラメータに基づいて、REGINFO 構造に順位を付ける。ウエイト(重み付け)パラメータは相互に関連にしているから、それら全てに定数を掛けても何らの影響も持たない。
OC RegAllocConfictWeight :
これはコンフリクトグラフのグラフ着色に置くウエイトであって、このパラメータを高く設定すれば、より多くの異なるREGINFO をレジスタに置く割付にとって有利となる。その場合、それらREGINFO が実際にどの程度の頻度で使用されるかは関係ない。殆ど使用しないREGINFO は短命になる傾向にあり、長命なREGINFO には、おそらく有利に働くことに注意されたい。
OC RegAllocDefWeight :
これは定義に置くウエイトであって、この値が高ければ、多くの異なる定義のIL文を有するREGINFO にとって有利となる。
OC RegAllocUseWeight :
これは使用に置くウエイトであって、OC RegAllocDefWeight 及びOC RegAllocUseWeight の両者は、長命でなおかつ多くのuses/defs を持つREGINFO (但し、長い時間、使用しないで、ただ“ぶら下がっている”REGINFO ではない)に有利に働く傾向がある。
OC RegAllocResortRate:
このパラメータは、良好な着色を得るのに、どの位多くの分類をするかを制御する。OC RegAllocConfictWeight が0の場合、このパラメータは無関係であり、0(==無限)となるべきである。この値が小さいとき(>0)は、より多くの時間が費やされ、良好な着色が得られたことを意味する。
【0220】
4.レジスタの選択
一連の制約条件が一度はREGINFO に適用される。最初の幾つかの制約条件は必須条件であって、それを適用した後、もしレジスタが残っていなければ、REGINFO はレジスタに割り当てられない(ターゲット=−1)。残りの制約条件は望ましいが、必須条件ではない。もし与えられた制約条件の何れかによって、可能なレジスタセットが空になれば、その条件は飛ばす。一旦、全ての制約条件を適用したら、レジスタセットから最も低い番号のレジスタを選んで、それを使用する。
【0221】
TYPE [必須] :この形式(マシンモデルからのinfo)の値を保持するレジスタを選択しなければならない。
INUSE[必須] :コンフリクトするREGINFO (又はそれと重なり合うもの)に既に割り当てられているレジスタを選択することは出来ない。
BASEREGS [必須] :フレームがある種のフレーム/スタック/ベースポインタとして確保するレジスタを使用することは出来ない。
CLOBBERED :REGINFO の寿命期間中に誰かによって修復されたレジスタを使おうとしてはならない。
DEF CONSTRAINTS :このREGINFO を定義する各ILに対するマシンモデルからのDEST制約条件に合うレジスタの使用を試みる。
USE CONSTRAINTS :このREGINFO を定義する各ILに対するマシンモデルからのSRC 制約条件に合うレジスタの使用を試みる。
COMPATIBILITY :既にレジスタに割り当てられた互換性リスト中のもう1つ他のREGINFO と互換可能なレジスタの使用を試みる。
【0222】
一旦、全てのREGINFO のレジスタに対する割付が完了(又は失敗)したら、互換性制約条件を介して変化するレジスタを探すREGINFO (即ち、このREGINFO の後に割れ付けられる互換可能なREGINFO であって、ある理由から同じレジスタには入れないREGINFO )に関してもう1つのパスを実行する。
【0223】
変換(最適化)パス
変換パスは最適化コンパイラ104の心臓部にある。各パスはコードの意味を残すようにし、かつ生成された最終コードが高速で走行するようにして、コードの一部書き換えを試みる。変換パスの或るものは、それ自身ではコードを改良しない代わりに、他のパスにコードの改善を行わせる。それ故、変換パスは組合せによって最良の仕事をする傾向があり、単独では効果が薄い。斯うした理由から、多くのパス、例えばDead Code Elimination パスが繰り返し実行される。
【0224】
Dead Code Elimination (compiler/oc common/src/oc usedef.c)
Dead Code Elimination パス (OC ElimDeadCode) は、データフロー情報及び制御フロー情報の両者に基づいて、デッド(不動作)コードの全てを除去する。データフロー情報は何ら副次的効果を持たず、その結果が使用されないIL NODEを消去するのに用いられる。また制御フロー情報は、決して実行されない全てILNODE(不到達コード)を除去するのに使用される。更に或るブランチの再対象化が実施される。使用方法を以下に説明する。
【0225】
変化が生じなくなるまで、以下のステップを反復する。
1.静的プログラム順序でIL NODEに関して繰り返す。
a)もし命令が不到達であれば、それを除去する。もし命令が他の何れかの命令のターゲットではないLABEL であるか、又は次の命令へのGOTO又はCGOTO であるか、又は無条件ブランチの直後に在って、LABEL ではなければ、その命令は不到達である。
b)もし命令が副次的効果を持たず、それ自身以外による使用がなければ、それを削除する。
c)もし固定ブランチ命令が、無条件ブランチへのジャンプであれば、その命令を再対象とする(例えば、a GOTO to a GOTO)。
d)他の何処か(L2)へのブランチが続く次の命令への条件付きブランチをチェックする。この場合、条件を逆にし、L2を条件付きブランチの再対象とする。
【0226】
図16は、Dead Code Elimination 及びAddress Check Elimination
(compiler/ooct elim achk.c)
の例を特に示す図である。このアドレスチェック消去パスは、Dataflow解析技術を用いて不要なアドレス配列チェックを消去する。このコードは偶奇数代数に関する値の推論を実行する。言い換えれば、このコードを解析することによって、擬似レジスタが与えられた点に於いて、偶数値、奇数値又は未知数値を保持しているかどうかを決定する。この解析は大域的に実行され、ブランチを越えて働く。このことは、この解析がループ対して働き、また他の制御フローを介しても働き、ループの単一展開を実行する場合に特に良く働くことを意味する。使用する方法を以下に説明する。この方法は、保守的固定点への到達を試みる反復方法である。値の推論は主として3つの方法によって行われる。第1の方法では、擬似レジスタが定数に割り付けられたときに値を推論できる。第2に、擬似レジスタが既知の引数による演算結果であるとき、値を推論できる。例えば、2つの偶数の和はもう1つの偶数を与える。最後に、条件付きブランチは、擬似レジスタの値について情報を与える。例えば、擬似レジスタを均等性に関してテストすれば、1つのブランチに沿って、それが偶数であることがわかり、他のブランチに沿って、それが奇数であることがわかる。
【0227】
何れかのラベルに於いて、推論値に変化がなくなるまで、以下のステップを繰り返す。
1.infvals (擬似レジスタによって指標付けしたINFVAL配列)に於ける各擬似レジスタに対する定義リストをクリアする。
2.静的プログラム順序でIL NODEに関して繰り返す。
a)もし命令が簡単化でき、現在既知の推論値が与えられるならば、その命令をより簡単なバージョンのものと置き換える。命令の変化によって全ループが反復される。
b)現在の命令の実行に基づいてinfvals を更新する。
i)もし命令が条件付きであって、その命令に関して値が推論できるのであれば、ターゲットLABEL 及びCGOTO に記憶されている推論値を適当な推論値によって更新する。
ii)もし命令が無条件であって、擬似レジスタを定義しているなら、infvals に於けるその擬似レジスタの値を更新する。この値は、演算がSET であるか、又は特別な場合、例えば2つの偶数の和でなければ、未知である。
c)もし命令がLABEL であれば、infvalと既にラベルにある推論値とを組み合わせる。
d)もし命令がブランチであれば、infvalとブランチのLABERLに記憶されている推論値とを組み合わせる。infvalの変化によって全ループは反復される。
e)もし命令が条件付きブランチであれば、その条件からの何れかの値推論はinfvalと組み合わされる。
f)もし命令が無条件ブランチであれば、infval配列を次のLABEL に記憶されている推論値に変える。これは、それらの静的順序に従って命令を処理するために行われ、無条件ブランチに於ける推論値は、その静的サクセサに於けるものと同じではない。
【0228】
図17は、Address Check Elimination の例を特に示す図である。解析の性能を改善するため、擬似レジスタは単純にODD 、EVEN、又はUNKOWNよりは、その他の値を取ることができる。擬似レジスタは他の擬似レジスタ、又は2つの擬似レジスタの2進演算に対して、EQUIVANLENNTとしてマークすることができる。これによって、1つの擬似レジスタに関する情報を、他の擬似レジスタに伝播することが可能になる。例えば、擬似レジスタR1と擬似レジスタR2が等価だと分かったとする。もしこの方法がR1は偶数であることを示すことができれば(例えば、ブランチテスト結果を介して)、R2もまた偶数であるに違いない。
【0229】
この方法は保守的方法であって、推論値は単調に増加しなければならないことに注意されたい。言い換えれば、もしこの方法がその実行中、値がプログラムの一点に於いて、常にEVENであると決定するならば、その値が現実にEVENである場合に違いない。この方法は、1つの繰り返し操作中に、擬似レジスタがEVENであることを示したり、また他の繰り返し操作中に、擬似レジスタがUNKNOWN であると示したりすることは決してない。この特性から方法の終了を推論することは簡単である。
【0230】
ホイスチング(compiler/oc common/src/oc hoist.c)
このホイスチング (hoisting:引き上げ) は、一般にはループ不変量コードモーションと言われ、ループに関して一定である計算を、そのループの外へ移動する処理である。この処理では、コードを各ループの繰り返しに対して一回実行する代わりに、単一時間で実行するので、有効なスピードアップが得られる。
1.ILの番号を付け直す(idは整列される)。
2.各逆方向ブランチ(即ち、潜在的ループ)に関して、物事(things)のホイストを試みる。
a)もしループに対し他のエントリがあれば、このループからホイストされるものは何もない。
b)ループ内でIL NODEを静的順序で繰り返す。
i)ノードが以下の条件を満足すれば、それをホイストすることができる:
(a)ノードは“実際のレジスタ”を使用又は定義しない。
(b)ノードはループ内の擬似レジスタセットを使用しない。
(c)ノードは副次的効果を持たない。
ii)ホイストできる何れかの演算(op)に関して、それが定義する何れの擬似レジスタも再命名する。
iii)ループの上にIL NODEを移動する。
iv)全てのIL NODEの番号を付け直す。
v)もしブランチを検出したら、ブランチのターゲットへ飛び越える(そのブランチが実行されているか否かは、判定できないから、コードをホイストできない)。
【0231】
ホイスチングパスはOOCTにとって必ずしも有効ではない。その主な理由は、多くのループはエントリポイントでもあるから、それらはループへの複数のエントリを持ち、ホイスチングパスによっては調べられないからである。この問題は、ループのターゲットとして使用される新たなラベルが生成される“ラベル分割”を実行することによって解決できる。次に、ホイストされた演算はオリジナルラベルと、新たに生成されたラベルとの間にリフトすることができる。これは直ちに実行される。
【0232】
共通式削除(CSE)(complier/oc common/src/oc cse.c)
共通式削除(Common Subexpression Elimination)は冗長な計算の削除を目的とする技術である。コンパイラ104は大域共通式削除(CSE)方法を使用する。
【0233】
その基本的方法を図18の例と共に以下に説明する。
1.デスティネーション(図示例のライン1)を有する各IL NODEに関して、変更が行われている間に、以下を実施する:
i)デスティネーション全ての使用をペア(対)単位でチックし、一方が他方を支配しているか(Bへ行くのに、Aを通らねば行けない時、AはBを支配していると言う)を調べ、斯うした各AB(ライン2及び4)ペアに関して、以下を実行する。
ii)AとBが“一致”しているかを調べ、もし一致していれば、次の式のペアには行かない。AとBは“共通式”である。
iii)以下の方法で、AとBから始まるより大きい共通式を見つける。AとBがデスティネーションを持ち、Bのデスティネーションが独特の使用C(ライン5)を持っていれば、AのデスティネーションがCを支配すると共に、Cと一致するような使用D(ライン3)を持っているかをチェックする。もし持っていれば、DとCを共通式に加え、A=D、B=Cである更に大きい式を探す。
iv)2つの共通式A(ライン2、3)及びB(ライン4、5)を持ったので、コードをBの使用がAの代わりとなるように書き換える。もしAのデスティネーションがBによって使用以前に変えられれば、新たな擬似レジスタに対してコピーが用いられる。
【0234】
図18は、特に共通式の削除(“CSE”)の例を示す。
コピー伝播(compiler/oc common/src/oc copyprop.c)
コピー伝播(Copy Propagation) は、割当ターゲットの使用を割当のソースによる置き換えを試みる変換である。コピー伝播はそれ自身では、コードの品質を改善しないから、割当結果が最早使用されないコードを屡々生成してしまう。コピー伝播方法を以下に説明する。
【0235】
1.各ASSIGN演算のためには:
a)もしASSIGNのソースが単一定義を有し、その定義の唯一の使用がASSIGNであって、そのASSIGNのデスティネーションがその定義とASSIGNの間で、修正も使用もされない場合には、その定義を修正してASSIGNのデスティネーションに向かう定義とし、そのASSIGNを除去する。
b)ASSIGNのデスティネーションの各使用について、ASSIGNはその使用だけの定義かをテストすると共に、ASSIGNのソースがASSIGNと使用との間で、ライブであると共に有効であるかをテストする。もし両テストが真であれば、デスティネーションの使用をソースの使用に置き換える。
【0236】
図19はコピー伝播の例を特に示す。図20は定数畳込みの例を特に示す。
定数畳込み(Compiler/oc common/src/oc cfold.c)
定数畳込み(constant folding)は、コンパイル時に定数に関する演算を評価する変換である。例えば、ILが2つの定数を加算する場合、定数畳込みはそれらIL命令を、加算のデスティネーションを2つの定数和に割り当てる単一SET 命令によって置き換える。
【0237】
定数畳込みパス方法は非常に簡単である。各IL命令は順番に検査される。各算術及び論理演算 (ADD 、SUB 、BAND、BOR 等) について、その引数の全てが定数である場合には、IL演算はデスティネーション擬似レジスタを定引数に関する演算値にセットするSET 演算によって置き換えられる。
【0238】
パターン整合(Compiler/oc common/src/oc pattern.c)
コンパイラ104は、IL命令の既知のパターンを、更に効率的バージョンのものに置き換えるパターン整合最適化パスを有している。現在は、OOCTによって発生されるILパターンと共通に整合するパターンはない。従って、パターン整合パスは実行されない。
【0239】
ターゲットコードの発生
ILが発生され、そのコードの品質を完全するための変換が実施されたあと、コンパイラ104の3つの主なパスが、コード発生のために用いられる。この点までは、IL及び変換パスはマシン独立であったが、これら3つのパスはターゲットアーキテクチャに強く依存している。
【0240】
命令の畳込み(Compiler/oc common/src/ix86 ifold.c)
OOCTのILはRISCの様なアーキテクチャであり、修正なしでは効率的なターゲットアーキテクチャへのマッピングを行わない。特に、全てのIL命令に対しターゲット命令を発するには、OOCTのILは次善のものである。ターゲットアーキテクチャはCISCアーキテクチャであるから、複数のIL命令は屡々それらを組み合わせて、単一ターゲット命令とすることができる。命令の畳込みパスは、組み合わせて単一命令にすることのできるIL命令グループを作ることによって問題を解く様に設計される。
【0241】
命令畳込みパスは、予め定められた多くの異なる命令の組合せの1つを検索する動作を行う。この場合、以下の組合せが用いられる。
・定数がADD 、SUB 等の種々の演算に畳み込まれる組合せ。
・SETCC 命令が、条件コードに基づいて設定する命令に畳み込まれる組合せ。
・同じ引数を持つDIV 、REM 対が一緒に畳み込まれる組合せ。
・ADD 、SUB 及びASL 演算を組み合わせて、単一“lea ”演算、或いはLOAD又はSTORE のアドレス計算にできる組合せ。
・16ビットのBSWAP 、STORE の組合わせが、2つの別々な8ビットの記憶に畳み込まれる組合せ。
・LOAD演算の結果が第2引数をとして用いられるとき、LOAD演算が種々の演算に畳み込まれる組合せ。
【0242】
命令畳み込みパスは、命令を畳み込むべきか否かを簡単に決定するが、実際に畳み込みを行うのではなく、畳み込みはマシンコード発生パスに任せる。命令畳み込みパスは、2つの方法で畳み込まれる命令をマークする。その第1は、ノードの各オペランドに“fold”ビットを用いてマークすることができる。第2に、その使用の全てを他の命令に畳み込ませた命令に、IL COMBINE フラグ、及び命令の畳み込まれ方に関する情報を与えるmmFoldフィールドを用いてマークする。レジスタアロケータ及びマシンコード発生は、正しく動作するためにこれらのフィールドを用いる。
【0243】
ターゲットレジスタ割当(Compiler/oc common/src/ix86 regalloc.c) レジスタアロケータ(RegAlloc)が可能なREGINOFOの全てに対するレジスタを選ぶと、それらの物理レジスタを擬似レジスタの代わりに使用するためには、コードを調べ、それを修正する必要がある。更にアセンブラがそれら命令のためのコードを発生できるように、実レジスタに幾つかの追加擬似レジスタを一時的に入れる必要がある。この場合、一般に、RegAllocがそれらレジスタに置いた値を保管及び回復するため、スピル及びフィルコード(spill and fill code) の挿入が必要になる。これをするためには、OC RegUseAlloc は制約アロケータ(GetReg)を用い、スピル及びフィルコードを挿入してレジスタを再使用する。
【0244】
OC RegUseAlloc は、コードに関して単一パスを実行し、“スタット(stat)”配列した物理レジスタの状態のトラックを修正及び保持する。このスタット配列は、如何なる瞬間も、各レジスタに在る(又は在るべき)もの、及びレジスタ又はスピル場所(又は両方)が正しいか否かを記録する。OC RegUseAlloc はその各々が現在処理されている命令に対して、特定の修正を行う一連の段階として働く。複数のIL命令が命令畳込みパスによって一括畳み込まれた場合には、それらは単一命令として扱われる。それらの段階は以下の通りである。
【0245】
1.もし命令が物理レジスタを直接使用したら、この使用後、レジスタにフィルが発生したかを確かめ、RegAlloc解析によって擬似レジスタに割り当てられたレジスタを使用するように命令を修正し、全てのレジスタをロックして、再利用されないようにする。
2.GetReg対する前の命令のコールによって、一時的に割り当てられたレジスタを使用するように命令を修正し、これら全てのレジスタをロックする。
3.命令が修復したレジスタを表すスタット配列の状態情報をクリヤして、必要なスピルを挿入する。デスティネーションレジスタを、RegAllocによって割り当てられたレジスタがもし在れば、それに変える(但し、このレジスタは、必要に応じてsrc を保持できるから、ロックする必要はない)。
4.ターゲットコード発生を必要とするレジスタに、ソースを入れるようにコードを修正する。これは、レジスタに存在する必要のあるソースオペランドのために GetReg をコールすることを含む。
5.ロックされた全てのレジスタを開錠する。
6.ターゲットコードに必要な実レジスタを使用するためのデスティネーションを固定する。これはGetRegのコールを必要とする。
7.この演算の結果を表すスタット配列を完了させ、全ての使用レジスタを固定し、それらの“前の”場所を次の命令にセットする(従って、如何なるスピル/フィルも、この完了した命令の後に置かれる)。
【0246】
このスタット配列は、理解する上で重要である。これは物理レジスタ(MM NumReg以下のレジスタは全て物理レジスタである)によって指標付けしたデータ構造の配列であって、与えられた物理レジスタ状態を示す。このデータ構造は以下のフィールドを含んでいる。
1.ri:現在、この実レジスタと関連する擬似レジスタを識別するREGINFO 構造(無関連を示す場合は0)。これはRegAllocによってこのレジスタに割り当てられた擬似レジスタか、又はGetRegによって一時的に割り当てられた擬似レジスタである。
2. alt ri:このレジスタに在る追加擬似レジスタを識別するREGINFO 構造。これは、GetRegが擬似レジスタを物理レジスタに割り当て、RegAllocがもう1つ別の擬似レジスタを此処(ri)に入れるときに使用される。
3.flags :レジスタの状態を識別するフラグである。例えば、RegValidは、レジスタの値が有効であることを示すのに使用される。もしRegValidがセットされていない場合には、使用する前にレジスタをフィルしなければならない。可能なフラグの完全な説明については、ix86 regallocを参照。
4.before:このレジスタにスピル又はフィルを置くべき命令。
【0247】
マシンコードの発生
ターゲットに対するマシンコードは2つのパスで発生される。その第1パスは、ブランチオフセットが計算できるように、命令のサイズを決めるのに用いられる。また、第2のパスは実際のコード発生を行う。2つのパスは、第1のパスがコードをスクラッチバッファに発生し、正しいブランチオフセットを持っていないことを除けば同じであるから、全てのコードは共用される。
【0248】
両パスは、順にIL命令を通る単一パスからなっている。各命令に対して、演算コードとその形式によって指標付けされたテーブルは、コード発生機能を検索するのに使用される。これらコード発生機能は、ターゲットの詳細を熟知する必要なしに、一般化されたターゲット発生法であるEMITマクロを使用する(ix86 Asm Emit.[h,c]参照)。これらのマクロは、ターゲットアドレシングモードの何れをも使用する命令のアセンブリを容易にする。
【0249】
セグメント管理
OOCTによってコンパイルされるコードは、SEGMENT データ構造に記憶される。セグメント管理には、これに関連する多くの重要な問題がある。そこで、第1に、セグメント記憶を扱う特別なメモリアロケータについて説明する。第2に、如何にセグメントを発生し、システムに導入するかを説明する。第3に如何にセグメントが削除されるか(このオプションがonの場合)を説明する。そして最後に、セグメント削除がonの場合に用いられるセグメントロッキングについて説明する。
【0250】
セグメントアロケータ (compiler/SegAlloc.[h,c])
OOCTに於けるセグメントに関する記憶管理は、特別なアロケータによって取り扱われる。OOCT初期化の際、セグメントアロケータ(SegAlloc)は、メモリの大きいチャンクによって初期化される。次いで、SegAllocユニットは、可変サイズメモリの不使用チャンクに対して、前に割当てられたメモリチャンクの開放を要求すると共に、現在のメモリ使用に関する統計を要求する能力を提供する。
【0251】
SegAllocは、可変サイズ割当を取り扱わねばならないため、ZONEアロケータより複雑である。SegAllocは全く標準的な割当方法を使用する。このアロケータは、チャンクの分類されたフリーリストを維持し、割り当てられたブロックに関して、32ビットのヘッダを用いてそのサイズを示す。メモリのチャンクを割り当てるため、要求サイズに合ったチャンクに関し、そのフリーリストを検索する。もしチャンクの残りが最小サイズより大きい場合には、それを分割して、その残りをフリーリストに加える。チャンクを開放するには、それをフリーリストに加える。自由化メモリのスピードは重要な因子ではないから、フリーリストは、単一フリーブロックに組み合わされた隣接フリーブロックに関して検索される。
【0252】
セグメントの生成及び導入
(compiler/ooct trace.c,compiler/SegMgr.[h,c])
コンパイルの主要段階が完了した後、最終結果は再配置可能なターゲットコードを含むメモリのブロックである。次のステップは、そのコードに対するセグメントを生成し、セグメント用に割り当てられたスペースにそのセグメントを導入することである。OOCT Install がこの機能を果たす。最初、このセグメントのための場所はZONEメモリ領域に割り当てられる。セグメントは、ブロックピッカ114によって選択された基本ブロックのリスト(それ故、セグメントが与えられたオリジナル命令を含んでいるか否かを調べるため、後で検索することができる)、及び発生されたコードによって初期化される。SEGMGR Install に対するコールは、セグメントをメモリの連続ブロックに変え、そしてそれを、SegAllocユニットを使用するセグメント用に割り当てられたスペースにコピーする。
【0253】
セグメントを生成し、それをセグメント割当スペースに移動した後、何れのオリジナル命令が、それらのためにコードをコンパイルさせたかを示す変換テーブルは、更新されねばならない。外部エントリである各オリジナル命令について、変換テーブルはそのエントリに対して発生されたコードの正しいアドレスによって更新される。更に、変換テーブルは、K命令が有効なエントリを有していることを示す TRANS ENTRY FLAGによってマークされる。
【0254】
セグメント削除(compiler/ooct trace.c, compiler/SegDel.[h,c])
コンパリラ104が変換テーブルにエントリを書き込むとき、既に其処にあった古いエントリに上書きすることができる。インタプリタ110は古いエントリを読むことも、また古いセグメントにジャンプすることもできない。セグメントが変換テーブルへのエントリを持たず、そのセグメントを使用するインタプリタ110がない場合、そのセグメントを削除することができ、そのメモリは他のセグメントのために使用することができる。この項では、コンパイラが如何にしてセグメントの削除可能を検出し、そしてそれを削除するかを説明する。また、通信の項では、セグメントロッキング及びセグメント削除について詳細に説明する。
【0255】
コンパイラ104が変換テーブルのエントリポイントを上書きする際、コンパイラは古いエントリポイントを削除リストに置く。新たなセグメントを導入後、コンパイラ104はSEGDEL TryDeletionsをコールする。この手続きは削除リストの各エントリポイントをチェックする。もしインタプリタがエントリポイントを使用していなければ、そのエントリポイントがその後、再使用されないように削除する。
【0256】
全てのセグメントはエントリポイントカウンタを有している。エントリポイントが削除されると、コンパイラ104はセグメントのエントリポイントカウンタを減算カウントさせる。セグメントのエントリポイントカウンタが0になったとき、インタプリタ110はセグメントを使用しておらず、新たなインタプリタ110がそれにジャンプすることはできない。コンパイラ104はセグメントを削除し、そのメモリを解放して他のセグメントがそれを使用できるようにする。
【0257】
セグメントロッキング
セグメントに対する各エントリポイントは、そのエントリポイントに関してロックとして作用するカウンタを有している。このカウンタは、エントリポイントを使用するインタプリタ110の数を記録する。そのカウンタ値が0より大きい間、エントリポイントとそのセグメントはロックされ、コンパイラ104はそれを削除することはできない。エントリポイントロックの最も重要な特徴は、セグメントをロック及びアンロックする命令が、セグメント自身の一部ではないことである。このことは、インタプリタ104がロックを保持しない限り、セグメントについて如何なる命令も実施できないようにしている。コンパイラ104及ぶインタプリタ110に関する文書は、セグメントロッキング機構について詳細に説明している。
【0258】
他の問題
コンパイラ104については、他の項で述べるには相応しくないが、理解する上で重要な幾多の問題がある。
【0259】
スタックラッピング(common/ooct warp.[c,h])
コンパイラ104は最初、動的には拡大しない小さなスタックを割り当てられる。しかし、都合の悪いことに、コンパイラ104は多くの再帰的手続きを用いるので、それが必要とするスタックのサイズが、用意されたものより大きくなることが屡々起こる。GranPower に関するプログラムを実行している間に、コンパイラ104が回復させられないページフォールトが、スタックオーバフローに起因して起こる状態が見られる。コンパイラ104のセクションを書き換えたり、又はスタックオーバフローによるページフォールトの正しい取り扱い方を決めてみたりする代わりに、OOCT bufferから割り当てられたものより更に大きいスタックが用いられる。このスタックのサイズは、それが決して制限因子(ZONEサイズのような他の因子は大きな制限となる)とはならないように選択された。斯うしたスタックを使用するため、クリーンなインタフェースOOCT Warp Stack が設計された。このインタフェースは、OOCTの大きなスタックスペースを用いる機能をコールすることができる。OOCT Warp Stack から帰ったときも、スタックポインタは変化されない。従って、コンパイラ104がシードをコンパイルするために、ooct Compile Seedを介して主要なエントリポイントに入っても、それはOOCT Warp Stack を使用したと見なされる。
【0260】
表 明(coomon/assert.[c,h])
コンパイラ104のコードは、沢山の表明(ASSERTION) 文を有している。この表明文は一貫性の制約及びその他エラー状態をチェックするために、コンパイラ104の至る所で使用される。表明文は2つ主要な役割をする。デバッギング環境では、表明不履行は、問題を調べて見つけるのに有効な情報を表示又は記憶する間、プログラムを停止させる。また、本番(コンパイル)環境では、表明はエラー状態をキャッチするのに使用され、そうした状態が発生した時には、コンパイル動作から安全に抜け出すのに使用される。例えば、もしコンパイラ104がメモりを使い切ったら、コンパイラ104によるそのシードコンパイルを停止させる。
【0261】
サービスルーチン (common/service.h)
サービスユニットは、KOI モニタによっては提供されないprintf及びmemset等の標準Cライブラリに於いて典型的に提供されるサービスを提供する。このユニットはこれらシステムコールを、ウィンドウズ及びファームウェア構造に於いて、違った扱いをする必要性を取り除くことを意図している。これらサービスルーチンの基本的実行対象は2つ有って、1つはウィンテスト(Wintest) プロジェクトに対してであり、他の1つはファームウェア構造に対してである。
【0262】
VIII. ウィンドウズのテスト環境
ウィンドウズのテスト環境は、OOCTシステムの高速開発及びテストに於いて、大きな役割を果たす。ウィンドウズを用いた開発によって、標準デバッギングツールがMSVCのもとに用意されている。更にプロファイラ(profiler)等の有効なツールが利用可能となっている。テストを目的として、テストスピードを上げかつその適用範囲を広げる特別なテスト方法がウィンドウズを使って開発された。
【0263】
この項では、まず模擬的Granpower 環境について説明し、次いで進歩したテスト技術の殆どを実行する比較ユニットについて説明し、最後にコンパイラ104のコードダンプについて説明する。
【0264】
模擬的 GRANPOWER 環境
OOCTの初期テスト、更に進歩したテスト、及び性能解析を実行するため、ウィンドウズ環境下で走行するインタプリタが必要であった。インタプリタ110自身は修正を必要としなかったが、GranPower に供給される初期化コール及びAOI システムコールを書き込む必要があった。OOCTがウィンドウズ環境下で走行するためには、コンパイラ104がインタプリタ110から個別タスクとして走行するから、多重“タスク”の実行が必要とされた。
【0265】
初期化
ウインドウのもとで模擬環境を生成する第1の段階は、KOI データ構造を正しく初期化するコードを生成し、OOCTタスク用のKOI の初期化API を模擬化することであった。インタプリタ110は何れのコードも実行できるように、多くのデータ構造が適当に初期化されることを期待する。更に或るデータ構造の要素は、OOCTを使用するかどうかを制御する。我々は初期化コードの基礎をファームウェアの初期化処理に置くことによって、インタプリタ110を走行させるための正しい初期化をシミュレートすると共に、その動作を制御した。同様に、KOI の初期化API は、OOCTタスクを実行するため、ファームウェアが使用するコードに基礎を置いた。これは標準ウィンドウズのデバッギング環境下で働くインタプリタ110(例えば、OOCT Initに対するコール)間に於けるインタフェースの初期書込み及びテストを可能にする。またこれはインタフェースの変更及びテストを簡単にする。
【0266】
AOIシステムコール (wintest/MiscStubs.c, wintest/MsgStubs.c)
インタプリタ110は、利用可能なAOI システムコールの全てを持つ環境下での実行を期待する。実行可能なものをコンパイル及びリンクするためには、AOI システムコール用スタブ(stub) を生成する必要がある。システムコールの多くは、ウィンドウズ環境下でシステムテストを実施している間は意味を持たないので、それらコールは単に空(empty) 機能として(単にリンケージ目的だけに)残される。AOI システムコールはタイミング(ScGtmSet, ScGtmRef)及びメッセージ(messgAlc, ScMsgSnd, ScMsgRcv)のために用意され、実施される。
【0267】
OOCTは、Execとコンパイラ104によるプロセス間通信のためのメッセージ受け渡しシステムに大きく依存する。ウィンドウズ環境下では、それらAOI システムコールのダミーバージョンは、同じタスク内のスレッド(thread)が通信(上記の)することを可能にする。メッセージシステムコールのウィンドウズバージョンは、ロッキング及びメッセージ待ち行列を使用するシステムコールの仕様を完全実施する。
【0268】
Compiler/EXEC 用分離スレッド
ウィンドウズ環境下での実施及びデバッギングを簡単にするため、分離処理の代りに、コンパイラ104及びインタプリタ110に対し分離スレッドを用いた。スレッドを用いることによって、2つの“タスク”間に於けるメッセージ受け渡しは簡単に実行される。またデバッギングは2つの理由から更に容易になる。即ち、デバッガはそれぞれ単独で両方のタスク(インタプリタ110とコンパイラ104)に使用できること、そしてデバッガは複数スレッドに使用できるように設計されているからである(我々は多重処理をデバッギングするツールを備えたデバッガを知らない)。
【0269】
比較ユニット
OOCTは非常に価値があると証明された独特のテスト方法を使用する。OOCTのコンパイルされたコードは、インタプリタ110の結果と正確に同じ結果を生まなくてはならないから、それらの結果を直接比較する方法が生成された。ウィンドウズのテスト環境下では、OOCTとインタプリタ110の両者のもとでプログラムを走らせ、中間結果を最小単位で比較する能力が内蔵されている。これらの比較は、命令毎にチェックするように任意に細かく分けることができる。プログラムの動作を比較する能力と共に、自動テスト発生器が書き込まれている。このテスト発生器は、実行され、比較される“ランダム”コードを生成する。この自動テスト発生及び比較は、OOCTが正しく動作していることを確かめる極めて大きなプログラムの組を用意する。更に、自動比較はコンパイルされたコードとインタプリタ110が最初に異なる場所を指摘するから、発生したバグをピンポイントで指摘する極めて価値のある方法を提供する。
【0270】
この項では、比較ユニットを2つの段階に分けて説明する。第1段階では、コンパイルされたコードの結果と、インタプリタ110の結果とを比較するインフラストラクチャについて説明する。第2段階では、テストで使用するランダムコードの発生について説明する。
【0271】
比較インフラストラクチャ
比較インフラストラクチャは、同じKプログラムの2つのバージョン実行するという考えに基づいている。そこでは模擬Kマシン(レジスタ及びメモリ)のマシン状態を特定の回数だけ、チェックポイントで検査する。次いで、それらチェックポイントでの検査の結果を比較し、コンパイルされたバージョンと解釈された(interpreted) バージョンが同じ結果を与えているかを決定する。
【0272】
図21は本発明の実施形態による比較インフラストラクチャを有する上記処理の例を特に示す。実際には、この比較テストは2つのウィンドウズ処理として実行される。親(主)処理はブランチロギング及びコンパイルを持つ完全なOOCTシステムを実行し、子(副)処理はKOI の解釈されたバージョンだけを実行する。これら両処理はそれらのチェックポイントログをメモり(子は共用メモリ)に書き込み、模擬Kマシン状態への両処理の効果(影響)を記録する。親処理はチェックポイントログ内のデータを比較し、何れかの矛盾(不一致)が在ればそれを報告する。
【0273】
コード発生
比較テスト用のランダムコード発生は3つのユニットによって行われる。先ず、KアセンブラはC機能コールを用いて、Kマシンコードを作る機構を用意する。第2のユニットはK演算コードの種々の基本ブロックを生成するために設けられる。そして、最後はランダム制御フローユニットで、多くの異なる形式の制御フローを持つコードを発生させる。
【0274】
Kアセンブラ (wintest/OOCT Assemble.[h,c])
KアセンブラはCプログラムからKコードを発生するための簡単な機構を用意する。各K演算コードはその演算コードに対する命令を特別にアセンブルするのに使用する機能を有する。個々の命令は引数として、コードを何処に記憶するかを指定するポインタ、ラベル(多分空)の名称、及び命令に使用されている各フィールドに対する引数を取る。この機能はフィールドをそれらの正しい場所と組合せ、コードをバッファに書き込む。ラベルに対するブランチはラベルの定義以前に起こるから、コードに関する第2パスはブランチのデスティネーションを分析するのに使用される。
【0275】
ランダムK演算コード生成ユニット (wintest/GenArith.c, wintest/GenCassiest.c, Wintest/GenMisc.C)
種々の形式の命令をテストするため、それら形式の命令を含む基本ブロック(ストレートラインコード)を発生する各ユニットが生成される。特に、算術及びシフト演算、Cアシスト命令、及びOOCTによって実行される他の全ての命令を発生するユニットが生成される。これらユニットに対する主要インタフェースは、FillBasicBlockルーチンを介している。このルーチンは引数としてメモりバッファ及び多数の命令を取り、与えられた多数の命令(ランダムに選ばれた)をバッファに書込む。FillBasicBlockルーチンは機能発生命令配列からランダムに選んで、命令を加える。ユニットは発生できるK演算コード毎に、1つの命令発生機能を含んでいる。この命令発生機能は、アセンブラに対する引数として適当なランダムな値を選び、命令をアセンブルする。命令は完全にランダムには発生されない。その代わり、ある制限のものに発生される。例えば、レジスタをランダムに選んでデスティネーションとする場合、決してベースレジスタを使用しない。また、コードが前もって決められた多くのメモリ場所を使うことも制限される。我々のテストでは、これらの制限は非常に重要であるとは示されなかった。もし将来、それが重要であると分かれば、更に複雑な処理を用いてその制限の幾つかを緩和することはできる。
【0276】
ランダムテストは多くの異なる命令間の相互作用をテストするので重要であり、OOCTのようなコンパイラ104にとって特に重要である。OOCTに於いて、命令をコンパイルすることによって作られるコードは、実質的に周囲の命令に依存して異なることができる。
【0277】
図22は、異なる周囲命令に対して同じ命令のためのコードを発生するコード発生例を特に示す。更にランダムテストは、プログラマがテストしない多くの場合をテストする。
【0278】
ランダムK演算コード生成ユニットは、ある種のテストに対してそれ自身で有効である。例えば、新たな演算コードを実施するとき、このユニットは、その演算コードを用いる命令の基本ブロックを実行する簡単なループを生成する非常に有効な方法であることを立証している。個々のユニットが有効であるとは言え、コンパイラ104の幾つかの特徴を完全にテストするには、もっと複雑な制御フローが必要である。
【0279】
ランダム制御フロー生成ユニット(wintest/Gdom control flow creation unit(GenControl)) は、ストレートラインコードより更に複雑な形式の制御フローを用いるテストを生成するのに使用される。GenControlは単一基本ブロックから始めて、幾つかの変換(ランダムに選んだ)を実施する。現在実施されている変換は下記の通りである。
基本ブロックは2つの基本ブロックに分割できる。
基本ブロックはダイヤモンドによって置き換えることができる。これは条件付きブランチを表し、其処では2つの経路が結合し直して一緒になる。
基本ブロックはループによって置き換えることができる。
基本ブロックは3つの基本ブロックによって置き換えることができ、其処では第2の基本ブロックに対して機能コールが行われ、第3基本ブロックに戻る。
【0280】
基本ブロックに関して、特定数の変換が実行された後、命令で満たす必要があるランダム発生の制御フローグラフが存在する。これは2つの部分からなっている。第1の部分では、基本ブロック自体に対するコードを発生するため、前項で説明したランダムK演算コード生成ユニットが使用される。第2の部分では、命令を満たしてブランチ及びループを実行する。ループは固定回数繰り返す所定のテンプレートを使用する。条件付きブランチに対しては、ランダムテスト命令が使用される。
【0281】
コンパイラコードダンプ
デバッギング及び最適化を目的として、多くのダンピング機構がウィンドウズ環境下のOOCTで使用される。主なダンピング機構は2つある。その1つはコンパイルされたK演算コード、IL、及びターゲットコード(もし発生されていれば)を含むコードリストを、コンパイルの間にダンプすることができる。第2の形式のダンピング機構は、テストを目的として、再コンパイル及びリンクすることができるアセンブリ形にターゲットコードをダンプするものである。
【0282】
幾つかの段階の後、ILコードのコピーをダンプすることによって、与えられたコンパイラ104の最適化パス効果の正確性及び有効性を検査することができる。更に、作られた最終コードを検査することによって、コンパイラ104による各K演算コードのILへの変換の善し悪し、及び各IL命令に対して作られたターゲットコード及びK演算コードの品質をマニュアルで検査することができる。これらのコードダンプは、OOCT Optimize IL And Gen Code(compiler/ooct trace.c 参照) に於けるコンパイラ104のパス間に挿入されたCOMBDUMPマクロを用いて制御される。このマクロは、K演算コード及びIL命令に関して繰り返すOOCT Combdump手続き(ooct combdump.c参照)をコールする。
【0283】
ウィンドウズ用の現在のプロファイリングツールは、動的に発生されたコードを正しく取り扱わない。それ故、第2の形式のダンプを用いて、1つの実行からの動的コードが、もう1つの実行からの静的コードとして使用でき、そして正しくプロファイルできるようにする。これは2段階で達成される。第1段階では、再コンパイル可能なフォーマットを持つファイルに、コンパイルされる各K演算コードのトレースを記録し、そしてコードをダンプする。第2段階では、プログラムをコンパイルして、それをOC USEDUMP フラグ(compiler/ooct dump.h参照) によって実行し、静的バージョンを使う代わりに前にコンパイルされたコードに対する動的コンパイルをoffする。プログラムのこのバージョンは、コードの品質に関する統計を記録するプロファイラによって実行することができる。
【0284】
本発明の第2実施形態
動的最適化オブジェクトコード変換
第2実施形態の概容
アーキテクチャエミュレーションは、オリジナルアーキテクチャで使用するマシンコードを修正なしで実行できるように、1つのコンピュータアーキテクチャを他の異なるコンピュータアーキテクチャによって模倣することである。オブジェクトコード変換は1つのコンピュータアーキテクチャ用マシンコードを、他のコンピュータアーキテクチャ用マシンコードに変換する処理である。ここで述べる動的最適化オブジェクトコード変換システムはコンパイラ最適化技術を用いて、アーキテクチャエミュレーションのためのテンプレートベースのオブジェクトコード変換より高いオブジェクトコード変換性能を達成する。
【0285】
第2実施形態に関する図の説明
図23は本発明の第2実施形態による動的最適化オブジェクトコード変換に用いるシステム構成を示す。図23はプログラム解釈の実行と同時発生の動的変換を示す概略図である。各インタプリタはコンパイラに対し変換要求を送ることができる。次いでコンパイラはインタプリタタスクにとって利用可能な変換されたコードを作る。多重実行ユニットを持つマシンでは、全ての処理が同時に実行される。
【0286】
第2実施形態の詳細な説明
動的最適化オブジェクトコード変換システムは1つの命令セットの動的コンパイルを、もう1つ他の命令セットに対して実施し、テンプレートベースの変換又は解釈されたエミュレーションに関する性能改善を行う。動的最適化オブジェクトコード変換システムは、実行コードをプロファイルする任意の数のインタプリタを別の最適化コンパイラに組み合わせる。最適化コンパイラは実行コードからのプロファイリング情報を使用して、頻繁に実行されたコード部分を決定する。次いで、これらのコード部分はコンパイルされ、インタプリタに与えられる。このシステムの全体構造を図23に示す。
【0287】
有意味のコンパイラ形式の最適化は、命令フローグラフに関する情報によってはじめて実行が可能になる。伝統的なコンパイラでは、最適化が始まる前に、全ルーチンが完全に解析されるので、フローグラフは明瞭に定義されて与えられる。アーキテクチャエミュレーションシステムの場合、コンパイルされるコードは、それが実際に実行される前には利用可能ではない。更に命令及びデータは、実際にプログラムを走行させなければ、一般には区別することはできない。
【0288】
それ故、フローグラフを決めるには、プログラムを実行しなければならない。インタプリタは最初にプログラムを走行させるのに使用される。インタプリタがプログラムを実行するとき、インタプリタはブランチ演算を行うことを動的コンパイラにその都度報告する。この情報のロギングは、幾つかの命令及び幾つかの接合点を識別する。プログラムが走行すると、フローグラフに関する情報はより完全にはなるが、全く完全とは言えない。システムはフローグラフに関する部分的情報によっても作動するように設計されている。この場合、最適化は潜在的に不完全なフローグラフに基づいて実施されるが、より多くの情報が利用可能になったとき、システムはその最適化コードを入れ替えられるように設計されている。
【0289】
動的コンパイルは、インタプリタによって集められたプロファイリング情報に基づいて、テキストのどの部分を最適化すべきかを選択する。或るブランチを実行した回数が閾値を越えたとき、ブランチのデスティネーションはコンパイルのシードになる。シードは、1単位としてコンパイルされるソース命令の部分を解析する始点である。この単位をセグメントという。
【0290】
セグメントは、シードからソース命令を最適化した結果得られた命令を含んでいる。セグメントは1単位として導入及び非導入される。インタプリタがコンパイラをコールして、コンパイラにブランチについて知らせると、もしデスティネーションコードが在れば、コンパイラは制御をセグメントに移すことを選択する。同様に、セグメントは制御をインタプリタに移し返すためのコードを含んでいる。
【0291】
セグメントが不完全で、変換元プログラムから可能なフロー経路のサブセットしか表していない場合もある。しかし、この不完全な表現は正しいエミュレーション動作と干渉はしない。もしオリジナルコードを介して、新たに予想外のフロー経路が生じた場合には、制御フローはジャンプしてインタプリタに戻る。後で、同じセグメントは新たな制御のはがれを説明するために置き換えられる。
【0292】
第2実施形態の特別目的
本発明は、アーキテクチャエミュレーションシステムに於ける性能改善のために最適化オブジェクトコード変換を使用する。
【0293】
第2実施形態の要約
ここで述べた動的最適化オブジェクトコード変換システムは、アーキテクチャエミュレーションのため、コンパイラ最適化技術を用いて、テンプレートベースのオブジェクトコード変換より高いオブジェクトコード変換性能を達成する。本発明は、アーキテクチャエミュレーションシステムに於ける性能改善のために最適化オブジェクトコード変換を使用する。
【0294】
本発明の第3実施形態
同時動的変換
第3実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換する動作である。ここで述べる同時動的変換システムは、プログラム解釈の実行と同時に変換を行う。
【0295】
第3実施形態に関する図の説明
図24は本発明の第3実施形態による同時動的変換に用いるシステム構成を示す。図24はプログラム解釈の実行と同時の動的変換を示す概略図である。各インタプリタはコンパイラタスクに対し変換要求を送ることができる。次いで、コンパイラタスクはインタプリタタスクにとって利用可能な変換されたコードを作る。多重実行ユニットを持つマシンでは、全ての処理が同時に実行される。
【0296】
図25は、例えば1つのタスクとして実行する間、インタプリタとコンパイラを組み合わせることと、また例えば、本発明の第4実施形態に従って、異なるタスクとしてそれらを分離することとの違いを示す。図25は、インタプリタとコンパイラタスクを組み合わせた時の待ち時間と、分離した時の待ち時間の概略を示す図である。
【0297】
第3実施形態の詳細な説明
同時動的変換の目的は、インタプリタが実行状態にある間に、実行プログラムを更に効率的な形にコンパイルすることによって、インタプリタの性能向上を図ることである。インタプリタの実行と同時に動的変換を行うため、コンパイラは多重実行ユニットを有するシステムに関して分離タスクとして実行される。コンパイラタスクは、或る命令を変換する要求を受け、一定の変換されたコードによってその要求に応えるサーバである。分離タスクとしてコンパイラサーバを置くことには、幾つかの利点がある。即ち、その第1は1つ以上のインタプリタタスクが、同じサーバに対して要求することができる。第2に、インタプリタタスクは、先に進む前に、コンパイル要求の結果を待つ必要がない。第3に、インタプリタ及びコンパイラは、それぞれのタスクに於ける故障から隔離される。そして、第4に、インタプリタ及びコンパイラは利用可能なプロセッサの数に応じて、仕事がより平均化するようにスケジュールを組むことができる。これらそれぞれの利点ついては以下の詳述する。
【0298】
分離コンパイラタスクを持たない動的変換システムは幾つか現存している。サンマイクロシステムズ(Sun Microsystems)社のジャバ仮想マシン(Java virturalmachine) はその一例である[2] 。この仮想マシンは手続きを呼び出すことによって動的変換要求を発することができる。しかし、このシステムでは、インタプリタはプログラムの実行を継続する前に、変換要求が完了するのを待たなければならない。もう1つの例は、富士通社の一挙に命令ページを変換するOCT 動的変換システムである[1] 。このOCT システムでは、プログラムの実行を継続する前に、変換要求が完了するのを待たなければならない。
【0299】
また、ジャバの変換元コードをジャババイトコードに静的変換するのに利用できる変換サーバがある[3] 。これらのサーバはジャバのプログラムが走行している間は動作しないので、動的変換ではなく、静的変換のための分離コンパイラタスクの利益を提示している。
【0300】
分離コンパイラタスク構成の第1の利点は、複数のインタプリタタスクが同一サーバに対して変換要求をすることができる点にある。それらの変換要求は、それらの実行可能なイメージに、それを更に小さくするコンパイラコードを含まなくてもよく、インタプリタ命令とコンパイラ命令との間、或いはインタプリタデータデータとコンパイラデータとの間にキャシュ競合を起こさない。効率的キャシュの使用は、殆ど全てのモダンなプロセッサにとって重要であるから、これは大きな利点である。
【0301】
分離コンパイラタスク構成の第2の利点は、インタプリタがコンパイラの待ち時間を見なくて済む点である。図25は待ち時間の差を示している。インタプリタとコンパイラの組合せタスクでは、インタプリタはコンパイラが命令変換を完了するまでは、命令を実行しない。分離タスクの場合は、インタプリタは、コンパイラが動作している間に、直ちに命令実行を再開する。分離タスクによって為される全仕事量は、変換要求をしてその回答を受けるから大きくなるが、待ち時間が小さいと言うことは、コンパイラが働いている間、システムユーザが休止時間を持たなくて済むことを意味する。また、コンパイラが働いている間も、インタプリタタスクは割り込み等の外部事象に応答することができる。これは組合せタスク構成では不可能である。実際、組合せ構成に於いて、インタプリタがコンパイラの待ち時間を経験するという事実は、コンパイラの複雑さ及び変換されたコードの品質に制限を置くことになる。例えば、ジャバのJust−In−Timeコンパイラはジャバシステムと対話しているユーザが休止を経験しないような十分な高速でしなければならない。これは複雑な最適化を禁止することになる。同様に、OCT システムはコンパイル時間を減少させるため、1つの変換された命令を最適化するだけである。分離コンパイラタスクは、複数の命令にわたって最適化の実施を可能にする。
【0302】
分離コンパイラタスクの第3の利点は、インタプリタタスクとコンパイラタスクに於ける故障が互いに隔離される点にある。このことは、もしコンパイラがアドレス例外や、その他の例外状態に遭遇しても、インタプリタタスクは影響を受けないことを意味する。コンパイラは故障の後、それ自身をリセットし、次の変換要求に関する仕事を続ける。インタプリタタスクは、変換要求を終了するのにコンパイラを待つことはないから、コンパイラの故障を知らずに済む。
【0303】
分離コンパイラタスクの第4の利点は、コンパイラタスクとインタプリタタスクに対する負荷のバランスを取ることができる点である。動的変換システムでは、インタプリタタスクが非常に忙しく、コンピュータのCPUの全てを必要とする時期があり、またインタプリタタスクが遊休状態で、CPUが使用されていない時期もある。インタプリタとコンパイラの組合せ構成では、コンパイラはインタプリタが実行時にコールされるだけだから、コンパイルの仕事の殆どはインタプリタの実行時に行われる。従って、これは遊休CPUサイクルの利点を使用しない。分離コンパイラタスク構成では、コンパイラはインタプリタが遊休状態にあるときでも動作を継続する。コンパイラはインタプリタが将来使うかもしれない変換されたコードを作成する。
【0304】
第3実施形態の特別目的
本発明の第3実施形態は、より小さな実行可能なイメージサイズを与え、キャシュ競合を低減し、インタプリタ実行の待ち時間を短縮し、故障を隔離し、更に良い負荷のバランスをとる複数の物理的実行ユニット有するシステムに於いて、複数インタプリタの実行と同時に動的変換を行うことを目的とする。
【0305】
第3実施形態の要約
ここで述べた動的変換システムはプログラム解釈の実行と同時の変換を行う。このシステムはインタプリタタスクの実行に重大な影響を与えないように、分離コンパイラを使用する。本発明は、より小さな実行可能なイメージサイズを与え、キャシュ競合を低減し、インタプリタ実行の待ち時間を短縮し、故障を隔離し、更に良い負荷のバランスをとる複数の物理的実行ユニット有するシステムに於いて、複数インタプリタの実行と同時の動的変換を用いる。
【0306】
本発明の第4実施形態
エミュレータに関するプロファイリングの負担を低減する動的変換実行中のエミュレーション
第4実施形態の概容
アーキテクチャエミュレーションは、オリジナルアーキテクチャ用マシンコードが修正なしで実行できるように、1つのコンピュータアーキテクチャを他の異なるコンピュータアーキテクチャによって正確に模倣することである。オブジェクトコード変換は、1つのコンピュータアーキテクチャ用マシンコードを異なるコンピュータアーキテクチャ用マシンコードに変換する処理である。ここで述べる動的最適化オブジェクトコード変換システムは、コンパイラ最適化技術を用いて、アーキテクチャエミュレーションのためのテンプレートベースのオブジェクトコード変換より高いオブジェクトコード変換性能を達成する。しかし、動的最適化オブジェクトコード変換を実現するにはプロファイリングが必要である。ここでは、プロファイリング負担を低減する方法について説明する。
【0307】
第4実施形態に関する図の説明
図26は本発明の第4実施形態に従って、どの命令が変換可能であり、どの命令が変換不能であるかを記録するのに使用する変換テーブルを示す。図26はどのプログラムが変換可能であり、どのプログラムが変換不能であるかを示す変換テーブルである。この場合、プログラムはIバイトの単位で測られる。エミュレータは、どのエントリにブランチサクセサが対応するかをチェックし、変換可能なプログラムにジャンプするか否かを決定する。
【0308】
図27は、本発明の第4実施形態による方法が、エミュレータに関するプロファイリング負担を如何に低減するかを示す。図27は、エミュレータがどの様にして変換可能なプログラムに関してロギングをonし、変換不能プログラムに関してそれをoffするかを示す流れ図である。トリガ*1 命令及びトリガ*2 命令は、両者ともログされねばならないが、トリガ*1 命令は変換可能プログラムと変換不能プログラムの間にジャンプしなくても良い。トリガ*2 だけがそれらの間にジャンプすることができる。ログフラグはエミュレータが変換可能プログラムで走行しているか又は変換不能プログラムで走行しているかを覚えている。従って、トリガ*1 命令では、エミュレータは変換テーブルをチェックしたり、又はログフラグを変えたりしなくても良い。従って、エミュレータはブランチサクセサ命令が既にコンパイルされているかどうかだけをチェックし、直ちにコンパイルされたコードにジャンプする。トリガ命令*1 は、最も多く実行された命令を表すから、このアルゴリズムはエミュレーションに関するプロファイリングの負担を低減する。
【0309】
第4実施形態の詳細な説明
動的最適化オブジェクトコード変換は、更に高速な命令を作ることによって高い性能を実現できるが、それにはメモリ及び時間の点から見てコストが伴う。それ故、アーキテクチャエミュレーションでは、動的オブジェクトコード変換とエミュレーションの両方を一緒に用いる。この変換は最も多く実行され、高性能を必要とするメジャープログラムに対して用いられる。そして、エミュレータは変換プログラムがコンパイルを完了するまで、マイナープログラム及びメジャープログラムのプロファイリングのために作動する。変換プログラムはプロファイルを用いてプログラムのコンパイル及び最適化を実施する。
【0310】
未変換コードから変換されたコードにジャンプする命令をトリガ命令と言う。もしトリガ命令がマイナープログラムからメジャープルログラムへ、又はその反対にジャンプする場合、その命令をトリガ*2 命令と言う。もしトリガ命令がマイナープログラム内、又はメジャープログラム内だけでジャンプする場合、その命令をトリガ*1 命令と言う。変換プログラムはマイナープログラムでは動作しないから、マイナープログラムに於いてトリガ*1 命令をプロファイルする必要はない。メジャープログラムの一部分は、他の部分がまだ変換されていない間に変換されるから、メジャープログラムに於いてトリガ*1 命令をプロファイルする必要がある。トリガ*2 命令はメジャープログラムへジャンプするから、マイナー及びメジャープログラムの両方でプロファイルする必要がある。
【0311】
エミュレーションは、トリガ*2 命令を実行した後に、3つの命令を実行する(図27参照)。先ず、変換プログラムがonしているかをチェックする。もしonしていれば、トリガ*2 命令のサクセサが変換可能か否かをチェックする。もしサクセサが変換可能であれば、エミュレーションはロギングフラグを真にセットし、そしてサクセサが変換されたかをチェックし、もし変換されたバージョンが在れば、それにジャンプする。
【0312】
エミュレーションは、トリガ*1 命令を実行した後に、2つの命令を実行する(図27参照)。先ず、ロギングフラグがonか、offかをチェックする。フラグがoffなら、この命令はマイナープログラムにあり、プロファイルする必要はない。フラグがonならば、エミュレーションはサクセサが変換されたか否かをチェックする。
【0313】
メジャー及びマイナー両プログラムは、それらのメモリアドレスによって区別される(図26参照)。エミュレータは変換テーブルを用いて、変換可能及び変換不能プログラムアドレスの関係を記録する。変換可能プログラムと変換不能プログラムの間を決して移動しないトリガ*1 命令に関しては、ロギングフラグが既にその情報を持っているから、エミュレータは変換テーブルにアクセスしなくても良い。
【0314】
トリガ*1 命令及びトリガ*2 命令に対するエミュレータの動作を分離することによって、エミュレーションに関するプロファイリング負担は低減される。
【0315】
第4実施形態の特別目的
本発明の第4実施形態はエミュレータに関するプロファイリング負担を低減する方法を目指している。この方法は、変換可能な命令へ、又はそれからジャンプすることができ、ブランチサクセサが変換可能か否かをチェックするコードをトリガ命令の後に置き、そして単にフラグをチェックして、ブランチサクセサが変換可能か否かを調べるコードを他の全てのトリガ命令の後に置くことによって構成される。
【0316】
第4実施形態の要約
動的オブジェクトコードをエミュレーションと一緒に用いることは効果的ではあるが、変換プログラムを案内するプロファイリング命令のコストはエミュレーションの負担となる。形式の異なるプロファイリング命令を区別することによって、この負担を低減することが可能である。本発明は、エミュレータに関するプロファイリング負担を低減する方法であって、この方法は、変換可能な命令へ、又はそれからジャンプすることができ、ブランチサクセサが変換可能か否かをチェックするコードをトリガ命令の後に置き、そして単にフラグをチェックして、ブランチサクセサが変換可能か否かを調べるコードを他の全てのトリガ命令の後に置くことによって構成される。
【0317】
本発明の第5実施形態
動的変換のためのソフトウェアフィードバック
第5実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換するする動作である。ある種の動的変換システムでは、プログラムを実行するインタプリタと呼ばれるタスクと、コンパイラと呼ばれるプログラムを変換するタスクとが、相互に分離される。インタプリタがコンパイラに対して要求を送る割合は、コンパイラがその要求を完成する割合に一致しなければならない。また、インタプリタが要求を送る割合がゼロに落ちてはならない。ソフトウェアフィードバックは、これら2つの割合を同じにする方法を提供する。
【0318】
第5実施形態に関する図の説明
図28は本発明の第5実施形態によりインタプリタとコンパイラを分離した動的変換システムの全体構造を示す。図28は動的変換システムの構造図である。インタプリタはコンパイラに対して要求を送る。これに応答して、コンパイラは変換されたコードをインタプリタに送り返す。このシステムが最も効率的な動作をするには、これら要求と応答の割合が等しくなければならない。
【0319】
図29は本発明の第5実施形態によるソフトウェアフィードバック機構の構成要素を示す。図29はソフトウェアフィードバックシステムの構成要素を示す図である。比較手続きは完成数から要求数を減算する。要求割合手続きはその差に基づいて割合を設定する。要求送付手続きは、現在の割合によって要求を送る。
【0320】
第5実施形態の詳細な説明
動的変換システムでは、インタプリタタスクはコンパイラタスクに要求を送る。この要求には、プログラムのどの区画を変換するかをコンパイラに告げる情報が含まれている。要求を何時送るかを決める問題は、スケジューリング問題の一例である。インタプリタタスクが要求する割合は、コンパイラタスクがその要求を完了する割合に一致しなければならない。それ故、コンパイラは遊休状態になったり、或いは要求過多状態になったりはしない。
【0321】
ソフトウェアフィードバックは、そうした2つの事象の割合を等しくする方法である[1] 。動的変換システムでは、この方法は変換要求割合を変えて、変換完了割合に等しくする。図29に示すように、ソフトウェアフィードバックシステムは3つの主要部分を有している。その第1は、変換要求数と変換完了数とを比較する手続きである。第2は、この比較に基づいて変換要求の割合を変更する手続きである。第3は、変換要求が第2の手続きの出力に依存するようにする手続きである。
【0322】
動的変換システムに於いて、インタプリタタスクは、どの様な頻度でブランチ命令が特定のデスティネーションアドレスにジャンプしたかをカウントする。このカウントが閾値を過ぎると、インタプリタはそのデスティネーションアドレスを含む変換要求を送る。この閾値はソフトウェアフィードバックによって設定される重要なパラメータである。閾値が殆どの実行カウントより低い場合には、変換要求割合は高くなる。閾値が殆どの実行カウントより高い場合には、変換要求割合は低くなる。実行カウントの典型的サイズは解釈されるプログラムによって変化するから、インタプリタの動作に自動的に適応するソフトウェアフィードバックは、閾値設定には理想的な方法である。
【0323】
動的変換システムにおいて、ソフトウェアフィードバックシステムの比較手続きは、非常に簡単である。それは、コンパイラに対して送られる変換要求数と変換完了数との差を計算する。
【0324】
要求割合手続きは、比較手続きによって計算された差に基づいて閾値を変える。もしその差がゼロであれば、閾値が高すぎるので、インタプリタによる変換要求送付は阻止される。その場合、要求割合手続きは閾値から一定値を減算する。もしその差がその最大許容値であれば、閾値が低すぎるので、インタプリタによる過剰な変換要求送付が行われる。その場合、要求割合手続きは閾値に一定値を加算する。
【0325】
要求送付手続きは、インタプリタがブランチ命令を実行する際にコールされる。もしブランチ命令が同じデスティネーションアドレスに、閾値以上にジャンプした場合には、インタプリタはデスティネーションアドレスを含む変換要求を送る。
【0326】
第5実施形態の特別目的
本発明は、インタプリタタスクとコンパイラタスクとが分離された動的変換システムに於いてソフトウェアフィードバック機構を用いて、コンパイラが遊休状態に入らないようにしながら、インタプリタによる変換要求送付割合とコンパイラによる変換完了割合とを等しくする。最小閾値の使用によって、コンパイラは停止する。
【0327】
第5実施形態の要約
インタプリタタスクとコンパイラタスクとが分離された動的変換システムに於いて、インタプリタがコンパイラに対して要求を送る割合は、コンパイラがその要求を完成する割合に一致しなければならない。また、インタプリタが要求を送る割合がゼロに落ちてはならない。本発明は、インタプリタタスクとコンパイラタスクとが分離された動的変換システムに於いてソフトウェアフィードバック機構を用いて、コンパイラが遊休状態に入らないようにして、インタプリタによる変換要求送付割合とコンパイラによる変換完了割合とを等しくする。
【0328】
本発明の第6実施形態
動的変換のためのキューイング(待ち行列作成)要求
第6実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換するする動作である。変換されるプログラムの各片に関して、システムは動的変換プログラムに対して要求をする。動的変換プログラムの使用中に行われる要求は待ち行列に入れられ、変換プログラムが遊休状態になったとき、それに引き渡される。待ち行列の実施は、その低減を計るため、システムコールと共用メモリ通信とを組み合わせて実施する。
【0329】
第6実施形態に関する図の説明
図30は本発明の第6実施形態に従って、変換タスク作動中に、如何に待ち行列を用いて変換要求を保持するかを示す。
図31は本発明の第6実施形態に従って、如何にOOCT要求の待ち行列が、安価で済む共用メモリ要求と、システムコール要求とを組み合わせるかを示す。
【0330】
第6実施形態の詳細な説明
要求待ち行列の基本機能は、図30に示すように、動的変換プログラムが作動中に為された要求を覚えておくことである。何れの変換システムに於いても、同時に発生することが可能な変換の数には制限がある。典型的には、この制限は1回につき1変換と言うものである。しかし、出される要求の総数又は要求の割合には制限がない。それ故、既に変換プログラムが作動している間に、1つの変換要求が行われる可能性がある。要求待ち行列を用いれば、変換要求は待ち行列に入れられ、その要求を繰り返す必要がなくなる。変換プログラムは待ち行列からその要求を取って、変換を実行する。
【0331】
OOCTに於いて、動的変換システムは複数のタスク持っている。即ち、1つは要求を取り扱う動的変換タスクであり、他の1つは、変換要求をする実行タスクである。OOCTの待ち行列作成実施は、図31に示すように、安価で済む共用メモリと、システムコールメッセージとを一緒に用いて要求待ち行列を形成することによって、単純な待ち行列に改良を加える。未処理の要求がない場合、シードを実行タスクから変換タスクに伝え、変換タスクを遊休状態又はブロック状態にするには、システムコール単独で十分である。しかし、システムコールは高価につく。共用メモリを使って、要求メッセージを実行タスクから変換タスクに伝えることはできるが、変換タスクはそれらのメッセージをブロックすることはできない。それ故、変換タスクは、簡単な共用メモリ待ち行列からメッセージを連続的に受け取るように動作しなければならない。
【0332】
OOCTの実施に当たっては、システムコール及び共用メモリの各機構の最良の特徴を利用する。即ち、変換タスクが既に作動している場合、OOCTは変換タスクがシステムコールメッセージを待つのをブロックできるが、共用メモリを介して要求を伝えるようにする。
【0333】
図31に示すように、OOCTの要求待ち行列は実行タスクと変換タスクとの間で、2種類のメッセージを使用すると共に、両タスクによってアクセスされる共用メモリバッファを加える。最初のメッセージは、変換タスクから実行タスクに送られる。このメッセージは、実行タスクに、次の要求を送るにはシステムコールを使うよう告げる。このメッセージは、実行タスクに、変換タスクが共用メモリバッファを空にし、ブロックしようとしていることを報告する。従って、実行タスクはシステムコールを使って要求を送る。変換タスクはメッセージを受け取り、変換を開始する。システムコールを使って1つの要求を送った後、実行タスクは変換タスクが作動中であることを知ると、その後の要求を直に共用メモリバッファに送る。これはシステムコールを使用するより、遥かに安価で済む。変換タスクは1つの要求を片づけると、共用メモリバッファを調べる。もしバッファに要求があれば、その要求は取り出されて、変換される。共用メモリバッファが空の場合には、変換タスクは実行タスクに再度、システムコールを使用するよう告げる。
【0334】
OOCTの要求待ち行列の利点は、実行タスクの要求送付割合が高いとき、実行タスクは共用モリを使うことができる点と、また、変換タスクに対し要求がゆっくりした割合では入って来るときは、変換タスクはブロックすることができる点である。
【0335】
第6実施形態の特別目的
以下のクレームは日本における富士通の特許の翻訳に1節を加えたものである。すなわち、本発明は、頻繁に分岐される命令の変換を始めている間も、変換タスクにメッセージを送ることによって解釈を続行し、変換処理が既に進行している時には、変換タスクに対するメッセージを待ち行列に入れ、システムコール及び共用メモリの両機構を用いて、変換要求メッセージの送付性能を改善する方法である。
【0336】
第6実施形態の要約
ここで述べた変換要求の待ち行列は、変換要求を集める一方で、他の変換を実行する機構である。この待ち行列によって、実行タスクは1つの要求を送った後、直ちにその動作を継続することができる。共用メモリとシステムコールを併せて使用することによって、変換待ち行列の効率を改善することができる。本発明は、頻繁に分岐される命令の変換を始めている間も、変換タスクにメッセージを送ることによって解釈を続行し、変換処理が既に進行している時には、変換タスクに対するメッセージを待ち行列に入れ、システムコール及び共用メモリの両機構を用いて、変換要求メッセージの送付性能を改善する方法である。
【0337】
本発明の第7実施形態
動的変換のためのページフォールト回復
第7実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換するする動作である。動的変換プログラムは変換元マシン命令をターゲットマシン命令に変換する前に、それらを読まなければならない。変換元マシン命令を読んでいる間、変換プログラムはページアウトしたメモリから読むことによって、ページフォールトを起こす可能性があるが、その場合、メモリ(実記憶装置)にページを移す(page in :ページインする)ことは効率的ではない。ここに述べる変換プログラムは、ページアウトデータを読むことなしに、ページフォールトから回復し、変換処理を継続する。
【0338】
第7実施形態に関する図の説明
図32は本発明の第7実施形態に従って、変換元命令の通常実行時には起きないページフォールトを、如何にして動的変換プログラムがそれを起こす可能性があるかを示す。
図33は変換処理中にページフォールトから回復し、変換処理を続行するための本発明の第7実施形態によるアルゴリズムを示す。
【0339】
第7実施形態の詳細な説明
動的変換プログラムは、実際に実行される命令のサクセサだけではなく、命令の可能なサクセサの全てを読むから、物理メモリへのコピーに際して、悪い対象であるページにアクセスする可能性がある。例えば、図32に示すように、条件付きブランチ命令は2つのサクセサ、即ちフォールスルーサクセサとブランチテイクンサクセサ(branch taken successor)を有している。CPUが条件付きブランチ命令を実行するとき、もしブランチが取られてなければ、ブランチテイクンサクセサがロードされることは決してない。それ故、ページフォールトは起こらない。動的変換プログラムがブランチ命令を読む際、変換プログラムはどちらのサクセサが実際に実行されるかを知らずに、フォールスルー及びブランチテイクンサクセサの両方を読もうとする。たとえブランチサクセサが決して実行されなくても、それを読むことがページフォールトを引き起こす可能性がある。
【0340】
ページフォールトを扱う通常の方法は、要求されたメモリにページインし、ソフトウエアでメモりアクセスを行い、それから欠陥命令の後に実行を継続する。この方法は2つのコストを伴う。第1は、時間が掛かる。即ち、物理メモリから1つのページを補助記憶に移し、別のページを補助記憶から物理メモリに移し、それからメモりアクセスを行うのに時間が掛かる。第2に、ページインされるメモリのページセットを変えることになる。物理メモリにコピーされるページは、それが再度ページアウトされるまでは、頻繁にはアクセスされないかもしれない。このことは、それを物理メモリにコピーすることが悪い考えであったことを意味する。
【0341】
動的変換プログラムは頻繁にページフォールトを起こす可能性があるから、それらページフォールトに掛かる費用を低減することは有益である。動的変換プログラムは、新たなページを物理メモリにコピーしないこと、そして既に物理メモリにあるページを取り去らないようにすることで、余分なページフォールトに掛かる費用を最小にする。こうすることによって、コピー時間を節約し、また、まれにしか参照されないページをコピーすることが確実になくなる。ページをコピーする代わりに、ページフォールトハンドラは、変換プログラムに於ける現在の命令の流れを中断し、制御を変換プログラムの指定するチェックポイントに戻す。
【0342】
変換プログラムは基本ブロックと言う単位から変換元命令を読み取る。もし1つの基本ブロックを読んでいる間にページフォールトが起きたら、変換プログラムはそのブロックを無視し、他の何れかのブロックの変換を続行する。基本ブロックの全てを読んだ後、それらは一組のターゲット命令に変換される。ページフォールトを起こしたブロックを無視する方法を図33に示す。基本ブロックを読む前に、変換プログラムはチェックポイントを作る。チェックポイント以前の基本ブロックの読取りは全て安全で、チェックポイントの後で起こるページフォールトによる影響を何ら受けることはない。変換プログラムは次の基本ブロックを読みに掛かる。もしそこでページフォールトが起きたら、直ちにチェックポイントにジャンプする。こうして、その基本ブロックをスキップして、次の基本ブロックを読むようにする。
【0343】
第7実施形態の特別目的
本発明の第7実施形態は、メモリアクセスが不首尾の際、ページを物理メモリにコピーすることを止める一方で、変換を続けさせ、動的変換に於けるメモリアクセスコストを低減する方法である。
【0344】
第7実施形態の要約
ここで述べたページフォールト回復機構は、非物理的にマッピングしたメモリにアクセスする際の、動的変換コストを低減する方法である。この方法は、ページフォールトのために、変換元マシン命令の全てを読むことができない時でさえ、動的変換の継続を可能にする。この発明は、メモリアクセスが不首尾の際、ページを物理メモリにコピーすることを止める一方で、変換を続けさせ、動的変換に於けるメモリアクセスコストを低減する方法である。
【0345】
本発明の第8実施形態
動的変換のための変換されたコードからの出口記録
第8実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換する動作である。動的変換プログラムは命令の実行中にその命令をプロファイリングすることによって、命令を選択し、変換する。頻繁に実行された命令は変換されるが、たまにしか実行されないものは変換されない。変換された命令は、プロファイラによる幾つかの命令の見落とし、即ち、頻繁に解釈実行された命令の見落しを起こす可能性がある。変換されたコードからの特定の出口を記録することによって、頻繁に実行された命令の全てをプロファイルし、それら命令を全て確実に変換することができる。
【0346】
第8実施形態に関する図の説明
図34は本発明の第8実施形態によるブランチプロファイラを有する動的変換システムに於ける制御フローのパターンを示す。
【0347】
第8実施形態の詳細な説明
“動的変換のためのブランチロガー”と題して記載したたように、動的変換システムは、オリジナルプログラムのブランチ命令を解釈する際、それらをプロファイルし、どの命令が頻繁に実行され、どの命令が頻繁には実行されないかを決定する。ブランチロガーはブランチ命令を単にプロファイルするだけで、全ての頻繁に実行される命令は、頻繁に実行されるブランチを介して到達可能であると仮定する。或る場合には、プロファイルされたブランチを実行せずに、制御フローが変換された命令から解釈された命令に戻されるから、動的変換プログラム自身、この仮定を真ではないとする。変換プログラムはこうした場合を識別することができ、この制御フローを、それがあたかもブランチであるかのようにプロファイルする特定の変換された命令を生成する。
【0348】
図34は、制御がどの様にして解釈された命令から変換された命令に流れ、そしてまた、その逆に流れるかを示す。制御が変換された命令から出るときは何時でも、変換プログラムは出口があたかもブランチ命令であるかのようにプロファイルされていることを確かめる。制御が変換された命令から解釈された命令に流れる場合が幾つかある。
【0349】
その第1は、非固定デスティネーションへのブランチがある場合である。変換プログラムは、そのブランチの後で、どの命令が実行されるかを知らないので、その命令を同じ変換ユニットにブランチとして組み合わせることができない。その代わりに、変換プログラムは、変換されたコードから解釈されたコードに戻る出口を生成する。
【0350】
第2は、変換中のページフォールトのために、読むことができない命令がある場合である。“動的変換のためのページフォールト回復”と題して記載したように、変換プログラムは、ページフォールトのために読むことのできない命令ブロックを無視する。変換されたプログラムは、それらのブロックに到達したとき、ジャンプして解釈された命令に戻らなければならない。
【0351】
第3は、変換が行われているときに、たまにしか実行されない命令が幾つかある場合である。“動的変換のためのブロックピッキング閾値”と題して記載したように、そうした命令はたまにしか実行されないから、変換されない。しかし、それらの命令は将来、頻繁に実行されるかもしれない。そこで、変換プログラムはそれら命令に対する出口を記録しなければならない。この特徴によって、動的変換システムは、頻繁に実行される命令の分布を変える実行パターンの変更に適応することができるようになる。
【0352】
変換されたコードからの出口が記録されるので、より多くの命令が変換される。このことは、命令の変換されたバージョンが存在する機会を増加させる。それ故、動的変換システムを長時間実行した後、1つの変換されたユニットからの出口の殆どが、解釈されたコードへ戻すジャンプの代わりに、他の変換されたユニットへジャンプを起こす。このことは、高速変換された命令をより頻繁に使用することからくる直接利益と共に、ブランチロギング命令を頻繁には実行しないことによる間接利益も持っている。
【0353】
第8実施形態の特別目的
本発明の第8実施形態は、変換されたユニットの可能な出口をプロファイリングすることによって、たとえ頻繁に実行される命令がプロファイルされた何れのブランチを通しても到達されない場合でも、それを確実に変換する方法を目指している。
【0354】
第8実施形態の要約
動的変換システムは、頻繁に実行される命令の全てを探して変換しなければならない。これは、ブランチ命令をプロファイリングすることによって完成される。しかし、命令の変換は、プロファイルされたブランチを含まない命令への経路を生成する。それ故、プロファイリングは変換された命令からの出口を含むように広げられる。この発明は、変換されたユニットの可能な出口をプロファイリングすることによって、たとえ頻繁に実行される命令がプロファイルされた何れのブランチを通しても到達されない場合においても、それを確実に変換する方法である。
【0355】
本発明の第9実施形態
動的変換のためのブロックピッキング閾値
第9実施形態の概容
動的変換は、1つのマシン語で書いたコンピュータプログラムを、そのプログラムの実行中に、他のマシン語で書いたものに変換する動作である。動的変換プログラムは、頻繁に実行される変換元プログラム部分を全て変換し、たまにしか実行されない部分の全てを無視しなければならない。このことを達成するため、変換システムはブランチ命令をプロファイルし、実行確率が特定の閾値以下の命令に関しては変換を行わない。
【0356】
第9実施形態に関する図の説明
図35は、本発明の第9実施形態に従って、動的変換プログラムが如何にブランチプロファイル情報を用いて、基本ブロックの実行確率を計算するかを示す。
【0357】
第9実施形態の詳細な説明
動的変換プログラムの目的は、1つのコンピュータプログラムのオリジナル変換元言語命令を、さらに効率の良いターゲット言語命令に変換することによって、そのコンピュータ全体の実行速度を改善することである。動的変換の利点はオリジナルプログラムを実行するための合計時間を、そのプログラムの変換に要する時間と変換されたプログラムの実行時間の和と比較することによって計られる。プログラムのどの部分を変換するにしても、その変換に要する時間はほぼ一定であるから、1部を変換することの利益は、基本的にその部分を使用する回数によって決まる。頻繁に実行される命令は変換する価値があるが、まれにしか実行されない命令はその価値はない。
【0358】
異なる命令の実行頻度を計るために、動的変換システムはブランチ命令をプロファイルすることができる。このプロファイル情報を用いれば、頻繁に実行される命令を選択することができ、その点で変換することができる。初期命令の後、変換プログラムは、たまにしか実行されないサクセサ命令を読まないようにして、できるだけ多くの頻繁に実行されるサクセサ命令を読もうとする。ブロックピッキング閾値は、サクセサ命令が頻繁に実行されているか、又はたまにしか実行されていないかを決定するのに使用される。
【0359】
動的変換プログラムは、基本ブロックと称する単位で命令を読む。1つの基本ブロックでは、全ての命令は同じ回数だけ実行される。従って、命令は、その全てが頻繁に実行されるか、又はその全てがたまにしか実行されないかの何れかとなる。
【0360】
動的変換プログラムはブランチ命令からの情報を用いて、基本ブロックが頻繁に実行されるか、たまにしか実行されないかを決定する。この処理を図35に示す。変換プログラムは、実行経路が第1の変換された命令から、与えられた基本ブロックに向けて取られる確率を計算する。第1の基本ブロックは、第1の命令を含むから、それには100%の確率が与えられる。もしこの現在のブロックがサクセサだけしか持っていなければ、そのサクセサは現在のブロックと同じ実行確率を持っている。もし現在のブロックが条件付きブランチに終わっていれば、現在のブロックの確率は、ブランチプロファイル情報に従って2つのサクセサに分けられる。例えば、現在のブロックの実行確率が50%であって、ブランチ命令で40回実行され、10回取られて終われば、ブランチテイクンサクセサの確率は 50%*25%=12.5 、フォールスルーサクセサの確率は 50%*75%=37.5% となる。
【0361】
ブロックピッキング閾値と呼ばれる可変閾値は、頻繁に実行されるブロックを選択するのに使用される。もしブロックの実行確率がこの閾値より大きいか、又は等しければ、そのブロックは高い頻度で使用されると考えて、変換される。またもしブロックの実行確率がこの閾値未満であれば、そのブロックは低い頻度でしか使用されないと考えて、変換さない。
【0362】
このブロックピッキング方法の1つの重要な特性は、選択されたブロックセットが接続されることである。この実行確率を計算する方法として、更に複雑な方法、例えば全ての手続きからの確率を加算する等の方法がある。しかし、この方法では、ブロックセットは不連続なものとなる。不連続なブロックセットを変換することは可能だが、もしそれらが全て接続されていれば、変換されたコードを最適化するもっと多くの機会が得られる。
【0363】
第9実施形態の特別目的
本発明の第9実施形態は、変換に当たって、たまにしか実行されないブロックから頻繁に実行されるブロックを分離する実行確率の閾値を用いて、頻繁に実行される命令のブロックを選択すると共に、たまにしか実行されない命令のブロックを無視することによって、動的変換効率を改善する方法を目指す。
【0364】
第9実施形態の要約
動的変換システムのコストは、変換された命令の数に比例すると共に、その利益は変換された命令が実行される回数に比例する。それ故、頻繁に実行される命令だけを変換し、たまにしか実行されない命令を無視することが最も効率的である。本発明は、変換に当たって、たまにしか実行されないブロックから頻繁に実行されるブロックを分離する実行確率の閾値を用いて、頻繁に実行される命令のブロックを選択すると共に、たまにしか実行されない命令のブロックを無視することによって、動的変換効率を改善する方法である。
【0365】
これまで、本発明に関する幾つかの好適実施形態について、それらを図示し、説明してきたが、これら実施形態について、本発明の原理及び精神から逸脱することなく変更が可能であることは、当業者の理解するところであろう。本発明の範囲は、請求の範囲の記載及びそれと均等なものにある。
【0366】
以上の説明により本発明は次のような特徴を有する。 (1)変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、該変換元オブジェクトコードのブランチ命令の実行数を決定するインタプリタと、
対応するブランチ命令の実行数が閾値を越えたときに該変換元オブジェクトコードの命令をセグメントにグループ化し、該セグメントを動的にコンパイルするコンパイラと、
を具備するコンピュータアーキテクチャエミュレーションシステム。
【0367】
(2)コンパイルされないセグメントに対応するブランチ命令は、メモリに記憶される、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0368】
(3)該閾値を越えなかったブランチ命令に対応するセグメントは、コンパイルされない、前記(2)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0369】
(4)前記インタプリタが、該変換されたオブジェクトコード命令を実行している間に、コンパイルされないブランチ命令に対応するセグメントは、メモリに記憶される、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0370】
(5)前記インタプリタ及び前記コンパイラは、実時間でマルチタスキングオペレーティングシステムにて同時に動作するタスクである、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0371】
(6)前記インタプリタによって決定されたブランチ命令のブランチプロファイル情報を記憶するブランチロガーを更に具備する、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0372】
(7)前記ブランチプロファイル情報は、ブランチアドレス、ブランチサクセサ、非ブランチサクセサ、ブランチ実行カウント、及びブランチテイクンカウントを含み、
前記ブランチプロファイル情報は、ブランチ命令エミュレーションの間に前記インタプリタによって記録される、
前記(6)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0373】
(8)変換可能な命令へのジャンプ又はそれからのジャンプを実行するブランチ命令の後にコードフラグが置かれ、
該対応するコードフラグを参照することにより、該対応するブランチ命令に対するサクセサ命令が変換可能か否かを決定すべくチェックされる、
前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0374】
(9)ブランチ命令に対するサクセサ命令の実行数が対応する閾値を上回ったとき、該ブランチ命令の最初の変換が実行される、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0375】
(10)頻繁にブランチされる命令に対応するセグメントの変換を開始するため、前記インタプリタが変換元オブジェクトコードのエミュレーションを継続している間、前記インタプリタと前記コンパイラとが通信する、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0376】
(11)変換されるべきセグメントを記憶する待ち行列が所定の容量に達したとき、閾値を上げることによって、コンパイルされるべきセグメントのコンパイル率が制御される、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0377】
(12)前記コンパイラは、コンパイルが開始されたアドレスに対応するプロファイルを使用して、メモリに記憶されている各命令を順次追跡する間に、最適化されたオブジェクトコードを生成する、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0378】
(13)前記コンパイラは、ブロックが起こしたページフォールトを検出した際にはブロックをコンパイルせず、ブランチロガーにブランチ情報を記録するためのオブジェクトコードを作成する、前記(12)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0379】
(14)命令実行処理が所定の実行率でタイムリーに実行されていない場合、前記コンパイラは、プロファイルを用いて実行状態を追跡し、ブランチカウントが所定数を下回っているか否かをチェックし、ブランチ情報を記録するためオブジェクトコードを作成する、前記(13)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0380】
(15)実行数を含む変換元オブジェクトコードにおけるブランチ命令のプロファイル情報を記憶するとともに、頻繁に実行されるブランチ命令のプロファイル情報を記録するキャシュと、頻繁には実行されないブランチ命令のプロファイル命令を記憶するブランチログと、を含むブランチロガー、を更に具備する、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0381】
(16)プロファイル情報は、ブランチアドレス情報とブランチ変換先情報とを組み合わせてキャシュに組織される、前記(15)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0382】
(17)キャッシュに組織されるプロファイル情報は複数のグループに記憶され、各グループはプロファイル情報のエントリの降順にそれぞれのグループ内に組織される、前記(16)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0383】
(18)各ブランチ命令はシードであり、前記コンパイラは、
変換元オブジェクトコードのセグメントを選択して、該シード及び該ブランチのプロファイル情報に基づいてコンパイルするブロックピッカと、
該セグメントを命令の線形リストへと平坦化するブロックレイアウトユニットと、
オリジナル命令を変換されたコードセグメント命令に実際にコンパイルする最適化コード発生ユニットと、
を更に含む、前記(1)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0384】
(19)ブロックピッカは、オリジナル命令を記述する制御フローグラフを生成してコンパイルし、該制御フローグラフをブロックレイアウトユニットに渡す、前記(18)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0385】
(20)変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
変換元オブジェクトコードを、対応する変換されたオブジェクトコードに、それぞれ変換すると共に、それぞれが変換されたオブジェクトコード命令の実行の間に、実時間で変換元オブジェクトコードのブランチ情報をプロファイルする複数のインタプリタと、
前記複数のインタプリタの何れかからの変換元オブジェクトコード命令を、変換元オブジェクトコードに於ける対応するブランチ命令に基づいてセグメントにグループ化し、対応するブランチ命令の実行数が閾値より大きいとき、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラと、
を具備するコンピュータアーキテクチャエミュレーションシステム。
【0386】
(21)前記複数のインタプリタの各々は、ブランチ命令をプロファイルすると共に、閾値を越えなかったブランチ命令を、ブランチロガーをコールして記憶する、前記(20)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0387】
(22)変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換するインタプリタであって、変換元オブジェクトコードのブランチ命令を、各ブランチ命令に関する実行数を記憶すると共にその実行数を閾値と比較することによって、プロファイルし、閾値を越えたブランチ命令をシードとして指定するインタプリタと、
該シードに基づいて、変換元オブジェクトコード命令をセグメントにグループ化し、前記インタプリタによる変換及びプロファイリングの間に、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラと、
を具備するコンピュータアーキテクチャエミュレーションシステム。
【0388】
(23)各セグメントは、対応するシードに基づいて変換元オブジェクトコードを最適化した結果得られた命令を含み、
各セグメントは、単位として導入及び非導入される、
前記(22)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0389】
(24)コンパイルされないセグメントに対応するブランチ命令はメモリに記憶され、閾値を越えないブランチ命令に対応するセグメントはコンパイルされない、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0390】
(25)前記インタプリタによって決定されたブランチ命令のブランチプロファイル情報を記憶するブランチロガーを更に具備し、該ブランチプロファイル情報は、ブランチアドレス、ブランチサクセサ、非ブランチサクセサ、ブランチ実行カウント、及びブランチテイクンカウントを含むとともに、ブランチ命令のエミュレーションの間に、前記インタプリタによって記録される、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0391】
(26)変換可能な命令へのジャンプ又はそれからのジャンプを実行するブランチ命令の後にコードフラグが置かれ、
対応するコードフラグを参照して、対応するブランチ命令が変換可能か否かを決定するために、サクセサ命令がチェックされる、
前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0392】
(27)ブランチ命令に対するサクセサ命令の実行数が閾値を上回ったときにブランチ命令が最初に変換される、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0393】
(28)変換されるべきセグメントを記憶する待ち行列が所定の容量に達したとき、閾値を上げることによって、セグメントのコンパイル率が、コンパイルされるべく制御される、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0394】
(29)命令実行処理が所定の実行率でタイムリーに実行されていない場合に、前記コンパイラは、プロファイルを用いて実行状態を追跡し、ブランチカウントが所定数を下回っているか否かをチェックし、ページフォールトのようなブランチ情報を記録するためのオブジェクトコードを作成する、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0395】
(30)実行数を含む変換元オブジェクトコードにおけるブランチ命令のプロファイル情報を記憶するブランチロガーであって、頻繁に実行されるブランチ命令のプロファイル情報を記憶するキャシュと、頻繁には実行されないブランチ命令のプロファイル命令を記憶するブランチログと、を含むブランチロガー、を更に具備し、
プロファイル情報は、ブランチアドレス情報とブランチ変換先情報とを組み合わせてキャシュに組織されるとともに、該プロファイル情報は、複数のグループに、該グループへのエントリの降順に記憶される、
前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0396】
(31)前記コンパイラは、
変換元オブジェクトコードのセグメントを選択し、該シード及び該ブランチのプロファイル情報に基づいてコンパイルするブロックピッカであって、オリジナル命令を記述する制御フローグラフを生成し、そのグラフをコンパイルするブロックピッカと、
該制御フローグラフを命令の線形リストへと平坦化するブロックレイアウトユニットと、
オリジナル命令を変換されたコードセグメント命令に実際にコンパイルする最適化コード発生ユニットと、
を更に含む、前記(23)に記載のコンピュータアーキテクチャエミュレーションシステム。
【0397】
(32)多重タスキング変換先コンピュータアーキテクチャ上で変換元コンピュータアーキテクチャをエミュレートする多重タスキングコンピュータアーキテクチャエミュレーションシステムであって、
変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、変換元オブジェクトコードのブランチ命令の実行数を決定するインタプリタタスクと、
多重タスキング変換先コンピュータアーキテクチャ上で前記インタプリタタスクと共に動作するコンパイラタスクであって、対応するブランチ命令の実行数が閾値を越えたとき変換元オブジェクトコードの命令をセグメントにグループ化し、このセグメントを動的にコンパイルするコンパイラタスクと、
を具備する多重タスキングコンピュータアーキテクチャエミュレーションシステム。
【0398】
(33)前記多重タスキングコンピュータアーキテクチャエミュレーションシステムは動的変換システムであり、前記多重タスキングコンピュータアーキテクチャシステムは、
前記インタプリタタスクによって送られるコンパイル要求の率と、前記コンパイラタスクによって完成されるコンパイルの率とを、閾値を変えることによってコンパイラタスクが遊休状態に入らないようにしつつ、等しくするソフトウェアフィードバック、
を更に具備する、前記(32)に記載の多重タスキングコンピュータアーキテクチャエミュレーションシステム。
【0399】
(34)前記コンパイラタスクによってコンパイルされるべきセグメントを記憶する待ち行列を更に具備し、閾値は前記コンパイラタスクをon又はoffする最小閾値と比較される、
前記(33)に記載の多重タスキングコンピュータアーキテクチャエミュレーションシステム。
【図面の簡単な説明】
【図1】本発明の好適実施形態によるOOCTシステムの高レベルアーキテクチャを示すブロック図である。
【図2】最適化オブジェクトコード変換の主要構成要素を、オリジナルコードの1つのセクションをコンパイルするための制御フローと共に示す流れ図である。
【図3】通常の実行時に於ける最適化オブジェクトコード変換の制御フローを示す流れ図である。
【図4】各種変数を設定した時のOOCTバッファの概略図である。
【図5】(a)、(b)及び(c)は変換テーブルの構造を示す概略図である。
【図6】インタプリタがセグメントに入り、そして其処から出る過程を示すブロック図である。
【図7】セグメントを生成し、インタプリタによるセグメントへの到達を可能とし、旧セグメントには到達不能とし、そして旧セグメントを削除するコンパイル方法を示すブロック図である。
【図8】BRANCH_RECORDの構造を示すブロック図である。
【図9】BRANCH_RECORDs を記憶する大きいハッシュテーブルの一部としてのブランチログの構造を示す概略図である。
【図10】BRANCH_L1_RECORDs の2次元配列であるL1キャッシュを示す概略図である。
【図11】インタプリタによるL1キャッシュの動作を実行する方法を示す概略図である。
【図12】本発明の実施形態によるコンパイラの全体構造を示す概略図である。
【図13】本発明の実施形態によるブロックピッカの例を示す概略図である。
【図14】ENTRY 命令とGOTO命令の間にフィルを挿入した2つの外部入力点を備えたコードアウトラインを示すブロック図である。
【図15】OASSIGN 挿入例を示すブロック図である。
【図16】デッドコード削除及びアドレスチェック削除の例を示すブロック図である。
【図17】アドレスチェック削除の例を示すブロック図である。
【図18】共通部分式削除(“CSE”)の例を示すブロック図である。
【図19】コピー伝播の例を示すブロック図である。
【図20】定数の畳込み例を特に示す。
【図21】本発明の実施形態による比較インフラストラクチャをを有する上記処理の例を特に示す。
【図22】異なる周囲命令に対して同じ命令のためのコードを発生するコード発生例を特に示す。
【図23】本発明の第2実施形態による動的最適化オブジェクトコード変換に用いるシステム構成を示す。
【図24】本発明の第3実施形態による同時動的変換に用いるシステム構成を示す。
【図25】本発明の第3実施形態に従ってインタプリタとコンパイラを、例えば1つのタスク実行に際して結合する場合と、例えばそれらを異なるタスク実行に際して分離する場合との差を示す。
【図26】本発明の第4実施形態に従って、どの命令が変換可能であり、どの命令が変換不能であるかを記録するのに使用する変換テーブルを示す。
【図27】本発明の第4実施形態による方法が、エミュレータに関するプロファイリング負担を如何に低減するかを示す。
【図28】本発明の第5実施形態によりインタプリタとコンパイラを分離した動的変換システムの全体構造を示す。
【図29】本発明の第5実施形態によるソフトウエアフィードバック機構の構成要素を示す。
【図30】本発明の第6実施形態によって、変換タスク実行中に、如何に待ち行列を用いて変換要求を保持するかを示す。
【図31】本発明の第6実施形態によって、如何にOOCTが要求する待ち行列が、安価な共用メモリ要求と、システムコール要求とを組み合わせるかを示す。
【図32】本発明の第7実施形態によって、変換元命令の通常実行時には起きないページフォールトを、如何にして動的変換プログラムがそれを起こす可能性があるかを示す。
【図33】変換処理中にページフォールトから回復し、変換処理を続行するための本発明の第7実施形態によるアルゴリズムを示す。
【図34】本発明の第8実施形態によるブランチプロファイラを有する動的変換システムに於ける制御フローのパターンを示す。
【図35】本発明の第9実施形態によって、動的変換プログラムが如何にブランチプロファイル情報を用いて、基本ブロックの実行確率を計算するかを示す。
【符号の説明】
100…OOCTシステム
104…コンパイラ
108…コンパイルされたコードセグメント
110…インタプリタ
112…ブランチロガー
114…ブロックピッカ
116…ブロックレイアウトユニット
118…最適化コード発生ユニット
120…セグメント導入ユニット
124…IL(中間言語)発生器
126…オプティマイザ
128…コード発生器

Claims (12)

  1. 変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
    変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、該変換元オブジェクトコードのブランチ命令の実行回数を決定するインタプリタ手段と、
    対応するブランチ命令の実行回数が閾値を超えたときに該変換元オブジェクトコードの命令をセグメントにグループ化し、該セグメントを動的にコンパイルするコンパイラ手段と、
    を具備するコンピュータアーキテクチャエミュレーションシステム。
  2. 前記インタプリタ手段及び前記コンパイラ手段は、実時間でマルチタスキングオペレーティングシステムにて同時に動作するタスクである、請求項1に記載のコンピュータアーキテクチャエミュレーションシステム。
  3. 変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
    変換元オブジェクトコードを、対応する変換されたオブジェクトコードに、それぞれ変換すると共に、それぞれが変換されたオブジェクトコード命令の実行の間に、実時間で変換元オブジェクトコードのブランチ情報をプロファイルする複数のインタプリタ手段と、
    前記複数のインタプリタ手段の何れかからの変換元オブジェクトコード命令を、変換元オブジェクトコードに於ける対応するブランチ命令に基づいてセグメントにグループ化し、対応するブランチ命令の実行回数が閾値より大きいとき、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラ手段と、
    を具備するコンピュータアーキテクチャエミュレーションシステム。
  4. 前記複数のインタプリタ手段の各々は、ブランチ命令をプロファイルすると共に、閾値を超えなかったブランチ命令を、ブランチロガーをコールして記憶する、請求項3に記載のコンピュータアーキテクチャエミュレーションシステム。
  5. 変換先コンピュータアーキテクチャシステム上で変換元コンピュータアーキテクチャをエミュレートするコンピュータアーキテクチャエミュレーションシステムであって、
    変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換するインタプリタ手段であって、変換元オブジェクトコードのブランチ命令を、各ブランチ命令に関する実行回数を記憶すると共に該実行回数を閾値と比較することによって、プロファイルし、閾値を超えたブランチ命令をシードとして指定するインタプリタ手段と、
    該シードに基づいて、変換元オブジェクトコード命令をセグメントにグループ化し、前記インタプリタ手段による変換及びプロファイリングの間に、変換元オブジェクトコードのセグメントを動的にコンパイルするコンパイラ手段と、
    を具備するコンピュータアーキテクチャエミュレーションシステム。
  6. 各セグメントは、対応するシードに基づいて変換元オブジェクトコードを最適化した結果得られた命令を含み、
    各セグメントは、一単位としてインストール及びアンインストールされる、
    請求項5に記載のコンピュータアーキテクチャエミュレーションシステム。
  7. 前記インタプリタ手段によって決定されたブランチ命令のブランチプロファイル情報を記憶するブランチロガー手段を更に具備し、該ブランチプロファイル情報は、ブランチアドレス、ブランチサクセサ、非ブランチサクセサ、ブランチ実行カウント、及びブランチテイクンカウントを含むとともに、ブランチ命令のエミュレーションの間に、前記インタプリタ手段によって記録される、請求項6に記載のコンピュータアーキテクチャエミュレーションシステム。
  8. セグメントがブランチデスティネーションの命令を含まない場合、前 記コンパイラ手段は、実行回数を記憶し該実行回数を閾値と比較することにより該ブランチデスティネーションへのブランチをプロファイルするオブジェクトコードを前記セグメントに追加して、該閾値を超えるブランチ命令がシードとして指定されるようにする、請求項6に記載のコンピュータアーキテクチャエミュレーションシステム。
  9. 実行回数を含む変換元オブジェクトコードにおけるブランチ命令のプロファイル情報を記憶するブランチロガー手段であって、頻繁に実行されるブランチ命令のプロファイル情報を記憶するキャシュと、頻繁には実行されないブランチ命令のプロファイル情報を記憶するブランチログと、を含むブランチロガー手段、を更に具備し、
    プロファイル情報は、ブランチアドレス情報とブランチデスティネーション情報とを組み合わせてキャシュに組織されるとともに、該プロファイル情報は、複数のグループに、該グループへのエントリの降順に記憶される、
    請求項6に記載のコンピュータアーキテクチャエミュレーションシステム。
  10. 前記コンパイラ手段は、
    該シード及び該ブランチのプロファイル情報に基づいて、コンパイルされる変換元オブジェクトコードのセグメントを選択するブロックピッカ手段であって、コンパイルされるオリジナル命令を記述する制御フローグラフを生成するブロックピッカと、
    該制御フローグラフを命令の線形リストへと平坦化するブロックレイアウトユニットと、
    オリジナル命令を変換されたコードセグメント命令に実際にコンパイルする最適化コード発生ユニットと、
    を更に含む、請求項6に記載のコンピュータアーキテクチャエミュレーションシステム。
  11. 多重タスキング変換先コンピュータアーキテクチャ上で変換元コンピュータアーキテクチャをエミュレートする多重タスキングコンピュータアーキテクチャエミュレーションシステムであって、
    変換元オブジェクトコードを対応する変換されたオブジェクトコードにそれぞれ変換し、変換元オブジェクトコードのブランチ命令の実行回数を決定するインタプリタタスク手段と、
    多重タスキング変換先コンピュータアーキテクチャ上で前記インタプリタタスク手段と共に動作するコンパイラタスク手段であって、対応するブランチ命令の実行回数が閾値を越えたとき変換元オブジェクトコードの命令をセグメントにグループ化し、セグメントを動的にコンパイルするコンパイラタスク手段と、
    を具備する多重タスキングコンピュータアーキテクチャエミュレーションシステム。
  12. 前記多重タスキングコンピュータアーキテクチャエミュレーションシステムは動的変換システムであり、前記多重タスキングコンピュータアーキテクチャシステムは、
    前記インタプリタタスク手段によって送られるコンパイル要求の率と、前記コンパイラタスク手段によって完成されるコンパイルの率とを、閾値を変えることによってコンパイラタスク手段アイドルに入らないようにしつつ、等しくするソフトウェアフィードバック手段
    を更に具備する、請求項11に記載の多重タスキングコンピュータアーキテクチャエミュレーションシステム。
JP29957699A 1998-10-21 1999-10-21 コンピュータアーキテクチャエミュレーションシステム Expired - Lifetime JP3553834B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/176112 1998-10-21
US09/176,112 US6463582B1 (en) 1998-10-21 1998-10-21 Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method

Publications (2)

Publication Number Publication Date
JP2000132408A JP2000132408A (ja) 2000-05-12
JP3553834B2 true JP3553834B2 (ja) 2004-08-11

Family

ID=22643028

Family Applications (1)

Application Number Title Priority Date Filing Date
JP29957699A Expired - Lifetime JP3553834B2 (ja) 1998-10-21 1999-10-21 コンピュータアーキテクチャエミュレーションシステム

Country Status (4)

Country Link
US (2) US6463582B1 (ja)
JP (1) JP3553834B2 (ja)
CN (1) CN1308818C (ja)
DE (1) DE19945992B4 (ja)

Families Citing this family (420)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH11296381A (ja) * 1998-04-08 1999-10-29 Matsushita Electric Ind Co Ltd 仮想マシン及びコンパイラ
US6199201B1 (en) * 1998-08-03 2001-03-06 Xerox Corporation Software constructs that facilitate partial evaluation of source code
ATE457492T1 (de) * 1998-10-10 2010-02-15 Ibm Programmkodekonvertierung mit verringerter übersetzung
EP0997815A3 (en) * 1998-10-29 2004-05-26 Texas Instruments Incorporated Interactive translation system and method
GB9825102D0 (en) * 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
US8127121B2 (en) 1999-01-28 2012-02-28 Ati Technologies Ulc Apparatus for executing programs for a first computer architechture on a computer of a second architechture
US6826748B1 (en) * 1999-01-28 2004-11-30 Ati International Srl Profiling program execution into registers of a computer
US8121828B2 (en) 1999-01-28 2012-02-21 Ati Technologies Ulc Detecting conditions for transfer of execution from one computer instruction stream to another and executing transfer on satisfaction of the conditions
US8074055B1 (en) 1999-01-28 2011-12-06 Ati Technologies Ulc Altering data storage conventions of a processor when execution flows from first architecture code to second architecture code
US7275246B1 (en) * 1999-01-28 2007-09-25 Ati International Srl Executing programs for a first computer architecture on a computer of a second architecture
US7111290B1 (en) 1999-01-28 2006-09-19 Ati International Srl Profiling program execution to identify frequently-executed portions and to assist binary translation
US6954923B1 (en) 1999-01-28 2005-10-11 Ati International Srl Recording classification of instructions executed by a computer
US7941647B2 (en) 1999-01-28 2011-05-10 Ati Technologies Ulc Computer for executing two instruction sets and adds a macroinstruction end marker for performing iterations after loop termination
JP4088379B2 (ja) * 1999-01-29 2008-05-21 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイル方法及び装置、並びにスタック・トレース方法及び装置
US6662354B1 (en) * 1999-01-29 2003-12-09 Unisys Corporation Determining destinations of a dynamic branch
US7058932B1 (en) * 1999-04-19 2006-06-06 Unisys Corporation System, computer program product, and methods for emulation of computer programs
US6779107B1 (en) 1999-05-28 2004-08-17 Ati International Srl Computer execution by opportunistic adaptation
JP2001005675A (ja) * 1999-06-21 2001-01-12 Matsushita Electric Ind Co Ltd プログラム変換装置及びプロセッサ
JP4041248B2 (ja) * 1999-07-09 2008-01-30 松下電器産業株式会社 コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
CA2279222C (en) * 1999-07-30 2002-07-16 Ibm Canada Limited-Ibm Canada Limitee Direct call threaded code
US6629312B1 (en) * 1999-08-20 2003-09-30 Hewlett-Packard Development Company, L.P. Programmatic synthesis of a machine description for retargeting a compiler
US6772106B1 (en) * 1999-08-20 2004-08-03 Hewlett-Packard Development Company, L.P. Retargetable computer design system
WO2001022228A1 (en) 1999-09-17 2001-03-29 Nortel Networks Limited System and method for producing a verification system for verifying procedure interfaces
US7761857B1 (en) * 1999-10-13 2010-07-20 Robert Bedichek Method for switching between interpretation and dynamic translation in a processor system based upon code sequence execution counts
US6714904B1 (en) * 1999-10-13 2004-03-30 Transmeta Corporation System for using rate of exception event generation during execution of translated instructions to control optimization of the translated instructions
US6880152B1 (en) * 1999-10-13 2005-04-12 Transmeta Corporation Method of determining a mode of code generation
JP3608993B2 (ja) * 1999-11-10 2005-01-12 富士通株式会社 コンパイラ装置及びコンパイラプログラムを記録した記録媒体
JP3356742B2 (ja) * 1999-11-17 2002-12-16 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム実行方法
GB2364579A (en) * 1999-11-30 2002-01-30 Sgs Thomson Microelectronics An assembler using a descriptor file that contains information descriptive of the instruction set of a target microprocessor
US6681387B1 (en) * 1999-12-01 2004-01-20 Board Of Trustees Of The University Of Illinois Method and apparatus for instruction execution hot spot detection and monitoring in a data processing unit
DE19963832A1 (de) * 1999-12-30 2001-07-05 Ericsson Telefon Ab L M Programmprofilierung
US7100164B1 (en) * 2000-01-06 2006-08-29 Synopsys, Inc. Method and apparatus for converting a concurrent control flow graph into a sequential control flow graph
US6986128B2 (en) * 2000-01-07 2006-01-10 Sony Computer Entertainment Inc. Multiple stage program recompiler and method
US20020066081A1 (en) * 2000-02-09 2002-05-30 Evelyn Duesterwald Speculative caching scheme for fast emulation through statically predicted execution traces in a caching dynamic translator
US6594821B1 (en) 2000-03-30 2003-07-15 Transmeta Corporation Translation consistency checking for modified target instructions by comparing to original copy
US6862565B1 (en) * 2000-04-13 2005-03-01 Hewlett-Packard Development Company, L.P. Method and apparatus for validating cross-architecture ISA emulation
US6862730B1 (en) * 2000-04-26 2005-03-01 Lucent Technologies Inc. Register allocation in code translation between processors
JP2001325111A (ja) * 2000-05-16 2001-11-22 Hitachi Ltd 投機機構向けコンパイル方法
US6968542B2 (en) * 2000-06-16 2005-11-22 Hewlett-Packard Development Company, L.P. Method for dynamically identifying pseudo-invariant instructions and their most common output values on frequently executing program paths
US6615300B1 (en) * 2000-06-19 2003-09-02 Transmeta Corporation Fast look-up of indirect branch destination in a dynamic translation system
SE0002440D0 (sv) 2000-06-28 2000-06-28 Virtutech Ab Interpreter
US6553362B2 (en) * 2000-07-14 2003-04-22 Hewlett-Packard Development Company, L.P. Case-reduced verification condition generation system and method using weakest precondition operator expressed using strongest postcondition operators
US6701518B1 (en) * 2000-08-03 2004-03-02 Hewlett-Packard Development Company, L.P. System and method for enabling efficient processing of a program that includes assertion instructions
US6868434B1 (en) * 2000-08-07 2005-03-15 Sun Microsystems, Inc. System and method for testing server latencies using multiple concurrent users in a computer system
US7124407B1 (en) * 2000-08-16 2006-10-17 Sun Microsystems, Inc. Method and apparatus for caching native code in a virtual machine interpreter
JP2002073345A (ja) * 2000-08-25 2002-03-12 Fujitsu Ltd 情報処理装置及び記録媒体
US6691306B1 (en) * 2000-12-22 2004-02-10 Lsi Logic Corporation Use of limited program space of general purpose processor for unlimited sequence of translated instructions
US6721943B2 (en) * 2001-03-30 2004-04-13 Intel Corporation Compile-time memory coalescing for dynamic arrays
US7099970B1 (en) * 2001-04-03 2006-08-29 Electronic Label Technology, Inc. Apparatus and method to enhance a one-wire bus
US7356673B2 (en) * 2001-04-30 2008-04-08 International Business Machines Corporation System and method including distributed instruction buffers for storing frequently executed instructions in predecoded form
CA2346762A1 (en) * 2001-05-07 2002-11-07 Ibm Canada Limited-Ibm Canada Limitee Compiler generation of instruction sequences for unresolved storage devices
US6993751B2 (en) * 2001-05-14 2006-01-31 Microsoft Corporation Placing exception throwing instructions in compiled code
US6851110B2 (en) * 2001-06-07 2005-02-01 Hewlett-Packard Development Company, L.P. Optimizing an executable computer program having address-bridging code segments
US7110525B1 (en) 2001-06-25 2006-09-19 Toby Heller Agent training sensitive call routing system
US6880154B2 (en) * 2001-06-29 2005-04-12 Intel Corporation Alias-free test for dynamic array structures
US20030033593A1 (en) * 2001-08-08 2003-02-13 Evelyn Duesterwald Dynamic execution layer interface for explicitly or transparently executing application or system binaries
US6966053B2 (en) * 2001-08-10 2005-11-15 The Boeing Company Architecture for automated analysis and design with read only structure
US7207035B2 (en) * 2001-08-23 2007-04-17 International Business Machines Corporation Apparatus and method for converting an instruction and data trace to an executable program
US6857119B1 (en) * 2001-09-25 2005-02-15 Oracle International Corporation Techniques for modifying a compiled application
CA2359862A1 (en) * 2001-10-24 2003-04-24 Ibm Canada Limited - Ibm Canada Limitee Using identifiers and counters for controlled optimization compilation
US6976249B1 (en) * 2001-11-12 2005-12-13 Apple Computer, Inc. Method for embedding object codes in source codes
US20030093774A1 (en) * 2001-11-14 2003-05-15 Ronald Hilton State-specific variants of translated code under emulation
US6738969B2 (en) 2001-11-14 2004-05-18 Sun Microsystems, Inc. Non-intrusive gathering of code usage information to facilitate removing unused compiled code
US20030101439A1 (en) * 2001-11-29 2003-05-29 Giuseppe Desoli System and method for supporting emulation of a computer system through dynamic code caching and transformation
US7251594B2 (en) * 2001-12-21 2007-07-31 Hitachi, Ltd. Execution time modification of instruction emulation parameters
DE10204345A1 (de) * 2002-02-01 2003-08-14 Systemonic Ag Verfahren zur Befehlsbearbeitung
GB0202728D0 (en) * 2002-02-06 2002-03-27 Transitive Technologies Ltd Condition code flag emulation for program code conversion
US7331040B2 (en) * 2002-02-06 2008-02-12 Transitive Limted Condition code flag emulation for program code conversion
US7134115B2 (en) * 2002-02-07 2006-11-07 Matsushita Electric Industrial Co., Ltd. Apparatus, method, and program for breakpoint setting
US20030167457A1 (en) * 2002-03-01 2003-09-04 Thompson Carol L. System and method for providing an optimizer display tool
WO2003079196A2 (en) * 2002-03-20 2003-09-25 Research In Motion Limited System and method of secure garbage collection on a mobile device
US8086438B2 (en) * 2002-03-27 2011-12-27 Synopsys, Inc. Method and system for instruction-set architecture simulation using just in time compilation
US7506321B1 (en) * 2002-06-11 2009-03-17 Unisys Corporation Computer emulator employing direct execution of compiled functions
JP3956113B2 (ja) * 2002-06-13 2007-08-08 インターナショナル・ビジネス・マシーンズ・コーポレーション データ処理装置及びプログラム
JP2004021425A (ja) * 2002-06-13 2004-01-22 Hitachi Ltd コンパイラにおけるメモリ配置方式
EP1377034A1 (en) * 2002-06-27 2004-01-02 Thomson Licensing S.A. Data processing device and method for interactive television
US7926032B2 (en) * 2002-07-18 2011-04-12 International Business Machines Corporation Two meta-level modeling approach for mapping typed data
US7107585B2 (en) * 2002-07-29 2006-09-12 Arm Limited Compilation of application code in a data processing apparatus
US7219328B2 (en) * 2002-08-28 2007-05-15 Honeywell International Inc. Model-based composable code generation
US8108843B2 (en) * 2002-09-17 2012-01-31 International Business Machines Corporation Hybrid mechanism for more efficient emulation and method therefor
US9043194B2 (en) * 2002-09-17 2015-05-26 International Business Machines Corporation Method and system for efficient emulation of multiprocessor memory consistency
US7496494B2 (en) * 2002-09-17 2009-02-24 International Business Machines Corporation Method and system for multiprocessor emulation on a multiprocessor host system
US7953588B2 (en) * 2002-09-17 2011-05-31 International Business Machines Corporation Method and system for efficient emulation of multiprocessor address translation on a multiprocessor host
US7146607B2 (en) * 2002-09-17 2006-12-05 International Business Machines Corporation Method and system for transparent dynamic optimization in a multiprocessing environment
US7124237B2 (en) * 2002-10-03 2006-10-17 Seagate Technology Llc Virtual machine emulation in the memory space of a programmable processor
US6775810B2 (en) * 2002-10-08 2004-08-10 Sun Microsystems, Inc. Boosting simulation performance by dynamically customizing segmented object codes based on stimulus coverage
US7603664B2 (en) * 2002-10-22 2009-10-13 Sun Microsystems, Inc. System and method for marking software code
US20040095348A1 (en) * 2002-11-19 2004-05-20 Bleiweiss Avi I. Shading language interface and method
US7194736B2 (en) * 2002-12-10 2007-03-20 Intel Corporation Dynamic division optimization for a just-in-time compiler
US7533012B2 (en) * 2002-12-13 2009-05-12 Sun Microsystems, Inc. Multi-user web simulator
US7143025B2 (en) * 2002-12-13 2006-11-28 Sun Microsystems, Inc. Web simulator
US20040117778A1 (en) * 2002-12-16 2004-06-17 Sehr David C. Optimization of software code using N-bit pointer conversion
US7930490B2 (en) * 2002-12-23 2011-04-19 Siemens Industry, Inc. Method for utilizing a memory device for a programmable logic controller (PLC)
US7188062B1 (en) * 2002-12-27 2007-03-06 Unisys Corporation Configuration management for an emulator operating system
US7111287B2 (en) * 2003-01-10 2006-09-19 International Business Machines Corporation Global processor resource assignment in an assembler
US7100154B2 (en) * 2003-01-16 2006-08-29 International Business Machines Corporation Dynamic compiler apparatus and method that stores and uses persistent execution statistics
US7389501B1 (en) * 2003-02-18 2008-06-17 Microsoft Corporation System and method for register allocation using SSA construction
US7310723B1 (en) 2003-04-02 2007-12-18 Transmeta Corporation Methods and systems employing a flag for deferring exception handling to a commit or rollback point
GB0307805D0 (en) * 2003-04-04 2003-05-07 Intuwave Ltd A method of enabling source code to be used to generate a first and a second software application,each compatible with a different operating system
GB0309056D0 (en) * 2003-04-22 2003-05-28 Transitive Technologies Ltd Block translation optimizations for program code conversion
US7308682B2 (en) * 2003-04-25 2007-12-11 Intel Corporation Method and apparatus for recovering data values in dynamic runtime systems
US7284100B2 (en) 2003-05-12 2007-10-16 International Business Machines Corporation Invalidating storage, clearing buffer entries, and an instruction therefor
US7159122B2 (en) * 2003-05-12 2007-01-02 International Business Machines Corporation Message digest instructions
JP4713820B2 (ja) * 2003-05-28 2011-06-29 パナソニック株式会社 プログラム実行制御装置、プログラム実行制御方法
US20040243379A1 (en) * 2003-05-29 2004-12-02 Dominic Paulraj Ideal machine simulator with infinite resources to predict processor design performance
US7219329B2 (en) * 2003-06-13 2007-05-15 Microsoft Corporation Systems and methods providing lightweight runtime code generation
US7260815B1 (en) * 2003-06-30 2007-08-21 Vmware, Inc. Method and apparatus for managing registers in a binary translator
GB0316531D0 (en) * 2003-07-15 2003-08-20 Transitive Ltd Method and apparatus for performing native binding
US20050028132A1 (en) * 2003-07-31 2005-02-03 Srinivasamurthy Venugopal K. Application specific optimization of interpreters for embedded systems
US20050028148A1 (en) * 2003-08-01 2005-02-03 Sun Microsystems, Inc. Method for dynamic recompilation of a program
US7318222B2 (en) * 2003-08-27 2008-01-08 Sun Microsystems, Inc. Methods for execution control acquistion of a program and for executing an optimized version of a program
US7207038B2 (en) * 2003-08-29 2007-04-17 Nokia Corporation Constructing control flows graphs of binary executable programs at post-link time
DE10344847A1 (de) * 2003-09-26 2005-04-14 Philips Intellectual Property & Standards Gmbh Verfahren zum Compilieren eines Quellcode-Programms in ein maschinenlesbares Zielobjekt-Programm in einer Netzwerkumgebung
US7051301B2 (en) * 2003-10-01 2006-05-23 Hewlett-Packard Development Company, L.P. System and method for building a test case including a summary of instructions
US7584455B2 (en) * 2003-10-23 2009-09-01 Microsoft Corporation Predicate-based test coverage and generation
US20050166192A1 (en) * 2003-11-06 2005-07-28 Polcha Michael P. Run time compiler system and method
US20050149913A1 (en) * 2003-12-29 2005-07-07 Yun Wang Apparatus and methods to optimize code in view of masking status of exceptions
US7747659B2 (en) * 2004-01-05 2010-06-29 International Business Machines Corporation Garbage collector with eager read barrier
US20050154573A1 (en) * 2004-01-08 2005-07-14 Maly John W. Systems and methods for initializing a lockstep mode test case simulation of a multi-core processor design
JP4701611B2 (ja) * 2004-01-15 2011-06-15 株式会社日立製作所 動的変換方式のエミュレータ向けメモリ管理方法
US7478374B2 (en) * 2004-03-22 2009-01-13 Intel Corporation Debug system having assembler correcting register allocation errors
US8677312B1 (en) 2004-03-30 2014-03-18 Synopsys, Inc. Generation of compiler description from architecture description
US8689202B1 (en) 2004-03-30 2014-04-01 Synopsys, Inc. Scheduling of instructions
US7665070B2 (en) * 2004-04-23 2010-02-16 International Business Machines Corporation Method and apparatus for a computing system using meta program representation
CN1294495C (zh) * 2004-05-20 2007-01-10 北京大学 模拟器构造方法
JP4178278B2 (ja) * 2004-05-25 2008-11-12 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ装置、最適化方法、コンパイラプログラム、及び記録媒体
US9280326B1 (en) 2004-05-26 2016-03-08 Synopsys, Inc. Compiler retargeting based on instruction semantic models
CN100359470C (zh) * 2004-06-30 2008-01-02 中国科学院计算技术研究所 动静结合二进制翻译中静态信息不完备的处理方法及装置
US20060037005A1 (en) * 2004-08-15 2006-02-16 Russell Paul F Method and apparatus for increasing computer security
US7747992B2 (en) * 2004-08-23 2010-06-29 Intel Corporation Methods and apparatus for creating software basic block layouts
US20060048106A1 (en) * 2004-08-27 2006-03-02 International Business Machines Corporation Link-time profile-based method for reducing run-time image of executables
US7784039B2 (en) * 2004-09-22 2010-08-24 Panasonic Corporation Compiler, compilation method, and compilation program
US20060070042A1 (en) * 2004-09-24 2006-03-30 Muratori Richard D Automatic clocking in shared-memory co-simulation
US7624384B2 (en) * 2004-11-30 2009-11-24 Intel Corporation Apparatus, system, and method of dynamic binary translation with translation reuse
US20060195732A1 (en) * 2005-02-11 2006-08-31 Joerg Deutschle Method and system for executing test cases for a device under verification
US7913239B2 (en) * 2005-03-08 2011-03-22 International Business Machines Corporation Method and apparatus for a programming framework for pattern matching and transformation of intermediate language expression trees
US7565217B2 (en) * 2005-04-01 2009-07-21 International Business Machines Corporation Traversal of empty regions in a searchable data structure
US7805708B2 (en) * 2005-05-13 2010-09-28 Texas Instruments Incorporated Automatic tool to eliminate conflict cache misses
US7770152B1 (en) * 2005-05-20 2010-08-03 Oracle America, Inc. Method and apparatus for coordinating state and execution context of interpreted languages
US8413162B1 (en) 2005-06-28 2013-04-02 Guillermo J. Rozas Multi-threading based on rollback
US20070006189A1 (en) * 2005-06-30 2007-01-04 Intel Corporation Apparatus, system, and method of detecting modification in a self modifying code
JP4778286B2 (ja) * 2005-09-28 2011-09-21 パナソニック株式会社 コンパイラ装置
US20070169012A1 (en) * 2005-11-14 2007-07-19 Microsoft Corporation Asynchronous just-in-time compilation
FR2895103B1 (fr) * 2005-12-19 2008-02-22 Dxo Labs Sa Procede et systeme de traitement de donnees numeriques
US20070150881A1 (en) * 2005-12-22 2007-06-28 Motorola, Inc. Method and system for run-time cache logging
US9830174B2 (en) * 2005-12-22 2017-11-28 Synopsys, Inc. Dynamic host code generation from architecture description for fast simulation
US7770050B2 (en) * 2006-05-03 2010-08-03 Sony Computer Entertainment Inc. Method and apparatus for resolving clock management issues in emulation involving both interpreted and translated code
US7813909B2 (en) * 2006-05-03 2010-10-12 Sony Computer Entertainment Inc. Register mapping in emulation of a target system on a host system
US7792666B2 (en) * 2006-05-03 2010-09-07 Sony Computer Entertainment Inc. Translation block invalidation prehints in emulation of a target system on a host system
US8266605B2 (en) * 2006-02-22 2012-09-11 Wind River Systems, Inc. Method and system for optimizing performance based on cache analysis
US8615743B2 (en) * 2006-02-27 2013-12-24 Microsoft Corporation Adaptive compiled code
US7873952B2 (en) * 2006-03-09 2011-01-18 Oracle America, Inc. Code transformation to optimize fragments that implement constant loading
US7904894B2 (en) * 2006-03-29 2011-03-08 Microsoft Corporation Automatically optimize performance of package execution
US8099538B2 (en) 2006-03-29 2012-01-17 Intel Corporation Increasing functionality of a reader-writer lock
US7870544B2 (en) * 2006-04-05 2011-01-11 International Business Machines Corporation Insuring maximum code motion of accesses to DMA buffers
US7568189B2 (en) * 2006-05-03 2009-07-28 Sony Computer Entertainment Inc. Code translation and pipeline optimization
JP4884297B2 (ja) * 2006-05-26 2012-02-29 パナソニック株式会社 コンパイラ装置、コンパイル方法およびコンパイラプログラム
GB0613409D0 (en) * 2006-07-06 2006-08-16 Imperas Inc Technique for fast simulation of multi-processor systems with transactional coherence and consistency
US9658849B2 (en) * 2006-07-06 2017-05-23 Imperas Software Ltd. Processor simulation environment
US8301870B2 (en) * 2006-07-27 2012-10-30 International Business Machines Corporation Method and apparatus for fast synchronization and out-of-order execution of instructions in a meta-program based computing system
JP2008097249A (ja) * 2006-10-11 2008-04-24 Internatl Business Mach Corp <Ibm> プログラム中の命令列をより高速な命令に置換する技術
US7934208B2 (en) * 2006-10-13 2011-04-26 International Business Machines Corporation Method for transparent on-line dynamic binary optimization
US7739256B2 (en) * 2006-12-07 2010-06-15 Norman Powell Method for selling custom business software and software exchange marketplace
US8799581B2 (en) * 2007-01-05 2014-08-05 International Business Machines Corporation Cache coherence monitoring and feedback
US8671248B2 (en) * 2007-01-05 2014-03-11 International Business Machines Corporation Architecture support of memory access coloring
US8214813B2 (en) 2007-01-12 2012-07-03 Microsoft Corporation Code optimization across interfaces
MX2009007876A (es) * 2007-01-24 2009-07-31 Ibm Metodo para emular eficientemente configuraciones de codigos de condiciones de arquitectura de computadora.
US7890939B2 (en) * 2007-02-13 2011-02-15 Microsoft Corporation Partial methods
US8443029B2 (en) 2007-03-01 2013-05-14 International Business Machines Corporation Round for reround mode in a decimal floating point instruction
US7934073B2 (en) * 2007-03-14 2011-04-26 Andes Technology Corporation Method for performing jump and translation state change at the same time
US8245202B2 (en) * 2007-04-18 2012-08-14 Sony Computer Entertainment Inc. Processor emulation using speculative forward translation
US8146065B2 (en) 2007-08-13 2012-03-27 International Business Machines Corporation Running time of short running applications by effectively interleaving compilation with computation in a just-in-time environment
US20090113403A1 (en) * 2007-09-27 2009-04-30 Microsoft Corporation Replacing no operations with auxiliary code
US8527976B2 (en) * 2007-11-14 2013-09-03 Nec Laboratories America, Inc. System and method for generating error traces for concurrency bugs
US7991962B2 (en) * 2007-12-10 2011-08-02 International Business Machines Corporation System and method of using threads and thread-local storage
US8108868B2 (en) * 2007-12-18 2012-01-31 Microsoft Corporation Workflow execution plans through completion condition critical path analysis
US8060356B2 (en) 2007-12-19 2011-11-15 Sony Computer Entertainment Inc. Processor emulation using fragment level translation
US8082405B2 (en) * 2008-01-11 2011-12-20 International Business Machines Corporation Dynamic address translation with fetch protection
US8037278B2 (en) 2008-01-11 2011-10-11 International Business Machines Corporation Dynamic address translation with format control
US8151083B2 (en) 2008-01-11 2012-04-03 International Business Machines Corporation Dynamic address translation with frame management
US8103851B2 (en) * 2008-01-11 2012-01-24 International Business Machines Corporation Dynamic address translation with translation table entry format control for indentifying format of the translation table entry
US7895419B2 (en) 2008-01-11 2011-02-22 International Business Machines Corporation Rotate then operate on selected bits facility and instructions therefore
US8335906B2 (en) * 2008-01-11 2012-12-18 International Business Machines Corporation Perform frame management function instruction for clearing blocks of main storage
US7739434B2 (en) 2008-01-11 2010-06-15 International Business Machines Corporation Performing a configuration virtual topology change and instruction therefore
US8041923B2 (en) * 2008-01-11 2011-10-18 International Business Machines Corporation Load page table entry address instruction execution based on an address translation format control field
US8117417B2 (en) 2008-01-11 2012-02-14 International Business Machines Corporation Dynamic address translation with change record override
US8417916B2 (en) 2008-01-11 2013-04-09 International Business Machines Corporation Perform frame management function instruction for setting storage keys and clearing blocks of main storage
US8041922B2 (en) * 2008-01-11 2011-10-18 International Business Machines Corporation Enhanced dynamic address translation with load real address function
US8677098B2 (en) 2008-01-11 2014-03-18 International Business Machines Corporation Dynamic address translation with fetch protection
US7734900B2 (en) 2008-01-11 2010-06-08 International Business Machines Corporation Computer configuration virtual topology discovery and instruction therefore
US8019964B2 (en) * 2008-01-11 2011-09-13 International Buisness Machines Corporation Dynamic address translation with DAT protection
US8086811B2 (en) 2008-02-25 2011-12-27 International Business Machines Corporation Optimizations of a perform frame management function issued by pageable guests
US8176279B2 (en) * 2008-02-25 2012-05-08 International Business Machines Corporation Managing use of storage by multiple pageable guests of a computing environment
US8095773B2 (en) * 2008-02-26 2012-01-10 International Business Machines Corporation Dynamic address translation with translation exception qualifier
US8291397B2 (en) * 2008-04-02 2012-10-16 International Business Machines Corporation Compiler optimized function variants for use when return codes are ignored
US8453129B2 (en) * 2008-04-24 2013-05-28 International Business Machines Corporation Using hardware interrupts to drive dynamic binary code recompilation
US8407681B2 (en) * 2008-05-23 2013-03-26 International Business Machines Corporation System and method for changing variables at runtime
US8281296B2 (en) * 2008-08-12 2012-10-02 Oracle America, Inc. Cross-ISA inlining in a system virtual machine
GB2463942B (en) * 2008-10-03 2012-08-08 Icera Inc Disassembling an executable to analyse function calls to minimise cache misses
US20100125554A1 (en) * 2008-11-18 2010-05-20 Unisys Corporation Memory Recovery Across Reboots of an Emulated Operating System
US8387026B1 (en) * 2008-12-24 2013-02-26 Google Inc. Compile-time feedback-directed optimizations using estimated edge profiles from hardware-event sampling
KR20100082185A (ko) * 2009-01-08 2010-07-16 삼성전자주식회사 플래시 메모리, 캐시 메모리, 그리고 제어기를 포함하는 사용자 장치
US8308185B2 (en) * 2009-01-30 2012-11-13 Weaver Danny C Pin-engaging drawbar and lock plate assembly
US10152504B2 (en) 2009-03-11 2018-12-11 Actian Netherlands B.V. Column-store database architecture utilizing positional delta tree update system and methods
US8438558B1 (en) 2009-03-27 2013-05-07 Google Inc. System and method of updating programs and data
US8949103B2 (en) * 2009-05-01 2015-02-03 Microsoft Corporation Program code simulator
US8677329B2 (en) * 2009-06-03 2014-03-18 Apple Inc. Methods and apparatuses for a compiler server
US9117071B2 (en) 2009-06-03 2015-08-25 Apple Inc. Methods and apparatuses for secure compilation
US8527969B2 (en) * 2009-07-14 2013-09-03 Unisys Corporation Systems, methods, and computer programs for dynamic binary translation in an interpreter
US8577950B2 (en) * 2009-08-17 2013-11-05 International Business Machines Corporation Matrix multiplication operations with data pre-conditioning in a high performance computing architecture
US8650240B2 (en) * 2009-08-17 2014-02-11 International Business Machines Corporation Complex matrix multiplication operations with data pre-conditioning in a high performance computing architecture
US8752008B2 (en) * 2009-09-02 2014-06-10 Advanced Micro Devices, Inc. Lightweight service based dynamic binary rewriter framework
US8447583B2 (en) 2009-09-18 2013-05-21 International Business Machines Corporation Self initialized host cell spatially aware emulation of a computer instruction set
US9158566B2 (en) 2009-09-18 2015-10-13 International Business Machines Corporation Page mapped spatially aware emulation of computer instruction set
US8617049B2 (en) * 2009-09-18 2013-12-31 Ethicon Endo-Surgery, Inc. Symmetrical drive system for an implantable restriction device
US8949106B2 (en) * 2009-09-18 2015-02-03 International Business Machines Corporation Just in time compiler in spatially aware emulation of a guest computer instruction set
US8301434B2 (en) 2009-09-18 2012-10-30 International Buisness Machines Corporation Host cell spatially aware emulation of a guest wild branch
US8428930B2 (en) * 2009-09-18 2013-04-23 International Business Machines Corporation Page mapped spatially aware emulation of a computer instruction set
US8918601B2 (en) * 2009-12-14 2014-12-23 International Business Machines Corporation Deferred page clearing in a multiprocessor computer system
US8510511B2 (en) * 2009-12-14 2013-08-13 International Business Machines Corporation Reducing interprocessor communications pursuant to updating of a storage key
US8930635B2 (en) 2009-12-14 2015-01-06 International Business Machines Corporation Page invalidation processing with setting of storage key to predefined value
US8806179B2 (en) 2009-12-15 2014-08-12 International Business Machines Corporation Non-quiescing key setting facility
US8418156B2 (en) * 2009-12-16 2013-04-09 Intel Corporation Two-stage commit (TSC) region for dynamic binary optimization in X86
US8505034B2 (en) 2009-12-17 2013-08-06 Amazon Technologies, Inc. Automated service interface optimization
US8516230B2 (en) 2009-12-29 2013-08-20 International Business Machines Corporation SPE software instruction cache
US8850166B2 (en) 2010-02-18 2014-09-30 International Business Machines Corporation Load pair disjoint facility and instruction therefore
US8438340B2 (en) * 2010-02-18 2013-05-07 International Business Machines Corporation Executing atomic store disjoint instructions
US8914619B2 (en) 2010-06-22 2014-12-16 International Business Machines Corporation High-word facility for extending the number of general purpose registers available to instructions
US8745292B2 (en) 2010-06-23 2014-06-03 International Business Machines Corporation System and method for routing I/O expansion requests and responses in a PCIE architecture
US9342352B2 (en) 2010-06-23 2016-05-17 International Business Machines Corporation Guest access to address spaces of adapter
US8639858B2 (en) 2010-06-23 2014-01-28 International Business Machines Corporation Resizing address spaces concurrent to accessing the address spaces
US8615622B2 (en) 2010-06-23 2013-12-24 International Business Machines Corporation Non-standard I/O adapters in a standardized I/O architecture
US8918573B2 (en) 2010-06-23 2014-12-23 International Business Machines Corporation Input/output (I/O) expansion response processing in a peripheral component interconnect express (PCIe) environment
US8645767B2 (en) 2010-06-23 2014-02-04 International Business Machines Corporation Scalable I/O adapter function level error detection, isolation, and reporting
US8650335B2 (en) 2010-06-23 2014-02-11 International Business Machines Corporation Measurement facility for adapter functions
US8504754B2 (en) 2010-06-23 2013-08-06 International Business Machines Corporation Identification of types of sources of adapter interruptions
US8650337B2 (en) 2010-06-23 2014-02-11 International Business Machines Corporation Runtime determination of translation formats for adapter functions
US8645606B2 (en) 2010-06-23 2014-02-04 International Business Machines Corporation Upbound input/output expansion request and response processing in a PCIe architecture
US8478922B2 (en) 2010-06-23 2013-07-02 International Business Machines Corporation Controlling a rate at which adapter interruption requests are processed
US8626970B2 (en) 2010-06-23 2014-01-07 International Business Machines Corporation Controlling access by a configuration to an adapter function
US8566480B2 (en) 2010-06-23 2013-10-22 International Business Machines Corporation Load instruction for communicating with adapters
US8635430B2 (en) 2010-06-23 2014-01-21 International Business Machines Corporation Translation of input/output addresses to memory addresses
US9213661B2 (en) 2010-06-23 2015-12-15 International Business Machines Corporation Enable/disable adapters of a computing environment
US8572635B2 (en) 2010-06-23 2013-10-29 International Business Machines Corporation Converting a message signaled interruption into an I/O adapter event notification
US8615645B2 (en) 2010-06-23 2013-12-24 International Business Machines Corporation Controlling the selectively setting of operational parameters for an adapter
US8505032B2 (en) 2010-06-23 2013-08-06 International Business Machines Corporation Operating system notification of actions to be taken responsive to adapter events
US8621112B2 (en) 2010-06-23 2013-12-31 International Business Machines Corporation Discovery by operating system of information relating to adapter functions accessible to the operating system
US8683108B2 (en) 2010-06-23 2014-03-25 International Business Machines Corporation Connected input/output hub management
US8510599B2 (en) 2010-06-23 2013-08-13 International Business Machines Corporation Managing processing associated with hardware events
US8549182B2 (en) 2010-06-23 2013-10-01 International Business Machines Corporation Store/store block instructions for communicating with adapters
US9195623B2 (en) 2010-06-23 2015-11-24 International Business Machines Corporation Multiple address spaces per adapter with address translation
US8468284B2 (en) 2010-06-23 2013-06-18 International Business Machines Corporation Converting a message signaled interruption into an I/O adapter event notification to a guest operating system
US9851969B2 (en) 2010-06-24 2017-12-26 International Business Machines Corporation Function virtualization facility for function query of a processor
US10521231B2 (en) 2010-06-24 2019-12-31 International Business Machines Corporation Function virtualization facility for blocking instruction function of a multi-function instruction of a virtual processor
US8595469B2 (en) 2010-06-24 2013-11-26 International Business Machines Corporation Diagnose instruction for serializing processing
US8407701B2 (en) 2010-06-24 2013-03-26 International Business Machines Corporation Facilitating quiesce operations within a logically partitioned computer system
US8522225B2 (en) 2010-06-25 2013-08-27 International Business Machines Corporation Rewriting branch instructions using branch stubs
US8631225B2 (en) 2010-06-25 2014-01-14 International Business Machines Corporation Dynamically rewriting branch instructions to directly target an instruction cache location
US9459851B2 (en) 2010-06-25 2016-10-04 International Business Machines Corporation Arranging binary code based on call graph partitioning
US20110320786A1 (en) 2010-06-25 2011-12-29 International Business Machines Corporation Dynamically Rewriting Branch Instructions in Response to Cache Line Eviction
US9600281B2 (en) 2010-07-12 2017-03-21 International Business Machines Corporation Matrix multiplication operations using pair-wise load and splat operations
US8782434B1 (en) 2010-07-15 2014-07-15 The Research Foundation For The State University Of New York System and method for validating program execution at run-time
US20120124555A1 (en) * 2010-11-11 2012-05-17 Codekko Software, Inc. Optimization of Compiled Control Objects
US9063743B2 (en) * 2010-11-23 2015-06-23 Sap Se Model-based programming, configuration, and integration of networked embedded devices
US20120198458A1 (en) * 2010-12-16 2012-08-02 Advanced Micro Devices, Inc. Methods and Systems for Synchronous Operation of a Processing Device
KR20120083803A (ko) * 2011-01-18 2012-07-26 삼성전자주식회사 가상머신을 위한 추가코드 생성장치 및 방법
CN103620547B (zh) 2011-01-27 2018-07-10 英特尔公司 使用处理器的转换后备缓冲器的基于客户指令到本机指令范围的映射
WO2012103367A2 (en) 2011-01-27 2012-08-02 Soft Machines, Inc. Guest to native block address mappings and management of native code storage
WO2012103253A2 (en) 2011-01-27 2012-08-02 Soft Machines, Inc. Multilevel conversion table cache for translating guest instructions to native instructions
WO2012103359A2 (en) 2011-01-27 2012-08-02 Soft Machines, Inc. Hardware acceleration components for translating guest instructions to native instructions
WO2012103245A2 (en) * 2011-01-27 2012-08-02 Soft Machines Inc. Guest instruction block with near branching and far branching sequence construction to native instruction block
WO2012103373A2 (en) 2011-01-27 2012-08-02 Soft Machines, Inc. Variable caching structure for managing physical storage
US9495136B2 (en) * 2011-01-28 2016-11-15 International Business Machines Corporation Using aliasing information for dynamic binary optimization
US20140040858A1 (en) * 2011-04-20 2014-02-06 Freescale Semiconductor, Inc. Method and apparatus for generating resource efficient computer program code
US8533714B2 (en) 2011-05-03 2013-09-10 International Business Machines Corporation Dynamic virtual machine domain configuration and virtual machine relocation management
US8782645B2 (en) * 2011-05-11 2014-07-15 Advanced Micro Devices, Inc. Automatic load balancing for heterogeneous cores
US9032526B2 (en) 2011-05-12 2015-05-12 Microsoft Technology Licensing, Llc Emulating mixed-code programs using a virtual machine instance
US8560737B2 (en) 2011-06-10 2013-10-15 International Business Machines Corporation Managing operator message buffers in a coupling facility
US9021226B2 (en) 2011-06-10 2015-04-28 International Business Machines Corporation Moving blocks of data between main memory and storage class memory
US8918797B2 (en) 2011-06-10 2014-12-23 International Business Machines Corporation Processing operator message commands
US9116788B2 (en) 2011-06-10 2015-08-25 International Business Machines Corporation Using extended asynchronous data mover indirect data address words
US9021179B2 (en) 2011-06-10 2015-04-28 International Business Machines Corporation Store storage class memory information command
US9323668B2 (en) 2011-06-10 2016-04-26 International Business Machines Corporation Deconfigure storage class memory command
US9116634B2 (en) 2011-06-10 2015-08-25 International Business Machines Corporation Configure storage class memory command
US9116789B2 (en) 2011-06-10 2015-08-25 International Business Machines Corporation Chaining move specification blocks
US9037907B2 (en) 2011-06-10 2015-05-19 International Business Machines Corporation Operator message commands for testing a coupling facility
US9058275B2 (en) 2011-06-10 2015-06-16 International Business Machines Corporation Data returned responsive to executing a start subchannel instruction
US8799522B2 (en) 2011-06-10 2014-08-05 International Business Machines Corporation Executing a start operator message command
US9058243B2 (en) 2011-06-10 2015-06-16 International Business Machines Corporation Releasing blocks of storage class memory
US9021180B2 (en) 2011-06-10 2015-04-28 International Business Machines Corporation Clearing blocks of storage class memory
US8689240B2 (en) 2011-06-10 2014-04-01 International Business Machines Corporation Transmitting operator message commands to a coupling facility
US8549094B2 (en) 2011-06-30 2013-10-01 International Business Machines Corporation Facilitating communication between isolated memory spaces of a communications environment
US9116685B2 (en) 2011-07-19 2015-08-25 Qualcomm Incorporated Table call instruction for frequently called functions
JP2013061810A (ja) * 2011-09-13 2013-04-04 Fujitsu Ltd 情報処理装置、情報処理装置制御方法及び中間コード命令実行プログラム
US8600727B2 (en) * 2011-10-11 2013-12-03 Unisys Corporation Streamlined execution of emulated code using block-based translation mode
US8806452B2 (en) 2011-11-10 2014-08-12 International Business Machines Corporation Transformation of computer programs and eliminating errors
US20130132061A1 (en) * 2011-11-18 2013-05-23 Michael J. Rieschl Just-in-time static translation system for emulated computing environments
US10365900B2 (en) 2011-12-23 2019-07-30 Dataware Ventures, Llc Broadening field specialization
IN2014DN05723A (ja) * 2011-12-23 2015-04-10 Univ Arizona State
US9335993B2 (en) 2011-12-29 2016-05-10 International Business Machines Corporation Convert from zoned format to decimal floating point format
US9329861B2 (en) 2011-12-29 2016-05-03 International Business Machines Corporation Convert to zoned format from decimal floating point format
US9110878B2 (en) 2012-01-18 2015-08-18 International Business Machines Corporation Use of a warning track interruption facility by a program
US8850450B2 (en) 2012-01-18 2014-09-30 International Business Machines Corporation Warning track interruption facility
US9104508B2 (en) 2012-01-18 2015-08-11 International Business Machines Corporation Providing by one program to another program access to a warning track facility
WO2013113595A1 (en) 2012-01-31 2013-08-08 International Business Machines Corporation Major branch instructions with transactional memory
RU2491615C1 (ru) 2012-02-24 2013-08-27 Закрытое акционерное общество "Лаборатория Касперского" Система и способ формирования записей для обнаружения программного обеспечения
US9459864B2 (en) 2012-03-15 2016-10-04 International Business Machines Corporation Vector string range compare
US9459868B2 (en) 2012-03-15 2016-10-04 International Business Machines Corporation Instruction to load data up to a dynamically determined memory boundary
US9715383B2 (en) 2012-03-15 2017-07-25 International Business Machines Corporation Vector find element equal instruction
US9454366B2 (en) 2012-03-15 2016-09-27 International Business Machines Corporation Copying character data having a termination character from one memory location to another
US9454367B2 (en) 2012-03-15 2016-09-27 International Business Machines Corporation Finding the length of a set of character data having a termination character
US9459867B2 (en) 2012-03-15 2016-10-04 International Business Machines Corporation Instruction to load data up to a specified memory boundary indicated by the instruction
US9588762B2 (en) 2012-03-15 2017-03-07 International Business Machines Corporation Vector find element not equal instruction
US9280347B2 (en) 2012-03-15 2016-03-08 International Business Machines Corporation Transforming non-contiguous instruction specifiers to contiguous instruction specifiers
US9710266B2 (en) 2012-03-15 2017-07-18 International Business Machines Corporation Instruction to compute the distance to a specified memory boundary
US9268566B2 (en) 2012-03-15 2016-02-23 International Business Machines Corporation Character data match determination by loading registers at most up to memory block boundary and comparing
US9922090B1 (en) 2012-03-27 2018-03-20 Actian Netherlands, B.V. System and method for automatic vertical decomposition of a table for improving input/output and memory utilization in a database
CN103365931B (zh) * 2012-04-10 2016-12-14 南京中兴新软件有限责任公司 性能分析工具中快速定位函数性能记录的方法及装置
CN104350465B (zh) * 2012-06-11 2018-02-16 英派尔科技开发有限公司 调整计算机程序的动态优化
US9436477B2 (en) 2012-06-15 2016-09-06 International Business Machines Corporation Transaction abort instruction
US20130339680A1 (en) 2012-06-15 2013-12-19 International Business Machines Corporation Nontransactional store instruction
US10437602B2 (en) 2012-06-15 2019-10-08 International Business Machines Corporation Program interruption filtering in transactional execution
US9740549B2 (en) 2012-06-15 2017-08-22 International Business Machines Corporation Facilitating transaction completion subsequent to repeated aborts of the transaction
US9384004B2 (en) 2012-06-15 2016-07-05 International Business Machines Corporation Randomized testing within transactional execution
DE102013210160A1 (de) 2012-06-15 2013-12-19 International Business Machines Corporation Erleichtern der Ausführung einer Transaktion nach wiederholten Abbrüchen der Transaktion
US8682877B2 (en) 2012-06-15 2014-03-25 International Business Machines Corporation Constrained transaction execution
US9772854B2 (en) 2012-06-15 2017-09-26 International Business Machines Corporation Selectively controlling instruction execution in transactional processing
US8688661B2 (en) 2012-06-15 2014-04-01 International Business Machines Corporation Transactional processing
US10656945B2 (en) 2012-06-15 2020-05-19 International Business Machines Corporation Next instruction access intent instruction for indicating usage of a storage operand by one or more instructions subsequent to a next sequential instruction
US9361115B2 (en) 2012-06-15 2016-06-07 International Business Machines Corporation Saving/restoring selected registers in transactional processing
DE102013210839B4 (de) 2012-06-15 2023-06-07 International Business Machines Corporation Einschränken der Verarbeitung innerhalb eines Prozessors zum Erleichtern der Ausführung einer Transaktion
US9317460B2 (en) 2012-06-15 2016-04-19 International Business Machines Corporation Program event recording within a transactional environment
US9348642B2 (en) 2012-06-15 2016-05-24 International Business Machines Corporation Transaction begin/end instructions
US9336046B2 (en) 2012-06-15 2016-05-10 International Business Machines Corporation Transaction abort processing
US9182984B2 (en) 2012-06-15 2015-11-10 International Business Machines Corporation Local clearing control
US8966324B2 (en) 2012-06-15 2015-02-24 International Business Machines Corporation Transactional execution branch indications
US9448796B2 (en) 2012-06-15 2016-09-20 International Business Machines Corporation Restricted instructions in transactional execution
US8880959B2 (en) 2012-06-15 2014-11-04 International Business Machines Corporation Transaction diagnostic block
US9442737B2 (en) 2012-06-15 2016-09-13 International Business Machines Corporation Restricting processing within a processor to facilitate transaction completion
US9367323B2 (en) 2012-06-15 2016-06-14 International Business Machines Corporation Processor assist facility
US9098308B2 (en) * 2012-06-26 2015-08-04 Marvell World Trade Ltd. Method and apparatus for code performance analysis based on execution trace information
US20140047423A1 (en) * 2012-08-09 2014-02-13 Filip J. Pizlo Runtime State Based Code Re-Optimization
JP5998764B2 (ja) * 2012-09-04 2016-09-28 富士通株式会社 情報処理装置、ログ出力方法およびログ出力プログラム
US9063721B2 (en) 2012-09-14 2015-06-23 The Research Foundation For The State University Of New York Continuous run-time validation of program execution: a practical approach
US9069782B2 (en) 2012-10-01 2015-06-30 The Research Foundation For The State University Of New York System and method for security and privacy aware virtual machine checkpointing
US9513906B2 (en) 2013-01-23 2016-12-06 International Business Machines Corporation Vector checksum instruction
US9823924B2 (en) 2013-01-23 2017-11-21 International Business Machines Corporation Vector element rotate and insert under mask instruction
US9715385B2 (en) 2013-01-23 2017-07-25 International Business Machines Corporation Vector exception code
US9471308B2 (en) 2013-01-23 2016-10-18 International Business Machines Corporation Vector floating point test data class immediate instruction
US9778932B2 (en) 2013-01-23 2017-10-03 International Business Machines Corporation Vector generate mask instruction
US9804840B2 (en) 2013-01-23 2017-10-31 International Business Machines Corporation Vector Galois Field Multiply Sum and Accumulate instruction
US9047403B2 (en) * 2013-02-11 2015-06-02 International Business Machines Corporation Debugger with previous version feature
US11507574B1 (en) 2013-03-13 2022-11-22 Actian Netherlands B.V. Adaptive selection of a processing method based on observed performance for improved and robust system efficiency
US9201629B2 (en) 2013-03-14 2015-12-01 International Business Machines Corporation Instruction for performing a pseudorandom number seed operation
US8873750B2 (en) 2013-03-14 2014-10-28 International Business Machines Corporation Instruction for performing a pseudorandom number generate operation
US9582279B2 (en) 2013-03-15 2017-02-28 International Business Machines Corporation Execution of condition-based instructions
WO2014151691A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. Method and apparatus for guest return address stack emulation supporting speculation
WO2014151652A1 (en) 2013-03-15 2014-09-25 Soft Machines Inc Method and apparatus to allow early dependency resolution and data forwarding in a microprocessor
US10089218B2 (en) * 2013-03-17 2018-10-02 Typemock Ltd. Methods circuits apparatuses systems and associated computer executable code for generating a software unit test
US9396097B2 (en) * 2013-03-17 2016-07-19 Typemock Ltd. Methods, circuits, devices, systems and associated computer executable code for testing software code
US9361144B2 (en) 2013-06-28 2016-06-07 Globalfoundries Inc. Predictive fetching and decoding for selected return instructions
US9619230B2 (en) 2013-06-28 2017-04-11 International Business Machines Corporation Predictive fetching and decoding for selected instructions
US9348596B2 (en) 2013-06-28 2016-05-24 International Business Machines Corporation Forming instruction groups based on decode time instruction optimization
US9513924B2 (en) 2013-06-28 2016-12-06 Globalfoundries Inc. Predictor data structure for use in pipelined processing
US9372695B2 (en) 2013-06-28 2016-06-21 Globalfoundries Inc. Optimization of instruction groups across group boundaries
US9600256B2 (en) * 2013-10-18 2017-03-21 Microsoft Technology Licensing, Llc Incrementally compiling software artifacts from an interactive development environment
US9690584B2 (en) * 2013-10-18 2017-06-27 Marvell World Trade Ltd. Systems and methods for register allocation
US10318299B2 (en) 2013-10-31 2019-06-11 International Business Machines Corporation Reading a register pair by writing a wide register
US9201635B2 (en) * 2013-12-30 2015-12-01 Unisys Corporation Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions
US8893294B1 (en) 2014-01-21 2014-11-18 Shape Security, Inc. Flexible caching
CN103838616B (zh) * 2014-03-05 2017-04-05 北京工业大学 基于树型程序分支的计算机程序即时编译方法
US10120681B2 (en) 2014-03-14 2018-11-06 International Business Machines Corporation Compare and delay instructions
US9558032B2 (en) 2014-03-14 2017-01-31 International Business Machines Corporation Conditional instruction end operation
US9454370B2 (en) 2014-03-14 2016-09-27 International Business Machines Corporation Conditional transaction end instruction
US9588774B2 (en) 2014-03-18 2017-03-07 International Business Machines Corporation Common boot sequence for control utility able to be initialized in multiple architectures
US9582295B2 (en) 2014-03-18 2017-02-28 International Business Machines Corporation Architectural mode configuration
US9916185B2 (en) 2014-03-18 2018-03-13 International Business Machines Corporation Managing processing associated with selected architectural facilities
US9558096B2 (en) * 2014-03-21 2017-01-31 Marvell World Trade Ltd. Method and apparatus for supporting performance analysis
US9256546B2 (en) 2014-03-31 2016-02-09 International Business Machines Corporation Transparent code patching including updating of address translation structures
US9569115B2 (en) 2014-03-31 2017-02-14 International Business Machines Corporation Transparent code patching
US9720661B2 (en) 2014-03-31 2017-08-01 International Businesss Machines Corporation Selectively controlling use of extended mode features
US9734083B2 (en) 2014-03-31 2017-08-15 International Business Machines Corporation Separate memory address translations for instruction fetches and data accesses
US9483295B2 (en) 2014-03-31 2016-11-01 International Business Machines Corporation Transparent dynamic code optimization
US9824021B2 (en) 2014-03-31 2017-11-21 International Business Machines Corporation Address translation structures to provide separate translations for instruction fetches and data accesses
US9715449B2 (en) 2014-03-31 2017-07-25 International Business Machines Corporation Hierarchical translation structures providing separate translations for instruction fetches and data accesses
US9858058B2 (en) 2014-03-31 2018-01-02 International Business Machines Corporation Partition mobility for partitions with extended code
CN104049949B (zh) * 2014-05-30 2016-10-05 南阳理工学院 一种面向bswap指令的窥孔优化方法
EP3012764A1 (en) * 2014-10-24 2016-04-27 Thomson Licensing Control flow graph flattening device and method
US10897616B2 (en) * 2014-12-08 2021-01-19 Harmonic, Inc. Dynamic allocation of CPU cycles vis-a-vis virtual machines in video stream processing
US10284646B2 (en) * 2014-12-17 2019-05-07 International Business Machines Corporation Application multi-versioning in a traditional language environment
US9495303B2 (en) * 2015-02-03 2016-11-15 Intel Corporation Fine grained address remapping for virtualization
CN107408053B (zh) * 2015-04-10 2021-04-16 谷歌有限责任公司 用于到本原客户端的二进制翻译的方法、系统和介质
CN107408052B (zh) * 2015-04-10 2021-04-16 谷歌有限责任公司 共享对象层级上的二进制转换的方法、系统和介质
EP3106982B1 (en) * 2015-06-18 2021-03-10 ARM Limited Determination of branch convergence in a sequence of program instructions
US10048952B2 (en) * 2015-11-11 2018-08-14 Oracle International Corporation Compiler optimized data model evaluation
US10733099B2 (en) 2015-12-14 2020-08-04 Arizona Board Of Regents On Behalf Of The University Of Arizona Broadening field specialization
US9971581B1 (en) * 2015-12-28 2018-05-15 Wells Fargo Bank, N.A. Programming language conversion
CN107665125B (zh) * 2016-07-29 2021-03-09 北京小米移动软件有限公司 执行操作指令的方法及装置
US9965374B2 (en) * 2016-08-26 2018-05-08 Qualcomm Incorporated Profile guided indirect function call check for control flow integrity
CN106775913B (zh) * 2016-12-16 2019-07-09 华东师范大学 一种目标代码控制流图生成方法
US10114573B1 (en) * 2017-04-26 2018-10-30 International Business Machines Corporation Dynamic reduction of stack-overflow errors in a recursive data-serialization algorithm
US10089235B1 (en) 2017-07-28 2018-10-02 Citrix Systems, Inc. Dynamic trim processing with disk caching
US10474442B2 (en) * 2017-09-29 2019-11-12 Intel Corporation Methods and apparatus to perform region formation for a dynamic binary translation processor
US10491524B2 (en) 2017-11-07 2019-11-26 Advanced Micro Devices, Inc. Load balancing scheme
JP7035751B2 (ja) * 2018-04-12 2022-03-15 富士通株式会社 コード変換装置、コード変換方法、及びコード変換プログラム
US10698668B1 (en) * 2018-05-29 2020-06-30 Amazon Technologies, Inc. Custom code transformations during compilation process
JP7163697B2 (ja) * 2018-09-28 2022-11-01 富士通株式会社 生成プログラム,情報処理装置及び生成方法
US10970073B2 (en) * 2018-10-02 2021-04-06 International Business Machines Corporation Branch optimization during loading
CN109491918B (zh) * 2018-11-22 2020-05-01 中国人民解放军战略支援部队信息工程大学 一种汇编冗余指令的检测方法及装置
CN111435309A (zh) * 2019-01-11 2020-07-21 中标软件有限公司 一种寄存器分配优化实现方法
US11455153B2 (en) * 2019-03-18 2022-09-27 Advanced Micro Devices, Inc. Dynamic instances semantics
CN109918132B (zh) * 2019-03-26 2021-04-16 龙芯中科技术股份有限公司 一种指令安装方法、装置、电子设备及存储介质
CN111026398B (zh) * 2019-10-28 2023-08-11 贝壳技术有限公司 基于缓存的数据集成的构建方法与构建系统
CN112785482A (zh) 2019-11-07 2021-05-11 英特尔公司 用于将可执行对象适配到处理单元的系统和方法
US11216257B1 (en) * 2020-07-02 2022-01-04 Intrado Corporation Automated conference sessions generated to manage application development
US11677574B1 (en) 2020-07-02 2023-06-13 Intrado Corporation Automated conference sessions generated to manage application development
CN111966397A (zh) * 2020-07-22 2020-11-20 哈尔滨工业大学 一种异构并行程序自动移植和优化方法
US11526336B2 (en) * 2021-03-15 2022-12-13 Fujitsu Limited Community-oriented, cloud-based digital annealing platform
CN113377378A (zh) * 2021-07-02 2021-09-10 北京百度网讯科技有限公司 用于小程序的处理方法、装置、设备及存储介质
US20230305992A1 (en) * 2022-03-25 2023-09-28 Nokia Solutions And Networks Oy Processor using target instructions

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2240861A (en) 1990-02-09 1991-08-14 Hewlett Packard Co Apparatus and method for adapting computer program from one operating environment to another
JPH06282437A (ja) 1993-03-30 1994-10-07 Hitachi Ltd オブジェクト属性のアクセス方式
US5757982A (en) * 1994-10-18 1998-05-26 Hewlett-Packard Company Quadrantal scaling of dot matrix data
US5751982A (en) 1995-03-31 1998-05-12 Apple Computer, Inc. Software emulation system with dynamic translation of emulated instructions for increased processing speed
US5761477A (en) * 1995-12-04 1998-06-02 Microsoft Corporation Methods for safe and efficient implementations of virtual machines
US6115809A (en) * 1998-04-30 2000-09-05 Hewlett-Packard Company Compiling strong and weak branching behavior instruction blocks to separate caches for dynamic and static prediction
US6158047A (en) * 1998-07-08 2000-12-05 Hewlett-Packard Company Client/server system for fast, user transparent and memory efficient computer language translation

Also Published As

Publication number Publication date
DE19945992B4 (de) 2004-12-09
US6463582B1 (en) 2002-10-08
JP2000132408A (ja) 2000-05-12
US20020147969A1 (en) 2002-10-10
CN1270348A (zh) 2000-10-18
CN1308818C (zh) 2007-04-04
DE19945992A1 (de) 2000-05-04

Similar Documents

Publication Publication Date Title
JP3553834B2 (ja) コンピュータアーキテクチャエミュレーションシステム
Shao et al. A type-based compiler for Standard ML
US6966057B2 (en) Static compilation of instrumentation code for debugging support
Pettis et al. Profile guided code positioning
US6968546B2 (en) Debugging support using dynamic re-compilation
US7725883B1 (en) Program interpreter
Tarditi et al. No assembly required: Compiling Standard ML to C
US5175856A (en) Computer with integrated hierarchical representation (ihr) of program wherein ihr file is available for debugging and optimizing during target execution
US5530964A (en) Optimizing assembled code for execution using execution statistics collection, without inserting instructions in the code and reorganizing the code based on the statistics collected
US6199095B1 (en) System and method for achieving object method transparency in a multi-code execution environment
US7036118B1 (en) System for executing computer programs on a limited-memory computing machine
WO2010014981A2 (en) Method and apparatus for detection and optimization of presumably parallel program regions
Tarditi Design and implementation of code optimizations for a type- directed compiler for Standard ML
Brandis et al. The Oberon system family
Wall Experience with a software-defined machine architecture
Adl-Tabatabai Source-level debugging of globally optimized code
Nystrom Bytecode level analysis and optimization of Java classes
Elsman et al. An optimizing backend for the ML Kit using a stack of regions
Chambers et al. Iterative type analysis and extended message splitting: Optimizing dynamically-typed object-oriented programs
Keppel Runtime code generation
Padlewski et al. Modeling the Invariance of Virtual Pointers in LLVM
Wimmer Automatic object inlining in a Java virtual machine
Altman et al. DAISY dynamic binary translation software
Erhardt et al. A Control-Flow-Sensitive Analysis and Optimization Framework for the KESO Multi-JVM
Puder et al. Cross-compiling Java to JavaScript via tool-chaining

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040116

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20040330

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040430

R150 Certificate of patent or registration of utility model

Ref document number: 3553834

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080514

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090514

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090514

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100514

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100514

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110514

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120514

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130514

Year of fee payment: 9

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140514

Year of fee payment: 10

EXPY Cancellation because of completion of term