(57)【要約】【課題】  複数の命令を含む命令群の圧縮率を向上する。【解決手段】  圧縮装置は、命令群の列の中の処理対象の命令群である処理対象命令群から処理対象の命令を選択する選択部と、処理の内容を示すオペコードが処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を処理対象の命令のオペランドに対して満たす命令である参照先命令が、処理対象命令群に先行する命令群である先行命令群と処理対象命令群とのいずれかに含まれているか否かを判定する判定部と、参照先命令が先行命令群と処理対象命令群とのいずれかに含まれているとき、参照先命令およびオペランド差分値に基づいて、処理対象の命令を圧縮命令に変換する変換部とを有している。【選択図】  図１
2014059627.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を含む命令群の前記命令を圧縮する圧縮装置であって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択する選択部と、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定する判定部と、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換する変換部と
を備えていることを特徴とする圧縮装置。
【請求項２】
前記オペランド差分値の候補を抽出する差分抽出部と、
前記係数レジスタに設定される前記オペランド差分値を前記候補から選択するレジスタ値決定部と
を備えていることを特徴とする請求項２記載の圧縮装置。
【請求項３】
前記変換部は、前記参照先命令が前記処理対象命令群に含まれているか否か示す第１情報と、前記命令群内での前記参照先命令の位置を示す第２情報と、前記圧縮命令の復元に使用する前記オペランド差分値が設定される前記係数レジスタを示す第３情報とを、前記圧縮命令に含めること
を特徴とする請求項１または請求項２に記載の圧縮装置。
【請求項４】
前記係数レジスタに設定される前記オペランド差分値は、圧縮対象のプログラム内の関数毎に決定されること
を特徴とする請求項１ないし請求項３のいずれか１項に記載の圧縮装置。
【請求項５】
前記係数レジスタに設定される前記オペランド差分値は、圧縮対象のプログラム内の関数より小さい単位の基本ブロック毎に決定されること
を特徴とする請求項１ないし請求項３のいずれか１項に記載の圧縮装置。
【請求項６】
複数の命令を含む命令群の前記命令を圧縮する圧縮方法であって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択し、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定し、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換すること
を特徴とする圧縮方法。
【請求項７】
前記オペランド差分値の候補を抽出し、
前記係数レジスタに設定される前記オペランド差分値を前記候補から選択すること
を特徴とする請求項６記載の圧縮方法。
【請求項８】
複数の命令を含む命令群の前記命令を圧縮する処理を、コンピュータに実行させる圧縮プログラムであって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択し、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定し、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換する
処理をコンピュータに実行させることを特徴とする圧縮プログラム。
【請求項９】
圧縮された命令である圧縮命令を復元するプロセッサであって、
参照先の命令およびオペランド差分値を前記圧縮命令内の情報に基づいて選択し、前記圧縮命令を前記参照先の命令のオペコードと同じオペコードを有する命令に変換し、変換した前記命令のオペランドを前記参照先の命令のオペランドと前記オペランド差分値とに基づいて算出するデコード部を備えていること
を特徴とするプロセッサ。
【請求項１０】
前記命令群内での命令の位置にそれぞれ対応して、前記参照先の命令を記憶する記憶部を備えていること
を特徴とする請求項９記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、圧縮装置、圧縮方法、圧縮プログラムおよびプロセッサに関する。
【背景技術】
【０００２】
近年、組み込み機器の高機能化および低消費電力化の要求が高まっている。このため、組み込み機器として使用されるプロセッサは、高性能で低消費電力であることが要求されている。複数の命令を含む命令群を読み込み、命令群内の複数の命令を並列実行するプロセッサは、単一の命令を読み込んで実行するプロセッサに比べて、性能を向上させることができる。複数の命令を含む命令群は、例えば、ＶＬＩＷ（Very Long Instruction Word）命令である。
【０００３】
なお、ＶＬＩＷ命令を実行するプロセッサは、コンパイル時に命令をスケジューリングする。このため、ＶＬＩＷ命令を実行するプロセッサは、命令をフェッチしてプロセッサ内でスケジューリングするスーパースカラ方式のプロセッサに比べて、低消費電力である。
【０００４】
また、組み込み機器として使用されるプロセッサでは、製造コスト等の低減化が図られている。例えば、ＶＬＩＷ命令を圧縮して命令メモリのサイズを削減することにより、製造コストは低減する。なお、圧縮されたＶＬＩＷ命令を命令メモリからフェッチするプロセッサでは、命令メモリへのアクセス回数が低減するため、消費電力を低減できる。ＶＬＩＷ命令を圧縮する技術は種々提案されている。例えば、ＶＬＩＷ命令に含まれる無実行命令を除去することによりＶＬＩＷ命令を圧縮する技術が提案されている（例えば、特許文献１参照。）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平７−１８２１６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
無実行命令を除去してＶＬＩＷ命令を圧縮する方法では、例えば、無実行命令の発生頻度が低い場合、ＶＬＩＷ命令の圧縮率は低くなる。ＶＬＩＷ命令の圧縮率が低い場合、メモリのサイズ低減効果は小さい。また、ＶＬＩＷ命令の圧縮率が低い場合、プロセッサがＶＬＩＷ命令をフェッチする際の命令メモリへのアクセス回数が低減されない場合がある。この場合、ＶＬＩＷ命令の圧縮によるプロセッサの消費電力の低減効果は、小さい。
【０００７】
１つの側面では、本発明の目的は、複数の命令を含む命令群の圧縮率を向上することである。
【課題を解決するための手段】
【０００８】
本発明の一形態では、圧縮装置は、命令群の列の中の処理対象の命令群である処理対象命令群から処理対象の命令を選択する選択部と、処理の内容を示すオペコードが処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を処理対象の命令のオペランドに対して満たす命令である参照先命令が、処理対象命令群に先行する命令群である先行命令群と処理対象命令群とのいずれかに含まれているか否かを判定する判定部と、参照先命令が先行命令群と処理対象命令群とのいずれかに含まれているとき、参照先命令およびオペランド差分値に基づいて、処理対象の命令を圧縮命令に変換する変換部とを有している。
【発明の効果】
【０００９】
複数の命令を含む命令群の圧縮率を向上できる。
【図面の簡単な説明】
【００１０】
【図１】一実施形態における圧縮装置の例を示している。
【図２】図１に示した圧縮装置による圧縮前後の命令群のフォーマットの一例を示している。
【図３】図２に示した復元情報と係数レジスタに設定されるオペランド差分値との関係の一例を示している。
【図４】圧縮対象の命令のオペランドと参照先命令のオペランドとの関係の一例を示している。
【図５】図１に示した圧縮装置の動作の一例を示している。
【図６】図５に示した基本ブロックに対する圧縮処理の一例を示している。
【図７】図１に示した圧縮装置による圧縮処理の具体例を示している。
【図８】別の実施形態における圧縮装置の一例を示している。
【図９】図８に示した圧縮装置の動作の一例を示している。
【図１０】図９に示したオペランド差分値抽出処理の一例を示している。
【図１１】図１０に示した先行命令群に対するオペランド差分値抽出処理の一例を示している。
【図１２】図１０に示した同一命令群に対するオペランド差分値抽出処理の一例を示している。
【図１３】図１０に示した参照できないオペランド差分値の削除処理の一例を示している。
【図１４】図９に示した係数レジスタ値決定処理の一例を示している。
【図１５】図９に示した基本ブロックに対する圧縮処理の一例を示している。
【図１６】図８に示した圧縮装置の動作の別の例を示している。
【図１７】図１６に示したオペランド差分値抽出処理の一例を示している。
【図１８】図８に示した圧縮装置の動作の別の例を示している。
【図１９】図１８に示したオペランド差分値抽出処理の一例を示している。
【図２０】上述した実施形態の圧縮装置で圧縮した命令群を復元するプロセッサの一例を示している。
【図２１】図２０に示したスロットデコード部の一例を示している。
【図２２】図２０に示したプロセッサの変形例を示している。
【発明を実施するための形態】
【００１１】
以下、実施形態を図面を用いて説明する。
【００１２】
図１は、一実施形態における圧縮装置１０の例を示している。圧縮装置１０は、例えば、複数の命令を含む命令群ＩＳＧを圧縮し、命令群ＣＩＳＧ（以下、圧縮命令群ＣＩＳＧとも称する）を生成する。複数の命令を含む命令群ＩＳＧは、例えば、ＶＬＩＷ（Very Long Instruction Word）命令である。以下、命令群ＩＳＧをＶＬＩＷ命令ＩＳＧとも称する。圧縮装置１０は、例えば、プログラムのソースコードＳＣＯＤをコンパイルする処理において、ＶＬＩＷ命令ＩＳＧを圧縮する。
【００１３】
例えば、圧縮装置１０は、プログラムのソースコードＳＣＯＤを読み込み、ソースコードＳＣＯＤの構文解析を実行する。そして、圧縮装置１０は、低級コードを生成するコード生成処理を構文解析の結果に基づいて実行する。低級コードは、機械語やアセンブリ言語等の低級言語のコードである。例えば、コード生成処理では、命令のスケジューリング、レジスタの割り付け、ＶＬＩＷ命令ＩＳＧの生成、ＶＬＩＷ命令ＩＳＧの圧縮等が実行される。なお、圧縮装置１０は、コード生成処理の前段階の処理として、ソースコードＳＣＯＤと低級コードとの中間に対応する中間表現を最適化する処理を実行してもよい。
【００１４】
ＶＬＩＷ命令ＩＳＧの圧縮は、例えば、基本ブロック毎に実行される。基本ブロックは、関数より小さい単位のブロックである。例えば、基本ブロックは、連続する命令列のうち、以下の２つの性質を有する最長の列である。１つの目の性質は、制御が基本ブロックの先頭の命令を通って基本ブロックに入ることである。すなわち、制御が基本ブロックの途中にジャンプしてくることはない。２つ目の性質は、基本ブロックの最後の命令を除いて、制御が停止や分岐をしないことである。
【００１５】
例えば、圧縮装置１０は、基本ブロック毎に圧縮の可否を判定し、ＶＬＩＷ命令ＩＳＧを圧縮する。基本ブロック内は分岐も合流もないため、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧを圧縮する際に参照する命令（以下、参照先命令とも称する）を、容易に特定できる。参照先命令は、例えば、処理の内容を示すオペコードが処理対象の命令のオペコードと同じであり、かつ、オペランドが処理対象の命令のオペランドに対してオペランド差分値に基づく所定の関係を満たす命令である。
【００１６】
また、参照先命令は、圧縮装置１０で圧縮した命令群ＩＳＧを復元する際にも参照される。したがって、例えば、ＶＬＩＷ命令ＩＳＧを圧縮した命令群ＩＳＧを復元するプロセッサにおいても、参照先命令を容易に特定できる。なお、基本ブロックの先頭の命令では、複数の経路の先行命令が考えられるため、参照先命令の特定は困難である。このため、圧縮装置１０は、基本ブロックの先頭の命令を圧縮しない。
【００１７】
圧縮装置１０は、例えば、選択部３０、判定部４０および変換部５０を有している。なお、圧縮装置１０は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。
【００１８】
圧縮装置１０は、例えば、係数レジスタに設定されるオペランド差分値を保持する。例えば、圧縮装置１０は、係数レジスタに設定されるオペランド差分値を保持する記憶部を有している。係数レジスタは、例えば、圧縮装置１０で圧縮した命令群ＩＳＧを復元するプロセッサ等で使用される。また、オペランド差分値は、例えば、２つの命令間のオペランドの差分を示す値である。例えば、係数レジスタに設定されるオペランド差分値は、コンパイル処理が実行される前に、所定の値に決定されている。なお、圧縮装置１０は、係数レジスタに設定されるオペランド差分値をコンパイル処理時に抽出してもよい。
【００１９】
選択部３０は、ＶＬＩＷ命令ＩＳＧの列の中の処理対象のＶＬＩＷ命令ＩＳＧから処理対象の命令を選択する。ＶＬＩＷ命令ＩＳＧの列は、例えば、コンパイル処理のコード生成処理中に生成される低級コードである。例えば、各関数の基本ブロックは、ＶＬＩＷ命令ＩＳＧの列により表現される。
【００２０】
判定部４０は、選択部３０で選択された処理対象の命令が圧縮可能か否かを判定する。例えば、判定部４０は、参照先命令が、処理対象のＶＬＩＷ命令ＩＳＧに先行するＶＬＩＷ命令ＩＳＧである先行ＶＬＩＷ命令ＩＳＧと処理対象のＶＬＩＷ命令ＩＳＧとのいずれかに含まれているか否かを判定する。なお、処理対象の命令のオペランドと参照先命令のオペランドとの関係は、例えば、図４に示すように、複数のパターンに分類される。したがって、判定部４０は、例えば、判定に使用するパターンを命令の種類に応じて選択する。
【００２１】
変換部５０は、参照先命令が先行ＶＬＩＷ命令ＩＳＧと処理対象のＶＬＩＷ命令ＩＳＧとのいずれかに含まれているとき、参照先命令およびオペランド差分値に基づいて、処理対象の命令を圧縮命令に変換する。これにより、圧縮命令を含む圧縮命令群ＣＩＳＧが生成される。なお、処理対象のＶＬＩＷ命令ＩＳＧの全ての命令が圧縮されない場合、圧縮命令群ＣＩＳＧは、圧縮命令を含まない。以下、圧縮命令群ＣＩＳＧ内の圧縮されていない命令を非圧縮命令とも称する。
【００２２】
圧縮装置１０により生成された圧縮命令群ＣＩＳＧは、ディスプレイ、プロセッサ等に出力される。あるいは、圧縮命令群ＣＩＳＧは、プロセッサが使用する命令メモリ等に記憶される。また、圧縮命令群ＣＩＳＧは、メモリカード、磁気ディスク、光ディスク等の記憶媒体に記憶されてもよい。
【００２３】
なお、圧縮装置１０の構成は、この例に限定されない。例えば、圧縮装置１０は、コンパイル後のＶＬＩＷ命令ＩＳＧの列を、受けてもよい。この場合、コンパイル処理は、圧縮装置１０とは別の装置により実行される。
【００２４】
図２は、図１に示した圧縮装置１０による圧縮前後の命令群のフォーマットの一例を示している。ＶＬＩＷ命令ＩＳＧは圧縮前の命令群であり、圧縮命令群ＣＩＳＧは圧縮後の命令群である。
【００２５】
ＶＬＩＷ命令ＩＳＧは、４つの命令ＩＳ（ＩＳ１、ＩＳ２、ＩＳ３、ＩＳ４）を有している。４つの命令ＩＳは、４つのスロットにそれぞれ割り当てられている。なお、命令ＩＳおよびスロットの数は、４つに限定されない。命令ＩＳは、例えば、処理の内容を示すオペコードＯＰＣと、処理の対象を示す複数のオペランドＯＰＲ（ＯＰＲ１、ＯＰＲ２、ＯＰＲ３）を有している。なお、オペランドＯＰＲの数は、３つに限定されない。例えば、オペランドＯＰＲの数は、１つでもよいし、２つでもよい。あるいは、オペランドＯＰＲは、省かれてもよい。すなわち、ＶＬＩＷ命令ＩＳＧは、オペランドＯＰＲを含まない命令ＩＳを有してもよい。
【００２６】
圧縮命令群ＣＩＳＧは、４つの命令ＣＩＳ（ＣＩＳ１、ＣＩＳ２、ＣＩＳ３、ＣＩＳ４）と、命令ＣＩＳが圧縮命令か否かを示す圧縮情報ＣＩＮＦとを有している。圧縮情報ＣＩＮＦは、例えば、４つの命令ＣＩＳにそれぞれ対応するビットを有し、圧縮命令群ＣＩＳＧの先頭に配置されている。なお、圧縮情報ＣＩＮＦの各ビットは、各ビットに対応する命令ＣＩＳの先頭に配置されてもよい。圧縮情報ＣＩＮＦの各ビットは、各ビットに対応する命令ＣＩＳが圧縮命令か否かを示している。例えば、圧縮情報ＣＩＮＦの各ビットは、対応する命令ＣＩＳが圧縮命令の場合、“１”に設定される。
【００２７】
４つの命令ＣＩＳは、４つのスロットにそれぞれ割り当てられている。なお、命令ＣＩＳおよびスロットの数は、４つに限定されない。また、命令ＣＩＳ１、ＣＩＳ２、ＣＩＳ３、ＣＩＳ４は、ＶＬＩＷ命令ＩＳＧの命令ＩＳ１、ＩＳ２、ＩＳ３、ＩＳ４にそれぞれ対応している。
【００２８】
例えば、命令ＣＩＳ１、ＣＩＳ３は、ＶＬＩＷ命令ＩＳＧの命令ＩＳ１、ＩＳ３の非圧縮命令である。また、命令ＣＩＳ２、ＣＩＳ４は、ＶＬＩＷ命令ＩＳＧの命令ＩＳ２、ＩＳ４の圧縮命令である。この場合、圧縮情報ＣＩＮＦは、例えば、“０１０１”に設定される。
【００２９】
非圧縮命令ＣＩＳでは、非圧縮命令ＣＩＳが参照先命令か否かを示す参照情報ＳＩＮＦが命令ＩＳに追加されている。すなわち、非圧縮命令ＣＩＳは、参照情報ＳＩＮＦ、オペコードＯＰＣおよびオペランドＯＰＲ（ＯＰＲ１、ＯＰＲ２、ＯＰＲ３）を有している。なお、非圧縮命令ＣＩＳのオペコードＯＰＣおよびオペランドＯＰＲは、例えば、非圧縮命令ＣＩＳに対応する命令ＩＳのオペコードＯＰＣおよびオペランドＯＰＲと同じである。また、参照情報ＳＩＮＦは、例えば、非圧縮命令ＣＩＳが参照先命令の場合、“１”に設定される。すなわち、参照情報ＳＩＮＦが“１”に設定された非圧縮命令ＣＩＳは、別の命令を圧縮する際に参照される。また、参照情報ＳＩＮＦが“１”に設定された非圧縮命令ＣＩＳは、圧縮命令ＣＩＳを元の命令ＩＳに復元する際にも参照される。
【００３０】
圧縮命令ＣＩＳは、復元情報ＩＮＦ１、ＩＮＦ２、ＩＮＦ３を有している。復元情報ＩＮＦ１は、参照先命令ＩＳが圧縮命令ＣＩＳと同じ圧縮命令群ＣＩＳＧに含まれているか否か示す情報である。すなわち、復元情報ＩＮＦ１は、処理対象の命令ＩＳを圧縮する際に参照した参照先命令ＩＳが処理対象のＶＬＩＷ命令ＩＳＧに含まれているか否か示す情報である。例えば、復元情報ＩＮＦ１は、処理対象の命令ＩＳを圧縮する際に参照した参照先命令ＩＳが処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧに含まれている場合、“１”に設定される。以下、処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧを同一ＶＬＩＷ命令ＩＳＧとも称する。
【００３１】
復元情報ＩＮＦ２は、ＶＬＩＷ命令ＩＳＧ内での参照先命令ＩＳの位置（例えば、スロット番号）を示す情報である。すなわち、復元情報ＩＮＦ２は、参照先命令ＩＳに対応する命令ＣＩＳの圧縮命令群ＣＩＳＧ内での位置（例えば、スロット番号）を示す情報である。この実施形態では、スロットが４つであるため、復元情報ＩＮＦ２は、２ビットである。例えば、復元情報ＩＮＦ２の“００”、“０１”、“１０”、“１１”は、スロット１、スロット２、スロット３、スロット４をそれぞれ示している。したがって、例えば、参照先命令ＩＳがスロット１の命令の場合、復元情報ＩＮＦ２は、“００”に設定される。
【００３２】
復元情報ＩＮＦ３は、圧縮命令ＣＩＳの復元に使用するオペランド差分値が設定される係数レジスタを示す情報である。復元情報ＩＮＦ３のビット数は、例えば、係数レジスタの数に応じて決定される。例えば、係数レジスタが４つの場合、復元情報ＩＮＦ３は、２ビットである。
【００３３】
このように、例えば、命令ＩＳのサイズが３２ビットの場合、３２ビットの命令ＩＳは、圧縮されることにより、６ビットのコード（１ビットの圧縮情報ＣＩＮＦと５ビットの圧縮命令ＣＩＳ）に変換される。これにより、例えば、圧縮命令群ＣＩＳＧの命令ＣＩＳを復元して実行するプロセッサが使用する命令メモリ等のサイズを削減できる。また、この実施形態では、圧縮命令ＣＩＳのサイズが命令ＩＳのサイズに比べて小さいため、プロセッサによる命令ＣＩＳのフェッチ回数を削減できる。これにより、この実施形態では、プロセッサの消費電力を削減できる。
【００３４】
図３は、図２に示した復元情報ＩＮＦ３と係数レジスタに設定されるオペランド差分値との関係の一例を示している。係数レジスタは、例えば、４つ用意されている。なお、図３では、各係数レジスタに対応する復元情報ＩＮＦ３の値を２進数で示し、オペランド差分値を１０進数で示している。また、図３の備考は、係数レジスタのインデックスを１０進数で示している。４つの係数レジスタは、例えば、インデックスにより識別される。
【００３５】
復元情報ＩＮＦ３の“００”、“０１”、“１０”、“１１”は、例えば、インデックス０、インデックス１、インデックス２、インデックス３の係数レジスタをそれぞれ示している。そして、インデックス０、インデックス１、インデックス２、インデックス３の係数レジスタの値（以下、係数レジスタ値とも称する）は、それぞれ“１”、“２”、“４”、“−１”である。この場合、復元情報ＩＮＦ３の“００”、“０１”、“１０”、“１１”は、それぞれ“１”、“２”、“４”、“−１”のオペランド差分値を示している。
【００３６】
図４は、圧縮対象の命令ＩＳのオペランドＯＰＲ１ｉ−ＯＰＲ３ｉと参照先命令ＩＳのオペランドＯＰＲ１ｊ−ＯＰＲ３ｊとの関係の一例を示している。図の備考は、各パターンＰＴに割り当てられた命令ＩＳの一例を示している。なお、各パターンＰＴに割り当てられる命令ＩＳは、図４の例に限定されない
パターンＰＴ１では、圧縮対象の命令ＩＳの全てのオペランドＯＰＲ（ＯＰＲ１ｉ−ＯＰＲ３ｉ）は、参照先命令ＩＳのオペランドＯＰＲ（ＯＰＲ１ｊ−ＯＰＲ３ｊ）からオペランド差分値ｄ分だけ変化している。したがって、圧縮対象の命令ＩＳの各オペランドＯＰＲ（ＯＰＲ１ｉ−ＯＰＲ３ｉ）は、例えば、参照先命令ＩＳの各オペランドＯＰＲ（ＯＰＲ１ｊ−ＯＰＲ３ｊ）にオペランド差分値ｄを加算することにより求められる。パターンＰＴ１は、例えば、ＡＤＤ命令、ＳＵＢ命令等の判定に使用される。
【００３７】
ＡＤＤ命令は、例えば、オペランドＯＰＲ１とオペランドＯＰＲ２により指定されるレジスタの内容を加算し、加算結果をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。ＳＵＢ命令は、例えば、オペランドＯＰＲ１により指定されるレジスタの内容からオペランドＯＰＲ２により指定されるレジスタの内容を減算し、減算結果をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。
【００３８】
パターンＰＴ２では、圧縮対象の命令ＩＳのオペランドＯＰＲ１ｉ、ＯＰＲ３ｉは、参照先命令ＩＳのオペランドＯＰＲ１ｊ、ＯＰＲ３ｊからオペランド差分値ｄ分だけ変化している。したがって、圧縮対象の命令ＩＳのオペランドＯＰＲ１ｉ、ＯＰＲ３ｉは、例えば、参照先命令ＩＳのオペランドＯＰＲ１ｊ、ＯＰＲ３ｊにオペランド差分値ｄを加算することにより求められる。なお、オペランドＯＰＲ２は、圧縮対象の命令ＩＳと参照先命令ＩＳとの間で変化していない。オペランドＯＰＲ２には、例えば、即値が指定される。パターンＰＴ２は、例えば、ＡＤＤＩ命令、ＳＵＢＩ命令等の判定に使用される。
【００３９】
ＡＤＤＩ命令は、例えば、オペランドＯＰＲ１により指定されるレジスタの内容とオペランドＯＰＲ２に指定された即値とを加算し、加算結果をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。ＳＵＢＩ命令は、例えば、オペランドＯＰＲ１により指定されるレジスタの内容からオペランドＯＰＲ２により指定される即値を減算し、減算結果をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。
【００４０】
パターンＰＴ３では、圧縮対象の命令ＩＳのオペランドＯＰＲ２ｉ、ＯＰＲ３ｉは、参照先命令ＩＳのオペランドＯＰＲ２ｊ、ＯＰＲ３ｊからオペランド差分値ｄ分だけ変化している。したがって、圧縮対象の命令ＩＳのオペランドＯＰＲ２ｉ、ＯＰＲ３ｉは、例えば、参照先命令ＩＳのオペランドＯＰＲ２ｊ、ＯＰＲ３ｊにオペランド差分値ｄを加算することにより求められる。なお、オペランドＯＰＲ１は、圧縮対象の命令ＩＳと参照先命令ＩＳとの間で変化していない。パターンＰＴ３は、例えば、ＬＯＡＤ命令、ＳＴＯＲＥ命令等の判定に使用される。オペランドＯＰＲ２には、例えば、即値が指定される。
【００４１】
ＬＯＡＤ命令は、例えば、オペランドＯＰＲ１、ＯＰＲ２により算出されるメモリアドレスの内容を読み込んで、読み込んだ内容をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。ＳＴＯＲＥ命令は、例えば、オペランドＯＰＲ３により指定されるレジスタの内容を、オペランドＯＰＲ１、ＯＰＲ２により算出されるメモリアドレスに格納する命令ＩＳである。
【００４２】
パターンＰＴ４では、圧縮対象の命令ＩＳのオペランドＯＰＲ３ｉは、参照先命令ＩＳのオペランドＯＰＲ３ｊからオペランド差分値ｄ分だけ変化している。したがって、圧縮対象の命令ＩＳのオペランドＯＰＲ３ｉは、例えば、参照先命令ＩＳのオペランドＯＰＲ３ｊにオペランド差分値ｄを加算することにより求められる。なお、オペランドＯＰＲ１、ＯＰＲ２は、圧縮対象の命令ＩＳと参照先命令ＩＳとの間で変化していない。パターンＰＴ４は、例えば、ＬＯＡＤ命令とは別のＬＯＡＤＩＵ命令、ＳＴＯＲＥ命令とは別のＳＴＯＲＥＩＵ命令等の判定に使用される。オペランドＯＰＲ２には、例えば、即値が指定される。
【００４３】
ＬＯＡＤＩＵ命令は、例えば、オペランドＯＰＲ１、ＯＰＲ２により算出されるメモリアドレスの内容を読み込んで、読み込んだ内容をオペランドＯＰＲ３により指定されるレジスタに格納する命令ＩＳである。ＳＴＯＲＥＩＵ命令は、例えば、オペランドＯＰＲ３により指定されるレジスタの内容を、オペランドＯＰＲ１、ＯＰＲ２により算出されるメモリアドレスに格納する命令ＩＳである。
【００４４】
なお、圧縮対象の命令ＩＳのオペランドＯＰＲ１ｉ−ＯＰＲ３ｉと参照先命令ＩＳのオペランドＯＰＲ１ｊ−ＯＰＲ３ｊとの関係は、図４の例に限定されない。例えば、パターンＰＴの数は、４つに限定されない。また、例えば、参照先命令ＩＳのオペランドＯＰＲに対する圧縮対象の命令ＩＳのオペランドＯＰＲの変化量は、オペランド差分値ｄに所定の値を乗算した値でもよい。さらに、オペランド差分値ｄに乗算する所定の値は、命令の種類に応じて決められてもよい。この場合、係数レジスタに設定されるオペランド差分値ｄの数が増加することを抑制できる。すなわち、係数レジスタの数が増加することを抑制できる。
【００４５】
図５は、図１に示した圧縮装置１０の動作の一例を示している。なお、図５は、圧縮処理に関する圧縮装置１０の動作の一例を示している。図５の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、圧縮プログラム等のソフトウエアは、コンピュータに図５の動作を実行させてもよい。図５の例では、係数レジスタ値は、圧縮対象のプログラム全体で共通に使用される。すなわち、図５の例では、係数レジスタに設定されるオペランド差分値は、圧縮対象のプログラム毎に決定されている。例えば、圧縮装置１０は、処理Ｓ１００が実行される前に、係数レジスタに設定されるオペランド差分値を保持している。
【００４６】
処理Ｓ１００では、圧縮装置１０は、例えば、メイン関数の先頭やスタートアップコードの末尾等に、係数レジスタに値を設定するためのコードを生成する。これにより、例えば、図３に示したように、係数レジスタ値が設定される。処理Ｓ２００では、圧縮装置１０は、関数の先頭のコードを生成する。
【００４７】
処理Ｓ３００では、圧縮装置１０は、関数より小さい単位の基本ブロックＢＢに対する圧縮処理を実行する。すなわち、ＶＬＩＷ命令ＩＳＧの圧縮処理は、基本ブロックＢＢ毎に実行される。これにより、ＶＬＩＷ命令ＩＳＧを圧縮した圧縮命令群ＣＩＳＧが生成される。なお、基本ブロックＢＢ内は分岐も合流もないため、圧縮装置１０や圧縮命令ＣＩＳを復元するプロセッサ等は、参照先命令ＩＳを容易に特定できる。
【００４８】
処理Ｓ４００では、圧縮装置１０は、関数内の全ての基本ブロックＢＢに対する圧縮処理が終了したか否かを判定する。圧縮処理が実行されていない基本ブロックＢＢが関数内に存在するとき（処理Ｓ４００のＮｏ）、圧縮装置１０の動作は、処理Ｓ３００に戻る。一方、関数内の全ての基本ブロックＢＢに対する圧縮処理が終了しているとき（処理Ｓ４００のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ５００に移る。すなわち、圧縮処理は、関数内の全ての基本ブロックＢＢに対して実行される。
【００４９】
処理Ｓ５００では、圧縮装置１０は、関数の末尾のコードを生成する。処理Ｓ６００では、圧縮装置１０は、プログラム内の全ての関数に対する処理が終了したか否かを判定する。未処理の関数が存在するとき（処理Ｓ６００のＮｏ）、圧縮装置１０の動作は、処理Ｓ２００に戻る。一方、プログラム内の全ての関数に対する処理が終了しているとき（処理Ｓ６００のＹｅｓ）、圧縮処理に関する圧縮装置１０の動作は、終了する。すなわち、処理Ｓ２００−Ｓ５００の一連の処理は、全ての関数に対して実行される。
【００５０】
図６は、図５に示した基本ブロックＢＢに対する圧縮処理Ｓ３００の一例を示している。なお、図６の動作を実行する圧縮装置１０は、先行ＶＬＩＷ命令ＩＳＧに含まれる参照先命令ＩＳを保持する先行バッファＢＦを有している。先行バッファＢＦは、例えば、ＶＬＩＷ命令ＩＳＧの各スロットに対応して設けられている。
【００５１】
処理Ｓ３１０では、圧縮装置１０は、各スロットの命令ＩＳを保持する先行バッファＢＦを初期化する。処理Ｓ３１２では、選択部３０は、処理対象のＶＬＩＷ命令ＩＳＧを選択する。例えば、選択部３０は、基本ブロックＢＢの先頭から順にＶＬＩＷ命令ＩＳＧを選択する。処理Ｓ３１４では、選択部３０は、処理対象のＶＬＩＷ命令ＩＳＧ（処理Ｓ３１２で選択したＶＬＩＷ命令ＩＳＧ）から処理対象の命令ＩＳを選択する。例えば、選択部３０は、スロット１から順に命令ＩＳを選択する。
【００５２】
処理Ｓ３１６では、判定部４０は、先行バッファＢＦと処理Ｓ３１４で選択した処理対象の命令ＩＳとを比較し、処理対象の命令ＩＳを圧縮する際に参照される命令ＩＳ（参照先命令ＩＳ）が先行バッファＢＦに保持されているか否かを判定する。すなわち、判定部４０は、参照先命令ＩＳが先行ＶＬＩＷ命令ＩＳＧに含まれているか否かを判定する。なお、参照先命令ＩＳが先行バッファＢＦに保持されているか否かの判定には、例えば、処理対象の命令ＩＳのオペランドＯＰＲに対する差分値が係数レジスタに保持される値のいずれかに一致するか否かの判定も含まれている。
【００５３】
参照先命令ＩＳが先行バッファＢＦに保持されているとき（処理Ｓ３１６のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ３１８に移る。一方、参照先命令ＩＳが先行バッファＢＦに保持されていないとき（処理Ｓ３１６のＮｏ）、圧縮装置１０の動作は、処理Ｓ３２０に移る。
【００５４】
処理Ｓ３１８では、変換部５０は、先行バッファＢＦに保持されている参照先命令ＩＳを参照して、処理Ｓ３１４で選択した処理対象の命令ＩＳを圧縮する。すなわち、変換部５０は、先行ＶＬＩＷ命令ＩＳＧを参照する圧縮処理を処理対象の命令ＩＳに対して実行する。これにより、圧縮命令ＣＩＳが生成される。
【００５５】
例えば、変換部５０は、参照先命令ＩＳが先行ＶＬＩＷ命令ＩＳＧに存在するため、圧縮命令ＣＩＳの復元情報ＩＮＦ１を“０”に設定する。また、変換部５０は、参照先命令ＩＳが保持されている先行バッファＢＦに対応するスロットを示す値を、圧縮命令ＣＩＳの復元情報ＩＮＦ２に設定する。
【００５６】
そして、変換部５０は、圧縮命令ＣＩＳの復元に使用するオペランド差分値が設定される係数レジスタを示す値を、圧縮命令ＣＩＳの復元情報ＩＮＦ３に設定する。例えば、変換部５０は、処理対象の命令ＩＳのオペランドＯＰＲと参照先命令ＩＳのオペランドＯＰＲとを比較してオペランド差分値を算出する。また、変換部５０は、例えば、処理対象のＶＬＩＷ命令ＩＳＧに対応する圧縮命令群ＣＩＳＧの圧縮情報ＣＩＮＦを設定する。例えば、変換部５０は、圧縮情報ＣＩＮＦの圧縮命令ＣＩＳに対応するビットを“１”に設定する。
【００５７】
なお、処理対象の命令ＩＳは、後続の命令ＩＳを圧縮する際に参照される可能性がある。このため、処理Ｓ３４０において、処理対象の命令ＩＳは、処理対象の命令ＩＳのスロットに対応する先行バッファＢＦに保持される。
【００５８】
処理Ｓ３２０では、判定部４０は、先行スロットと処理Ｓ３１４で選択した処理対象の命令ＩＳとを比較し、処理対象の命令ＩＳを圧縮する際に参照される命令ＩＳ（参照先命令ＩＳ）が先行スロットに存在するか否かを判定する。なお、参照先命令ＩＳが先行スロットに存在するか否かの判定には、例えば、処理対象の命令ＩＳのオペランドＯＰＲに対する差分値が係数レジスタに保持される値のいずれかに一致するか否かの判定も含まれている。先行スロットは、処理対象の命令ＩＳに対応するスロットに先行するスロットである。例えば、図２に示した命令群のフォーマットでは、スロット３の命令ＩＳ３が処理対象の命令ＩＳのとき、スロット１、スロット２が先行スロットである。
【００５９】
参照先命令ＩＳが先行スロットに存在するとき（処理Ｓ３２０のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ３２２に移る。一方、参照先命令ＩＳが先行スロットに存在しないとき（処理Ｓ３２０のＮｏ）、圧縮装置１０の動作は、処理Ｓ３２４に移る。
【００６０】
処理Ｓ３２２では、変換部５０は、処理Ｓ３１４で選択した処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧ（処理Ｓ３１２で選択したＶＬＩＷ命令ＩＳＧ）の先行スロットの参照先命令ＩＳを参照して、処理対象の命令ＩＳを圧縮する。すなわち、変換部５０は、処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧを参照する圧縮処理を処理対象の命令ＩＳに対して実行する。これにより、圧縮命令ＣＩＳが生成される。
【００６１】
例えば、変換部５０は、処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧに参照先命令ＩＳが存在するため、圧縮命令ＣＩＳの復元情報ＩＮＦ１を“１”に設定する。また、変換部５０は、参照先命令ＩＳのスロットを示す値を、圧縮命令ＣＩＳの復元情報ＩＮＦ２に設定する。
【００６２】
そして、変換部５０は、圧縮命令ＣＩＳの復元に使用するオペランド差分値が設定される係数レジスタを示す値を、圧縮命令ＣＩＳの復元情報ＩＮＦ３に設定する。また、変換部５０は、例えば、処理対象のＶＬＩＷ命令ＩＳＧに対応する圧縮命令群ＣＩＳＧの圧縮情報ＣＩＮＦを設定する。例えば、変換部５０は、圧縮情報ＣＩＮＦの圧縮命令ＣＩＳに対応するビットを“１”に設定する。
【００６３】
なお、処理対象の命令ＩＳは、後続の命令ＩＳを圧縮する際に参照される可能性がある。このため、処理Ｓ３４０において、処理対象の命令ＩＳは、処理対象の命令ＩＳのスロットに対応する先行バッファＢＦに保持される。
【００６４】
処理Ｓ３２４では、判定部４０は、処理Ｓ３１４で選択した処理対象の命令ＩＳが後続の命令ＩＳを圧縮する際に参照される可能性があるか否かを判定する。例えば、判定部４０は、数命令（例えば、４命令程度）の命令ＩＳを先読みし、先読みした命令ＩＳを圧縮する際に処理対象の命令ＩＳが参照されるか否かを判定する。
【００６５】
処理対象の命令ＩＳが参照される可能性があるとき（処理Ｓ３２４のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ３２６に移る。一方、処理対象の命令ＩＳが参照される可能性がないとき（処理Ｓ３２４のＮｏ）、圧縮装置１０の動作は、処理Ｓ３２８に移る。
【００６６】
処理Ｓ３２６では、変換部５０は、処理Ｓ３１４で選択した処理対象の命令ＩＳに対して、参照処理を実行する。これにより、参照先命令に設定された非圧縮命令ＣＩＳが生成される。例えば、変換部５０は、処理対象の命令ＩＳが参照先命令であることを示す参照情報ＳＩＮＦ（例えば、値が“１”の参照情報ＳＩＮＦ）を、命令ＩＳの先頭に付加する。また、変換部５０は、例えば、処理対象のＶＬＩＷ命令ＩＳＧに対応する圧縮命令群ＣＩＳＧの圧縮情報ＣＩＮＦを設定する。例えば、変換部５０は、圧縮情報ＣＩＮＦの非圧縮命令ＣＩＳに対応するビットを“０”に設定する。
【００６７】
なお、後続の命令ＩＳを圧縮する際に参照される可能性のある処理対象の命令ＩＳは、処理Ｓ３４０において、処理対象の命令ＩＳのスロットに対応する先行バッファＢＦに保持される。
【００６８】
処理Ｓ３２８では、変換部５０は、処理Ｓ３１４で選択した処理対象の命令ＩＳに対して、非参照処理を実行する。これにより、参照先命令でない非圧縮命令ＣＩＳが生成される。例えば、変換部５０は、処理対象の命令ＩＳが参照先命令でないことを示す参照情報ＳＩＮＦ（例えば、値が“０”の参照情報ＳＩＮＦ）を、命令ＩＳの先頭に付加する。また、変換部５０は、例えば、処理対象のＶＬＩＷ命令ＩＳＧに対応する圧縮命令群ＣＩＳＧの圧縮情報ＣＩＮＦを設定する。例えば、変換部５０は、圧縮情報ＣＩＮＦの非圧縮命令ＣＩＳに対応するビットを“０”に設定する。
【００６９】
なお、処理対象の命令ＩＳは、後続の命令ＩＳを圧縮する際に参照されないため、先行バッファＢＦに保持されない。すなわち、処理Ｓ３４０において、処理対象の命令ＩＳのスロットに対応する先行バッファＢＦは、更新されない。以下、参照先命令でない非圧縮命令ＣＩＳに対応する命令ＩＳを非参照命令ＩＳとも称する。
【００７０】
処理Ｓ３３０では、圧縮装置１０は、処理Ｓ３１２で選択した処理対象のＶＬＩＷ命令ＩＳＧに未処理の命令ＩＳが存在するか否かを判定する。例えば、圧縮装置１０は、処理対象のＶＬＩＷ命令ＩＳＧの最後のスロットの命令ＩＳの処理が終了したか否かを判定する。
【００７１】
処理対象のＶＬＩＷ命令ＩＳＧに未処理の命令ＩＳが存在するとき（処理Ｓ３３０のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ３１４に戻る。これにより、次のスロットの命令ＩＳが処理対象の命令ＩＳとして選択される。一方、処理対象のＶＬＩＷ命令ＩＳＧに未処理の命令ＩＳが存在しないとき（処理Ｓ３３０のＮｏ）、圧縮装置１０の動作は、処理Ｓ３４０に移る。したがって、例えば、処理Ｓ３４０は、処理対象のＶＬＩＷ命令ＩＳＧの最後のスロットの命令ＩＳの処理が終了した後、実行される。
【００７２】
処理Ｓ３４０では、圧縮装置１０は、先行バッファＢＦを更新する。例えば、圧縮装置１０は、非参照命令ＩＳのスロットに対応する先行バッファＢＦ以外の先行バッファＢＦに保持されている命令ＩＳを、処理Ｓ３１２で選択した処理対象のＶＬＩＷ命令ＩＳＧの命令ＩＳに更新する。すなわち、処理対象のＶＬＩＷ命令ＩＳＧに非参照命令ＩＳが含まれているときには、非参照命令ＩＳのスロットに対応する先行バッファＢＦは、更新されない。
【００７３】
処理Ｓ３５０では、圧縮装置１０は、基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在するか否かを判定する。例えば、圧縮装置１０は、基本ブロックＢＢの最後のＶＬＩＷ命令ＩＳＧの処理が終了したか否かを判定する。
【００７４】
基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在するとき（処理Ｓ３５０のＹｅｓ）、圧縮装置１０の動作は、処理Ｓ３１２に戻る。これにより、次のＶＬＩＷ命令ＩＳＧが処理対象のＶＬＩＷ命令ＩＳＧとして選択される。一方、基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在しないとき（処理Ｓ３５０のＮｏ）、基本ブロックＢＢに対する圧縮処理（図５に示した処理Ｓ３００）は、終了する。したがって、例えば、図５に示した処理Ｓ４００は、基本ブロックＢＢの最後のＶＬＩＷ命令ＩＳＧの処理が終了した後、実行される。
【００７５】
なお、図５および図６に示した各処理は、図５等に示した順序と異なる順序で実行されてもよい。例えば、図５および図６に示した処理は、同時に実行されることがあってもよい。
【００７６】
図７は、図１に示した圧縮装置１０による圧縮処理の具体例を示している。なお、図７では、圧縮命令群ＣＩＳＧ間のスロットの対応を見易くするために、スロットの位置を固定して記載している。したがって、図７の網掛け部分は、圧縮命令群ＣＩＳＧのサイズに含まれない。図７の破線の矢印は、圧縮対象の命令ＩＳと参照先命令ＩＳとの関係を示している。図７の破線に付した括弧内の数字は、オペランド差分値を示している。また、図７では、オペランドＯＰＲにより指定されるレジスタを、数字の前に“ｒ”、“ｘ”、“ｖ”の符号を付して示している。例えば、ｒ１はｒ０に１を加算した値とする。また、即値が指定されているオペランドＯＰＲは、数字（即値）を記載している。
【００７７】
図７の例では、図３に示したオペランド差分値が係数レジスタに設定される。また、処理対象の命令のオペランドと参照先命令のオペランドとの関係は、例えば、図４に示したパターンＰＴを用いる。したがって、例えば、ＡＤＤ命令、ＳＵＢ命令は、図４のパターンＰＴ１に基づいて判定される。また、例えば、ＬＯＡＤ命令は、図４のパターンＰＴ３に基づいて判定される。
【００７８】
先ず、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧ１を読み込み、スロット１の命令ＩＳ１からスロット４の命令ＩＳ４まで順に、圧縮処理を開始する。ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１は、最初の命令ＩＳであるため、圧縮されない。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ１の圧縮情報ＣＩＮＦの命令ＣＩＳ１に対応するビット（圧縮命令群ＣＩＳＧ１の先頭ビット）を“０”に設定する。
【００７９】
また、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１のオペコード（ＬＯＡＤ）は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１のオペコードと同じである。そして、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１のオペランドとＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１のオペランドとの関係は、インデックス０の係数レジスタ値（“１”）をオペランド差分値としたときの図４のパターンＰＴ３に相当する。
【００８０】
したがって、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１の参照先命令ＩＳである。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ１のスロット１の命令ＣＩＳ１の参照情報ＳＩＮＦ（非圧縮命令ＣＩＳ１の先頭ビット）を“１”に設定する。これにより、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１は、後続のＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１を圧縮する際に参照される。
【００８１】
ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ２−ＩＳ４は、参照先命令が先行スロットに存在しないため、圧縮されない。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ１の圧縮情報ＣＩＮＦの命令ＣＩＳ２−ＣＩＳ４に対応するビット（圧縮命令群ＣＩＳＧ１の２番目から４番目までの３ビット）を“０”に設定する。
【００８２】
また、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ２は、後続の命令ＩＳを圧縮する際に参照される可能性がある。例えば、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ２とＶＬＩＷ命令ＩＳＧ４の命令ＩＳ４との関係は、インデックス３の係数レジスタ値（“−１”）をオペランド差分値としたときの図４のパターンＰＴ１に相当する。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ１の命令ＣＩＳ２の参照情報ＳＩＮＦ（非圧縮命令ＣＩＳ２の先頭ビット）を“１”に設定する。
【００８３】
この場合、ＶＬＩＷ命令ＩＳＧ１とＶＬＩＷ命令ＩＳＧ４との間のＶＬＩＷ命令ＩＳＧ２、３のスロット２（ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ２と同一のスロット２）に、非参照命令以外の命令ＩＳが存在する否かの判定を省くことができるため、処理を簡易にできる。
【００８４】
なお、図７の例では、ＶＬＩＷ命令ＩＳＧ１とＶＬＩＷ命令ＩＳＧ４との間のＶＬＩＷ命令ＩＳＧ２、３のスロット２に、非参照命令以外の命令ＩＳが存在する。このため、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ２は、ＶＬＩＷ命令ＩＳＧ４の命令ＩＳ４を圧縮する際に参照されない。したがって、圧縮装置１０は、圧縮命令群ＣＩＳＧ１の命令ＣＩＳ２の参照情報ＳＩＮＦ（非圧縮命令ＣＩＳ２の先頭ビット）を“０”に設定してもよい。
【００８５】
ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ３、ＩＳ４は、後続の命令ＩＳを圧縮する際に参照されない。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ１の命令ＣＩＳ３、ＣＩＳ４の各参照情報ＳＩＮＦ（各非圧縮命令ＣＩＳの先頭ビット）を“０”に設定する。
【００８６】
次に、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧ２を読み込み、スロット１の命令ＩＳ１からスロット４の命令ＩＳ４まで順に、圧縮処理を開始する。圧縮装置１０は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１をＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１を参照して圧縮する。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の圧縮情報ＣＩＮＦの命令ＣＩＳ１に対応するビット（圧縮命令群ＣＩＳＧ２の先頭ビット）を“１”に設定する。また、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の命令ＣＩＳ１の復元情報ＩＮＦ１、ＩＮＦ２、ＩＮＦ３を設定する。
【００８７】
例えば、圧縮装置１０は、復元情報ＩＮＦ１（圧縮命令ＣＩＳ１の先頭ビット）を、先行ＶＬＩＷ命令ＩＳＧを参照することを示す値“０”に設定する。また、圧縮装置１０は、復元情報ＩＮＦ２（圧縮命令ＣＩＳ１の２番目から３番目までの２ビット）を、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１のスロット１を示す値“００”に設定する。そして、圧縮装置１０は、復元情報ＩＮＦ３（圧縮命令ＣＩＳ１の４番目から５番目までの２ビット）を、インデックス０の係数レジスタを示す値“００”に設定する。
【００８８】
ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２は、先行スロット１および先行ＶＬＩＷ命令ＩＳＧ１のいずれにも参照先命令が存在しないため、圧縮されない。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の圧縮情報ＣＩＮＦの命令ＣＩＳ２に対応するビット（圧縮命令群ＣＩＳＧ２の２番目のビット）を“０”に設定する。
【００８９】
また、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２のオペコード（ＡＤＤ）は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３のオペコードと同じである。そして、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２のオペランドとＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３のオペランドとの関係は、インデックス１の係数レジスタ値（“２”）をオペランド差分値としたときの図４のパターンＰＴ１に相当する。
【００９０】
さらに、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２のオペコード（ＡＤＤ）は、ＶＬＩＷ命令ＩＳＧ３の命令ＩＳ２のオペコードと同じである。そして、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２のオペランドとＶＬＩＷ命令ＩＳＧ３の命令ＩＳ２のオペランドとの関係は、インデックス０の係数レジスタ値（“１”）をオペランド差分値としたときの図４のパターンＰＴ１に相当する。
【００９１】
したがって、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３およびＶＬＩＷ命令ＩＳＧ３の命令ＩＳ２の両方の参照先命令ＩＳである。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ２のスロット２の命令ＣＩＳ２の参照情報ＳＩＮＦ（非圧縮命令ＣＩＳ２の先頭ビット）を“１”に設定する。これにより、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２は、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３およびＶＬＩＷ命令ＩＳＧ３の命令ＩＳ２を圧縮する際に参照される。
【００９２】
なお、圧縮装置１０は、非圧縮命令ＣＩＳが同一ＶＬＩＷ命令ＩＳＧの命令ＩＳのみに参照される場合、参照情報ＳＩＮＦを“０”に設定してもよい。この場合、例えば、非圧縮命令ＣＩＳより後のＶＬＩＷ命令ＩＳＧにおいて、非圧縮命令ＣＩＳより前の命令群ＣＩＳＧを参照できる。
【００９３】
ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３は、先行スロット２の命令ＩＳ２（ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２）を参照して圧縮される。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の圧縮情報ＣＩＮＦの命令ＣＩＳ３に対応するビット（圧縮命令群ＣＩＳＧ３の３番目のビット）を“１”に設定する。また、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の命令ＣＩＳ３の復元情報ＩＮＦ１、ＩＮＦ２、ＩＮＦ３を設定する。
【００９４】
例えば、圧縮装置１０は、復元情報ＩＮＦ１（圧縮命令ＣＩＳ３の先頭ビット）を、同一ＶＬＩＷ命令ＩＳＧを参照することを示す値“１”に設定する。また、圧縮装置１０は、復元情報ＩＮＦ２（圧縮命令ＣＩＳ３の２番目から３番目までの２ビット）を、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２のスロット２を示す値“０１”に設定する。そして、圧縮装置１０は、復元情報ＩＮＦ３（圧縮命令ＣＩＳ３の４番目から５番目までの２ビット）を、インデックス１の係数レジスタを示す値“０１”に設定する。
【００９５】
ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ４は、先行スロット３の命令ＩＳ３（ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３）を参照して圧縮される。このため、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の圧縮情報ＣＩＮＦの命令ＣＩＳ４に対応するビット（圧縮命令群ＣＩＳＧ３の４番目のビット）を“１”に設定する。また、圧縮装置１０は、圧縮命令群ＣＩＳＧ２の命令ＣＩＳ４の復元情報ＩＮＦ１、ＩＮＦ２、ＩＮＦ３を設定する。
【００９６】
例えば、圧縮装置１０は、復元情報ＩＮＦ１（圧縮命令ＣＩＳ４の先頭ビット）を、同一ＶＬＩＷ命令ＩＳＧを参照することを示す値“１”に設定する。また、圧縮装置１０は、復元情報ＩＮＦ２（圧縮命令ＣＩＳ４の２番目から３番目までの２ビット）を、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ３のスロット３を示す値“１０”に設定する。そして、圧縮装置１０は、復元情報ＩＮＦ３（圧縮命令ＣＩＳ４の４番目から５番目までの２ビット）を、インデックス１の係数レジスタを示す値“０１”に設定する。
【００９７】
以降、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧ１、ＩＳＧ２と同様にして、ＶＬＩＷ命令ＩＳＧ３−ＩＳＧ６の圧縮処理を実行する。これにより、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧの列を圧縮できる。例えば、ＶＬＩＷ命令ＩＳＧ１の命令ＩＳ１、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ２、ＶＬＩＷ命令ＩＳＧ３の命令ＩＳ１、ＶＬＩＷ命令ＩＳＧ４の命令ＩＳ４は、参照先命令に設定された非圧縮命令ＣＩＳに変換される。また、ＶＬＩＷ命令ＩＳＧ２の命令ＩＳ１、ＩＳ３、ＩＳ４、ＶＬＩＷ命令ＩＳＧ３の命令ＩＳ２−ＩＳ４、ＶＬＩＷ命令ＩＳＧ４の命令ＩＳ２−ＩＳ３、ＶＬＩＷ命令ＩＳＧ５の命令ＩＳ１−ＩＳ４、ＶＬＩＷ命令ＩＳＧ６の命令ＩＳ１−ＩＳ４は、圧縮され、圧縮命令ＣＩＳに変換される。
【００９８】
このように、圧縮装置１０は、処理対象の命令ＩＳのスロットと同じ位置のスロットに限定されることなく、参照先命令ＩＳを先行ＶＬＩＷ命令ＩＳＧから選択できる。さらに、先行ＶＬＩＷ命令ＩＳＧは、処理対象の命令ＩＳの１つ前のＶＬＩＷ命令ＩＳＧに限定されない。例えば、圧縮装置１０は、ＶＬＩＷ命令ＩＳＧ３、ＩＳＧ５間のＶＬＩＷ命令ＩＳＧ４の命令ＩＳ１が非参照命令であるため、ＶＬＩＷ命令ＩＳＧ５の命令ＩＳ１を、ＶＬＩＷ命令ＩＳＧ５の２つ前のＶＬＩＷ命令ＩＳＧ３の命令ＩＳ１を参照して圧縮できる。
【００９９】
また、圧縮装置１０は、処理対象の命令ＩＳと同一のＶＬＩＷ命令ＩＳＧの先行スロットから参照先命令ＩＳを選択できる。このように、この実施形態では、参照先命令ＩＳの検索範囲が先行ＶＬＩＷ命令ＩＳＧ等に限定される方式に比べて、参照先命令ＩＳの検索範囲を広くできる。これにより、この実施形態では、複数の命令ＩＳを含む命令群ＩＳＧの圧縮率を向上できる。なお、この実施形態では、圧縮対象が無実行命令に限定されないため、無実行命令の発生頻度が低いときにも、ＶＬＩＷ命令の圧縮率の低下を抑制できる。
【０１００】
以上、この実施形態では、圧縮装置１０は、処理対象のＶＬＩＷ命令ＩＳＧに先行するＶＬＩＷ命令ＩＳＧの任意のスロットあるいは処理対象のＶＬＩＷ命令ＩＳＧの先行スロットに参照先命令ＩＳが存在するとき、処理対象の命令ＩＳを圧縮する。参照先命令ＩＳは、オペコードＯＰＣが処理対象の命令ＩＳのオペコードＯＰＣと同じであり、かつ、オペランドＯＰＲが処理対象の命令ＩＳのオペランドＯＰＲに対してオペランド差分値に基づく所定の関係を満たす命令である。
【０１０１】
このように、この実施形態では、参照先命令ＩＳの検索範囲が先行ＶＬＩＷ命令ＩＳＧ等に限定される方式に比べて、参照先命令ＩＳの検索範囲を広くできる。これにより、この実施形態では、複数の命令ＩＳを含む命令群ＩＳＧの圧縮率を向上できる。さらに、この実施形態では、例えば、オペランド差分値が設定される係数レジスタを複数設けることにより、参照先命令ＩＳの選択肢を広くできる。これにより、この実施形態では、ＶＬＩＷ命令の圧縮率を向上できる。
【０１０２】
また、この実施形態では、ＶＬＩＷ命令の圧縮率の向上により、例えば、圧縮命令群ＣＩＳＧの命令ＣＩＳを復元して実行するプロセッサが使用する命令メモリ等のサイズを削減できる。さらに、この実施形態では、プロセッサによる命令ＣＩＳのフェッチ回数を削減できるため、プロセッサの消費電力を削減できる。
【０１０３】
図８は、別の実施形態における圧縮装置１０Ａの一例を示している。図１−図７で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。この実施形態の圧縮装置１０Ａは、図１に示した圧縮装置１０に差分抽出部２０およびレジスタ値決定部２２が追加されている。また、圧縮装置１０Ａは、図１に示した選択部３０、判定部４０および変換部５０の代わりに、選択部３０Ａ、判定部４０Ａおよび変換部５０Ａを有している。圧縮装置１０Ａのその他の構成は、図１に示した圧縮装置１０と同様である。例えば、圧縮装置１０Ａは、プログラムのソースコードＳＣＯＤをコンパイルする処理において、ＶＬＩＷ命令ＩＳＧを圧縮する。
【０１０４】
圧縮装置１０Ａは、例えば、先行ＶＬＩＷ命令ＩＳＧに対するオペランド差分値と、同一ＶＬＩＷ命令ＩＳＧに対するオペランド差分値とのそれぞれを命令ＩＳ毎に求める。これにより、例えば、圧縮の可能性がある全ての命令ＩＳの組（参照先命令ＩＳの候補、圧縮対象の命令ＩＳの候補）が抽出される。以下、参照先命令ＩＳの候補を参照候補命令ＩＳとも称する。同様に、圧縮対象の命令ＩＳの候補を圧縮候補命令ＩＳとも称する。
【０１０５】
次に、圧縮装置１０Ａは、参照できないオペランド差分値を使用する命令ＩＳの組を、命令ＩＳの順序関係に基づいて判定する。そして、圧縮装置１０Ａは、参照できないオペランド差分値を、係数レジスタに設定されるオペランド差分値の候補から除外する。また、圧縮装置１０Ａは、参照されない命令ＩＳを非参照命令に設定する。
【０１０６】
例えば、圧縮装置１０Ａは、差分抽出部２０、レジスタ値決定部２２、選択部３０Ａ、判定部４０Ａおよび変換部５０Ａを有している。なお、圧縮装置１０Ａは、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。
【０１０７】
圧縮装置１０Ａは、例えば、係数レジスタに設定されるオペランド差分値を保持する。例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を保持する記憶部を有している。係数レジスタは、例えば、圧縮装置１０Ａで圧縮した命令群ＩＳＧを復元するプロセッサ等で使用される。例えば、係数レジスタに設定されるオペランド差分値は、コンパイル処理時に抽出される。係数レジスタには、差分抽出部２０およびレジスタ値決定部２２により決定されたオペランド差分値が設定される。選択部３０Ａは、ＶＬＩＷ命令ＩＳＧの列の中の処理対象のＶＬＩＷ命令ＩＳＧから処理対象の命令を選択する。
【０１０８】
差分抽出部２０は、係数レジスタに設定されるオペランド差分値の候補を抽出する。例えば、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧの列の各ＶＬＩＷ命令ＩＳＧを、選択部３０Ａを介して受ける。なお、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧの列の各ＶＬＩＷ命令ＩＳＧを、選択部３０Ａを介さずに受けてもよい。
【０１０９】
レジスタ値決定部２２は、係数レジスタに設定されるオペランド差分値を、差分抽出部２０で抽出したオペランド差分値の候補から選択する。これにより、プログラムのソースコードＳＣＯＤに応じたオペランド差分値が係数レジスタに設定される。例えば、係数レジスタに設定されるオペランド差分値は、圧縮対象のプログラム毎に決定されてもよいし、圧縮対象のプログラム内の関数毎に決定されてもよい。あるいは、係数レジスタに設定されるオペランド差分値は、圧縮対象のプログラム内の関数より小さい単位の基本ブロック毎に決定されてもよい。
【０１１０】
判定部４０Ａは、選択部３０で選択された処理対象の命令が圧縮可能か否かを判定する。変換部５０Ａは、判定部４０Ａで圧縮可能と判定された命令を、参照先命令およびオペランド差分値に基づいて、圧縮命令に変換する。これにより、圧縮命令を含む圧縮命令群ＣＩＳＧが生成される。なお、処理対象のＶＬＩＷ命令ＩＳＧの全ての命令が圧縮されない場合、圧縮命令群ＣＩＳＧは、圧縮命令を含まない。
【０１１１】
選択部３０Ａ、判定部４０Ａおよび変換部５０Ａは、例えば、図１５に示す動作により、基本ブロックに対する圧縮処理を実行する。なお、選択部３０Ａ、判定部４０Ａおよび変換部５０Ａは、図６に示した動作により、基本ブロックに対する圧縮処理を実行してもよい。すなわち選択部３０Ａ、判定部４０Ａおよび変換部５０Ａは、図１に示した選択部３０、判定部４０および変換部５０と同様でもよい。
【０１１２】
なお、圧縮装置１０Ａの構成は、この例に限定されない。例えば、圧縮装置１０Ａは、コンパイル後のＶＬＩＷ命令ＩＳＧの列を、受けてもよい。この場合、コンパイル処理は、圧縮装置１０Ａとは別の装置により実行される。
【０１１３】
図９は、図８に示した圧縮装置１０Ａの動作の一例を示している。なお、図９は、圧縮処理に関する圧縮装置１０Ａの動作の一例を示している。図９の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、圧縮プログラム等のソフトウエアは、コンピュータに図９の動作を実行させてもよい。図９の例では、係数レジスタ値は、圧縮対象のプログラム全体で共通に使用される。すなわち、図９の例では、係数レジスタに設定されるオペランド差分値は、圧縮対象のプログラム毎に決定される。
【０１１４】
図９の動作は、図５に示した動作に処理Ｓ１０００、Ｓ２０００が追加されている。例えば、処理Ｓ１０００、Ｓ２０００は、処理Ｓ１００の前に実行される。また、図９の動作では、図５に示した処理Ｓ３００の代わりに、処理Ｓ３００Ａが実行される。図９のその他の動作は、図５に示した動作と同様である。図５で説明した処理については、詳細な説明を省略する。
【０１１５】
処理Ｓ１０００では、圧縮装置１０Ａは、オペランド差分値抽出処理を実行する。例えば、圧縮装置１０Ａは、オペコードが互いに同じで、かつ、オペランドの差分が図４に示したような所定の関係を満たす命令ＩＳの組を、圧縮対象のプログラムをコンパイルして生成したＶＬＩＷ命令ＩＳＧの列から抽出する。これにより、係数レジスタに設定されるオペランド差分値の候補が抽出される。
【０１１６】
処理Ｓ２０００では、圧縮装置１０Ａは、係数レジスタ値決定処理を実行する。例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を、処理Ｓ１０００で抽出したオペランド差分値の候補から選択する。これにより、係数レジスタに設定されるオペランド差分値が決定する。そして、例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を保持する。
【０１１７】
処理Ｓ１００、Ｓ２００は、図５に示した処理Ｓ１００、Ｓ２００と同様である。例えば、処理Ｓ１００では、処理Ｓ２０００で決定したオペランド差分値を係数レジスタに設定するためのコードを、メイン関数の先頭やスタートアップコードの末尾等に生成する。これにより、圧縮処理に使用する係数レジスタ値が設定される。
【０１１８】
処理Ｓ３００Ａでは、圧縮装置１０Ａは、基本ブロックＢＢに対する圧縮処理を実行する。例えば、圧縮装置１０Ａは、図１５に示す圧縮処理を実行する。なお、圧縮装置１０Ａは、図６に示した圧縮処理を実行してもよい。基本ブロックＢＢに対する圧縮処理により、ＶＬＩＷ命令ＩＳＧを圧縮した圧縮命令群ＣＩＳＧが生成される。
【０１１９】
処理Ｓ４００、Ｓ５００、Ｓ６００は、図５に示した処理Ｓ４００、Ｓ５００、Ｓ６００と同様である。
【０１２０】
図１０は、図９に示したオペランド差分値抽出処理Ｓ１０００の一例を示している。なお、命令ＩＳｍ＿ｉは、基本ブロックＢＢのｉ番目のＶＬＩＷ命令ＩＳＧ（ＩＳＧｉ）のｍ番目のスロットの命令ＩＳ（ＩＳｍ）を示している。例えば、ＶＬＩＷ命令ＩＳＧのスロットが４つの場合（図２に示したフォーマット）、ｍは、１、２、３、４のいずれかである。
【０１２１】
処理Ｓ１１００では、差分抽出部２０は、オペランド差分値の候補等を示す差分情報の集合である候補リストＬＳＴを初期化する。差分情報は、例えば、オペコードが互いに同じで、かつ、オペランドの差分が図４に示したような所定の関係を満たす命令ＩＳの組（参照候補命令ＩＳ、圧縮候補命令ＩＳ）と、命令ＩＳの組のオペランド差分値とを有している。
【０１２２】
処理Ｓ１１００では、差分抽出部２０は、圧縮対象のプログラムのＶＬＩＷ命令ＩＳＧの列から処理対象の関数を選択する。処理Ｓ１１２０では、差分抽出部２０は、処理Ｓ１１００で選択した処理対象の関数から処理対象の基本ブロックＢＢを選択する。処理Ｓ１１３０では、差分抽出部２０は、基本ブロックＢＢの１番目のＶＬＩＷ命令ＩＳＧ１の１番目のスロットの命令ＩＳ１を、処理対象の命令ＩＳｍ＿ｉとして選択する。すなわち、図１０の例では、差分抽出部２０は、参照候補命令ＩＳを抽出する処理を、基本ブロックＢＢの最初の文から順に実行する。
【０１２３】
処理Ｓ１２００では、差分抽出部２０は、命令ＩＳｍ＿ｉの先行ＶＬＩＷ命令ＩＳＧに対するオペランド差分値抽出処理を実行する。例えば、差分抽出部２０は、命令ＩＳｍ＿ｉに対する関係が図４に示したような所定の関係を満たす命令ＩＳ（参照候補命令ＩＳ）を、基本ブロックＢＢの１番目から“ｉ−１”番目までのＶＬＩＷ命令ＩＳＧから検索する。そして、差分抽出部２０は、検索結果に基づいて、候補リストＬＳＴを更新する。
【０１２４】
処理Ｓ１３００では、差分抽出部２０は、命令ＩＳｍ＿ｉと同一のＶＬＩＷ命令ＩＳＧ（ＩＳＧｉ）に対するオペランド差分値抽出処理を実行する。例えば、差分抽出部２０は、参照候補命令ＩＳを、ＶＬＩＷ命令ＩＳＧｉの先行スロット（１番目から“ｍ−１”番目までのスロット）から検索する。そして、差分抽出部２０は、検索結果に基づいて、候補リストＬＳＴを更新する。なお、例えば、先行スロットが存在しない先頭のスロット１の命令ＩＳ１＿ｉに対しては、処理Ｓ１３００は実行されない。
【０１２５】
処理Ｓ１４００では、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧｉ内の全ての命令ＩＳに対する処理が終了したか否かを判定する。参照候補命令ＩＳの検索が実行されていない命令ＩＳがＶＬＩＷ命令ＩＳＧｉ内に存在するとき（処理Ｓ１４００のＮｏ）、差分抽出部２０の動作は、処理Ｓ１４１０に移る。一方、ＶＬＩＷ命令ＩＳＧｉ内の全ての命令ＩＳに対する処理（参照候補命令ＩＳの検索）が終了しているとき（処理Ｓ１４００のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１４２０に移る。
【０１２６】
処理Ｓ１４１０では、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧｉ内の次のスロットの命令ＩＳｍ＿ｉ（ｉ＝ｉ、ｍ＝ｍ＋１）を選択する。差分抽出部２０は、命令ＩＳｍ＿ｉを選択した後、処理Ｓ１２００−Ｓ１４００を実行する。これにより、参照候補命令ＩＳの検索は、ＶＬＩＷ命令ＩＳＧｉ内の全ての命令ＩＳに対して実行される。
【０１２７】
処理Ｓ１４２０では、差分抽出部２０は、基本ブロックＢＢ内の全てのＶＬＩＷ命令ＩＳＧに対する処理が終了したか否かを判定する。参照候補命令ＩＳの検索が実行されていないＶＬＩＷ命令ＩＳＧが基本ブロックＢＢ内に存在するとき（処理Ｓ１４２０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１４３０に移る。一方、基本ブロックＢＢ内の全てのＶＬＩＷ命令ＩＳＧに対する処理（参照候補命令ＩＳの検索）が終了しているとき（処理Ｓ１４２０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５００に移る。
【０１２８】
処理Ｓ１４３０では、差分抽出部２０は、基本ブロックＢＢ内の命令ＩＳｍ＿ｉ（ｉ＝ｉ＋１、ｍ＝１）を選択する。すなわち、差分抽出部２０は、基本ブロックＢＢ内の次のＶＬＩＷ命令ＩＳＧｉ（ｉ＝ｉ＋１）の１番目のスロットの命令ＩＳ１を、処理対象の命令ＩＳｍ＿ｉとして選択する。差分抽出部２０は、命令ＩＳｍ＿ｉを選択した後、処理Ｓ１２００−Ｓ１４２０の一連の処理を実行する。これにより、参照候補命令ＩＳの検索は、基本ブロックＢＢ内の全ての命令ＩＳに対して実行される。
【０１２９】
処理Ｓ１５００では、差分抽出部２０は、参照できないオペランド差分値の削除処理を実行する。これにより、候補リストＬＳＴが更新される。例えば、差分抽出部２０は、参照できないオペランド差分値を含む差分情報を、命令ＩＳの順序関係に基づいて判定する。そして、差分抽出部２０は、参照できないオペランド差分値を含む差分情報を、候補リストＬＳＴから削除する。これにより、参照できないオペランド差分値は、係数レジスタに設定されるオペランド差分値の候補から除外される。
【０１３０】
処理Ｓ１６００では、差分抽出部２０は、関数内の全ての基本ブロックＢＢに対する処理が終了したか否かを判定する。参照候補命令ＩＳの検索が実行されていない基本ブロックＢＢが関数内に存在するとき（処理Ｓ１６００のＮｏ）、差分抽出部２０の動作は、処理Ｓ１１２０に戻る。一方、関数内の全ての基本ブロックＢＢに対する処理（参照候補命令ＩＳの検索）が終了しているとき（処理Ｓ１６００のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１６１０に移る。
【０１３１】
処理Ｓ１６１０では、差分抽出部２０は、全ての関数に対する処理が終了したか否かを判定する。参照候補命令ＩＳの検索が実行されていない関数が存在するとき（処理Ｓ１６１０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１１１０に戻る。一方、全ての関数に対する処理（参照候補命令ＩＳの検索）が終了しているとき（処理Ｓ１６１０のＹｅｓ）、オペランド差分値抽出処理（図９に示した処理Ｓ１０００）は、終了する。
【０１３２】
図１１は、図１０に示した先行命令群（先行ＶＬＩＷ命令）ＩＳＧに対するオペランド差分値抽出処理Ｓ１２００の一例を示している。
【０１３３】
処理Ｓ１２１０では、差分抽出部２０は、処理対象の命令ＩＳｍ＿ｉの１つ前のＶＬＩＷ命令ＩＳＧｘ（ｘ＝ｉ−１）の１番目のスロットの命令ＩＳ１を、比較対象の命令ＩＳｎ＿ｘ（ｘ＝ｉ−１、ｎ＝１）として選択する。処理対象の命令ＩＳｍ＿ｉは、例えば、図１０に示した処理Ｓ１１３０、Ｓ１４１０、Ｓ１４３０等で選択した命令ＩＳｍ＿ｉである。
【０１３４】
処理Ｓ１２２０では、差分抽出部２０は、命令ＩＳｍ＿ｉと命令ＩＳｎ＿ｘとを比較する。処理Ｓ１２３０では、差分抽出部２０は、処理Ｓ１２２０の比較結果に基づいて、オペコードが命令ＩＳｍ＿ｉと命令ＩＳｎ＿ｘで同じか否かを判定する。命令ＩＳｍ＿ｉのオペコードが命令ＩＳｎ＿ｘのオペコードと異なるとき（処理Ｓ１２３０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１２３４に移る。一方、命令ＩＳｍ＿ｉのオペコードが命令ＩＳｎ＿ｘのオペコードと同じとき（処理Ｓ１２３０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１２３２に移る。
【０１３５】
処理Ｓ１２３２では、差分抽出部２０は、処理Ｓ１２２０の比較結果に基づいて、命令ＩＳｍ＿ｉ、ＩＳｎ＿ｘ間のオペランドの変化が所定のパターン（例えば、図４に示したパターン）か否かを判定する。例えば、差分抽出部２０は、命令ＩＳｎ＿ｘのオペランドに対する命令ＩＳｍ＿ｉのオペランドの変化が規則的（例えば、図４に示したパターン）か否かを判定する。
【０１３６】
命令ＩＳｍ＿ｉ、ＩＳｎ＿ｘ間のオペランドの変化が所定のパターンでないとき（処理Ｓ１２３２のＮｏ）、差分抽出部２０の動作は、処理Ｓ１２３４に移る。すなわち、命令ＩＳｎ＿ｘのオペランドに対する命令ＩＳｍ＿ｉのオペランドの変化が不規則のとき、差分抽出部２０の動作は、処理Ｓ１２３４に移る。
【０１３７】
一方、命令ＩＳｍ＿ｉ、ＩＳｎ＿ｘ間のオペランドの変化が所定のパターンのとき（処理Ｓ１２３２のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１２４０に移る。すなわち、命令ＩＳｍ＿ｉのオペコードが命令ＩＳｎ＿ｘのオペコードと同じで、かつ、命令ＩＳｎ＿ｘのオペランドに対する命令ＩＳｍ＿ｉのオペランドの変化が規則的（例えば、図４に示したパターン）のとき、差分抽出部２０の動作は、処理Ｓ１２４０に移る。
【０１３８】
処理Ｓ１２４０では、差分抽出部２０は、命令ＩＳｍ＿ｉ、ＩＳｎ＿ｘ間のオペランド差分値ｄを抽出する。そして、差分抽出部２０は、オペランド差分値ｄ、命令ＩＳｎ＿ｘ（参照候補命令ＩＳ）、命令ＩＳｍ＿ｉ（圧縮候補命令ＩＳ）等を含む差分情報ＤＳを、候補リストＬＳＴに追加する。
【０１３９】
処理Ｓ１２３４では、差分抽出部２０は、基本ブロックＢＢの先頭の先行ＶＬＩＷ命令ＩＳＧ１まで選択済みか否かを判定する。例えば、差分抽出部２０は、基本ブロックＢＢの先頭のＶＬＩＷ命令ＩＳＧ１の命令ＩＳｎを、比較対象の命令ＩＳｎ＿ｘ（ｘ＝１）として選択したか否かを判定する。
【０１４０】
基本ブロックＢＢの先頭の先行ＶＬＩＷ命令ＩＳＧ１まで選択済みのとき（処理Ｓ１２３４のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１２５０に移る。一方、基本ブロックＢＢの先頭の先行ＶＬＩＷ命令ＩＳＧ１まで選択済みでないとき（処理Ｓ１２３４のＮｏ）、差分抽出部２０の動作は、処理Ｓ１２３６に移る。すなわち、比較対象の命令ＩＳｎ＿ｘの選択が実行されていない先行ＶＬＩＷ命令ＩＳＧが存在するとき、差分抽出部２０の動作は、処理Ｓ１２３６に移る。
【０１４１】
処理Ｓ１２３６では、差分抽出部２０は、別の先行ＶＬＩＷ命令ＩＳＧの命令ＩＳｎ＿ｘ（ｘ＝ｘ−１、ｎ＝ｎ）を、比較対象の命令ＩＳｎ＿ｘとして選択する。差分抽出部２０は、命令ＩＳｎ＿ｘを選択した後、処理Ｓ１２２０、Ｓ１２３０等の一連の処理を実行する。すなわち、命令ＩＳｍ＿ｉのオペランド差分値ｄの候補を検索する処理は、参照候補命令ＩＳｎが検出されるまで、命令ＩＳｍ＿ｉの１つ前のＶＬＩＷ命令ＩＳＧｘ（ｘ＝ｉ−１）から先頭の先行ＶＬＩＷ命令ＩＳＧ１まで順次実行される。
【０１４２】
処理Ｓ１２５０では、差分抽出部２０は、命令ＩＳｍ＿ｉとの比較を全ての位置（スロット番号）に対して実行したか否かを判定する。命令ＩＳｍ＿ｉとの比較が実行されていないスロットが存在するとき（処理Ｓ１２５０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１２５２に移る。
【０１４３】
処理Ｓ１２５２では、差分抽出部２０は、別のスロットの命令ＩＳｎ＿ｘ（ｘ＝ｉ−１、ｎ＝ｎ＋１）を、比較対象の命令ＩＳｎ＿ｘとして選択する。差分抽出部２０は、命令ＩＳｎ＿ｘを選択した後、処理Ｓ１２２０、Ｓ１２３０等の一連の処理を実行する。すなわち、命令ＩＳｍ＿ｉのオペランド差分値ｄの候補を検索する処理は、全てのスロット番号の命令ＩＳに対して実行される。
【０１４４】
一方、命令ＩＳｍ＿ｉとの比較が全てのスロットに対して実行されたとき（処理Ｓ１２５０のＹｅｓ）、先行ＶＬＩＷ命令ＩＳＧに対するオペランド差分値抽出処理（図１０に示した処理Ｓ１２００）は、終了する。
【０１４５】
図１２は、図１０に示した同一命令群（同一ＶＬＩＷ命令）ＩＳＧに対するオペランド差分値抽出処理Ｓ１３００の一例を示している。図１２の動作では、処理対象の命令ＩＳｍ＿ｉと同一のＶＬＩＷ命令ＩＳＧｉから比較対象の命令ＩＳｎ＿ｉが選択される。したがって、図１２の動作は、図１１に示した処理Ｓ１２３４、Ｓ１２３６が省かれた動作と同様である。例えば、処理Ｓ１３１０、Ｓ１３２０、Ｓ１３３０、Ｓ１３３２、Ｓ１３４０、Ｓ１３５０、Ｓ１３５２は、図１１に示した処理Ｓ１２１０、Ｓ１２２０、Ｓ１２３０、Ｓ１２３２、Ｓ１２４０、Ｓ１２５０、Ｓ１２５２に対応している。図１１で説明した処理と同様の処理については、詳細な説明を省略する。
【０１４６】
処理Ｓ１３１０では、差分抽出部２０は、処理対象の命令ＩＳｍ＿ｉと同一のＶＬＩＷ命令ＩＳＧｉの１番目のスロットの命令ＩＳ１を、比較対象の命令ＩＳｎ＿ｉ（ｎ＝１）として選択する。処理Ｓ１３２０では、差分抽出部２０は、命令ＩＳｍ＿ｉと命令ＩＳｎ＿ｉとを比較する。
【０１４７】
そして、差分抽出部２０は、命令ＩＳｍ＿ｉのオペコードが命令ＩＳｎ＿ｉのオペコードと異なるとき（処理Ｓ１３３０のＮｏ）、処理Ｓ１３４０を実行せずに、処理Ｓ１３５０を実行する。また、差分抽出部２０は、命令ＩＳｎ＿ｉのオペランドに対する命令ＩＳｍ＿ｉのオペランドの変化が不規則のときにも（処理Ｓ１３３２のＮｏ）、処理Ｓ１３４０を実行せずに、処理Ｓ１３５０を実行する。
【０１４８】
換言すれば、差分抽出部２０は、命令ＩＳｍ＿ｉのオペコードが命令ＩＳｎ＿ｉのオペコードと同じで、かつ、命令ＩＳｎ＿ｉのオペランドに対する命令ＩＳｍ＿ｉのオペランドの変化が規則的（例えば、図４に示したパターン）のとき、処理Ｓ１３４０を実行する。
【０１４９】
処理Ｓ１３５０では、差分抽出部２０は、命令ＩＳｍ＿ｉとの比較を全ての先行命令ＩＳ（ｍより小さい全てのスロット番号の命令ＩＳ）に対して実行したか否かを判定する。命令ＩＳｍ＿ｉとの比較が実行されていない先行命令ＩＳが存在するとき（処理Ｓ１３５０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１３５２に移る。
【０１５０】
処理Ｓ１３５２では、差分抽出部２０は、別のスロットの命令ＩＳｎ＿ｉ（ｉ＝ｉ、ｎ＝ｎ＋１）を、比較対象の命令ＩＳｎ＿ｉとして選択する。差分抽出部２０は、命令ＩＳｎ＿ｉを選択した後、処理Ｓ１３２０、Ｓ１３３０等の一連の処理を実行する。すなわち、命令ＩＳｍ＿ｉのオペランド差分値ｄの候補を検索する処理は、同一ＶＬＩＷ命令ＩＳＧｉ内の全ての先行命令ＩＳに対して実行される。
【０１５１】
一方、命令ＩＳｍ＿ｉとの比較が全ての先行命令ＩＳに対して実行されたとき（処理Ｓ１３５０のＹｅｓ）、同一ＶＬＩＷ命令ＩＳＧに対するオペランド差分値抽出処理（図１０に示した処理Ｓ１３００）は、終了する。
【０１５２】
図１３は、図１０に示した参照できないオペランド差分値の削除処理Ｓ１５００の一例を示している。
【０１５３】
処理Ｓ１５１０では、差分抽出部２０は、基本ブロックＢＢの最後から２番目（ｚ）のＶＬＩＷ命令ＩＳＧｉ（ｉ＝ｚ）の命令ＩＳｎ＿ｉ（ｎ＝１）を参照候補命令として含む差分情報ＤＳｎを、候補リストＬＳＴから検索する。差分情報ＤＳｎは、命令ＩＳｎ＿ｉを参照候補命令ＩＳとして含む差分情報ＤＳである。
【０１５４】
処理Ｓ１５２０では、差分抽出部２０は、未選択の差分情報ＤＳｎが候補リストＬＳＴに存在するか否かを判定する。未選択の差分情報ＤＳｎが存在するとき（処理Ｓ１５２０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５２２に移る。一方、未選択の差分情報ＤＳｎが存在しないとき（処理Ｓ１５２０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５３０に移る。
【０１５５】
処理Ｓ１５２２では、差分抽出部２０は、オペランド差分値ｄ、命令ＩＳｎ＿ｉ（参照候補命令ＩＳ）、命令ＩＳｍ＿ｋ（圧縮候補命令ＩＳ）等を含む差分情報ＤＳｎを、候補リストＬＳＴから選択する。
【０１５６】
処理Ｓ１５２４では、差分抽出部２０は、ｉ＜ｔ＜ｋの範囲の命令ＩＳｎ＿ｔに非参照命令以外の命令ＩＳが存在するか否かを判定する。すなわち、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧｉとＶＬＩＷ命令ＩＳＧｋとの間のＶＬＩＷ命令ＩＳＧｔ（ｉ＜ｔ＜ｋ）のｎ番目のスロットに非参照命令以外の命令ＩＳが存在するか否かを判定する。
【０１５７】
ｉ＜ｔ＜ｋの範囲の命令ＩＳｎ＿ｔに非参照命令以外の命令ＩＳが存在しないとき（処理Ｓ１５２４のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５２０に戻る。一方、ｉ＜ｔ＜ｋの範囲の命令ＩＳｎ＿ｔに非参照命令以外の命令ＩＳが存在するとき（処理Ｓ１５２４のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５２６に移る。
【０１５８】
処理Ｓ１５２６では、差分抽出部２０は、処理Ｓ１５２２で選択した差分情報ＤＳｎを、候補リストＬＳＴから削除する。差分抽出部２０は、差分情報ＤＳｎを候補リストＬＳＴから削除した後、処理Ｓ１５２０を実行する。すなわち、処理Ｓ１５２４等は、全ての差分情報ＤＳｎに対して実行される。
【０１５９】
処理Ｓ１５３０では、差分抽出部２０は、命令ＩＳｎ＿ｉを参照候補命令として含む差分情報ＤＳｎが候補リストＬＳＴに存在するか否かを判定する。差分情報ＤＳｎが候補リストＬＳＴに存在するとき（処理Ｓ１５３０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５６０に移る。一方、差分情報ＤＳｎが候補リストＬＳＴに存在しないとき（処理Ｓ１５３０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５４０に移る。
【０１６０】
処理Ｓ１５４０では、差分抽出部２０は、命令ＩＳｎ＿ｉが圧縮可能か否かを判定する。例えば、差分抽出部２０は、命令ＩＳｎ＿ｉを圧縮候補命令ＩＳとして含む差分情報ＤＳが候補リストＬＳＴに存在するか否かを判定する。命令ＩＳｎ＿ｉが圧縮可能のとき（処理Ｓ１５４０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５６０に移る。一方、命令ＩＳｎ＿ｉが圧縮可能でないとき（処理Ｓ１５４０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５５０に移る。
【０１６１】
処理Ｓ１５５０では、差分抽出部２０は、命令ＩＳｎ＿ｉを非参照命令に設定する。例えば、差分抽出部２０は、命令ＩＳｎ＿ｉが非参照命令であることを示すフラグを設定する。なお、命令ＩＳｎ＿ｉが非参照命令であることを示すフラグとして、参照情報ＳＩＮＦが使用されてもよい。
【０１６２】
処理Ｓ１５６０では、差分抽出部２０は、ＶＬＩＷ命令ＩＳＧｉ内の全ての命令ＩＳに対する処理（差分情報ＤＳの検索等）が終了したか否かを判定する。差分情報ＤＳの検索等が実行されていない命令ＩＳがＶＬＩＷ命令ＩＳＧｉ内に存在するとき（処理Ｓ１５６０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５６２に移る。一方、ＶＬＩＷ命令ＩＳＧｉ内の全ての命令ＩＳに対する処理（差分情報ＤＳの検索等）が終了しているとき（処理Ｓ１５６０のＹｅｓ）、差分抽出部２０の動作は、処理Ｓ１５７０に移る。
【０１６３】
処理Ｓ１５６２では、差分抽出部２０は、別の命令ＩＳｎ＿ｉ（ｎ＝ｎ＋１）を参照候補命令として含む差分情報ＤＳｎを、候補リストＬＳＴから検索する。差分抽出部２０は、別の命令ＩＳｎ＿ｉを参照候補命令ＩＳとして含む差分情報ＤＳｎを候補リストＬＳＴから検索した後、処理Ｓ１５２０を実行する。
【０１６４】
処理Ｓ１５７０では、差分抽出部２０は、基本ブロックＢＢ内の全てのＶＬＩＷ命令ＩＳＧに対する処理（差分情報ＤＳの検索等）が終了したか否かを判定する。差分情報ＤＳの検索等が実行されていないＶＬＩＷ命令ＩＳＧが基本ブロックＢＢ内に存在するとき（処理Ｓ１５７０のＮｏ）、差分抽出部２０の動作は、処理Ｓ１５７２に移る。
【０１６５】
処理Ｓ１５７２では、差分抽出部２０は、別のＶＬＩＷ命令ＩＳＧｉ（ｉ＝ｉ−１）の命令ＩＳｎ＿ｉ（ｎ＝１）を参照候補命令として含む差分情報ＤＳｎを、候補リストＬＳＴから検索する。差分抽出部２０は、別のＶＬＩＷ命令ＩＳＧｉの命令ＩＳｎ＿ｉを参照候補命令ＩＳとして含む差分情報ＤＳｎを候補リストＬＳＴから検索した後、処理Ｓ１５２０を実行する。
【０１６６】
一方、基本ブロックＢＢ内の全てのＶＬＩＷ命令ＩＳＧに対する処理（差分情報ＤＳの検索等）が終了しているとき（処理Ｓ１５７０のＹｅｓ）、参照できないオペランド差分値の削除処理（図１０に示した処理Ｓ１５００）は、終了する。このように、差分抽出部２０は、例えば、参照できないオペランド差分値の検索を、基本ブロックＢＢの最後から２番目のＶＬＩＷ命令ＩＳＧから先頭のＶＬＩＷ命令ＩＳＧまで、順次実行する。
【０１６７】
図１４は、図９に示した係数レジスタ値決定処理Ｓ２０００の一例を示している。
【０１６８】
処理Ｓ２１００では、レジスタ値決定部２２は、候補リストＬＳＴ内の最多のオペランド差分値ｄをインデックスｉ（ｉ＝０）の係数レジスタ値に決定する。すなわち、レジスタ値決定部２２は、命令ＩＳの圧縮処理で最も使用されるオペランド差分値ｄをインデックス０の係数レジスタ値に決定する。例えば、レジスタ値決定部２２は、候補リストＬＳＴ内の差分情報ＤＳを調べて、各オペランド差分値ｄの発生回数を算出する。そして、レジスタ値決定部２２は、発生回数が最多のオペランド差分値ｄを、インデックス０の係数レジスタ値に決定する。
【０１６９】
処理Ｓ２１１０では、レジスタ値決定部２２は、全ての係数レジスタ値が決定したか否かを判定する。全ての係数レジスタ値が決定したとき（処理Ｓ２１１０のＹｅｓ）、レジスタ値決定部２２による係数レジスタ値決定処理（図９に示した処理Ｓ２０００）は、終了する。例えば、４つの係数レジスタ値を使用する圧縮装置１０Ａでは、インデックス０−インデックス３の４つの係数レジスタ値が決定したとき、係数レジスタ値決定処理は終了する。一方、オペランド差分値ｄが決定されていない係数レジスタが存在するとき（処理Ｓ２１１０のＮｏ）、レジスタ値決定部２２の動作は、処理Ｓ２１２０に移る。
【０１７０】
処理Ｓ２１２０では、レジスタ値決定部２２は、係数レジスタ値に決定したオペランド差分値ｄを参照する命令ＩＳを圧縮候補命令ＩＳとして含む差分情報ＤＳを、次の係数レジスタ値を決定する際のオペランド差分値ｄの検索対象から除外する。例えば、レジスタ値決定部２２は、検索対象（１回目の処理Ｓ２１２０では、候補リストＬＳＴ）の差分情報ＤＳを調べて、係数レジスタ値に決定したオペランド差分値ｄを含む差分情報ＤＳの圧縮候補命令ＩＳを抽出する。そして、レジスタ値決定部２２は、抽出した命令ＩＳを圧縮候補命令ＩＳとして含む差分情報ＤＳを、検索対象（１回目の処理Ｓ２１２０では、候補リストＬＳＴ）から抽出する。
【０１７１】
これにより、例えば、係数レジスタ値に決定したオペランド差分値ｄを含む差分情報ＤＳが抽出される。さらに、係数レジスタ値に決定したオペランド差分値ｄを含む差分情報ＤＳと圧縮候補命令ＩＳが重複する差分情報ＤＳが存在するとき、重複する差分情報ＤＳも抽出される。そして、レジスタ値決定部２２は、抽出した差分情報ＤＳを、次の係数レジスタ値を決定する際のオペランド差分値ｄの検索対象から除外する。これにより、係数レジスタ値に決定したオペランド差分値ｄで圧縮可能な命令ＩＳに対応する差分情報ＤＳは、例えば、次のインデックスｉの係数レジスタ値を決定する際（処理Ｓ２１３０）の検索対象から除外される。
【０１７２】
処理Ｓ２１３０では、レジスタ値決定部２２は、候補リストＬＳＴ内の検索対象（処理Ｓ２１２０で更新した検索対象）のうちで最多のオペランド差分値ｄをインデックスｉ（ｉ＝ｉ＋１）の係数レジスタ値に決定する。例えば、レジスタ値決定部２２は、候補リストＬＳＴ内の検索対象の差分情報ＤＳを調べて、各オペランド差分値ｄの発生回数を算出する。そして、レジスタ値決定部２２は、発生回数が最多のオペランド差分値ｄを、インデックスｉの係数レジスタ値に決定する。
【０１７３】
レジスタ値決定部２２は、インデックスｉの係数レジスタ値を決定した後、処理Ｓ２１１０を実行する。処理Ｓ２１１０−Ｓ２１３０の一連の処理が繰り返されることにより、オペランド差分値ｄは、使用頻度の高い（発生回数の多い）順に、係数レジスタ値に決定される。例えば、図１４の動作により決定したオペランド差分値（係数レジスタ値）を係数レジスタに設定するためのコードが、図９に示した処理Ｓ１００において、メイン関数の先頭やスタートアップコードの末尾等に生成される。
【０１７４】
なお、例えば、処理Ｓ２１００において、レジスタ値決定部２２は、係数レジスタ値（オペランド差分値ｄ）を決定するための差分値リストを、候補リストＬＳＴとは別に生成してもよい。例えば、差分値リストは、オペランド差分値ｄの発生回数に対応付けられた差分情報ＤＳを有している。この場合、処理Ｓ２１２０では、差分値リスト（検索対象）が更新される。そして、処理Ｓ２１３０では、差分値リスト内の最多のオペランド差分値ｄをインデックスｉの係数レジスタ値に決定する。
【０１７５】
図１５は、図９に示した基本ブロックＢＢに対する圧縮処理Ｓ３００Ａの一例を示している。処理Ｓ３６０では、選択部３０Ａは、例えば、基本ブロックＢＢの１番目のＶＬＩＷ命令ＩＳＧ１の１番目のスロットの命令ＩＳ１を、処理対象の命令ＩＳｍ＿ｉ（ｉ＝１、ｍ＝１）として選択する。
【０１７６】
処理Ｓ３６２では、判定部４０Ａは、処理Ｓ３６０で選択した処理対象の命令ＩＳｍ＿ｉが非参照命令か否かを判定する。例えば、判定部４０Ａは、非参照命令であることを示すフラグ（図１３に示した処理Ｓ１５５０で設定されるフラグ）が命令ＩＳｍ＿ｉに設定されているか否かを判定する。
【０１７７】
命令ＩＳｍ＿ｉが非参照命令のとき（処理Ｓ３６２のＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ３７６に移る。一方、命令ＩＳｍ＿ｉが非参照命令でないとき（処理Ｓ３６２のＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ３６４に移る。
【０１７８】
処理Ｓ３６４では、判定部４０Ａは、命令ＩＳｍ＿ｉを圧縮する際の情報を含む差分情報ＤＳを、候補リストＬＳＴから検索する。命令ＩＳｍ＿ｉを圧縮する際の情報を含む差分情報ＤＳでは、例えば、オペランド差分値ｄは、係数レジスタに設定される値（図１４の動作により決定した係数レジスタ値）のいずれかと一致し、圧縮候補命令ＩＳは命令ＩＳｍ＿ｉと一致する。
【０１７９】
例えば、判定部４０Ａは、係数レジスタに設定される値（図１４の動作により決定した係数レジスタ値）のいずれかをオペランド差分値ｄとして含み、かつ、命令ＩＳｍ＿ｉを圧縮候補命令ＩＳとして含む差分情報ＤＳを、候補リストＬＳＴから検索する。
【０１８０】
処理Ｓ３６６では、判定部４０Ａは、命令ＩＳｍ＿ｉを圧縮する際の情報を含む差分情報ＤＳが候補リストＬＳＴに存在するか否かを、処理Ｓ３６４の検索結果に基づいて判定する。命令ＩＳｍ＿ｉを圧縮候補命令ＩＳとして含む差分情報ＤＳが候補リストＬＳＴに存在するとき（処理Ｓ３６６のＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ３６８に移る。すなわち、命令ＩＳｍ＿ｉが圧縮可能のとき、圧縮装置１０Ａの動作は、処理Ｓ３６８に移る。
【０１８１】
一方、命令ＩＳｍ＿ｉを圧縮する際の情報を含む差分情報ＤＳが候補リストＬＳＴに存在しないとき（処理Ｓ３６６のＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ３７４に移る。すなわち、命令ＩＳｍ＿ｉが参照先命令のとき、圧縮装置１０Ａの動作は、処理Ｓ３７４に移る。
【０１８２】
処理Ｓ３６８では、例えば、圧縮装置１０Ａは、オペランド差分値ｄ（係数レジスタ値のいずれか）、命令ＩＳｎ＿ｘ（参照候補命令ＩＳ）、命令ＩＳｍ＿ｉ（圧縮候補命令ＩＳ）等を含む差分情報ＤＳを抽出する。そして、判定部４０Ａは、抽出した差分情報ＤＳの命令ＩＳｎ＿ｘ（参照候補命令ＩＳ）と命令ＩＳｍ＿ｉとが同一（ｘ＝ｉ）のＶＬＩＷ命令ＩＳＧか否かを判定する。すなわち、判定部４０Ａは、参照候補命令ＩＳｎ＿ｘが同一ＶＬＩＷ命令ＩＳＧか否かを判定する。
【０１８３】
命令ＩＳｎ＿ｘを含むＶＬＩＷ命令ＩＳＧｘと命令ＩＳｍ＿ｉを含むＶＬＩＷ命令ＩＳＧｉとが同じとき（処理Ｓ３６８のＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ３７０に移る。すなわち、参照候補命令ＩＳｎ＿ｘが同一ＶＬＩＷ命令ＩＳＧのとき、圧縮装置１０Ａの動作は、処理Ｓ３７０に移る。
【０１８４】
一方、命令ＩＳｎ＿ｘを含むＶＬＩＷ命令ＩＳＧｘと命令ＩＳｍ＿ｉを含むＶＬＩＷ命令ＩＳＧｉとが異なるとき（処理Ｓ３６８のＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ３７２に移る。すなわち、参照候補命令ＩＳｎ＿ｘが先行ＶＬＩＷ命令ＩＳＧのとき、圧縮装置１０Ａの動作は、処理Ｓ３７２に移る。
【０１８５】
処理Ｓ３７０では、変換部５０Ａは、参照先命令ＩＳｎ＿ｘを参照して、命令ＩＳｍ＿ｉを圧縮する。すなわち、変換部５０Ａは、命令ＩＳｍ＿ｉと同一のＶＬＩＷ命令ＩＳＧｉを参照する圧縮処理を処理対象の命令ＩＳｍ＿ｉに対して実行する。これにより、圧縮命令ＣＩＳｍが生成される。
【０１８６】
例えば、変換部５０Ａは、圧縮命令ＣＩＳｍの復元情報ＩＮＦ１を“１”に設定し、参照先命令ＩＳｎ＿ｘのスロットを示す値（ｎから１を減算した値）を、圧縮命令ＣＩＳｍの復元情報ＩＮＦ２に設定する。そして、変換部５０Ａは、圧縮命令ＣＩＳｍの復元に使用するオペランド差分値ｄが設定された係数レジスタを示す値を、圧縮命令ＣＩＳｍの復元情報ＩＮＦ３に設定する。また、変換部５０Ａは、例えば、圧縮命令群ＣＩＳＧｉの圧縮情報ＣＩＮＦの圧縮命令ＣＩＳｍに対応するビットを“１”に設定する。
【０１８７】
処理Ｓ３７２では、変換部５０Ａは、参照先命令ＩＳｎ＿ｘを参照して、命令ＩＳｍ＿ｉを圧縮する。すなわち、変換部５０Ａは、命令ＩＳｍ＿ｉの先行ＶＬＩＷ命令ＩＳＧｘを参照する圧縮処理を処理対象の命令ＩＳｍ＿ｉに対して実行する。これにより、圧縮命令ＣＩＳｍが生成される。
【０１８８】
例えば、変換部５０Ａは、圧縮命令ＣＩＳｍの復元情報ＩＮＦ１を“０”に設定し、参照先命令ＩＳｎ＿ｘのスロットを示す値（ｎから１を減算した値）を、圧縮命令ＣＩＳｍの復元情報ＩＮＦ２に設定する。そして、変換部５０Ａは、圧縮命令ＣＩＳｍの復元に使用するオペランド差分値ｄが設定された係数レジスタを示す値を、圧縮命令ＣＩＳｍの復元情報ＩＮＦ３に設定する。また、変換部５０Ａは、例えば、圧縮命令群ＣＩＳＧｉの圧縮情報ＣＩＮＦの圧縮命令ＣＩＳｍに対応するビットを“１”に設定する。
【０１８９】
処理Ｓ３７４では、変換部５０Ａは、命令ＩＳｍ＿ｉに対して、参照処理を実行する。これにより、参照先命令に設定された非圧縮命令ＣＩＳｍが生成される。例えば、変換部５０Ａは、命令ＩＳｍ＿ｉが参照先命令であることを示す参照情報ＳＩＮＦ（例えば、値が“１”の参照情報ＳＩＮＦ）を、命令ＩＳｍ＿ｉの先頭に付加する。また、変換部５０Ａは、例えば、圧縮命令群ＣＩＳＧｉの圧縮情報ＣＩＮＦの非圧縮命令ＣＩＳｍに対応するビットを“０”に設定する。
【０１９０】
処理Ｓ３７６では、変換部５０Ａは、命令ＩＳｍ＿ｉに対して、非参照処理を実行する。これにより、参照先命令でない非圧縮命令ＣＩＳｍが生成される。例えば、変換部５０Ａは、命令ＩＳｍ＿ｉが参照先命令でないことを示す参照情報ＳＩＮＦ（例えば、値が“０”の参照情報ＳＩＮＦ）を、命令ＩＳｍ＿ｉの先頭に付加する。また、変換部５０Ａは、例えば、圧縮命令群ＣＩＳＧｉの圧縮情報ＣＩＮＦの非圧縮命令ＣＩＳｍに対応するビットを“０”に設定する。処理Ｓ３７０−Ｓ３７６のいずれかが実行された後、処理Ｓ３７８が実行される。
【０１９１】
処理Ｓ３７８では、圧縮装置１０Ａは、処理対象のＶＬＩＷ命令ＩＳＧｉに未処理の命令ＩＳが存在するか否かを判定する。例えば、圧縮装置１０Ａは、ＶＬＩＷ命令ＩＳＧｉの最後のスロットの命令ＩＳの処理が終了したか否かを判定する。処理対象のＶＬＩＷ命令ＩＳＧｉに未処理の命令ＩＳが存在するとき（処理Ｓ３７８のＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ３８０に移る。一方、処理対象のＶＬＩＷ命令ＩＳＧｉに未処理の命令ＩＳが存在しないとき（処理Ｓ３７８のＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ３８２に移る。
【０１９２】
処理Ｓ３８０では、選択部３０Ａは、次のスロットの命令ＩＳを、処理対象の命令ＩＳｍ＿ｉ（ｉ＝ｉ、ｍ＝ｍ＋１）として選択する。圧縮装置１０Ａは、命令ＩＳｍ＿ｉを選択した後、処理Ｓ３６２を実行する。
【０１９３】
処理Ｓ３８２では、圧縮装置１０Ａは、基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在するか否かを判定する。例えば、圧縮装置１０Ａは、基本ブロックＢＢの最後のＶＬＩＷ命令ＩＳＧの処理が終了したか否かを判定する。基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在するとき（処理Ｓ３８２のＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ３８４に移る。一方、基本ブロックＢＢに未処理のＶＬＩＷ命令ＩＳＧが存在しないとき（処理Ｓ３８２のＮｏ）、基本ブロックＢＢに対する圧縮処理（図９に示した処理Ｓ３００Ａ）は、終了する。したがって、例えば、図９に示した処理Ｓ４００は、基本ブロックＢＢの最後のＶＬＩＷ命令ＩＳＧの処理が終了した後、実行される。
【０１９４】
処理Ｓ３８４では、選択部３０Ａは、次のＶＬＩＷ命令ＩＳＧの命令ＩＳ１を、処理対象の命令ＩＳｍ＿ｉ（ｉ＝ｉ＋１、ｍ＝１）として選択する。圧縮装置１０Ａは、命令ＩＳｍ＿ｉを選択した後、処理Ｓ３６２を実行する。
【０１９５】
このように、図１５の例では、圧縮装置１０Ａは、ＶＬＩＷ命令ＩＳＧを圧縮する処理を、基本ブロックＢＢの最初の文から順に実行する。そして、ＶＬＩＷ命令ＩＳＧの圧縮処理では、圧縮装置１０Ａは、例えば、ＶＬＩＷ命令ＩＳＧ内の命令ＩＳをスロット１から順に圧縮する。
【０１９６】
なお、圧縮装置１０Ａの動作は、この例に限定されない。例えば、圧縮装置１０Ａは、図１４に示した係数レジスタ値決定処理等において、係数レジスタに設定されないオペランド差分値ｄを含む差分情報ＤＳを、図１５の動作で使用する候補リストＬＳＴから削除してもよい。この場合、圧縮装置１０Ａは、処理Ｓ３６４等を容易に実行できる。また、圧縮装置１０Ａは、非圧縮命令ＣＩＳが同一ＶＬＩＷ命令ＩＳＧの命令ＩＳのみに参照される場合、参照情報ＳＩＮＦを“０”に設定してもよい。
【０１９７】
また、図９−図１５に示した各処理は、図９−図１５に示した順序と異なる順序で実行されてもよい。例えば、図９−図１５に示した処理は、同時に実行されることがあってもよい。
【０１９８】
図１６は、図８に示した圧縮装置１０Ａの動作の別の例を示している。なお、図１６は、圧縮処理に関する圧縮装置１０Ａの動作の一例を示している。図１６の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、圧縮プログラム等のソフトウエアは、コンピュータに図１６の動作を実行させてもよい。図１６の例では、係数レジスタに設定されるオペランド差分値は、関数毎に決定される。図１６の各処理の動作は、図９の対応する処理の動作と同様である。図９で説明した処理については、詳細な説明を省略する。
【０１９９】
処理Ｓ１０００Ａでは、圧縮装置１０Ａは、処理対象の関数に対して、オペランド差分値抽出処理を実行する。これにより、処理対象の関数で使用されるオペランド差分値（係数レジスタに設定される値）の候補が抽出される。
【０２００】
処理Ｓ２０００Ａでは、圧縮装置１０Ａは、係数レジスタ値決定処理（例えば、図１４に示した処理）を実行する。例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を、処理Ｓ１０００Ａで抽出したオペランド差分値の候補から選択する。これにより、係数レジスタに設定されるオペランド差分値が決定する。そして、例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を保持する。
【０２０１】
処理Ｓ２００Ａでは、圧縮装置１０Ａは、関数の先頭のコードを生成する。処理Ｓ１００Ａでは、処理Ｓ２０００Ａで決定したオペランド差分値を係数レジスタに設定するためのコードを、メイン関数の先頭等に生成する。これにより、圧縮処理に使用する係数レジスタ値が設定される。
【０２０２】
処理Ｓ３００Ａ、Ｓ４００、Ｓ５００は、図９に示した処理Ｓ３００Ａ、Ｓ４００、Ｓ５００と同様である。処理Ｓ６００Ａは、分岐先を除いて、図９に示した処理Ｓ６００と同様である。例えば、未処理の関数が存在するとき（処理Ｓ６００ＡのＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ１０００Ａに戻る。すなわち、処理Ｓ１０００Ａ、Ｓ２０００Ａ、Ｓ２００Ａ、Ｓ１００Ａ、Ｓ３００Ａ、Ｓ４００、Ｓ５００等一連の処理は、関数毎に実行される。
【０２０３】
これにより、係数レジスタに設定されるオペランド差分値が関数毎に決定される。なお、プログラム内の全ての関数に対する処理が終了しているとき（処理Ｓ６００ＡのＹｅｓ）、圧縮処理に関する圧縮装置１０Ａの動作は、終了する。
【０２０４】
図１７は、図１６に示したオペランド差分値抽出処理１０００Ａの一例を示している。図１７の動作では、処理Ｓ１１００が実行される前に、処理対象の関数が選択されている。したがって、図１７の動作では、図１０に示した処理Ｓ１１１０（関数選択）および処理Ｓ１６１０（関数の処理終了判定）が省かれている。図１７のその他の動作は、図１０の動作と同様である。図１０で説明した処理については、詳細な説明を省略する。
【０２０５】
処理Ｓ１１００、Ｓ１１２０−Ｓ１６００は、図１０に示した処理Ｓ１１００、Ｓ１１２０−Ｓ１６００と同様である。例えば、参照候補命令ＩＳの検索が実行されていない基本ブロックＢＢが関数内に存在するとき（処理Ｓ１６００のＮｏ）、差分抽出部２０の動作は、処理Ｓ１１２０に戻る。一方、関数内の全ての基本ブロックＢＢに対する処理（参照候補命令ＩＳの検索）が終了しているとき（処理Ｓ１６００のＹｅｓ）、オペランド差分値抽出処理（図１６に示した処理Ｓ１０００Ａ）は、終了する。
【０２０６】
図１６および図１７に示した動作では、係数レジスタに設定されるオペランド差分値を関数毎に決定するため、オペランド差分値をプログラム毎に決定するときに比べて、係数レジスタ値の使用効率（オペランド差分値ｄとして使用される頻度）を向上できる。これにより、図１６および図１７に示した動作では、複数の命令ＩＳを含む命令群ＩＳＧの圧縮率を向上できる。
【０２０７】
なお、図１６および図１７に示した各処理は、図１６等に示した順序と異なる順序で実行されてもよい。例えば、図１６および図１７に示した処理は、同時に実行されることがあってもよい。
【０２０８】
図１８は、図８に示した圧縮装置１０Ａの動作の別の例を示している。なお、図１８は、圧縮処理に関する圧縮装置１０Ａの動作の一例を示している。図１８の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、圧縮プログラム等のソフトウエアは、コンピュータに図１８の動作を実行させてもよい。図１８の例では、に設定されるオペランド差分値は、基本ブロックＢＢ毎に決定される。
【０２０９】
図１８の各処理の動作は、図９の対応する処理の動作と同様である。図９で説明した処理については、詳細な説明を省略する。図１８の動作では、処理Ｓ１０００Ｂが実行される前に、処理Ｓ２００Ｂが実行される。処理Ｓ２００Ｂでは、圧縮装置１０Ａは、処理対象の関数を選択し、関数の先頭のコードを生成する。
【０２１０】
処理Ｓ１０００Ｂでは、圧縮装置１０Ａは、処理対象の基本ブロックＢＢに対して、オペランド差分値抽出処理を実行する。これにより、処理対象の基本ブロックＢＢで使用されるオペランド差分値（係数レジスタに設定される値）の候補が抽出される。
【０２１１】
処理Ｓ２０００Ｂでは、圧縮装置１０Ａは、係数レジスタ値決定処理（例えば、図１４に示した処理）を実行する。例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を、処理Ｓ１０００Ｂで抽出したオペランド差分値の候補から選択する。これにより、係数レジスタに設定されるオペランド差分値が決定する。そして、例えば、圧縮装置１０Ａは、係数レジスタに設定されるオペランド差分値を保持する。
【０２１２】
処理Ｓ１００Ｂでは、処理Ｓ２０００Ｂで決定したオペランド差分値を係数レジスタに設定するためのコードを、処理対象の基本ブロックＢＢ用に生成する。これにより、圧縮処理に使用する係数レジスタ値が設定される。
【０２１３】
処理Ｓ３００Ａ、Ｓ５００は、図９に示した処理Ｓ３００Ａ、Ｓ５００と同様である。処理４００Ａ、Ｓ６００Ｂは、分岐先を除いて、図９に示した処理Ｓ４００、Ｓ６００と同様である。例えば、圧縮処理が実行されていない基本ブロックＢＢが関数内に存在するとき（処理Ｓ４００ＡのＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ１０００Ｂに戻る。すなわち、処理Ｓ１０００Ｂ、Ｓ２０００Ｂ、Ｓ１００Ｂ、Ｓ３００Ａの一連の処理は、基本ブロックＢＢ毎に実行される。これにより、係数レジスタに設定されるオペランド差分値が基本ブロックＢＢ毎に決定される。
【０２１４】
なお、関数内の全ての基本ブロックＢＢに対する圧縮処理が終了しているとき（処理Ｓ４００ＡのＹｅｓ）、圧縮装置１０Ａの動作は、処理Ｓ５００に移る。また、例えば、未処理の関数が存在するとき（処理Ｓ６００ＢのＮｏ）、圧縮装置１０Ａの動作は、処理Ｓ２００Ｂに戻る。そして、プログラム内の全ての関数に対する処理が終了しているとき（処理Ｓ６００ＢのＹｅｓ）、圧縮処理に関する圧縮装置１０Ａの動作は、終了する。
【０２１５】
図１９は、図１８に示したオペランド差分値抽出処理１０００Ｂの一例を示している。図１９の動作では、処理Ｓ１１００が実行される前に、処理対象の基本ブロックＢＢが選択されている。したがって、図１９の動作では、図１７に示した処理Ｓ１１２０（基本ブロックＢＢ選択）および処理Ｓ１６００（関数内の基本ブロックＢＢの処理終了判定）が省かれている。図１９のその他の動作は、図１７の動作と同様である。図１０、図１７等で説明した処理については、詳細な説明を省略する。
【０２１６】
処理Ｓ１１００、Ｓ１１３０−Ｓ１５００は、図１７に示した処理Ｓ１１００、Ｓ１１３０−Ｓ１５００と同様である。図１９の動作では、例えば、処理Ｓ１５００が実行されることにより、オペランド差分値抽出処理（図１８に示した処理Ｓ１０００Ｂ）は、終了する。
【０２１７】
図１８および図１９に示した動作では、係数レジスタに設定されるオペランド差分値を基本ブロックＢＢ毎に決定するため、オペランド差分値を関数毎に決定するときに比べて、係数レジスタ値の使用効率（オペランド差分値ｄとして使用される頻度）を向上できる。これにより、図１８および図１９に示した動作では、複数の命令ＩＳを含む命令群ＩＳＧの圧縮率を向上できる。
【０２１８】
なお、図１８および図１９に示した各処理は、図１８等に示した順序と異なる順序で実行されてもよい。例えば、図１８および図１９に示した処理は、同時に実行されることがあってもよい。
【０２１９】
以上、この実施形態においても、図１−図７で説明した実施形態と同様の効果を得ることができる。例えば、複数の命令ＩＳを含む命令群ＩＳＧ（ＶＬＩＷ命令ＩＳＧ）の圧縮率を向上できる。さらに、この実施形態では、圧縮装置１０Ａは、差分抽出部２０およびレジスタ値決定部２２を有している。例えば、差分抽出部２０は、圧縮対象のプログラムのＶＬＩＷ命令ＩＳＧの列からオペランド差分値の候補を抽出する。そして、レジスタ値決定部２２は、係数レジスタに設定されるオペランド差分値を、差分抽出部２０で抽出したオペランド差分値の候補から選択する。
【０２２０】
これにより、この実施形態では、圧縮対象のプログラムに応じたオペランド差分値を、係数レジスタに設定できる。この結果、この実施形態では、例えば、オペランド差分値が係数レジスタに圧縮対象のプログラムに拘わらず設定されるときに比べて、係数レジスタ値の使用効率を向上できる。これにより、この実施形態では、オペランド差分値が係数レジスタに圧縮対象のプログラムに拘わらず設定されるときに比べて、命令群ＩＳＧの圧縮率を向上できる。
【０２２１】
また、この実施形態では、係数レジスタに設定されるオペランド差分値を関数毎に決定することにより、オペランド差分値をプログラム毎に決定するときに比べて、係数レジスタ値の使用効率を向上できる。この場合、オペランド差分値をプログラム毎に決定するときに比べて、命令群ＩＳＧの圧縮率を向上できる。
【０２２２】
あるいは、この実施形態では、係数レジスタに設定されるオペランド差分値を基本ブロックＢＢ毎に決定することにより、オペランド差分値を関数毎に決定するときに比べて、係数レジスタ値の使用効率を向上できる。この場合、オペランド差分値を関数毎に決定するときに比べて、命令群ＩＳＧの圧縮率を向上できる。
【０２２３】
図２０は、上述した実施形態の圧縮装置１０、１０Ａで圧縮した命令群ＣＩＳＧを復元するプロセッサ１００の一例を示している。プロセッサ１００は、圧縮された命令である圧縮命令ＣＩＳを復元する。例えば、プロセッサ１００は、命令群ＣＩＳＧの各命令ＣＩＳを復元して、復元した命令ＩＳを実行する。命令群ＣＩＳＧは、例えば、ＶＬＩＷ命令ＩＳＧを圧縮装置１０、１０Ａ等で圧縮した命令群である。命令群ＣＩＳＧおよびＶＬＩＷ命令ＩＳＧのフォーマットは、例えば、図２に示したフォーマットである。
【０２２４】
プロセッサ１００は、例えば、圧縮命令群ＣＩＳＧおよび係数レジスタ値ＤＲＥＧ［１：４］を受けるデコード部１１０を有している。プロセッサ１００は、例えば、圧縮装置１０、１０Ａで圧縮された命令群ＣＩＳＧを記憶している命令メモリから、圧縮命令ＣＩＳをフェッチする。係数レジスタ値ＤＲＥＧ［１：４］は、例えば、プロセッサ１００の係数レジスタから読み出される。なお、係数レジスタ値ＤＲＥＧ［１：４］が設定される係数レジスタは、デコード部１１０内に設けられてもよい。
【０２２５】
ここで、係数レジスタ値ＤＲＥＧ［１：４］は、例えば、圧縮装置１０、１０Ａ等で設定されたオペランド差分値である。例えば、係数レジスタ値ＤＲＥＧ［１：４］は、図３に示したインデックス０−インデックス３の係数レジスタ値（オペランド差分値）に対応している。なお、係数レジスタ値ＤＲＥＧの数は、４つに限定されない。
【０２２６】
デコード部１１０は、命令ＣＩＳが非圧縮命令のとき、命令ＣＩＳ内のオペコードおよびオペランドを、命令ＩＳとして出力する。また、デコード部１１０は、命令ＣＩＳが圧縮命令のとき、命令ＣＩＳを命令ＩＳに復元して、復元した命令ＩＳを出力する。例えば、デコード部１１０は、圧縮命令ＣＩＳ内の情報（例えば、図２に示した復元情報ＩＮＦ１、ＩＮＦ２）に基づいて、参照先の命令を選択する。また、例えば、デコード部１１０は、圧縮命令ＣＩＳ内の情報（例えば、図２に示した復元情報ＩＮＦ３）に基づいて、オペランド差分値を係数レジスタ値ＤＲＥＧ［１：４］から選択する。
【０２２７】
そして、デコード部１１０は、圧縮命令ＣＩＳを参照先の命令のオペコードと同じオペコードを有する命令ＩＳに変換する。また、デコード部１１０は、参照先の命令のオペランドとオペランド差分値とに基づいて、変換した命令ＩＳのオペランドを算出する。これにより、圧縮命令ＣＩＳが命令ＩＳに復元される。
【０２２８】
例えば、デコード部１１０は、４つのスロットデコード部ＤＥＣ（ＤＥＣ１、ＤＥＣ２、ＤＥＣ３、ＤＥＣ４）とバッファＢＵＦ１とを有している。なお、スロットデコード部ＤＥＣの数は、４つに限定されない。スロットデコード部ＤＥＣ１、ＤＥＣ２、ＤＥＣ３、ＤＥＣ４は、命令群ＣＩＳＧのスロットに対応している。すなわち、スロットデコード部ＤＥＣ１、ＤＥＣ２、ＤＥＣ３、ＤＥＣ４は、ＶＬＩＷ命令ＩＳＧのスロットに対応している。
【０２２９】
スロットデコード部ＤＥＣ、命令ＣＩＳ、ＩＳ、ＰＩＳの符号の末尾の数字は、対応するスロットのスロット番号を示している。以下、スロットｉ（ｉ＝１、２、３、４）に対応するスロットデコード部ＤＥＣ、命令ＣＩＳ、ＩＳ、ＰＩＳをそれぞれスロットデコード部ＤＥＣｉ、命令ＣＩＳｉ、ＩＳｉ、ＰＩＳｉとも称する。同様に、命令ＣＩＳｉに対応する圧縮情報ＣＩＮＦを圧縮情報ＣＩＮＦ［ｉ］とも称する。
【０２３０】
デコード部１１０は、例えば、フェッチした命令群ＣＩＳＧをスロット毎に分離する。そして、デコード部１１０は、各スロットに対応する命令ＣＩＳおよび圧縮情報ＣＩＮＦを、各スロットデコード部ＤＥＣに供給する。
【０２３１】
スロットデコード部ＤＥＣｉは、例えば、スロットｉの命令ＣＩＳｉ、命令ＣＩＳｉに対応する圧縮情報ＣＩＮＦ［ｉ］、バッファＢＵＦ１に保持されている参照先命令ＰＩＳ（ＰＩＳ１、ＰＩＳ２、ＰＩＳ３、ＰＩＳ４）を受ける。さらに、スロットデコード部ＤＥＣ２−ＤＥＣ４は、先行スロットの命令ＩＳを受ける。例えば、スロットデコード部ＤＥＣ４は、命令ＩＳ１、ＩＳ２、ＩＳ３をスロットデコード部ＤＥＣ１、ＤＥＣ２、ＤＥＣ３からそれぞれ受ける。
【０２３２】
そして、スロットデコード部ＤＥＣｉは、命令ＣＩＳｉを復元し、復元した命令ＩＳｉを出力する。さらに、スロットデコード部ＤＥＣｉは、後続の命令群ＣＩＳＧの命令ＣＩＳを復元する際に参照される可能性のある参照先命令ＰＩＳｉを、バッファＢＵＦ１に出力する。バッファＢＵＦ１は、スロットデコード部ＤＥＣから受けた参照先命令ＰＩＳを保持する。例えば、バッファＢＵＦ１に保持されている命令ＩＳは、先行ＶＬＩＷ命令ＩＳＧを参照して圧縮した命令ＣＩＳを復元する際に、使用される。
【０２３３】
このように、プロセッサ１００は、例えば、命令ＣＩＳが非圧縮命令のとき、命令ＣＩＳ内のオペコードおよびオペランドに基づく処理を実行する。そして、プロセッサ１００は、非圧縮命令ＣＩＳ内の参照情報（例えば、図２に示した参照情報ＳＩＮＦ）が参照先命令を示すとき、命令ＣＩＳ内のオペコードおよびオペランドをバッファＢＵＦ１に保持する。
【０２３４】
また、プロセッサ１００は、命令ＣＩＳが圧縮命令のとき、オペコードを参照先命令ＰＩＳのオペコードにするとともに、参照先命令ＰＩＳのオペランドおよび係数レジスタ値ＤＲＥＧ［１：４］の内容に基づいてオペランドを算出する。これにより、圧縮命令ＣＩＳが圧縮前の命令ＩＳに復元される。そして、プロセッサ１００は、復元した命令ＩＳのオペコードおよびオペランドに基づく処理を実行する。さらに、プロセッサ１００は、復元した命令ＩＳのオペコードおよびオペランドをバッファＢＵＦ１に保持する。
【０２３５】
図２１は、図２０に示したスロットデコード部ＤＥＣｉの一例を示している。なお、図２１は、スロットデコード部ＤＥＣ１以外のスロットデコード部ＤＥＣｉ（ｉ＝２、３、４）の一例を示している。スロットデコード部ＤＥＣ１の構成は、例えば、同一命令群を参照する展開部ＳＤＥＣおよびセレクタＳＥＬ１がスロットデコード部ＤＥＣｉから省かれている。スロットデコード部ＤＥＣ１のその他の構成は、スロットデコード部ＤＥＣｉと同様である。なお、スロットデコード部ＤＥＣ１は、展開部ＳＤＥＣおよびセレクタＳＥＬ１を有してもよい。
【０２３６】
スロットデコード部ＤＥＣｉは、展開部ＳＤＥＣ、ＰＤＥＣ、セレクタＳＥＬ１、ＳＥＬ２、ＳＥＬ３を有している。展開部ＳＤＥＣは、例えば、命令ＣＩＳｉの同一命令群ＣＩＳＧを参照して、圧縮命令ＣＩＳｉを復元する。例えば、展開部ＳＤＥＣは、セレクタＩＳＥＬ１、ＤＳＥＬ１および命令生成部ＩＧＥＮ１を有している。
【０２３７】
セレクタＩＳＥＬ１は、先行スロットの命令ＩＳ１−ＩＳｊ（ｊ＝ｉ−１）と命令ＣＩＳｉ［２：３］とを受ける。命令ＩＳｊ（ｊ＝ｉ−１）は、ｉ番目のスロットの１つ前のスロットの命令ＩＳを示している。命令ＣＩＳｉ［２：３］は、例えば、命令ＣＩＳｉの２ビット目および３ビット目の情報である。例えば、命令ＣＩＳｉ［２：３］は、参照先命令ＩＳのスロット番号を示す情報（例えば、図２に示した復元情報ＩＮＦ２）である。
【０２３８】
セレクタＩＳＥＬ１は、命令ＣＩＳｉ［２：３］に基づいて、命令生成部ＩＧＥＮ１に出力する命令を命令ＩＳ１−ＩＳｊから選択する。例えば、セレクタＩＳＥＬ１は、命令ＩＳ１−ＩＳｊのうち、命令ＣＩＳｉ［２：３］が示すスロット番号の命令を命令生成部ＩＧＥＮ１に出力する。
【０２３９】
セレクタＤＳＥＬ１は、係数レジスタ値ＤＲＥＧ［１：４］と命令ＣＩＳｉ［４：５］とを受ける。命令ＣＩＳｉ［４：５］は、例えば、命令ＣＩＳｉの４ビット目および５ビット目の情報である。例えば、命令ＣＩＳｉ［４：５］は、圧縮命令ＣＩＳｉの復元に使用するオペランド差分値が設定される係数レジスタを示す情報（例えば、図２に示した復元情報ＩＮＦ３）である。
【０２４０】
セレクタＤＳＥＬ１は、命令ＣＩＳｉ［４：５］に基づいて、命令生成部ＩＧＥＮ１に出力するオペランド差分値を係数レジスタ値ＤＲＥＧ［１：４］から選択する。例えば、セレクタＤＳＥＬ１は、係数レジスタ値ＤＲＥＧ［１：４］のうち、命令ＣＩＳｉ［４：５］が示す係数レジスタ値（オペランド差分値）を命令生成部ＩＧＥＮ１に出力する。
【０２４１】
命令生成部ＩＧＥＮ１は、セレクタＩＳＥＬ１から受ける命令のオペコードおよびオペランドと、セレクタＤＳＥＬ１から受けるオペランド差分値とに基づいて、命令のオペコードおよびオペランドを生成する。そして、命令生成部ＩＧＥＮ１は、生成した命令をセレクタＳＥＬ１に出力する。
【０２４２】
例えば、命令生成部ＩＧＥＮ１は、セレクタＩＳＥＬ１から受けたオペランドとセレクタＤＳＥＬ１から受けたオペランド差分値とオペランドの変化パターンとに基づいて、オペランドを生成する。なお、命令生成部ＩＧＥＮ１は、例えば、図４に示した複数のパターンのうち、セレクタＩＳＥＬ１から受けたオペコードに対応するパターンを、オペランドの変化パターンとして使用する。
【０２４３】
展開部ＰＤＥＣは、例えば、命令ＣＩＳｉの先行命令群ＣＩＳＧを参照して、圧縮命令ＣＩＳｉを復元する。例えば、展開部ＰＤＥＣは、セレクタＩＳＥＬ２、ＤＳＥＬ２および命令生成部ＩＧＥＮ２を有している。セレクタＩＳＥＬ２は、参照先命令ＰＩＳ１−ＰＩＳ４と命令ＣＩＳｉ［２：３］とを受ける。参照先命令ＰＩＳ１−ＰＩＳ４は、先行命令群ＣＩＳＧの命令ＣＩＳを復元した命令ＩＳであり、バッファＢＵＦ１に保持されている。なお、参照先命令ＰＩＳ１−ＰＩＳ４は、それぞれスロット１−スロット４の命令ＩＳであるが、同じＶＬＩＷ命令ＩＳＧに含まれているとは限らない。
【０２４４】
セレクタＩＳＥＬ２は、命令ＣＩＳｉ［２：３］に基づいて、命令生成部ＩＧＥＮ１に出力する命令を命令ＰＩＳ１−ＰＩＳ４から選択する。例えば、セレクタＩＳＥＬ２は、命令ＰＩＳ１−ＰＩＳ４のうち、命令ＣＩＳｉ［２：３］が示すスロット番号の命令を命令生成部ＩＧＥＮ２に出力する。
【０２４５】
セレクタＤＳＥＬ２の動作は、セレクタＤＳＥＬ１と同様である。例えば、セレクタＤＳＥＬ２は、係数レジスタ値ＤＲＥＧ［１：４］と命令ＣＩＳｉ［４：５］を受け、命令ＣＩＳｉ［４：５］が示す係数レジスタ値（オペランド差分値）を命令生成部ＩＧＥＮ２に出力する。
【０２４６】
命令生成部ＩＧＥＮ２の動作は、命令生成部ＩＧＥＮ１と同様である。例えば、命令生成部ＩＧＥＮ２は、セレクタＩＳＥＬ２から受ける命令のオペコードおよびオペランドと、セレクタＤＳＥＬ２から受けるオペランド差分値とに基づいて、命令のオペコードおよびオペランドを生成する。そして、命令生成部ＩＧＥＮ２は、生成した命令をセレクタＳＥＬ１に出力する。
【０２４７】
セレクタＳＥＬ１は、命令生成部ＩＧＥＮ１、ＩＧＥＮ２で生成されたそれぞれの命令と、命令ＣＩＳｉ［１］とを受ける。命令ＣＩＳｉ［１］は、例えば、命令ＣＩＳｉの１ビット目の情報である。例えば、圧縮命令では、命令ＣＩＳｉ［１］は、参照先命令ＩＳが圧縮命令ＣＩＳと同じ圧縮命令群ＣＩＳＧに含まれているか否か示す情報（例えば、図２に示した復元情報ＩＮＦ１）である。
【０２４８】
例えば、“１”に設定された命令ＣＩＳｉ［１］は、参照先命令ＩＳが圧縮命令ＣＩＳと同じ圧縮命令群ＣＩＳＧに含まれていることを示している。この場合、“０”に設定された命令ＣＩＳｉ［１］は、参照先命令ＩＳが圧縮命令ＣＩＳに先行する圧縮命令群ＣＩＳＧに含まれていることを示している。
【０２４９】
したがって、セレクタＳＥＬ１は、例えば、命令ＣＩＳｉ［１］が“１”のとき、命令生成部ＩＧＥＮ１から受けた命令をセレクタＳＥＬ２に出力する。また、例えば、セレクタＳＥＬ１は、命令ＣＩＳｉ［１］が“０”のとき、命令生成部ＩＧＥＮ２から受けた命令をセレクタＳＥＬ２に出力する。このように、セレクタＳＥＬ１は、命令ＣＩＳｉ［１］に基づいて、セレクタＳＥＬ２に出力する命令を、命令生成部ＩＧＥＮ１、ＩＧＥＮ２から受けたそれぞれの命令から選択する。
【０２５０】
セレクタＳＥＬ２は、セレクタＳＥＬ１で選択された命令と、命令ＣＩＳｉと、圧縮情報ＣＩＮＦ［ｉ］とを受ける。圧縮情報ＣＩＮＦ［ｉ］は、例えば、圧縮情報ＣＩＮＦのｉビット目の情報である。例えば、圧縮情報ＣＩＮＦ［ｉ］は、圧縮情報ＣＩＮＦ［ｉ］に対応する命令ＣＩＳｉが圧縮命令か否かを示している。例えば、“１”に設定された圧縮情報ＣＩＮＦ［ｉ］は、命令ＣＩＳｉが圧縮命令であることを示している。この場合、“０”に設定された圧縮情報ＣＩＮＦ［ｉ］は、命令ＣＩＳｉが非圧縮命令であることを示している。
【０２５１】
したがって、セレクタＳＥＬ２は、例えば、圧縮情報ＣＩＮＦ［ｉ］が“１”のとき、セレクタＳＥＬ１から受けた命令（命令ＣＩＳｉを復元した命令）を、命令ＩＳｉとして出力する。また、例えば、セレクタＳＥＬ２は、圧縮情報ＣＩＮＦ［ｉ］が“０”のとき、命令ＣＩＳｉ［１］を除く命令ＣＩＳｉを、命令ＩＳｉとして出力する。命令ＣＩＳｉ［１］は、例えば、命令ＣＩＳｉの１ビット目の情報である。例えば、非圧縮命令では、命令ＣＩＳｉ［１］は、非圧縮命令ＣＩＳｉが参照先命令か否かを示す情報（例えば、図２に示した参照情報ＳＩＮＦ）である。
【０２５２】
このように、セレクタＳＥＬ２は、圧縮情報ＣＩＮＦ［ｉ］に基づいて、セレクタＳＥＬ１から受けた命令と非圧縮命令ＣＩＳｉとのいずれかを選択する。そして、プロセッサ１００は、セレクタＳＥＬ２から出力された命令ＩＳｉに基づく処理を実行する。
【０２５３】
セレクタＳＥＬ３は、セレクタＳＥＬ２で選択された命令ＩＳｉと、バッファＢＵＦ１から読み出された参照先命令ＰＩＳｉと、命令ＣＩＳｉ［１］と、圧縮情報ＣＩＮＦ［ｉ］とを受ける。そして、セレクタＳＥＬ３は、命令ＣＩＳｉ［１］および圧縮情報ＣＩＮＦ［ｉ］に基づいて、参照先命令ＰＩＳｉと命令ＩＳｉとのいずれかを選択する。
【０２５４】
例えば、非圧縮命令では、“１”に設定された非圧縮命令ＣＩＳｉ［１］は、非圧縮命令ＣＩＳｉ（命令ＩＳｉ）が参照先命令であることを示している。したがって、セレクタＳＥＬ３は、非圧縮命令ＣＩＳｉ（命令ＩＳｉ）が参照先命令のとき、セレクタＳＥＬ２から受けた命令ＩＳｉを、参照先命令ＰＩＳｉとして出力する。例えば、圧縮情報ＣＩＮＦ［ｉ］および命令ＣＩＳｉ［１］がそれぞれ“０”および“１”のとき、命令ＣＩＳｉは、非圧縮命令であり、かつ、参照先命令である。
【０２５５】
なお、非圧縮命令では、“０”に設定された非圧縮命令ＣＩＳｉ［１］は、非圧縮命令ＣＩＳｉ（命令ＩＳｉ）が非参照命令であることを示している。非参照命令ＩＳｉは、バッファＢＵＦ１に保持されない。このため、セレクタＳＥＬ３は、非圧縮命令ＣＩＳｉ（命令ＩＳｉ）が非参照命令のとき、バッファＢＵＦ１から読み出された参照先命令ＰＩＳｉを出力する。例えば、圧縮情報ＣＩＮＦ［ｉ］および命令ＣＩＳｉ［１］の両方が“０”のとき、命令ＣＩＳｉは、非圧縮命令であり、かつ、非参照命令である。
【０２５６】
また、セレクタＳＥＬ３は、命令ＣＩＳｉが圧縮命令のとき、セレクタＳＥＬ２から受けた命令ＩＳｉを、参照先命令ＰＩＳｉとして出力する。例えば、圧縮情報ＣＩＮＦ［ｉ］が“１”のとき、命令ＣＩＳｉは、命令ＣＩＳｉ［１］の値に拘わらず、圧縮命令である。
【０２５７】
セレクタＳＥＬ３から出力された参照先命令ＰＩＳｉは、バッファＢＵＦ１に保持される。これにより、バッファＢＵＦ１は、最新の参照先命令ＰＩＳに更新される。なお、スロットデコード部ＤＥＣｉの構成は、この例に限定されない。例えば、セレクタＤＳＥＬ１は、セレクタＤＳＥＬ２に兼用されてもよい。
【０２５８】
なお、プロセッサ１００は、命令ＣＩＳが圧縮されているか否かを、圧縮情報ＣＩＮＦに基づいて容易に判断できる。命令ＣＩＳが非圧縮命令ＣＩＳのときには、プロセッサ１００は、非圧縮命令ＣＩＳが参照先命令ＩＳか否かを、参照情報ＳＩＮＦに基づいて容易に判断できる。また、命令ＣＩＳが圧縮命令ＣＩＳのときには、プロセッサ１００は、参照先命令ＩＳが先行ＶＬＩＷ命令ＩＳＧに存在するか同一ＶＬＩＷ命令ＩＳＧに存在するかを、復元情報ＩＮＦ１に基づいて容易に判断できる。さらに、プロセッサ１００は、参照先命令ＩＳの位置（スロット）を、復元情報ＩＮＦ２に基づいて容易に判断できる。プロセッサ１００は、圧縮命令ＣＩＳの復元に使用するオペランド差分値を、復元情報ＩＮＦ３に基づいて容易に判断できる。
【０２５９】
図２２は、図２０に示したプロセッサ１００の変形例を示している。プロセッサ１００Ａは、例えば、パイプライン処理を実行する。例えば、プロセッサ１００Ａは、パイプラインレジスタＰＲＧ１、ＰＲＧ２、ＰＲＧ３、ＰＲＧ４により区切られる５段のパイプラインステージを有する。以下、５段のパイプラインステージを命令フェッチステージ、命令デコードステージ、命令実行ステージ、メモリアクセスステージおよびライトバックステージともそれぞれ称する。
【０２６０】
プロセッサ１００Ａは、例えば、デコード部１１０、実行部１２０、メモリアクセス部１３０、ライトバック部１４０、バッファＢＵＦ２、ＢＵＦ３、ＤＢＵＦ１、ＤＢＵＦ２およびパイプラインレジスタＰＲＧ１、ＰＲＧ２、ＰＲＧ３、ＰＲＧ４を有している。
【０２６１】
例えば、命令フェッチステージでは、プロセッサ１００Ａは、命令メモリＭＥＭから命令群ＣＩＳＧをフェッチする。なお、命令メモリＭＥＭは、例えば、圧縮装置１０、１０Ａで圧縮された命令群ＣＩＳＧを記憶している。例えば、命令メモリＭＥＭは、プログラムカウンタが示すアドレスの命令群ＣＩＳＧを、パイプラインレジスタＰＲＧ１に出力する。これにより、命令メモリＭＥＭから命令群ＣＩＳＧがフェッチされる。
【０２６２】
命令デコードステージでは、デコード部１１０は、圧縮命令群ＣＩＳＧ内の命令ＣＩＳを命令ＩＳに復元し、命令ＩＳを解読する。なお、デコード部１１０は、例えば、図２０に示したデコード部１１０と同様である。例えば、デコード部１１０は、パイプラインレジスタＰＲＧ１に保持されている命令群ＣＩＳＧを取得する。デコード部１１０は、命令群ＣＩＳＧの各命令ＣＩＳを復元した命令ＩＳ（ＩＳ１−ＩＳ４）を、パイプラインレジスタＰＲＧ２に出力する。また、デコード部１１０は、参照先命令ＰＩＳ（ＰＩＳ１−ＰＩＳ４）をパイプラインレジスタＰＲＧ２に出力する。
【０２６３】
命令実行ステージでは、実行部１２０は、デコード部１１０からパイプラインレジスタＰＲＧ２を介して転送される命令ＩＳを実行する。実行部１２０は、例えば、４つの命令ＩＳを並列に実行する。バッファＢＵＦ２は、デコード部１１０からパイプラインレジスタＰＲＧ２を介して転送される参照先命令ＰＩＳを保持する。バッファＤＢＵＦ１は、デコード部１１０からパイプラインレジスタＰＲＧ２を介して転送される係数レジスタ値ＤＲＥＧ［１：４］を保持する。
【０２６４】
メモリアクセスステージでは、メモリアクセス部１３０は、実行部１２０からパイプラインレジスタＰＲＧ３を介して転送される命令に基づいて、データメモリ等にアクセスする。メモリアクセス部１３０は、例えば、実行部１２０から転送される４つの命令にそれぞれ対応した処理を並列に実行する。バッファＢＵＦ３は、例えば、バッファＢＵＦ２からパイプラインレジスタＰＲＧ３を介して転送される参照先命令ＰＩＳを保持する。バッファＤＢＵＦ２は、例えば、バッファＤＢＵＦ１からパイプラインレジスタＰＲＧ３を介して転送される係数レジスタ値ＤＲＥＧ［１：４］を保持する。
【０２６５】
ライトバックステージでは、ライトバック部１４０は、命令ＩＳの実行結果をレジスタファイル等に格納する。これにより、命令ＩＳに基づく処理は終了する。このように、プロセッサ１００Ａでは、命令デコードステージで命令ＣＩＳの復元に利用した参照先命令ＰＩＳ１−ＰＩＳ４は、命令実行ステージおよびメモリアクセスステージでバッファＢＵＦ２、ＢＵＦ３に保持され、係数レジスタ値ＤＲＥＧ［１：４］は命令実行ステージおよびメモリアクセスステージでバッファＤＢＵＦ１、ＤＢＵＦ２に保持される。これにより、例えば、割り込みが発生して、メモリアクセスステージまでの命令がキャンセルされたときにも、キャンセルされたステージに保持されている情報（バッファＢＵＦ２、ＢＵＦ３に保持されている参照先命令ＰＩＳ１−ＰＩＳ４）を元に命令を復元できる。
【０２６６】
なお、プロセッサ１００Ａの構成は、この例に限定されない。例えば、パイプラインで実行中の全ての命令の実行が完了してから係数レジスタの値を更新するような制約を持たせることで、バッファＤＢＵＦ１、ＤＢＵＦ２を省いてもよい。係数レジスタの値を更新する際の制約は、係数レジスタ命令の動作として実現してもよいし、係数レジスタ値を設定するコードを生成するときに、パイプラインで実行中の命令の完了を待ち合わせる命令を生成することで実現してもよい。
【０２６７】
また、割り込みが発生するような状況では係数レジスタの値を変更しない等の制約を設け、バッファＤＢＵＦ１、ＤＢＵＦ２を省いてもよい。割り込みが発生しないことを保証するには、ハードウエアによる実現方法とソフトウエアによる実現方法とが考えられる。例えば、ハードウエアによる実現方法では、係数レジスタ更新命令自身がパイプライン中の命令の完了を待ち合わせる。また、ソフトウエアによる実現方法では、例えば、係数レジスタ更新命令の前に、パイプライン中の命令の完了を待ち合わせる同期命令を入れる。
【０２６８】
以上、この実施形態では、プロセッサ１００、１００Ａは、圧縮命令群ＣＩＳＧ内の命令ＣＩＳを命令ＩＳに復元するデコード部１１０を有いている。これにより、プロセッサ１００、１００Ａは、圧縮命令群ＣＩＳＧを復元した命令ＩＳに基づく処理を実行できる。また、例えば、圧縮命令群ＣＩＳＧのサイズは、元のＶＬＩＷ命令ＩＳＧのサイズに比べて小さい。このため、プロセッサ１００、１００Ａによる圧縮命令群ＣＩＳＧのフェッチ回数を削減できる。これにより、この実施形態では、プロセッサ１００、１００Ａの消費電力を削減できる。
【０２６９】
また、この実施形態では、圧縮命令群ＣＩＳＧのサイズが元のＶＬＩＷ命令ＩＳＧのサイズに比べて小さいため、命令メモリＭＥＭのサイズを削減できる。さらに、プロセッサ１００Ａでは、バッファＢＵＦ２、ＢＵＦ３に参照先命令ＰＩＳ１−ＰＩＳ４が保持されているため、割り込み等によりパイプライン処理の途中で命令がキャンセルされたときにも、キャンセルされたステージで命令を復元できる。
【０２７０】
以上の実施形態において説明した発明を整理して、付記として開示する。
（付記１）
複数の命令を含む命令群の前記命令を圧縮する圧縮装置であって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択する選択部と、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定する判定部と、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換する変換部と
を備えていることを特徴とする圧縮装置。
（付記２）
前記オペランド差分値の候補を抽出する差分抽出部と、
前記係数レジスタに設定される前記オペランド差分値を前記候補から選択するレジスタ値決定部と
を備えていることを特徴とする付記２記載の圧縮装置。
（付記３）
前記変換部は、前記参照先命令が前記処理対象命令群に含まれているか否か示す第１情報と、前記命令群内での前記参照先命令の位置を示す第２情報と、前記圧縮命令の復元に使用する前記オペランド差分値が設定される前記係数レジスタを示す第３情報とを、前記圧縮命令に含めること
を特徴とする付記１または付記２に記載の圧縮装置。
（付記４）
前記変換部は、前記命令が前記圧縮命令か否かを示す圧縮情報を前記命令群の複数の前記命令に対応させて前記命令群の先頭に付加すること
を特徴とする付記１ないし付記３のいずれか１項に記載の圧縮装置。
（付記５）
前記変換部は、前記命令が前記参照先命令か否かを示す参照情報を前記圧縮命令以外の前記命令に付加すること
を特徴とする付記１ないし付記４のいずれか１項に記載の圧縮装置。
（付記６）
前記係数レジスタに設定される前記オペランド差分値は、圧縮対象のプログラム毎に決定されること
を特徴とする付記１ないし付記５のいずれか１項に記載の圧縮装置。
（付記７）
前記係数レジスタに設定される前記オペランド差分値は、圧縮対象のプログラム内の関数毎に決定されること
を特徴とする付記１ないし付記５のいずれか１項に記載の圧縮装置。
（付記８）
前記係数レジスタに設定される前記オペランド差分値は、圧縮対象のプログラム内の関数より小さい単位の基本ブロック毎に決定されること
を特徴とする付記１ないし付記５のいずれか１項に記載の圧縮装置。
（付記９）
複数の命令を含む命令群の前記命令を圧縮する圧縮方法であって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択し、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定し、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換すること
を特徴とする圧縮方法。
（付記１０）
前記オペランド差分値の候補を抽出し、
前記係数レジスタに設定される前記オペランド差分値を前記候補から選択すること
を特徴とする付記９記載の圧縮方法。
（付記１１）
前記参照先命令が前記処理対象命令群に含まれているか否か示す第１情報と、前記命令群内での前記参照先命令の位置を示す第２情報と、前記圧縮命令の復元に使用する前記オペランド差分値が設定される前記係数レジスタを示す第３情報とを、前記圧縮命令に含めること
を特徴とする付記９または付記１０に記載の圧縮方法。
（付記１２）
前記命令が前記圧縮命令か否かを示す圧縮情報を前記命令群の複数の前記命令に対応させて前記命令群の先頭に付加すること
を特徴とする付記９ないし付記１１のいずれか１項に記載の圧縮方法。
（付記１３）
前記命令が前記参照先命令か否かを示す参照情報を前記圧縮命令以外の前記命令に付加すること
を特徴とする付記９ないし付記１２のいずれか１項に記載の圧縮方法。
（付記１４）
前記係数レジスタに設定される前記オペランド差分値を、圧縮対象のプログラム毎に決定すること
を特徴とする付記９ないし付記１３のいずれか１項に記載の圧縮方法。
（付記１５）
前記係数レジスタに設定される前記オペランド差分値を、圧縮対象のプログラム内の関数毎に決定すること
を特徴とする付記９ないし付記１３のいずれか１項に記載の圧縮方法。
（付記１６）
前記係数レジスタに設定される前記オペランド差分値を、圧縮対象のプログラム内の関数より小さい単位の基本ブロック毎に決定すること
を特徴とする付記９ないし付記１３のいずれか１項に記載の圧縮方法。
（付記１７）
複数の命令を含む命令群の前記命令を圧縮する処理を、コンピュータに実行させる圧縮プログラムであって、
前記命令群の列の中の処理対象の前記命令群である処理対象命令群から処理対象の命令を選択し、
処理の内容を示すオペコードが前記処理対象の命令のオペコードと同じであり、かつ、オペランドが係数レジスタに設定されるオペランド差分値に基づく所定の関係を前記処理対象の命令のオペランドに対して満たす命令である参照先命令が、前記処理対象命令群に先行する前記命令群である先行命令群と前記処理対象命令群とのいずれかに含まれているか否かを判定し、
前記参照先命令が前記先行命令群と前記処理対象命令群とのいずれかに含まれているとき、前記参照先命令および前記オペランド差分値に基づいて、前記処理対象の命令を圧縮命令に変換する
処理をコンピュータに実行させることを特徴とする圧縮プログラム。
（付記１８）
前記オペランド差分値の候補を抽出し、
前記係数レジスタに設定される前記オペランド差分値を前記候補から選択する
処理をコンピュータに実行させることを特徴とする付記１７記載の圧縮プログラム。
（付記１９）
圧縮された命令である圧縮命令を復元するプロセッサであって、
参照先の命令およびオペランド差分値を前記圧縮命令内の情報に基づいて選択し、前記圧縮命令を前記参照先の命令のオペコードと同じオペコードを有する命令に変換し、変換した前記命令のオペランドを前記参照先の命令のオペランドと前記オペランド差分値とに基づいて算出するデコード部を備えていること
を特徴とするプロセッサ。
（付記２０）
前記命令群内での命令の位置にそれぞれ対応して、前記参照先の命令を記憶する記憶部を備えていること
を特徴とする付記１９記載のプロセッサ。
【０２７１】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずであり、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【０２７２】
１０、１０Ａ‥圧縮装置；２０‥差分抽出部；２２‥レジスタ値決定部；３０、３０Ａ‥選択部；４０、４０Ａ‥判定部；５０、５０Ａ‥変換部；１００、１００Ａ‥プロセッサ；１２０‥実行部；１３０‥メモリアクセス部；１４０‥ライトバック部；ＢＵＦ１−ＢＵＦ３、ＤＢＵＦ１、ＤＢＵＦ２‥バッファ；ＤＥＣ１−ＤＥＣ４‥スロットデコード部；ＤＳＥＬ１、ＤＳＥＬ２、ＩＳＥＬ１、ＩＳＥＬ２、ＳＥＬ１−ＳＥＬ３‥セレクタ；ＩＧＥＮ１、ＩＧＥＮ２‥命令生成部；ＳＤＥＣ、ＰＤＥＣ‥展開部；ＰＲＧ１−ＰＲＧ４‥パイプラインレジスタ
【図１】
2014059627.tif 000003
【図２】
2014059627.tif 000004
【図３】
2014059627.tif 000005
【図４】
2014059627.tif 000006
【図５】
2014059627.tif 000007
【図６】
2014059627.tif 000008
【図７】
2014059627.tif 000009
【図８】
2014059627.tif 000010
【図９】
2014059627.tif 000011
【図１０】
2014059627.tif 000012
【図１１】
2014059627.tif 000013
【図１２】
2014059627.tif 000014
【図１３】
2014059627.tif 000015
【図１４】
2014059627.tif 000016
【図１５】
2014059627.tif 000017
【図１６】
2014059627.tif 000018
【図１７】
2014059627.tif 000019
【図１８】
2014059627.tif 000020
【図１９】
2014059627.tif 000021
【図２０】
2014059627.tif 000022
【図２１】
2014059627.tif 000023
【図２２】
2014059627.tif 000024