(57)【特許請求の範囲】
【請求項１】
ソースプログラムを解析してメモリアクセス命令を削減するメモリアクセス命令削減装置において、
コンピュータが備える各手段として、
第１のレジスタの内容を第１のメモリアドレスに転送する第１のストア命令と、第１のレジスタの内容を第２のメモリアドレスに転送する第２のストア命令であって、連続あるいは所定距離範囲内で離れて続く前記第１のストア命令と前記第２のストア命令を検出する手段と、
前記検出した前記第１のストア命令と前記第２のストア命令をまとめて実行できる条件を満たしているか判別する手段と、
前記条件を満たしていると判別された前記第１のストア命令と前記第２のストア命令を、前記第１のレジスタの内容と前記第１のレジスタとは異なる第２のレジスタの内容とを１つの命令で前記第１のメモリアドレスと前記第２のメモリアドレスに転送する連続ストア命令に置換すると共に、前記第１のレジスタの内容を前記第２のレジスタに転送するＭＯＶ命令を前記連続ストア命令の前に挿入する手段と
を備えたことを特徴とするメモリアクセス命令削減装置
【請求項２】
コンピュータを、
第１のレジスタの内容を第１のメモリアドレスに転送する第１のストア命令と、第１のレジスタの内容を第２のメモリアドレスに転送する第２のストア命令であって、連続あるいは所定距離範囲内で離れて続く前記第１のストア命令と前記第２のストア命令を検出する手段と、
前記検出した前記第１のストア命令と前記第２のストア命令をまとめて実行できる条件を満たしているか判別する手段と、
前記条件を満たしていると判別された前記第１のストア命令と前記第２のストア命令を、前記第１のレジスタの内容と前記第１のレジスタとは異なる第２のレジスタの内容とを１つの命令で前記第１のメモリアドレスと前記第２のメモリアドレスに転送する連続ストア命令に置換すると共に、前記第１のレジスタの内容を前記第２のレジスタに転送するＭＯＶ命令を前記連続ストア命令の前に挿入する手段と
して機能させるプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ソースプログラムを解析してメモリアクセス命令を削減するメモリアクセス命令削減装置および記録媒体に関するものである。
【０００２】
【従来の技術】
従来、コンピュータにおいて、演算、例えば加算
Ａ（１）＝Ｂ（１）＋Ｂ（２）                            （１）
を実行する場合、
ＬＷ  ＧＲ２，Ｂ
ＬＷ  ＧＲ３，Ｂ＋４
ＡＤＤ  ＧＲ４，ＧＲ２，ＧＲ３
ＳＷ  Ａ，ＧＲ４
と展開して実行していた。ここで、ＬＷ  ＧＲ２，Ｂは、メモリのＢ番地のデータをレジスタＧＲ２にロードするという命令である。ＬＷ  ＧＲ３，Ｂ＋４は、メモリの（Ｂ＋４）番地のデータをレジスタＧＲ３にロードするという命令である。ＡＤＤ  ＧＲ４，ＧＲ２，ＧＲ３は、レジスタＧＲ２の内容とレジスタＧＲ３の内容を加算してその結果をレジスタＧＲ４に代入するという命令である。ＳＷ  Ａ，ＧＲ４は、レジスタＧＲ４の内容（加算結果）をメモリのＡ番地にストアするという命令である。以上のように、式（１）を実行するのに、４回の実行回数（マシンサイクル）が必要であった。
【０００３】
また、ＤＯループである
ＤＯ  Ｉ＝１，Ｎ，４                                        （２）
Ａ（Ｉ    ）＝Ｂ（Ｉ    ）＋Ｃ（Ｉ    ）
Ａ（Ｉ＋１）＝Ｂ（Ｉ＋１）＋Ｃ（Ｉ＋１）
Ａ（Ｉ＋２）＝Ｂ（Ｉ＋２）＋Ｃ（Ｉ＋２）
Ａ（Ｉ＋３）＝Ｂ（Ｉ＋３）＋Ｃ（Ｉ＋３）
ＥＮＤＯ
の場合には、下記のようにして実行していた。
【０００４】
LOAD  T.1 ,  (B,BASE=B,INDEX=I,DISP=0 )
LOAD  T.2 ,  (B,BASE=B,INDEX=I,DISP=8 )
LOAD  T.3 ,  (B,BASE=B,INDEX=I,DISP=16)
LOAD  T.4 ,  (B,BASE=B,INDEX=I,DISP=24)
LOAD  T.5 ,  (C,BASE=C,INDEX=I,DISP=0 )
LOAD  T.6 ,  (C,BASE=C,INDEX=I,DISP=8 )
LOAD  T.7 ,  (C,BASE=C,INDEX=I,DISP=16)
LOAD  T.8 ,  (C,BASE=C,INDEX=I,DISP=24)
ADD   T.9 ,  T.1, T.5
ADD   T.10,  T.2, T.6
ADD   T.11,  T.3, T.7
ADD   T.12,  T.4, T.8
STORE (A,BASE=A,INDEX=I,DISP=0 ),T.9
STORE (A,BASE=A,INDEX=I,DISP=8 ),T.10
STORE (A,BASE=A,INDEX=I,DISP=16),T.11
STORE (A,BASE=A,INDEX=I,DISP=24),T.12
この場合には、
・ロード命令が８回
・加算命令が４回
・ストア命令が４回
の合計１６回の実行回数（マシンサイクル）が必要であった。
【０００５】
【発明が解決しようとする課題】
上述した式（１）、式（２）を実行する場合にメモリアクセスに要する実行回数が多く高速に実行し得ないという問題があった。このため、複数のメモリアクセス命令をまとめて高速実行することが望まれている。
【０００６】
本発明は、これらの問題を解決するため、ソースプログラムを解析してメモリアクセスについて所定条件を満たす隣接あるいは近傍にある複数のメモリアクセス命令をまとめて連続実行メモリアクセス命令で置換し、アクセス回数を削減してメモリアクセスの高速化を図ることを目的としている。
【０００７】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。
図１において、ソースプログラム解析手段３は、ソースプログラム１を形態素および構文解析などを行うものである。
【０００８】
最適化・レジスタ割付け手段４は、ソースプログラムを解析した結果をもとにレジスタ割り付けを最適化するものであって、当該レジスタ割り付けの最適時に本発明に係るメモリ命令を削減する命令削減手段５などから構成されるものである。
【０００９】
命令削減手段５は、レジスタ割り付けを最適化する際に、隣接あるいは近傍の連続したメモリアクセス命令をまとめて実行できる条件を満たしているか判別したり、条件を満たしていると判別したときに隣接あるいは近傍の連続したメモリアクセス命令を連続実行メモリアクセル命令（例えばペアメモリアクセス命令）に置換したりなどするものである。
【００１０】
尚、最適化・レジスタ割付け手段４は、最適化は主に中間テキストを削減し、レジスタ割付けはその名の通りレジスタ割付けを行い、実際には最適化した後にレジスタ割付けを行っています。本発明では主に最適化の部分で行い、ＭＯＶを利用した分解回避のときはレジスタ割付けで行っています。以下同様です。
【００１１】
次に、動作を説明する。
ソースプログラム１を解析してあるいはレジスタ割り付けの最適化時に、命令削減手段５が検出した隣接あるいは近傍の連続したメモリアクセス命令をまとめて実行できる条件を満たしているか判別し、条件を満たしていると判別されたときに隣接あるいは近傍の連続したメモリアクセス命令を連続実行メモリアクセス命令（例えばペアメモリアクセス命令）に置換し、置換後のオブジェクトプログラムを生成させるようにしている。
【００１２】
この際、検出した隣接あるいは近傍の連続したメモリアクセス命令を連続実行メモリアクセス命令（例えばペアメモリアクセス命令）に置換する場合に、メモリアクセス命令の実行順番が逆のときにＭＯＶ命令を使用してメモリアクセス命令の実行順番を入れ換えた後に連続実行メモリアクセス命令（例えばペアメモリアクセス命令）で置換するようにしている。
【００１３】
また、近傍の連続したメモリアクセス命令をまとめて実行できる条件として、メモリアクセス命令と次のメモリアクセス命令との間の命令数が予め設定した所定数以下とし、レジスタが不当に長く専有されることを防止するようにしている。
【００１４】
また、条件として、メモリアクセス命令の変数の型、基底、インデックス、基底からのオフセットが等しい、および連続するメモリアクセス命令間にデータ依存関係のある命令が存在しないとするようにしている。
【００１５】
従って、ソースプログラム１を解析してあるいはレジスタ割り付けの最適化時に、メモリアクセスについて所定条件を満たす隣接あるいは近傍にある複数のメモリアクセス命令をまとめて連続実行メモリアクセス命令（例えばペアメモリアクセル命令）で置換することにより、実行回数を削減してメモリアクセスの高速化を図ることが可能となる。
【００１６】
【発明の実施の形態】
次に、図１から図９を用いて本発明の実施の形態および動作を順次詳細に説明する。
【００１７】
図１は、本発明のシステム構成図を示す。
図１において、ソースプログラム１は、メモリアクセス命令を削減する対象のソースプログラムである。
【００１８】
コンパイラ２は、ソースプログラム１を読み込んで解析し、最適化などを行い、実行可能形式のオブジェクトプログラム７を生成するものであって、ここでは、ソースプログラム解析手段３、最適化・レジスタ割付け手段４およびスケジューリング・コード生成手段６などから構成されるものである。
【００１９】
ソースプログラム解析手段３は、ソースプログラム１を形態素および構文解析して内部で処理に適した中間テキスト（中間言語）を生成するものである。
最適化・レジスタ割付け手段４は、ソースプログラム１を解析した結果をもとにレジスタ割り付けの最適化を図るものであって、当該レジスタ割り付けの最適時に本発明に係るメモリ命令を削減する命令削減手段５などから構成されるものである。
【００２０】
命令削減手段５は、レジスタ割り付けを最適化する際に、隣接あるいは近傍の連続したメモリアクセス命令をまとめて実行できる条件を満たしているか判別したり、条件を満たしていると判別したときに隣接あるいは近傍の連続したメモリアクセス命令をペアメモリアクセス命令に置換したりなどするものである。
【００２１】
スケージュリング・コード生成手段６は、最適化およびレジスタ割付け後にスケージュリングし、実行可能形式のコードを生成してオブジェクトプログラム７を出力するものである。
【００２２】
オブジェクトプログラム７は、実行可能形式のプログラムである。
次に、図２のフローチャートに示す順序に従い、図１の構成の本発明に係る命令削減手段５の動作を詳細に説明する。
【００２３】
図２は、本発明の動作説明フローチャート（その１）を示す。
図２において、Ｓ１は、処理単位情報を取り出す。これは、ソースプログラム１を解析した結果をもとに、まとまりのある処理単位、例えば後述する図４の（ｂ）のようにあるまとまりのある処理単位（図４の（ｂ）では、図４の（ａ）に記載したＡ（１）＝Ｂ（１）＋Ｂ（２）という加算を行う処理単位）の情報を取り出す。
【００２４】
Ｓ２は、処理単位情報から中間テキストを取り出す。これは、図４の（ｂ）から１行づつ中間テキストを取り出す。
Ｓ３は、ＬＯＡＤテキストか判別する。これは、Ｓ２で図４の（ｂ）から１行つづ取り出した中間テキストがＬＯＡＤ命令（メモリからレジスタにデータをロードする命令）か判別する。ＹＥＳの場合には、ＬＯＡＤテキストと判明したので、Ｓ４でＬＯＡＤテキストをテーブルに登録し、Ｓ７に進む。ＮＯの場合には、ＬＯＡＤテキストでないと判明したので、Ｓ５に進む。
【００２５】
Ｓ５は、ＳＴＯＲＥテキストか判別する。これは、Ｓ２で図４の（ｂ）から１行つづ取り出した中間テキストがＳＴＯＲＥ命令（レジスタからメモリにデータをストアする命令）か判別する。ＹＥＳの場合には、ＳＴＯＲＥテキストと判明したので、Ｓ６でＳＴＯＲＥテキストをテーブルに登録し、Ｓ７に進む。ＮＯの場合には、ＳＴＯＲＥテキストでないと判明したので、Ｓ７に進む。
【００２６】
Ｓ７は、次の中間テキストがあるか判別する。ＹＥＳの場合には、その中間テキストを取り出してＳ３に戻り繰り返す。ＮＯの場合には、Ｓ８に進む。
Ｓ８は、次の処理単位情報があるか判別する。ＹＥＳの場合には、その処理単位情報を取り出してＳ２に戻り繰り返す。ＮＯの場合には、Ｓ９で登録されたテーブル情報をもとに図３を呼び出す。
【００２７】
以上によって、ソースプログラム１を解析した処理単位情報からメモリアクセス命令（ＬＯＡＤテキストおよびＳＴＯＲＥテキスト）がテーブルに登録（行情報などと共に登録）されたこととなる。
【００２８】
図３は、本発明の動作説明フローチャート（その２）を示す。これは、図２のＳ９から呼び出される処理である。
図３において、Ｓ１１は、テーブルからテキストＡを取り出す。これは、テーブルの先頭から１つのテキストＡを取り出す。
【００２９】
Ｓ１２は、テーブルからテキストＢを取り出す、これは、テーブルから次の１つのテキストＢを取り出す。
Ｓ１３は、型が等しいか判別する。これは、Ｓ１１、Ｓ１２で取り出したテキストＡとテキストＢとの両者の型（例えば後述する図６の（ａ）のＲＥＡＬ＊８Ａ（１００），Ｂ（１００）の定義中のＲＥＡＬ（実数浮動小数点型））が等しいか判別する。ＹＥＳの場合には、Ｓ１４に進む。ＮＯの場合には、条件を満たさないので、Ｓ２０に進む。
【００３０】
Ｓ１５は、テキストＡとテキストＢのインデックスが等しいか判別する。これは、例えば後述する図６の（ａ）のテキストＡとテキストＢが
LOAD(R8) T.1,(B,BASE=B,INDEX=NULL,DISP=0)
LOAD(R8) T.2,(B,BASE=B,INDEX=NULL,DISP=8)
の場合に、インデックスがINDEX=NULLと両者が等しいか判別する。ＹＥＳの場合には、Ｓ１６に進む。ＮＯの場合には、条件を満たさないので、Ｓ２０に進む。
【００３１】
Ｓ１６は、テキストＡとテキストＢのディスプレースメントの差の絶対値が型の大きさと等しいか判別する。これは、例えば後述する図６の（ａ）のテキストＡとテキストＢが
LOAD(R8) T.1,(B,BASE=B,INDEX=NULL,DISP=0)
LOAD(R8) T.2,(B,BASE=B,INDEX=NULL,DISP=8)
の場合に、ディスプレースメントＤＩＳＰ＝０とＤＩＳＰ＝８の差の絶対値「８」が、型の大きさ（図６の（ａ）のＲＥＡＬ＊８  Ａ（１００），Ｂ（１００）の定義中の「８」（バイト）と等しいか判別する。この例では、ＹＥＳとなり、Ｓ１７に進む。ＮＯの場合には、条件を満たさないので、Ｓ２０に進む。
【００３２】
Ｓ１７は、テキストＡとテキストＢの間にデータ依存関係のあるテキストが存在しないか判別する。これは、テキストＡとテキストＢの間にデキストＡあるいはテキストＢのデータに依存関係があってデータが変わってしまう可能性のある他のテキストがないか判別する。ＹＥＳの場合には、データに依存関係のある他のテキストが両者の間にないと判明したので、Ｓ１８に進む。ＮＯの場合には、条件を満たさないので、Ｓ２０に進む。
【００３３】
Ｓ１８は、テキストＡとテキストＢの距離がＮ以下か判別する。これは、テキストＡとテキストＢとの間にある他のテキストの数がＮ以下か判別（Ｎの間、レジスタが専有されて他に使用できなくなるので、通常はＮ＝１０位に制限して無闇にレジスタが専有されてしまう事態を制限し、当該制限の範囲内か判別）する。ＹＥＳの場合には、Ｓ１９に進む。ＮＯの場合には、条件を満たさないので、Ｓ２０に進む。
【００３４】
Ｓ１９は、テキストＡとテキストＢが全ての条件を満たしたので、テキストＡとテキストＢをペア化（ペアメモリアクセス命令で置換）し、テーブルから削除し、Ｓ２０に進む。ここで、テキストＡとテキストＢをペア化する条件をまとめると下記のようになる。
【００３５】
・型が一致
・インデックスが一致
・ベースアドレス（基底）が一致
・両者のディスプレースメント（ＤＩＳＰ）の差の絶対値が型の大きさと一致
・両者の間にデータ依存関係がない。
【００３６】
・その他
Ｓ２０は、次のテキストＢがあるか判別する。ＹＥＳの場合には、そのテキストＢを取り出し、Ｓ１４以降を繰り返す（これはより、テキストＡを固定に、テーブルから他の全てのテキストをテキストＢとして取り出して条件判定を繰り返すことが可能となる）。ＮＯの場合には、Ｓ２１に進む。
【００３７】
Ｓ２１は、次のテキストＡがあるか判別する。ＹＥＳの場合には、そのテキストＡを取り出し、Ｓ１２以降を繰り返す。ＮＯの場合には、終了する。
以上によって、テキストＡとテキストＢをテーブルから取り出して条件を満たすペアを見つけてペア化（ペアメモリアクセス命令で置換）することが可能となる。以下具体例について詳細に説明する。
【００３８】
図４は、本発明の具体例（その１）を示す。
図４の（ａ）は、ソースプログラム１のイメージを示す。ここで
Ａ（１）＝Ｂ（１）＋Ｂ（２）
は、Ｂ（１）の内容と、Ｂ（２）の内容とを加算してＡ（１）に入れるという演算である。これを、実際に実行するためのテキストに展開すると、図４の（ｂ）に示す下記のようになる。
【００３９】
LW GR2,B                /メモリBの内容をレジスタGR2にロード
LW GR3,B+4              /メモリ(B+4)の内容をレジスタGR3にロード
ADD GR4,GR2,GR3         /GR2とGR3の内容を加算して結果をGR4に入れる
SW A,GR4                /GR4の内容をメモリAにストア
これらテキスト中の第１行目のLW GR3,Bと第２行目のLW GR3,B+4とは、既述した図3のフローチャートで説明した条件を満たすので、ペア化し、ペアメモリアクセス命令LWP GR2,Bの１つに置換し、２サイクル必要であってものを１サイクルで実行するようにし、図４の（ｃ）に示す下記のようにする。
【００４０】
LWP GR2,B               /メモリBとB+4の内容をレジスタGR2、GR3にロード
ADD GR4,GR2,GR3         /GR2とGR3の内容を加算して結果をGR4に入れる
SW A,GR4                /GR4の内容をメモリAにストア
以上のように、隣接する２つのロード命令が図３で既述した条件を満たすのでペア化し、サイクルを１サイクル削減し、全体として４サイクルから３サイクルに削減できたこととなる。
【００４１】
図５は、本発明の具体例（その２）を示す。これは、いわゆるループアンローリングというループの回転数を展開（ここでは、４つに展開）して、分岐を少なくして最適化（高速化）を図る手法であり、この手法の際に、本願発明を適用したものであり、４つの連続するロードおよびストアをそれぞれペア化したものである。
【００４２】
図５の（ａ）は、ループの例を示す。ここでは、Ａ（Ｉ）＝Ｂ（Ｉ）＋Ｃ（Ｉ）という演算をＩ＝１から１０２４回ループして求めるというものである。
図５の（ｂ）は、ループの回転数を展開、ここでは、４つに展開し、図示の下記のようにしたものである。
【００４３】
ＤＯ  Ｉ＝１，１０２４，４
Ａ（Ｉ）＝Ｂ（Ｉ）＋Ｃ（Ｉ）
Ａ（Ｉ＋１）＝Ｂ（Ｉ＋１）＋Ｃ（Ｉ＋１）
Ａ（Ｉ＋２）＝Ｂ（Ｉ＋２）＋Ｃ（Ｉ＋２）
Ａ（Ｉ＋３）＝Ｂ（Ｉ＋３）＋Ｃ（Ｉ＋３）
ＥＮＤＯ
この展開した後の、第１番目と第２番目を１つにペア化し（図４で説明したと同様）、第３番目と第４番目を１つにペア化し、２つのペア命令で実行するようにする。これらの結果、
・Ａのストア４つがペア化され、２つ
・Ｂのロード４つがペア化され、２つ
・Ｃのロード４つがペア化され、２つ
以上により、メモリアクセス命令に関しては、半分になり、高速化を図ることが可能となる。
【００４４】
図６は、本発明の具体例（その３）を示す。
図６の（ａ）は、テキストのイメージ例を示す。ここでは、
REAL*8 A(100),B(100)    /実数型浮動少数点8バイト、A、Bは要素が100
・・・
A(1)=B(1)+B(2)        /B(1)の内容とB(2)の内容を加算してA(1)に入れる
LOAD(R8) T.1,(B,BASE=B,INDEX=NULL,DISP=0)
LOAD(R8) T.2,(B,BASE=B,INDEX=NULL,DISP=8)
ADD(R8)  T.3,T.1,T.2
STORE(R8) (A,BASE=A,DISP=0),T.3
ここで、LOAD(R8) T.1,(B,BASE=B,INDEX=NULL,DISP=0)は、メモリ上の(B,BASE=B,INDEX=NULL,DISP=0)のデータを、レジスタT.1にロードする。ここで、BASEは基底であり(ここではBアドレス)、INDEXはインデックスレジスタで示す内容(ここはNULLをBASEに加算))であり、DISPはBASE=Bに加算するディスプレイスメント(オフセット)である。以下同様である。ここで、第１番目のロード命令と第２番目のロード命令が既述した図３の条件を満たすので、これら２つのロード命令をペア化し、図６の（ｂ）の矢印で示すペアメモリアクセス命令に置換する。
【００４５】
図６の（ｂ）は、２つのロード命令をペア化した後のテキストのイメージを示す。ここでは、第１行目の
LOAD(R8) (T.1,T.2),(B,BASE=B,INDEX=NULL,DISP=0)
がペアメモリアクセス命令であって、1サイクルでメモリ上の基底から0および8のアドレスからデータを、レジスタT.1とT.2にそれぞれストアする。これにより、２つのロード命令を１つのペア化した命令に置換し、メモリアクセスを半分にすることが可能となる。
【００４６】
図７は、本発明の具体例（その４）を示す。
図７の（ａ）は、テキストのイメージの例を示す。ここで、第２行目の
REAL*8 A(100),B(100)
が変数Ａ、Ｂが要素が１００で、浮動小数点型で８バイトの定義を表す。下の４行がＬＯＡＤ命令の間にＳＴＯＲＥ命令が入った場合を示し、これを矢印で示すよう２つのＬＯＡＤ命令をペア化したものが、図７の（ｂ）である。
【００４７】
図７の（ｂ）は、ペア化後のテキストのイメージの例を示す。これは、図７の（ａ）の２つの離れたＬＯＡＤ命令を１つにペア化、かつ２つの離れたＳＴＯＲＥ命令を１つにペア化したものである。
【００４８】
図７の（ｃ）は、図７の（ｂ）のペア化した後、ＬＯＡＤ命令を優先してレジスタ割付けした後のテキストのイメージの例を示す。これは、図７の（ｅ）に示すように最初のＬＯＡＤ命令はペア命令でメモリＢ（１）、Ｂ（２）からレジスタＮ番目、（Ｎ＋１）番目（連続した２つのレジスタを表す）にロードするが、ストアが交差するために分解して元の２つのストア命令で、レジスタＮ番目、（Ｎ＋１）番目からメモリＡ（２）、Ａ（１）にストアする。このため、ペア化してもレジスタ割付け時に、１つのペア化したストア命令を分解して元のストア命令を２つ使用せざるを得ない。
【００４９】
図７の（ｄ）は、図７の（ｂ）のペア化した後、レジスタが余裕がある場合のレジスタ割付けした後のテキストのイメージの例を示す。これは、図７の（ｆ）に示すように最初のＬＯＡＤ命令はペア命令でメモリＢ（１）、Ｂ（２）からレジスタＮ番目、（Ｎ＋１）番目（連続した２つのレジスタを表す）にロードするが、ストアが交差するために、ここでは、ＭＯＶ命令を使用してレジスタ（Ｎ＋３）（連続する３つ目のレジスタを表す）に移動した後、ペア化したストア命令でレジスタ（Ｎ＋１）、（Ｎ＋２）からメモリＡ（１）、Ａ（２）にストアする。この場合には、ペア化した命令を分解することなく、ＭＯＶ命令を１つ追加するのみで対処できる。
【００５０】
図７の（ｅ）は、図７の（ｃ）のＬＯＡＤとＳＴＯＲＥの様子の模式図を示す。相互の関係は、矢印で示した通りである。
図７の（ｆ）は、図７の（ｅ）のＬＯＡＤとＳＴＯＲＥの間に挿入したＭＯＶの様子の模式図を示す。相互の関係は、矢印で示した通りである。
【００５１】
以上のように、論理的には図７の（ｂ）のようにペア化できるが、ハードウェアの制限でできない場合（ペア化したロード命令とストア命令の要素がそれぞれ交差しているため、片方を優先すると他方を分解せざるを得ない場合）、空レジスタがある場合には、ＬＯＡＤとＳＴＯＲＥの間にＭＯＶを挿入（レジスタ間転送）することで、ペア化した命令の分解を防ぐことができる。また、一般には、ＳＴＯＲＥより、ＭＯＶの方が実際の実行速度が大幅に速く、実行速度を向上できる。
【００５２】
図８は、本発明の具体例（その５）を示す。これは、初期化を行うイメージであって、ループアンローリングした後のイメージであり、ストア対象が同一要素（Ｔ．１）であると、そのままではペア化してもレジスタ割付け時に分解して元に戻さざるを得ないが、ＭＯＶ命令でストア対象が同一要素でなく（Ｔ．１、Ｔ．２）にすることでペア化した後のレジスタ割付けで分解しなくてもよいようにした例である。
【００５３】
図８の（ａ）は、ループアンローリングにより４つに展開したソースプログラムのイメージの例を示す。
図８の（ｂ）は、図８の（ａ）の展開後のテキストのイメージの例を示す。
【００５４】
図８の（ｃ）は、図８の（ｂ）のＳＴＯＲＥを２つをそれぞれペア化した後のテキストのイメージの例を示す。ここでは、図８の（ｂ）の２つのＳＴＯＲＥ命令を矢印で示すように、ペア化したＳＴＯＲＥ命令に置換している。
【００５５】
図８の（ｄ）は、図８の（ｃ）でペア化してもレジスタ割付け時にペア化したＳＴＯＲＥを分解しないでもよいように、ＭＯＶ命令でレジスタＴ．１、Ｔ．２を使用したテキストのイメージ例を示す。この場合には、ＭＯＶＥ  Ｔ．２，１．０を追加し、２つのレジスタＴ．１、Ｔ．２を使用してレジスタ割付け時にＳＴＯＲＥ命令が同一要素のレジスタを使わなくてもよいようにした例を示し、図中の矢印で示すようにペア化されたこととなる。
【００５６】
以上のように、２つのＳＴＯＲＥ命令の複数をペア化してレジスタ割付け時に同一要素のレジスタを使う場合には、ＭＯＶ命令を挿入して同一要素のレジスタを使わないようにして、レジスタ割付け時のペア化した命令の分解を無くすことが可能となる。
【００５７】
図９は、本発明の効果説明図を示す。
図９の（ａ）は、ソースプログラムのイメージの例を示す。ここでは、ループアンローリングによって４つに展開されている。
【００５８】
図９の（ｂ）は、ＬＯＡＤ／ＡＤＤ／ＳＴＯＲＥ命令の実行数を、それぞれ１τとした場合のペア化した場合と、ペア化しない場合の総実行数を示す。
・ペア化しない場合には、１６τとなる。
【００５９】
・ペア化した場合には、１０τとなる。
尚、τとはマシンサイクルのことで、例えば１００ＭＨｚで動作するＣＰＵであれば、１０ｎｓ（ナノセカンド）が１τとなる。
【００６０】
従って、１６／１０＝１．６倍、本発明のペア化によって、図９の（ａ）のループアンローリングした後のソースプログラムは高速実行可能なオブジェクトプログラムとなる。以下詳細に説明する。
【００６１】
図９の（ｃ）は、ペア化しない場合（従来）のテキストのイメージ例を示す。これは、図９の（ａ）のループアンローリングにより４つに展開したソースプログラムを実行する場合のテキストのイメージを示す。ここでは、図９の（ａ）の該当ソースプログラムから矢印でテキストの関係を示す。このペア化しない場合（従来）では、
・ＬＯＡＤ命令が４つ
・ＬＯＡＤ命令が４つ
・ＡＤＤ命令が４つ
・ＳＴＯＲＥ命令が４つ
の合計１６個（１６τ）となる。
【００６２】
図９の（ｄ）は、ペア化した場合（本発明）のテキストのイメージ例を示す。これは、図９の（ａ）のループアンローリングにより４つに展開したソースプログラムを実行する場合のテキストのイメージを示す。ここでは、図９の（ｂ）の従来のテキスト中の２つの連続するＬＯＡＤ命令を１つのペア化したＬＯＡＤ命令、および２つの連続するＳＴＯＲＥ命令を１つのペア化したＳＴＯＲＥ命令に矢印を用いて示すように置換したものである。このペア化した場合（本願発明）では、
・ＬＯＡＤ命令が２つ
・ＬＯＡＤ命令が２つ
・ＡＤＤ命令が４つ
・ＳＴＯＲＥ命令が２つ
の合計１０個（１０τ）となる。これにより、図９の（ａ）で上述したように、従来のペア化しない場合は１６τ、本発明のペア化した場合は１０τとなり、１６／１０＝１．６倍、本願発明のペア化した場合が速く実行できるオブジェクトプログラムを生成することが可能となる。
【００６３】
【発明の効果】
以上説明したように、本発明によれば、ソースプログラム１を解析してあるいはレジスタ割り付けの最適化時に、メモリアクセスについて所定条件を満たす隣接あるいは近傍にある複数のメモリアクセス命令をまとめて連続実行メモリアクセス命令（例えばペアメモリアクセル命令）で置換する構成を採用しているため、実行回数を削減してメモリアクセスの高速化を図るオブジェクトプログラムを生成することができ、実行性能を向上させることが可能となる。
【図面の簡単な説明】
【図１】本発明のシステム構成図である。
【図２】本発明の動作説明フローチャート（その１）である。
【図３】本発明の動作説明フローチャート（その２）である。
【図４】本発明の具体例（その１）である。
【図５】本発明の具体例（その２）である。
【図６】本発明の具体例（その３）である。
【図７】本発明の具体例（その４）である。
【図８】本発明の具体例（その５）である。
【図９】本発明の効果説明図である。
【符号の説明】
１：ソースプログラム
２：コンパイラ
３：ソースプログラム解析手段
４：最適化・レジスタ割付け手段
５：命令削減手段
６：スケジューリング・コード生成手段
７：オブジェクトプログラム
【図１】
0004020500.tif 000002
【図２】
0004020500.tif 000003
【図３】
0004020500.tif 000004
【図４】
0004020500.tif 000005
【図５】
0004020500.tif 000006
【図６】
0004020500.tif 000007
【図７】
0004020500.tif 000008
【図８】
0004020500.tif 000009
【図９】
0004020500.tif 000010