(57)【要約】【課題】本発明の目的は、命令変換型ハードウェアアクセラレータにおいて、上記に示したカウントをハードウェアでカウントするための情報処理装置を提供すること、および、Ｊａｖａ例外の検出処理を高速に行う機構を提供することである。【解決手段】第１命令セットを固有命令として実行するための命令実行部（ＣＰＵ）と、第２命令セットの命令を前記第１命令セットの第１命令列に変換して前記命令実行部に供給するための命令変換回路（ＢＴ）と、所定のイベントをカウントするためのカウンタ手段（ＣＮＴ）とを具備し、前記命令変換回路は、前記カウンタが所定の条件を満たした際に、所定の命令を出力するように構成する。【効果】バイトコード数をカウントするための命令やＪａｖａ例外を検出する命令数を削減することが可能である。【選択図】図１
2004102375.tif 000002
【特許請求の範囲】
【請求項１】
情報処理装置であって、
第１命令セットを固有命令として実行するための命令実行部と、
第２命令セットの命令を前記第１命令セットの第１命令列に変換して前記命令実行部に供給するための命令変換回路と、
所定のイベントをカウントするためのカウンタ手段とを具備し、
前記命令変換回路は、前記カウンタが所定の条件を満たした際に、所定の命令を出力する情報処理装置。
【請求項２】
請求項１において、
前記命令実行部は、複数のステージを有するパイプライン型であり、
前記情報処理装置は、前記複数のステージに対応する複数の模擬ステージを有する模擬パイプラインを更に具備し、
前記模擬パイプラインは、前記第１命令列に対応するフラグが入力され、
前記カウンタ手段は、前記フラグが所定の前記模擬ステージに到達した場合にカウントする情報処理装置。
【請求項３】
請求項２において、
前記情報処理装置は、前記カウンタが前記所定の条件を満たした際に、前記命令実行部のパイプライン上に残った後続命令を無効化する機構を有する情報処理装置。
【請求項４】
請求項３において、
前記カウント手段は、カウント値を１減少させることによりカウントし、
前記所定の条件は、前記カウント手段がアンダーフローすることである情報処理装置。
【請求項５】
請求項２において、
前記第１命令列は、一つ又は複数の命令を含み、
前記所定のイベントは、前記第１命令列に含まれる最後の命令が実行されたことであり、
前記所定の命令は、スレッドを切り替えるためにソフトＶＭに処理を渡すための命令である情報処理装置。
【請求項６】
請求項５において、
前記フラグは、前記第１命令列の最後の命令に対応して前記模擬パイプラインに入力され、
前記複数のステージは、命令デコードステージ、命令実行ステージ、メモリアクセスステージ及びレジスタ格納ステージを有し、
前記複数の模擬ステージは、前記命令デコードステージに対応する模擬命令デコードステージ、前記命令実行ステージに対応する模擬命令実行ステージ、前記メモリアクセスステージに対応する模擬メモリアクセスステージ及び前記レジスタ格納ステージに対応する模擬レジスタ格納ステージを有し、
前記カウンタ手段は、前記フラグが前記模擬レジスタ格納ステージに到達した場合に、カウントする情報処理装置。
【請求項７】
請求項２において、
前記所定のイベントは、前記命令実行部において後方分岐が行われることであり、
前記所定の命令は、ガベッジコレクションチェックを行うためにソフトＶＭに処理を渡すための命令である情報処理装置。
【請求項８】
請求項２において、
前記第１命令列は、一つ又は複数の命令を含み、
前記カウンタ手段は、前記第１命令列の最後の命令が前記命令実行部で実行された数をカウントする第１カウンタと、前記命令実行部において後方分岐した数をカウントする第２カウンタとを有する情報処理装置。
【請求項９】
請求項２において、
前記第１命令列は、一つ又は複数の命令を含み、
前記カウンタ手段は、前記第１命令列の最後の命令が前記命令実行部で実行された実行数、又は、前記命令実行部において後方分岐した分岐数をカウントするカウンタを有し、
前記情報処理装置は、前記カウンタ手段が前記実行数をカウントするか、前記分岐数をカウントするかを制御するための情報を記憶するレジスタを更に具備する情報処理装置。
【請求項１０】
請求項９において、
前記情報処理装置は、後方分岐が成立したかを判定する検出部を更に具備し、
前記検出部は、後方分岐が成立したと判定した場合に、前記カウンタに通知し、
前記カウンタは、前記通知に基づいてカウント値を１減らす情報処理装置。
【請求項１１】
請求項１０において、
前記フラグは、前記第１命令列の最後の命令に対応して前記模擬パイプラインに入力される第１フラグと、前記第１命令列に含まれる後方分岐命令に対応して前記模擬パイプラインに入力される第２フラグとを有し、
前記複数のステージは、命令デコードステージ、命令実行ステージ、メモリアクセスステージ及びレジスタ格納ステージを有し、
前記複数の模擬ステージは、前記命令デコードステージに対応する模擬命令デコードステージ、前記命令実行ステージに対応する模擬命令実行ステージ、前記メモリアクセスステージに対応する模擬メモリアクセスステージ及び前記レジスタ格納ステージに対応する模擬レジスタ格納ステージを有し、
前記検出部は、前記第２フラグが前記模擬命令実行ステージに到達した場合に、後方分岐が成立したかを判定し、
前記カウンタは、前記レジスタに記憶される情報に基づいて、前記第１フラグが前記模擬レジスタ格納ステージに到達したことによりカウントするか、又は、前記通知によりカウントするかを決定する情報処理装置。
【請求項１２】
情報処理装置であって、
第１命令セットを固有命令として実行するための命令実行部と、
第２命令セットを前記第１命令セットに変換して前記命令実行部に供給するための命令変換回路と、
前記命令変換回路を制御する検出部とを具備し、
前記検出部は、前記命令実行部の動作を監視し、所定の条件を満たした際に、前記命令変換回路は所定の命令を出力する情報処理装置。
【請求項１３】
請求項１２において、
前記命令実行部は、複数のステージを有するパイプライン型であり、
前記情報処理装置は、前記複数のステージに対応する複数の模擬ステージを有する模擬パイプラインを含み、
前記模擬パイプラインは、前記第１命令列に対応するフラグが入力され、
前記検出部は、前記フラグがいる前記複数の模擬ステージの位置によりその動作が制御される情報処理装置。
【請求項１４】
請求項１３において、
前記情報処理装置は、メモリと、前記検出部、前記命令実行部及び前記メモリに接続されるバスとを更に具備し、
前記複数のステージは、命令デコードステージ、命令実行ステージ、メモリアクセスステージ及びレジスタ格納ステージを有し、
前記複数の模擬ステージは、前記命令デコードステージに対応する模擬命令デコードステージ、前記命令実行ステージに対応する模擬命令実行ステージ、前記メモリアクセスステージに対応する模擬メモリアクセスステージ及び前記レジスタ格納ステージに対応する模擬レジスタ格納ステージを有し、
前記検出部は、前記フラグが前記模擬命令実行ステージに到達した場合に、前記バス上にある情報を取込む情報処理装置。
【請求項１５】
請求項１４において、
前記第２命令セットは、Ｊａｖａバイトコードであり、
前記所定の条件は、Ｊａｖａ例外が検出されることであり、
前記所定の命令は、Ｊａｖａ例外処理を行うためにソフトＶＭに処理を渡す命令である情報処理装置。
【請求項１６】
請求項１５において、
前記Ｊａｖａ例外は、Ｎｕｌｌ　Ｐｏｉｎｔｅｒ　Ｅｘｃｅｐｔｉｏｎ、Ａｒｒａｙ　Ｉｎｄｅｘ　Ｏｕｔ　Ｏｆ　Ｂｏｕｎｄｓ　Ｅｘｃｅｐｔｉｏｎ又はＡｒｉｔｈｍｅｔｉｃ　Ｅｘｃｅｐｔｉｏｎの何れか一つである情報処理装置。
【請求項１７】
情報処理装置であって、
第１命令セットを固有命令として実行するための複数のステージを有する命令実行部と、
第２命令セットの命令を前記第１命令セットの第１命令列に変換して前記命令実行部に供給するための命令変換回路と、
前記複数のステージに対応する複数の模擬ステージを有する模擬パイプラインとを具備する情報処理装置。
【請求項１８】
請求項１７において、
前記情報処理装置は、カウンタを更に具備し、
前記模擬パイプラインは、前記第１命令列に対応するフラグが入力され、
前記複数のステージは、命令デコードステージ、命令実行ステージ、メモリアクセスステージ及びレジスタ格納ステージを有し、
前記複数の模擬ステージは、前記命令デコードステージに対応する模擬命令デコードステージ、前記命令実行ステージに対応する模擬命令実行ステージ、前記メモリアクセスステージに対応する模擬メモリアクセスステージ及び前記レジスタ格納ステージに対応する模擬レジスタ格納ステージを有し、
前記カウンタは、前記フラグが前記模擬レジスタ格納ステージに到達した場合にカウントする情報処理装置。
【請求項１９】
請求項１８において、
前記情報処理装置は、カウンタを更に具備し、
前記模擬パイプラインは、前記第１命令列の所定の命令に対応するフラグが入力され、
前記複数のステージは、命令デコードステージ、命令実行ステージ、メモリアクセスステージ及びレジスタ格納ステージを有し、
前記複数の模擬ステージは、前記命令デコードステージに対応する模擬命令デコードステージ、前記命令実行ステージに対応する模擬命令実行ステージ、前記メモリアクセスステージに対応する模擬メモリアクセスステージ及び前記レジスタ格納ステージに対応する模擬レジスタ格納ステージを有し、
前記カウンタは、前記フラグが前記模擬命令実行ステージに到達し、かつ、前記命令実行部で後方分岐が起きたことを検出した場合にカウントする情報処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は情報処理装置、特に中間言語をプロセッサ固有の命令に変換して実行する情報処理装置における、特定のイベントの検出、及び、処理方法に関する。
【０００２】
【従来の技術】
近年、Ｊａｖａ言語で記述されたアプリケーションが携帯電話や携帯端末で急速に広がっている。Ｊａｖａとはサン・マイクロシステムズ社により開発されたＣ＋＋に類似したオブジェクト指向プログラミング言語である。なお、”Ｊａｖａ”はサン・マイクロシステムズ社の登録商標である。Ｊａｖａ言語が受けいれられる要因として、Ｊａｖａ言語は、中間言語に対して仮想マシンを用いてＣＰＵに固有の命令に変換して実行される特徴が挙げられる。仮想マシンを備えるＣＰＵであれば、ＣＰＵの種類に依存せずにＪａｖａアプリケーションを実行することができるので移植性が高い。なお、中間言語とは、Ｊａｖａの実行オブジェクトを生成するためのコンパイルの結果であり、Ｊａｖａバイトコードまたは省略してバイトコードとも呼ばれる。
【０００３】
仮想マシン（以下”ＶＭ”と呼ぶ）は、一般にソフトウェア（これを以下”ソフトＶＭ”と呼ぶ）で提供されるが、各バイトコードをインタプリタで解釈実行するために一般には低速である。このため、使用頻度の高いバイトコードをハードウェア実行することで高速化を行うハードウェアアクセラレータが知られている。ハードウェアアクセラレータの例については「日経エレクトロニクス」、ｎｏ．７９７，ｐｐ．１６８−１７６，２００１．６．４（この記事はＪａｖａ　ｔｏ　ｇｏ：　Ｐａｒｔ　１；　Ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ　Ｒｅｐｏｒｔ，ｖｏｌ．１５，ｎｏ．２，Ｆｅｂ．２００１の翻訳である）に記載される。
【０００４】
【発明が解決しようとする課題】
本願発明者等は、本願に先立って、ハードウェアアクセラレータでバイトコードを処理する際のＪａｖａにおけるスレッド切り替えについて検討を行った。ＶＭの仕様はサン・マイクロシステムズ社により決定される。サン・マイクロシステムズ社はＪａｖａ２として複数の仕様を公開しており、そのうち組み込み機器向けの仕様はＪ２ＭＥである。この仕様にはさらに、ネットワーク情報機器用のＣＤＣと、ＣＰＵやメモリに制限のある携帯型ネットワーク情報機器用のＣＬＤＣの２つの仕様がある。
【０００５】
一般に、通常の複数のタスクを実行するＯＳでは、タスクの切り替えのタイミングの検出はタイマー割り込みを用いている。Ｊａｖａも複数のタスクを平行して実行している。Ｊａｖａでは、上記タスクのことを特にスレッドと呼んでいる。サン・マイクロシステムズ社が示したＣＤＣの参照実装におけるスレッド切り替えも、タイマー割り込みで行っている。一方、ＣＬＤＣの参照実装では、より簡単にスレッド切り替えを実現するために、実行したバイトコード数をカウントして、一定の値に達すると、スレッドの切り替えを行っている。図２にその概念図を示す。スレッドＡ（ＴＨ＿Ａ）、スレッドＢ（ＴＨ＿Ｂ）、スレッドＣ（ＴＨ＿Ｃ）の３つのスレッドが実行され、最初にＴＨ＿ＡにおけるＴＨ＿Ａ１が実行されているとする。ＴＨ＿Ａ１の実行したバイトコードがある一定数に達すると、ＶＭは実行するスレッドをＴＨ＿Ｂ１に切り替える。次にＴＨ＿Ｂ１が実行したバイトコード数が一定に達すると、同様にＴＨ＿Ｃ１に切り替わり、ＴＨ＿Ｃ１の次はＴＨ＿Ａ２に切り替わる。
【０００６】
従来は、このカウンタのデクリメントとアンダーフローのチェックをソフトウェアで実行していた。例えば、カウント数をＣＰＵの汎用レジスタ上にマッピングし、ＣＰＵの固有の命令でカウンタのデクリメントを行う。この場合、カウントをデクリメントする命令とタスク切り替えの処理に条件分岐する命令を、毎バイトコード毎に実行することになる。この場合、通常のハードウェアによるタイマー割り込みに比べて、実行命令数が増えることになり、高速動作が困難になることに本願発明者等は気が付いた。
【０００７】
スレッド切り替えと似たＶＭの仕様に、ガベッジコレクションがある。ＶＭはランダムに使用するメモリ領域を持っており、Ｊａｖａプログラムの実行が進むとこのメモリ領域に使われなくなったエリアが断続的に残る。そこで、ＶＭはガベッジコレクションと呼ばれるメモリの整理を行う。ガベッジコレクションを行うかどうかチェックするタイミングはＶＭにより異なる。サン・マイクロシステムズ社が示したＣＤＣの参照実装では、後方分岐が実行された数をカウントして、アンダーフローしたところでガベッジコレクションのチェックを行う。この場合も、カウンタのデクリメントとアンダーフローのチェックはソフトウェアにより実行されており、スレッド切り替えの場合と同様に実行命令数が増えることになり、高速動作が困難になることに本願発明者等は気が付いた。
【０００８】
本発明の一つ目的は、ハードウェアアクセラレータにおいて、上記に示したような実行バイトコード数、あるいは、後方分岐数を正確かつ高速にハードウェアでカウントする機構を備えた情報処理装置を提供することである。
【０００９】
また、Ｊａｖａには特有のＪａｖａ例外と呼ばれる処理がある。Ｊａｖａでは、プログラムが配列構造のデータにアクセスしようとした際、配列へのポインタがＮｕｌｌでないこと、アクセスしようとしているインデックスが範囲を超えていないことを毎回チェックする。Ｎｕｌｌの場合はＮｕｌｌ　Ｐｏｉｎｔｅｒ　Ｅｘｃｅｐｔｉｏｎ、インデックスが範囲を超える場合はＡｒｒａｙ　Ｉｎｄｅｘ　Ｏｕｔ　Ｏｆ　Ｂｏｕｎｄｓ　ＥｘｃｅｐｔｉｏｎというＪａｖａ例外を発生させて、例外処理のルーチンへ分岐する。Ｊａｖａ例外にはこの他にも、０で除算を行おうとした際に発生するＡｒｉｔｈｍｅｔｉｃ　Ｅｘｃｅｐｔｉｏｎなどがある。このように、配列をアクセスする際に、Ｎｕｌｌでないこと、アクセスしようとしているインデックスが範囲を超えていないことを毎回チェックする必要があり、このチェックをソフトウェアにより行おうとすると実行命令数が増えるため、高速動作の妨げになることに本願発明者等は気が付いた。
【００１０】
本発明の他の一つの目的は、ハードウェアアクセラレータによってバイトコードをＣＰＵに固有の命令に変換する情報処理装置において、Ｊａｖａ例外の検出処理を高速に行う機構を提供することにある。
【００１１】
【課題を解決するための手段】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば、下記の通りである。すなわち、第１命令セットを固有命令として実行するための命令実行部と、第２命令セットの命令を前記第１命令セットの第１命令列に変換して前記命令実行部に供給するための命令変換回路と、所定のイベントをカウントするためのカウンタ手段とを具備し、前記命令変換回路は、前記カウンタが所定の条件を満たした際に、所定の命令を出力するよう情報処理装置を構成する。
【００１２】
更に望ましくは、前記命令実行部を複数のステージを有するパイプライン型とし、前記複数のステージに対応する複数の模擬ステージを有する模擬パイプラインを設けることが好ましい。
【００１３】
更に望ましくは、前記カウンタが前記所定の条件を満たした際に、前記命令実行部のパイプライン上に残った後続命令を無効化する機構を設けると良い。
【００１４】
【発明の実施の形態】
以下、本発明に係る情報処理装置及びシステムの好適な実施の形態について、添付図面を参照しながら説明する。特に制限されないが、実施例の各ブロックを構成する回路素子は、公知のＣＭＯＳ（相補型ＭＯＳトランジスタ）やバイポーラトランジスタ等の半導体集積回路技術によって、単結晶シリコンのような１個の半導体基板上に形成される。
【００１５】
図１に、本発明の情報処理装置の第１の実施例を示す。本実施例は、スレッドの切り替えを高速に行う情報処理装置の一実施例を示すものである。図１では命令フェッチ部（ＩＦ）３、命令変換部（ＡＣＣ）２（以下、アクセラレータと呼ぶ）、命令実行部（ＣＰＵ）１（以下、ＣＰＵと呼ぶ）を別ブロックで示したが、これらの区分は必ずしも明確ではなく、全てをＣＰＵと呼んだり、これらのいくつかをまとめてＣＰＵと呼ぶ場合もある。図１においてＣＰＵ（ＣＰＵ）１は、一般的なプロセッサと同様、Ｊａｖａバイトコードとは異なるプロセッサ固有の命令（以下ＣＰＵ命令）の集まりである命令セット（以下ＣＰＵ命令セット）を持っている。この実施例のＣＰＵ（ＣＰＵ）１はパイプライン処理を行い、特に制限されないが、パイプライン（ＰＬ）１１は、命令デコードステージ（ＩＤステージ）（ＩＤ）、命令実行ステージ（ＥＸステージ）（ＥＸ）、メモリアクセスステージ（ＭＡステージ）（ＭＡ）、レジスタ格納ステージ（ＷＢステージ）（ＷＢ）を有する。パイプライン（ＰＬ）１１は、パイプラインコントロール部（ＰＬＣ）１２により、パイプライン（ＰＬ）１１のストールや、分岐時の後続命令のキャンセル等の制御がされる。
【００１６】
メモリ装置（ＭＥＭ）４は、Ｊａｖａバイトコード、ソフトＶＭ、フレーム等Ｊａｖａを実行するための情報を保持している。更に、メモリ装置（ＭＥＭ）４は、ほかのＣＰＵ命令で記述されたアプリケーションソフトウェアやソフトウェアの実行のためのワーク領域なども含む。尚、メモリ装置（ＭＥＭ）４は、キャッシュメモリのようなＳＲＡＭ、メインメモリとなるべきＤＲＡＭ、又はそのキャッシュメモリとメインメモリの両方を持つもの等があげられるが、情報を保持できるものであればこれらに制限されない。また、ＣＰＵ（ＣＰＵ）１と同一のチップであっても別々のチップであっても構わない。
【００１７】
メモリ装置（ＭＥＭ）４から通常のＣＰＵ命令が供給された場合は、命令フェッチ部（ＩＦ）３を通り、アクセラレータ（ＡＣＣ）２を介さない経路（４→３→１１）で実行される。一方、メモリ装置（ＭＥＭ）４４からバイトコードが供給された場合は、命令フェッチ部（ＩＦ）３を通り、アクセラレータ（ＡＣＣ）２内の命令変換回路（ＢＴ）２１にバイトコードが入力され、入力されたバイトコードはＣＰＵ（ＣＰＵ）１が解釈可能な一つの、又は、複数の命令列（以下、ＣＰＵ命令列と呼ぶ）に変換され、ＣＰＵ（ＣＰＵ）１で実行される（４→３→２１→１１）。ここで、命令変換回路は、マイクロコードによりバイトコードをＣＰＵ命令に変換してもいいし、又は、ハードワイヤードによりバイトコードをＣＰＵ命令に変換してもよい。マイクロコードにより変換する場合は、異なるＣＰＵ命令セットを有する種々のＣＰＵに柔軟に対応することができる。また、ハードワイヤードにより変換する場合は、マイクロコードにより変換する場合よりも、回路規模を縮小することができる。
【００１８】
前述したように、ＶＭの実装によっては、実行したバイトコードの数によりスレッドを切り替える仕様のものがある。この場合に、アクセラレータ（ＡＣＣ）が命令変換回路（ＢＴ）２１で変換したバイトコード数をカウントすると、パイプライン（ＰＬ）１１のストールや分岐時のパイプラインキャンセル等により、実際に実行したバイトコード数と一致しない。そこで、本願発明者等は、ＣＰＵ（ＣＰＵ）１で実行されたバイトコード（実行イベント）をカウントするカウンタ（ＣＮＴ）２３をアクセラレータ（ＡＣＣ）２に設けた。即ち、一つのバイトコードがＣＰＵ（ＣＰＵ）１で実行されたのを受けて、カウンタ（ＣＮＴ）２３はカウント値を一つ減らす（デクリメント）。カウンタ（ＣＮＴ）２３がアンダーフローすると、カウンタ（ＣＮＴ）２３はＣＰＵ（ＣＰＵ）１のパイプラインコントロール部（ＰＬＣ）に伝え、パイプラインコントロール部（ＰＬＣ）は、パイプライン（ＰＬ）１１上に残った後続命令をキャンセル（無効化）する（２３→１２→１１）。同時に命令変換回路（ＢＴ）２１は、所定の命令列（ソフトＶＭに処理を渡すために必要な命令列）を出力する。スレッドの切り替えはソフトＶＭにより実行される。このような構成とすることで、ソフトウェアでカウントするよりも、高速にカウントすることが可能となり、情報処理装置の高速動作が可能となる。
【００１９】
更に、本実施例では、アクセラレータ（ＡＣＣ）２内に模擬パイプライン（ＳＰＬ）２２を有する。模擬パイプライン（ＳＰＬ）２２には、パイプライン（ＰＬ）１１の命令デコードステージ（ＩＤ）に対応する模擬命令デコードステージ（ＩＤ）、命令実行ステージ（ＥＸ）に対応する模擬命令実行ステージ（ＥＸ）、メモリアクセスステージ（ＭＡ）に対応する模擬メモリアクセスステージ（ＭＡ）及び前記レジスタ格納ステージ（ＷＢ）に対応する模擬レジスタ格納ステージ（ＷＤ）を有する。また、模擬パイプライン（ＳＰＬ）２２は、パイプラインコントロール部（ＰＬＣ）１２がパイプライン（ＰＬ）１１を制御する信号を用いて制御される。つまり、模擬パイプライン（ＳＰＬ）２２のパイプライン動作は、パイプライン（ＰＬ）１１と同じパイプライン動作を行う。模擬パイプライン（ＳＰＬ）２２には、バイトコードから展開されたＣＰＵ命令列の最後のＣＰＵ命令に同期したフラグ（ＦＬＧ１）を流す。ＦＬＧ１が模擬パイプライン（ＳＰＬ）２２の模擬レジスタ格納ステージ（ＷＢ）に到達すると、カウンタ（ＣＮＴ）２３はカウント値を１減らす。このようにパイプライン（ＰＬ）１１の複数のステージに対応する複数の模擬ステージを有する模擬パイプライン（ＳＰＬ）１１を設けることにより、正確に実行されたバイトコード数をカウントすることができる。
【００２０】
更に、本実施例では、カウンタ最大値レジスタ（ＭＡＸＣＮＴ）２５を有する。このカウンタ最大値レジスタ（ＭＡＸＣＮＴ）２５は、カウンタ（ＣＮＴ）２３がアンダーフローした際に、カウンタ（ＣＮＴ）２３に書き込む初期値を指定するためのレジスタである。したがって、ソフトＶＭ等のソフトウェアで、カウンタ（ＣＮＴ）２３を自由に設定することが出来、また、カウンタ（ＣＮＴ）２３がアンダーフローした場合には自動的に初期値が書き込まれるため高速動作が実現できる。
【００２１】
図３に、本発明の情報処理装置の第２の実施例を示す。第２の実施例は、後方分岐をカウントする場合を示している。本実施例も、第１の実施例と同様、ＣＰＵの区分や、同一チップか別チップかは特に制限されない。また、特に制限されないが、ＣＰＵ命令セットにおける分岐命令は、事前の命令により設定された真偽ｂｉｔ（Ｔ−ｂｉｔ）を参考にして実際に分岐するかを決定する命令である。図４に本実施例での分岐に関するバイトコードと、命令変換回路（ＢＴ）２１が出力するＣＰＵ命令列の例を示す。ＴＳＴ命令とＣＭＰ命令は、ゼロ比較と大小関係を比較し、真偽によってＴ−ｂｉｔを変更する命令である。ＢＴ、ＢＦ命令は、それぞれ、Ｔ−ｂｉｔが真の時、Ｔ−ｂｉｔが偽のときに分岐を実施し、それ以外の場合は何も行わない命令である。Ｔ−ｂｉｔはＥＸステージに同期して変更される。
【００２２】
第２の実施例では、後方分岐が成立した場合（後方分岐イベント）に、カウンタ（ＣＮＴ）２３はカウント値を１減少させる。カウンタ（ＣＮＴ）２３がアンダーフローした場合は、第１の実施例と同様、２３→１２→１１の経路でパイプライン（ＰＬ）１１上に残った後続命令をキャンセルし、命令変換回路（ＢＴ）２１は、所定の命令列（ソフトＶＭに処理を渡す命令列）を出力する。ガベッジコレクションチェックはソフトＶＭにより実行される。これにより情報処理装置の高速動作が実現される。
【００２３】
更に、第２の実施例における情報処理装置は、第１の実施例と同様、アクセラレータ（ＡＣＣ）２は模擬パイプライン（ＳＰＬ）２２を有し、更に、後方分岐が成立したかを判定する検出部（ＣＨＫ）２４を有する。模擬パイプライン（ＳＰＬ）２２には、ＢＴ、ＢＦ命令に同期したフラグ情報（ＦＬＧ２）を流す。検出部（ＣＨＫ）２４は、模擬パイプライン（ＳＰＬ）２２のＥＸステージからフラグ情報を受け取ると共に、ＣＰＵ（ＣＰＵ）１のパイプライン（ＰＬ）１１からＴ−ｂｉｔを受ける。検出部（ＣＨＫ）２４はＢＴ命令がＥＸステージに来た時にＴ−ｂｉｔが真の場合、及び、ＢＦ命令がＥＸステージに来たときにＴ−ｂｉｔ命令が偽の場合、分岐が成立したと判定する。検出部（ＣＨＫ）２４が分岐を判定すると、カウンタ（ＣＮＴ）２３に通知し、カウンタ（ＣＮＴ）２３はカウンタ値を１減少させる。このような構成とすることにより正確に後方分岐の数をカウントすることが可能となる。
【００２４】
第１の実施例では実行バイトコードのカウントの場合を、第２の実施例では、後方分岐のカウントの場合を夫々説明したが、両者を実現したい場合は、夫々に対応したカウンタ（ＣＮＴ）２３を設ければよい。即ち、実行バイトコード数をカウントする第１カウンタと後方分岐をカウントする第２カウンタを設ければよい。この場合に、カウント最大値レジスタ（ＭＡＸＣＮＴ）２５は夫々持つと良いが、共有することもできる。更に、模擬パイプライン（ＳＰＬ）２１も、共有することができるし、夫々に対応して設けてもよい。模擬パイプライン（ＳＰＬ）２１を共有する場合には、展開後の最終命令フラグ（ＦＬＧ１）、ＢＴ、ＢＦフラグ（ＦＬＧ２）の情報の両者を流せばよい。
【００２５】
図５に、本発明の情報処理装置の第３の実施例を示す。第３の実施例は、カウンタ（ＣＮＴ）２３が実行したバイトコードの数をカウントするのか、分岐した数をカウントするのかを選択できる実施例である。アクセラレータ（ＡＣＣ）２は命令変換回路（ＢＴ）２１、模擬パイプライン（ＳＰＬ）２２、検出部（ＣＨＫ）２４、カウンタ（ＣＮＴ）２３、カウンタ最大値レジスタ（ＭＡＸＣＮＴ）２５、及び、カウントモードレジスタ（ＣＮＴＭＤ）２６を含む。
【００２６】
図６にソフトＶＭ等のソフトウェアで設定できるレジスタを示す。カウンタ最大値レジスタ（ＭＡＸＣＮＴ）２５は、上述のようにカウンタ（ＣＮＴ）２３がアンダーフローした際にカウンタ（ＣＮＴ）２３に書き込む初期値を指定するためのレジスタである。カウントモードレジスタ（ＣＮＴＭＤ）２６は、バイトコード数と後方分岐のどちらをカウントするか、あるいは、カウントを行わないかを指定するレジスタである。
【００２７】
模擬パイプライン（ＳＰＬ）２２には、展開後の最終命令フラグ（ＦＬＧ１）、ＢＴ、ＢＦフラグ（ＦＬＧ２）の情報を流す。カウントモードレジスタ（ＣＮＴＭＤ）２６に実行バイトコード数をカウントするよう指定されている場合は、検出部（ＣＨＫ）２４は、模擬パイプライン（ＳＰＬ）２２の模擬レジスタ格納ステージ（ＷＢ）のＦＬＧ１の内容をそのままカウンタ（ＣＮＴ）２３に伝える。カウントモードレジスタ（ＣＮＴＭＤ）２６に後方分岐をカウントするよう指定されている場合は、第２の実施例と同様、模擬パイプライン（ＳＰＬ）２２のＥＸステージのＦＬＧ２とＣＰＵ（ＣＰＵ）１のＴ−ｂｉｔを用いて、検出部（ＣＨＫ）２４が分岐成立を検出し、カウンタ（ＣＮＴ）２３に伝える。カウンタ（ＣＮＴ）２３はデクリメントを行う。カウンタ（ＣＮＴ）２３がアンダーフローすると、パイプラインコントロール部１２はパイプライン（ＰＬ）１１をキャンセルし、命令変換回路（ＢＴ）２１はソフトＶＭに処理を渡す命令列を出力する。同時に、カウンタ最大値レジスタ（ＭＡＸＣＮＴ）２５の値がカウンタ（ＣＮＴ）２３にロードされる。このように、カウントモードレジスタ（ＣＮＴＭＤ）を設けることにより、カウンタ（ＣＮＴ）２３を実行バイトコード数をカウントするか、後方分岐をカウントするかを任意に設定でき、回路規模を小さくすることができる。
【００２８】
第１、第２、第３の実施例では、アクセラレータ（ＡＣＣ）２における命令カウントのシステムの構成を示した。実施例では、レジスタ格納ステージ（ＷＢ）、命令実行ステージ（ＥＸ）での検出方法を示したが、これらは特に制限されるわけではない。本発明で重要なのは、アクセラレータ（ＡＣＣ）２が、適切なタイミングでカウントを行い、もしくは、適切なタイミングでＣＰＵ（ＣＰＵ）１の信号チェックしてカウントを行うことである。
【００２９】
また、カウンタ（ＣＮＴ）２２は、カウント値を１減らす構成としたが、これに制限されない。例えば、カウント値を１増やす構成とすることも可能である。この場合、カウント最大値レジスタ（ＭＡＸＣＮＴ）には、初期値でなく、カウンタ（ＣＮＴ）２２がオーバーフローするカウント値を設定できるようにすればよい。本発明のおけるカウンタ（ＣＮＴ）２２において重要なことは、所定のイベント（例えば、バイトコードが実行された数、後方分岐が成立した数）をカウントし、所定の条件を満たした場合（例えば、アンダーフロー）に、アクセラレータ（ＡＣＣ）２から所定の命令が出力されるように構成することにある。また、カウンタ（ＣＮＴ）は、アクセラレータ（ＡＣＣ）２に設ける必要はなく、ＣＰＵ（ＣＰＵ）１に設けられてもよいし、又、その他の場所に設けられても良い。更には、カウンタ最大値レジスタ（ＭＡＸＣＮＴ）を設けずにソフトウェアにより設定できるようにしてもよい。
【００３０】
図７に、本発明の情報処理装置の第４の実施例を示す。第４の実施例は、模擬パイプライン（ＳＰＬ）２２を用いてＪａｖａ例外を検出する実施例である。図７では、メモリ装置４から命令をフェッチする際に、バス（ＢＵＳ）５を通って、フェッチ部３に送る経路を持つ。また、バス（ＢＵＳ）は、アクセラレータ（ＡＣＣ）２にある検出部（ＣＨＫ）２４及びＣＰＵ（ＣＰＵ）１にも接続される。更に、第１から第３の実施例と同様に、模擬パイプライン（ＳＰＬ）２２を有する。
【００３１】
まず、ＣＰＵ（ＣＰＵ）１のメモリからデータをロードする手順を、パイプライン（ＰＬ）１１の動作の流れに沿って示す。命令はＩＤステージで解釈される。ＥＸステージでアクセスするアドレスを計算し、バス（ＢＵＳ）５にアドレスを乗せる。ＭＡステージはメモリ装置（ＭＥＭ）４の内部でデータにアクセスしている段階で、パイプライン（ＰＬ）１１上では特に動作しない。ＷＢステージは指定したアドレスのデータがバス（ＢＵＳ）５を通してＣＰＵ（ＣＰＵ）１に伝えられ、汎用レジスタに書かれる。
【００３２】
次に、Ｊａｖａ例外の検出をｂａｌｏａｄバイトコードを例に説明する。ｂａｌｏａｄは、Ｊａｖａスタック上にあるポインタとインデックスからアドレスを計算し、メモリ装置（ＭＥＭ）４上に配列から１ｂｙｔｅ長のデータを取り込み、Ｊａｖａスタックにプッシュするバイトコードである。ｂａｌｏａｄを実行するには、本体の処理を実行する前にＪａｖａ例外のチェックを行わなければならない。すなわち配列へのポインタがＮｕｌｌでないこと、アクセスしようとしているインデックスが範囲を超えていないことのチェックである。前者のＪａｖａ例外がＮｕｌｌ　Ｐｏｉｎｔｅｒ　Ｅｘｃｅｐｔｉｏｎ、後者がＡｒｒａｙ　Ｉｎｄｅｘ　Ｏｕｔ　Ｏｆ　Ｂｏｕｎｄｓ　Ｅｘｃｅｐｔｉｏｎである。Ｊａｖａ例外を検出すると、ソフトＶＭ中に実装されているＪａｖａ例外処理のルーチンへ分岐する。
【００３３】
図８（Ａ）に本発明との比較のためＣＰＵ命令のみでＪａｖａ例外を検出する場合のｂａｌｏａｄバイトコードを示す。実行前に、スタック上の配列のポインタとインデックスが汎用レジスタのＲ１、Ｒ０にマッピングされているとする。Ｊａｖａ例外のハンドラの開始アドレスをＲ６、一時使用のレジスタをＲ５としている。図８（Ａ）の項目００番で、配列へのポインタ（Ｒ１）とオフセット（ｏｆｆｓｅｔ１）から、配列長をＲ５へロードする。項目０１番はポインタがＮｕｌｌかどうかのチェックである。Ｎｕｌｌの場合は項目０２番でＪａｖａ例外処理のハンドラへ分岐する。項目０３番は、インデックスの正負をチェックし、０以下の場合は項目０４番でＪａｖａ例外処理のハンドラへ分岐する。項目０５番は、インデックスと配列長の大小をチェックし、範囲を超えている場合は項目０６番でＪａｖａ例外処理のハンドラへ分岐する。以上のチェックが終了して初めて、項目０７番で対象となるバイトデータのアドレスを計算し、項目０８番でバイトデータをロードする。すなわち、ｂａｌｏａｄバイトコードをＣＰＵ命令のみで行おうとすると、９命令のうち７命令がＪａｖａ例外の検出のために使用される。なお、図中のｏｆｆｓｅｔ１、ｏｆｆｓｅｔ２はＶＭに固有の定数であり、アクセラレータ（ＡＣＣ）２が出力する命令列に挿入される。
【００３４】
本願発明者等は、Ｊａｖａ例外検出の高速化を検討するにあたり、項目００番の配列長ロード命令に注目した。この命令を実行すると、配列長を格納しているアドレスと配列長がバス（ＢＵＳ）５に出力される。そこで、アクセラレータ（ＡＣＣ）２にある検出部（ＣＨＫ）２２がＣＰＵ（ＣＰＵ）１の動作を監視することで、バス（ＢＵＳ）に出力された配列長を格納しているアドレスや配列長を取り込んで、Ｊａｖａ例外を検出する構成とした。このようにＪａｖａ例外の検出をハードウェアで行うことにより、後に詳述するが、ＣＰＵ命令のみでＪａｖａ例外を検出するよりも命令数が少なくなり、情報処理装置が高速に動作可能となる。
【００３５】
また、検出部（ＣＨＫ）２４のＣＰＵ（ＣＰＵ）１の動作の監視に、模擬パイプライン（ＳＰＬ）２２を用いることにした。即ち、所定の命令がパイプライン（ＰＬ）１１のどのステージにいるかを模擬パイプライン（ＳＰＬ）に入力したフラグ（ＦＬＧ３）の位置で検出部（ＣＨＫ）２４の動作を制御することでバス（ＢＵＳ）５にアドレスやデータが出力されるタイミングを容易に測ることができる。
【００３６】
図８（Ｂ）にハードウェアアクセラレータ（ＡＣＣ）２を用いた場合のＣＰＵ命令列を示す。項目００番で、配列へのポインタ（Ｒ１）と定数であるｏｆｆｓｅｔ１の和のアドレスから、配列長をＲ５へロードする。この命令のＥＸステージに同期して、バス（ＢＵＳ）５に乗るアドレスを検出部（ＣＨＫ）２４が取り込む（時刻Ｔ１）。また、配列長は項目００番の命令のＷＢステージに同期して、メモリからバス（ＢＵＳ）５に出力され、これも、検出部（ＣＨＫ）２４が取り込む（時刻Ｔ３）。項目０１番のＬＤＣ命令はＥＸステージに同期して、レジスタの値をアクセラレータ（ＡＣＣ）２に伝える命令である（時刻Ｔ２）。これらの３つのデータを用いて、検出部（ＣＨＫ）２４が比較演算等を行い、Ｊａｖａ例外の検出を行う。Ｊａｖａ例外条件を満たしている場合は、検出部（ＣＨＫ）２４がパイプラインコントロール部（ＰＬＣ）１２に指示して、パイプライン（ＰＬ）１１をキャンセルする。その後、ソフトウェアに処理を渡す命令列を発行する。Ｊａｖａ例外の処理はソフトウェアが行う。
【００３７】
図９から図１２にｂａｌａｏｄのＪａｖａ例外の検出を時間を追って示す。時刻Ｔ１（図９）は、アクセラレータ（ＡＣＣ）２の模擬パイプライン（ＳＰＬ）２２上で項目００番の命令に同期したフラグがＥＸステージに到達した状態である。このタイミングに同期して、バス（ＢＵＳ）５上のアドレスを取り込む。時刻Ｔ２（図１０）は項目０１番の命令に同期したフラグが模擬パイプライン（ＳＰＬ）２２のＥＸステージに来た状態である。このタイミングに同期して、検出部（ＣＨＫ）２４は、ＣＰＵ（ＣＰＵ）１が出力したデータを取り込む。時刻Ｔ３（図１１）は、項目００番の命令に同期したフラグがＷＢステージに到達した状態である。このタイミングで、バス（ＢＵＳ）５上のデータを取り込む。以上の３データで比較演算等を行い、Ｊａｖａ例外の判定を行う。Ｊａｖａ例外を検出した場合は、検出部（ＣＨＫ）２４がＣＰＵ（ＣＰＵ）１のパイプラインコントロール部（ＰＬＣ）１２にパイプライン（ＰＬ）１１のキャンセルを指示し、後続命令をキャンセルする（時刻Ｔ４、図１２）。次のサイクルから、アクセラレータ（ＡＣＣ）２はＪａｖａ例外処理を行うため、ソフトウェアに処理を渡す命令列（項目０６番とそれ以降の命令列）を発行する。
【００３８】
図１４に本発明の情報処理装置の第５の実施例を示す。第５の実施例はｉｄｉｖバイトコードにおけるＣＰＵ命令列を途中で切り替える実施例である。ｉｄｉｖ命令は３２ｂｉｔの整数除算命令である。図１４ではスタックトップと２番目のスタックが汎用レジスタＲ０、Ｒ１にマッピングされており、Ｒ１÷Ｒ０を計算する。Ｒ５、Ｒ６は一時使用に割り当てた汎用レジスタである。
【００３９】
本実施例におけるＣＰＵ命令セットでは、除算命令が１ビット除算であり、これを必要な回数繰り返して実行する。従って、３２ｂｉｔ除算と１６ｂｉｔ除算では、命令数に大きな差が出る。そこで、命令変換回路（ＢＴ）２１には、３２ｂｉｔ除算の命令列と１６ｂｉｔ除算の命令列を実装する。そして、最初に３２ｂｉｔ除算の命令列を発行し、１６ｂｉｔ除算と判定した時点で１６ｂｉｔ除算の命令列に切り替えるようにする。この場合に、３２ビット除算の命令列と１６ビット除算の命令列で共通に出来る部分は共通にするように構成する。
【００４０】
次に第５の実施例の更に詳細な説明する。図１４の項目００番のＬＤＣ命令は、ＣＰＵ（ＣＰＵ）１の汎用レジスタの値をＥＸステージに同期してアクセラレータ（ＡＣＣ）２内の検出部（ＣＨＫ）２４に除数を伝える。この命令は０除算チェックもかねている。０の場合はＡｒｉｔｈｍｅｔｉｃ　Ｅｘｃｅｐｔｉｏｎにあたり、第４の実施例と同様の方法でソフトＶＭに処理を渡す。項目０１番は、被除数を検出部（ＣＨＫ）２４に伝える。命令を取り込むタイミングは、アクセラレータ（ＡＣＣ）２内の模擬パイプライン（ＳＰＬ）２２で測る。以上で得られた除数、被除数が１６ｂｉｔ長に収まっている場合は１６ｂｉｔ除算命令列に切り替える。本実施例では、３２ｂｉｔ命令列と１６ｂｉｔ命令列で、項目００番から０３番までを共通にした。このため、項目０４番以降の命令列を切り替えるだけでよく、パイプライン（ＰＬ）１１のキャンセルは行わないため、更に高速動作が可能となる。
【００４１】
第４の実施例と第５の実施例は、Ｊａｖａ例外の検出とｉｄｉｖバイトコードの命令列切り替え機構を示したが、他のバイトコードにも応用できる。本発明で重要なのは、ＣＰＵ（ＣＰＵ）１の動作を監視することができる検出部（ＣＨＫ）２３を有し、適切なタイミングを測ってＣＰＵ（ＣＰＵ）１の信号を取り込み、アクセラレータ（ＡＣＣ）２の出力命令列を切り替える点にある。また、検出部（ＣＨＫ）２４の動作を模擬パイプライン（ＳＰＬ）２２で制御することにより容易にタイミングを測ることができる。その際、第４実施例に示したパイプライン（ＰＬ）１１後続命令キャンセル機構を有してもよいし、第５の実施例に示したように、後続命令をキャンセルしないで高速化することも可能である。
【００４２】
また、第１から第３の実施例おいて、実行バイト数や後方分岐数をカウントするために模擬パイプライン（ＳＰＬ）２２を使用している。また、第４及び第５の実施例においては、Ｊａｖａ例外を検出するために模擬パイプライン（ＳＰＬ）２２を使用している。しかし、これらの実施例は、模擬パイプライン（ＳＰＬ）２２を有することにより実現できる一具体例であることは明らかである。即ち、模擬パイプライン（ＳＰＬ）２２を有することでＣＰＵ（ＣＰＵ）１の動作タイミングを容易に知ることができ、第１から第５の実施例以外のアクセラレータ（ＡＣＣ）２の動作を容易にＣＰＵ（ＣＰＵ）１の動作タイミングにあわせることができる。
最後に本発明の好適な応用例としての携帯情報システムの構成図を図１５に示す。より具体的には携帯電話の構成の一例である。大きく分けて、通信部分とアプリケーション部分から構成される。通信部分は、電波を送受信するアンテナ（ＡＮＴ）と高周波回路（ＲＦ）部、ベースバンドのモデム、コーデックを行うベースバンドプロセッサ（ＢＡＳＥＢＡＮＤ）部、主記憶（ＭＥＭ）である。アプリケーション部分は、本発明の実施例のバイトコードアクセラレータ（ＡＣＣ）とＣＰＵ（ＣＰＵ）を内蔵するマイクロプロセッサ（ＰＲＯＣＥＳＳＯＲ）において、インターフェース（Ｉ／Ｆ）を介してアプリケーションプロセッサとベースバンドプロセッサが接続され、周辺インターフェース（ＰＥＲＩＰＨＥＲＡＬ）を介してカメラ（ＣＭＲ）、メモリカード（ＣＡＲＤ）、音源ＩＣ（ＳＯＤ）、キー（ＫＥＹ）が接続され、外部バスを介して液晶（ＬＣＤ）、主記憶（ＭＥＭ１）が接続される。本システム構成例は、携帯電話向けであったが、携帯情報端末やデジタルカメラなど多様なシステム構成例が考えられる。
【００４３】
本システム構成例では、例えば、次のようにメモリが使用される。Ｊａｖａアプリケーションは、外部サーバーよりアンテナ（ＡＮＴ）を介して配給され、ベースバンドプロセッサ（ＢＡＳＥＢＡＮＤ）を使用し、ベースバンド側主記憶（ＭＥＭ２）に格納される。ソフトＶＭは主記憶（ＭＥＭ１）か、ベースバンド側主記憶（ＭＥＭ２）のどちらに配置してもよい。ソフトＶＭのインタプリタ部はアクセス頻度が高いため、内蔵メモリ上に配置されることが望ましい。この発明により、ハードウェアアクセラレータを利用してＪａｖａアプリケーションを高速に実行できるため、携帯情報システムの付加価値を高めることができる。
【００４４】
以上の本願発明はＪａｖａを例にして説明したが、それに限られることはなく、同様の中間言語及びＶＭを固有命令を命令セットで実行するプロセッサに対するハードウェアアクセラレータに適用できる。
【００４５】
【発明の効果】
上記手法により、命令変換型Ｊａｖａアクセラレータにおいて、バイトコード数をカウントする場合のＣＰＵ命令や、Ｊａｖａ例外を検出する為のＣＰＵ命令の数を削減でき、高速に動作させることが可能である。
【図面の簡単な説明】
【図１】本発明による情報処理装置の概略ブロック図。
【図２】Ｊａｖａスレッド切り替えの概要。
【図３】第２の実施例における情報処理装置の概略ブロック図。
【図４】分岐バイトコードの命令変換例。
【図５】第３の実施例における情報処理装置の概略ブロック図。
【図６】カウンタに関する設定レジスタの構成例。
【図７】第４の実施例における情報処理装置の概略ブロック図。
【図８】ｂａｌｏａｄバイトコードの変換後の命令列。
【図９】ｂａｌｏａｄバイトコードの動作説明ブロック図。
【図１０】ｂａｌｏａｄバイトコードの動作説明ブロック図。
【図１１】ｂａｌｏａｄバイトコードの動作説明ブロック図。
【図１２】ｂａｌｏａｄバイトコードの動作説明ブロック図。
【図１３】ｂａｌｏａｄバイトコードの動作説明ブロック図。
【図１４】ｉｄｉｖバイトコードの変換後の命令列。
【図１５】本願発明を利用した携帯情報システムの構成図。
【符号の説明】
１…ＣＰＵ（ＣＰＵ）
２…命令変換型アクセラレータ（ＡＣＣ）
３…命令フェッチ部（ＩＦ）
４…メモリ装置（ＭＥＭ）
５…バス（ＢＵＳ）
１１…パイプライン（ＰＬ）
１２…パイプラインコントロール部（ＰＬＣ）
２１…命令変換回路（ＢＴ）
２２…模擬パイプライン（ＳＰＬ）
２３…カウンタ（ＣＮＴ）
２４…検出部（ＣＨＫ）
２５…カウンタ最大値レジスタ（ＭＡＸＣＮＴ）
２６…カウントモードレジスタ（ＣＮＴＭＤ）。
【図１】
2004102375.tif 000003
【図２】
2004102375.tif 000004
【図３】
2004102375.tif 000005
【図４】
2004102375.tif 000006
【図５】
2004102375.tif 000007
【図６】
2004102375.tif 000008
【図７】
2004102375.tif 000009
【図８】
2004102375.tif 000010
【図９】
2004102375.tif 000011
【図１０】
2004102375.tif 000012
【図１１】
2004102375.tif 000013
【図１２】
2004102375.tif 000014
【図１３】
2004102375.tif 000015
【図１４】
2004102375.tif 000016
【図１５】
2004102375.tif 000017