(57)【特許請求の範囲】
【請求項１】
高級プログラミング言語で記述された原始プログラムを翻訳するコンパイル処理装置におけるレジスタ割当て処理方法において，
レジスタ割当て時に，レジスタを参照するペアメモリアクセス命令を検出し，第１要素および第２要素の対のペアレジスタ情報を設定する過程と，
定義部で割り当てるレジスタが，参照部のペアメモリアクセス命令のレジスタの第１要素もしくは第２要素であるか否かを判定する過程と，
前記定義部で割り当てるレジスタが前記第１要素のレジスタであるときには偶数レジスタを割り当て，前記第２要素のレジスタであるときには前記偶数レジスタに続く奇数レジスタを割り当てる過程とを有する
ことを特徴とするペアレジスタ割当て処理方法。
【請求項２】
高級プログラミング言語で記述された原始プログラムを翻訳するコンパイル処理装置において，
レジスタ割当て時に，レジスタを参照するペアメモリアクセス命令を検出し，第１要素および第２要素の対のペアレジスタ情報を設定するとともに，定義部で割り当てるレジスタが，参照部の命令のレジスタの第１要素もしくは第２要素であるか否かを判定し，第１要素である場合に，この命令の定義部に偶数レジスタを割り当てるための情報を設定し，第２要素である場合に，この命令の定義部に奇数レジスタを割り当てるための情報を設定する命令チェック手段と，
前記命令の定義部で割り当てるレジスタが前記第１要素のレジスタであるときには偶数レジスタを割り当て，前記第２要素のレジスタであるときには前記偶数レジスタに続く奇数レジスタを割り当てるレジスタ割当て手段とを備える
ことを特徴とするコンパイル処理装置。
【請求項３】
高級プログラミング言語で記述された原始プログラムを翻訳するコンパイラのプログラム記録媒体であって，
レジスタ割当て時に，レジスタを参照するペアメモリアクセス命令を検出し，第１要素および第２要素の対のペアレジスタ情報を設定する処理と，
定義部で割り当てるレジスタが，参照部のペアメモリアクセス命令のレジスタの第１要素もしくは第２要素であるか否かを判定する処理と，
前記定義部で割り当てるレジスタが前記第１要素のレジスタであるときには偶数レジスタを割り当て，前記第２要素のレジスタであるときには前記偶数レジスタに続く奇数レジスタを割り当てる処理とを，
計算機に実行させるプログラムを記録した
ことを特徴とするコンパイラのプログラム記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，ＦＯＲＴＲＡＮ，Ｃ言語，Ｃ＋＋言語等の高級プログラミング言語で記述された原始プログラムのコンパイルにおいて実行性能のよいオブジェクトプログラムの生成を可能としたペアレジスタ割当て処理方法に関する。
【０００２】
【従来の技術】
従来のコンパイラの処理において，最終的なオブジェクトプログラムの生成時におけるレジスタ番号の割当て処理では，命令の実行される順番に規則的にレジスタ番号を割り当てていた。
【０００３】
命令割当て時の最適化処理の段階で，１つの命令で２つのデータをメモリアクセスするペアメモリアクセス命令が割り当てられていても，その２つのデータを保持するレジスタが，偶数レジスタ（偶数番号のレジスタ），偶数レジスタ＋１の順で連続するレジスタ（これをペアレジスタという）でない場合には，命令の仕様（ハードウェアの制限）によりペアメモリアクセス命令として実行することができないため，ペアメモリアクセス命令に対するレジスタ割当て時に，そのペアメモリアクセス命令は，２つのシングルアクセス命令に分解されてオブジェクトプログラムに展開されていた。
【０００４】
図６は，従来技術による翻訳結果の例を示している。ｍｕｌｔ１命令では，乗算結果をレジスタｒｅｇＸに入れ，ｍｕｌｔ２命令では，乗算結果をレジスタｒｅｇＹに入れている。ｓｔｏｒｅ１命令は，レジスタｒｅｇＸの値をメモリにストアし，ｓｔｏｒｅ２命令は，レジスタｒｅｇＹの値を連続するメモリの位置にストアしている。
【０００５】
ここで，レジスタｒｅｇＸが偶数レジスタで，レジスタｒｅｇＹが偶数レジスタ＋１の連続したペアのレジスタであれば，図６に示すｓｔｏｒｅ１命令およびｓｔｏｒｅ２命令を，１つのペアメモリアクセス命令に置き換えて，オブジェクトプログラム中に展開する命令数を削減することができる。しかし，レジスタｒｅｇＸの定義部ｄ１とレジスタｒｅｇＹの定義部ｄ２の間の命令でレジスタ割当てが行われ，レジスタｒｅｇＸとレジスタｒｅｇＹとが，偶数番号から始まる連続したレジスタでなくなれば，レジスタｒｅｇＸの参照部ｒ１の命令と，レジスタｒｅｇＹの参照部ｒ２の命令とを，１つのペアメモリアクセス命令とすることはできず，図６に示すように，２つのシングルアクセス命令（ｓｔｏｒｅ１，ｓｔｏｒｅ２）として実行されることになる。
【０００６】
【発明が解決しようとする課題】
本発明は上記問題点の解決を図り，連続したメモリアクセス命令をペアレジスタに割り当てることで，翻訳結果であるオブジェクトプログラムの実行性能を向上させることを目的とする。
【０００７】
【課題を解決するための手段】
上記の問題を解決するため，本発明では，定義部で割り当てるレジスタが，参照部のペアメモリアクセス命令のレジスタの第１要素もしくは第２要素であるかを判定し，第１要素のレジスタならば偶数レジスタを割り当て，第２要素のレジスタならば奇数レジスタを割り当てる。
【０００８】
この際に，第２要素のレジスタとしたい偶数レジスタ＋１のレジスタには，ペアレジスタとして割り当てる旨の情報を設定し，レジスタが不足してレジスタの内容をメモリに退避する命令が出ない限りは，第２要素の定義部の命令まで，この偶数レジスタ＋１のレジスタを他の命令に割り当てないようにする。これにより，ペアメモリアクセス命令の実行が可能になる。
【０００９】
同様に，第１要素へのレジスタ割当てより先に第２要素に奇数レジスタを割り当てた場合には，第１要素のレジスタとしたい奇数レジスタ−１のレジスタには，ペアレジスタとして割り当てる旨の情報を設定し，第１要素の参照部の命令と第１要素の定義部の命令との間に，その奇数レジスタ−１のレジスタをできるだけ割り当てないようにする。
【００１０】
以上の処理を計算機によって実現するためのコンパイラのプログラムは，もちろん計算機が読み取り可能な可搬媒体メモリ，半導体メモリ，ハードディスクなどの適当な記録媒体に格納することができる。
【００１１】
【発明の実施の形態】
以下，本発明の実施の形態について説明する。図１に，本発明のブロック構成例を示す。処理装置１は，ＣＰＵおよびメモリ等からなる装置である。ソース（原始）プログラム２は，ＦＯＲＴＲＡＮ，Ｃ言語，Ｃ＋＋言語等の高級プログラミング言語で記述されたプログラムである。オブジェクトプログラム３は，ソースプログラム２を機械語命令列に翻訳した結果のプログラムである。
【００１２】
コンパイラ１０は，処理装置１で動作し，ソースプログラム２を入力して，それを翻訳（コンパイル）し，オブジェクトプログラム３を生成するプログラムである。コンパイラ１０は，ソースプログラム２を入力して構文解析を行い，内部データ（ここでは，この内部データを中間プログラムと呼ぶことにする）に変換するソースプログラム解析部１１と，中間プログラムについて効率のよい命令列を生成するための処理を行う最適化部１２と，最適化した結果の命令列について使用可能なレジスタを割り当てるレジスタ割当て部１３と，レジスタを割り当てた結果の命令列から，必要に応じて命令の並べ替え，組み合わせを行ってオブジェクトプログラム３のコードを生成するスケジューリング／コード生成部１４からなる。
【００１３】
本発明は，特にレジスタ割当て部１３の処理に関連しており，コンパイラ１０における他の部分の処理については，従来と同様でよいので，詳しい説明は省略する。
【００１４】
本発明においては，特にレジスタ割当て部１３に，ペア情報設定部２１とペア命令割当て情報設定部２２とを持つ命令チェック手段２０と，ペア命令定義部検出部３１とペアレジスタ割当て部３２とを持つレジスタ割当て手段３０とがある。命令チェック手段２０は，最適化部１２の出力した中間プログラムを検査し，レジスタ割当て前にペアメモリアクセス命令か否かを判定するもので，レジスタ割当て手段３０は，命令チェック手段２０による処理の結果，命令がペアメモリアクセス命令のときには，連続した偶数番号と奇数番号のレジスタの組からなるペアレジスタの割当てを行うものである。
【００１５】
命令チェック手段２０のペア情報設定部２１は，最適化部１２の出力した中間プログラムを，後方から１命令ずつチェックしていき，ペアメモリアクセス命令であるかどうかを判定し，ペアメモリアクセス命令の場合には，コンパイラ１０の作業用メモリ上に設けたペアレジスタ情報域に「対の情報（第１要素／第２要素）」を設定する。この処理と同時に，ペア命令割当て情報設定部２２は，最適化部１２の出力した中間プログラムを，後方から１命令ずつチェックしていき，ペアメモリアクセス命令の第１要素または第２要素の定義部が現れた場合に，第１要素の定義部には偶数レジスタを割り当てるための情報を設定し，また第２要素の定義部には偶数レジスタ＋１の奇数レジスタを割り当てるための情報を設定する。
【００１６】
レジスタ割当て手段３０のペア命令定義部検出部３１は，ペア命令割当て情報設定部２２が設定した情報からペアメモリアクセス命令の定義部を検出し，ペアレジスタ割当て部３２は，ペア命令定義部検出部３１が検出したペアメモリアクセス命令の第１要素のレジスタに偶数レジスタを割り当て，また，ペアメモリアクセス命令の第２要素のレジスタに奇数レジスタを割り当てる処理を行う。
【００１７】
図２に，命令チェック手段２０の処理の流れを示す。命令チェック手段２０では，ペア情報設定部２１により，中間プログラムの後方から順番に命令を調べ，着目した命令がペアメモリアクセス命令であるかどうかを判定し（ステップＳ１），ペアメモリアクセス命令であればペアレジスタ情報域に対の情報（第１要素，第２要素）を設定する（ステップＳ２）。また，ペア命令割当て情報設定部２２により，着目した命令がペアメモリアクセス命令の定義部かどうかを判定して（ステップＳ３），ペアメモリアクセス命令の定義部であれば，さらに第１要素であるかどうかを判定し（ステップＳ４），第１要素であれば，この命令の定義部に偶数レジスタを割り当てるための情報を設定し（ステップＳ５），第１要素でなければ，この命令の定義部に奇数レジスタを割り当てるための情報を設定する（ステップＳ６）。以上の処理をすべての命令について繰り返す。
【００１８】
次に，図３に，レジスタ割当て手段３０の処理の流れを示す。レジスタ割当て手段３０の処理は，中間プログラムの先頭の命令から後方へ向かって順番に行う。中間プログラムの先頭の命令から順番に使用可能なレジスタを割り当てていく際に，ペア命令定義部検出部３１により，ペアメモリアクセス命令の定義部かどうかを判定し（ステップＳ１１），定義部であれば，さらに第１要素であるかどうかを判定する（ステップＳ１２）。第１要素の場合には，第２要素に対してレジスタが割当て済みであるかどうかを判定して（ステップＳ１３），第２要素が割当て済みであれば，第１要素に，第２要素のレジスタ（奇数）−１のレジスタを割り当てる（ステップＳ１４）。第２要素が割当て済みでなければ，第１要素に偶数レジスタを割り当て（ステップＳ１５），第２要素に第１要素のレジスタ（偶数）＋１のレジスタを予約する（ステップＳ１６）。予約したレジスタは，レジスタが不足するなどの特別な場合を除き，第２要素以外への割当ては行わないようにする。
【００１９】
一方，ペアメモリアクセス命令の定義部が第１要素ではない場合には（ステップＳ１２），第１要素が割当て済みかどうかを判定し（ステップＳ１７），第１要素が割当て済みであれば，第２要素に第１要素のレジスタ（偶数）＋１のレジスタを割り当てる（ステップＳ１８）。また，第１要素が割当て済みでなければ，第２要素に偶数レジスタ＋１のレジスタを割り当て（ステップＳ１９），第１要素に偶数レジスタを予約する（ステップＳ２０）。
【００２０】
次に，図４および図５に従って，具体的なレジスタの割当て例について，従来技術による場合と本実施の形態による場合とを対比して説明する。図４は，ＦＯＲＴＲＡＮで記述されたソースプログラムの例を示しており，図５は，図４に示すプログラムの一部についてレジスタを割り付けた例を示している。特に図５（Ａ）は，従来技術によるレジスタ割当ての例，図５（Ｂ）は，本発明の実施の形態によるレジスタ割当ての例を示している。
【００２１】
この図５は，図４のプログラムの一部である以下の部分，
DO 20 J = 1,5
IB(J) = IA(J,J)+1
20  CONTINUE
の翻訳結果の例であり，説明を分かりやすくするために，アセンブラ命令形式で表現している。また，このソースプログラムの記述では，Ｊが１から５まで５回ループする形になっているが，ここでは処理の高速化のため，ループアンローリングによる最適化が行われている。
【００２２】
図５（Ａ）において，各行の命令の意味は以下のとおりである。ｇｒＮは，汎用レジスタＮを表している。ターゲットとなる計算機は１ワード＝４バイトを想定している。
【００２３】
(1)ｇｒ４＋０のアドレスに入っているＩＡ（１，１）の内容を，ｇｒ１８にロードする。
【００２４】
(2)ｇｒ１８とＪの初期値１を加算する。
【００２５】
(3)＄００００００１＋６４０に入っているＩＢ（Ｊ）の先頭アドレスをｇｒ１９に入れる。なお，このｏｒｎ命令は論理和（ｏｒ）をとる命令であり，ｇｒ０の値は必ず０として計算されるので，＄００００００１＋６４０のアドレスがｇｒ１９に入ることになる。
【００２６】
(4)ｇｒ４＋４４のアドレスに入っているＩＡ（２，２）の内容をｇｒ２０にロードする。
【００２７】
(5)ｇｒ２０とＪの回転値２を加算する。
【００２８】
(6)ｇｒ１８に入っているＩＡ（１，１）＋１をｇｒ１９＋０のＩＢ（１）にストアする。
【００２９】
(7)ｇｒ２０に入っているＩＡ（２，２）＋２をｇｒ１９＋４のＩＢ（２）にストアする。
【００３０】
(8)ｇｒ４＋８８のアドレスに入っているＩＡ（３，３）の内容をｇｒ２１にロードする。
【００３１】
(9)ｇｒ２１とＪの回転値３を加算する。
【００３２】
(10) ｇｒ４＋１３２のアドレスに入っているＩＡ（４，４）の内容をｇｒ２２にロードする。
【００３３】
(11) ｇｒ２２とＪの回転値４を加算する。
【００３４】
(12) ｇｒ２１に入っているＩＡ（３，３）＋３をｇｒ１９＋８のＩＢ（３）にストアする。
【００３５】
(13) ｇｒ２２に入っているＩＡ（４，４）＋４をｇｒ１９＋１２のＩＢ（４）にストアする。
【００３６】
(14) ｇｒ４＋１７６のアドレスに入っているＩＡ（５，５）の内容をｇｒ２３にロードする。
【００３７】
(15) ｇｒ２３とＪの回転値５を加算する。
【００３８】
(16) ｇｒ２３に入っているＩＡ（５，５）＋５をｇｒ１９＋１６のＩＢ（５）にストアする。
【００３９】
図５（Ａ）に示すように，従来の割り付けでは，行(1) のＩＡ（１，１）の定義部ではレジスタｇｒ１８が，行(4) のＩＡ（２，２）の定義部ではレジスタｇｒ２０が割り付けられている。これは，この２つの定義部の間で，行(3) のＩＢ（Ｊ）の先頭アドレスに関する命令にレジスタｇｒ１９が割り付けられているためである。このため，行(6) のＩＡ（１，１）＋１のストア命令と行(7) のＩＡ（２，２）＋２のストア命令はペアメモリアクセス命令として実行できず，２つのシングル命令で実行されるように命令が展開されている。
【００４０】
また，行(8) のＩＡ（３，３）の定義部ではレジスタｇｒ２１が，行(10)のＩＡ（４，４）の定義部ではレジスタｇｒ２２が，それぞれ割り付けてられている。これらの割り付けられたレジスタは連続するが，ｇｒ２１，ｇｒ２２という奇数レジスタで始まる並びであることから，行(12)のＩＢ（３）へのストア命令と行(13)のＩＢ（４）へのストア命令はペアメモリアクセス命令として実行できず，それぞれシングル命令で実行されるように命令が展開されている。
【００４１】
本発明では，命令チェック手段２０により，レジスタ割当て前に，図５（Ａ）における行(6),(7),また行(12),(13) のようなペアメモリアクセスが可能な命令を検出すると，そのペアの情報を記憶しておき，その定義部の命令にペア命令割当て情報を設定しておく。したがって，レジスタ割当て手段３０によって，第１要素の定義部に偶数レジスタ，第２要素の定義部にその偶数レジスタ＋１のレジスタを割り当てることができ，図５（Ｂ）に示すようにレジスタを割り付けることができる。
【００４２】
すなわち，本発明では，図５（Ｂ）のように，行(1)'のＩＡ（１，１）の定義部１にレジスタｇｒ１８を割り付け，レジスタｇｒ１９を第２要素用に予約する。したがって，この間の行(3)'の命令にはレジスタｇｒ２０が割り付けられ，行(4)'のＩＡ（２，２）の定義部２にレジスタｇｒ１９が割り付けられる。これにより，図５（Ａ）における行(6) のＩＡ（１，１）のストアと行(7) のＩＡ（２，２）のストアを，図５（Ｂ）の行(6)'のように１つのペアメモリアクセス命令（ｓｔ．ｌ）で実行することができることになる。行(6)'のｓｔ．ｌ命令は，ｇｒ１８に入っているＩＡ（１，１）＋１を，ｇｒ２０が示すＩＢ（１）にストアするとともに，ｇｒ１９に入っているＩＡ（２，２）＋２を，ＩＢ（１）に続くＩＢ（２）にストアする命令である。
【００４３】
また，行(8)'のＩＡ（３，３）の定義部３でレジスタｇｒ２２を，行(10)' のＩＡ（４，４）の定義部４にレジスタｇｒ２３を割り付ける。これにより，レジスタｇｒ２２とレジスタｇｒ２３の参照部２（行(12)' ）では，これらのペアレジスタのＩＢ（３）とＩＢ（４）とに対するストアを，ペアメモリアクセス命令（ｓｔ．ｌｉ９）で実行することができる。
【００４４】
【発明の効果】
以上説明したように，本発明によれば，連続したメモリアクセス命令を，偶数レジスタ，奇数レジスタという並びのペアレジスタに必ず割り当てることができる。これにより，ペア命令を実行させることで，翻訳結果のプログラムの実行性能を向上させることが可能となる。
【図面の簡単な説明】
【図１】本発明のブロック構成例を示す図である。
【図２】命令チェック手段の処理の流れを示す図である。
【図３】レジスタ割当て手段の処理の流れを示す図である。
【図４】ソースプログラムの例を示す図である。
【図５】レジスタ割り付けの例を示す図である。
【図６】従来技術を説明するための図である。
【符号の説明】
１  処理装置
２  ソースプログラム
３  オブジェクトプログラム
１０  コンパイラ
１１  ソースプログラム解析部
１２  最適化部
１３  レジスタ割当て部
１４  スケジューリング／コード生成部
２０  命令チェック手段
２１  ペア情報設定部
２２  ペア命令割当て情報設定部
３０  レジスタ割当て手段
３１  ペア命令定義部検出部
３２  ペアレジスタ割当て部
【図１】
0004298868.tif 000002
【図２】
0004298868.tif 000003
【図３】
0004298868.tif 000004
【図４】
0004298868.tif 000005
【図５】
0004298868.tif 000006
【図６】
0004298868.tif 000007