(57)【特許請求の範囲】
【請求項１】
コンパイラにおける乗算演算を実施する方法であって、
コンピュータがコンパイラを実行して入力値を受け取るステップと、
コンピュータがコンパイラを実行して、上記入力値を、上記コンパイラに関連し、上記乗算演算を実行する命令シーケンスを含むルックアップ・テーブルへのインデックスとして使用するステップと、
コンピュータがコンパイラを実行して、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップと、
コンピュータがコンパイラを実行して、上記取り出した整数を上記命令シーケンスに変換するステップと、
コンピュータがコンパイラを実行して、上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップと、
コンピュータがコンパイラを実行して、上記乗算演算の結果の出力値を提供するステップと、を含むコンパイラにおける乗算実施方法。
【請求項２】
上記ルックアップ・テーブルにおいて、上記命令シーケンスの終了を示す監視命令が上記命令シーケンスに含まれる、請求項１に記載のコンパイラにおける乗算実施方法。
【請求項３】
コンピュータがコンパイラを実行して、上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として提供するステップを更に含む、請求項２に記載のコンパイラにおける乗算実施方法。
【請求項４】
コンパイラにおける乗算演算を実施する装置であって、上記乗算演算を実行する命令シーケンスを含み、上記コンパイラによって使用されるルックアップ・テーブルと、上記コンパイラへの入力値を使用して上記ルックアップ・テーブルへインデックス付けする手段と、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出す手段と、上記取り出した整数を上記命令シーケンスに変換する手段と、を備え、上記コンパイラが上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行し乗算演算の結果の出力値を提供する、コンパイラにおける乗算実施装置。
【請求項５】
ルックアップ・テーブルを使用して、コンパイラにおける乗算演算を実施する方法であって、
当該ルックアップ・テーブルには、命令シーケンスの第１番目の命令がレベル１命令であり、上記命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、１命令からなるシーケンスをレベル１命令シーケンスとし、Ｎ命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベル毎に所与のアーキテクチャ上で乗算結果を計算するために有効なＡＬＵ命令が符号化して書き込まれており、ＡＬＵ命令の各シーケンスを表すように生成された整数が各シーケンスの対応箇所に書き込まれており、
コンピュータがコンパイラを実行して、入力値によって上記ルックアップ・テーブルにインデックス付けするステップと、
コンピュータがコンパイラを実行して、インデックス付けされたルックアップ・テーブル位置にある上記整数を、対応するＡＬＵ命令シーケンスに展開するステップと、
コンピュータがコンパイラを実行して、ＡＬＵ命令の対応するシーケンスを実行し、上記入力値に対する乗算演算を行うステップと、
コンピュータがコンパイラを実行して、上記乗算演算の結果の出力値を提供するステップと、を含むコンパイラにおける乗算演算実施方法。
【請求項６】
上記ルックアップ・テーブルにおいて、上記ＡＬＵ命令が、２つの入力を受け取り１つの出力を生成する命令コード、および１つの入力を受け取り１つの出力を生成する命令コードに分類され、ＡＬＵ命令シーケンスの終了にマークをつける監視文字として上記命令コードの１つが予約され、２入力および１出力を持つ命令コードの範囲が記録され、２入力および１出力を持つ命令コードの範囲が列挙される請求項５に記載のコンパイラにおける乗算演算実施方法。
【請求項７】
符号化する上記ステップが、上記レベルを二乗するステップと、当該二乗した値に、２入力を持つ命令コードの数を乗算するステップと、その結果の積に１入力を持つ命令コードの数を加算するステップと、その合計に監視文字を定義するための１を加えるステップとを含む、請求項６に記載のコンパイラにおける乗算演算実施方法。
【請求項８】
コンピュータがコンパイラを実行して、インデックス付けされたルックアップ・テーブル位置にある上記整数を、対応するＡＬＵ命令シーケンスに展開するステップが、入力値Ｕを使用して、該入力値に定数値Ｘを乗ずる乗算演算を実行するＡＬＵ命令シーケンスを表す整数をＳ0と名付けるステップと、上記ＡＬＵ命令シーケンスの第１番目の命令がレベル１命令であり、上記ＡＬＵ命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、１命令からなるシーケンスをレベル１命令シーケンスとし、Ｎ命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベルにおけるＡＬＵ命令符号化値を含む、上記ルックアップ・テーブルのレベル・テーブルを計算するステップと、剰余の各々がＡＬＵ命令を表す剰余および被除数を計算するステップと、上記剰余を上記ＡＬＵ命令に対応づけるステップと、を含む請求項５に記載のコンパイラにおける乗算演算実施方法。
【請求項９】
第１の剰余Ｒ1の値が命令コード番号であり、Ｕの値がすべてのレベル１命令に対する入力であるように上記第１の剰余Ｒ1からレベル１命令への対応付けを行うステップを更に含む、請求項８に記載のコンパイラにおける乗算演算実施方法。
【請求項１０】
第２の剰余Ｒ2が０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱ2＝Ｒ2−１とし、Ｑ2の値が22×5未満であれば、２入力命令コードを使用することとして、Ｑ2／２2＋１が対応するＡＬＵ命令コード番号であり、Ｑ2ｒｅｍ２の値が第１の入力値であり、(Ｑ2／２)ｒｅｍ２の値が第２の入力値であり、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、Ｑ2の値が22×5以上である場合、Ｐ2=Ｑ2−２2×５として、１入力命令コードを使用することとして、Ｐ2／２＋６を対応する命令コード番号とし、Ｐ2ｒｅｍ２をその入力の値とするように、第２の剰余Ｒ2からレベル２命令への対応付けを行うステップをさらに含む、請求項８に記載のコンパイラにおける乗算演算実施方法。
【請求項１１】
第Ｎ番目の剰余ＲNが０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱN＝ＲN−１とし、ＱNの値が２N×Ｙ未満であれば、２入力命令コードを使用することとして、ＱN／Ｎ2＋１が対応するＡＬＵ命令コード番号であり、ＱNｒｅｍＮの値が第１の入力値であり、(ＱN／Ｎ)ｒｅｍＮの値が第２の入力値であり、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、ＱNの値が２N×Ｙ以上である場合、ＰN=ＱN-1−Ｎ2×Ｙとして、１入力命令コードを使用することとして、ＰN／Ｎ＋６を対応する命令コード番号とし、ＰNｒｅｍＮをその入力の値とするように、第Ｎ番目の剰余ＲNからレベルＮ命令への対応付けを行うステップをさらに含む、請求項８に記載のコンパイラにおける乗算演算実施方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータに関するもので、特に、ソース・コード・コンパイルの際にコンピュータによって実行される乗算演算に関するものである。
【０００２】
【従来の技術】
既知の定数Ｘによる整数乗算が、整数乗算に関するハードウェア命令を持たないプロセッサ上で短いシーケンスの命令を使用して実行されることが多い。(以下、演算論理機構をArithmetic and Logical Unitの頭文字をとって「ＡＬＵ」と呼称する)。従来技術のアプローチは、コンパイル段階でこれらのシーケンスを探索する探索アルゴリズムの使用を伴う。探索アルゴリズムが非常に複雑であるので、コンパイラの探索の範囲を狭くするのに役立つように種々の発見的手法(Heurisitics)が使用される。あいにく、これらの発見的手法は、コンパイラが乗算を実施するため効率の悪いＡＬＵ命令シーケンスを使用する原因となることが多い。そのような場合、コンパイラによって作成される実行可能プログラムは、最適でない形態で動作する。
【０００３】
更に、特定の整数定数に関して、コンパイル時探索アルゴリズムは、乗算を実施する合理的ＡＬＵ命令シーケンスを見出すことができない。そのような場合には、乗算シーケンスは実行時サブルーチンを使用して実行されなければならない。実行時のサブルーチンの使用は、アプリケーションの処理性能を極めて悪化させる。
【０００４】
整数乗算および除算演算を実行する種々の技術が提案されてきた。例えば、T.Granlund, P. Montgomery両氏は、その著"Division By Invariant Integers using Multiplication, Association of Computing Machinery, 0-89791-662x/94/0006(1994)"で、整数乗算を使用する任意の非ゼロ整数定数および実行時不変式として除算用コード・シーケンスを提示する整数除算を達成するアルゴリズムを開示している。このアルゴリズムは、整数積の上方半分が迅速にアクセスできることを必要とする２の補数アーキテクチャを仮定する。
【０００５】
R. Bernstein氏は,その著" Multiplication by Integer Constants, Software - Practice and Experience, vol. 16(7), pp. 641-652, John Wiley & Sons,Ltd.(1986)"で、レジスタの内容に整数定数を乗算するため、「加算」、「減算」および「シフト」のシーケンスを見出す方法を開示している。Bernstein氏は,、所望の限度までのすべての数について小さい星連鎖シーケンスのテーブルを構築するための(上記文献において引用されている)Knuth氏によって提案された方法を考察している。Bernstein氏は、そのようなテーブルを記憶するために必要な空間が膨大であり、Knuth氏によって提案された方法が命令セットのタイミングに敏感であり、そのような方法を使用して構築されるテーブルは目標コンピュータの命令セットに依存するものとなると結論づけている。このように、既存の技術は整数乗算演算のためテーブルを使用することを奨励していない。
【０００６】
【発明が解決しようとする課題】
かくして、整数乗算演算を実行するためＡＬＵ命令の効率的なシーケンスを生成する問題を解決する技術の提供が求められている。
【０００７】
【課題を解決するための手段】
本発明は、定数による乗算のような整数乗算演算を実行するＡＬＵ命令の効率的シーケンスを生成する問題を解決する。本発明は、目標アーキテクチャに関して最も効率的な命令シーケンスを保有するルックアップ・テーブルを使用して、既知の定数Ｘによる整数乗算を実現する。本発明は、短いシーケンスのＡＬＵ命令を記憶するために使用することができるコンパクトな符号化手段を提供する。ヒューレット・パッカード社のＰＡ−ＲＩＳＣアーキテクチャに関しては、そのようなコンパクトな符号化手段は、最高８個までの(６４ビット未満の)ＡＬＵ命令からなるシーケンスを記憶することができる。
【０００８】
本発明が構築するルックアップ・テーブルを使用することによって、既知の定数による整数乗算を実行するために必要なＡＬＵ命令の最も効率的なシーケンスをコンパイラは常に生成することができる。本発明の好ましい実施形態において、既知の定数オペランドはルックアップ・テーブルへのインデックスとして使用され、そこから１つの６４ビット整数が取り出される。次に、この６４ビット整数が、Ｘによる整数乗算を実行する短いＡＬＵ命令シーケンスに展開される。特定の整数Ｘについて最も効率的なシーケンスのＡＬＵ命令を計算することは計算量の観点から非常に高価であるけれども、ルックアップ・テーブルの値は特定のアーキテクチャについてただ一度だけ決定すればよい。
【０００９】
発明の課題を解決する手段として、本発明は、コンパイラにおいて乗算演算を実行する命令シーケンスを含むルックアップ・テーブルを作成するステップ、上記コンパイラへの入力値を提供するステップ、上記入力値を上記ルックアップ・テーブルへのインデックスとして使用するステップ、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップ、上記取り出した整数を上記命令シーケンスに変換するステップ、上記コンパイラを用いて上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップ、および上記乗算演算の結果を出力値として提供するステップからなるコンパイラにおける乗算実施方法を含む。
【００１０】
【発明の実施の形態】
本発明は、定数の乗算のような整数乗算演算を実行するためＡＬＵ命令の効率的なシーケンスを生成する問題を解決する。所与の整数Ｘに関してＡＬＵ命令の最も効率的なシーケンスを決定するために使用されるコンパイル時の簡単なルックアップ・テーブルを提供する。
【００１１】
図１は、単一プロセッサ・コンピュータのアーキテクチャ１０を示す。プロセッサ１１は、システム・バス１５と通信するキャッシュ１２を含む。システム・メモリ１３および１つまたは複数のＩ／Ｏ装置１４もまたシステム・バスと通信する。コンパイル操作において、ユーザは、コンピュータ上で動くプログラムであるコンパイラにソース・コード・プログラムを入力する。コンパイラは、ソース・コードを受け取り、コードを処理して、(図のコンピュータ・アーキテクチャ１０のような)目標コンピュータのアーキテクチャに対して最適化された実行可能ファイルを生成する。
【００１２】
図２は、例えば図１で示されたコンピュータ・アーキテクチャ１０と関連して使用される場合があるソフトウェア・コンパイラ２０を示す。コンパイラ・フロントエンド・コンポーネント２１が、ソース・コード・ファイル１００を読み取り、それを高水準中間表示形式(ＨＬＩＲ)１１０に翻訳する。高水準最適化プログラム(ＨＬＯ)２２が、高水準中間表示形式１１０を一層効率的な形式に最適化する。コード生成ルーチン２３が、最適化された高水準中間表示形式を低水準中間表示形式(ＬＬIＲ)１２０に変換する。低水準最適化ルーチン(ＬＬＯ)２４が、低水準中間表示形式１２０を一層効率的な(機械による実行可能な)形式に変換する。最後に、オブジェクト・ファイル生成ルーチン２５が、最適化された低水準中間表示形式をオブジェクト・ファイル１４１に書き出す。オブジェクト・ファイル１４１は、他のオブジェクト・ファイル１４０とともにリンカ２６によって処理され、コンピュータ１０上で実行させることができる実行可能ファイル１５０が生成される。現代のコンピュータ・アーキテクチャにおいては、コンパイラは多くのタスクを実行する。例えば、コンパイラは、Ｃのような高水準言語を一連の機械命令に翻訳する。コンパイラによって実行される諸タスクの中の１つは、乗算のような整数演算を伴う高水準式の処理を行うことである。
【００１３】
乗算演算は非常に一般的である。例えば、Ｖが変数であるとして５９×Ｖのような乗算演算を含む式がプログラムの中にあるかもしれない。そのような場合、コンパイラはそのような乗算演算を実行する方法を決定しなければならない。既存のコンパイラは、上記の例のような乗算の場合、５９が出力であるようにシフト加算(shift and add)命令を合成する方法を決定するために発見的手法を使用する。その後、１つの入力Ｖが命令の１つのシーケンスに対して提示され、最終的な命令の出力がＶ×５９となる。
【００１４】
上で示したように、コンパイラによって使用される実行時アルゴリズムの１つは、発見的手法を使用して探索する探索アルゴリズムである。本発明は、探索を実行する代わりに、入力値をテーブルへのインデックスとして使用し(すなわち、例えば５９という入力値を例えばテーブルの中の５９番目のエレメントへのインデックスとして使用し)、そこから整数を取り出し、その整数に対してあらかじめ定められた演算シーケンスを実行することによって整数をいくつかのより小さい整数に展開する。これらのより小さい整数の各々は、例えば加算(add)、シフト(shift)、減算(subtract)のような１つの命令に対応付けされる。更に、監視文字を使用して、プロセスが停止しなければならない位置が標示される。コンパイラが監視文字に出会う前に生成する最後の命令の結果が、所望の結果(すなわちＶ×５９)である。しかし、本発明の代替的実施形態においては、あらかじめ決められた最大実行命令数を受けとることがプロセスの終了を示すようにすることもできる。そのようなケースでは、監視文字は必要とされない。
【００１５】
整数演算シーケンスを見出すための探索に要する１回のコストが計算上高価な指数アルゴリズムであるため、各整数毎にすべての解を事前計算するオフライン処理を使用して、本発明のテーブルは構築される。テーブルは、目標アーキテクチャに関して最も短く最も最適な命令シーケンスを単一の整数として記憶する。次に、この単一整数がコンパイラによって展開され、特定の定数に関する最適な命令シーケンスが取り出される。
【００１６】
各シーケンスは基本的には１つの整数に圧縮することができるので、テーブルに必要な記憶容量は最小限のものである。-216(すなわち-65,536)から+216(すなわち+65,536)までのすべての整数に関して解が与えられる本発明の好ましい実施形態において、必要とされることは、テーブルにインデックスを付け、記憶された整数を取り出し、整数を最高８個の命令シーケンスに分解し、１つの変数値を入力してそれに特定の既知の定数を乗ずる整数乗算演算を実行することだけである。テーブルをより大きくまたはより小さくすることは可能である。ＰＡ−ＲＩＳＣアーキテクチャにとって６４ビット整数が自然なサイズであるので、６４ビットの整数が有用である。しかし、そのように制限しなければならないわけではなく、例えば１２０ビットまたはそれ以上のサイズを使用することは可能である。
【００１７】
本発明は、ある特定の所与の定数整数に関して１つのシーケンスを事前計算する。例えば、５を乗算することが必要であれば、"SHIFT 2 and ADD"(２回シフトして加算の意味であり本明細書において以下同様の表記法を用いる)を使用して、オリジナルのソース・オペランドを２回シフトすなわち４倍し、その結果にオリジナルのソース・オペランドが加算され、４プラス１倍すなわち５倍される。同様に、"SHIFT 3 and ADD"によって９が、"SHIFT 1 and ADD"によって３が生成される。
【００１８】
前述の整数演算を実行するために必要な命令のすべては、典型的には、実行時コードを用いてルックアップ・テーブルとして記憶するには大き過ぎる。各命令が、オリジナルのソース・オペランドであろうと実行に従って生成される一時的オペランデあろうと種々のオペランドを使用することができるような８個の命令があるとすれば、そのためのルックアップ・テーブルを提供することは難しい。数と８個の命令の間の対応付は通常難しく、膨大な量の記憶空間が必要となる。本発明の１つの利点は、テーブルがコンパイラと関連づけられるということである。従って、コンパイル時に、特定の乗算演算を実行する最適な方法を決定するために費やす時間は少ない。これは、コンパイラのコンパイル速度の向上に貢献する。
【００１９】
更に、単一整数毎に完全に最適なシーケンスを生成することが必要であるので、本発明のルックアップ・テーブルを生成するプロセスはオフラインで実施することができる。対照的に、既知のコンパイラは、発見的手法を使用して特定の整数による乗算の方法を決定することを試み、結果として１つのシーケンスにたどり着くことができるかもしれない。しかし、１つの乗算演算を実行することができる何百ものシーケンスが存在するので、そのようなシーケンスが最善のシーケンスでない可能性がある。ルックアップ・テーブルを提供することによって、本発明は、生成される命令のツリーの高さを最小にし、それによって、特定のアーキテクチャに関するいくつかの命令を並列して発することができる。従って、２つまたはそれ以上のＡＬＵが存在すれば、その複数のＡＬＵが並列して動作し後刻最終結果を組み合わせるように、特定のアーキテクチャにとって理想的なテーブル、少なくとも２つの命令を同時に発することができるシーケンスを生成することが可能である。
【００２０】
乗算はコンパイラが実行すべき基本動作であるので、本発明はコンパイラの低水準最適化ルーチンと関連する。特定の整数による乗算の方法に関するサブルーチンを提供することが必要とされる場合、本発明のテーブルはコンパイラがハードディスクから読むことができる補助ファイルであるようにすることもできる。また、頻繁にアクセスされるならば、テーブルはキャッシュに記憶してもよい。
【００２１】
図３は、本発明に従って整数乗算または除算シーケンスを記憶するためのコンパクトな符号化を実施するコンパイル・システムのブロック図である。このコンパクトな符号化は以下のように行われる。
先ず、整数乗算結果を計算するため所与のアーキテクチャ上で使用可能なすべてのＡＬＵ命令コード(opcode)が列挙される(ステップ２００)。ヒューレット・パッカード社のＰＡ−ＲＩＳＣアーキテクチャに関する限り、これらの命令コードは、add、sub、sh1add、 sh2add、 sh3add、 negおよびshlである。
但し、命令コードnegは、ＰＡ−ＲＩＳＣアーキテクチャではゼロにハード的に設定されているr0からの減算を使用して実施され、shlについては特別の形式の命令コードか実際には使用される。
【００２２】
上記の命令コードは、３つのオペランドを持つ命令コードと２つのオペランドを持つ命令コードに分類される(ステップ２１０)。３オペランド命令コードは、２つの入力を受け取り、１つの出力を生成する命令コードであり、add、sub、sh1add、sh2add、sh3addを含む。２オペランド命令コードは、１つの入力を受け取り、１つの出力を生成する命令コードであり、negを含む。左シフト命令コードshlは、汎用レジスタ入力、定数整数入力および出力を持つ３オペランド命令コードである。しかし、shlは、本発明の目的のため、命令コードshl1、shl2、shl3、shl4,...shl30、shl31というように１から３１までの定数整数入力を持つ３１種の２オペランド命令コードとして取り扱われる。
更に、最初の命令コードnopは、ＡＬＵ命令のシーケンスの終了にマークをつける監視文字として予約される(２２０)。
本発明の好ましい実施形態であるＰＡ−ＲＩＳＣ上での実施のため、次の表１のようにＡＬＵ命令コードおよびそれらに特定の命令コード番号が与えられる。
【００２３】
【表１】
nop    = 0,  shl7  = 13,  shl2O = 26,
sh3add = 1,  shl8  = 14,  shl2l = 27,
sh2add = 2,  shl9  = 15,  shl22 = 28,
sh1add = 3,  shIlO = 16,  shl23 = 29,
sub    = 4,  shl11 = 17,  shl24 = 30,
add    = 5,  shl12 = 18,  shl25 = 31,
neg    = 6,  shl13 = 19,  shl26 = 32,
shl1   = 7,  shl14 = 20,  shl27 = 33,
shl2   = 8,  shl15 = 21,  shl28 = 34,
shl3   = 9,  shl16 = 22,  shl29 = 35,
shl4   = 10, shl17 = 23,  shl3O = 36,
shl5   = 11, shl18 = 24,  shl31 = 37,
shl6   = 12, shl19 = 25.
【００２４】
次に、２つの入力および１つの出力を持つ３オペランド命令コードの範囲が記録される(ステップ２３０)。残りは、入力も出力オペランドもない監視文字命令コードを除いて、１つの入力および１つの出力を持つ２オペランド命令コードである。本発明のＰＡ‐ＲＩＳＣ実施形態においては、２入力および１出力を持つ３オペランド命令コードの範囲は、１(sh1add)から５(add)までの番号が与えられた命令コードである。
【００２５】
ある１つのＡＬＵ命令シーケンスに関して、本発明は、シーケンスの最初の命令は、レベル１命令と呼び、８番目の命令はレベル８命令と呼ぶ。同様に、１命令(からなる)シーケンスはレベル１シーケンス、８命令(からなる)シーケンスはレベル８シーケンスと呼ぶ。
【００２６】
レベル１命令に関して可能な入力はただ１つであり、それは乗算演算で使用される未知の変数値である。この未知の値をＵと呼ぶ。かくして、ＡＬＵ命令シーケンスへの６４ビット整数の展開が実行される際(ステップ２４０)、命令を形成するため単一の入力値Ｕを使用することができる。ＡＬＵ命令が展開されるにつれ、展開される各レベル毎に使用可能な１つの入力が追加される。レベル１命令の結果はＬ1と呼ぶ。同様に、レベル２命令の結果はＬ２と呼ぶ。
【００２７】
コンパクト符号化方式は、あらゆるレベルでそのレベルで可能なすべての命令を列挙することが可能であるという特性を持つ。レベル１のadd命令に関しては、次のような符号がただ１つ使用可能である。
add U,U,L1
ＰＡ−ＲＩＳＣ実施形態に関する限り、レベル１において、監視文字用に１つおよび各命令コード毎に１つ、計３８のユニークな符号が存在する。
【００２８】
次のレベルでは、入力としてオリジナルの未知の値Ｕかまたはレベル１命令によって新たに計算された結果のいずれかを使用することが可能である。従って、addのような２入力命令コードについては、２×２すなわち４つの可能な符号が存在する。各レベルで異なる符号を挙げる時add命令が交換的性質を持つという事実を利用することは必要でない。レベル２add命令に関して、次の４つの異なる符号が使用可能である。
add U,U,L2
add U,L1,L2
add L1,U,L2
add L1,L1,L2
本発明のＰＡ−ＲＩＳＣ実施形態に関する限り、レベル２において８５のユニークな符号が存在する。これらの符号は、レベルの二乗(22=4)をとり、この値を２入力を持つ命令コードの数に乗ずる(５×４＝２０)ことによって、計算することができる。すなわち、本発明のＰＡ−ＲＩＳＣ実施形態においては２０の可能な命令がある。１入力を持つ命令の数がこの値に加えられる。各々が２つの可能な入力を持つ命令は３７−５＝３２あり、従って、３２×２＝６４の１入力命令がある。シーケンス監視文字命令のため１が合計に加えられる。
【００２９】
次の表２は、各レベルについてのユニークな符号の数を示す。
【００３０】
【表２】
0003727039.tif 000002
【００３１】
一旦すべての可能な符号がわかれば(ステップ２６０)、整数をＡＬＵ命令シーケンスに展開することができる。
【００３２】
図４ないし図６は、本発明に従って整数をＡＬＵ命令シーケンスに変換するアルゴリズムを示す。６４ビットの整数を最高８つまでのＡＬＵ命令からなるシーケンスに変換するアルゴリズムは次の通りである。
Ｘによる整数乗算を実行するＡＬＵ命令シーケンスを表現するオリジナルの６４ビット整数をＳ0と呼ぶ（ステップ３００）。
図３を参照して上述されたようにレベル・テーブルを計算する(ステップ３１０)。上記のレベル・テーブルにおける各レベルでの符号化のための値は、E1=38, E2=85, E3 =142, E4=209....E8 =577のように表す。次の式に基づいて、８つの命令を記憶するために必要とされるビット数を計算することができる。
ceiling (log2(E1×E2....×E8))
次の表３の剰余と被除数を計算する(ステップ３２０)。以下の計算では、除算演算は整数の商を生成する、すなわち除算演算から生じる端数部分は破棄されると仮定する。
【００３３】
【表３】
0003727039.tif 000003
【００３４】
剰余Ｒ1ないしＲ8の各々は、該当するレベルでの命令を表す。Ｒ1はレベル１のために使用される命令番号を表し、Ｒ8はレベル８に使用される命令番号を表す。
剰余は命令に対応付けされる(ステップ３３０)。剰余Ｒ1からレベル１命令への対応付(ステップ３４０)はそれほど重要でない。レベル１については剰余Ｒ1の値は命令コード番号である。Ｕの値は、レベル１命令に対するすべての入力に関して使用される。
【００３５】
剰余Ｒ2からレベル２命令への対応付け(ステップ３５０)は次の通りである。剰余Ｒ2が０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けする。
ゼロでなければＱ2＝Ｒ2−１とする。
Ｑ2の値が２2×５未満であれば、２入力命令コードを使用することとして(ステップ３６０)、Ｑ2/２2＋１を対応するＡＬＵ命令コード番号とし、Ｑ2ｒｅｍ２の値を第１の入力値とし、(Ｑ2／２)ｒｅｍ２の値を第２の入力値とする(ステップ３７０)。但し、上記剰余の値が０であればＵを入力として使用し、上記剰余の値が１であればＬ１を入力として使用する。
Ｑ2の値が２2×５以上であれば、Ｐ2=Ｑ2−２2×５として、１入力命令コードを使用することとして(ステップ３６０)、Ｐ2／２＋６を対応する命令コード番号を表す整数とし、Ｐ2ｒｅｍ２をその入力の値とする(ステップ３８０)。
【００３６】
剰余Ｒ3からレベル３命令への対応付け(ステップ３９０)は次の通りである。剰余Ｒ3が０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けする。
ゼロでなければＱ3をＲ3−１に等しくする。
Ｑ3の値が３2×５未満であれば、２入力命令コードを使用することとして(ステップ４００)、Ｑ3/３2＋１を対応するＡＬＵ命令コード番号を表す整数とし(ステップ４２０)、Ｑ3ｒｅｍ３の値を第１の入力値とし、(Ｑ3／３)ｒｅｍ３の値を第２の入力値とし、上記剰余の値が０であればＵを入力として使用し、上記剰余の値が１であればＬ１を入力として使用し、上記剰余の値が２であればＬ２を入力として使用する(ステップ４２０)。
Ｑ3の値が３2×５以上であれば、Ｐ3=Ｑ3−３2×５として、１入力命令コードを使用することとして(ステップ４００)、Ｐ3／３＋６を対応する命令コードを表す整数とし、Ｐ3ｒｅｍ３をその入力の値とする(ステップ４１０)。
【００３７】
レベル４ないし８に関する対応付けは、本質的に上述のレベル２および３に関するものと同じである。どのレベルにおいても監視命令が命令として出現すれば(ステップ４３０)、それはＡＬＵ命令の終了の標示である(ステップ４４０)。それ以上の展開は必要でない。生成される乗算結果は、常に、シーケンスの最後の命令によって生成される結果である(ステップ４６０)。さもなければ、最後の命令に出会うまでプロセスは続行する(ステップ４５０)。本発明のこの実施形態において、仮に８つの命令に出会った後なお監視文字に出会わないとすれば、シーケンスは終了する。
【００３８】
上述の通り、既知の定数による整数乗算を実施する効率的なＡＬＵ命令シーケンを探索するために時間を費やすことがないので、本発明は一層迅速なコンパイル時間を提供する。本発明は、所与の定数に関して事前に計算された解をコンパイラが探し出すことを可能にする。本発明は、また、多数の定数に対して命令のより効率的なシーケンスが与えられるので、より速い実行時処理性能を提供する。本発明は、また、一層複雑な探索アルゴリズムを使用して、ＡＬＵ命令の短いシーケンスを見つけ出すことを可能にする。なぜならば、本発明は、探索アルゴリズムからの結果を記憶するルックアップ・テーブルを使用するからである。
【００３９】
以下に、本発明の好ましい実施形態であるＰＡ−ＲＩＳＣアーキテクチャに関する種々の乗算演算のサンプルを示す。
５を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
icost=1, dcost=1, count=1
６を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1=%src*3
SHL1%t1,%t2; %t2= %src*6
icost=2, dcost=1, count=1
７を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SH1ADD%src,%t1,%t2; %t2=%src*7
icost=2, dcost=2, count=5
８を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL3%src,%t1; %t1=%src*8
icost=1, dcost=O, count=1
９を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
icost=1, dcost=1, count=1
１０を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SHL1%t1,%t2; %t2=%src*10
icost=2, dcost=1, count=1
１１を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
SH1ADD%src,%t1,%t2; %t2=%src*11
icost=2, dcost=2, count=3
１２を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1=%src*3
SHL2%t1,%t2; %t2=%src*12
icost=2, dcost=1, count=1
【００４０】
１３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
SH2ADD%src,%t1,%t2; %t2=%src*13
icost=2, dcost=2, count=3
１４を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
SH2ADD%src,%t1,%t2; %t2=%src*5
ADD%t1,%t2%t3; %t3=%src*14
icost=3, dcost=2, count=15
１５を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SH1ADD%t1,%t1,%t2; %t2=%src*15
icost=2, dcost=2, count=3
１６を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL4%src,%t1; %t1=%src*16
icost=1, dcost=1, count=1
１７を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%src,%t1,%t2; %t2=%src*17
icost=2, dcost=2, count=7
１8を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SHL1%t1,%t2; %t2=%src*18
icost=2, dcost=1, count=1
１９を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%t1,%t1,%t2; %t2=%src*19
icost=2, dcost=2, count=1
【００４１】
２０を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SHL2%t1,%t2; %t2=%src*20
icost=2, dcost=1, count=1
２１を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SH2ADD%t1,%src,%t2; %t2=%src*21
icost=2, dcost=2, count=1
１２３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t2 ; %t2=%src*5
SUB%t2,%t1,%t3; %t3=%src*123
icost=3, dcost=2, count=1
１６７１を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL10%src,%t1; %t1=%src*1024
SH3ADD%src,%src,%t2; %t2=%src*9
SUB%src,%t1,%t3; %t3=%src*1023
SH3ADD%t2,%t2,%t4; %t4=%src*81
SH3ADD%t4,%t3,%t5; %t5=%src*1671
icost=5, dcost=2, count=1
２３５１７を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%t1,%t1,%t2; %t2=%src*81
SH3ADD%src,%t1,%t3; %t3=%src*17
SH3ADD%t2,%src,%t4; %t4=%src*649
SH2ADD%t4,%t3,%t5; %t5=%src*2613
SH3ADD%t5,%t5,%t6; %t6=%src*23517
icost=6, dcost=4, count=115
【００４２】
２を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL1%src,%t1 ; %t1=%src*2
icost=1, dcost=O, count=1
３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1= %src*3
icost=1, dcost=1, count=1
６を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1= %src*3
SHL1%t1,%t2 ; %t2=%src*6
icost=2, dcost=1, count=1
１１を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%src,%t1,%t2 ; %t2= %src*11
icost=2, dcost=2, count=3
２２を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%src,%t1,%t2 ; %t2= %src*11
SHL1%t2,%t3 ; %t3=%src*22
icost=3, dcost=2, count=8
４３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SH1ADD%src,%src,%t2; %t2=%src*3
SH3ADD%t1,%t2,%t3; %t3=%src*43
icost=3, dcost=2, count=2
８６を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH2ADD%src,%src,%t2; %t2=%src*5
SH3ADD%t1,%t1,%t3; %t3=%src*81
ADD%t2,%t3,%t4; %t4=%src*86
icost=4, dcost=2, count=8
【００４３】
１７１を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%t1,%t1,%t2; %t2=%src*81
SH1ADD%t2,%t1,%t3; %t3=%src*171
icost=3, dcost=3. count=2
１７３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SH2ADD%t1,%src,%t2; %t2=%src*21
SH3ADD%t2,%t1,%t3; %t3=%src*173
icost=3, dcost=3, count=1
３４２を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%t1,%t1,%t2; %t2=%src*81
SH1ADD%t2,%t1,%t3; %t3=%src*171
SHL1%t3,%t4; %t4=src*342
icost=4, dcost=3, count=11
３４６を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SHL8%src,%t2; %t2=src*256
SH2ADD%t1,%t1,%t3; %t3=src*45
SH1ADD%t3,%t2,%t4; %t4=%src*346
icost=4, dcost=3, count=8
６８３を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%src,%t1,%t2; %t2=%src*17
SH3ADD%t1,%t1,%t3; %t3=%src*81
SH1ADD%t1,%t2,%t4; %t4=%src*35
SH3ADD%t3,%t4,%t5; %t5=%src*683
icost=5, dcost=3, count=158
【００４４】
１８６７を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL6%src,%t1; %t1=%src*64
SUB%t1,%src,%t2; %t2=%src*-63
SH1ADD%t2,%t2,%t4; %t4=%src*-189
SH3ADD%t3,%t4,%t5; %t5=%src*1867
icost=5, dcost=3, count=1
１３６６を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SHL10%src,%t2; %t2=%src*1024
H3ADD%t1,%t1,%t3; %t3=%src*81
SH1ADD%t1,%t2,%t4; %t4=%src*1024
SH2ADD%t3,%t4,%t5; %t5=%src*1366
icost=5, dcost=3, count=17
３７３４を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%src,%t1,%t2; %t2=%src*11
SH1ADD%t1,%t2,%t3; %t3=%src*29
SHL7%t3,%t4; %t4=%src*3712
SH1ADD%t2,%t4,%t5; %t5=%src*3734
icost=5, dcost=5, count=5
２７３１を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SHL5%t1,%t2; %t2=%src*320
SH1ADD%t1,%src,%t3; %t3=%src*11
SH2ADD%t1,%t2,%t4; %t4=%src*340
SH3ADD%t4,%t3,%t5; %t5=%src*2731
icost=5, dcost=3, count=2
【００４５】
１０４５２を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL6%src,%t1; %t1=%src*64
SH3ADD%t1,%src,%t2; %t2=%src*513
SH1ADD%t1,%t1,%t3; %t3=%src*192
SH2ADD%t2,%t2,%t4; %t4=%src*2565
SH2ADD%t4,%t3,%t5; %t5=%src*10452
icost=5, dcost=3, count=1
５４６２を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SH2ADD%t1,%src,%t2; %t2=%src*21
SHL8%t2,%t3; %t3=%src*5376
SH1ADD%t2,%src,%t4; %t4=%src*43
SH1ADD%t4,%t3,%t5; %t5=%src*5462
icost=5, dcost=4, count=12
５９を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL6%src,%t1; %t1=%src*64
SH2ADD%src,%src,%t2; %t2=%src*5
SUB%t2,%t1,%t3; %t3=%src*59
【００４６】
以上、本発明を好ましい実施形態を参照して記述したが、本発明の理念および有効範囲を逸脱することなく種々の修正または変更を行うことが可能である点は容易に認められることであろう。
【００４７】
本発明には、例として次のような実施様態が含まれる。
（１）コンパイラにおける乗算演算を実施する方法であって、上記コンパイラにおける上記乗算演算を実行する命令シーケンスを含むルックアップ・テーブルを作成するステップと、上記コンパイラへの入力値を提供するステップと、上記入力値を上記ルックアップ・テーブルへのインデックスとして使用するステップと、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップと、上記取り出した整数を上記命令シーケンスに変換するステップと、上記コンパイラを用いて上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップと、上記乗算演算の結果を出力値として提供するステップと、を含むコンパイラにおける乗算実施方法。
（２）上記命令シーケンスの終了を示す監視命令を上記命令シーケンスに含めるステップを更に含む、上記（１）に記載のコンパイラにおける乗算実施方法。
（３）上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として提供するステップを更に含む、上記（２）に記載のコンパイラにおける乗算実施方法。
【００４８】
（４）コンパイラにおける乗算演算を実施する装置であって、上記コンパイラにおける上記乗算演算を実行する命令シーケンスを含み、上記コンパイラによって使用されるルックアップ・テーブルと、上記コンパイラへの入力値を使用して上記ルックアップ・テーブルへインデックス付けする手段と、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出す手段と、上記取り出した整数を上記命令シーケンスに変換する手段と、を備え、上記コンパイラが上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行し乗算演算の結果の出力値を提供する、コンパイラにおける乗算実施装置。
（５）上記命令シーケンスの終了を示す監視命令を更に備える、上記（４）に記載のコンパイラにおける乗算実施装置。
（６）上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として上記コンパイラが提供する、上記（５）に記載のコンパイラにおける乗算実施装置。
【００４９】
（７）コンパイラにおける乗算演算を実施する方法であって、所与のアーキテクチャ上で乗算結果を計算するために使用可能な各ＡＬＵ命令コードを列挙するステップと、上記命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、Ｎ個の命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベル毎に上記ＡＬＵ命令コードを符号化してルックアップ・テーブルに書き込むステップと、を含むコンパイラにおける乗算演算実施方法。
（８）上記命令コードを、２つの入力を受け取り１つの出力を生成する命令コード、および１つの入力を受け取り１つの出力を生成する命令コードに分類するステップと、ＡＬＵ命令シーケンスの終了にマークをつける監視文字として上記命令コードの１つを予約するステップと、２入力および１出力を持つ命令コードの範囲を数え上げて記録するステップと、を含む上記（７）に記載のコンパイラにおける乗算演算実施方法。
（９）上記コンパイラを使用して、入力値によって上記ルックアップ・テーブルにインデックス付けするステップと、インデックス付けされたルックアップ・テーブル位置にある上記符号化されたＡＬＵ命令を、対応するＡＬＵ命令シーケンスに展開するステップと、を含む上記（７）に記載のコンパイラにおける乗算演算実施方法。
（１０）符号化する上記ステップが、上記レベルに対応する数を二乗した値に、２入力を持つ命令コードの数を乗算し、その結果の積に１入力を持つ命令コードの数を加算し、その合計に監視文字を定義するための１を加えることを含む、上記（７）に記載のコンパイラにおける乗算演算実施方法。
（１１）すべての可能な符号化を確定した後ＡＬＵ命令シーケンスの各々を表す整数を生成するステップを更に含む上記（７）に記載のコンパイラにおける乗算演算実施方法。
【００５０】
（１２）コンパイラにおける乗算演算を実施する装置であって、所与のアーキテクチャ上で乗算結果を計算するため使用可能な各ＡＬＵ命令コードを列挙する手段と、上記命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、Ｎ個の命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベル毎に符号化された上記ＡＬＵ命令コードを記憶するルックアップ・テーブルと、を備えるコンパイラにおける乗算演算実施装置。
（１３）上記命令コードが、２つの入力を受け取り１つの出力を生成する命令コード、および１つの入力を受け取り１つの出力を生成する命令コードに分類され、ＡＬＵ命令シーケンスの終了にマークをつける監視文字として上記命令コードの１つが予約され、２入力および１出力を持つ命令コードの範囲が数え上げられ記録される、上記（１２）に記載のコンパイラにおける乗算演算実施装置。
（１４）上記ルックアップ・テーブルにインデックス付けするため上記コンパイラによって使用される入力値と、インデックス付けされたルックアップ・テーブル位置にある上記符号化されたＡＬＵ命令を、対応するＡＬＵ命令シーケンスに展開する手段と、を更に備える上記（１２）に記載のコンパイラにおける乗算演算実施装置。
（１５）上記レベルに対応する数を二乗した値に、２入力を持つ命令コードの数を乗算し、その結果の積に１入力を持つ命令コードの数を加算し、その合計に監視文字用の１を加えることによって上記ＡＬＵ命令コードが符号化される、上記（１３）に記載のコンパイラにおける乗算演算実施装置。
（１６）すべての可能な符号化を確定した後ＡＬＵ命令シーケンスの各々を表す整数を生成する手段を更に備える上記（１２）に記載のコンパイラにおける乗算演算実施装置。
【００５１】
（１７）１つの整数をＡＬＵ命令シーケンスに展開する方法であって、入力値Ｕを使用して、該入力値に定数値Ｘを乗ずる乗算演算を実行するＡＬＵ命令シーケンスを表す整数をＳ0と名付けるステップと、上記命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、Ｎ個の命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベルにおけるＡＬＵ命令符号化値を含むレベル・テーブルを計算するステップと、剰余の各々がＡＬＵ命令を表す剰余および被除数を計算するステップと、上記剰余を上記ＡＬＵ命令に対応づけるステップと、上記ＡＬＵ命令シーケンスを実行して乗算結果を生成するステップと、を含む乗算命令シーケンス展開方法。
（１８）上記第１の剰余Ｒ1の値が命令コード番号であり、Ｕの値がすべてのレベル１命令に対する入力であるように上記第１の剰余Ｒ1からレベル１命令への対応付けを行うステップを更に含む、上記（１７）に記載の乗算命令シーケンス展開方法。
（１９）第２の剰余Ｒ2が０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱ2＝Ｒ2−１とし、Ｑ2の値が22×5未満であれば、２入力命令コードを使用することとして、Ｑ2／２2＋１が対応するＡＬＵ命令コード番号であり、Ｑ2ｒｅｍ２の値が第１の入力値であり、(Ｑ2／２)ｒｅｍ２の値が第２の入力値であり、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、第２の剰余Ｒ2が０に等しくない場合、Ｐ2=Ｑ2−２2×５として、１入力命令コードを使用することとして、Ｐ2／２＋６を対応する命令コード番号とし、Ｐ2ｒｅｍ２をその入力の値とするように、第２の剰余Ｒ2からレベル２命令への対応付けを行うステップを含む、上記（１７）に記載の乗算命令シーケンス展開方法。
（２０）第Ｎ番目のの剰余ＲNが０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱN＝ＲN−１とし、ＱNの値が２N×５未満であれば、２入力命令コードを使用することとして、ＱN／Ｎ2＋１が対応するＡＬＵ命令コード番号であり、ＱNｒｅｍＮの値が第１の入力値であり、(ＱN／Ｎ)ｒｅｍＮの値が第２の入力値であり、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、第Ｎ番目の剰余ＲNが０に等しくない場合、ＰN=ＱN-1−Ｎ2×５として、１入力命令コードを使用することとして、ＰN／Ｎ＋６を対応する命令コード番号とし、ＰNｒｅｍＮをその入力の値とするように、第Ｎ番目の剰余ＲNからレベルＮ命令への対応付けを行うステップを含む、
上記（１７）に記載の乗算命令シーケンス展開方法。
【００５２】
（２１）１つの整数をＡＬＵ命令シーケンスに展開する装置であって、上記命令シーケンスの第Ｎ番目の命令がレベルＮ命令であり、Ｎ個の命令からなるシーケンスをレベルＮ命令シーケンスとして、各レベルにおけるＡＬＵ命令符号化値を含むレベル・テーブルと、入力値Ｕを使用して、該入力値に定数値Ｘを乗ずる乗算演算を実行するＡＬＵ命令シーケンスを表す整数をＳ0と名付ける手段と、剰余の各々がＡＬＵ命令を表す剰余および被除数を計算する手段と、上記剰余を上記ＡＬＵ命令に対応づける手段と、上記ＡＬＵ命令シーケンスを実行して乗算結果を生成する手段と、を備える乗算命令シーケンス展開装置。
（２２）上記第１の剰余Ｒ1の値が命令コード番号であり、Ｕの値がすべてのレベル１命令に対する入力であるように、上記第１の剰余Ｒ1からレベル１命令への対応付けを行う手段を更に備える、上記（２１）に記載の乗算命令シーケンス展開装置。
（２３）第２の剰余Ｒ2が０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱ2＝Ｒ2−１とし、Ｑ2の値が22×5未満であれば、２入力命令コードを使用することとして、Ｑ2／２2＋１が対応するＡＬＵ命令コード番号であり、Ｑ2ｒｅｍ２の値が第１の入力値であり、(Ｑ2／２)ｒｅｍ２の値が第２の入力値とし、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、第２の剰余Ｒ2が０に等しくない場合、Ｐ2=Ｑ2−２2×５として、１入力命令コードを使用することとして、Ｐ2／２＋６が対応する命令コード番号であり、Ｐ2ｒｅｍ２がその入力の値であるように、第２の剰余Ｒ2からレベル２命令への対応付けを行う手段を更に備える、上記（２１）に記載の乗算命令シーケンス展開装置。
（２４）第Ｎ番目のの剰余ＲNが０に等しい場合、ＡＬＵ命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければＱN＝ＲN−１とし、ＱNの値が２N×５未満であれば、２入力命令コードを使用することとして、ＱN／Ｎ2＋１が対応するＡＬＵ命令コード番号であり、ＱNｒｅｍＮの値が第１の入力値であり、(ＱN／Ｎ)ｒｅｍＮの値が第２の入力値であり、上記剰余の値が第１の値であればＵを入力として使用し、上記剰余の値が第２の値であればレベル１演算結果Ｌ１を入力として使用し、第Ｎ番目の剰余ＲNが０に等しくない場合、ＰN=ＱN-1−Ｎ2×５として、１入力命令コードを使用することとして、ＰN／Ｎ＋６が対応する命令コード番号であり、ＰNｒｅｍＮがその入力の値であるように、第Ｎ番目の剰余ＲNからレベルＮ命令への対応付けを行う手段を更に備える上記（２１）に記載の乗算命令シーケンス展開装置。
【００５３】
【発明の効果】
既知の定数による整数乗算を実施する効率的なＡＬＵ命令シーケンを探索するために時間を費やす必要がないので、本発明は迅速なコンパイル時間を実現する。本発明は、また、多数の定数に対して効率的な命令シーケンスを与えられるので、迅速な実行時処理性能を提供する。
【図面の簡単な説明】
【図１】単一プロセッサのコンピュータ・アーキテクチャを示すブロック図である。
【図２】図１で示されたコンピュータ・アーキテクチャと関連して使用される場合があるソフトウェア・コンパイラのブロック図である。
【図３】本発明に従って整数乗算または除算シーケンスを記憶するコンパクトな符号化方式を実施するコンパイル・システムの動作の流れ図である。
【図４】図５および図６とともに、本発明に従って整数をＡＬＵ命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【図５】図４および図６とともに、本発明に従って整数をＡＬＵ命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【図６】図４および図５とともに、本発明に従って整数をＡＬＵ命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【符号の説明】
１０      コンピュータ・アーキテクチャ
１１      プロセッサ
１２      キャッシュ
１３      メモリ
１４      入出力
１５      システム・バス
２１      コンパイラ・フロントエンド・コンポーネント
２２      高水準オブジェクト(ＨＬＯ)
２３      コード生成ルーチン
２４      低水準最適化ルーチン(ＬＬＯ)
２５      オブジェクト・ファイル生成ルーチン
２６      リンカ
１００    ソース・コード
１１０    高水準中間表示形式(ＨＬＩＲ)
１２０    低水準中間表示形式(ＬＬIＲ)
１４０、１４１    オブジェクト・ファイル
１５０    実行可能ファイル
【図１】
0003727039.tif 000004
【図２】
0003727039.tif 000005
【図３】
0003727039.tif 000006
【図４】
0003727039.tif 000007
【図５】
0003727039.tif 000008
【図６】
0003727039.tif 000009