(57)【特許請求の範囲】
【請求項１】
多重関数命令を実行することのできるプロセッサであって：
複数のレジスタ；および
多重演算命令実行回路によって構成され、前記多重演算命令実行回路が対応する複数のフォーマットにおける複数のオペランドを、前記多重関数命令の１回の実行に応答して共通位置から対応する複数のレジスタ内に移動し、前記対応する複数のフォーマットのうち第１フォーマットは符号なしのバイト・フォーマットにおいてメモリ内にエンコードされる整数であり、前記対応する複数のフォーマットのうち第２フォーマットは符号付きのバイト・フォーマットにおいてメモリ内にエンコードされる整数であり、前記対応する複数のフォーマットのうち第３フォーマットが、前記共通位置からの一定数のビットを前記対応する複数のレジスタのうちの第３レジスタ内の一定位置に挿入することにより、前記プロセッサにより生成されることを特徴とするプロセッサ。
【請求項２】
前記対応する複数のフォーマットのうち第１フォーマットが、前記共通位置からの一定数のビットを前記対応する複数のレジスタのうち第１レジスタ内の一定位置に挿入することにより前記プロセッサによって生成されることを特徴とする請求項１記載のプロセッサ。
【発明の詳細な説明】
（先行出願への参照）
本出願は、米国特許出願第０８／９９０，７８０号として出願されている。
【０００１】
（産業上の利用分野）
本発明は、一般にコンピュータに関し、さらに詳しくは、ソフトウェアのエミュレーションまたは翻訳済みソフトウェアの実行に関する。
【０００２】
（従来の技術）
コンピュータ産業においては、現在、ソフトウェアを多くの異なるハードウェア・プラットフォーム上で実行することを可能にするエミュレーション技術および翻訳済みコンピュータ言語の実行を重要視している。エミュレーションと翻訳済み言語実行を利用することの利点は、１つのハードウェア・プラットフォームで実行するためにソフトウェアを書くと、余り多くの労力を費やすことなく同じソフトウェアを他のハードウェア・プラットフォームに移植することができることである。しかし、エミュレーションや翻訳済み言語実行を行うには、ユーザのソフトウェア・コードのハードウェアに対する独立性を得るために、ユーザの実行可能なソフトウェア・コードと実際のハードウェアとの間に追加のソフトウェア・レイヤが必要になる。この追加のレイヤのソフトウェアは、ユーザ・ソフトウェアが特定のハードウェア・プラットフォームに関して直接的に編集され、そのハードウェア・プラットフォームで直接実行される他のコンピュータ・システムでは通常見られないエミュレーション・オーバーヘッドとなる。エミュレーションに追加のソフトウェア・レイヤを加えると、ハードウェアの微妙な差異の影響を受けないで、より大きな互換性が得られるが、ユーザ・ソフトウェアの実行は遅くなる。
【０００３】
コンピュータ産業の目標は、この追加のソフトウェア・レイヤの性能に与える影響を小さくして、それにより種々のエミュレータまたは翻訳済み言語装置（たとえばJava，Smalltalk，BASIC）の速度を上げることである。エミュレーション・オーバーヘッドを小さくするために、コンピュータ業界は、カスタマイズされたハードウェアを作成し、中間レイヤのソフトウェアを簡略にして、性能を改善しようと試みている。従って、オーバーヘッドを小さくした新規のエミュレーション取出解読ルーチンであって、それによりエミュレーション／翻訳性能が改善されるルーチンが必要とされる。
【０００４】
（好適な実施例の説明）
一般に、本発明は取出解読エミュレータ・オーバーヘッド（fetch and decode emulator overhead）を削減し、さらにエミュレータ・システムの演算コード・エミュレーション済み実行オーバーヘッドを削減するための方法および装置である。本明細書に教示されるシステムを用いて、任意の種類のエミュレーションまたは翻訳済み言語実行を行い、Java，Small Talk，BASICコンピュータ・コードなどの任意のコンピュータ言語のエミュレーションまたは実行を行うことができる。詳しくは、本件においては新規のコンピュータ命令が採用される。すなわち、新規のコンピュータ命令が命令オペランドを処理して、複数のレジスタに格納される複数の結果を生成する。このとき、各レジスタは異なるデータ・フォーマットにおいてその結果を格納する。この命令（ここではLGMDTと略する）は、結果に関して異なるフォーマットまたは予備処理を用いて異なるレジスタ内に結果を提供するので、エミュレータ・ルーチンで必要とされる演算コード・エミュレーション命令の数を減らすことができ、それによってエミュレーションまたは翻訳済み言語実行をより高速で行うことができる。さらに、このLGDMT命令により、システム内でエミュレーションされる命令毎に実行される取出解読エミュレータ・オーバーヘッドも削減されることになり、それによってエミュレーションの性能がさらに改善される。実験結果から、本明細書に教示される方法を介して得られる改善は、１０％以上であることがわかっている。
【０００５】
本発明は、図１ないし図８を参照することでさらに理解することができる。図１は、本発明によりエミュレーションまたは翻訳済み言語実行を実施するために用いられるエミュレータ・システム１０のブロック図である。エミュレーション・システム１０は、各々が１つ以上のソフトウェア命令を含む多数の部分／ルーチンによって構成される。図１は、このような部分／ルーチンの１つがセットアップ・コード１１である場合を示す。セットアップ・コード１１は、レジスタを初期化して適切なソフトウェア・エミュレーションを可能にするコンピュータ命令を含む。エミュレーション・システム１０は、命令エミュレーション演算コードとオペランド・データとをメモリ１２４（図８を参照）から繰り返し取り出して、命令に関して適切な解読動作を実施し、どのベクトル・エミュレーション・ルーチンを実行すべきかを判断する取出および解読ループ１２も備える。ルーチン１２が実施する「解読」処理には、通常、エミュレーション・ソフトウェア実行の流れをテーブル１４内の１つ以上のエミュレーション・ルーチンに送るテーブル・ベクトル・アドレスの生成が含まれる。
【０００６】
図１は、ルックアップ・テーブル１４内の複数のベクトル・エミュレーション・ルーチンを示す。図１のベクトル・エミュレーション・ルーチン１４は、特に、５つのエミュレーション・ルーチン１６〜２４を示す。しかし、これは例として行われるに過ぎず、任意の数のエミュレーション・ルーチンを用いることができる。図１の各ルーチン１６〜２４には、１６個の３２ビット・ワードの情報が含まれる。従って、第１のエミュレーション・ルーチンは、図１のテーブルベース（TABLEBASE）と記されるアドレスで始まり、バイトレベルのアドレス指定を用いる場合はアドレスTABLEBASE＋６３で終了する。第２のエミュレーション・ルーチンは、図１ではTABLEBASE＋６４と記されるアドレスで始まり、さらにメモリ・アレイ内で６４バイト（すなわち１６ワード）進んだところで終了する。６４バイトでは特定の命令をエミュレーションするのに足りない場合は、この特定の命令のエミュレーションを完了させるために、テーブル１４のブロック終点で分岐またはジャンプ命令を用いて、テーブル１４の外側にある別の場所に分岐／ジャンプしなければならない。各エミュレーション・ルーチン（通常、各エミュレーション命令について１つのルーチンが存在する）に対して、エミュレーション・ルーチンを格納するために６４バイト（すなわち１６ワード）のスペースが割り当てられるので、各エミュレーション・ルーチンは、アドレスTABLEBASEから６４の倍数であるアドレス値で始まる。６４バイト以外の他のサイズのテーブル・エントリを用いることができることにも留意されたい。
【０００７】
図１は、アドレスTABLEADDRESS始まり、アドレスTABLEADDRESS＋６３で終了する無演算（NOP：no operation）ルーチンを示す。あるルーチンに関して提供されるテーブル・スペースのすべてが個々のルーチンに用いられる訳ではないので、ある程度のスペースの無駄は容易に許容することができる。図１は、BIPUSH（バイト整数プッシュ・ルーチン）命令に関するBIPUSHルーチンを示す。BIPUSHルーチンは、アドレス・テーブルベース＋６４ｘＮに位置する。このBIPUSHルーチン２０には、エミュレーション中にバイト整数プッシュを実施するコンピュータ命令が含まれる。図１のエミュレーションPOPルーチン２２は、アドレスTABLEBASE＋６４ｘＭで始まり、メモリ内のオペランド・スタックのトップ・ワードをポップオフさせるために用いられるコンピュータ命令を含む。図１の最後のエミュレーション・ルーチン２４は、アドレスTABLEBASE＋６４ｘ２５５で始まるものとして図示される。言い換えると、詳しくは、図１は、図１のテーブル１４内には２８＝２５６ルーチンが存在することを示す。この２５６ルーチンの実施例においては、Javaで用いられるような単独の演算コード・バイトが図１の２５６個のルーチンのうち任意のルーチンを一意的にアドレス指定することができる。任意の数のルーチンを用いることができ、それによって本明細書に教示される方法を用いて、Java，ペンティアム・コード，BASIC，Smalltalkなどの任意の言語のエミュレーションを実施することができることに注目されたい。
【０００８】
図２は、図１に示される種々の関数を実現するために用いられる特定のソフトウェア・コードを示す。たとえば、図２は、図１のセットアップ・コード１１を実現するために用いられる特定の命令（命令群）を示す。図２は、アセンブラの決定したTABLEBASEアドレスをTABLEBASEレジスタ内にコピーするために、ロード・アドレス（LA）命令がセットアップ・コード１１の一部として実行される様子を示す。この中央処理装置（CPU）ハードウェア・レジスタをRTABLEBASEと称する。このロード・アドレス（LA）命令に加えて、他の命令を図２のセットアップ・コード１１の一部として実行し、エミュレーションまたは翻訳済み言語実行にハードウェア・システムを備えることもできる。
【０００９】
セットアップ・コード１１が実行されると、図２の取出解読ループ１２が実行される。図２の取出／解読ループ１２には、「取出」と「取出２」と題された各アセンブラ・ラベルが含まれる。これらは、コンピュータ・コード１２の実行時のアドレスを象徴的に示す。取出解読ユニット１２の取出解読動作は、更新を伴うバイト・ゼロのロード（LBZU）命令を実行することにより始まる。この命令を実行すると、プログラム・カウンタ・レジスタ（RPC）内に格納されるアドレスからROPCODEと称されるCPUハードウェア・レジスタ内に演算コードがロードされる。詳しくは、図２のループ１２内の最初のLBZU命令により、プログラム・カウンタ・レジスタ（RPC）に整数１が加えられ、次にこの増分されたアドレスを用いてメモリから演算コードにアクセスし、この演算コードをROPCODEレジスタに格納する。ROPCODEレジスタ値は３２ビット長の値で、これにはJavaに関して２５６個の一意値のうちの１つを含めることができる。この８ビットの一意的演算コード値を図２のテーブル１４内の特定のエミュレーション・ルーチンにアクセスするための指標値として用いる。テーブル１４内のルーチンは、長さにして１６ワード（すなわち６４バイト）のメモリのブロックであるので、図２の第１のLBZU命令を介して読み込まれた演算コードを６ビット位置だけ左にシフトしなければならない。この指標シフト関数を実施するためには、ワード直左シフト（SWLI：shift word left immediate）命令を用いて、ROPCODEレジスタに格納される値を左に６ビット位置だけシフトさせ、それによってシフトされた結果をROPCODEに戻す。
【００１０】
次に、ADD（加算）命令を用いて、ROPCODEレジスタ内に格納されるシフトされた指標をRTABLEBASEレジスタに格納されるTABLEBASEアドレスと加算する。RTABLEBASEレジスタ値とROPCODEレジスタ値とのこの加算は、RTEMPと記される一時レジスタである宛先内に行われる。ここで、RTEMP値はテーブル１４内の特定のエミュレータ命令のアドレスを含む。所望のコンピュータ命令を適切にエミュレーションするためには、この命令をエミュレータにより実行しなければならない。
【００１１】
テーブル１４内の特定のエミュレーション・ルーチンを適切に分岐するためには、カウント・レジスタへの移動（MTCTR：move to count register）命令を実行して、RTEMPレジスタに格納されるアドレスを、CPUハードウェア・アーキテクチャ内のカウント・レジスタ（RCTR）に移動する。カウント・レジスタとは、中央処理装置（CPU）のアーキテクチャ内部のレジスタ、またはこのカウント・レジスタがCPUの分岐処理装置（BPU：branch processing unit）に結合されるプロセッサである。次に、ルーチン１２内のMTCTR命令に続いて後続のカウント・レジスタ分岐（BCTR：branch count register）命令により、エミュレーションされたプログラムはカウント・レジスタ内に格納されるアドレスに分岐され、テーブル１４内のルーチンへの実行の流れの変更が可能になる。図２に示されるように、取出解読ループ１２の最後の命令はこのBCTR命令で、これによってテーブル１４内のルーチンの１つをこの後で実行することができる。
【００１２】
図２のルーチン１２においてMTCTR命令とBCTR命令の実行の間に、予備取出動作が実施される。予備取出動作は、追加のLBZU命令を図２の取出解読ループ１２の終点付近で実行することにより実施される。ルーチン１２内のこの第２のLBZU命令により、プログラム・カウンタ・レジスタ（RPC）が１だけ増分され、この増分されたプログラム・カウンタ値に位置するメモリからデータ値にアクセスする。このとき、プログラムは、この第２のLBZU命令を介してアクセスされたデータがエミュレーション・データ・オペランドであるのか、新規のエミュレーション命令演算コードであるのかについて不確定である。この予備取出命令によって何が含まれるのかの決定が、図２のルーチン１２のBCTR命令の実行に続いて、テーブル１４内で実行されるコードによりなされる。
【００１３】
図２は、図１に当初示される３つのエミュレーション・ルーチン１６，２０，２２を詳しく示す。ルーチン１６は、テーブル１４内の最初のルーチンであり、０の８ビットの演算コード値（たとえば００００００００バイナリ）によりアクセスされる。すべてゼロの値を有する演算コードがルーチン１２により読み込まれると、このゼロ値がシフトされ、指標としてTABLEBASE値に加えられる。これによりRTEMPレジスタにはTABLEBASE＋０が含まれることになる。読み込まれた演算コードがゼロに等しい場合、ルーチン１２におけるBCTR命令の実行により、BCTR命令の実行に続きテーブル１６内でルーチン１６のソフトウェア命令が実行されることになる。ルーチン１６は非演算（NOP）ルーチンを実現し、それによってシステムは関数演算を実施しない。また、システムは単純に時間を止めようとする。ルーチン１６は何の動作も実施しないので、ルーチン１６には図２の取出解読ループ１２に戻る分岐が含まれるに過ぎない。ルーチン１６は、NOP命令エミュレーション・ルーチンであり、NOP命令にはオペランドがないので、ルーチン１６は、ルーチン１２の第２のLBZU命令からの予備取出値が演算コードでありデータ／オペランドでないことを理解している。これは、ルーチン１２の第２のLBZU命令がアクセスしたメモリからの予備取出値が演算コードであることを意味する。この予備取出値が演算コードであるために、ルーチン１６はルーチン１２内のラベル取出２（FETCH２）に分岐して、予備取出値を演算コードとして処理する。テーブル１４の全ルーチンの最後に取出２（FETCH２）または取出（FETCH）分岐を実施することによって、ソフトウェアが終了するまで、エミュレータにより取出解読動作の連続ループと実行が実施される。
【００１４】
図２のルーチン１２により読み込まれた演算コードがバイナリ値Ｎ（たとえばN＝０１１０１１００バイナリ）である場合、ルーチン１２の実行後のRTEMP値とカウント・レジスタは、値TABLEBASE＋Ｎｘ６４を含むことになる。従って、ルーチン１２の終点のBCTR命令により、実行の流れが変化し、テーブル１４内のルーチン１２内の命令が実行される。ルーチン２０において、最初の命令は符号バイト延長（EXTEB：extend sign byte）命令であり、これはROPCODEの内容に関して実施される。この演算は、演算コード・レジスタ上で実施されるが、これは、BIPUSH命令が適切なエミュレーションを行うため必要とされる１つの命令オペランドを含むエミュレーション済み命令であるので、ルーチン１２の第２のLBZU命令により取り出された予備取出値がデータ値を表さねばならないことがルーチン２０には理解されているためである。ルーチン２０が実施するBIPUSH演算は、命令LBZUのみが符号の内８ビット値を３２ビットのスペースに読み込む符号付きデータ値を必要とするので、符号バイト延長命令を実行しなければならない。
【００１５】
ROPCODEレジスタの値の符号を延長した後で、更新を伴うワード格納（STWU：store word with update）命令が実行される。この命令は、まずJavaスタック・ポインタ（RSP）を４だけ減分し、次にROPCODEの３４ビット（４バイト）値をこのRSP位置に置くことにより、ROPCODEの値をJavaオペランド・スタックに入れる。ルーチン２０においてコードによりこのスタックが適切に処理されると、ルーチン１２内でアセンブラ・ラベル取出（FETCH）へ分岐が戻る。ルーチン１２の分岐は、ルーチン２０がルーチン１２の予備取出バイトをすでに使用／消費してしまったために、ラベル取出２（FETCH２）へは戻らないので、新規の命令取出によりルーチン１２を開始しなければならない。
【００１６】
ルーチン１２が読み込んだ演算コードがＭ（たとえばＭ＝１１１００１１０バイナリ）に等しい場合、ルーチン１２の終点のRTEMP値およびカウント・レジスタはTABLEBASE＋Ｍｘ６４に等しくなる。この場合、ルーチン１２の終点のBCTR命令により、テーブル１４のルーチン２２に実行の流れが続く。ルーチン２２は、オペランド・スタック上でPOP演算を実施する。このPOP演算を実施するために、ロード・アドレス（LA）命令が、オペランド・スタック・ポインタ（RSP）を用いて実施される。このロード・アドレス命令は、オペランド・スタック・ポインタに４の値を加えて、このアドレス値をスタック・ポインタ（RSP）に戻して、オペランド・スタックから効率的に１ワードを削除する。このアドレス処理がルーチン２２において実施されると、POP演算は終了し、実行はルーチン１２のラベルFETCH２に戻る。これは、ルーチン１２の第２のLBZU命令からの予備取出値に、ルーチン１２においてルーチン１２の第１LBZU命令を介する別の新規の命令取出を必要とせずに演算コードとして処理しなければならない演算コードが含まれるためである。
【００１７】
従って、図２は、外部メモリから演算コードおよびデータのうち１つ以上のものを取り出すようループ状に実行する特定のエミュレータ・ルーチン１２を示す。ルーチン１２を介して読み込まれた演算コードは、分岐命令BCTRが特定の演算コードに関してエミュレーション・ルーチンを起動するために用いる適切なソフトウェア・エミュレーション・ベクトルを導くために処理される。命令BCTRを実施することにより、テーブル１４内の個々のルーチンが適切に実行され、それによってルーチンのすべては最終的に実行制御を取り出した解読ルーチン１２に戻る。プログラムが終了されるまで、反復エミュレーション／翻訳は、このループ状に進行する。
【００１８】
図２を用いて、エミュレーションおよび翻訳済み言語実行の両方に関するエミュレーション・オーバーヘッドの効果を示すことができる。オーバーヘッドの例として、図２のルーチン２２がPOP演算を実施する。エミュレーション環境を用いてこのPOP演算を実施するために、ルーチン１２からの６つの命令と、ルーチン２２からの２つの命令とを実行して、エミュレーション済みPOP演算を実施する必要がある。しかし、合成されたルーチン１２，２２内の合計８個の命令のうちから、１つの命令だけ（「LA RSP，４（RSP）」命令）が実際のPOP演算を実施し、８個の命令のうち残りの７つはエミュレーション・オーバーヘッドの一部として実行される。それに由来するPOPエミュレーション・オーバーヘッドは図２のプロセスに関しては８０％以上である。さらに、図２のルーチン１２は、エミュレーションを必要とする各命令毎に実行されるので、ルーチン１２内のオーバーヘッドがエミュレーションの性能全体に大きな影響を与える。これは、ルーチン１２がループ状に連続して再実行されるためである。従って、ルーチン１２の命令が削減されると、それがいかなるものであっても、各エミュレーション済み命令に関して必要とされるループ状に実行されるオーバーヘッドを大幅に削減することで、エミュレーションの性能全体に大きな影響を与える。また、テーブル１４のルーチン１６〜２２内に位置するコードもより少ない命令に最適化できるように取出解読ループ１２を調整することができると、エミュレーション中にさらに大幅な性能の改善を行うことができる。
【００１９】
このオーバーヘッドと性能の削減は、図１のアーキテクチャを用いて図３ないし図７により得られる。図３は、図２に示される従来技術による取出解読ループ１２の代わりに用いることのできる新規の取出解読ループ１２’を示す。図３の新規の取出解読ループ１２’は、TABLEBASEアドレス値をメモリ・マップ内の１６Ｋバイトの倍数アドレス（たとえば３２Ｋ，１２８Ｋ，２０４８Ｋなど）に配置することを要する。このＬ＊１６Ｋ TABLEBASE値が設定されると（ただしＬは正の整数）、図３のコードを用いて図２の取出解読ループ１２のオーバーヘッドを削減することができる。
【００２０】
図３のコードは、図２に関して前述されたのと同じLBZU命令を実施することにより始まる。しかし、図３では図２のSWLIおよびADD命令を単独のINSRWI命令と置き換える。INSRWIは「レジスタの右側からワード隣接値を挿入（insert from the right side of the register with a word immediate value）」を意味する。INSRWI命令により実施される演算を図４のブロック図においてグラフでさらに説明する。
【００２１】
図４は、TABLEBASE値が１６Ｋメモリ境界に位置することを示す。TABLEBASE値がこのように配置されるので、位置０からビット位置１７までの最高位ビット（MSB：most significant bit）には、TABLEBASE値の高次ビットが含まれ、TABLEBASE値の低次ビット位置１８ないし３１は、固有のバイナリ値０を有する。INSRWI命令はROPCODEレジスタに格納される演算コード値を取り、この値を６だけシフトさせる。６ビット位置左へのシフトで、演算コード値は、図４に示されるようにRTABLEBASEレジスタのビット位置１８ないし２５に一致する。このシフトされた演算コード値を次に、ADD命令の必要なしに、以前はTABLEBASE値の１６Ｋバイト一致により０であった図４のビット位置１８ないし２５に直接挿入することができる。INSRWI命令は、値８，６を指定する命令オペランドを有する。これは、６ビット位置シフト演算を実施した後で８ビットをRTABLEBASEに挿入することを表す。これら８個の演算コード・ビットが、RTABLEBASEレジスタのRTABLEBASEベース・アドレスでは０の論理値で満たされた部分に挿入されるので、加算演算を実施する必要がなくなる。それによってルーチン１２に比べてルーチン１２’では１つの命令が節約される。さらに低次のビット位置２６ないし３１は図４に示されるようにゼロのままになる。これらの低次０ビットは、テーブル１４が長さ１６ワードのルーチンを含むために必要とされる。従って、TABLEBASE値を適切に配置および調整することにより、図３において単独の命令INSRWIを用いて、図２の以前の２つの命令SWLIとADDに置き換えることができる。ルーチン１２’をこのように簡略化するだけで、図２の例に比較してJava準拠エミュレータの性能にほぼ１０％の改善が見られることが実験的にわかっている。
【００２２】
図３においてINSRWI命令を実施後、RTABLEBASEに格納された値がカウント・レジスタ（PCTR）に移され、予備取出演算LBZUが実施される。これらの命令MTCTRとLBZUとは、図２に関して前述されたものと同様である。予備取出LBZU演算の実行後、分岐カウント・レジスタ（BCTR）命令が用いられて、エミュレータの実行の流れは、テーブル１４に位置するルーチン１６〜２４のうち１つで進行される。
【００２３】
図３および図４の方法は、図２の従来技術によるルーチンに比べて改善されているが、図５のルーチンには、図３に論じられるものに比べてさらに性能上の利点が加わる。図５は、図２または図３に示されるものに比べてさらに最適化される新規の取出解読ループ１２”を示す。さらに、図５のルーチン１２”により、テーブル１４に位置する個々の命令エミュレーション・ルーチン１６〜２４の最適化が改善される。詳しくは、図２のBIPUSHルーチン２０を、図５の取出解読ループ１２”における変更により、図５のBIPUSHルーチン２０”に簡略化することができる。
【００２４】
図５の取出解読ループ１２”は、図３に関して前述したようにLBZU命令およびINSRWI命令を実行することにより始まる。従って、図５のプロセスは、図３のエミュレーション方法に関して前述したすべての利点を有する。図５のこれら２つの命令の実行後は、RTABLEBASEレジスタは、テーブル１４で実行されるエミュレーション・ルーチンのベクトル・アドレスを含む。RTABLEBASE内のこのベクトル・アドレスは、RTABLEBASE内の値をMTCTR命令を介してカウント・レジスタ（RCTR）に移動させることにより維持される。MTCTR命令の実行後に、「複数データ・タイプのロードと生成」（LGMDT：load and generate multiple data types）と称される新しい命令が実施される。LGMDTは、一般に、メモリまたは同様のソースから入力値をロードし、入力値から、各々が異なるデータ・フォーマットを有する複数の結果値を生成する任意の実行可能なコンピュータ命令である。LDMDT命令は、一般に、異なるデータ・フォーマットを有する各結果値を、複数のCPUレジスタ内の異なるレジスタに格納して、エミュレータがLGMDT命令の実行に続いて１つのデータ・フォーマットを用いることができるようにする。
【００２５】
詳しくは、図５に示されるLGMDT命令はJavaプログラム・カウンタ（RPC）を１だけ増分し、次にJavaプログラム・カウンタ（RPC）が示すアドレスからバイト値（すなわち８ビット）を読み込む。バイト値は、実際はメモリから読み込んだ演算コードであるが、図５のLGMDT命令は、メモリから読み込んだバイト値をデータ・オペランドとして扱う。バイト値をデータ・オペランドとして扱うことにより、LGMDT命令は読み込んだデータ・バイトを３２ビット符号付きまたは符号なしのデータ値に変換する。このとき、符号なしのデータ値は第１ROPCODEレジスタ（たとえばROPCODEレジスタ）に格納され、符号付きデータ値は第２ROPCODEレジスタ（たとえばROPCODE＋１レジスタ）に格納される。LGMDT命令の実行後、BCTR命令を用いて、テーブル１４内のルーチンの１つを上述のように実行するために実行の流れを変える。
【００２６】
図５は、BIPUSH命令を利用したLGMDT命令の利点を詳しく示す。BIPUSHルーチン２０”は、ルーチン１２”のLGMDT命令の存在により図５において簡略化されている。LGMDT命令の実行により、図２に示されるようにルーチン２０に以前から存在する符号バイト延長命令を図５のルーチン２０”から削除することができる。LGMDT命令がテーブル１４のルーチンに関して符号付きの結果と付いていない結果の両方を提供して利用できるようにしたことで、この削除が可能になる。さらに、ルーチン２０”のSTWU命令は図２に示されるようにROPCODE位置にはもはやアクセスしないが、ルーチン１２”のLGMDT命令により生成される符号付き値を含むROPCODE＋１レジスタにアクセスする。レジスタROPCODEは、ルーチン２０”では必要とされない符号なしの値を含む。従って、比較すると、BIPUSH命令をエミュレーションするためには図２では９個の命令が必要であるが、図５の方法を用いると、BIPUSH命令をエミュレーションするために７個の命令で済む。
【００２７】
図６では、図５に示されるよりもさらに性能が改善されオーバーヘッドが削減される。図６は、図５に示されるものよりも拡大されさらに複雑なLGMDT命令を示す。しかし、この改善されたLGMDT命令を用いて、エミュレーション・システム１０を用いて実施されるエミュレーション・アルゴリズムをさらに簡略化することができる。図６のLGMDT命令は、４個の命令オペランドを含む。第１オペランドは、ROPCODEレジスタ宛先であり、第２オペランドはJavaプログラム・カウンタ（RPC）を用いてメモリから取り出すための次の演算コードのアドレスであり、第３オペランドは外部メモリから読み込まれる演算コード内のビット数（たとえばこの例では８）であり、LGMDT命令の第４オペランドはベクトル生成に先立ち演算コードを左にシフトすべきビット位置数（たとえば、この例では６）である。LGMDT命令のオペランドは、特定のオペランドをハードウェアまたはLGMDT命令解読処理における特定の値または位置にハード配線または固定することにより削減することができることに注目することが重要である。たとえば、ビット・サイズ８と左シフト値６とをLGMDT命令内に「ハード配線」することができ、これによって、これらのパラメータはプログラミング可能とはならずに命令の実行により固定される。
【００２８】
LGMDT命令は外部メモリから８ビット値を読み込み、３つの異なる内部CPUレジスタに３つの結果を生成する。図６のLGMDT命令により生成される第１値は、図４または同様のプロセスにより生成されるベクトル・アドレスである。LGMDT命令により生成される第２値は、図５に関して前述された符号なしの３２ビットのオペランド／データ値である。図６のLGMDT命令により生成される第３値は、演算コードから生成され、内部ROPCODEレジスタの１つに配置される３２ビットの符号付きオペランド／データ値である。一般に、LGMDT命令からのベクトル・アドレスはROPCODE＋２レジスタ内に、符号付き３２ビット・オペランド／データ値はROPCODE＋１レジスタ内に、符号なし３２ビット・オペランド／データ値はROPCODEレジスタ内に配置される。LGMDT命令から３つの結果がこのように配置されると、MTCTR命令がROPCODE＋２レジスタの内容をカウント・レジスタ（RCTR）に移動させる。第２LGMDT命令が実行されて、新規の演算コード，符号付きオペランドまたは符号なしオペランドのいずれか１つの予備取出を可能にする。BCTR命令により、テーブル１４内に位置するルーチンの１つにおいて実行の流れを継続することが可能になる。
【００２９】
図６は、BIPUSH演算２０”’を詳しく示す。ルーチン２０”’は、図５に関して説明されたものと同様である。
【００３０】
図６は、POP演算２２”’を示す。LGMDT命令は３２ビットの符号付きおよび符号なしデータ値に加えてベクトル計算を行っているので、図６のルーチン２２”’は、図５および図２にそれぞれ示されるように、INSRWI命令またはSWLI命令に戻る代わりに、MTCTR命令に戻ることができる。言い換えると、２２”’のルーチンは、ルーチン１２”’内の位置に単純に戻ることができ、それによってカウント・レジスタ（RCTR）を更新して、カウント・レジスタに対するこのような移動を実施する前にレジスタの予備処理を実施する必要がなくなる。従って、図６で用いられるコードにより、POP演算２２”’の実行において命令が１つ節約され、BIPUSH演算２０”’を実行する際に図５に示されるものと比べて追加の命令を１つ節約する。要するに、図６で用いられるコードは、BIPUSH演算を実施するには６個の命令を必要とするのに対して、従来技術では図２の同じBIPUSHプロセスを実施するのに９個の演算を必要とした。これは、BIPUSHルーチンの命令用途においては３０％超の節約である。エミュレーション・パッケージまたは翻訳済み言語システムにおける他のすべての命令に関しても同様の節約が見られる。要するに、本明細書において種々の新規命令が導入され、それによってコード・エミュレーションおよび翻訳済み言語実行におけるオーバーヘッドの削減が可能になる。そのためにコンピュータの性能を大幅に改善することができる。
【００３１】
図７は、図６に示されるLGMDT命令を実現するために用いることのできるレジスタ・ファイル１００とロード・ユニット１０１とを示す。レジスタ・ファイル１００は６個のレジスタ：すなわちROPCODE１０２，ROPCODE＋１ １０４，ROPCODE＋２またはRTABLEBASE１０６，RSP１０８，RPC１１０およびRCTR１１２を備えて図示される。中央処理装置（CPU）ハードウェアRSP１０８レジスタはオペランド「スタック・ポインタ」であり、RPC１１０レジスタはエミュレーション「プログラム・カウンタ」であり、RCTR１１２レジスタは分岐ユニットを用いて分岐演算を実施するCPU「カウント・レジスタ」である。RSP１０８およびRPC１１０レジスタは、ロード・ユニット１０１がキャッシュおよび／または外部メモリから情報を読み込むことを可能にする。
【００３２】
ロード・ユニット１０１は、LGMDT命令に応答してメモリから１バイトを読み込む。このバイトは、３つのロード・サブユニット１１４，１１６，１１８に平行に送られる。ゼロ延長ユニットは、バイト値が符号なしオペランドであったかのように、バイト値を３２ビットの符号なし値に延長する。この符号なしオペランドは次にROPCODEレジスタ１０２に送られる。バイト値は、符号延長ユニット１１６を用いて符号延長される。符号延長ユニット１１６は、ROPCODE＋１レジスタ１０４（これはROPCODEレジスタ１０２よりも数字的に１だけ大きいレジスタである）にアクセスすることにより、符号付きオペランドとして用いるためにバイト値を３２ビット符号付き値に変換する。図７のベクトル・ビット・プロセッサ１１８は、SWLIおよびADD命令のシフトおよび加算演算を実施するか、あるいは図４に論じられる演算を実施して、RTABLEBASE/ROPCODE＋２およびバイト値をテーブル１４内の少なくとも１つのルーチンにアクセスするために用いられるルックアップ・ベクトルに変換する。テーブル１４およびルーチン１２内のコードは、３つのレジスタのいずれか１つにアクセスして、必要とされる値を得て、レジスタ１０２〜１０６で必要とされないその他のすべての値を無視する。
【００３３】
図８は、図７に示されるロード／格納ユニット１０１およびレジスタ・ファイル１００を含む汎用コンピュータ１２０を示すブロック図である。汎用コンピュータ１２０は、ロード／格納ユニット１０１およびレジスタ・ファイル１００を含む中央処理装置（CPU）またはプロセッサ１２２を有する。メモリ１２４はバス１２６によりプロセッサ１２２に接続される。メモリ１２４は、比較的高速の機械読取可能な媒体であり、DRAMおよびSRAMなどの揮発性メモリと、ROM，フラッシュ，EPROM，EEPROMおよびバブル・メモリなどの不揮発性メモリとを備える。バス１２６には、二次記憶装置１３０，外部記憶装置１３２，モニタ１３４などの出力装置，キーボード（マウス付き）１３６などの入力装置およびプリンタ１３８も接続される。二次記憶装置１３０は、ハードウェア・ディスク・ドライブ，磁気ドラムおよびバブル・メモリなどの機械読取可能な媒体を備える。外部記憶装置１３２は、フロッピー・ディスク，リムーバブル・ハードウェア・ドライブ，磁気テープ，CD-ROMなどの機械読取可能な媒体を備え、通信回線を介して接続されることもある他のコンピュータを含むこともある。二次格納装置１３０と外部格納装置１３２との間にここで描かれる区別は、主に本発明を説明するための便宜上のものである。そのため、これらの要素の間には実質的に機能が重複する部分があることを理解頂きたい。エミュレーション・コード２０〜２４およびユーザ・プログラムなどのコンピュータ・ソフトウェアは、メモリ１２４，二次格納装置１３０および外部格納装置１３２などのコンピュータ・ソフトウェア格納媒体に格納することができる。コンピュータ・ソフトウェア１３３の実行可能なバージョンは、外部記憶装置１３２，二次記憶装置１３０および不揮発性メモリなどの不揮発性記憶媒体から読み込み、揮発性メモリ内に直接的に実行のためにロードするか、不揮発性メモリから直接的に実行するか、あるいは揮発性メモリにロードする前に二次記憶装置１３０に格納してから実行することができる。
【００３４】
本発明は、特定の実施例を参照して説明および図示されたが、これらの実証例に本発明を制限する意図はない。本発明の精神および範囲から逸脱することなく変更および変形が可能であることは、当業者には認識頂けよう。たとえば、本明細書に教示されるLGMDT命令は、８ビット値の出力の処理を行うだけでなく、任意のサイズ（１６ビット，４ビット，３２ビット，６４ビットなど）の値を異なるデータ・フォーマットに処理して、異なるレジスタに格納することもできる。本明細書において用いられるプロセスを用いて、任意の符号付き数値，符号なし数値，浮動小数点フォーマット，異なる整数フォーマット，左または右揃え数値，シフトまたは回転値，大エンジアン（big endian）値，小エンジアン（little endian）値，ASCII出力または他の数値フォーマットに平行する他の数値フォーマットに生成して、エミュレーション性能または翻訳済み言語実行を改善することができる。場合によっては、ルーチン１２のコードをテーブル１４のルーチン内において、分岐予測および分岐キャッシュ・ロードを節約することもできる。従って、本発明は添付の請求項の範囲内に入るこれら変形および変更のすべてを包含するものである。
【図面の簡単な説明】
本発明の特徴および利点は、詳細説明と添付の図面とを関連させることにより、さらに明確に理解頂けよう。図面においては、同様の番号は同様の対応する部品を指す。
【図１】  本発明により用いられるエミュレータ・ソフトウェア・アーキテクチャをブロック図に示す。
【図２】  図１のソフトウェア・エミュレータの特定のソフトウェア命令内容をブロック図に示すが、このソフトウェア内容は当技術では周知であり、大量のエミュレーション・オーバーヘッドを有する。
【図３】  本発明によりエミュレーション・オーバーヘッドを削減した、図１のソフトウェア・エミュレータを構築するために用いることのできる改善されたソフトウェア命令内容をブロック図に示す。
【図４】  本発明によるソフトウェア命令エミュレーション・ルーチンのベクトル・アドレスを生成する方法をブロック図に示す。
【図５】  本発明によりエミュレーション・オーバーヘッドを削減した、図１のソフトウェア・エミュレータを構築するために用いることのできる改善されたソフトウェア命令内容をブロック図に示す。
【図６】  本発明によりエミュレーション・オーバーヘッドを削減した、図１のソフトウェア・エミュレータを構築するために用いることのできる改善されたソフトウェア命令内容をブロック図に示す。
【図７】  本発明による図６に図示されるソフトウェアを構築する特定のハードウェアをブロック図に示す。
【図８】  図７に示される特定のハードウェアを含む汎用コンピュータを示すブロック図である。
図例を簡単明瞭にするために、図面に図示される要素は必ずしも同尺に描かれないことを認識頂きたい。たとえば、ある要素の寸法を明確にするために、他の要素に関して誇張する。さらに、適切と思われる場合には、参照番号は図面間で繰り返し用いられて、対応するまたは類似の要素を標示する。
【図１】
0004088418.tif 000002
【図２】
0004088418.tif 000003
【図３】
0004088418.tif 000004
【図４】
0004088418.tif 000005
【図５】
0004088418.tif 000006
【図６】
0004088418.tif 000007
【図７】
0004088418.tif 000008
【図８】
0004088418.tif 000009