(57)【要約】【課題】キュッシュ制御レジスタにアクセスすることなく、メモリ上の同一の変数に対するキャッシュ制御の可否の切替えを効率よく実行することができる情報処理装置を実現する。【解決手段】一つの変数の実体を格納するためのメモリ１５上の変数格納領域には、第１および第２の２つのメモリアドレスが割り当てられている。キャッシュ制御部１４は、ＣＰＵ１１からのメモリアクセス要求に含まれるメモリアドレスが第１のメモリアドレスである場合、キャッシュ制御をオフしてメモリ１５に対するアクセスを実行し、メモリアクセス要求に含まれるメモリアドレスが第２のメモリアドレスである場合、キャッシュ制御をオンして、キャッシュ１１３に対するアクセスを実行する。【選択図】図１
2009271606.tif 000002
【特許請求の範囲】
【請求項１】
メモリ上の変数格納領域に対して共通に割り当てられた第１および第２のメモリアドレスを選択的に用いて、前記変数格納領域内に格納される一つの変数の実体をアクセスするためのメモリアクセス要求を出力するプロセッサと、
前記メモリに格納された情報の一部を格納するキャッシュと、
前記メモリアクセス要求に含まれるメモリアドレスが前記第１のメモリアドレスである場合、前記変数格納領域を指定するメモリアドレスを用いて、前記メモリに対するアクセスを実行し、前記メモリアクセス要求に含まれるメモリアドレスが前記第２のメモリアドレスである場合、前記変数格納領域を指定するメモリアドレスを用いて、前記キャッシュに対するアクセスを実行するキャッシュ制御手段とを具備することを特徴とする情報処理装置。
【請求項２】
前記キャッシュ制御手段は、前記メモリアクセス要求に含まれるメモリアドレスが前記第１のメモリアドレスである場合、キャッシュコヒーレンシを維持するために、ライトスルー方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが禁止されたキャッシュオフモードでリード／ライトアクセス処理を実行することを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記キャッシュ制御手段は、前記メモリアクセス要求に含まれるメモリアドレスが前記第２のメモリアドレスである場合、ライトバック方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが許可されたキャッシュオンモードでリード／ライトアクセス処理を実行することを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記第１および第２の一方のメモリアドレスは前記変数格納領域を指定するメモリアドレスとは異なっており、
前記キャッシュ制御手段は、前記メモリアクセス要求に含まれるメモリアドレスが前記一方のメモリアドレスである場合、前記メモリアクセス要求に含まれるメモリアドレスを、前記変数格納領域を指定するメモリアドレスに変換するアドレス変換手段を含むことを特徴とする請求項１記載の情報処理装置。
【請求項５】
前記メモリには、前記第１および第２のメモリアドレスを選択的に用いて前記変数格納領域内に格納される前記変数の実体をアクセスするプログラムが格納されており、
前記プロセッサは、前記プログラムを実行することを特徴とする請求項１記載の情報処理装置。
【請求項６】
メモリと、
前記メモリ上の変数格納領域に対して共通に割り当てられた第１および第２のメモリアドレスを選択的に用いて、前記変数格納領域内に格納される一つの変数の実体をアクセスするプログラムを格納する不揮発性記憶装置と、
前記不揮発性記憶装置から前記メモリに前記プログラムをロードして前記プログラムを実行するプロセッサと、
前記メモリに格納された情報の一部を格納するキャッシュと、
前記プロセッサからのメモリアクセス要求に含まれるメモリアドレスが前記第１のメモリアドレスである場合、前記メモリアクセス要求が非キャッシュ領域に対するアクセス要求であると判定して、前記変数格納領域を指定するメモリアドレスを用いて、前記メモリに対するアクセスを実行し、前記メモリアクセス要求に含まれるメモリアドレスが前記第２のメモリアドレスである場合、前記メモリアクセス要求がキャッシュ可能領域に対するアクセスであると判定して、前記変数格納領域を指定するメモリアドレスを用いて、前記キャッシュに対するアクセスを実行するキャッシュ制御手段とを具備することを特徴とする情報処理システム。
【請求項７】
前記キャッシュ制御手段は、前記メモリアクセス要求に含まれるメモリアドレスが前記第１のメモリアドレスである場合、キャッシュコヒーレンシを維持するために、ライトスルー方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが禁止されたキャッシュオフモードでリード／ライトアクセス処理を実行することを特徴とする請求項６記載の情報処理システム。
【請求項８】
前記キャッシュ制御手段は、前記メモリアクセス要求に含まれるメモリアドレスが前記第２のメモリアドレスである場合、ライトバック方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが許可されたキャッシュオンモードでリード／ライトアクセス処理を実行することを特徴とする請求項７記載の情報処理システム。
【請求項９】
プロセッサからのメモリアドレスが第１のメモリアドレスである場合、ライトスルー方式のライトアクセスが許可され且つキャッシュからのデータ読み出しが禁止されたキャッシュオフモードでリード／ライトアクセス処理を実行し、前記メモリアドレスが第２のメモリアドレスである場合、ライトバック方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが許可されたキャッシュオンモードでリード／ライトアクセス処理を実行する情報処理装置上で実行される実行プログラムを生成するコンパイル方法であって、
前記第１および第２のメモリアドレスがそれぞれ割り当てられた第１および第２の変数名を選択的に用いてメモリ上の一つの変数の実体をアクセスするプログラムから、前記第１のメモリアドレスへのリード／ライトを実行する第１タイプのコードと、前記第２のメモリアドレスへのリード／ライトを実行する第２タイプのコードとを検出するステップと、
前記第２タイプのコードが検出された場合、当該検出されたコードがリードを行うコードであり、且つ当該検出されたコードの前に出現する、前記第１タイプのコードおよび前記第２タイプのコードの内で、最も後のコードが前記第１タイプのコードであることを条件に、当該検出されたコードによってリードされる値を、前記最も後の前記第１タイプのコードによってリード／ライトされる値に置換する置換処理ステップと、
前記置換された値に基づいて、前記プログラムから、分岐先とならないコードを削除するための最適化処理を実行するステップとを具備することを特徴とするコンパイル方法。
【請求項１０】
前記置換処理ステップは、前記第１タイプのコードが検出される度に、当該検出されたコードによってリード／ライトされる値を保存し、前記保存された値を使用することによって、前記置換の処理を実行することを特徴とする請求項９記載のコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はキャッシュを含む情報処理装置およびこの情報処理装置上で実行されるプログラムを生成するためのコンパイル方法に関する。
【背景技術】
【０００２】
近年、パーソナルコンピュータ、ＰＤＡ、組み込みシステムといった、様々な情報処理装置が開発されている。
【０００３】
このような情報処理装置においては、通常、ダイナミックＲＡＭのようなメモリをアクセスするためのレイテンシーによる処理性能の低下を防ぐために、キャッシュが設けられている。例えば、プロセッサから要求された変数のようなデータがキャッシュに存在すれば、その命令をキャッシュから即座に取り出してプロセッサに与えることが出来る。
【０００４】
通常、プログラムによって管理される変数がキャッシュ制御されるかどうかは、その変数が属するメモリ領域がキャッシュ可能領域、非キャッシュ領域のいずれであるかによって一義的に決定される。キャッシュ可能領域／非キャッシュ領域の設定を動的に変更するためには、キャッシュ制御するかどうかを司るキャッシュ制御レジスタにアクセスする必要がある。しかし、この場合、キャッシュ制御レジスタにアクセスするためのコードをプログラム中に記述しなければならない。
【０００５】
特許文献１には、周辺制御部によってアクセスされるある特定のメモリ領域に対してはキャッシュ否を指定してアクセスし、それ以外の他のメモリ領域に対してはキャッシュ要を指定してアクセスするコンピュータシステムが開示されている。このシステムにおいては、キャッシュ否の指定には特定の上位ビットアドレスが用いられ、またキャッシュ否の指定には別の上位ビットアドレスが用いられる。
【特許文献１】特開平１０−７８９１６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、特許文献１のシステムでは、メモリ上のある同一のデータに対するキャッシュ制御の可否の切り替えについては考慮されていない。すなわち、特許文献１のシステムでは、周辺制御部によってアクセスされるデータに対するアクセスは、常にキャッシュ制御が禁止された状態で実行される。この場合、プロセッサは、そのデータをアクセスするためには、必ずメモリをアクセスしなければならず、これによって処理性能の低下が引き起こされる。
【０００７】
通常、プログラムによって管理される変数は当該プログラムによって何度も参照および書き替えられる。そして、プログラムによる演算処理の結果得られた値を示す変数のみが、周辺制御部に引き渡される。したがって、周辺制御部によってアクセスされる可能性がある変数に対するアクセスを常にキャッシュ制御が禁止された状態で実行するというシステム構成では、メモリアクセス回数が増大し、これによってシステム性能の低下が引き起こされる可能性がある。
【０００８】
よって、キュッシュ制御レジスタにアクセスすることなく、メモリ上の同一の変数に対するキャッシュ制御の可否の切替えを効率よく実行することができる情報処理装置およびこの情報処理装置に好適なコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上述の課題を解決するため、本発明の情報処理装置は、メモリ上の変数格納領域に対して共通に割り当てられた第１および第２のメモリアドレスを選択的に用いて、前記変数格納領域内に格納される一つの変数の実体をアクセスするためのメモリアクセス要求を出力するプロセッサと、前記プロセッサと前記メモリとの間に位置するキャッシュと、前記メモリアクセス要求に含まれるメモリアドレスが前記第１のメモリアドレスである場合、前記変数格納領域を指定するメモリアドレスを用いて、前記メモリに対するアクセスを実行し、前記メモリアクセス要求に含まれるメモリアドレスが前記第２のメモリアドレスである場合、前記変数格納領域を指定するメモリアドレスを用いて、前記キャッシュに対するアクセスを実行するキャッシュ制御手段とを具備することを特徴とする。
【００１０】
また、本発明は、プロセッサからのメモリアドレスが第１のメモリアドレスである場合、ライトスルー方式のライトアクセスが許可され且つキャッシュからのデータ読み出しが禁止されたキャッシュオフモードでリード／ライトアクセス処理を実行し、前記メモリアドレスが第２のメモリアドレスである場合、ライトバック方式のライトアクセスが許可され且つ前記キャッシュからのデータ読み出しが許可されたキャッシュオンモードでリード／ライトアクセス処理を実行する情報処理装置上で実行される実行プログラムを生成するコンパイル方法であって、前記第１および第２のメモリアドレスがそれぞれ割り当てられた第１および第２の変数名を選択的に用いてメモリ上の一つの変数の実体をアクセスするプログラムから、前記第１のメモリアドレスへのリード／ライトを実行する第１タイプのコードと、前記第２のメモリアドレスへのリード／ライトを実行する第２タイプのコードとを検出するステップと、前記第２タイプのコードが検出された場合、当該検出されたコードがリードを行うコードであり、且つ当該検出されたコードの前に出現する、前記第１タイプのコードおよび前記第２タイプのコードの内で、最も後のコードが前記第１タイプのコードであることを条件に、当該検出されたコードによってリードされる値を、前記最も後の前記第１タイプのコードによってリード／ライトされる値に置換する置換処理ステップと、前記置換された値に基づいて、前記プログラムから、分岐先とならないコードを削除するための最適化処理を実行するステップとを具備することを特徴とする。
【発明の効果】
【００１１】
本発明によれば、キュッシュ制御レジスタにアクセスすることなく、メモリ上の同一の変数に対するキャッシュ制御の可否の切替えを効率よく実行することができる。
【発明を実施するための最良の形態】
【００１２】
以下、図面を参照して本発明の実施形態を説明する。
【００１３】
まず、図１を参照して、本発明の一実施形態に係る情報処理装置の構成を説明する。この情報処理装置は、例えば、コンピュータ、ＰＤＡ、または各種電子機器の組み込みシステムとして使用される。組み込みシステムは、電子機器（例えばハードディスクドライブ等）に内蔵されるコンピュータシステムである。
【００１４】
この情報処理装置は、ＣＰＵ１１、アドレスデコーダ１２、およびキャッシュ制御部１４を備えている。
【００１５】
ＣＰＵ１１は各種プログラムを実行するプロセッサである。ＣＰＵ１１は、各種演算処理を実行すると共に、情報処理装置内の各デバイスまたは電子機器内の各デバイスを制御する。ＣＰＵ１１がアクセス可能なメモリ空間上には、不揮発性メモリ１３およびメモリ１５等がマッピングされている。
【００１６】
このＣＰＵ１１は、例えば、本情報処理装置の起動時に、不揮発性メモリ１３に格納されているプログラムをメモリ１５にロードして実行する。不揮発性メモリ１３は、例えば、フラッシュＥＥＰＲＯＭ、ＲＯＭ、等の不揮発性記憶装置である。
【００１７】
メモリ１５上には、プログラムによって管理される変数の実体を格納するための変数格納領域が割り当てられている。本情報処理装置においては、メモリ１５上の変数格納領域に対するアクセスは、異なる第１および第２の２つのメモリアドレスの中の任意のメモリアドレスを用いて行うことが出来る。すなわち、ＣＰＵ１１は、第１および第２の２つのメモリアドレスを選択的に用いて、変数格納領域内に格納される一つの変数の実体をアクセスするためのメモリアクセス要求を出力する。
【００１８】
アドレスデコーダ１２は、ＣＰＵ１１から出力されるメモリアクセス要求に含まれるメモリアドレスをデコードし、そのデコード結果に基づいて、アクセス対象のメモリを不揮発性メモリ１３とメモリ１５との間で切り換える。
【００１９】
キャッシュ制御部１４は、ＣＰＵ１１とメモリ１５との間に接続されている。キャッシュ制御部１４は、ＣＰＵ１１から出力されるメモリアクセス要求に含まれるメモリアドレスに応じて、自動的にキャッシュ制御のＯＮ／ＯＦＦを切替える機能を有している。例えば、キャッシュ制御部１４とＣＰＵ１１は、System on a Chip（ＳＯＣ）のような１チップマイクロコンピュータとして実現することができる。この１チップマイクロコンピュータが、本実施形態の情報処理装置のコア部として機能する。
【００２０】
キャッシュ制御部１４は、ＣＰＵ１１からのメモリアクセス要求に含まれるメモリアドレスが上述の第１のメモリアドレスである場合には、メモリアクセス要求が非キャッシュ対象領域（キャッシュ不可領域とも云う）に対するアクセス要求であると判定する。この場合、キャッシュ制御部１４は、キャッシュ制御をＯＦＦし、そして変数格納領域を指定するメモリアドレスを用いて、メモリ１５に対するアクセスを実行する。
【００２１】
一方、ＣＰＵ１１からのメモリアクセス要求に含まれるメモリアドレスが上述の第２のメモリアドレスである場合には、キャッシュ制御部１４は、メモリアクセス要求がキャッシュ対象領域（キャッシュ可能領域とも云う）に対するアクセス要求であると判定する。この場合、キャッシュ制御部１４は、キャッシュ制御をＯＮし、そして変数格納領域を指定するメモリアドレスを用いて、キャッシュに対するアクセスを実行する。
【００２２】
メモリ１５は、ＣＰＵ１１によって実行されるプログラム（命令群および変数群（データ）等）を格納するための外部メモリである。メモリ１５は、例えば、ダイナミックＲＡＭから構成されている。このメモリ１５はメインメモリとして使用される。このメモリ１５は、バスを介してキャッシュ制御部１４に接続されている。このバス上には、メモリ１５をアクセス可能なバスマスタ２０も接続されている。
【００２３】
メモリ１５にロードされるプログラムは、第１および第２のメモリアドレスを選択的に用いて、変数格納領域内に格納されるある一つの変数の実体をアクセスするコード群を含んでいる。ＣＰＵ１１は、このプログラムを実行することにより、第１および第２の２つのメモリアドレスを選択的に用いて、変数格納領域内に格納される一つの変数の実体をアクセスするためのメモリアクセス要求を出力する。
【００２４】
ＣＰＵ１１およびキャッシュ制御部１４を含む装置の構成に、例えば、不揮発性メモリ１３、メモリ１５、バスマスタ２０等、を付加したシステムが、本実施形態の情報処理システムとして機能する。
【００２５】
キャッシュ制御部１４は、キャッシュＯＮ／ＯＦＦ制御部１１１、アドレス変換部１１２、およびキャッシュ（キャッシュメモリ）１１３を備えている。キャッシュ（キャッシュメモリ）１１３は、メモリ１５に格納される情報の一部を格納する。
【００２６】
キャッシュＯＮ／ＯＦＦ制御部１１１は、ＣＰＵ１１からのメモリアクセス要求によって指定されるメモリアドレスをデコードし、そのデコード結果に基づいて、メモリアクセス要求が非キャッシュ対象領域またはキャッシュ対象領域のどちらに対するアクセス要求であるかを判定する。上述したように、本実施形態では、ある一つの変数の実体を格納するための変数格納領域に対して２つのメモリアドレス（第１のメモリアドレス、第２のメモリアドレス）が割り当てられている。ＣＰＵ１１からのメモリアクセス要求によって指定されるメモリアドレスが第１のメモリアドレスであるならば、キャッシュＯＮ／ＯＦＦ制御部１１１は、非キャッシュ対象領域へのアクセスであると判定し、キャッシュ制御をオフする。この場合、メモリアクセス要求に対応するリード／ライトアクセス処理は、メモリ１５に対して実行される。一方、ＣＰＵ１１からのメモリアクセス要求によって指定されるメモリアドレスが第２のメモリアドレスであるならば、キャッシュＯＮ／ＯＦＦ制御部１１１は、キャッシュ対象領域へのアクセスであると判定し、キャッシュ制御をオンする。この場合、メモリアクセス要求に対応するリード／ライトアクセス処理は、キャッシュ１１３に対して実行される。
【００２７】
アドレス変換部１１２は、第１および第２のメモリアドレスの各々を、変数格納領域を指定する本来のメモリアドレスに変換する。なお、第１および第２のメモリアドレスの一方が変数格納領域の本来のメモリアドレスを示し、他方が変数格納領域の本来のメモリアドレスとは異なるメモリアドレスを示している場合においては、アドレス変換部１１２は、他方のメモリドレスのみを対象にアドレス変換処理を実行すればよい。
【００２８】
キャッシュ１１３に対するアクセスおよびメモリ１５に対するアクセスのどちらも、アドレス変換部１１２によって変換されたメモリアドレス、つまり変数格納領域の本来のメモリアドレスを用いて実行される。
【００２９】
このように、本実施形態においては、ＣＰＵ１１はメモリ１５上のある変数の値（データ）をアクセスするために使用するメモリアドレスを第１のメモリアドレスと第２のメモリアドレスとの間で切り換えるだけで、当該変数のアクセスに使用されるキャッシュ制御のモードを自動的に変更することができる。
【００３０】
したがって、キュッシュ制御レジスタにアクセスするといった処理を行うことなく、メモリ１５上の同一の変数に対するキャッシュ制御の可否の切替えを効率よく実行することができる。この場合、第２のメモリアドレスを用いた場合には、メモリ１５上の変数を、キャッシュ制御をオンした状態（キャッシュオンモード）でアクセスすることができる。よって、例えば、メモリ１５上の変数に対する演算処理を繰り返し実行するような場合には、第２のメモリアドレスを用いて変数をアクセスすることにより、ＣＰＵ１１のメモリアクセスサイクルを例えばゼロウェイトで完了することができる。よって、メモリ１５のアクセスのためのレイテンシによるシステム性能の低下を防止できる。
【００３１】
また、第１のメモリアドレスを用いた場合には、メモリ１５上の変数をキャッシュ制御をオフした状態（キャッシュオフモード）でアクセスすることができる。よって、常にメモリ１５上の変数に対してリード／ライトが実行されるので、キュッシュ１１３とメモリ１５との間で変数の値が一致しないという不整合が発生することを防止することとができる。したがって、例えば、バスマスタ２０がメモリ１５上の変数をアクセスする可能性がある時においては、第１のメモリアドレスを用いて変数をアクセスすることにより、不整合に起因する問題の発生を防止することができる。
【００３２】
なお、キャッシュオフモードにおいては、キャッシュ１１３を介さずにメモリ１５のみに対してリード／ライトアクセス処理を実行するようにしてもよいが、キャッシュ１１３とメモリ１５の双方に対してリード／ライトアクセス処理を実行するようにしてもよい。この場合、キャッシュ１１３のライトポリシーはライトスルーに設定され、且つリードキャッシュがオフされた状態で、リード／ライトアクセスが実行される。換言すれば、キャッシュコヒーレンシを維持するために、ライトスルー方式のライトアクセスが許可され且つキャッシュ１１３からのデータ読み出しが禁止されたキャッシュオフモードで、リード／ライトアクセス処理が実行される。
【００３３】
このようなキャッシュオフモードを使用することにより、第１のメモリアドレスを用いて変数をリード／ライトアクセスした場合でも、メモリ１５からのリードデータ／ＣＰＵ１１からのライトデータがキャッシュ１１３に格納される。よって、次に第２のメモリアドレスを用いて変数をリード／ライトアクセスする場合には、キャッシュヒットとなり、リード／ライトアクセス処理を即座に完了することができる。
【００３４】
＜キャッシュ制御アーキテクチャ＞
次に、本実施形態のキャッシュ制御アーキテクチャについて具体的に説明する。
【００３５】
一般に、プログラムが外部の変数にアクセスする場合において、その変数がキャッシュされるかどうかは、以下のように決定される。
【００３６】
（１）その変数が属する記憶領域がキャッシュ可能領域／キャッシュ不可領域のいずれに設定されているかによって、変数をキャッシュするかどうかを決定する。
【００３７】
（２）キャッシュ制御レジスタの設定により、変数をキャッシュするかどうかを切り換える。
【００３８】
しかし、前者は変数をキャッシュするかどうかを動的に切り替えることができない。また後者は、切り替えのためのレジスタアクセスにより処理が遅くなり、またプログラムコードが大きくなってしまうという欠点もある。
【００３９】
本実施形態においては、図２に示すように、ＣＰＵ１１がアクセス可能なメモリ空間上に２重に変数空間が用意されており、一方の変数空間＃１はキャッシオフモードでメモリ１５上の変数にアクセスするために使用され、他方の変数空間＃２はキャッシオンモードでメモリ１５上の変数にアクセスするために使用される。
【００４０】
図２においては、メモリアドレス０ｈ，１ｈ，２ｈ，３ｈ，…に対応するメモリ１５上の記憶領域が、複数の変数それぞれの実体（値）を格納するための変数データ記憶領域として使用される。この変数データ記憶領域は、メモリアドレス０ｈ，１ｈ，２ｈ，３ｈ，…がそれぞれ割り当てられた複数の変数格納領域を含む。各変数格納領域は、その変数格納領域に対応する変数の実体を格納する。
【００４１】
いま、４つの変数Ａ，Ｂ，Ｃ，Ｄがあるとすると、変数Ａの実体はメモリアドレス０ｈの変数格納領域に格納され、変数Ｂの実体はメモリアドレス１ｈの変数格納領域に格納され、変数Ｃの実体はメモリアドレス２ｈの変数格納領域に格納され、変数Ｃの実体はメモリアドレス３ｈの変数格納領域に格納される。
【００４２】
各変数の実体、つまり各変数格納領域は、プログラムに記述された２つの変数名から参照される。ここでは、メモリアドレス０ｈの変数格納領域に関連付けられた２つの変数名がＡ，Ａ’、メモリアドレス１ｈの変数格納領域に関連付けられた２つの変数名がＢ，Ｂ’、メモリアドレス２ｈの変数格納領域に関連付けられた２つの変数名がＣ，Ｃ’、メモリアドレス３ｈの変数格納領域に関連付けられた２つの変数名がＤ，Ｄ’、である場合を想定する。
【００４３】
これら変数名Ａ，Ｂ，Ｃ，Ｄの各々は、キャッシュオフ状態で対応する変数の実体をアクセスするために使用される。また、変数名Ａ’，Ｂ’，Ｃ’，Ｄ’の各々は、キャッシュオン状態で対応する変数の実体をアクセスするために使用される。
【００４４】
変数空間＃１は、メモリ１５上の変数データ記憶領域を非キャッシュ対象領域（キャッシュ不可領域）として扱うための変数空間である。この変数空間＃１は、変数名Ａ，Ｂ，Ｃ，Ｄそれぞれに対応するメモリアドレスとして、例えば、０ｈ，１ｈ，２ｈ，３ｈ，…を有している。
【００４５】
変数空間＃２は、メモリ１５上の変数データ記憶領域をキャッシュ対象領域（キャッシュ可能領域）として扱うための変数空間である。この変数空間＃２は、変数名Ａ’，Ｂ’，Ｃ’，Ｄ’それぞれに対応するメモリアドレスとして、例えば、１０ｈ，１１ｈ，１２ｈ，１３ｈ，…を有している。
【００４６】
プログラムは、変数空間＃１と変数空間＃２のどちらを使用しても、メモリ１５上の変数データ記憶領域をアクセスすることができる。換言すれば、プログラムは、変数名ＡとＡ’のどちらを用いても、つまり、メモリアドレス０ｈと１０ｈのどちらを用いても、メモリ１５上の同一の変数（メモリアドレス０ｈの変数格納領域）をアクセスすることができる。同様に、プログラムは、変数名ＢとＢ’のどちらを用いても、つまり、メモリアドレス１ｈと１１ｈのどちらを用いても、メモリ１５上の同一の変数（メモリアドレス１ｈの変数格納領域）をアクセスすることができる。
【００４７】
例えば、メモリ１５上のメモリアドレス０ｈの変数格納領域に対してキャッシュオンでアクセス(ライトバック処理＆リードキャッシュオン)したい場合は、変数Ａ’に対応するメモリアドレス１０ｈに対してライト/リードアクセスをすればよい。逆に、メモリ１５上のメモリアドレス０ｈの変数格納領域に対してキャッシュオフでアクセス(ライトスルー処理＆リードキャッシュオフ)したい場合は、変数Ａに対応するメモリアドレス０ｈに対してライト/リードアクセスをすればよい。
【００４８】
図１のキャッシュ制御部１４は、メモリアドレス０ｈのメモリアクセス要求をＣＰＵ１１から受信すると、キャッシュオフモードでメモリアドレス０ｈへのリード／ライトアクセス処理を実行する。また、メモリアドレス１０ｈのメモリアクセス要求をＣＰＵ１１から受信すると、キャッシュ制御部１４は、キャッシュオンモードでメモリアドレス０ｈへのリード／ライトアクセス処理を実行する。
【００４９】
図３は、キャッシュオフモード（変数Ａに対するアクセス）およびキャッシュオンモード（変数Ａ’ に対するアクセス）それぞれにおいてデータがどのように更新されるかを示している。
【００５０】
図３において、ＸはＣＰＵ１１から出力されるライトデータを示し、Ｙはキャッシュ１１３内のデータの初期値を示し、Ｚはメモリ１５上の変数格納領域内のデータの初期値を示している。
【００５１】
変数Ａへライトする時、ＣＰＵ１１はメモリアドレス０ｈを含むメモリライトサイクルを実行する。この場合、キャッシュ制御部１４によって、ライトデータＸがキャッシュ１１３にライトされると共に、ライトデータＸがメモリ１５上のメモリアドレス０ｈの変数格納領域（実体）にライトされる。
【００５２】
変数Ａ’へライトする時、ＣＰＵ１１はメモリアドレス１０ｈを含むメモリライトサイクルを実行する。この場合、キャッシュ制御部１４によって、ライトデータＸがキャッシュ１１３にのみライトされる。
【００５３】
変数Ａをリードする時、ＣＰＵ１１はメモリアドレス０ｈを含むメモリリードサイクルを実行する。この場合、キャッシュ制御部１４によって、メモリ１５上のメモリアドレス０ｈの変数格納領域（実体）からデータＺがリードされる。リードデータＺはキャッシュ１１３に格納されると共に、ＣＰＵ１１に送出される。
【００５４】
変数Ａ’をリードする時、ＣＰＵ１１はメモリアドレス１０ｈを含むメモリリードサイクルを実行する。この場合、キャッシュ制御部１４は、メモリアドレス０ｈを用いてキャッシュ１１３をリードアクセスする。これにより、キャッシュ１１３内のメモリアドレス０ｈに対応するキャッシュラインからデータＹがリードされ、そのリードデータＹがＣＰＵ１１に送出される。キャッシュミス時には、メモリ１５上のメモリアドレス０ｈの変数格納領域（実体）からデータＺがリードされる。リードデータＺはキャッシュ１１３に格納されると共に、ＣＰＵ１１に送出される。
【００５５】
図４は、キャッシュ制御部１４内のキャッシュＯＮ／ＯＦＦ制御部１１１によって参照されるキャッシュＯＮ／ＯＦＦ制御テーブルを示している。
【００５６】
キャッシュＯＮ／ＯＦＦ制御テーブル２０１は、例えば、キャッシュＯＮ／ＯＦＦ制御部１１１内に設けられている。このキャッシュＯＮ／ＯＦＦ制御テーブル２０１には、非キュッシュ対象領域（変数区間＃１）に属するメモリアドレス値（０ｈ，１ｈ，２ｈ，３ｈ，…）と、キュッシュ対象領域（変数区間＃２）に属するメモリアドレス値（１０ｈ，１１ｈ，１２ｈ，１３ｈ，…）とが予め設定されている。キャッシュＯＮ／ＯＦＦ制御部１１１は、キャッシュＯＮ／ＯＦＦ制御テーブル２０１は、ＣＰＵ１１からメモリアクセス要求が、非キュッシュ対象領域に対するアクセス要求またはキュッシュ対象領域に対するアクセス要求のいずれであるかを判定することが出来る。
【００５７】
図５には、キャッシュ１１３に対するアクセスの様子が示されている。
【００５８】
本実施形態においては、キャッシュ１１３に対するアクセスは、アドレス変換部１１２によって変換されたメモリアドレスを用いて行われる。すなわち、ＣＰＵ１１が変数区間＃１または変数区間＃２のどちらを用いてメモリアクセス要求を出力した場合であっても、キャッシュ１１３に対するアクセスは同一のメモリアドレス（変数格納領域を指定するメモリアドレス）を用いて実行される。
【００５９】
例えば、ＣＰＵ１１からのメモリアクセス要求が変数Ａ（メモリアドレス０ｈ）または変数Ａ’（メモリアドレス１０ｈ）のどちらを指定するメモリアクセス要求であっても、キャッシュ１１３に対するアクセスは同一のメモリアドレス０ｈを用いて実行される。したがって、例えば、変数Ａ（メモリアドレス０ｈ）を用いてキュッシュオフモードでリード／ライトアクセス処理を実行した後に、変数Ａ’（メモリアドレス１０ｈ）を用いてキュッシュオンモードでリード／ライトアクセス処理を実行した場合においても、キャッシュヒットとなり、キャッシュヒットの確率を高めることが出来る。
【００６０】
次に、図６のフローチャートを参照して、キャッシュ制御部１４によって実行されるリード／ライトアクセス処理の手順について説明する。
【００６１】
キャッシュ制御部１４は、ＣＰＵ１１から出力されるメモリアクセス要求を受信する（ステップＳ１１）。そして、キャッシュ制御部１４は、受信したメモリアクセス要求に含まれるメモリアドレスが、キャッシュ対象領域（変数空間＃２）または非キャッシュ対象領域（変数空間＃１）のどちらに属するかを判定する（ステップＳ１２）。
【００６２】
メモリアクセス要求に含まれるメモリアドレスがキャッシュ対象領域（変数空間＃２）に属するならば、つまりメモリアクセス要求に含まれるメモリアドレスが上述の第２のメモリアドレスであるならば、キャッシュ制御部１４は、メモリアクセス要求に含まれるメモリアドレスをメモリ１５上の変数格納領域に対応するメモリアドレスに変換する（ステップＳ１３）。例えば、メモリアクセス要求に含まれるメモリアドレスが変数Ａ’に対応する１０ｈである場合には、メモリアドレス１０ｈは、変数Ａ’の実体を格納する変数格納領域を指定するメモリアドレス０ｈに変換される。そして、キャッシュ制御部１４は、キャッシュ１１３の制御をオンし、キャッシュオンモード（ライトバック処理＆リードキャッシュオン）でリード／ライトアクセス処理を実行する（ステップＳ１４）。
【００６３】
ステップＳ１４においては、メモリアクセス要求がメモリリード要求であるならば、キャッシュ制御部１４は、変換後のメモリアドレス（例えば０ｈ）に対応するデータがキャッシュ１１３に存在するか否かを判定する。メモリアドレス０ｈに対応するデータがキャッシュ１１３に存在するならば（キャッシュヒット）、キャッシュ制御部１４は、メモリアドレス０ｈに対応するデータをキャッシュ１１３から取り出し、その取り出したデータをＣＰＵ１１に送出する。メモリアドレス０ｈに対応するデータがキャッシュ１１３に存在しないならば（キャッシュミス）、キャッシュ制御部１４は、メモリアドレス０ｈを用いてメモリ１５をリードし、そのリードデータをキャッシュ１１３に格納すると共に、ＣＰＵ１１に送出する。メモリアクセス要求がメモリライト要求であるならば、キャッシュ制御部１４は、ＣＰＵ１１からのライトデータを、変換後のメモリアドレス０ｈに対応するキャッシュ１１３内のキャッシュラインに格納する。
【００６４】
メモリアクセス要求に含まれるメモリアドレスが非キャッシュ対象領域（変数空間＃１）に属するならば、つまりメモリアクセス要求に含まれるメモリアドレスが上述の第１のメモリアドレスであるならば、キャッシュ制御部１４は、必要に応じて、メモリアクセス要求に含まれるメモリアドレスをメモリ１５上の変数格納領域に対応するメモリアドレスに変換する（ステップＳ１５）。上述のように、変数空間＃１のメモリアドレスとしてメモリ１５上の変数格納領域のメモリアドレスと同じメモリアドレスが使用されている場合には、ステップＳ１５のアドレス変換処理は不要である。
【００６５】
なお、図２に示した例では、変数空間＃１のメモリアドレスとしてメモリ１５上の変数格納領域のメモリアドレスと同じメモリアドレスを使用し、変数空間＃２のメモリアドレスとして変数格納領域のメモリアドレスとは異なるメモリアドレスを使用する場合を説明したが、逆に、変数空間＃２のメモリアドレスとしてメモリ１５上の変数格納領域のメモリアドレスと同じメモリアドレスを使用し、変数空間＃１のメモリアドレスとして変数格納領域のメモリアドレスとは異なるメモリアドレスを使用してもよい。この場合には、ステップＳ１３のアドレス変換処理が不要となる。
【００６６】
次いで、キャッシュ制御部１４は、キャッシュコヒーレンシを維持するために、キャッシュ１１３の制御をオフし、キャッシュオフモード（ライトスルー処理＆リードキャッシュオフ）でリード／ライトアクセス処理を実行する（ステップＳ１６）。
【００６７】
ステップＳ１６においては、メモリアクセス要求がメモリアドレス０ｈに対するメモリリード要求であるならば、キャッシュ制御部１４は、メモリアドレス０ｈを用いてメモリ１５をリードし、そのリードデータをキャッシュ１１３に格納すると共に、ＣＰＵ１１に送出する。一方、メモリアクセス要求がメモリアドレス０ｈに対するメモリライト要求であるならば、キャッシュ制御部１４は、ＣＰＵ１１からのライトデータを、メモリアドレス０ｈに対応するキャッシュ１１３内のキャッシュラインに格納すると共に、メモリアドレス０ｈを用いてメモリ１５をライトアクセスする。
【００６８】
＜キャッシュ制御用コンパイル方法＞
上記キャッシュ制御アーキテクチャは、キャッシュ制御レジスタに対するアクセス無しで、メモリ１５上の同一の変数に対するキャッシュ制御のオン／オフを切り替えることができる。しかし、メモリ１５上の同一の変数の実体に対して２つの異なるメモリアドレスが割り当てられているので、従来のコンパイラでは、コンパイルによる最適化手法が適用できない可能性がある。
【００６９】
コンパイルによる最適化手法とは、変数の値が事前に一意に決定している箇所を抽出し、必ず通過しない分岐を削除するなどの処理を行う手法である。この最適化手法は、高速化やコード量削減に貢献するため、なるべく利用したい手法である。
【００７０】
本実施形態では、図１の情報処理装置上で実行される実行プログラムを生成するためのコンパイラには、図１の情報処理装置のキャッシュ制御アーキテクチャに最適化手法を適用するための最適化処理機能が含まれている。図１の情報処理装置上で実行されるプログラム（ソースプログラム）は、第１および第２のメモリアドレスがそれぞれ割り当てられた第１および第２の変数名（例えば、Ａ，Ａ’）を選択的に用いて、メモリ上の一つの変数の実体をアクセスするようにプログラムされている。
【００７１】
このコンパイラの有する最適化処理機能は、以下の手順を含んでいる。
【００７２】
（１）コンパイラは、非キャッシュ対象のメモリアドレス（例えば変数Ａのメモリアドレス０ｈ）とキャッシュ対象のメモリアドレス（例えば変数Ａ’のメモリアドレス１０ｈ）とのペアを記述した情報を入力し、同一の変数の実体に共通に割り当てられた２つのメモリアドレス（メモリアドレス０ｈ，メモリアドレス１０ｈ）を認識する。
【００７３】
（２）ソースプログラム中から、非キャッシュ対象領域にライトするコード（例えば、変数Ａのメモリアドレス０ｈへライトアクセスするコード）を検出した場合、コンパイラは、そのライトされる値を保存し、最適化処理を行う。
【００７４】
（３）ソースプログラム中から、非キャッシュ対象領域をリードするコード（例えば、変数Ａのメモリアドレス０ｈへリードアクセスするコード）を検出した場合、コンパイラは、そのリードされる値を保存し、最適化処理を行う。
【００７５】
（４）ソースプログラム中から、キャッシュ対象領域にライトするコード（例えば、変数Ａ’のメモリアドレス１０ｈへライトアクセスするコード）を検出した場合、コンパイラは、通常通り最適化処理を行う。
【００７６】
（５）ソースプログラム中から、キャッシュ対象領域をリードするコード（例えば、変数Ａ’のメモリアドレス１０ｈへリードアクセスするコード）を検出した場合、コンパイラは、キャッシュ対象領域からリードされる値を、（２）または（３）で保存した値に置き換えた後に、最適化処理を行う。図３においてハッチングで示されているように、非キャッシュアクセスによるライトデータ／リードデータによってキャッシュ１１３内の値は上書きされる。したがって、最適化処理を正常に実行する為には、上記置き換えにより、キャッシュ対象領域をリードするコードによってリードされる値を、上書きデータ((2),(3)で保存した値)であると認識することが必要となる。
【００７７】
すなわち、本実施形態のコンパイラは、第１および第２のメモリアドレス（０ｈ，１０ｈ）がそれぞれ割り当てられた第１および第２の変数名（Ａ，Ａ’）を選択的に用いてメモリ１５上の一つの変数の実体をアクセスするプログラム（ソースプログラム）を解析する。
【００７８】
そして、コンパイラは、プログラムの中から、第１のメモリアドレス（０ｈ）へのリード／ライトを実行する第１タイプのコードと、第２のメモリアドレス（１０ｈ）へのリード／ライトを実行する第２タイプのコードとを検出する。
【００７９】
第２タイプのコードが検出された場合、コンパイラは、当該検出されたコードがリードを行うコードであり、且つ当該検出されたコードの前に出現する、第１タイプのコードおよび第２タイプのコードの内で、最も後のコードが第１タイプのコードであることを条件に、当該検出されたコードによってリードされる値を、最も後の第１タイプのコードによってリード／ライトされる値に置換する。すなわち、第２のメモリアドレス（１０ｈ）へのリードを行うコードよりも前に出現する、第１のメモリアドレス（０ｈ）へのリード／ライトを実行するコードと第２のメモリアドレス（１０ｈ）へのリード／ライトを行うコードの中で、最も時間的に後に出現するコードが、第１のメモリアドレス（０ｈ）へのリード／ライトを実行するコードであれば、上述の置換処理が実行される。
【００８０】
本実施形態では、非キャッシュ対象領域の変数Ａとキャッシュ対象領域の変数Ａ’は、それぞれ別空間に存在しているため、コンパイラの視点から見ると、変数Ａと変数Ａ’は別々の変数である。しかし実際は、変数Ａ’は変数Ａと関係があり、これら変数はメモリ空間上の同一の変数格納領域に割り当てられている。したがって、本実施形態の装置においては、変数Ａ’に対応するメモリアドレスを用いたメモリアクセスの後に、変数Ａに対応するメモリアドレスを用いたメモリアクセスが実行されると、変数Ａ’の値は変数Ａの値によって上書きされる。上述の置換処理により、本実施形態のコンパイラは、このような上書きを考慮した状態で、最適化処理を正しく実行することができる。
【００８１】
ここで、以下のようなＣ言語のコードがあるとする。
【００８２】
[プログラム例１]
Ａ’=3;
if(Ａ’==3){処理１}
else{処理２}
この例１のif文は必ずtrueとなるため、処理２は分岐先とならない。この場合、処理２を削除することが可能である。
【００８３】
Ａ’を最適化対象変数とすることができれば、コンパイル対象コードは、以下のように短縮される。
【００８４】
[プログラム例１’]
Ａ’=3;
処理１
本実施形態のコンパイラは、次のプログラム例２のようなプログラムに対しても最適化処理を実行することができる。
【００８５】
[プログラム例２]
Ａ’=3;
Ａ=4;
if(Ａ’==3){処理３}
else{処理４}
従来の最適化処理では、コード“Ａ=4”によって変数Ａ’が４に変更されることを理解することができない。このため、誤った最適化処理を行ってしまい、以下のプログラム例２’のように誤ったプログラムを生成してしまう。
【００８６】
[プログラム例２’]
Ａ’=3;
Ａ=4;
処理３
しかし、実際には、コード“Ａ=4”によって変数Ａ’が４に変更されるので、分岐先となるのは処理４である。
【００８７】
本実施形態のコンパイラは、Ａ’の値を４として認識した上で、分岐先とならないコードを削除するための最適化処理を行うので、処理３を削除することができる。この結果、以下のプログラム例２”のように正しいプログラムを生成することができる。
【００８８】
[プログラム例２”]
Ａ’=3;
Ａ=4;
処理４
次に、図７のフローチャートを参照して、本実施形態のコンパイラによって実行されるコード削減処理の手順を説明する。
【００８９】
コンパイラは、ＣＰＵ１１の命令セットを用いて、ソースプログラム中の各コードをＣＰＵ１１が実行可能なコードに変換する。このコンパイル処理の過程の中で、コンパイラは、ソースプログラム中の変数Ａに対して第１のメモリアドレス０ｈを割り当て、ソースプログラム中の変数Ａ’には第２のメモリアドレス１０ｈを割り当てる。同様に、コンパイラは、ソースプログラム中の変数Ｂ，Ｃ，Ｄに対して第１のメモリアドレス１ｈ，２ｈ，３ｈをそれぞれ割り当て、ソースプログラム中の変数Ｂ’，Ｃ’，Ｄ’に対して第２のメモリアドレス１１ｈ，１２ｈ，１３ｈをそれぞれ割り当てる。
【００９０】
そして、コード削減処理においては、コンパイラは、まず、キャッシュ対象メモリアドレスと非キャッシュ対象メモリアドレスとの関係を示す情報を入力して、どのメモリアドレスとどのメモリアドレスとが第１のメモリアドレスと第２のメモリアドレスとの関係を有しているかを認識する（ステップＳ２１）。次いで、コンパイラは、コンパイル処理中のプログラムを解析して、そのプログラムの中から、メモリアクセスに関するコード（コマンド）を検出する（ステップＳ２２）。このステップＳ２２では、コンパイラは、非キャッシュ領域（０ｈ，１ｈ，２ｈ，または３ｈ）へのリード／ライトを実行する第１タイプのコードと、キャッシュ領域（１０ｈ，１１ｈ，１２ｈ，または１３ｈ）へのリード／ライトを実行する第２タイプのコードとをプログラム中から検出する。
【００９１】
そして、第１タイプのコードまたは第２タイプのコードが検出される度に、コンパイラは、以下の処理を実行する。
【００９２】
まず、コンパイラは、検出されたコードが、非キャッシュ領域（０ｈ，１ｈ，２ｈ，または３ｈ）へのライト、非キャッシュ領域（０ｈ，１ｈ，２ｈ，または３ｈ）へのリード、キャッシュ領域（１０ｈ，１１ｈ，１２ｈ，または１３ｈ）へのライト、キャッシュ領域（１０ｈ，１１ｈ，１２ｈ，または１３ｈ）からのリードのいずれであるかを判定する（ステップＳ２３）。
【００９３】
検出されたコードが非キャッシュ領域（０ｈ，１ｈ，２ｈ，または３ｈ）へのライトを指示するコードであるならば、コンパイラは、ライトデータの値Ｘを保存する（ステップＳ２４）。検出されたコードが非キャッシュ領域（０ｈ，１ｈ，２ｈ，または３ｈ）からのリードを指示するコードであるならば、コンパイラは、リードされる値Ｚを特定し、その特定した値Ｚを保存する（ステップＳ２５）。
【００９４】
検出されたコードがキャッシュ領域（１０ｈ，１１ｈ，１２ｈ，または１３ｈ）からのリードを指示するコードであるならば、コンパイラは、次の処理を実行する。
【００９５】
すなわち、検出されたコードが例えばキャッシュ領域（１０ｈ）からのリードを指示するコードであるならば、コンパイラは、非キャッシュ領域（０ｈ）またはキャッシュ領域（１０ｈ）に対するリード／ライトに関する一つ前のコードが、非キャッシュ領域（０ｈ）へのライトを指示するコード、非キャッシュ領域（０ｈ）からのリードを指示するコード、その他のコード、のいずれであるかを判定する（ステップＳ２６）。
【００９６】
一つ前のコードが非キャッシュ領域（０ｈ）へのライトを指示するコードであれば、コンパイラは、キャッシュ領域（１０ｈ）からリードされる値Ｙを、保存されている、非キャッシュ領域（０ｈ）へライトされる値Ｘに置き換える（ステップＳ２７）。
【００９７】
一つ前のコードが非キャッシュ領域（０ｈ）からのリードを指示するコードであれば、コンパイラは、キャッシュ領域（１０ｈ）からリードされる値Ｙを、保存されている、非キャッシュ領域（０ｈ）からリードされる値Ｚに置き換える（ステップＳ２８）。
【００９８】
このようにキャッシュ領域（１０ｈ，１１ｈ，１２ｈ，または１３ｈ）からリードされる値を保存されている値で置き換える処理を行った後、コンパイラは、置換された値に基づいて、プログラムから、分岐先とならないコードを削除するための最適化処理を実行する（ステップＳ２９）。
【００９９】
以上のように、本実施形態においては、キャッシュ制御レジスタにアクセスすることなしに、メモリ上の同一の変数に対するキャッシュ制御の可否の切替えを効率よく実行することができる。よって、高速化、コード量削減を実現することができる。
【０１００】
コンパイル手法を改良することにより、上記キャッシュ制御アーキテクチャを使用しつつ、コンパイルの最適化を行うことができる。これにより、さらなる高速化およびコード量削減を図ることができる。
【０１０１】
なお本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０１０２】
【図１】本発明の一実施形態に係る情報処理装置の構成を示すブロック図。
【図２】同実施形態の情報処理装置で用いられる２つの変数空間を説明するための図。
【図３】同実施形態の情報処理装置において、キャッシュオフモードおよびキャッシュオンモードそれぞれにおいてデータがどのように更新されるかを説明するための図。
【図４】同実施形態の情報処理装置で用いられるキャッシュＯＮ／ＯＦＦ制御テーブルの例を示す図。
【図５】同実施形態の情報処理装置に設けられたキャッシュに対するアクセス動作を説明するためのブロック図。
【図６】同実施形態の情報処理装置に設けられたキャッシュ制御部によって実行されるリード／ライトアクセス処理の手順を説明するフローチャート。
【図７】同実施形態の情報処理装置に適用されるコード量削減処理の手順を示すフローチャート。
【符号の説明】
【０１０３】
１１…ＣＰＵ、１３…不揮発性メモリ、１４…キャッシュ制御部、１５…メモリ、１１１…キャッシュＯＮ／ＯＦＦ制御部、１１２…アドレス変換部、１１３…キャッシュ。
【図１】
2009271606.tif 000003
【図２】
2009271606.tif 000004
【図３】
2009271606.tif 000005
【図４】
2009271606.tif 000006
【図５】
2009271606.tif 000007
【図６】
2009271606.tif 000008
【図７】
2009271606.tif 000009