JP3727039B2 - コンパイラにおける乗算実施方法 - Google Patents
コンパイラにおける乗算実施方法 Download PDFInfo
- Publication number
- JP3727039B2 JP3727039B2 JP04768397A JP4768397A JP3727039B2 JP 3727039 B2 JP3727039 B2 JP 3727039B2 JP 04768397 A JP04768397 A JP 04768397A JP 4768397 A JP4768397 A JP 4768397A JP 3727039 B2 JP3727039 B2 JP 3727039B2
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- value
- sequence
- compiler
- input
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/52—Multiplying; Dividing
- G06F7/523—Multiplying only
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Computing Systems (AREA)
- Devices For Executing Special Programs (AREA)
Description
【発明の属する技術分野】
本発明は、コンピュータに関するもので、特に、ソース・コード・コンパイルの際にコンピュータによって実行される乗算演算に関するものである。
【0002】
【従来の技術】
既知の定数Xによる整数乗算が、整数乗算に関するハードウェア命令を持たないプロセッサ上で短いシーケンスの命令を使用して実行されることが多い。(以下、演算論理機構をArithmetic and Logical Unitの頭文字をとって「ALU」と呼称する)。従来技術のアプローチは、コンパイル段階でこれらのシーケンスを探索する探索アルゴリズムの使用を伴う。探索アルゴリズムが非常に複雑であるので、コンパイラの探索の範囲を狭くするのに役立つように種々の発見的手法(Heurisitics)が使用される。あいにく、これらの発見的手法は、コンパイラが乗算を実施するため効率の悪いALU命令シーケンスを使用する原因となることが多い。そのような場合、コンパイラによって作成される実行可能プログラムは、最適でない形態で動作する。
【0003】
更に、特定の整数定数に関して、コンパイル時探索アルゴリズムは、乗算を実施する合理的ALU命令シーケンスを見出すことができない。そのような場合には、乗算シーケンスは実行時サブルーチンを使用して実行されなければならない。実行時のサブルーチンの使用は、アプリケーションの処理性能を極めて悪化させる。
【0004】
整数乗算および除算演算を実行する種々の技術が提案されてきた。例えば、T.Granlund, P. Montgomery両氏は、その著"Division By Invariant Integers using Multiplication, Association of Computing Machinery, 0-89791-662x/94/0006(1994)"で、整数乗算を使用する任意の非ゼロ整数定数および実行時不変式として除算用コード・シーケンスを提示する整数除算を達成するアルゴリズムを開示している。このアルゴリズムは、整数積の上方半分が迅速にアクセスできることを必要とする2の補数アーキテクチャを仮定する。
【0005】
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氏によって提案された方法が命令セットのタイミングに敏感であり、そのような方法を使用して構築されるテーブルは目標コンピュータの命令セットに依存するものとなると結論づけている。このように、既存の技術は整数乗算演算のためテーブルを使用することを奨励していない。
【0006】
【発明が解決しようとする課題】
かくして、整数乗算演算を実行するためALU命令の効率的なシーケンスを生成する問題を解決する技術の提供が求められている。
【0007】
【課題を解決するための手段】
本発明は、定数による乗算のような整数乗算演算を実行するALU命令の効率的シーケンスを生成する問題を解決する。本発明は、目標アーキテクチャに関して最も効率的な命令シーケンスを保有するルックアップ・テーブルを使用して、既知の定数Xによる整数乗算を実現する。本発明は、短いシーケンスのALU命令を記憶するために使用することができるコンパクトな符号化手段を提供する。ヒューレット・パッカード社のPA−RISCアーキテクチャに関しては、そのようなコンパクトな符号化手段は、最高8個までの(64ビット未満の)ALU命令からなるシーケンスを記憶することができる。
【0008】
本発明が構築するルックアップ・テーブルを使用することによって、既知の定数による整数乗算を実行するために必要なALU命令の最も効率的なシーケンスをコンパイラは常に生成することができる。本発明の好ましい実施形態において、既知の定数オペランドはルックアップ・テーブルへのインデックスとして使用され、そこから1つの64ビット整数が取り出される。次に、この64ビット整数が、Xによる整数乗算を実行する短いALU命令シーケンスに展開される。特定の整数Xについて最も効率的なシーケンスのALU命令を計算することは計算量の観点から非常に高価であるけれども、ルックアップ・テーブルの値は特定のアーキテクチャについてただ一度だけ決定すればよい。
【0009】
発明の課題を解決する手段として、本発明は、コンパイラにおいて乗算演算を実行する命令シーケンスを含むルックアップ・テーブルを作成するステップ、上記コンパイラへの入力値を提供するステップ、上記入力値を上記ルックアップ・テーブルへのインデックスとして使用するステップ、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップ、上記取り出した整数を上記命令シーケンスに変換するステップ、上記コンパイラを用いて上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップ、および上記乗算演算の結果を出力値として提供するステップからなるコンパイラにおける乗算実施方法を含む。
【0010】
【発明の実施の形態】
本発明は、定数の乗算のような整数乗算演算を実行するためALU命令の効率的なシーケンスを生成する問題を解決する。所与の整数Xに関してALU命令の最も効率的なシーケンスを決定するために使用されるコンパイル時の簡単なルックアップ・テーブルを提供する。
【0011】
図1は、単一プロセッサ・コンピュータのアーキテクチャ10を示す。プロセッサ11は、システム・バス15と通信するキャッシュ12を含む。システム・メモリ13および1つまたは複数のI/O装置14もまたシステム・バスと通信する。コンパイル操作において、ユーザは、コンピュータ上で動くプログラムであるコンパイラにソース・コード・プログラムを入力する。コンパイラは、ソース・コードを受け取り、コードを処理して、(図のコンピュータ・アーキテクチャ10のような)目標コンピュータのアーキテクチャに対して最適化された実行可能ファイルを生成する。
【0012】
図2は、例えば図1で示されたコンピュータ・アーキテクチャ10と関連して使用される場合があるソフトウェア・コンパイラ20を示す。コンパイラ・フロントエンド・コンポーネント21が、ソース・コード・ファイル100を読み取り、それを高水準中間表示形式(HLIR)110に翻訳する。高水準最適化プログラム(HLO)22が、高水準中間表示形式110を一層効率的な形式に最適化する。コード生成ルーチン23が、最適化された高水準中間表示形式を低水準中間表示形式(LLIR)120に変換する。低水準最適化ルーチン(LLO)24が、低水準中間表示形式120を一層効率的な(機械による実行可能な)形式に変換する。最後に、オブジェクト・ファイル生成ルーチン25が、最適化された低水準中間表示形式をオブジェクト・ファイル141に書き出す。オブジェクト・ファイル141は、他のオブジェクト・ファイル140とともにリンカ26によって処理され、コンピュータ10上で実行させることができる実行可能ファイル150が生成される。現代のコンピュータ・アーキテクチャにおいては、コンパイラは多くのタスクを実行する。例えば、コンパイラは、Cのような高水準言語を一連の機械命令に翻訳する。コンパイラによって実行される諸タスクの中の1つは、乗算のような整数演算を伴う高水準式の処理を行うことである。
【0013】
乗算演算は非常に一般的である。例えば、Vが変数であるとして59×Vのような乗算演算を含む式がプログラムの中にあるかもしれない。そのような場合、コンパイラはそのような乗算演算を実行する方法を決定しなければならない。既存のコンパイラは、上記の例のような乗算の場合、59が出力であるようにシフト加算(shift and add)命令を合成する方法を決定するために発見的手法を使用する。その後、1つの入力Vが命令の1つのシーケンスに対して提示され、最終的な命令の出力がV×59となる。
【0014】
上で示したように、コンパイラによって使用される実行時アルゴリズムの1つは、発見的手法を使用して探索する探索アルゴリズムである。本発明は、探索を実行する代わりに、入力値をテーブルへのインデックスとして使用し(すなわち、例えば59という入力値を例えばテーブルの中の59番目のエレメントへのインデックスとして使用し)、そこから整数を取り出し、その整数に対してあらかじめ定められた演算シーケンスを実行することによって整数をいくつかのより小さい整数に展開する。これらのより小さい整数の各々は、例えば加算(add)、シフト(shift)、減算(subtract)のような1つの命令に対応付けされる。更に、監視文字を使用して、プロセスが停止しなければならない位置が標示される。コンパイラが監視文字に出会う前に生成する最後の命令の結果が、所望の結果(すなわちV×59)である。しかし、本発明の代替的実施形態においては、あらかじめ決められた最大実行命令数を受けとることがプロセスの終了を示すようにすることもできる。そのようなケースでは、監視文字は必要とされない。
【0015】
整数演算シーケンスを見出すための探索に要する1回のコストが計算上高価な指数アルゴリズムであるため、各整数毎にすべての解を事前計算するオフライン処理を使用して、本発明のテーブルは構築される。テーブルは、目標アーキテクチャに関して最も短く最も最適な命令シーケンスを単一の整数として記憶する。次に、この単一整数がコンパイラによって展開され、特定の定数に関する最適な命令シーケンスが取り出される。
【0016】
各シーケンスは基本的には1つの整数に圧縮することができるので、テーブルに必要な記憶容量は最小限のものである。-216(すなわち-65,536)から+216(すなわち+65,536)までのすべての整数に関して解が与えられる本発明の好ましい実施形態において、必要とされることは、テーブルにインデックスを付け、記憶された整数を取り出し、整数を最高8個の命令シーケンスに分解し、1つの変数値を入力してそれに特定の既知の定数を乗ずる整数乗算演算を実行することだけである。テーブルをより大きくまたはより小さくすることは可能である。PA−RISCアーキテクチャにとって64ビット整数が自然なサイズであるので、64ビットの整数が有用である。しかし、そのように制限しなければならないわけではなく、例えば120ビットまたはそれ以上のサイズを使用することは可能である。
【0017】
本発明は、ある特定の所与の定数整数に関して1つのシーケンスを事前計算する。例えば、5を乗算することが必要であれば、"SHIFT 2 and ADD"(2回シフトして加算の意味であり本明細書において以下同様の表記法を用いる)を使用して、オリジナルのソース・オペランドを2回シフトすなわち4倍し、その結果にオリジナルのソース・オペランドが加算され、4プラス1倍すなわち5倍される。同様に、"SHIFT 3 and ADD"によって9が、"SHIFT 1 and ADD"によって3が生成される。
【0018】
前述の整数演算を実行するために必要な命令のすべては、典型的には、実行時コードを用いてルックアップ・テーブルとして記憶するには大き過ぎる。各命令が、オリジナルのソース・オペランドであろうと実行に従って生成される一時的オペランデあろうと種々のオペランドを使用することができるような8個の命令があるとすれば、そのためのルックアップ・テーブルを提供することは難しい。数と8個の命令の間の対応付は通常難しく、膨大な量の記憶空間が必要となる。本発明の1つの利点は、テーブルがコンパイラと関連づけられるということである。従って、コンパイル時に、特定の乗算演算を実行する最適な方法を決定するために費やす時間は少ない。これは、コンパイラのコンパイル速度の向上に貢献する。
【0019】
更に、単一整数毎に完全に最適なシーケンスを生成することが必要であるので、本発明のルックアップ・テーブルを生成するプロセスはオフラインで実施することができる。対照的に、既知のコンパイラは、発見的手法を使用して特定の整数による乗算の方法を決定することを試み、結果として1つのシーケンスにたどり着くことができるかもしれない。しかし、1つの乗算演算を実行することができる何百ものシーケンスが存在するので、そのようなシーケンスが最善のシーケンスでない可能性がある。ルックアップ・テーブルを提供することによって、本発明は、生成される命令のツリーの高さを最小にし、それによって、特定のアーキテクチャに関するいくつかの命令を並列して発することができる。従って、2つまたはそれ以上のALUが存在すれば、その複数のALUが並列して動作し後刻最終結果を組み合わせるように、特定のアーキテクチャにとって理想的なテーブル、少なくとも2つの命令を同時に発することができるシーケンスを生成することが可能である。
【0020】
乗算はコンパイラが実行すべき基本動作であるので、本発明はコンパイラの低水準最適化ルーチンと関連する。特定の整数による乗算の方法に関するサブルーチンを提供することが必要とされる場合、本発明のテーブルはコンパイラがハードディスクから読むことができる補助ファイルであるようにすることもできる。また、頻繁にアクセスされるならば、テーブルはキャッシュに記憶してもよい。
【0021】
図3は、本発明に従って整数乗算または除算シーケンスを記憶するためのコンパクトな符号化を実施するコンパイル・システムのブロック図である。このコンパクトな符号化は以下のように行われる。
先ず、整数乗算結果を計算するため所与のアーキテクチャ上で使用可能なすべてのALU命令コード(opcode)が列挙される(ステップ200)。ヒューレット・パッカード社のPA−RISCアーキテクチャに関する限り、これらの命令コードは、add、sub、sh1add、 sh2add、 sh3add、 negおよびshlである。
但し、命令コードnegは、PA−RISCアーキテクチャではゼロにハード的に設定されているr0からの減算を使用して実施され、shlについては特別の形式の命令コードか実際には使用される。
【0022】
上記の命令コードは、3つのオペランドを持つ命令コードと2つのオペランドを持つ命令コードに分類される(ステップ210)。3オペランド命令コードは、2つの入力を受け取り、1つの出力を生成する命令コードであり、add、sub、sh1add、sh2add、sh3addを含む。2オペランド命令コードは、1つの入力を受け取り、1つの出力を生成する命令コードであり、negを含む。左シフト命令コードshlは、汎用レジスタ入力、定数整数入力および出力を持つ3オペランド命令コードである。しかし、shlは、本発明の目的のため、命令コードshl1、shl2、shl3、shl4,...shl30、shl31というように1から31までの定数整数入力を持つ31種の2オペランド命令コードとして取り扱われる。
更に、最初の命令コードnopは、ALU命令のシーケンスの終了にマークをつける監視文字として予約される(220)。
本発明の好ましい実施形態であるPA−RISC上での実施のため、次の表1のようにALU命令コードおよびそれらに特定の命令コード番号が与えられる。
【0023】
【表1】
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.
【0024】
次に、2つの入力および1つの出力を持つ3オペランド命令コードの範囲が記録される(ステップ230)。残りは、入力も出力オペランドもない監視文字命令コードを除いて、1つの入力および1つの出力を持つ2オペランド命令コードである。本発明のPA‐RISC実施形態においては、2入力および1出力を持つ3オペランド命令コードの範囲は、1(sh1add)から5(add)までの番号が与えられた命令コードである。
【0025】
ある1つのALU命令シーケンスに関して、本発明は、シーケンスの最初の命令は、レベル1命令と呼び、8番目の命令はレベル8命令と呼ぶ。同様に、1命令(からなる)シーケンスはレベル1シーケンス、8命令(からなる)シーケンスはレベル8シーケンスと呼ぶ。
【0026】
レベル1命令に関して可能な入力はただ1つであり、それは乗算演算で使用される未知の変数値である。この未知の値をUと呼ぶ。かくして、ALU命令シーケンスへの64ビット整数の展開が実行される際(ステップ240)、命令を形成するため単一の入力値Uを使用することができる。ALU命令が展開されるにつれ、展開される各レベル毎に使用可能な1つの入力が追加される。レベル1命令の結果はL1と呼ぶ。同様に、レベル2命令の結果はL2と呼ぶ。
【0027】
コンパクト符号化方式は、あらゆるレベルでそのレベルで可能なすべての命令を列挙することが可能であるという特性を持つ。レベル1のadd命令に関しては、次のような符号がただ1つ使用可能である。
add U,U,L1
PA−RISC実施形態に関する限り、レベル1において、監視文字用に1つおよび各命令コード毎に1つ、計38のユニークな符号が存在する。
【0028】
次のレベルでは、入力としてオリジナルの未知の値Uかまたはレベル1命令によって新たに計算された結果のいずれかを使用することが可能である。従って、addのような2入力命令コードについては、2×2すなわち4つの可能な符号が存在する。各レベルで異なる符号を挙げる時add命令が交換的性質を持つという事実を利用することは必要でない。レベル2add命令に関して、次の4つの異なる符号が使用可能である。
add U,U,L2
add U,L1,L2
add L1,U,L2
add L1,L1,L2
本発明のPA−RISC実施形態に関する限り、レベル2において85のユニークな符号が存在する。これらの符号は、レベルの二乗(22=4)をとり、この値を2入力を持つ命令コードの数に乗ずる(5×4=20)ことによって、計算することができる。すなわち、本発明のPA−RISC実施形態においては20の可能な命令がある。1入力を持つ命令の数がこの値に加えられる。各々が2つの可能な入力を持つ命令は37−5=32あり、従って、32×2=64の1入力命令がある。シーケンス監視文字命令のため1が合計に加えられる。
【0029】
次の表2は、各レベルについてのユニークな符号の数を示す。
【0030】
【表2】
【0031】
一旦すべての可能な符号がわかれば(ステップ260)、整数をALU命令シーケンスに展開することができる。
【0032】
図4ないし図6は、本発明に従って整数をALU命令シーケンスに変換するアルゴリズムを示す。64ビットの整数を最高8つまでのALU命令からなるシーケンスに変換するアルゴリズムは次の通りである。
Xによる整数乗算を実行するALU命令シーケンスを表現するオリジナルの64ビット整数をS0と呼ぶ(ステップ300)。
図3を参照して上述されたようにレベル・テーブルを計算する(ステップ310)。上記のレベル・テーブルにおける各レベルでの符号化のための値は、E1=38, E2=85, E3 =142, E4=209....E8 =577のように表す。次の式に基づいて、8つの命令を記憶するために必要とされるビット数を計算することができる。
ceiling (log2(E1×E2....×E8))
次の表3の剰余と被除数を計算する(ステップ320)。以下の計算では、除算演算は整数の商を生成する、すなわち除算演算から生じる端数部分は破棄されると仮定する。
【0033】
【表3】
【0034】
剰余R1ないしR8の各々は、該当するレベルでの命令を表す。R1はレベル1のために使用される命令番号を表し、R8はレベル8に使用される命令番号を表す。
剰余は命令に対応付けされる(ステップ330)。剰余R1からレベル1命令への対応付(ステップ340)はそれほど重要でない。レベル1については剰余R1の値は命令コード番号である。Uの値は、レベル1命令に対するすべての入力に関して使用される。
【0035】
剰余R2からレベル2命令への対応付け(ステップ350)は次の通りである。剰余R2が0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けする。
ゼロでなければQ2=R2−1とする。
Q2の値が22×5未満であれば、2入力命令コードを使用することとして(ステップ360)、Q2/22+1を対応するALU命令コード番号とし、Q2rem2の値を第1の入力値とし、(Q2/2)rem2の値を第2の入力値とする(ステップ370)。但し、上記剰余の値が0であればUを入力として使用し、上記剰余の値が1であればL1を入力として使用する。
Q2の値が22×5以上であれば、P2=Q2−22×5として、1入力命令コードを使用することとして(ステップ360)、P2/2+6を対応する命令コード番号を表す整数とし、P2rem2をその入力の値とする(ステップ380)。
【0036】
剰余R3からレベル3命令への対応付け(ステップ390)は次の通りである。剰余R3が0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けする。
ゼロでなければQ3をR3−1に等しくする。
Q3の値が32×5未満であれば、2入力命令コードを使用することとして(ステップ400)、Q3/32+1を対応するALU命令コード番号を表す整数とし(ステップ420)、Q3rem3の値を第1の入力値とし、(Q3/3)rem3の値を第2の入力値とし、上記剰余の値が0であればUを入力として使用し、上記剰余の値が1であればL1を入力として使用し、上記剰余の値が2であればL2を入力として使用する(ステップ420)。
Q3の値が32×5以上であれば、P3=Q3−32×5として、1入力命令コードを使用することとして(ステップ400)、P3/3+6を対応する命令コードを表す整数とし、P3rem3をその入力の値とする(ステップ410)。
【0037】
レベル4ないし8に関する対応付けは、本質的に上述のレベル2および3に関するものと同じである。どのレベルにおいても監視命令が命令として出現すれば(ステップ430)、それはALU命令の終了の標示である(ステップ440)。それ以上の展開は必要でない。生成される乗算結果は、常に、シーケンスの最後の命令によって生成される結果である(ステップ460)。さもなければ、最後の命令に出会うまでプロセスは続行する(ステップ450)。本発明のこの実施形態において、仮に8つの命令に出会った後なお監視文字に出会わないとすれば、シーケンスは終了する。
【0038】
上述の通り、既知の定数による整数乗算を実施する効率的なALU命令シーケンを探索するために時間を費やすことがないので、本発明は一層迅速なコンパイル時間を提供する。本発明は、所与の定数に関して事前に計算された解をコンパイラが探し出すことを可能にする。本発明は、また、多数の定数に対して命令のより効率的なシーケンスが与えられるので、より速い実行時処理性能を提供する。本発明は、また、一層複雑な探索アルゴリズムを使用して、ALU命令の短いシーケンスを見つけ出すことを可能にする。なぜならば、本発明は、探索アルゴリズムからの結果を記憶するルックアップ・テーブルを使用するからである。
【0039】
以下に、本発明の好ましい実施形態であるPA−RISCアーキテクチャに関する種々の乗算演算のサンプルを示す。
5を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
icost=1, dcost=1, count=1
6を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1=%src*3
SHL1%t1,%t2; %t2= %src*6
icost=2, dcost=1, count=1
7を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SH1ADD%src,%t1,%t2; %t2=%src*7
icost=2, dcost=2, count=5
8を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL3%src,%t1; %t1=%src*8
icost=1, dcost=O, count=1
9を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
icost=1, dcost=1, count=1
10を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SHL1%t1,%t2; %t2=%src*10
icost=2, dcost=1, count=1
11を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
SH1ADD%src,%t1,%t2; %t2=%src*11
icost=2, dcost=2, count=3
12を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1=%src*3
SHL2%t1,%t2; %t2=%src*12
icost=2, dcost=1, count=1
【0040】
13を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1 ; %t1=%src*9
SH2ADD%src,%t1,%t2; %t2=%src*13
icost=2, dcost=2, count=3
14を乗ずる乗算の好ましいシーケンスは、次の通り。
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
15を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SH1ADD%t1,%t1,%t2; %t2=%src*15
icost=2, dcost=2, count=3
16を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL4%src,%t1; %t1=%src*16
icost=1, dcost=1, count=1
17を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH3ADD%src,%t1,%t2; %t2=%src*17
icost=2, dcost=2, count=7
18を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SHL1%t1,%t2; %t2=%src*18
icost=2, dcost=1, count=1
19を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%t1,%t1,%t2; %t2=%src*19
icost=2, dcost=2, count=1
【0041】
20を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1; %t1=%src*5
SHL2%t1,%t2; %t2=%src*20
icost=2, dcost=1, count=1
21を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t1 ; %t1=%src*5
SH2ADD%t1,%src,%t2; %t2=%src*21
icost=2, dcost=2, count=1
123を乗ずる乗算の好ましいシーケンスは、次の通り。
SH2ADD%src,%src,%t2 ; %t2=%src*5
SUB%t2,%t1,%t3; %t3=%src*123
icost=3, dcost=2, count=1
1671を乗ずる乗算の好ましいシーケンスは、次の通り。
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
23517を乗ずる乗算の好ましいシーケンスは、次の通り。
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
【0042】
2を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL1%src,%t1 ; %t1=%src*2
icost=1, dcost=O, count=1
3を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1= %src*3
icost=1, dcost=1, count=1
6を乗ずる乗算の好ましいシーケンスは、次の通り。
SH1ADD%src,%src,%t1 ; %t1= %src*3
SHL1%t1,%t2 ; %t2=%src*6
icost=2, dcost=1, count=1
11を乗ずる乗算の好ましいシーケンスは、次の通り。
SH3ADD%src,%src,%t1; %t1=%src*9
SH1ADD%src,%t1,%t2 ; %t2= %src*11
icost=2, dcost=2, count=3
22を乗ずる乗算の好ましいシーケンスは、次の通り。
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
43を乗ずる乗算の好ましいシーケンスは、次の通り。
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
86を乗ずる乗算の好ましいシーケンスは、次の通り。
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
【0043】
171を乗ずる乗算の好ましいシーケンスは、次の通り。
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
173を乗ずる乗算の好ましいシーケンスは、次の通り。
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
342を乗ずる乗算の好ましいシーケンスは、次の通り。
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
346を乗ずる乗算の好ましいシーケンスは、次の通り。
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
683を乗ずる乗算の好ましいシーケンスは、次の通り。
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
【0044】
1867を乗ずる乗算の好ましいシーケンスは、次の通り。
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
1366を乗ずる乗算の好ましいシーケンスは、次の通り。
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
3734を乗ずる乗算の好ましいシーケンスは、次の通り。
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
2731を乗ずる乗算の好ましいシーケンスは、次の通り。
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
【0045】
10452を乗ずる乗算の好ましいシーケンスは、次の通り。
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
5462を乗ずる乗算の好ましいシーケンスは、次の通り。
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
59を乗ずる乗算の好ましいシーケンスは、次の通り。
SHL6%src,%t1; %t1=%src*64
SH2ADD%src,%src,%t2; %t2=%src*5
SUB%t2,%t1,%t3; %t3=%src*59
【0046】
以上、本発明を好ましい実施形態を参照して記述したが、本発明の理念および有効範囲を逸脱することなく種々の修正または変更を行うことが可能である点は容易に認められることであろう。
【0047】
本発明には、例として次のような実施様態が含まれる。
(1)コンパイラにおける乗算演算を実施する方法であって、上記コンパイラにおける上記乗算演算を実行する命令シーケンスを含むルックアップ・テーブルを作成するステップと、上記コンパイラへの入力値を提供するステップと、上記入力値を上記ルックアップ・テーブルへのインデックスとして使用するステップと、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップと、上記取り出した整数を上記命令シーケンスに変換するステップと、上記コンパイラを用いて上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップと、上記乗算演算の結果を出力値として提供するステップと、を含むコンパイラにおける乗算実施方法。
(2)上記命令シーケンスの終了を示す監視命令を上記命令シーケンスに含めるステップを更に含む、上記(1)に記載のコンパイラにおける乗算実施方法。
(3)上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として提供するステップを更に含む、上記(2)に記載のコンパイラにおける乗算実施方法。
【0048】
(4)コンパイラにおける乗算演算を実施する装置であって、上記コンパイラにおける上記乗算演算を実行する命令シーケンスを含み、上記コンパイラによって使用されるルックアップ・テーブルと、上記コンパイラへの入力値を使用して上記ルックアップ・テーブルへインデックス付けする手段と、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出す手段と、上記取り出した整数を上記命令シーケンスに変換する手段と、を備え、上記コンパイラが上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行し乗算演算の結果の出力値を提供する、コンパイラにおける乗算実施装置。
(5)上記命令シーケンスの終了を示す監視命令を更に備える、上記(4)に記載のコンパイラにおける乗算実施装置。
(6)上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として上記コンパイラが提供する、上記(5)に記載のコンパイラにおける乗算実施装置。
【0049】
(7)コンパイラにおける乗算演算を実施する方法であって、所与のアーキテクチャ上で乗算結果を計算するために使用可能な各ALU命令コードを列挙するステップと、上記命令シーケンスの第N番目の命令がレベルN命令であり、N個の命令からなるシーケンスをレベルN命令シーケンスとして、各レベル毎に上記ALU命令コードを符号化してルックアップ・テーブルに書き込むステップと、を含むコンパイラにおける乗算演算実施方法。
(8)上記命令コードを、2つの入力を受け取り1つの出力を生成する命令コード、および1つの入力を受け取り1つの出力を生成する命令コードに分類するステップと、ALU命令シーケンスの終了にマークをつける監視文字として上記命令コードの1つを予約するステップと、2入力および1出力を持つ命令コードの範囲を数え上げて記録するステップと、を含む上記(7)に記載のコンパイラにおける乗算演算実施方法。
(9)上記コンパイラを使用して、入力値によって上記ルックアップ・テーブルにインデックス付けするステップと、インデックス付けされたルックアップ・テーブル位置にある上記符号化されたALU命令を、対応するALU命令シーケンスに展開するステップと、を含む上記(7)に記載のコンパイラにおける乗算演算実施方法。
(10)符号化する上記ステップが、上記レベルに対応する数を二乗した値に、2入力を持つ命令コードの数を乗算し、その結果の積に1入力を持つ命令コードの数を加算し、その合計に監視文字を定義するための1を加えることを含む、上記(7)に記載のコンパイラにおける乗算演算実施方法。
(11)すべての可能な符号化を確定した後ALU命令シーケンスの各々を表す整数を生成するステップを更に含む上記(7)に記載のコンパイラにおける乗算演算実施方法。
【0050】
(12)コンパイラにおける乗算演算を実施する装置であって、所与のアーキテクチャ上で乗算結果を計算するため使用可能な各ALU命令コードを列挙する手段と、上記命令シーケンスの第N番目の命令がレベルN命令であり、N個の命令からなるシーケンスをレベルN命令シーケンスとして、各レベル毎に符号化された上記ALU命令コードを記憶するルックアップ・テーブルと、を備えるコンパイラにおける乗算演算実施装置。
(13)上記命令コードが、2つの入力を受け取り1つの出力を生成する命令コード、および1つの入力を受け取り1つの出力を生成する命令コードに分類され、ALU命令シーケンスの終了にマークをつける監視文字として上記命令コードの1つが予約され、2入力および1出力を持つ命令コードの範囲が数え上げられ記録される、上記(12)に記載のコンパイラにおける乗算演算実施装置。
(14)上記ルックアップ・テーブルにインデックス付けするため上記コンパイラによって使用される入力値と、インデックス付けされたルックアップ・テーブル位置にある上記符号化されたALU命令を、対応するALU命令シーケンスに展開する手段と、を更に備える上記(12)に記載のコンパイラにおける乗算演算実施装置。
(15)上記レベルに対応する数を二乗した値に、2入力を持つ命令コードの数を乗算し、その結果の積に1入力を持つ命令コードの数を加算し、その合計に監視文字用の1を加えることによって上記ALU命令コードが符号化される、上記(13)に記載のコンパイラにおける乗算演算実施装置。
(16)すべての可能な符号化を確定した後ALU命令シーケンスの各々を表す整数を生成する手段を更に備える上記(12)に記載のコンパイラにおける乗算演算実施装置。
【0051】
(17)1つの整数をALU命令シーケンスに展開する方法であって、入力値Uを使用して、該入力値に定数値Xを乗ずる乗算演算を実行するALU命令シーケンスを表す整数をS0と名付けるステップと、上記命令シーケンスの第N番目の命令がレベルN命令であり、N個の命令からなるシーケンスをレベルN命令シーケンスとして、各レベルにおけるALU命令符号化値を含むレベル・テーブルを計算するステップと、剰余の各々がALU命令を表す剰余および被除数を計算するステップと、上記剰余を上記ALU命令に対応づけるステップと、上記ALU命令シーケンスを実行して乗算結果を生成するステップと、を含む乗算命令シーケンス展開方法。
(18)上記第1の剰余R1の値が命令コード番号であり、Uの値がすべてのレベル1命令に対する入力であるように上記第1の剰余R1からレベル1命令への対応付けを行うステップを更に含む、上記(17)に記載の乗算命令シーケンス展開方法。
(19)第2の剰余R2が0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQ2=R2−1とし、Q2の値が22×5未満であれば、2入力命令コードを使用することとして、Q2/22+1が対応するALU命令コード番号であり、Q2rem2の値が第1の入力値であり、(Q2/2)rem2の値が第2の入力値であり、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、第2の剰余R2が0に等しくない場合、P2=Q2−22×5として、1入力命令コードを使用することとして、P2/2+6を対応する命令コード番号とし、P2rem2をその入力の値とするように、第2の剰余R2からレベル2命令への対応付けを行うステップを含む、上記(17)に記載の乗算命令シーケンス展開方法。
(20)第N番目のの剰余RNが0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQN=RN−1とし、QNの値が2N×5未満であれば、2入力命令コードを使用することとして、QN/N2+1が対応するALU命令コード番号であり、QNremNの値が第1の入力値であり、(QN/N)remNの値が第2の入力値であり、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、第N番目の剰余RNが0に等しくない場合、PN=QN-1−N2×5として、1入力命令コードを使用することとして、PN/N+6を対応する命令コード番号とし、PNremNをその入力の値とするように、第N番目の剰余RNからレベルN命令への対応付けを行うステップを含む、
上記(17)に記載の乗算命令シーケンス展開方法。
【0052】
(21)1つの整数をALU命令シーケンスに展開する装置であって、上記命令シーケンスの第N番目の命令がレベルN命令であり、N個の命令からなるシーケンスをレベルN命令シーケンスとして、各レベルにおけるALU命令符号化値を含むレベル・テーブルと、入力値Uを使用して、該入力値に定数値Xを乗ずる乗算演算を実行するALU命令シーケンスを表す整数をS0と名付ける手段と、剰余の各々がALU命令を表す剰余および被除数を計算する手段と、上記剰余を上記ALU命令に対応づける手段と、上記ALU命令シーケンスを実行して乗算結果を生成する手段と、を備える乗算命令シーケンス展開装置。
(22)上記第1の剰余R1の値が命令コード番号であり、Uの値がすべてのレベル1命令に対する入力であるように、上記第1の剰余R1からレベル1命令への対応付けを行う手段を更に備える、上記(21)に記載の乗算命令シーケンス展開装置。
(23)第2の剰余R2が0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQ2=R2−1とし、Q2の値が22×5未満であれば、2入力命令コードを使用することとして、Q2/22+1が対応するALU命令コード番号であり、Q2rem2の値が第1の入力値であり、(Q2/2)rem2の値が第2の入力値とし、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、第2の剰余R2が0に等しくない場合、P2=Q2−22×5として、1入力命令コードを使用することとして、P2/2+6が対応する命令コード番号であり、P2rem2がその入力の値であるように、第2の剰余R2からレベル2命令への対応付けを行う手段を更に備える、上記(21)に記載の乗算命令シーケンス展開装置。
(24)第N番目のの剰余RNが0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQN=RN−1とし、QNの値が2N×5未満であれば、2入力命令コードを使用することとして、QN/N2+1が対応するALU命令コード番号であり、QNremNの値が第1の入力値であり、(QN/N)remNの値が第2の入力値であり、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、第N番目の剰余RNが0に等しくない場合、PN=QN-1−N2×5として、1入力命令コードを使用することとして、PN/N+6が対応する命令コード番号であり、PNremNがその入力の値であるように、第N番目の剰余RNからレベルN命令への対応付けを行う手段を更に備える上記(21)に記載の乗算命令シーケンス展開装置。
【0053】
【発明の効果】
既知の定数による整数乗算を実施する効率的なALU命令シーケンを探索するために時間を費やす必要がないので、本発明は迅速なコンパイル時間を実現する。本発明は、また、多数の定数に対して効率的な命令シーケンスを与えられるので、迅速な実行時処理性能を提供する。
【図面の簡単な説明】
【図1】単一プロセッサのコンピュータ・アーキテクチャを示すブロック図である。
【図2】図1で示されたコンピュータ・アーキテクチャと関連して使用される場合があるソフトウェア・コンパイラのブロック図である。
【図3】本発明に従って整数乗算または除算シーケンスを記憶するコンパクトな符号化方式を実施するコンパイル・システムの動作の流れ図である。
【図4】図5および図6とともに、本発明に従って整数をALU命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【図5】図4および図6とともに、本発明に従って整数をALU命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【図6】図4および図5とともに、本発明に従って整数をALU命令シーケンスに変換するアルゴリズムの動作の流れ図である。
【符号の説明】
10 コンピュータ・アーキテクチャ
11 プロセッサ
12 キャッシュ
13 メモリ
14 入出力
15 システム・バス
21 コンパイラ・フロントエンド・コンポーネント
22 高水準オブジェクト(HLO)
23 コード生成ルーチン
24 低水準最適化ルーチン(LLO)
25 オブジェクト・ファイル生成ルーチン
26 リンカ
100 ソース・コード
110 高水準中間表示形式(HLIR)
120 低水準中間表示形式(LLIR)
140、141 オブジェクト・ファイル
150 実行可能ファイル
Claims (11)
- コンパイラにおける乗算演算を実施する方法であって、
コンピュータがコンパイラを実行して入力値を受け取るステップと、
コンピュータがコンパイラを実行して、上記入力値を、上記コンパイラに関連し、上記乗算演算を実行する命令シーケンスを含むルックアップ・テーブルへのインデックスとして使用するステップと、
コンピュータがコンパイラを実行して、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出すステップと、
コンピュータがコンパイラを実行して、上記取り出した整数を上記命令シーケンスに変換するステップと、
コンピュータがコンパイラを実行して、上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行するステップと、
コンピュータがコンパイラを実行して、上記乗算演算の結果の出力値を提供するステップと、を含むコンパイラにおける乗算実施方法。 - 上記ルックアップ・テーブルにおいて、上記命令シーケンスの終了を示す監視命令が上記命令シーケンスに含まれる、請求項1に記載のコンパイラにおける乗算実施方法。
- コンピュータがコンパイラを実行して、上記監視命令に出会う前に実行される最後の命令によって生成される結果を上記出力値として提供するステップを更に含む、請求項2に記載のコンパイラにおける乗算実施方法。
- コンパイラにおける乗算演算を実施する装置であって、上記乗算演算を実行する命令シーケンスを含み、上記コンパイラによって使用されるルックアップ・テーブルと、上記コンパイラへの入力値を使用して上記ルックアップ・テーブルへインデックス付けする手段と、上記入力値によってインデックス付けされたテーブル位置にある整数を上記ルックアップ・テーブルから取り出す手段と、上記取り出した整数を上記命令シーケンスに変換する手段と、を備え、上記コンパイラが上記命令シーケンスを実行して、上記入力値に関する乗算演算を実行し乗算演算の結果の出力値を提供する、コンパイラにおける乗算実施装置。
- ルックアップ・テーブルを使用して、コンパイラにおける乗算演算を実施する方法であって、
当該ルックアップ・テーブルには、命令シーケンスの第1番目の命令がレベル1命令であり、上記命令シーケンスの第N番目の命令がレベルN命令であり、1命令からなるシーケンスをレベル1命令シーケンスとし、N命令からなるシーケンスをレベルN命令シーケンスとして、各レベル毎に所与のアーキテクチャ上で乗算結果を計算するために有効なALU命令が符号化して書き込まれており、ALU命令の各シーケンスを表すように生成された整数が各シーケンスの対応箇所に書き込まれており、
コンピュータがコンパイラを実行して、入力値によって上記ルックアップ・テーブルにインデックス付けするステップと、
コンピュータがコンパイラを実行して、インデックス付けされたルックアップ・テーブル位置にある上記整数を、対応するALU命令シーケンスに展開するステップと、
コンピュータがコンパイラを実行して、ALU命令の対応するシーケンスを実行し、上記入力値に対する乗算演算を行うステップと、
コンピュータがコンパイラを実行して、上記乗算演算の結果の出力値を提供するステップと、を含むコンパイラにおける乗算演算実施方法。 - 上記ルックアップ・テーブルにおいて、上記ALU命令が、2つの入力を受け取り1つの出力を生成する命令コード、および1つの入力を受け取り1つの出力を生成する命令コードに分類され、ALU命令シーケンスの終了にマークをつける監視文字として上記命令コードの1つが予約され、2入力および1出力を持つ命令コードの範囲が記録され、2入力および1出力を持つ命令コードの範囲が列挙される請求項5に記載のコンパイラにおける乗算演算実施方法。
- 符号化する上記ステップが、上記レベルを二乗するステップと、当該二乗した値に、2入力を持つ命令コードの数を乗算するステップと、その結果の積に1入力を持つ命令コードの数を加算するステップと、その合計に監視文字を定義するための1を加えるステップとを含む、請求項6に記載のコンパイラにおける乗算演算実施方法。
- コンピュータがコンパイラを実行して、インデックス付けされたルックアップ・テーブル位置にある上記整数を、対応するALU命令シーケンスに展開するステップが、入力値Uを使用して、該入力値に定数値Xを乗ずる乗算演算を実行するALU命令シーケンスを表す整数をS0と名付けるステップと、上記ALU命令シーケンスの第1番目の命令がレベル1命令であり、上記ALU命令シーケンスの第N番目の命令がレベルN命令であり、1命令からなるシーケンスをレベル1命令シーケンスとし、N命令からなるシーケンスをレベルN命令シーケンスとして、各レベルにおけるALU命令符号化値を含む、上記ルックアップ・テーブルのレベル・テーブルを計算するステップと、剰余の各々がALU命令を表す剰余および被除数を計算するステップと、上記剰余を上記ALU命令に対応づけるステップと、を含む請求項5に記載のコンパイラにおける乗算演算実施方法。
- 第1の剰余R1の値が命令コード番号であり、Uの値がすべてのレベル1命令に対する入力であるように上記第1の剰余R1からレベル1命令への対応付けを行うステップを更に含む、請求項8に記載のコンパイラにおける乗算演算実施方法。
- 第2の剰余R2が0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQ2=R2−1とし、Q2の値が22×5未満であれば、2入力命令コードを使用することとして、Q2/22+1が対応するALU命令コード番号であり、Q2rem2の値が第1の入力値であり、(Q2/2)rem2の値が第2の入力値であり、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、Q2の値が22×5以上である場合、P2=Q2−22×5として、1入力命令コードを使用することとして、P2/2+6を対応する命令コード番号とし、P2rem2をその入力の値とするように、第2の剰余R2からレベル2命令への対応付けを行うステップをさらに含む、請求項8に記載のコンパイラにおける乗算演算実施方法。
- 第N番目の剰余RNが0に等しい場合、ALU命令シーケンスの終了に目印をつける監視文字にその剰余を対応付けし、ゼロでなければQN=RN−1とし、QNの値が2N×Y未満であれば、2入力命令コードを使用することとして、QN/N2+1が対応するALU命令コード番号であり、QNremNの値が第1の入力値であり、(QN/N)remNの値が第2の入力値であり、上記剰余の値が第1の値であればUを入力として使用し、上記剰余の値が第2の値であればレベル1演算結果L1を入力として使用し、QNの値が2N×Y以上である場合、PN=QN-1−N2×Yとして、1入力命令コードを使用することとして、PN/N+6を対応する命令コード番号とし、PNremNをその入力の値とするように、第N番目の剰余RNからレベルN命令への対応付けを行うステップをさらに含む、請求項8に記載のコンパイラにおける乗算演算実施方法。
Applications Claiming Priority (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US08/618,276 US5764990A (en) | 1996-03-18 | 1996-03-18 | Compact encoding for storing integer multiplication Sequences |
| US618,276 | 1996-03-18 |
Publications (3)
| Publication Number | Publication Date |
|---|---|
| JPH09330210A JPH09330210A (ja) | 1997-12-22 |
| JPH09330210A5 JPH09330210A5 (ja) | 2004-09-02 |
| JP3727039B2 true JP3727039B2 (ja) | 2005-12-14 |
Family
ID=24477045
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP04768397A Expired - Lifetime JP3727039B2 (ja) | 1996-03-18 | 1997-03-03 | コンパイラにおける乗算実施方法 |
Country Status (2)
| Country | Link |
|---|---|
| US (1) | US5764990A (ja) |
| JP (1) | JP3727039B2 (ja) |
Families Citing this family (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US6341300B1 (en) | 1999-01-29 | 2002-01-22 | Sun Microsystems, Inc. | Parallel fixed point square root and reciprocal square root computation unit in a processor |
| US6351760B1 (en) | 1999-01-29 | 2002-02-26 | Sun Microsystems, Inc. | Division unit in a processor using a piece-wise quadratic approximation technique |
| US7395300B2 (en) * | 2004-01-27 | 2008-07-01 | Broadcom Corporation | System, and method for calculating product of constant and mixed number power of two |
Family Cites Families (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5170475A (en) * | 1989-03-06 | 1992-12-08 | Motorola, Inc. | Data processor having instructions for interpolating between memory-resident data values respectively |
| US5184317A (en) * | 1989-06-14 | 1993-02-02 | Pickett Lester C | Method and apparatus for generating mathematical functions |
| US5337415A (en) * | 1992-12-04 | 1994-08-09 | Hewlett-Packard Company | Predecoding instructions for supercalar dependency indicating simultaneous execution for increased operating frequency |
| US5687360A (en) * | 1995-04-28 | 1997-11-11 | Intel Corporation | Branch predictor using multiple prediction heuristics and a heuristic identifier in the branch instruction |
-
1996
- 1996-03-18 US US08/618,276 patent/US5764990A/en not_active Expired - Lifetime
-
1997
- 1997-03-03 JP JP04768397A patent/JP3727039B2/ja not_active Expired - Lifetime
Also Published As
| Publication number | Publication date |
|---|---|
| US5764990A (en) | 1998-06-09 |
| JPH09330210A (ja) | 1997-12-22 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| Bernstein | Multiplication by integer constants | |
| US6192516B1 (en) | Interpreter generation and implementation utilizing interpreter states and register caching | |
| Granlund et al. | Eliminating branches using a superoptimizer and the GNU C compiler | |
| JP5647859B2 (ja) | 乗累算演算を実行するための装置および方法 | |
| US8280941B2 (en) | Method and system for performing calculations using fixed point microprocessor hardware | |
| JP7096828B2 (ja) | 入力オペランド値を処理するための装置及び方法 | |
| GB2480285A (en) | Conditional compare instruction which sets a condition code when it is not executed | |
| JP2011501310A (ja) | 算術演算のためにマグニチュード検出を実行するための装置および方法 | |
| US6347318B1 (en) | Method, system, and apparatus to improve performance of tree-based data structures in computer programs | |
| US8965946B2 (en) | Data processing apparatus and method for performing a reciprocal operation on an input value to produce a result value | |
| US7051060B2 (en) | Operand conversion optimization | |
| WO2020161458A1 (en) | Encoding special value in anchored-data element | |
| Magenheimer et al. | Integer multiplication and division on the HP precision architecture | |
| KR102811835B1 (ko) | 앵커 데이터 요소 변환 | |
| US20080263332A1 (en) | Data Processing Apparatus and Method for Accelerating Execution Subgraphs | |
| JP3727039B2 (ja) | コンパイラにおける乗算実施方法 | |
| JP4476210B2 (ja) | 逆数演算の結果値の初期推定値を求めるデータ処理装置および方法 | |
| US5805489A (en) | Digital microprocessor device having variable-delay division hardware | |
| JP6897213B2 (ja) | コード生成装置、コード生成方法及びコード生成プログラム | |
| US20240202160A1 (en) | Processor, computer-readable recording medium storing instruction execution program, and information processing device | |
| CN100562845C (zh) | 使用缩减宽度数据进行计算的方法和装置 | |
| JPH1049348A (ja) | 整数乗算装置 | |
| Wang et al. | Add More User-Mode Instructions into Pipeline | |
| JP2722493B2 (ja) | レジスタ割り付け処理方法 | |
| JP4327533B2 (ja) | 演算処理プログラム、演算処理方法、および演算処理装置 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20050428 |
|
| A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20050510 |
|
| A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050803 |
|
| 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: 20050922 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050926 |
|
| R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091007 Year of fee payment: 4 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091007 Year of fee payment: 4 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20101007 Year of fee payment: 5 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20111007 Year of fee payment: 6 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20121007 Year of fee payment: 7 |
