(57)【要約】【課題】プログラムの実行効率を向上させる。【解決手段】インターロックが生じている浮動小数点命令を検出し、インターロックが生じている命令のオペランドを参照及び代入するレジスタアドレスを、コンパイルの際にオペランドとして割り当てられない奇数アドレスに変更する。続いて、レジスタの依存関係のない命令を検出し、検出した命令を、インターロックが生じている命令間に挿入する。【選択図】　図２
2004013603.tif 000002
【特許請求の範囲】
【請求項１】
インストラクションのオペランドがデータ処理システム内のレジスタのアドレスで表現されたアセンブリコードによって記述されたプログラムコードが入力され、当該プログラムコードのコード内容を変換するアセンブリコード変換方法において、
上記プログラムコードは、高水準言語で記述された状態から上記データ処理システムに適合したアセンブリコードにコンパイルされた後に入力され、
上記データ処理システムは、１つのレジスタを１ワード分のオペランドとして扱う単精度の浮動小数点インストラクションと、２つのレジスタを１ワード分のオペランドとして扱う倍精度の浮動小数点インストラクションとがインストラクションセットに含まれており、
上記プログラムコード中の浮動小数点インストラクションのうち、オペランドを代入したレジスタが他のインストラクションにより参照されるまでのインストラクション数が、当該浮動小数点インストラクションの実行サイクル数よりも短くなっているインターロックドインストラクションを検出するインターロック検出処理と、
上記インターロックドインストラクションがオペランドを参照及び代入するレジスタアドレスを、上記コンパイルの際にインストラクションのオペランドとして割り当てられないレジスタアドレスに、変更するアドレスリネーミング処理と、
上記インターロックドインストラクションから、当該インターロックドインストラクション以降にある最初のラベル文又は分岐処理のインストラクションまでの各インストラクションのうち、インターロックドインストラクションとの間にある全てのインストラクションとレジスタの依存関係のないインストラクションを検出し、検出したインストラクションのコードを、上記インターロックドインストラクションから当該インターロックドインストラクションによりオペランドが代入されたレジスタを参照するインストラクションまでの間のいずれかの位置に移動するコード並べ替え処理と
を行うアセンブリコード変換方法。
【請求項２】
インストラクションのオペランドがデータ処理システム内のレジスタのアドレスで表現されたアセンブリコードによって記述されたプログラムコードが入力され、当該プログラムコードのコード内容を変換するアセンブリコード変換装置において、
上記プログラムコードは、高水準言語で記述された状態から上記データ処理システムに適合したアセンブリコードにコンパイルされた後に入力され、
上記データ処理システムは、１つのレジスタを１ワード分のオペランドとして扱う単精度の浮動小数点インストラクションと、２つのレジスタを１ワード分のオペランドとして扱う倍精度の浮動小数点インストラクションとがインストラクションセットに含まれており、
上記プログラムコード中の浮動小数点インストラクションのうち、オペランドを代入したレジスタが他のインストラクションにより参照されるまでのインストラクション数が、当該浮動小数点インストラクションの実行サイクル数よりも短くなっているインターロックドインストラクションを検出するインターロック検出処理手段と、
上記インターロックドインストラクションがオペランドを参照及び代入するレジスタアドレスを、上記コンパイルの際にインストラクションのオペランドとして割り当てられないレジスタアドレスに、変更するアドレスリネーミング処理手段と、
上記インターロックドインストラクションから、当該インターロックドインストラクション以降にある最初のラベル文又は分岐処理のインストラクションまでの各インストラクションのうち、インターロックドインストラクションとの間にある全てのインストラクションとレジスタの依存関係のないインストラクションを検出し、検出したインストラクションのコードを、上記インターロックドインストラクションから当該インターロックドインストラクションによりオペランドが代入されたレジスタを参照するインストラクションまでの間のいずれかの位置に移動するコード並べ替え処理手段と
を備えるアセンブリコード変換装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機システムの実行コードであるアセンブリコードのコード内容を変換するアセンブリコード変換方法及び装置に関するものである。
【０００２】
【従来の技術】
例えば、Ｃ言語等の高水準プログラミング言語で記述されたソースプログラムを、ＣＰＵやＤＳＰ等のプロセッサに実行させるためには、それらのプロセッサの実行形式にプログラムコードを変換しなければならない。
【０００３】
図２５に、高水準プログラミング言語で記述されたソースプログラムを、プロセッサの実行形式に変換する従来のコード変換方法の処理フローを示す。
【０００４】
従来のコード変換方法では、例えばＣ言語等の高水準プログラミング言語で記述されたソースプログラムを、コンパイラによって、目的のプロセッサのアセンブリコードに変換する（ステップＳ５０−１）。アセンブリコードは、１行で１つの命令（インストラクション）が記述されており、その命令のオペランドがプロセッサのハードウェア上のデータレジスタのアドレスが直接表されているプログラムコードである。続いて、アセンブリコードをアセンブラによって目的のプロセッサの機械語に変換する（ステップＳ５０−２）。続いて、機械語で記述された複数のプログラムをリンカによって合成し、目的のプロセッサが実行可能な実行形式のコードに変換される（ステップＳ５０−３）。
【０００５】
ここで、近年のＣＰＵやＤＳＰ等のプロセッサには、オペランドとして固定小数点値を扱う命令のみならず、オペランドとして浮動小数点値を扱う命令（浮動小数点命令）がインストラクションセットに含まれているものが多い。浮動小数点命令は、通常、プロセッサ内の浮動小数点ユニットにより実行される。浮動小数点ユニットは、固定小数点演算用のレジスタとは別に設けられた浮動小数点演算用の専用のレジスタ（浮動小数点レジスタ）に格納されたオペランドを参照して命令を実行するとともに、求めた浮動小数点値をこの浮動小数点レジスタに代入する。
【０００６】
浮動小数点は、ＩＥＥＥ７５４浮動小数点規格（ＩＥＥＥ　７５４ｆｌｏａｔｉｎｇ−ｐｏｉｎｔ　ｓｔａｎｄａｒｄ）で定められている。ＩＥＥＥ７５４浮動小数点規格には、単精度浮動小数点と、倍精度浮動小数点がある。浮動小数点ユニットでは、通常、単精度浮動小数点値をオペランドとした単精度演算と、倍精度浮動小数点値をオペランドとした倍精度演算とが可能となっている。浮動小数点レジスタは、単精度の浮動小数点値のビット単位でアドレスが設定されている。そのため、単精度演算では、１つの浮動小数点レジスタに格納された値を１ワード分のオペランドとして扱うが、倍精度演算では、２つの浮動小数点レジスタに格納された値を合成して１ワード分のオペランドとして扱う。
【０００７】
データプロセッサ内の浮動小数点演算ユニットには、四則演算等の命令を実行できるとともに、三角関数や対数関数などの演算を行う算術演算ライブラリが用意されている。一般に、算術演算ライブラリを使用するときには、倍精度演算が用いられる。
【０００８】
ところで、倍精度の浮動小数点命令は２つのレジスタ内のデータを合成して１ワード分のオペランドとして扱うが、オペランドとしては、１つのレジスタのアドレスのみが割り当てられる。そのため、コンパイラは、倍精度の浮動小数点命令をコンパイルする際には、倍精度の浮動小数点命令のオペランドに偶数番号のレジスタアドレスのみを割り当て、奇数番号のレジスタアドレスを常に開放している。このようにレジスタの割り当てを行うことによって、倍精度の浮動小数点命令のオペランドに対して、２つのレジスタの領域を割り当てている。
【０００９】
図２６に、倍精度の浮動小数点命令を含むアセンブリコードの記述例を示し、図２７に、図２６のアセンブリコードを実行した際における浮動小数点レジスタ及びメモリの使用状態を示す。
【００１０】
図２６に示すアセンブリコードでは、倍精度ロード命令ＬＤ．Ｄにより、メモリＭＥＭ［０］，ＭＥＭ［１］に格納されている倍精度の浮動小数点値が、浮動小数点レジスタＦＲ０，　ＦＲ１にロードされる（ステップＳ５１−１）。続いて、算術演算ライブラリの呼び出し命令ＣＡＬＬ　ＳＩＮにより、ＳＩＮ関数の算術ライブラリが呼び出され、浮動小数点レジスタＦＲ０に格納されている倍精度の浮動小数点値に基づき算出された倍精度のＳＩＮ関数値が、浮動小数点レジスタＦＲ２，ＦＲ３に格納される（ステップＳ５１−２）。続いて、倍精度ストア命令ＳＴ．Ｄにより、浮動小数点レジスタＦＲ２，ＦＲ３に格納されている倍精度の浮動小数点値が、メモリＭＥＭ［２］，ＭＥＭ［３］に格納される。
【００１１】
以上のように、オペランドに偶数番号のレジスタアドレスのみを割り当てることによって、連続した２つのレジスタ領域を、倍精度の浮動小数点命令のオペランドに割り当てることが可能となる。
【００１２】
また、プロセッサは、通常、単精度の浮動小数点命令のオペランドも、倍精度の浮動小数点命令のオペランドも、同じ浮動小数点レジスタを用いて参照及び代入をする。そのため、コンパイラは、倍精度の浮動小数点命令のみならず、単精度の浮動小数点命令をコンパイルする場合にも、倍精度の浮動小数点命令との間でレジスタの競合が生じないように、オペランドとして偶数番号のレジスタアドレスのみを割り当てる必要がある。
【００１３】
図２８に、単精度及び倍精度命令を含むアセンブリコードの記述例を示し、図２９に、図２８のアセンブリコードを実行した際におけるレジスタ及びメモリの使用状態を示す。
【００１４】
図２８に示すアセンブリコードでは、単精度ロード命令ＬＤ．Ｓにより、メモリＭＥＭ［０］に格納されている単精度の浮動小数点値が、浮動小数点レジスタＦＲ４にロードされる（ステップＳ５３−１）。続いて、単精度ロード命令ＬＤ．Ｓにより、メモリＭＥＭ［１］に格納されている単精度の浮動小数点値が、浮動小数点レジスタＦＲ６にロードされる（ステップＳ５３−２）。続いて、単精度乗算命令ＭＵＬ．Ｓにより、浮動小数点レジスタＦＲ４，ＦＲ６に格納されている単精度の浮動小数点値が乗算され、乗算結果が浮動小数点レジスタＦＲ０に格納される。続いて、算術演算ライブラリの呼び出し命令ＣＡＬＬ　ＳＩＮにより、ＳＩＮ関数の算術ライブラリが呼び出され、浮動小数点レジスタＦＲ０に格納されている単精度の浮動小数点値に基づき算出された倍精度のＳＩＮ関数値が、浮動小数点レジスタＦＲ２，ＦＲ３に格納される（ステップＳ５３−４）。続いて、倍精度ストア命令ＳＴ．Ｄにより、浮動小数点レジスタＦＲ２，ＦＲ３に格納されている倍精度の浮動小数点値が、メモリＭＥＭ［２］，ＭＥＭ［３］に格納される。
【００１５】
すなわち、コンパイラは、浮動小数点命令をコンパイルする場合には、単精度又は倍精度にかかわらず、オペランドに対して偶数番号のアドレスの浮動小数点レジスタのみを割り当てたアセンブリコードを生成する。
【００１６】
【発明が解決しようとする課題】
ところが、オペランドに偶数番号のレジスタアドレスのみしか割り当てない場合、例えば、倍精度の浮動小数点命令が存在しないプログラムや、倍精度の浮動小数点命令が非常に少ないプログラムなどでは、全ての浮動小数点レジスタのうち約１／２のレジスタが使用されないこととなり、レジスタの使用効率が非常に悪くなる。レジスタの使用効率が悪いと、命令に対してレジスタ数が不足する可能性が高くなってしまう。レジスタ数が不足すると、メモリへのデータ退避を行ってレジスタを他の命令に開放し、その命令が終了したのちに、退避させたデータをレジスタに復帰させなければならないので、命令数が増加してしまう。
【００１７】
また、近年のＣＰＵやＤＳＰといったプロセッサでは、命令フェッチ、レジスタフェッチ、演算実行処理、演算結果格納処理といった１つの命令内で実行される各処理をハードウェア上で並列的に行うことができる。このようなハードウェア構成は、一般に、パイプライン構成と呼ばれる。例えば、図３０には、命令フェッチ（ＩＦ）から演算値格納処理（ＦＷＢ）までの１つの命令が７クロックで動作するパイプライン構成のプロセッサのデータ処理タイミングを示している。このようなパイプライン構成のデータプロセッサでは、１つの命令が、見かけ上１クロックで実行できるようになっている。
【００１８】
しかしながら、このようなパイプライン構成のデータプロセッサであっても、実行する命令間にインターロックが発生している場合には、それらの命令の実行効率を向上させることができない。
【００１９】
例えば、図３１に示すような、浮動小数点レジスタＦＲ２，ＦＲ４に格納されている単精度の浮動小数点値を乗算し、その乗算結果を浮動小数点レジスタＦＲ０に格納する命令（ＭＵＬ．Ｓ　ＦＲ０，ＦＲ２，ＦＲ４）を実行したのち、次に、浮動小数点レジスタＦＲ０，ＦＲ１０に格納されている単精度の浮動小数点値を加算し、その加算結果を浮動小数点レジスタＦＲ６に格納する命令（ＡＤＤ．Ｓ　ＦＲ６，ＦＲ０，ＦＲ１０）を行うコード構成のアセンブリコードがあったとする。このようなアセンブリコードを実行したとしても、データプロセッサは、図３２に示すように、ＭＵＬ．Ｓ　ＦＲ０，ＦＲ２，ＦＲ４の演算結果がレジスタに書き込まれるまで、次のＡＤＤ．Ｓ　ＦＲ６，ＦＲ０，ＦＲ１０の実行を待機しなければならない。
【００２０】
すなわち、複数の命令間にレジスタの依存関係がある場合、その命令間に十分なマージンを設けていなければ、パイプライン処理に伴う実行効率の向上を図ることができない。例えば、図３０に示した７段のパイプライン構成のデータプロセッサであれば、レジスタの依存関係がある命令間隔が少なくとも５命令以上なければ、インターロックが発生してしまう。
【００２１】
以上のようなインターロックは、レジスタ数が十分多ければ発生する確率が少なくなる。しかしながら、浮動小数点レジスタは、上述したようにレジスタの使用効率が悪い。そのため、上記のインターロックが発生する可能性が高くなってしまっている。
【００２２】
以上のように、従来のコンパイラで生成されたアセンブリコードでは、浮動小数点命令のオペランドとして偶数番号のレジスタアドレスのみしか割り当てないため、命令数の増加や、パイプラインのインターロックが発生する可能性が高くなる。その結果、従来のコンパイラで生成されたアセンブリコードは、プログラムの実行効率が悪くなってしまっていた。
【００２３】
本発明は、このような実情を鑑みてなされたものであり、プログラムの実行効率を向上させることができるアセンブリコード変換方法及び装置を提供することを目的とする。
【００２４】
【課題を解決するための手段】
本発明にかかるアセンブリコード変換方法及び装置は、インストラクションのオペランドがデータ処理システム内のレジスタのアドレスで表現されたアセンブリコードによって記述されたプログラムコードが入力され、当該プログラムコードのコード内容を変換するものである。
【００２５】
上記プログラムコードは、高水準言語で記述された状態から上記データ処理システムに適合したアセンブリコードにコンパイルされた後に入力されている。
【００２６】
上記データ処理システムは、１つのレジスタを１ワード分のオペランドとして扱う単精度の浮動小数点インストラクションと、２つのレジスタを１ワード分のオペランドとして扱う倍精度の浮動小数点インストラクションとがインストラクションセットに含まれている。
【００２７】
そして、アセンブリコード変換方法及び装置では、上記プログラムコード中の浮動小数点インストラクションのうち、オペランドを代入したレジスタが他のインストラクションにより参照されるまでのインストラクション数が、当該浮動小数点インストラクションの実行サイクル数よりも短くなっているインターロックドインストラクションを検出するインターロック検出処理と、上記インターロックドインストラクションがオペランドを参照及び代入するレジスタアドレスを、上記コンパイルの際にインストラクションのオペランドとして割り当てられないレジスタアドレスに、変更するアドレスリネーミング処理と、上記インターロックドインストラクションから、当該インターロックドインストラクション以降にある最初のラベル文又は分岐処理のインストラクションまでの各インストラクションのうち、インターロックドインストラクションとの間にある全てのインストラクションとレジスタの依存関係のないインストラクションを検出し、検出したインストラクションのコードを、上記インターロックドインストラクションから当該インターロックドインストラクションによりオペランドが代入されたレジスタを参照するインストラクションまでの間のいずれかの位置に移動するコード並べ替え処理とを行う。
【００２８】
【発明の実施の形態】
以下、本発明の実施の形態として、高水準プログラミング言語で記述されたソースプログラムを、ＣＰＵやＤＳＰ等のプロセッサが実行する実行形式のプログラムコードに変換する、コード変換方法（いわゆる広義のコンパイル方法）について説明をする。
【００２９】
なお、本実施の形態のコード変換方法で生成された実行形式のプログラムコードを実行するＣＰＵやＤＳＰ等のプロセッサは、少なくとも浮動小数点値をオペランドとした演算や処理を行うインストラクションセットに基づき動作する浮動小数点演算ユニットを備えているものとする。また、このプロセッサは、浮動小数点演算ユニットが実行する命令（インストラクション）のオペランドを格納する浮動小数点レジスタを複数備えているものとする。さらに、浮動小数点レジスタには、０から始まる連続したアドレス（例えば、０〜３１）が設定されているものとする。また、さらに、このプロセッサは、単精度の浮動小数点演算命令並びに倍精度の浮動小数点演算命令をインストラクションセットに備えているものとする。
【００３０】
図１に、本発明の実施の形態のコード変換方法の処理フローを示す。
【００３１】
本発明の実施の形態のコード変換方法では、例えばＣ言語等の高水準プログラミング言語で記述されたソースプログラムを、コンパイラによって、目的のプロセッサのアセンブリコードに変換する（ステップＳ１）。アセンブリコードは、１行で１つの命令が記述されており、その命令のオペランドがデータプロセッサのハードウェア上のレジスタアドレスで直接表されているプログラムコードである。続いて、アセンブリコード最適化処理装置により、コンパイラにより生成されたアセンブリコードを、実行効率のよいアセンブリコードに変換する（ステップＳ２）。続いて、アセンブリコードを、アセンブラによって目的のデータプロセッサの機械語に変換する（ステップＳ３）。続いて、機械語で記述された複数のプログラムをリンカによって合成し、目的のデータプロセッサが実行可能な実行形式のコードに変換される（ステップＳ４）。
【００３２】
図２に、上記ステップＳ２におけるアセンブリコード最適化処理装置によるアセンブリコード最適化処理フローを示す。
【００３３】
アセンブリコード最適化処理装置では、図２に示すように、中間コードの生成処理（ステップＳ１１）、ラベルコードの生成処理（ステップＳ１２）、レジスタ使用状況コードの生成処理（ステップＳ１３）、レジスタ使用状況コードの解析処理（ステップＳ１４）、レジスタのリネーミング処理（ステップＳ１５）、不要命令の削除処理（ステップＳ１６）、コード並べ替え処理（ステップＳ１７）、アセンブリコードの生成処理（ステップＳ１８）を、Ｓ１１〜Ｓ１８のステップ番号順に行い、アセンブリコードの最適化処理を行う。各ステップにおける具体的な処理を以下に説明する。
【００３４】
（ステップＳ１１　中間コードの生成処理）
ステップＳ１１の中間コードの生成処理は、図３に示すような、アセンブリコードの各行に一対一で対応した中間コードを生成する処理である。中間コードは、図３に示すように、対応するアセンブリコードの先頭行から順番を示す行番号と、対応するアセンブリコードの文字列と、対応するアセンブリコードのラベル名（ラベル名がない場合には空白）と、対応するアセンブリコードの命令の内容と、対応するアセンブリコードのオペランドとから構成される。
【００３５】
図４に、中間コードの生成処理の処理フローを示す。
【００３６】
中間コードの生成処理では、図４に示すステップＳ１１−１から処理が開始される。
【００３７】
まず、ステップＳ１１−１において、コンパイラにより生成されたアセンブリコードが格納されたファイルから、アセンブリコードを先頭から１行分読み込む。続くステップ１１−２では、読み込んだアセンブリコードに対応した中間コードを生成する。続くステップＳ１１−３では、最終行のアセンブリコードまで読み込んだか否かを判断する。アセンブリコードを最終行まで読み込んでいなければステップＳ１１−３からステップＳ１１−１に戻って、次の行のアセンブリコードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本中間コードの生成処理を終了する。
【００３８】
なお、中間コードは、アセンブリコード最適化処理装置内のメモリ上に保持される。メモリ上に保持された各中間コードには、図５に示すように、１つ前の行（先頭行はスタートコード）を指し示すインデックスと、１つ後ろの行（末尾の行はエンドコード）を指し示すインデックスとが設けられている。そのため、メモリ内に格納されている中間コード群は、任意の行から前方向及び後ろ方向に１つずつコード検索可能とされた双方向の線形リストとして保持される。
【００３９】
（ステップＳ１２　ラベルコードの生成処理）
ステップＳ１２のラベルコードの生成処理では、ステップＳ１１で生成した中間コードに基づき、図６に示すようなアセンブリコード中のラベル文に一対一で対応したラベルコードを生成する。つまり、本ラベルコード生成処理により生成されるラベルコード群は、アセンブリコードのラベル文に一対一で対応したコード群となる。ラベルコードは、図６に示すように、対応するラベル文のラベル名と、対応するラベル文のアセンブリコードの先頭からの順番を示す行番号と、対応するラベル文をジャンプ先として指定している分岐命令の行番号とから構成される。
【００４０】
図７に、ラベルコードの生成処理の処理フローを示す。
【００４１】
ラベルコードの生成処理では、図７に示すステップＳ１２−１から処理が開始される。
【００４２】
まず、ステップＳ１２−１において、中間コードを先頭行から１行分読み込む。続くステップＳ１２−２では、読み込んだ中間コードに対応するアセンブリコードがラベル文であるか否かを判断する。ラベル文であると判断した場合にはステップＳ１２−３に進み、ラベル文ではないと判断した場合にはステップＳ１２−４に進む。
【００４３】
ステップＳ１２−３では、読み込んだ中間コードに基づきラベルコードを１行生成する。ステップＳ１２−３の処理を終えるとステップＳ１２−１に戻り、次の行の中間コードを１行読み込み、繰り返し処理を行う。
【００４４】
ステップＳ１２−４では、読み込んだ中間コードに対応するアセンブリコードが分岐命令か否かを判断する。分岐命令であればステップＳ１２−５に進み、分岐命令ではなければステップＳ１２−６に進む。
【００４５】
ステップＳ１２−５では、読み込んだ中間コードの文字列から分岐先又はジャンプ先のラベル名を抽出し、抽出したラベル名がこれまでに生成したラベルコードにあるかを検索する。抽出したラベル名をこれまでに生成したラベルコードから見つけ出した場合には、その見つけ出したラベルコードに、当該分岐命令の行番号を登録する。
【００４６】
なお、これまでに生成したラベルコード中からラベル名が見つけ出されたということは、そのラベル名が記述された行から、その分岐命令が記述された行までの間が、繰り返し文であることを意味している。ラベル名が見つけ出せなければ、そのままステップＳ１２−５の処理を抜ける。ステップＳ１２−５の処理を抜けるとステップＳ１２−１に戻り次の行の中間コード１行読み込み、繰り返し処理を行う。
【００４７】
ステップＳ１２−６では、最終行の中間コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１２−１に戻って、次の行のアセンブリコードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本ラベルコードの生成処理を終了する。
【００４８】
なお、ラベルコードは、アセンブリコード最適化処理装置内のメモリ上に保持される。メモリ上に保持された各ラベルコードには、中間コードと同様に、１つ前の行（先頭行はスタートコード）を指し示すインデックスと、１つ後ろの行（末尾の行はエンドコード）を指し示すインデックスとが設けられている。そのため、メモリ内に格納されているラベルコード群は、任意の行から前方向及び後ろ方向に１つずつコード検索可能とされた双方向の線形リストとして保持される。
【００４９】
（ステップＳ１３　レジスタ使用状況コードの生成処理）
ステップＳ１３のレジスタ使用状況コードの生成処理では、中間コードに基づき、図８に示すような、アセンブリコードの各行に一対一で対応したレジスタ使用状況コードを生成する。レジスタ使用状況コードは、図８に示すように、対応するアセンブリコードのラベル名と、対応するアセンブリコードの先頭行からの行番号と、対応するアセンブリコードが繰り返し文の起点となるラベル文であるか否かを示す繰り返し文フラグと、対応するアセンブリコードの命令文字列と、対応するアセンブリコードの命令内容が浮動小数点命令であるか否かを示す浮動小数点フラグと、対応するアセンブリコードの命令の実行サイクル数と、対応するアセンブリコードを実行している際の浮動小数点レジスタの使用状況を示すレジスタ状態情報とから構成される。
【００５０】
レジスタ状態情報は、浮動小数点レジスタの全てのレジスタに対応して設けられている。つまり、レジスタ状態情報は、１つのレジスタ使用状況コード内に、レジスタ数分設けられていることとなる。レジスタ状態情報には、そのアセンブリコードの実行時におけるレジスタの使用状態が登録される。具体的には、下記の５つの状態が登録される。
【００５１】
［１］浮動小数点演算用レジスタに値が代入されたときの状態（ＤＳＴ状態）
［２］浮動小数点演算用レジスタの値が参照されたときの状態（ＲＥＦ状態）
［３］浮動小数点演算用レジスタの値が参照及び代入が同一サイクルで行われたときの状態（Ｄ−Ｒ状態）
［４］ＤＳＴ状態、ＲＥＦ状態及びＤ−Ｒ状態ではなく、浮動小数点演算用レジスタに有効な値が格納されている状態（ＵＳＥ状態）
［５］ＤＳＴ状態、ＲＥＦ状態、Ｄ−Ｒ状態及びＵＳＥ状態ではない状態、つまり、浮動小数点演算用レジスタに有効な値がされていない状態（ＥＭＰＴＹ状態）
【００５２】
図９に、レジスタ使用状況コードの生成処理の処理フローを示す。
【００５３】
レジスタ使用状況コードの生成処理では、図９に示すステップＳ１３−１から処理が開始される。
【００５４】
まず、ステップＳ１３−１において、中間コードを先頭行から１行分読み込む。続くステップＳ１３−２では、読み込んだ中間コードに対応したレジスタ使用状況コードを、１行分生成する。この際、その行の命令内容を判断して、浮動小数点演算命令であれば、浮動小数点演算フラグをオンとし、浮動小数点演算命令であれば、浮動小数点演算フラグをオフとする。また、外部から与えられる命令サイクル，パイプライン情報を参照して、その行の命令の実行サイクル数も登録する。また、繰り返し文フラグは、オフとしておく。
【００５５】
続くステップＳ１３−３では、読み込んだ中間コードに対応するアセンブリコードがラベル文であるか否かを判断する。ラベル文であると判断した場合にはステップＳ１３−４に進み、ラベル文ではないと判断した場合にはステップＳ１３−６に進む。
【００５６】
ステップＳ１３−４では、読み込んだ中間コードに登録されている行番号に対応するラベルコードを読み出し、そのラベルコードに登録されている分岐命令行番号を記憶する。続くステップＳ１３−５では、レジスタ使用状況コードの繰り返し文フラグをオンに登録する。このステップＳ１３−５の処理を終えると、ステップＳ１３−６に進む。
【００５７】
ステップＳ１３−６では、レジスタ使用状況コードの繰り返しフラグがオンとなっているか否かを判断する。繰り返しフラグがオンとなっている場合には、ステップＳ１３−７に進み、オフとなっている場合には、ステップＳ１３−１０に進む。
【００５８】
ステップＳ１３−７では、読み込んだ中間コードの行番号と、ステップＳ１３−４で記憶した分岐命令行番号とを比較し、読み込んだ中間コードの行番号が、分岐命令行番号よりも大きいか否かを判断する。つまり、対応するアセンブリコードが繰り返し文の起点となるラベル文であるか否かを判断する。読み込んだ中間コードの行番号が分岐命令行番号よりも大きい場合には、ステップＳ１３−８に進み、小さい場合には、ステップＳ１３−９に進む。ステップＳ１３−８では、繰り返し文フラグをオンとする。ステップＳ１３−９では、繰り返し文フラグをオフとする。ステップＳ１３−８及びステップＳ１３−９の処理を終えると、ステップＳ１３−１０に進む。
【００５９】
ステップＳ１３−１０では、レジスタ使用状況コードの浮動小数点フラグがオンとなっているか否かを判断する。つまり、対応するアセンブリコードが浮動小数点命令であるか否かを判断する。浮動小数点フラグがオンとなっている場合にはステップＳ１３−１１に進み、浮動小数点フラグがオフとなっている場合にはステップＳ１３−１２に進む。
【００６０】
ステップＳ１３−１１では、対応するアセンブリコードの命令内容とそのオペランドを参照して、その実行命令で参照するレジスタのアドレス、その実効命令の演算結果を代入するアドレスを検出し、各浮動小数点レジスタが、ＤＳＴ状態であるか、ＲＥＦ状態であるか、Ｄ−Ｆ状態であるか、或いはそれ以外の状態であるかを判断する。そして、その結果判断された各状態（ＤＳＴ状態、ＲＥＦ状態、Ｄ−Ｆ状態）をレジスタ状態情報に登録する。なお、この際、ＤＳＴ状態、ＲＥＦ状態、Ｄ−Ｆ状態以外の状態の浮動小数点レジスタは、ＥＭＰＴＹ状態として登録しておく。ステップＳ１３−１１の処理を終えるとステップＳ１３−１２に進む。
【００６１】
ステップＳ１３−１２では、最終行の中間コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１３−１に戻って、次の行の中間コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本レジスタ使用状況コードの生成処理を終了する。
【００６２】
なお、レジスタ使用状況コードは、アセンブリコード最適化処理装置内のメモリ上に保持される。メモリ上に保持された各レジスタ使用状況コードには、中間コードと同様に、１つ前の行（先頭行はスタートコード）を指し示すインデックスと、１つ後ろの行（末尾行はエンドコード）を指し示すインデックスとが設けられている。そのため、メモリ内に格納されているレジスタ使用状況コード群は、任意の行から前方向及び後ろ方向に１つずつコード検索可能とされた双方向の線形リストとして保持される。
【００６３】
以上のように生成されたレジスタ使用状況コードは、例えば、図１０、図１１、図１２に示すようになる。図１０は、レジスタアドレス＄ｆ０〜１０を示しており、図１１は、レジスタアドレス＄ｆ１１〜２１を示しており、図１２は、レジスタアドレス＄ｆ２２〜３１を示している。なお、この図１０〜図１２では、レジスタ状態情報の空白部分がＥＭＰＴＹ状態を示している。
【００６４】
（ステップＳ１４　レジスタ使用状況コードの解析処理）
ステップＳ１４のレジスタ使用状況コードの解析処理では、ＵＳＥ状態である浮動小数点レジスタを見つけ出し、レジスタ状態情報にＵＳＥ状態を登録する処理を行う。上記ステップＳ１３のレジスタ使用状況コードの生成処理では、レジスタ状態情報には、まだＵＳＥ状態の登録はされていない。ここでは、ＵＳＥ状態のレジスタを見つけ出し、レジスタ使用状況コード内のレジスタ状態情報の内容を完成させる。
【００６５】
ところで、ＵＳＥ状態とは、有効なデータが格納されているレジスタの状態である。つまり、その浮動小数点レジスタが、ＤＳＴ状態となってからＲＥＦ状態となるまでの間の状態である。また、ＲＥＦ状態になったのち再度ＲＥＦ状態となる場合も、そのＲＥＦ状態とＲＥＦ状態との間のレジスタは、ＵＳＥ状態である。従って、まず、ＲＥＦ状態となっているレジスタを見つけ出し、そのレジスタの状態を前方向に検索しながら、そのレジスタがＤＳＴ状態となる命令（或いはＲＥＦ状態となる命令）となるまで、ＵＳＥ状態に登録していけばよい。なお、ＤＳＴ状態、ＲＥＦ状態、Ｄ−Ｒ状態及びＵＳＥ状態以外の状態は、有効なデータが格納されていないＥＭＰＴＹ状態である。したがって、ＵＳＥ状態を登録したのちの残りのレジスタの状態を全てＥＭＴＥＹ状態とすればよい。
図１３に、レジスタ使用状況コードの解析処理の処理フローを示す。
【００６６】
レジスタ使用状況コードの解析処理は、図１３に示すステップＳ１４−１から処理が開始される。
【００６７】
まず、ステップＳ１４−１において、レジスタ使用状況コードを先頭行から１行分読み込む。続くステップＳ１４−２では、読み込んだ浮動小数点使用状況コードの浮動小数点フラグがオンであるか否かを判断する。オンである場合には、ステップＳ１４−３に進み、オフである場合には、ステップＳ１４−８に進む。
【００６８】
ステップＳ１４−３では、読み込んだ浮動小数点使用状況コード内のレジスタ状態情報を参照し、ＲＥＦ状態又はＤ−Ｒ状態のレジスタを検出する。このレジスタのアドレスを参照レジスタとして記憶する。ＲＥＦ状態又はＤ−Ｒ状態のレジスタがあった場合にはステップＳ１４−４に進み、ＲＥＦ状態又はＤ−Ｒ状態のレジスタがない場合にはステップＳ１４−７に進む。
【００６９】
ステップＳ１４−４では、読み込んだ浮動小数点使用状況コードに付けられているインデックスを参照して、前の行のレジスタ使用状況コードを読み出す。続くステップＳ１４−５では、ステップＳ１４−４で読み出したレジスタ使用状況コードから、上記参照レジスタのレジスタ状態情報を参照し、ＤＳＴ状態、ＲＥＦ状態又はＤ−Ｒ状態であるか否かを判断する。ＤＳＴ状態、ＲＥＦ状態又はＤ−Ｒ状態でない場合にはステップＳ１４−６に進み、ＤＳＴ状態、ＲＥＦ状態又はＤ−Ｒ状態である場合にはステップＳ１４−７に進む。ステップＳ１４−６では、参照レジスタのレジスタ状態情報に、ＵＳＥ状態を登録する。このステップＳ１４−６の処理を終えると、ステップＳ１４−４に進み、繰り返し処理を行う。なお、上記ステップＳ１４−４からステップＳ１４−６の処理は、ステップＳ１４−３で見つけ出した全てのＲＥＦ状態の参照レジスタに対して行われる。
【００７０】
ステップＳ１４−７では、読み込んでいるレジスタ使用状況コードを、ステップＳ１４−１で読み込んだ行にリセットし、最終行のレジスタ使用状況コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１４−１に戻って、次の行のレジスタ使用状況コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本レジスタ使用状況コードの解析処理を終了する。
【００７１】
以上のように処理が行われることによって、例えば図１０〜図１２に示したレジスタ使用状況コードは、図１４、図１５、図１６に示すようになる。図１４は、レジスタアドレス＄ｆ０〜１０を示しており、図１５は、レジスタアドレス＄ｆ１１〜２１を示しており、図１６は、レジスタアドレス＄ｆ２２〜３１を示している。なお、この図１４〜図１６では、レジスタ状態情報の空白部分がＥＭＰＴＹ状態を示しており、ハッチング部分がＵＳＥ状態を示している。このようにレジスタ使用状況コードの解析処理では、レジスタ状態情報を行単位で逆方向に検索し、逆方向で検索していった場合におけるＲＥＦ状態からＤＳＴ状態（又はＲＥＦ状態，Ｄ−Ｒ状態）までの間を、ＵＳＥ状態として登録する。
【００７２】
なお、図１４〜図１６のレジスタ状態情報に示すように、浮動小数点レジスタは、偶数番号のアドレスしか使用されておらず、奇数番号のアドレスは、全てＥＭＰＴＹ状態となっている。
【００７３】
（ステップＳ１５　レジスタのリネーミング処理）
ステップＳ１５のレジスタのリネーミング処理では、アセンブリコード内のインターロックが発生している浮動小数点命令を検出し、インターロックが発生している浮動小数点命令間で共通に用いているレジスタを、他のレジスタに移動する処理を行う。
【００７４】
ここで、インターロック状態とは、ある浮動小数点命令の実行が完了するより前に、その代入値を参照する浮動小数点命令が実行されないように、その代入値を参照する浮動小数点命令のパイプラインが待機させられる状態をいう。つまり、ある浮動小数点命令（Ａ命令）と、このＡ命令の演算結果を参照するＢ命令があったとする。この場合、Ａ命令とＢ命令との命令間隔が、Ａ命令の実行サイクルＸ以下である場合に、Ａ命令とＢ命令とはインターロックが発生している。
【００７５】
具体的に、図１７にインターロックが発生している場合のアセンブリコードを示す。図１７に示すアセンブリコードでは、Ｎ行目で単精度の減算命令ｓｕｂ．ｓが行われ、Ｎ＋１行目で単精度のメモリへの格納命令ｓ．ｓが行われる。Ｎ行目の減算命令ｓｕｂ．ｓでは演算結果をアドレス＄ｆ２のレジスタに代入し、Ｎ＋１行目の格納命令ｓ．ｓではアドレス＄ｆ２のレジスタからメモリへデータを格納している。ここで、各命令の実行サイクルが２サイクルであったとすると、Ｎ＋１行目の格納命令ｓ．ｓは、Ｎ行目の減算命令ｓｕｂ．ｓのパイプラインが全て完了するまで実行することができなくなり、インターロックが発生する。
【００７６】
同様に、図１７に示すアセンブリコードでは、Ｍ行目で単精度のメモリからのロード命令ｌ．ｓが行われ、Ｍ＋１行目で単精度の減算命令ｓｕｂ．ｓが行われる。Ｍ行目のメモリからのロード命令ｌ．ｓではデータをアドレス＄ｆ２８のレジスタに代入し、Ｍ＋１行目の減算命令ｓｕｂ．ｓではアドレス＄ｆ２８のレジスタを参照して減算が行われている。そのため、Ｍ＋１行目の退避命令ｓｕｂ．ｓは、Ｍ行目のロード命令ｌ．ｓのパイプラインが全て完了するまで実行することができなくなり、インターロックが発生してしまう。
【００７７】
ステップＳ１５のレジスタのリネーミング処理では、以上のようなインターロック状態にある命令間のレジスタのアドレスを、コンパイラによって割り当てられないレジスタ、つまり、奇数番号レジスタに移動する処理を行う。
図１８に、レジスタのリネーミング処理の処理フローを示す。
【００７８】
レジスタのリネーミング処理では、図１８に示すステップＳ１５−１から処理が開始される。
【００７９】
まず、ステップＳ１５−１において、レジスタ使用状況コードを先頭行から１行分読み込む。続くステップＳ１５−２では、読み込んだ浮動小数点使用状況コードの浮動小数点フラグがオンであるか否かを判断する（ステップＳ１５−２）。オンである場合にはステップＳ１５−３に進み、オフである場合にはステップＳ１５−５に進む。
【００８０】
ステップＳ１５−３では、レジスタ状態情報を参照してＤＳＴ状態のレジスタを検出し、このレジスタが次にＲＥＦ状態となるまでの命令サイクル数を検出する。つまり、当該命令により代入された値が、他の命令により参照されるまでの命令サイクル数を検出する。そして、当該命令により代入された値が他の命令により参照されるまでの命令サイクル数と、当該命令を実行した場合のサイクル数とを比較する。比較した結果、当該命令により代入された値が他の命令により参照されるまでの命令サイクル数よりも、当該命令を実行した場合のサイクル数のほうが大きい場合、つまり、当該命令と上記他の命令間にインターロックが発生している場合には、ステップＳ１５−４に進む。インターロックが発生していない場合には、ステップＳ１５−５に進む。
【００８１】
ステップＳ１５−４では、インターロックが発生している命令間で共通に使用されているレジスタのアドレスを、コンパイラでは割り当てられないレジスタのアドレス、つまり、奇数番号のレジスタアドレスに移動する。ステップＳ１５−４の処理を抜けると、ステップＳ１５−５に進む。
【００８２】
ステップＳ１５−５では、最終行のレジスタ使用状況コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１５−１に戻って、次の行のレジスタ使用状況コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本レジスタのリネーミング処理を終了する。
【００８３】
以上のようにレジスタのリネーミング処理を行った結果、インターロックが発生している命令間で使用されているレジスタのアドレスが、従来では使用されていなかった奇数番号のアドレスに移動されることとなる。図１７に示したアセンブリコードに対して上記のレジスタのリネーミング処理を行うことによって、例えば、Ｎ行目、Ｎ＋１行目のレジスタのアドレスが＄ｆ２から＄ｆ１に移動され、Ｍ行目，Ｍ＋１行目のレジスタのアドレスが＄ｆ２８から＄ｆ３に移動される。
【００８４】
（ステップＳ１６　不要命令の削除処理）
ステップＳ１６の不要命令の削除処理では、上記のレジスタのリネーミング処理に伴い発生する不要なメモリ退避命令（ストア命令）及びレジスタ復帰命令（ロード命令）を検出し、これらを削除する処理を行う。
図２０に、不要命令の削除処理の処理フローを示す。
【００８５】
不要命令の削除処理は、図２０に示すステップＳ１６−１から処理が開始される。
【００８６】
まず、ステップＳ１６−１において、レジスタ使用状況コードを先頭行から１行分読み込む。続くステップＳ１６−２では、読み込んだ浮動小数点使用状況コードの命令内容を解析し、命令内容が、整数レジスタ（固定小数点レジスタ）或いはメモリへの退避命令（ストア命令）であるか否かを判断する。退避命令である場合にはステップＳ１６−３に進み、退避命令でない場合にはステップＳ１６−１０に進む。
【００８７】
ステップＳ１６−３では、退避命令の退避先となる固定小数点レジスタのアドレス及びメモリのアドレスを記憶する。続くステップＳ１６−４では、読み込んだ浮動小数点使用状況コードに付けられているインデックスを参照して、１つ後ろの行のレジスタ使用状況コードを読み出す。続くステップＳ１６−５では、退避先のアドレスからデータを復帰する復帰命令であるか否かを判断する。復帰命令であればステップＳ１６−７に進み、復帰命令でなければステップＳ１６−６に進む。ステップＳ１６−６では、インデックスを参照して後ろの行のレジスタ使用状況コードが存在するか否かを判断する。存在する場合にはステップＳ１６−４に戻り、繰り返し処理を行う。存在しない場合にはステップＳ１６−９に進む。
【００８８】
ステップＳ１６−７では、退避命令から復帰命令までの間に、退避されていたデータの内容が変化していないか否かを判断する。データ内容が変化していない場合にはステップＳ１６−８に進み、データ内容が変化している場合にはステップＳ１６−９に進む。
【００８９】
ステップＳ１６−８では、検出した退避命令と復帰命令とを、レジスタ使用状況コードから削除するとともに、退避するデータを代入した命令と復帰したデータを参照する命令とを検出し、これらの命令間で共通に使用されているレジスタのアドレスを、コンパイラでは割り当てられないレジスタのアドレス、つまり、奇数番号のレジスタアドレスに移動する。
【００９０】
ステップＳ１６−９では、読み込んでいるレジスタ使用状況コードを、ステップＳ１６−１で読み込んだ行にリセットし、最終行のレジスタ使用状況コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１６−１に戻って、次の行のレジスタ使用状況コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本不要命令の削除処理を終了する。
【００９１】
以上のように不要命令の削除処理を行った結果、メモリの退避命令及びメモリの復帰命令が削除されるとともに、退避前の命令と復帰後の命令間で使用されているレジスタのアドレスが、従来では使用されていなかった奇数番号のアドレスに移動されることとなる。例えば、図１９に示したアセンブリコードに対して上記の不要命令の削除処理を行うことによって、例えば、図２１に示すように、Ｎ＋１行目の退避命令と、Ｍ行目の復帰命令が削除される。
【００９２】
（ステップＳ１７　コード並べ替え処理）
ステップＳ１７のコード並べ替え処理では、インターロックが発生している命令を検出し、インターロックが発生している命令間に、他の命令を移動する処理を行う。
【００９３】
移動対象となる命令は、インターロックが発生している命令より後の命令である。また、移動対象となる命令は、インターロックが発生している命令から当該移動対象となる命令までの間の全ての命令と、レジスタ間の依存関係がない命令である必要がある。レジスタ間の依存関係がない命令とは、命令を移動したことによって、他の命令に対して影響を与えない命令である。また、命令の移動は、ラベル文及び分岐命令を超えないようにする。
【００９４】
図２２に、コード並べ替え処理の処理フローを示す。
【００９５】
コード並べ替え処理は、図２２に示すステップＳ１７−１から処理が開始される。
【００９６】
まず、ステップＳ１７−１において、レジスタ使用状況コードを先頭行から１行分読み込む。続くステップＳ１７−２では、読み込んだ浮動小数点使用状況コードの浮動小数点フラグがオンであるか否かを判断する。オンである場合にはステップＳ１７−３に進み、オフである場合にはステップＳ１７−８に進む。
【００９７】
ステップＳ１７−３では、レジスタ状態情報を参照してＤＳＴ状態のレジスタを検出し、このレジスタが次にＲＥＦ状態となるまでの命令サイクル数を検出する。つまり、当該命令により代入された値が、他の命令により参照されるまでの命令サイクル数を検出する。そして、当該命令により代入された値が他の命令により参照されるまでの命令サイクル数と、当該命令を実行した場合のサイクル数を検出とを比較する。比較した結果、当該命令により代入された値が他の命令により参照されるまでの命令サイクル数よりも、当該命令を実行した場合のサイクル数のほうが大きい場合、つまり、当該命令と上記他の命令間にインターロックが発生している場合には、ステップＳ１７−４に進む。インターロックが発生していない場合には、ステップＳ１７−８に進む。
【００９８】
ステップＳ１７−４では、読み込んだ浮動小数点使用状況コードに付けられているインデックスを参照して、１つ後ろの行のレジスタ使用状況コードを読み出す。続くステップＳ１７−５では、読み込んでいるレジスタ使用状況コードがラベル文又は分岐命令であるか否かを判断する。ラベル文又は分岐命令である場合には、ステップＳ１７−８に進む。ラベル文又は分岐命令でない場合には、ステップＳ１７−６に進む。ステップＳ１７−６では、読み込んだレジスタ使用状況コードに記述されている命令が、上記インターロックが発生している命令から本命令までの間の全命令と、レジスタ間の依存関係があるか否かを判断する。依存関係がない場合には、ステップＳ１７−７に進み、依存関係がある場合にはステップＳ１７−４から処理を繰り返す。
【００９９】
ステップＳ１７−７では、読み込んでいる浮動小数点使用状況コードの行番号を、上記ステップＳ１７−３で検出したインターロックが発生している命令間の行番号に置き換えて、浮動小数点使用状況コードの並べ替えをする。続いて、読み込んでいる浮動小数点使用状況コードをステップＳ１７−１の行番号にリセットし、ステップＳ１７−３に戻り処理を繰り返す。
【０１００】
ステップＳ１７−８では、最終行のレジスタ使用状況コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１７−１に戻って、次の行のレジスタ使用状況コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本コード並べ替え処理を終了する。
【０１０１】
以上のようにコード並べ替え処理を行った結果、インターロックが発生していた命令間に、レジスタの依存関係のない命令が挿入されるので、インターロックが回避されることとなる。例えば、図２３（Ａ）に示すようなインターロックが発生している場合であっても（Ｎ＋１行とＮ＋２行の間，Ｎ＋４行とＮ＋５行の間）、本コード並べ替え処理を行うことによって、図２３（Ｂ）に示すように、インターロックが発生していた命令間に、レジスタの依存関係のない命令が挿入され、インターロックが回避される。
【０１０２】
（ステップＳ１８　アセンブリコードの生成処理）
ステップＳ１８のアセンブリコードの生成処理では、レジスタ使用状況コードから、アセンブリコードの命令文字列、及び、レジスタ状態情報から、アセンブリコードを生成する処理を行う。
【０１０３】
図２４に、アセンブリコードの生成処理の処理フローを示す。
【０１０４】
アセンブリコードの生成処理は、図２４に示すステップＳ１８−１から処理が開始される。
【０１０５】
まず、ステップＳ１８−１において、レジスタ使用状況コードを先頭から１行分読み込む。続くステップＳ１８−２では、読み込んだレジスタ使用状況コードに対応したアセンブリコードを生成する。続くステップＳ１８−３では、最終行のレジスタ使用状況コードまで読み込んだか否かを判断する。最終行まで読み込んでいなければステップＳ１８−１に戻って、次の行のレジスタ使用状況コードを１行読み込み、繰り返し処理を行う。最終行まで読み込んでいれば、本アセンブリコードの生成処理を終了する。
【０１０６】
以上のように生成されたアセンブリコードは、例えばファイルに格納される。
【０１０７】
以上のように本発明の実施の形態のコード変換方法では、コンパイラでは割り当てられないアドレスの浮動小数点レジスタを有効利用して、浮動小数点命令のコードの並べ替えを行っている。
【０１０８】
このため、本実施の形態のコード変換方法では、命令数を減少させるとともに、インターロックの発生を回避することができる。そのため、本実施の形態のコード変換方法では、プログラムの実行効率を向上させることができる。
【０１０９】
なお、本実施の形態では、アセンブリコード最適化処理装置とを、高水準言語からアセンブリコードへのコンパイルとは別の処理として行っているが、コンパイラと一体的に処理を行ってもよい。
【０１１０】
【発明の効果】
本発明にかかるアセンブリコード変換方法及び装置では、プログラムの実行効率を向上させることができる。
【図面の簡単な説明】
【図１】本発明の実施の形態のコード変換方法の処理内容を示したフローチャートである。
【図２】図１のアセンブリコード最適化処理装置の処理内容を示したフローチャートである。
【図３】中間コードのデータ構成を示す図である。
【図４】中間コードの生成処理内容を示したフローチャートである。
【図５】双方向線形リスト状に保持されている中間コードを説明するための図である。
【図６】ラベルコードのデータ構成を示す図である。
【図７】ラベルコードの生成処理内容を示すフローチャートである。
【図８】浮動小数点レジスタ使用状況コードのデータ構成を示す図である。
【図９】浮動小数点レジスタ使用状況コードの生成処理内容を示すフローチャートである。
【図１０】上記図９に示す処理で生成された浮動小数点使用状況コード（レジスタアドレス＄ｆ０〜＄ｆ１０）のイメージ図である。
【図１１】上記図９に示す処理で生成された浮動小数点使用状況コード（レジスタアドレス＄ｆ１１〜＄ｆ２１）のイメージ図である。
【図１２】上記図９に示す処理で生成された浮動小数点使用状況コード（レジスタアドレス＄ｆ２２〜＄ｆ３１）のイメージ図である。
【図１３】浮動小数点レジスタ使用状況コードの解析処理内容を示すフローチャートである。
【図１４】上記図１３に示す処理を行った後の浮動小数点使用状況コード（レジスタアドレス＄ｆ０〜＄ｆ１０）のイメージ図である。
【図１５】上記図１３に示す処理を行った後の浮動小数点使用状況コード（レジスタアドレス＄ｆ１１〜＄ｆ２１）のイメージ図である。
【図１６】上記図１３に示す処理を行った後の浮動小数点使用状況コード（レジスタアドレス＄ｆ２２〜＄ｆ３１）のイメージ図である。
【図１７】インターロックが発生している場合のアセンブリコード例を示す図である。
【図１８】浮動小数点レジスタのリネーミング処理内容を示すフローチャートである。
【図１９】図１７に示したアセンブリコードに対してリネーミング処理を行った後のアセンブリコードを示す図である。
【図２０】不要命令の削除処理内容を示すフローチャートである。
【図２１】図１９に示したアセンブリコードに対して不要命令の削除処理を行った後のアセンブリコードを示す図である。
【図２２】コード並べ替え処理内容を示すフローチャートである。
【図２３】コード並べ替え処理を行う前のアセンブリコードと、行った後のアセンブリコードとを示す図である。
【図２４】アセンブリコードの生成処理内容を示すフローチャートである。
【図２５】従来のコード変換方法の処理手順を示す図である。
【図２６】倍精度の浮動小数点インストラクションを含むアセンブリコード記述例を示す図である。
【図２７】図２６のアセンブリコードを実行した際におけるレジスタ及びメモリの使用状態を示す図である。
【図２８】倍精度及び単精度の浮動小数点インストラクションを含むアセンブリコード記述例を示す図である。
【図２９】図２８のアセンブリコードを実行した際におけるレジスタ及びメモリの使用状態を示す図である。
【図３０】パイプライン構成のデータプロセッサにおけるインストラクションの並列実行処理タイミングについて説明するための図である。
【図３１】パイプライン構成のプロセッサがインターロックする場合のアセンブリコードを示す図である。
【図３２】図３１のアセンブリコードを実行した際におけるインストラクションの並列実行処理タイミングについて説明するための図である。
【図１】
2004013603.tif 000003
【図２】
2004013603.tif 000004
【図３】
2004013603.tif 000005
【図４】
2004013603.tif 000006
【図５】
2004013603.tif 000007
【図６】
2004013603.tif 000008
【図７】
2004013603.tif 000009
【図８】
2004013603.tif 000010
【図９】
2004013603.tif 000011
【図１０】
2004013603.tif 000012
【図１１】
2004013603.tif 000013
【図１２】
2004013603.tif 000014
【図１３】
2004013603.tif 000015
【図１４】
2004013603.tif 000016
【図１５】
2004013603.tif 000017
【図１６】
2004013603.tif 000018
【図１７】
2004013603.tif 000019
【図１８】
2004013603.tif 000020
【図１９】
2004013603.tif 000021
【図２０】
2004013603.tif 000022
【図２１】
2004013603.tif 000023
【図２２】
2004013603.tif 000024
【図２３】
2004013603.tif 000025
【図２４】
2004013603.tif 000026
【図２５】
2004013603.tif 000027
【図２６】
2004013603.tif 000028
【図２７】
2004013603.tif 000029
【図２８】
2004013603.tif 000030
【図２９】
2004013603.tif 000031
【図３０】
2004013603.tif 000032
【図３１】
2004013603.tif 000033
【図３２】
2004013603.tif 000034