(57)【特許請求の範囲】
【請求項１】
命令を記憶する記憶部と、
完了した命令を計数するプログラムカウンタと、
命令を拡張する拡張情報を記憶する第一フィールドと第二フィールドとを有する命令拡張情報レジスタと、
前記命令の直後の命令の拡張情報を前記第一フィールドに書き込む１命令分の拡張情報を保持する第一前置命令と、前記命令の直後の命令の拡張情報を前記第一フィールドに書き込み、前記命令の直後２命令目の命令の拡張情報を前記第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令とをデコードするデコード部と、
前記記憶部から読み出した命令が、前記第一前置命令または前記第二前置命令である場合、前記第一前置命令または前記第二前置命令と、前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を生成するとともに、前記記憶部から読み出した複数の命令の先頭から所定命令数までに一つ以上の前記第一前置命令または前記第二前置命令が含まれている場合、前記所定命令数の次の命令まで命令実行部に出力し、前記記憶部から読み出した複数の命令の先頭から前記所定命令数の次の命令までに二つ以上の前記第一前置命令または前記第二前置命令が含まれている場合、前記所定命令数の二つ次の命令まで前記命令実行部に出力する命令結合部と、
前記命令結合部が出力した命令を実行するとともに、前記命令結合部が生成した結合済み命令をデコードして１命令として実行し、前記命令の直後２命令目の命令は他の命令と結合せずに１命令として実行する命令実行部と、
前記命令実行部が実行した結合済み命令を完了する場合、前記プログラムカウンタを２命令分更新するとともに、前記命令の直後２命令目の命令を完了した場合、前記プログラムカウンタを１命令分更新する更新部と、
を有することを特徴とする演算処理装置。
【請求項２】
前記命令結合部はさらに、
前記命令実行部が同時に実行できる命令数が偶数の場合、前記命令数の半分の命令数を前記記憶部から読み出して格納するスロットを追加して構成し、前記命令実行部が同時に実行できる命令数が奇数の場合、前記命令数の半分に０．５を加算した命令数を前記記憶部から読み出して格納するスロットを追加して構成することを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記命令実行部は、
複数の命令を同時にデコードして処理するパイプライン処理を行い、
前記演算処理装置はさらに、
前記命令結合部が生成した結合済み命令のうち、前記第一前置命令または前記第二前置命令の直後の命令を起因としてトラップ処理が発生した場合、または、前記第二前置命令の直後２命令目の命令を起因としてトラップ処理が発生した場合、前記第一前置命令または前記第二前置命令をコミットせずに前記パイプラインをフラッシュする判定部を有し、
前記命令結合部は、
前記判定部が前記パイプラインをフラッシュした場合、前記トラップ処理が発生した結合済み命令に含まれる前記第一前置命令または前記第二前置命令と直後の命令とを結合することなく、別々に前記命令実行部に出力し、
前記命令実行部は、
前記命令結合部から受け付けた前記第一前置命令または前記第二前置命令と直後の命令とを別々にそれぞれ実行し、
前記更新部は、
前記プログラムカウンタを、前記命令実行部が実行した命令数分更新することを特徴とする請求項１記載の演算処理装置。
【請求項４】
前記更新部は、
前記結合済み命令が前記命令実行部によって実行された場合、前記プログラムカウンタを２命令分更新するとともに、前記命令拡張情報レジスタの第一フィールドに記憶されている情報を初期化することを特徴とする請求項１記載の演算処理装置。
【請求項５】
前記更新部は、
前記第一前置命令が先に実行され、続いて、前記第一前置命令が保持する拡張情報に基づき拡張される命令が前記命令実行部により実行された場合、前記プログラムカウンタを１命令分ずつ更新するとともに、前記第一前置命令が実行された後に、前記命令拡張情報レジスタの第一フィールドに前記拡張情報を格納し、前記第一前置命令の直後の命令が前記第一フィールドの拡張情報を用いて実行された後に、前記命令拡張情報レジスタの第一フィールドに記憶されている情報を初期化することを特徴とする請求項１記載の演算処理装置。
【請求項６】
前記更新部は、
前記命令実行部が前記結合済み命令を実行した場合、前記プログラムカウンタを２命令分更新するとともに、前記命令拡張情報レジスタの第一フィールドに記憶された情報を初期化し、前記第二前置命令が保持する直後２命令目の命令の拡張情報を前記第二フィールドに格納することを特徴とする請求項１記載の演算処理装置。
【請求項７】
前記更新部は、
前記第二前置命令が先に実行され、続いて、前記第二前置命令が保持する拡張情報に基づき拡張される後続の２命令が前記命令実行部により実行された場合、前記プログラムカウンタを１命令分ずつ更新するとともに、前記第二前置命令が実行された後に、前記第二前置命令の直後の命令の拡張情報を前記命令拡張情報レジスタの第一フィールドに格納するとともに、前記第二前置命令の直後２命令目の命令の拡張情報を前記命令拡張情報レジスタの第二フィールドに格納し、前記第二前置命令の直後の命令が前記第一フィールドの拡張情報を用いて実行された後に前記第一フィールドを初期化し、前記第二前置命令の直後２命令目の命令が前記第二フィールドの拡張情報を用いて実行された後に前記第二フィールドを初期化することを特徴とする請求項１記載の演算処理装置。
【請求項８】
前記演算処理装置はさらに、
前記命令実行部によって命令が実行されてコミットされるまでの間、前記命令実行部によって格納された情報であって、少なくとも前記実行された命令のオペコードを含む情報を保持するコミット領域を有し、
前記コミット領域は、
前記第一フィールドを更新する情報を保持する第一領域と、前記第二フィールドを更新する第二領域とを有し、前記第二領域は、連続する二つの第一領域に対して一つ有することを特徴とする請求項１記載の演算処理装置。
【請求項９】
命令を記憶する記憶部と、完了した命令を計数するプログラムカウンタと、命令を拡張する拡張情報を記憶する第一フィールドと第二フィールドとを有する命令拡張情報レジスタとを有する演算処理装置の制御方法において、
前記命令の直後の命令の拡張情報を前記第一フィールドに書き込む１命令分の拡張情報を保持する第一前置命令と、前記命令の直後の命令の拡張情報を前記第一フィールドに書き込み、前記命令の直後２命令目の命令の拡張情報を前記第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令とを、前記演算処理装置が有するデコード部がデコードし、
前記記憶部から読み出した命令が、前記第一前置命令または前記第二前置命令である場合、前記第一前置命令または前記第二前置命令と、前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を、前記演算処理装置が有する命令結合部が生成するとともに、前記記憶部から読み出した複数の命令の先頭から所定命令数までに一つ以上の前記第一前置命令または前記第二前置命令が含まれている場合、前記命令結合部が、前記所定命令数の次の命令まで命令実行部に出力し、前記記憶部から読み出した複数の命令の先頭から前記所定命令数の次の命令までに二つ以上の前記第一前置命令または前記第二前置命令が含まれている場合、前記命令結合部が、前記所定命令数の二つ次の命令まで前記命令実行部に出力し、
前記演算処理装置が有する命令実行部が、前記命令結合部が出力した命令を実行するとともに、前記命令結合部が生成した結合済み命令をデコードして１命令として実行し、前記命令の直後２命令目の命令は他の命令と結合せずに１命令として実行し、
前記演算処理装置が有する更新部が、前記命令実行部が実行した結合済み命令を完了する場合、前記プログラムカウンタを２命令分更新するとともに、前記命令の直後２命令目の命令を完了した場合、前記プログラムカウンタを１命令分更新することを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置および制御方法に関する。
【背景技術】
【０００２】
従来より、ＣＰＵ（Central  Processing  Unit：中央演算処理装置）などのプロセッサでは、命令長を可変長にすることで命令を拡張する技術が一般的に利用されている。プロセッサには、命令の実行に使用される命令情報などを格納する複数エントリを有する実行キューがあり、１命令ごとに実行キューのエントリを割り当てる。
【０００３】
実行キューに格納できる命令数を増やす場合、実行キューが有する複数エントリから命令を選択する回路を直列に接続する必要がある。そうすると、実行キューの複数エントリから命令を選択する選択回路を多段に接続する必要があり、このように選択回路を多段に接続する場合には、プロセッサの動作周波数の１サイクルの期間内に、多段の選択回路による選択が完了しない場合がある。これはつまり、プロセッサ全体の動作周波数の低下を引き起こし、言い換えれば、プロセッサの処理性能の低下に繋がる。
【０００４】
これに対して、上記した可変長命令長を用いる手法では、プログラム全体の命令サイズが増えるが、プログラム全体の命令数自体は増えない。つまり、実行キューに格納できる命令の数を増やす必要がなく、実行キューのエントリ数は増えない。すなわち、実行キューのエントリ内に格納される命令の情報量は増えるが、選択対象となるエントリ数は増えないため、実行キューから命令を選択する回路は、並列には増えるものの、直列には増えないこととなる。従って、プロセッサの動作周波数に大きな影響を与えない。また、上記した可変長命令長を用いる手法では、命令デコーダが命令オペコードをデコードした後は、命令オペコードを使用しないため、命令オペコード自体を保持しておく必要がない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−２８４９６２号公報
【特許文献２】特開２００６−９２１５８号公報
【特許文献３】特開２００１−２９６９９９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
可変長命令を用いる手法では、命令長が固定長である命令セットアーキテクチャには直接適用することができず、プロセッサの処理性能を向上させることができないという課題があった。
【０００７】
具体的には、ＣＩＳＣ（Ｃｏｍｐｌｅｘ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）などの命令長が可変である命令セットアーキテクチャ（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ）に上記した可変長命令の手法を適用した場合は、実行キューに格納する命令数を増やすことなく、１命令の命令長を拡げることができる。したがって、命令オペコードに含まれる情報を増加させることにより、１命令当たりの処理量を増やすことができ、プロセッサの処理性能を向上させることができる。これに対して、ＲＩＳＣ（Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）などの命令長が固定長である命令セットアーキテクチャに上記した可変長命令の手法を適用すると、主記憶装置又はキャッシュメモリから命令をフェッチして実行を完了するまでの内で互換性を保つことができない。
【０００８】
開示の技術は、上記に鑑みてなされたものであって、命令長が固定長である命令セットアーキテクチャにおいても、命令の拡張を行うことが可能である演算処理装置および制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本願の開示する演算処理装置は、一つの態様において、命令を拡張する拡張情報を記憶する第一フィールドと第二フィールドとを有する命令拡張情報レジスタと、当該命令の直後の命令の拡張情報を前記第一フィールドに拡張情報を書き込む１命令分の拡張情報を保持する第一前置命令と、当該命令の直後の命令の拡張情報を前記第一フィールドに書き込み、当該命令の直後２命令目の命令の拡張情報を前記第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令とを有し、前記命令を記憶する記憶部から読み出した命令が、前記第一前置命令または前記第二前置命令である場合に、前記第一前置命令または前記第二前置命令と、前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を生成する命令結合部と、前記命令結合部によって生成された結合済み命令をデコードし、１命令として実行する命令実行部と、前記命令実行部によって実行された結合済み命令に対するコミットを行う場合に、プログラムカウンタを２命令分更新するレジスタ更新部と、を有する。
【発明の効果】
【００１０】
本願に開示する演算処理装置および制御方法の一つの態様によれば、命令長が固定長である命令セットアーキテクチャにおいても、命令の拡張を行うことが可能となるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施例１に係る演算処理装置の構成を示すブロック図である。
【図２】図２は、浮動小数点レジスタの例を示す図である。
【図３】図３は、命令拡張情報レジスタ１３の例を示す図である。
【図４】図４は、前置命令ＳＸＡＲ１の例を示す図である。
【図５】図５は、ＳＸＡＲ１による命令拡張を説明する図である。
【図６】図６は、前置命令ＳＸＡＲ２の例を示す図である。
【図７】図７は、ＳＸＡＲ２による命令拡張を説明する図である。
【図８】図８は、割り込み発生後にＳＸＡＲ１による拡張済み命令を実行する例を示す図である。
【図９】図９は、割り込み発生後にＳＸＡＲ２による拡張済み命令を実行する例を示す図である。
【図１０】図１０は、ＳＰＡＲＣ  ＪＰＳ１のＦＭＡ命令フォーマットの一例を示す図である。
【図１１】図１１は、実施例２に係る演算処理装置の構成を示すブロック図である。
【図１２】図１２は、前置命令ＳＸＡＲの結合を説明する図である。
【図１３】図１３は、前置命令ＳＸＡＲによる命令の拡張と直後の命令との結合およびスロット数を説明する図である。
【図１４】図１４は、命令が拡張されて、且つＳＸＡＲ命令と結合された命令がコミットされるまでの遷移を示す図である。
【図１５】図１５は、命令プリゼンテーション数の調整例を示す図である。
【図１６】図１６は、実施例２に係る演算処理装置における処理の流れを示すフローチャートである。
【図１７】図１７は、結合処理後にトラップ処理が発生した場合に実行する再命令フェッチ、命令プリデコード、命令デコードを説明する図である。
【図１８】図１８は、結合処理後にトラップ処理が発生した場合の処理の流れを示すフローチャートである。
【図１９】図１９は、ＳＸＡＲ１命令と結合された命令の処理の流れを示す図である。
【図２０】図２０は、ＳＸＡＲ１命令と結合されなかった命令の処理の流れを示す図である。
【図２１】図２１は、ＳＸＡＲ２命令による２命令の拡張かつ直後の命令と結合された命令の処理の流れを示す図である。
【図２２】図２２は、ＳＸＡＲ２命令による２命令の拡張かつ直後の命令と結合されなかった命令の処理の流れを示す図である。
【図２３】図２３は、推奨されるコミットスタットエントリ（バッファ３４）の構成を示す図である。
【図２４】図２４は、テンポラリＸＡＲ_Ｓ更新用バッファを説明する図である。
【図２５】図２５は、中間状態レジスタを説明する図である。
【図２６】図２６は、ＳＸＡＲ１とＳＸＡＲ２との関係を示す図である。
【発明を実施するための形態】
【００１２】
以下に、本願の開示する演算処理装置および制御方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１３】
開示する演算処理装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）などであり、特に、命令長が固定長である命令セットアーキテクチャにおいても、命令の拡張を行うことが可能である。また、開示する演算処理装置は、命令や拡張命令の実行に用いられる資源（領域）を効率的に利用することができる。そこで、実施例１では、開示する演算処理装置の構成について説明する。なお、ここで開示する前置命令には２種類あり、上記の第一前置命令をＳＸＡＲ１、上記の第二前置命令をＳＸＡＲ２とする。これらを特別に区別する必要が無い場合は、単に「ＳＸＡＲ」と記載する。
【００１４】
図１は、実施例１に係る演算処理装置の構成を示すブロック図である。図１に示すように、演算処理装置１０は、メモリ１１と、レジスタ１２と、命令拡張情報レジスタ１３と、命令結合部１４と、命令実行部１５と、レジスタ更新部１６とを有する。ここで、実施例１に係る演算処理装置１０は、ＳＰＡＲＣ（Ｓｃａｌａｂｌｅ  Ｐｒｏｃｅｓｓｏｒ  ＡＲＣｈｉｔｅｃｔｕｒｅ）等のＲＩＳＣアーキテクチャであり、固定長命令を採用したＣＰＵである。また、演算処理装置１０は、図２に示すように、例えば６４ビット幅×２５６個の浮動小数点レジスタなどを有する。なお、図２は、浮動小数点レジスタの例を示す図である。
【００１５】
メモリ１１は、例えば、データやプログラムなどを記憶する主記憶装置（メインメモリ）であり、ＣＰＵなどの演算処理装置が直接読み書きできるＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）やＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｂｅｒ）などの半導体記憶装置である。なお、ここでは主記憶装置を例にして説明したが、これに限定されるものではなく、例えば、１次キャッシュや２次キャッシュなどのキャッシュメモリであってもよい。レジスタ１２は、次に実行するべき命令が格納されているメモリ１１上のアドレスを指し示すプログラムカウンタ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）や固定小数点レジスタや浮動小数点レジスタなどである。
【００１６】
命令拡張情報レジスタ１３は、複数の命令拡張情報を記憶する数値演算拡張レジスタ（ｅＸｔｅｎｄｅｄ  Ａｒｉｔｈｍｅｔｉｃ  Ｒｅｇｉｓｔｅｒ：ＸＡＲレジスタ）である。例えば、命令拡張情報レジスタ１３は、図３に示すように、１命令目の拡張情報フィールドであるＸＡＲ＿Ｆと、２命令目の拡張情報フィールドであるＸＡＲ＿Ｓを有する２命令分の命令拡張情報を格納する例えば２８ビット幅のレジスタである。命令拡張情報レジスタ１３が有する拡張情報フィールドは、２７ビット目に１命令目の拡張情報（データ）ＸＡＲ＿Ｆ部が有効であるか否かを示す「Ｆ＿ＶＡＬ」を有する。また、命令拡張情報レジスタ１３が有する拡張情報フィールドは、２６ビット目にＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）による動作を指定する「Ｆ＿ＳＩＭＤ」フィールドを有する。「Ｆ＿ＳＩＭＤ」フィールドは、例えば、その値が１の場合に、ＳＩＭＤ動作を行う。さらに、ＦＭＡ（Ｆｕｓｅｄ  Ｍｕｌｔｉｐｌｙ  Ａｄｄ）命令で演算対象となる３つのソースオペランドとＦＭＡ命令のディスティネーション（演算結果）を格納するレジスタ指定の拡張分を有する。具体的には、ＦＭＡ演算の演算結果を格納するディスティネーションレジスタを指定する２５〜２３ビット目の「Ｆ＿ＲＤ＜７:５＞」、ソース１レジスタを指定する２２〜２０ビット目の「Ｆ＿ＲＳ１＜７:５＞」、ソース２レジスタを指定する１９〜１７ビット目の「Ｆ＿ＲＳ２＜７:５＞」、ソース３レジスタを指定する１６〜１４ビット目の「Ｆ＿ＲＳ３＜７:５＞」を有する。また命令拡張情報レジスタ１３が有する拡張情報フィールドの、１３ビット目に２命令目の拡張情報（データ）ＸＡＲ＿Ｓ部が有効であるか否かを示す「Ｓ＿ＶＡＬ」と、１２ビット目にＳＩＭＤによる動作を指定する「Ｓ＿ＳＩＭＤ」フィールドとを有する。さらに、ＦＭＡ命令で演算対象となる３つのソースオペランドとＦＭＡ命令のディスティネーション（演算結果）を格納するレジスタ指定の拡張分を有する。具体的には、ＦＭＡ演算の演算結果を格納するディスティネーションレジスタを指定する１１〜９ビット目の「Ｓ＿ＲＤ＜７:５＞」、ソース１レジスタを指定する８〜６ビット目の「Ｓ＿ＲＳ１＜７:５＞」、ソース２レジスタを指定する５〜３ビット目の「Ｓ＿ＲＳ２＜７:５＞」、ソース３レジスタを指定する２〜０ビット目の「Ｓ＿ＲＳ３＜７:５＞」を有する。なお、ＸＡＲ＿ＦおよびＸＡＲ＿Ｓは、それぞれの拡張命令のコミットに伴ってリセットされる。また、図３は、命令拡張情報レジスタ１３の例を示す図である。また、ＳＩＭＤとは、複数のデータに対する複数の演算を１つの命令で処理を行う方式をいい、Ｉｎｔｅｌ社のＭＭＸ命令等が知られている。そして、ＦＭＡ命令とは、例えば３つのオペランドａ、ｂ及びｃに対してa×ｂ＋ｃの演算を行う積和演算命令である。実施例における詳細なＦＭＡ命令の命令フォーマットについては後述する。
【００１７】
命令結合部１４は、命令を記憶するメモリ１１から読み出した命令が、命令拡張情報レジスタ１３に命令拡張情報を書き込む前置命令である場合に、前置命令とその前置命令の直後にデコードされる命令とを結合（パック）する。具体的には、まず最初に、レジスタ（プログラムカウンタ）１２により指定されたアドレスによって特定される命令をメモリ１１から読み出す。そして、命令結合部１４は、読み出した命令が命令拡張情報レジスタ１３に命令拡張情報を書き込む前置命令（ＳＸＡＲ）である場合に、前置命令と前置命令の直後にデコードされる命令とを結合し、結合した命令を後述する命令実行部１５に出力する。
【００１８】
ここで、前置命令（ＳＸＡＲ）について説明する。前置命令ＳＸＡＲは、ＸＡＲを更新する命令である。ＸＡＲが２命令までの値を保持できることに対応して、１命令分指定できる前置命令ＳＸＡＲ１と、２命令分指定できる前置命令ＳＸＡＲ２がある。前置命令ＳＸＡＲ１は、図４に示すように、他の命令と同じ３２ｂｉｔ命令長であり、１命令分の拡張情報を持つフィールドと空きフィールドとを有する。
【００１９】
具体的には、３１〜２７ビット目がＳＸＡＲ命令のデコードに用いられる５ビット幅のオペコードを表す「ＯＰＣＯＤＥ［５：０］」フィールドであり、ＳＸＡＲ命令の場合は、ＯＰＣＯＤＥ[５：０]＝５’ｂ００１１１が指定される。２６ビット目がＳＸＡＲ１命令とＳＸＡＲ２命令との切り分けを行う「ＣＯＭＢ」フィールドであり、ＳＸＡＲ１命令の場合は、ＣＯＭＢ＝１’ｂ０が指定される。２５ビット目がＳＸＡＲ１命令の直後の命令のＳＩＭＤ動作を指定する「Ｆ＿ＳＩＭＤ」フィールドである。２４〜２２ビット目はＳＸＡＲ１命令の直後の命令の演算結果を格納するディスティネーションレジスタを指定する「Ｆ＿ＲＤ＜７：５＞」フィールドである。２１〜１９ビット目はＳＸＡＲ１命令の直後の命令の演算対象であるソースオペランド１を格納するオペランドレジスタ１を指定する「Ｆ＿ＲＳ１＜７：５＞」フィールドである。１８〜１６ビット目はＳＸＡＲ１命令の直後の命令の演算対象であるソースオペランド２を格納するオペランドレジスタ２を指定する「Ｆ＿ＲＳ２＜７：５＞」フィールドである。１５〜１３ビット目は例えばＳＸＡＲ１命令の直後の命令が例えば３オペランド命令ＦＭＡ命令の演算対象である場合のソースオペランド３を格納するオペランドレジスタ３を指定する「Ｆ＿ＲＳ３＜７：５＞」フィールドである。１２〜０ビット目は、不定値（Ｄｏｎ‘ｔ  Ｃａｒｅ値）が読み出されるフィールドである。
【００２０】
このＳＸＡＲ１は、後続の１命令と組み合わせて拡張命令、つまり、図５に示すように、固定長の２つの命令で１つの拡張命令を実行することができる。具体的には、ＳＸＡＲ１命令が実行された場合、後続の固定小数点の加算命令であるＡＤＤ命令は、ＳＸＡＲ１命令によって命令拡張情報レジスタ１３に格納されたＦ＿ＳＩＭＤフィールド等の拡張情報（拡張ビット）を用いて加算が実行される。例えば、Ｆ＿ＳＩＭＤ＝１’ｂ１の場合、直後のＡＤＤ命令はＳＩＭＤのＡＤＤ命令として実行される。
【００２１】
また、前置命令ＳＸＡＲ２は、図６に示すように、ＳＸＡＲ１命令と同じ３２ｂｉｔ命令長であり、２命令分の拡張情報を持つフィールドを有する。具体的には、３１〜２７ビット目がＳＸＡＲ命令のデコードに用いられる５ビット幅のオペコードを表す「ＯＰＣＯＤＥ［５：０］」フィールドであり、ＳＸＡＲ命令の場合は、ＯＰＣＯＤＥ［５：０］＝５’ｂ００１１１が指定される。２６ビット目がＳＸＡＲ１命令とＳＸＡＲ２命令との切り分けを行う「ＣＯＭＢ」フィールドであり、ＳＸＡＲ２命令の場合は、ＣＯＭＢ＝１’ｂ１が指定される。２５ビット目がＳＸＡＲ２命令の直後の命令のＳＩＭＤ動作を指定する「Ｆ＿ＳＩＭＤ」フィールドである。２４〜２２ビット目はＳＸＡＲ２命令の直後の命令の演算結果を格納するディスティネーションレジスタを指定する「Ｆ＿ＲＤ＜７：５＞」フィールドである。２１〜１９ビット目はＳＸＡＲ２命令の直後の命令の演算対象であるソースオペランド１を格納するオペランドレジスタ１を指定する「Ｆ＿ＲＳ１＜７：５＞」フィールドである。１８〜１６ビット目はＳＸＡＲ２命令の直後の命令の演算対象であるソースオペランド２を格納するオペランドレジスタ２を指定する「Ｆ＿ＲＳ２＜７：５＞」フィールドである。１５〜１３ビット目は例えばＳＸＡＲ２命令の直後の命令が３オペランド命令ＦＭＡ命令の演算対象である場合のソースオペランド３を格納するオペランドレジスタ３を指定する「Ｆ＿ＲＳ３＜７：５＞」フィールドである。
【００２２】
１２ビット目がＳＸＡＲ２命令の２命令後の命令のＳＩＭＤ動作を指定する「Ｓ＿ＳＩＭＤ」フィールドである。１１〜９ビット目はＳＸＡＲ２命令の２命令後の命令の演算結果を格納するディスティネーションレジスタを指定する「Ｓ＿ＲＤ＜７：５＞」フィールドである。８〜６ビット目はＳＸＡＲ２命令の２命令後の命令の演算対象であるソースオペランド１を格納するオペランドレジスタ１を指定する「Ｓ＿ＲＳ１＜７：５＞」フィールドである。５〜３ビット目はＳＸＡＲ２命令の２命令後の命令の演算対象であるソースオペランド２を格納するオペランドレジスタ２を指定する「Ｓ＿ＲＳ２＜７：５＞」フィールドである。２〜０ビット目は、例えばＳＸＡＲ２命令の２命令後の命令が例えば３オペランド命令ＦＭＡ命令の演算対象である場合のソースオペランド３を格納するオペランドレジスタ３を指定する「Ｓ＿ＲＳ３＜７：５＞」フィールドである。
【００２３】
このＳＸＡＲ２は、ＳＸＡＲ２命令の直後の命令と２命令後の命令の２命令と共に組み合わせて２つの拡張命令、つまり、図７に示すように、固定長の３つの命令で２つの拡張命令を実行することができる。具体的には、ＳＸＡＲ２命令が実行された場合、ＳＸＡＲ２命令の直後の固定小数点の加算命令であるＡＤＤ命令は、ＳＸＡＲ２命令によって命令拡張情報レジスタ１３に格納されたＦ＿ＳＩＭＤフィールド等の拡張情報（拡張ビット）を用いて加算が実行される。そして、ＳＸＡＲ２命令の２命令後の固定小数点のロード命令であるＬＯＡＤ命令は、ＳＸＡＲ２命令によって命令拡張情報レジスタ１３に格納されたＳ＿ＳＩＭＤフィールド等の拡張情報（拡張ビット）を用いてロードが実行される。すなわち、Ｓ＿ＳＩＭＤ＝１’ｂ１の場合、２命令後のＬＯＡＤ命令はＳＩＭＤのＬＯＡＤ命令として実行される。
【００２４】
以上より、前置命令（ＳＸＡＲ）により指定された命令拡張情報は、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部とＸＡＲ＿Ｓ部に格納され、ＸＡＲ＿Ｆの情報で直後の命令を拡張し、ＸＡＲ＿Ｓの情報で直後２命令目を拡張することができる。このように定義することで、前置命令（ＳＸＡＲ）と直後の命令の間に仮に割り込みが入ったとしても、ＸＡＲレジスタ１３内の情報を用いて命令の拡張が可能になる。
【００２５】
例えば、図８に示すように、演算処理装置１０は、前置命令ＳＸＡＲ１を実行およびコミットすると、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部に拡張情報を格納する。その後、演算処理装置１０は、前置命令ＳＸＡＲ１直後の被拡張命令を実行する前に割り込み処理が発生した場合、命令拡張情報レジスタ１３の情報を、一旦割り込み時用の退避レジスタに格納し、同時に命令拡張情報レジスタ１３をリセットする。この退避レジスタはその後の命令実行に対し、命令拡張などの影響を与えない。その後、割り込み処理が終了して、元の処理に戻ったときに、割り込み時用の退避レジスタに格納された情報を、命令拡張情報レジスタ１３に書き戻す。したがって、演算処理装置１０は、割り込み処理が終了して戻ってきた後、前置命令ＳＸＡＲ１の拡張情報が命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部の拡張情報から参照することができるので、前置命令ＳＸＡＲ１直後の被拡張命令を正しく拡張することができる。そして、演算処理装置１０は、拡張済み命令の実行をコミットすると、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部をリセットする。なお、図８は、割り込み発生後にＳＸＡＲ１による拡張済み命令を実行する例を示す図である。
【００２６】
また、例えば、図９に示すように、演算処理装置１０は、前置命令ＳＸＡＲ２を実行およびコミットすると、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部およびＸＡＲ＿Ｓ部に拡張情報を格納する。その後、演算処理装置１０は、前置命令ＳＸＡＲ２直後の被拡張命令を実行する場合、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部の拡張情報を用いて拡張した拡張命令１を実行する。そして、演算処理装置１０は、拡張済み命令１の実行をコミットすると、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部をリセットする。その後、演算処理装置１０は、前置命令ＳＸＡＲ２直後の２命令目の被拡張命令を実行する前に、割り込み処理が発生した場合、命令拡張情報レジスタ１３の情報を、一旦割り込み時用の退避レジスタに格納し、同時に命令拡張情報レジスタ１３をリセットする。この退避レジスタはその後の命令実行に対し、命令拡張などの影響を与えない。その後、割り込み処理が終了して元の処理に戻ったときに、割り込み時用の退避レジスタに格納された情報を、命令拡張情報レジスタ１３に書き戻す。したがって、演算処理装置１０は、割り込み処理が終了して戻ってきた後、前置命令ＳＸＡＲ２の拡張情報が命令拡張情報レジスタ１３のＸＡＲ＿Ｓ部の拡張情報から参照することができる。よって、演算処理装置１０は、前置命令ＳＸＡＲ２の直後２命令目、被拡張命令２を正しく拡張することができる。そして、演算処理装置１０は、拡張済み命令２の実行をコミットすると、命令拡張情報レジスタ１３のＸＡＲ＿Ｓ部をリセットする。図９は、割り込み発生後にＳＸＡＲ２による拡張済み命令を実行する例を示す図である。なお、割り込み処理から戻ったとき、ＸＡＲ＿Ｆのバリッドが１の場合はＸＡＲ＿Ｆ部の拡張情報で命令の拡張を行い、ＸＡＲ＿Ｆのバリッドが０の場合且つＸＡＲ＿Ｓのバリッドが１の場合はＸＡＲ＿Ｓ部の拡張情報で命令の拡張を行う。またＸＡＲ＿Ｆ、ＸＡＲ＿Ｓのバリッドが両方とも０である場合は、命令の拡張は行わない。
【００２７】
そして、命令結合部１４は、読み出した命令が上述した前置命令（ＳＸＡＲ）である場合に、読み出した前置命令とその読み出した前置命令の直後にデコードされる命令とを結合し、前置命令と直後の命令を１命令にして命令実行部１５に出力する。また、命令結合部１４は、読み出した命令が上述した前置命令ではない通常の命令の場合、命令を結合することなく、読み出した命令を命令実行部１５に出力する。
【００２８】
具体的には、命令結合部１４は、ＳＸＡＲ１と直後の命令を結合して、１命令にしながら、ＳＸＡＲ１の１３ビット目から２５ビット目と、ＳＸＡＲ１の直後にデコードされる命令の３２ビットによって４５ビット幅の命令である結合拡張済み命令を作成する。例えば、ＳＸＡＲ１の直後にデコードされる命令が、図１０に示したＳＰＡＲＣ  Ｊｏｉｎｔ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＪＰＳ１）のＦＭＡ命令である場合について説明する。この場合、命令結合部１４は、図４に示したＳＸＡＲ１命令の１３〜２５ビット目と、図１０に示した３２ビット幅の命令によって、４５ビット幅の結合拡張済み命令を作成する。つまり、命令結合部１４は、「Ｆ＿ＲＳ３＜７：５＞」、「Ｆ＿ＲＳ２＜７：５＞」、「Ｆ＿ＲＳ１＜７：５＞」、「Ｆ＿ＲＤ＜７：５＞」、「Ｆ＿ＳＩＭＤ」と、３２ビット幅の命令によって、４５ビット幅の結合拡張済み命令を作成する。さらに、命令結合部１４は、作成した４５ビット幅の結合拡張済み命令に、当該命令がＳＸＡＲ１命令と直後の命令が1命令に結合した結合済み命令であることを示す１ビット幅の「パックビット」を付加する。パックビットは、例えば、１の場合に、結合済み命令であること示すとすると、ここで付加されるパックビットの値は１である。
【００２９】
図１０に示した命令フォーマットは、ＳＰＡＲＣ  ＪＰＳ１におけるＦＭＡ命令フォーマットの一例であり、３１〜３０ビット目と２４〜１９ビット目は、命令のデコードに用いられるオペコードである。このオペコードは、命令種別に対応した固定値であり、この例では、３１〜３０ビット目に１０、２４〜１９ビット目に１１０１１が格納されている。２９〜２５ビット目は、命令の演算結果を格納するディスティネーションレジスタを指定する５ビット幅の「ＲＤ」フィールドである。１８〜１４ビット目は、命令の演算対象であるソースオペランド１を格納するオペランドレジスタ１を指定する５ビット幅の「ＲＳ１」フィールドである。１３〜９ビット目は命令が３オペランド命令ＦＭＡ命令の演算対象である場合のソースオペランド３を格納するオペランドレジスタ３を指定する５ビット幅の「ＲＳ３」フィールドである。４〜０ビット目は演算対象であるソースオペランド２を格納するオペランドレジスタ２を指定する５ビット幅の「ＲＳ２」フィールドである。また、８〜７ビット目の２ビット幅の「ｖａｒ」と６〜５ビット目の２ビット幅の「ｓｉｚｅ」は、上述した「ＲＳ１」、「ＲＳ２」、「ＲＳ３」を用いた演算方法を指定するフィールドであり、計４ビットのフィールドによって、１６種類の演算方法を指定可能だが、ＳＰＡＲＣ  ＪＰＳ１においては８種類の演算方法を指定する。例えば、「ｖａｒ＝００、ｓｉｚｅ＝０１」の場合には、ＲＤ＝ＲＳ１×ＲＳ２＋ＲＳ３と演算し、「ｖａｒ＝１０、ｓｉｚｅ＝０１」の場合には、ＲＤ＝―（ＲＳ１×ＲＳ２―ＲＳ３）と演算する。
【００３０】
同様に、図１０に示したＳＰＡＲＣ  ＪＰＳ１を用いて、ＳＸＡＲ２を用いた結合例について説明する。命令結合部１４は、ＳＸＡＲ２と直後の命令を結合して、１命令にしなが、ＳＸＡＲ２の１３〜２５ビット目と、ＳＸＡＲ２の直後にデコードされる命令の３２ビットによって、４５ビット幅の結合拡張済み命令を作成する。例えば、命令実行部１５は、図４に示した「Ｆ＿ＲＳ３＜７：５＞」、「Ｆ＿ＲＳ２＜７：５＞」、「Ｆ＿ＲＳ１＜７：５＞」、「Ｆ＿ＲＤ＜７：５＞」、「Ｆ＿ＳＩＭＤ」と、図１０の３２ビット幅の命令によって、４５ビット幅の結合拡張済み命令を作成する。さらに、命令結合部１４は、作成した４５ビット幅の命令に、当該命令がＳＸＡＲ命令と直後の命令が１命令に結合した結合拡張済み命令であることを示す１ビット幅の「パックビット」を付加する。パックビットは、例えば、１の場合に、結合済み命令であること示すとすると、ここで付加されるパックビットの値は１である。
【００３１】
また、命令結合部１４は、ＳＸＡＲ２の０〜１２ビット目と、ＳＸＡＲ２の直後２命令目にデコードされる３２ビット幅の命令によって４５ビット幅に拡張する。ところが、命令結合部１４は、ＳＸＡＲ２の直後ではないので、ＳＸＡＲ２とは結合されていない非結合拡張済み命令を作成する。例えば、命令結合部１４は、図４に示した「Ｓ＿ＲＳ３＜７：５＞」、「Ｓ＿ＲＳ２＜７：５＞」、「Ｓ＿ＲＳ１＜７：５＞」、「Ｓ＿ＲＤ＜７：５＞」、「Ｓ＿ＳＩＭＤ」と、図１０の３２ビット幅の命令によって、４５ビット幅の非結合拡張済み命令を作成する。さらに、命令結合部１４は、作成した４５ビット幅の命令に、当該命令がＳＸＡＲ命令と直後の命令が結合されていない命令であることを示すために、結合拡張済み命令であることを示す１ビット幅の「パックビット」の値を０とする。
【００３２】
命令結合部１４は、命令拡張情報レジスタ１３に記憶される命令拡張情報に従って、命令拡張情報を用いて命令を拡張し、さらにはＳＸＡＲの直後の命令に関しては、ＳＸＡＲと直後の命令が１命令に結合された結合済み命令を命令実行部１５に送る。命令実行部１５はこれをデコードし、１命令として実行し、結果をレジスタ更新部１６に出力する。また、命令実行部１５は、結合されていない命令の場合には、通常通りデコードして実行し、その結果をレジスタ更新部１６に出力する。
【００３３】
例えば、命令実行部１５は、ＳＸＡＲ１と直後の３２ビット幅の命令Ａが結合されて、１命令となっている結合拡張済み命令Ａが実行対象の場合には、パックビットが１であることから、当該命令を１命令として実行する。この場合、命令実行部１５は、ＳＸＡＲ１によって指定される３ビット幅の各レジスタ指定フィールドと、５ビット幅の各レジスタ指定フィールド（「ＲＳ３」、「ＲＳ２」、「ＲＳ１」、「Ｆ＿ＲＤ」）との８ビット幅で指定される各オペランドを用いた演算を実行する。例えば、命令実行部１５は、図４に示した「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」）と、図１０に示した「ＲＳ３」、「ＲＳ２」、「ＲＳ１」とで指定される各オペランドを用いた演算を実行する。
【００３４】
そして、命令のコミットの際は、レジスタ更新部１６は、８ビット幅で指定されたレジスタ領域に演算結果を格納する。具体的には、レジスタ更新部１６は、ＳＸＡＲ１によって指定される３ビット幅のレジスタ（「Ｆ＿ＲＤ」）と、図１０に示したような命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。この際、レジスタ更新部１６は、直後の拡張される命令までがコミットするので、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部すべてのビットをリセットする。さらに、レジスタ更新部１６は、パックビットが１であることから、２命令分実行したことをレジスタ（プログラムカウンタ）１２に出力する。
【００３５】
また、命令実行部１５は、ＳＸＡＲ２と直後の３２ビット幅の命令Ａが結合されて、１命令となっている結合拡張済み命令Ａが実行対象の場合には、パックビットが１であることから、上述した場合と同様、当該命令を１命令として実行する。この命令がコミットされた際、レジスタ更新部１６は、ＳＸＡＲ２によって指定される３ビット幅のレジスタ（「Ｆ＿ＲＤ」）と、図１０に示した命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。またレジスタ更新部１６は、直後の拡張される命令までがコミットされるので、命令拡張情報レジスタ１３のＸＡＲ＿Ｆ部ですべてのビットをリセットする。また命令拡張情報レジスタ１３のＸＡＲ＿Ｓ部に関しては「Ｓ＿ＶＡＬ」を「１」にして、ＳＸＡＲ２により指定される拡張情報である１２〜０ビット目をＸＡＲ＿Ｓ部に格納する。例えば、レジスタ更新部１６は、図４に示した「Ｓ＿ＳＩＭＤ」、「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」、「Ｓ＿ＲＤ」をＸＡＲ＿Ｓ部に格納する。さらに、レジスタ更新部１６は、パックビットが１であることから、２命令分実行したことをレジスタ（プログラムカウンタ）１２に出力する。
【００３６】
また、命令実行部１５は、ＳＸＡＲ２とその直後２命令目の３２ビット幅の命令Ｂについては、パックビットが０であり、拡張はされるがＳＸＡＲ２とは１命令に結合されていない非結合拡張済み命令Ｂが実行対象となる。この場合、命令実行部１５は、ＳＸＡＲ２によって指定される３ビット幅の各レジスタ指定フィールドと、図１０に示したような命令によって指定される５ビット幅の各レジスタ指定フィールドとの８ビット幅で指定される各オペランドを用いた演算を実行する。例えば、命令実行部１５は、図４に示した「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」と、図１０に示した「ＲＳ３」、「ＲＳ２」、「ＲＳ１」との８ビット幅で指定される各オペランドを用いた演算を実行する。
【００３７】
そして、命令のコミットの際は、レジスタ更新部１６は、８ビット幅で指定されたレジスタ領域に演算結果を格納する。具体的には、レジスタ更新部１６は、ＳＸＡＲ２によって指定される３ビット幅のレジスタ（「Ｓ＿ＲＤ」）と、図１０に示した命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。この際、レジスタ更新部１６は、直後の拡張される命令までがコミットされるので、命令拡張情報レジスタ１３のＸＡＲ＿Ｓ部すべてのビットをリセットする。また、レジスタ更新部１６は、パックフラグが０であることから、１命令分実行したことをプログラムカウンタ１２に出力する。
【００３８】
レジスタ更新部１６は、命令結合部１４でＳＸＡＲと直後の命令の２つが１つに結合された結合済み命令を命令実行部１５が実行し、実行した命令の完了であるコミットを行う場合に、プログラムカウンタを２命令分更新する。具体的には、レジスタ更新部１６は、命令実行部１５から結合済み命令が実行されたことが通知されると、１命令として実行したにも関わらず、レジスタ（プログラムカウンタ）１２を２命令分更新する。すなわち、現在の命令を指定するプログラムカウンタの値をＰＣとした場合、１命令分としてＰＣ＋４ではなく、２命令分としてＰＣ＋８にプログラムカウンタの値を更新する。また、レジスタ更新部１６は、命令実行部１５からＳＸＡＲと直後の命令の２つが１つに結合されたものではない命令が実行されたことが通知されると、レジスタ（プログラムカウンタ）１２を１命令分更新する。
【００３９】
このように、命令実行部１５やレジスタ更新部１６は、ＳＸＡＲと直後の命令の２つが１つに結合された結合命令に対しても、２命令分の実行スロット、実行回路、一時領域などの実行資源を用いることがない。つまり、命令実行部１５やレジスタ更新部１６は、結合されていない命令と同様に、１命令分の実行資源のみを用いて実行する。
【００４０】
このように、実施例１によれば、命令長が固定長である命令セットアーキテクチャにおいても、命令の拡張を行うことが可能である。具体的には、一般的な命令フォーマットに含まれる各レジスタを指定する５ビット幅以外に、当該各レジスタの指定を３ビット拡張するフィールドを有する命令拡張情報レジスタ１３を設けて各レジスタについて８ビットの指定を可能とすることで、２５６個のレジスタ指定を可能としている。
【００４１】
例えば、図１０に示した命令フォーマットでは、５ビット幅の各レジスタ指定フィールドである「ＲＳ３」、「ＲＳ２」、「ＲＳ１」、「ＲＤ」によって、３２個のレジスタを指定している。これに対して、開示する演算処理装置では、上記５ビット幅の各レジスタ指定フィールドに加え、ＳＸＡＲの３ビット幅の各レジスタ指定フィールドを用いることで、８ビット幅の各レジスタフィールドを利用できる。したがって、開示する演算処理装置では、２５６個のレジスタ指定を可能としている。なお、ＳＸＡＲの３ビット幅の各レジスタ指定フィールドとは、「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」、「Ｓ＿ＲＤ」、「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」、「Ｓ＿ＲＤ」のことである。また、実施例１によれば、上述した拡張手法を用いた場合でも、前置命令と拡張命令を結合し、１命令分の資源で実行することができる。その結果、命令や拡張命令の実行に用いられる資源（領域）を効率的に利用することもできる。
【実施例２】
【００４２】
ところで、開示する演算処理装置は、実施例１で説明した構成以外の他の様々な機能部を有していてもよい。そこで、実施例２では、実施例１で説明した構成以外の他の様々な機能部を有する演算処理装置について説明する。なお、ＳＸＡＲ１とＳＸＡＲ２とを特別に区別する必要が無い場合は、単にＳＸＡＲと記載する。
【００４３】
［演算処理装置の構成］
まず、図１１を用いて、実施例２に係る演算処理装置の構成について説明する。図１１は、実施例２に係る演算処理装置の構成を示すブロック図である。
【００４４】
図１１に示すように、演算処理装置２０は、メモリ２１と、２次キャッシュ２２と、命令キャッシュ２３と、データキャッシュ２４と、レジスタ２５と、ＸＡＲ２６とを有する。さらに、演算処理装置２０は、命令バッファ部３０と、命令プリデコード部３１と、命令レコード部３２と、実行処理部３３と、バッファ３４と、命令コミット判定部３５とを有する。
【００４５】
メモリ２１は、データやプログラムなどを記憶する主記憶装置であり、ＣＰＵなどの演算処理装置が直接読み書きできるＲＡＭやＲＯＭなどの半導体記憶装置（メインメモリ）である。２次キャッシュ２２は、メモリ２１に記憶される比較的利用頻度の高いデータや命令を記憶するキャッシュメモリであって、メモリ２１より高速なアクセスを可能とするキャッシュメモリである。
【００４６】
命令キャッシュ２３は、メモリ２１に記憶される比較的利用頻度の高いデータのうち、特に命令を記憶するキャッシュメモリであって、メモリ２１よりも２次キャッシュ２２よりも高速なアクセスを可能とするキャッシュメモリである。
【００４７】
データキャッシュ２４は、メモリ２１に記憶される比較的利用頻度の高いデータのうち、特に命令以外のデータを記憶するキャッシュメモリであって、メモリ２１よりも２次キャッシュ２２よりも高速なアクセスを可能とするキャッシュメモリである。レジスタ２５は、次に実行するべき命令が格納されているメモリ１１上のアドレスを指し示すプログラムカウンタや、固定小数点レジスタや浮動小数点レジスタなどからなる。
【００４８】
ＸＡＲ２６は、複数の命令拡張情報を記憶する数値演算拡張レジスタである。具体的には、ＸＡＲ２６は、１命令目の拡張情報フィールドであるＸＡＲ＿Ｆと、２命令目の拡張情報フィールドであるＸＡＲ＿Ｓとのフィールドを有する２命令分の命令拡張情報を格納することができるレジスタである。
【００４９】
ＸＡＲ２６は、例えば、図３に示すように、１命令目の拡張情報フィールドであるＸＡＲ＿Ｆと、２命令目の拡張情報フィールドであるＸＡＲ＿Ｓを有する２命令分の命令拡張情報を格納する例えば２８ビット幅のレジスタである。命令拡張情報レジスタ１３が有する拡張情報フィールドは、２７ビット目に１命令目の拡張情報（データ）ＸＡＲ＿Ｆ部が有効であるか否かを示す「Ｆ＿ＶＡＬ」と、２６ビット目にＳＩＭＤによる動作を指定する「Ｆ＿ＳＩＭＤ」フィールドとを有する。「Ｆ＿ＳＩＭＤ」フィールドは、例えば、その値が１の場合に、ＳＩＭＤ動作を行う。さらに、ＦＭＡ命令で演算対象となる３つのソースオペランドとＦＭＡ命令のディスティネーション（演算結果）を格納するレジスタ指定の拡張分を有する。具体的には、ＦＭＡ演算の演算結果を格納するディスティネーションレジスタを指定する２５〜２３ビット目の「Ｆ＿ＲＤ＜７:５＞」、ソース１レジスタを指定する２２〜２０ビット目の「Ｆ＿ＲＳ１＜７:５＞」、ソース２レジスタを指定する１９〜１７ビット目の「Ｆ＿ＲＳ２＜７:５＞」、ソース３レジスタを指定する１６〜１４ビット目の「Ｆ＿ＲＳ３＜７:５＞」を有する。なお、ＸＡＲ＿ＦおよびＸＡＲ＿Ｓは、それぞれの拡張命令のコミットに伴ってリセットされる。また、命令拡張情報レジスタ１３が有する拡張情報フィールドの、１３ビット目に２命令目の拡張情報（データ）ＸＡＲ＿Ｓ部が有効であるか否かを示す「Ｓ＿ＶＡＬ」と、１２ビット目にＳＩＭＤによる動作を指定する「Ｓ＿ＳＩＭＤ」フィールドとを有する。さらに、ＦＭＡ命令で演算対象となる３つのソースオペランドとＦＭＡ命令のディスティネーション（演算結果）を格納するレジスタ指定の拡張分を有する。具体的には、ＦＭＡ演算の演算結果を格納するディスティネーションレジスタを指定する１１〜９ビット目の「Ｓ＿ＲＤ＜７:５＞」を有する。さらに、ソース１レジスタを指定する８〜６ビット目の「Ｓ＿ＲＳ１＜７:５＞」、ソース２レジスタを指定する５〜３ビット目の「Ｓ＿ＲＳ２＜７:５＞」、ソース３レジスタを指定する２〜０ビット目の「Ｓ＿ＲＳ３＜７:５＞」を有する。
【００５０】
命令バッファ部３０は、一時領域であるバッファを有し、命令キャッシュ２３などの記憶部から読み出した命令を実行するまで一旦格納する処理部である。具体的には、命令バッファ部３０は、レジスタ２５に含まれるプログラムカウンタにより指定された命令を命令キャッシュ２３から読み出して格納する。また、命令バッファ部３０は、レジスタ２５により指定された命令が命令キャッシュ２３でキャッシュヒットしなかった場合には、２次キャッシュ２２から読み出して格納する。また、命令バッファ部３０は、レジスタ２５により指定された命令が２次キャッシュ２２でキャッシュヒットしなかった場合には、メモリ２１から読み出して格納する。
【００５１】
命令プリデコード部３１は、命令キャッシュ２３などの記憶部から読み出された命令が、ＸＡＲ２６に命令拡張情報を書き込む前置命令である場合に、前置命令と前置命令の直後にデコードされる命令とを１命令に結合する。具体的に、ＳＸＡＲ１の直後にデコードされる命令がＳＰＡＲＣ  ＪＰＳ１のＦＭＡ命令である場合について説明する。命令プリデコード部３１は、ＳＸＡＲ１命令の１３〜２５ビット目の拡張情報と、後続の３２ビット幅の命令によって、４５ビット幅の結合拡張済み命令を作成する。例えば、命令プリデコード部３１は、図４に示した「Ｆ＿ＲＳ３＜７：５＞」、「Ｆ＿ＲＳ２＜７：５＞」、「Ｆ＿ＲＳ１＜７：５＞」、「Ｆ＿ＲＤ＜７：５＞」、「Ｆ＿ＳＩＭＤ」と、図１０のＦＭＡ命令によって４５ビット幅の結合拡張済み命令を作成する。さらに、命令プリデコード部３１は、作成した４５ビット幅の結合拡張済み命令に、当該命令がＳＸＡＲと直後の命令が1命令に結合された命令あることを示す１ビット幅の「パックビット＝１」を付加する。
【００５２】
次にＳＸＡＲ２の場合について説明する。命令プリデコード部３１は、ＳＸＡＲ２と直後の命令を結合して、１つの命令にしながら、ＳＸＡＲ２命令の１３〜２５ビット目の拡張情報と、後続の３２ビット幅の命令によって、４５ビット幅の結合拡張済み命令を作成する。例えば、命令プリデコード部３１は、図４に示した「Ｆ＿ＲＳ３＜７：５＞」、「Ｆ＿ＲＳ２＜７：５＞」、「Ｆ＿ＲＳ１＜７：５＞」、「Ｆ＿ＲＤ＜７：５＞」、「Ｆ＿ＳＩＭＤ」と、図１０の命令とを結合した４５ビット幅の結合拡張済み命令を作成する。さらに、命令プリデコード部３１は、作成した４５ビット幅の結合拡張済み命令に、当該命令がＳＸＡＲ命令と直後の命令が１命令に結合された命令あることを示す１ビット幅の「パックビット＝１」を付加する。
【００５３】
また、命令プリデコード部３１は、ＳＸＡＲ２命令の０〜１２ビット目の拡張情報と、後続２命令目の３２ビット幅の命令によって、４５ビット幅の非結合拡張済み命令を作成する。例えば、命令プリデコード部３１は、図４に示した「Ｓ＿ＲＳ３＜７：５＞」、「Ｓ＿ＲＳ２＜７：５＞」、「Ｓ＿ＲＳ１＜７：５＞」、「Ｓ＿ＲＤ＜７：５＞」、「Ｓ＿ＳＩＭＤ」と、図１０の命令とを結合した４５ビット幅の非結合拡張済み命令を作成する。さらに、命令プリデコード部３１は、作成した４５ビット幅の非結合拡張済み命令に、当該命令がＳＸＡＲ命令と直後の命令が結合されていない命令であることを示すために、１ビット幅の「パックビット」の値を０とする。
【００５４】
そして、命令プリデコード部３１は、前置命令（ＳＸＡＲ１やＳＸＡＲ２）や拡張される命令などの固定命令長の命令オペコードを格納できる命令プリデコードスロットを有する。命令デコード部３１とそれ以降のステージは、結合された実効的な命令に対して、実行資源を割り当てる。したがって、図１２に示すように、命令プリデコードステージまでは、前置命令ＳＸＡＲが単独で存在することになるが、命令デコード以降のステージでは、前置命令ＳＸＡＲは結合されているため、単独では存在しない。そのため、前置命令は、コミットスタックエントリや同時命令コミット数を消費しないようになり、命令実行資源の増加を抑えることができる。また、命令プリデコード部３１は、結合させた命令に対しては、結合したことを示すパックフラグを生成し、命令デコード部３２のスロットに結合したことを示すフラグを通知、これをコミットスタックエントリにも格納する。なお、図１２は、前置命令ＳＸＡＲの結合を説明する図である。
【００５５】
命令デコード部３２は、命令プリデコード部３１によってＳＸＡＲと結合された結合済み命令を１命令としてデコードする。具体的には、命令デコード部３２は、命令プリデコード部３１から受け付けた結合拡張済み命令「４５ビット＋（パックフラグ＝１）」をデコードし、実行処理部３３やコミックスタックエントリ３４ｂなどに出力する。命令デコード部３２は、命令プリデコード部３１から受け付けた結合されていない拡張される非結合拡張済み命令「４５ビット＋（パックフラグ＝０）」をデコードし、実行処理部３３やコミックスタックエントリ３４ｂなどに出力する。
【００５６】
また、命令デコード部３２の命令スロット数は、ＳＸＡＲ命令が直後の命令と結合されていることから、命令プリデコード部のスロット数よりも少なくてよい。ここで、最大２命令分の拡張が可能なＳＸＡＲ２命令をコンパイラが使用することを前提にして説明する。この場合、命令デコード部３２の実効的な数（前置命令ＳＸＡＲを０としたときの数）をＮとした場合、Ｎが偶数であれば、命令プリデコード部３１の命令スロット数は（Ｎ／２）追加して、合計（３Ｎ／２）であり、Ｎが奇数であれば（Ｎ／２＋０．５）追加して、合計（３Ｎ／２＋０．５）を用意すればよい。例えば、図１０に示すように、Ｎ＝４の場合、命令デコード部３２のスロット４つに対して、命令プリデコード部３１のスロットは６つとなる。なお、図１３は、前置命令ＳＸＡＲによる命令の拡張と直後の命令との結合およびスロット数を説明する図である。
【００５７】
実行処理部３３は、命令デコード部３２によってデコードされた命令を実行する。具体的には、実行処理部３３は、デコードされた命令が結合拡張済み命令「４５ビット＋（パックフラグ＝１）」である場合には、結合された１命令として命令を実行してデータキャッシュ２４やレジスタ２５を参照し、その結果を接続される他の機能部に出力する。また、実行処理部３３は、デコードされた命令が結合されていない通常の命令の場合には、通常通り実行してデータキャッシュ２４やレジスタ２５を参照し、その結果を接続される他の機能部に出力する。
【００５８】
例えば、実行処理部３３は、ＳＸＡＲ１によって指定される３ビット幅の各レジスタ指定フィールドと、後続の命令の５ビット幅の各レジスタ指定フィールドとの８ビット幅で指定される各オペランドを用いた演算を実行する。例えば、実行処理部３３は、図４に示した「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」）と、図１０に示した「ＲＳ３」、「ＲＳ２」、「ＲＳ１」との８ビット幅で指定される各オペランドを用いた演算を実行する。そして、命令コミットの際に、命令コミット判定部３５は、８ビット幅で指定されたレジスタ領域に演算結果を格納する。具体的には、命令コミット判定部３５は、ＳＸＡＲ１によって指定される３ビット幅のレジスタ（「Ｆ＿ＲＤ」）と、図１０に示したような命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。この際、実行処理部３３は、２つの命令が１つの命令として結合された結合拡張済み命令に対して、２命令分の実行資源を用いることなく、結合されていない命令と同様に、１命令分の実行資源のみを用いて実行する。また、命令コミットの際に、命令コミット判定部３５は、拡張命令をコミットするので、ＸＡＲ２６のＸＡＲ＿Ｆ部すべてのビットをリセットする。さらに、命令コミット判定部３５は、パックビットが１であることから、２命令分実行したことをレジスタ２５に出力する。
【００５９】
また、実行処理部３３は、ＳＸＡＲ２によって指定される３ビット幅の各レジスタ指定フィールドと、後続の命令の５ビット幅の各レジスタ指定フィールドとの８ビット幅で指定される各オペランドを用いた演算を実行する。例えば、実行処理部３３は、図４に示した「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」と、図１０に示した「ＲＳ３」、「ＲＳ２」、「ＲＳ１」との８ビット幅で指定される各オペランドを用いた演算を実行する。そして、命令コミットの際に、命令コミット判定部３５は、８ビット幅で指定されたレジスタ領域に演算結果を格納する。具体的には、命令コミット判定部３５は、ＳＸＡＲ２によって指定される３ビット幅のレジスタ（「Ｆ＿ＲＤ」）と、図１０に示したような命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。また、命令コミットの際に、命令コミット判定部３５は、拡張命令をコミットするので、ＸＡＲ２６のＸＡＲ＿Ｆ部すべてのビットをリセットする。また、ＸＡＲ２６のＸＡＲ＿Ｓ部に関しては、「Ｓ＿ＶＡＬ」を「１」にして、ＳＸＡＲ２により指定される拡張情報である１２〜０ビット目が格納される。さらに、命令コミット判定部３５は、パックビットが１であることから、２命令分実行したことをレジスタ２５に出力する。
【００６０】
また、実行処理部３３は、ＳＸＡＲ２によって指定される３ビット幅の各レジスタ指定フィールドと、後続２命令目の命令によって指定される５ビット幅の各レジスタ指定フィールドとの８ビット幅で指定される各オペランドを用いた演算を実行する。例えば、実行処理部３３は、図４に示した「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」と、図１０に示した「ＲＳ３」、「ＲＳ２」、「ＲＳ１」との８ビット幅で指定される各オペランドを用いた演算を実行する。そして、命令コミットの際に、命令コミット判定部３５は、８ビット幅で指定されたレジスタ領域に演算結果を格納する。具体的には、命令コミット判定部３５は、ＳＸＡＲ２によって指定される３ビット幅のレジスタ（「Ｓ＿ＲＤ」）と、図１０に示したような命令によって指定される５ビット幅のレジスタ（ＲＤ）との計８ビット幅で指定されたレジスタ領域に演算結果を格納する。また、命令コミットの際に，命令コミット判定部３５は、拡張命令をコミットするので、ＸＡＲ２６のＸＡＲ＿Ｓ部すべてのビットをリセットする。
【００６１】
バッファ３４は、ＸＡＲ更新用バッファ３４ａとコミットスタックエントリ３４ｂとを有し、ＸＡＲ２６を更新する情報や実行された命令のコミット（完了）に用いられる情報を一時的に保持する。なお、ここでは、ＸＡＲ更新用バッファ３４ａとコミットスタックエントリ３４ｂとが別の領域として図示しているが、これに限定されるものではなく、フィールドを設けることで一つの領域（バッファ）として構成することもできる。
【００６２】
ＸＡＲ更新用バッファ３４ａは、前置命令ＳＸＡＲ１が実行された場合に、ＸＡＲ２６の更新に用いられる情報を保持する。具体的には、前置命令ＳＸＡＲは、拡張される後続の命令との間に割り込み等が入った場合、割り込み処理終了後には前置命令の情報（拡張情報）をＸＡＲ２６に格納し、これを参照することで、命令を正しく拡張することができる。そこで、ＸＡＲ更新用バッファ３４ａは、前置命令がデコードされ、コミットされるまでＸＡＲ２６に書き込む情報（ＳＸＡＲの拡張情報）を保持するのに用いられる。
【００６３】
コミットスタックエントリ３４ｂは、命令コミットに必要な情報を一時的に保持する。具体的には、コミットスタックエントリ３４ｂは、実行結果などの情報を一時的に保持する。つまり、コミットスタックエントリ３４ｂは、コミット処理が実行されて、ＸＡＲ２６やレジスタ２５が更新されるまでの間、実行結果や拡張情報等を一時的に保持する。
【００６４】
命令コミット判定部３５は、コミットスタックエントリ３４ｂ内の先頭の命令からコミット可能か否かを判定してコミット処理を実行する。具体的には、命令コミット判定部３５は、コミットスタックエントリ３４ｂからコミット候補の命令を選択し、コミット可能かを判定する。例えば、命令コミット判定部３５は、ＳＸＡＲ命令によるＸＡＲ２６やデータキャッシュ２４の更新、拡張された命令の資源更新を行う。この際、コミット候補のパックビットが１の場合、命令コミット判定部３５は、現在の命令を指定するレジスタ２５の値をＰＣとした場合、１命令分としてＰＣ＋４ではなく、２命令分としてＰＣ＋８にレジスタ２５の値を更新する。コミット候補のパックビットが０の場合、命令コミット判定部３５は、現在の命令を指定するレジスタ２５の値をＰＣとした場合、１命令分のＰＣ＋４にレジスタ２５の値に更新する。
【００６５】
ここで、命令プリデコード部３１〜命令デコード部３２〜コミットスタックエントリ３４ｂ〜命令コミット判定部３５までの結合拡張済み命令Ａの遷移について説明する。図１４に示すように、命令プリデコード部３１は、ＳＸＡＲ（Ａ）と命令Ａとを結合して、１つの命令として命令デコード部３２に出力する。命令デコード部３２では、入力された命令が結合された結合拡張済み命令Ａである場合に、結合されたことを示す情報として、例えば「パックビット＝１」を、コミットスタックエントリ３４ｂや実行処理部３５に出力する。その後、コミットスタックエントリ３４ｂでは、実行処理部３５に実行に伴って、結合拡張済み命令Ａのコミットに必要な情報と拡張されたことを示すパックビットとを対応付けて保持する。命令コミット判定部３５では、結合拡張済み命令のコミットに伴って、２命令分としてＰＣ＋８にレジスタ２５の値を更新する。なお、図１４は、命令が拡張されて、且つＳＸＡＲ命令と結合された命令がコミットされるまでの遷移を示す図である。
【００６６】
ところで、命令プリデコード部３１では、次の命令デコード部３２よりも命令スロット数が多いため、命令プリデコード部３１から次の命令デコード部３２遷移できない命令が一部残ってしまうことも考えられる。そのため、命令プリデコード部３１では、スロットの命令の残り状況を見ながら、次の命令プリゼンテーションを行う必要がある。また、プリゼンテーションできる空きスロットの位置なども制御する必要が発生し、複雑化してしまう。これを避けるために、命令プリデコード部３１では、次の命令デコード部３２にすべて同時遷移できる制御を行う。
【００６７】
具体的には、命令プリデコード部３１は、そのステージにおける命令拡張に用いられるＳＸＡＲ命令がいくつ含まれるかを見て、命令プリゼンテーション数を調整する。命令プリデコード部３１は、命令バッファ３０から選ばれた先頭からＮ命令の中にＳＸＡＲ命令が１つ以上含まれている場合に、（Ｎ＋１）番目の命令も命令デコード部３２に送る。そして、命令プリデコード部３１は、先頭から（Ｎ＋１）命令の中にＳＸＡＲ命令が２つ以上含まれている場合に、（Ｎ＋２）番目の命令も命令デコード部３２に送る。このようにすることで、もし仮にＳＸＡＲ命令が上記範囲に含まれていなければ、命令プリデコード部３１のスロットをすべて埋めることなく命令プリゼンテーションが行われる。命令プリデコード部３１では、命令プリゼンテーションされた命令を常にＮ個以内の実効命令にパック（結合）しながら、必ずすべての命令を同時に次の命令デコード部３２に遷移させることが可能になる。
【００６８】
例えば、Ｎ＝４である場合の例を図１５に示す。図１５では、命令プリデコード部３１は、ＳＸＡＲ命令（ＳＸＡＲ１およびＳＸＡＲ２）が命令バッファ部３０から選ばれた先頭から４命令の中に１つ以上含まれている場合に、５番目の命令も命令デコード部３２に送る。また、命令プリデコード部３１は、先頭から５命令の中にＳＸＡＲ命令が２つ以上含まれている場合に、６番目の命令も命令デコード部３２に送る。このようにすることで、もし仮にＳＸＡＲ命令が上記範囲に含まれていなければ、命令プリデコード部３２のスロットがすべて埋めることなく命令プリゼンテーションが行われる。命令プリデコード部３１では、命令プリゼンテーションされた命令を常に４個以内の実効命令にパックしながら、必ずすべての命令を同時に次の命令デコード部３２に遷移させることが可能になる。ただし前提として、コンパイラは、連続する２命令の命令拡張を行う際には、ＳＸＡＲ２を使用することが推奨される。なお、図１５は、命令プリゼンテーション数の調整例を示す図である。
【００６９】
［演算処理装置による処理］
次に、実施例２に係る演算処理装置の処理の流れを説明する。図１６は、実施例２に係る演算処理装置における処理の流れを示すフローチャートである。なお、ＳＸＡＲ１とＳＸＡＲ２とを特別に区別する必要が無い場合は、単に「ＳＸＡＲ」と記載する。
【００７０】
図１６に示すように、演算処理装置２０の命令バッファ部３０は、レジスタ２５により指定された命令を命令キャッシュ２３から読み出して格納する（ステップＳ１０１ＹＥＳ）。そして、命令プリデコード部３１は、読み出された命令が前置命令ＳＸＡＲであるか否かを判定する（ステップＳ１０２）。
【００７１】
命令プリデコード部３１は、読み出された命令が前置命令ＳＸＡＲである場合（ステップＳ１０２ＹＥＳ）、ＳＸＡＲと後続の命令とを結合して、１つの命令とした結合拡張済み命令を生成する（ステップＳ１０３）。続いて、命令デコード部３２は、結合された結合拡張済み命令をデコードするとともに、結合拡張済み命令あることを示すフラグを付加した後、実行処理部３３が結合拡張済み命令を１命令として実行する（ステップＳ１０４）。
【００７２】
その後、命令コミット判定部３５は、実行された結合拡張済み命令をコミット可能と判定すると、ＸＡＲ２６をリセットするとともに、２命令としてレジスタ２５を更新する（ステップＳ１０５）。
【００７３】
ステップＳ１０２に戻り、命令プリデコード部３１は、読み出された命令がＳＸＡＲ命令でない命令の場合（ステップＳ１０２ＮＯ）、２つの命令の結合などを行うことなく、命令デコード部３２に出力する。命令デコード部３２は、入力された命令をデコードし、実行処理部３３は、デコードされた命令を実行する（ステップＳ１０６）。その後、命令コミット判定部３５は、実行された通常命令をコミット可能と判定すると、１命令としてレジスタ２５を更新する（ステップＳ１０７）。
【００７４】
そして、演算処理装置２０は、処理やプログラムが続く場合には（ステップＳ１０８ＮＯ）、ステップＳ１０１に戻って、以降の処理を繰り返して実行し、続かない場合には（ステップＳ１０８ＹＥＳ）、処理を終了する。
【００７５】
［実施例２による効果］
このように、実施例２によれば、命令長が固定長である命令セットアーキテクチャにおいても、命令の拡張を行うことが可能である。また、実施例２によれば、上述した拡張手法を用いた場合でも、前置命令と拡張命令を結合し、１命令分の資源で実行することができる。その結果、命令や拡張命令の実行に用いられる資源（領域）を効率的に利用することもできる。
【実施例３】
【００７６】
ところで、命令プリデコード部３１でパック処理（結合処理）をしたものの、ＳＸＡＲ命令とパックした直後の命令が起因で例外などのトラップ処理を必要とする場合がある。つまり、ソフトウェアとしては、ＳＸＡＲ命令まではコミットした状態で、直後の命令はコミットせずにトラップ処理に遷移することを期待する場合である。
【００７７】
開示する演算処理装置は、このよう場合であっても、問題なくトラップ処理（割り込み処理）を実行し、トラップ処理実行後も問題なく結合した命令を実行することができる。そこで、実施例３では、結合処理後にトラップ処理が発生した場合の処理について説明する。
【００７８】
具体的には、トラップ処理に遷移する必要がある場合、命令コミットを判定する命令コミット判定部３５が、パックした命令がパックしたことを示すパックビットを確認する。そして、命令コミット判定部３５は、パックビットが１である場合、その命令のトラップ処理への遷移は行わず、パイプラインをすべてキャンセルして、命令フェッチから再度やり直す。
【００７９】
例えば、命令コミット判定部３５がやり直し処理であることを示す制御信号アンパックリランを発信した場合、図１７に示すように、これを受け取った命令プリデコード部３１は、５命令以上の命令プリゼンテーションを行わないように制御する。さらに、命令プリデコード部３１は、前置命令ＳＸＡＲと直後の命令の結合（パック）処理を行わないようにする。このアンパックリランモードによる再実行では、パック処理を行わないので、前置命令ＳＸＡＲと直後の命令が別々のコミットスタックエントリ３４ｂを使用する。この結果、直後の命令起因の例外の場合は、ＳＸＡＲ命令がコミットした後に、直後の命令でトラップに遷移することが可能になる。図１７は、結合処理後にトラップ処理が発生した場合に実行する再命令フェッチを説明する図である。
【００８０】
上述した処理の流れ、つまり、結合処理後にトラップ処理が発生した場合の処理の流れについて説明する。図１８は、結合処理後にトラップ処理が発生した場合の処理の流れを示すフローチャートである。
【００８１】
図１８に示すように、命令コミット判定部３５は、トラップ処理を検出した場合（ステップＳ２０１）、現在実行されている命令のパックビットが「１」であるか否かを判定する（ステップＳ２０２）。
【００８２】
そして、命令コミット判定部３５は、現在実行されている命令のパックビットが「１」である場合（ステップＳ２０２ＹＥＳ）、やり直し処理であることを示す制御信号アンパックリランを各制御部等に発信しパイプラインをキャンセルする（ステップＳ２０３）。
【００８３】
続いて、命令プリデコード部３１は、パック禁止モードで命令を再実行し（ステップＳ２０４）、前置命令ＳＸＡＲと直後の命令を結合せずに、命令デコード部３２に出力する。そして、命令デコード部３２は、前置命令ＳＸＡＲと直後の命令を別々にデコードする（ステップＳ２０５）。実行処理部３３および命令コミット判定部３５は、前置命令ＳＸＡＲを単独で実行およびコミットする（ステップＳ２０６）。
【００８４】
その後、実行処理部３３や命令コミット判定部３５は、実行したＳＸＡＲの直後の命令でトラップを検出し（ステップＳ２０７）、当該命令のパックビットを「０」であることを確認して（ステップＳ２０８）、トラップ処理を実行する（ステップＳ２０９）。
【００８５】
一方、ステップＳ２０２に戻り、命令コミット判定部３５は、現在実行されている命令のパックビットが「１」でない場合（ステップＳ２０２ＮＯ）、そのままトラップ処理を実行する（ステップＳ２０９）。
【００８６】
このように、実施例３によれば、前置命令ＳＸＡＲまではコミットした状態で、直後の命令はコミットせずにトラップ処理に遷移する必要がある場合でも、問題なくトラップ処理を実行し、トラップ処理実行後も問題なく結合した命令を実行することができる。
【実施例４】
【００８７】
次に、前置命令ＳＸＡＲのＸＡＲ２６更新の制御、構成について説明する。上述したように、開示する演算処理装置は、直後１命令のみを拡張するＳＸＡＲ１命令と直後の２命令分を拡張するＳＸＡＲ２命令を結合制御するものである。また、ＸＡＲ２６（命令拡張レジスタ）のＸＡＲ＿Ｆ、ＸＡＲ＿Ｓに拡張情報をセットした後、その拡張情報は、拡張対象の命令がコミットする際にリセットされる。
【００８８】
ここでは、そのセット及びリセットに必要な制御やバッファの構成について説明する。なお、ここでは、コミットスタックエントリ３４ｂの構成ついて説明するが、必ずしもコミットスタックエントリ３４ｂに適用する必要はない。例えば、ＸＡＲ更新用バッファ３４ａとコミットスタックエントリ３４ｂとを統合した一つのバッファ３４に適用することもできる。
【００８９】
最初に、ＸＡＲ２６のＸＡＲ＿Ｆ部に対してのセットおよびリセット制御について説明する。ＳＸＡＲ１命令、ＳＸＡＲ２命令ともにＸＡＲ＿Ｆをセットし、ＸＡＲ＿Ｆによって拡張された命令のコミット時にリセットされる。まず、ＳＸＡＲ１命令に関して説明する。
【００９０】
図１９に示すように、命令プリデコード部３１は、ＳＸＡＲ１と直後の命令が結合して、１つの命令となった結合拡張済み命令Ａを作成し、命令デコード部３２は、結合拡張済み命令Ａをデコードする。そして、実行処理部３３は、結合拡張済み命令Ａを実行し、さらに、実行処理部３３は、例えば、結合拡張済み命令Ａのオペコードなどの情報をコミットスタックエントリ３４ｂに格納する。その後、命令コミット判定部３５は、結合拡張済み命令Ａをコミットすると、ＸＡＲ２６のＸＡＲ＿Ｆに格納される拡張情報をゼロにリセットする。そのため、ＳＸＡＲ１が結合された場合には、書き込むデータを特別に持つ必要がなく、コミットスタックエントリ３４ｂにＳＸＡＲ１の情報を保持しておく必要もない。
【００９１】
一方、命令ＳＸＡＲ１が、前述したアンパックリランモードのときなどで、後続の命令と結合せずに命令デコードが行われる場合がある。この場合は、図２０に示すように、命令プリコード部３１は、ＳＸＡＲ１と直後の命令を結合して処理しないので、命令デコード部３２は、先にＳＸＡＲ１（Ａ）単独でデコードする。そして、ＳＸＡＲ１（Ａ）の情報をコミットスタックエントリ３４ｂに格納する。その後、命令コミット判定部３５は、ＳＸＡＲ１（Ａ）をコミットすると、ＸＡＲ２６のＸＡＲ＿ＦにＳＸＡＲ１（Ａ）（「Ｆ＿ＳＩＭＤ」、「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」、「Ｆ＿ＲＤ」）の拡張情報を格納する。
【００９２】
次に、命令デコード部３２は、ＳＸＡＲ１の後続命令である命令ＡがＸＡＲ２６のＸＡＲ＿Ｆに格納されるＳＸＡＲ１（Ａ）の拡張情報を用いて、ＳＸＡＲ１の後続命令である命令Ａが拡張された非結合拡張済み命令Ａをデコードする。そして、実行処理部３３は、デコードされた非結合拡張済み命令Ａを実行する。命令コミット判定部３５は、ＳＸＡＲ１の後続の命令Ａをコミットした場合には、ＸＡＲ２６のＸＡＲ＿Ｆの値をゼロにリセットする。なお、ＳＸＡＲが結合されなかった場合、命令コミットに必要な情報は通常の書く込むレジスタ番号など不要である。したがって、別の命令では、別の用途に用いられているフィールドをＳＸＡＲの命令拡張レジスタに書き込む情報に割り当てることで必要な資源増加を抑えることができる。
【００９３】
また、命令コミット判定部３５は、命令ＳＸＡＲ２に関しては、ＳＸＡＲ２と直後の命令が結合して１つの命令として処理された場合、その拡張命令をコミットするとＸＡＲ２６のＸＡＲ＿Ｆ部の値をゼロにリセットする。したがって、ＳＸＡＲ２命令に含まれるＸＡＲ＿Ｆ用の拡張情報は持たず、ただリセットだけをする。
【００９４】
具体的には、図２１に示すように、命令プリコード部３１によってＳＸＡＲ２と直後の命令Ａが結合して１つの命令として処理された場合、命令デコード部３２によって結合拡張済み命令Ａがデコードされ、実行処理部３３によって実行される。さらに、実行処理部３３は、例えば、結合拡張済み命令Ａのオペコードなどの拡張情報をコミットスタックエントリ３４ｂに格納する。その後、命令コミット判定部３５は、ＳＸＡＲ２と命令Ａが結合することで拡張された結合拡張済み命令Ａをコミットすると、ＸＡＲ２６のＸＡＲ＿Ｆの拡張情報をゼロにリセットする。さらに、結合拡張済み命令Ａをコミットした命令コミット判定部３５は、次の命令Ｂを拡張するＳＸＡＲ２により指定される１２〜０ビット目の（「Ｓ＿ＳＩＭＤ」、「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」、「Ｓ＿ＲＤ」）をＸＡＲ＿Ｓに格納する。
【００９５】
ＳＸＡＲ２の直後２命令目の命令Ｂに関しては、命令デコード部３２は、ＸＡＲ＿Ｓに格納されるＳＸＡＲ２命令の拡張情報を用いて、ＳＸＡＲ２の直後２命令目の命令Ｂが拡張された非結合拡張済み命令Ｂをデコードする。そして、実行処理部３３は、デコードされた非結合拡張済み命令Ｂを実行する。この場合、命令コミット判定部３５は、非結合拡張済み命令Ｂをコミットすると、ＸＡＲ２６のＸＡＲ＿Ｓに格納される命令Ｂ用の拡張情報をゼロにリセットする。
【００９６】
つまり、ＳＸＡＲ２が直後の命令Ａが結合され、結合拡張済み命令Ａとしてコミットされた場合、ＸＡＲ２６のＸＡＲ＿Ｆの値はゼロにリセットされるので、命令Ａの拡張情報を保持する必要はない。ところが、次の非結合拡張済み命令Ｂを実行する前に、トラップ処理などが発生した場合であっても、拡張済み命令Ｂを正確に実行する必要がある。そのため、結合拡張済み命令Ａが実行／コミットされてもリセットされないフィールドである「ＸＡＲ＿Ｓ更新用情報フィールド」にＳＸＡＲ２の命令Ｂの拡張情報を保持しておく必要がある。そして、非結合拡張済み命令Ｂが実行後、コミットされた場合、ＸＡＲ２６のＸＡＲ＿Ｓの値がゼロにリセットされる。
【００９７】
一方、前述したアンパックリランモードのときなどで、ＳＸＡＲ２と直後の命令が結合されなかった場合、ＸＡＲ＿Ｆに対応する拡張情報をＳＸＡＲ１の結合されなかった場合と同様、通常の命令が使用するフィールドをなるべく利用しながら格納して、ＸＡＲ＿Ｆを更新する。
【００９８】
具体的には、図２２に示すように、命令プリコード部３１は、ＳＸＡＲ２と直後の命令を結合して処理しないので、命令デコード部３２は、先にＳＸＡＲ２単独でデコードする。そして、コミットスタックエントリ３４ｂにＳＸＡＲ２の情報を格納する。そして、命令コミット判定部３５は、ＳＸＡＲ２をコミットすると、後続する命令ＡとＢを拡張する情報がＸＡＲ２６のＸＡＲ＿ＦとＸＡＲ＿Ｓとのそれぞれに格納する。例えば、命令コミット判定部３５は、ＸＡＲ２６のＸＡＲ＿Ｆの「Ｆ＿ＶＡＬ」を「１」にして、ＳＸＡＲ２により指定される２５〜１３ビット目の（「Ｆ＿ＳＩＭＤ」、「Ｆ＿ＲＳ３」、「Ｆ＿ＲＳ２」、「Ｆ＿ＲＳ１」、「Ｆ＿ＲＤ」）をＸＡＲ＿Ｆ部に格納する。また、命令コミット判定部３５は、ＳＸＡＲ２により指定される１２〜０ビット目の（「Ｓ＿ＳＩＭＤ」、「Ｓ＿ＲＳ３」、「Ｓ＿ＲＳ２」、「Ｓ＿ＲＳ１」、「Ｓ＿ＲＤ」）をＸＡＲ＿Ｓに格納する。
【００９９】
その後、命令デコード部３２は、ＸＡＲ＿Ｆに格納されるＳＸＡＲ２命令内の拡張情報を用いて、ＳＸＡＲ２の直後の命令Ａが拡張された非結合拡張済み命令Ａをデコードする。そして、実行処理部３３は、命令デコード部３２によってデコードされた非結合拡張済み命令Ａを実行する。続いて、命令コミット判定部３５は、非結合拡張済み命令Ａをコミットすると、ＸＡＲ２６のＸＡＲ＿Ｆに格納される命令Ａ用の拡張情報をゼロにリセットする。
【０１００】
さらにその後、命令デコード部３２は、ＸＡＲ＿Ｓに格納されるＳＸＡＲ２命令内の拡張情報を用いて、ＳＸＡＲ２の直後２命令目の命令Ｂが拡張された非結合拡張済み命令Ｂをデコードする。そして、実行処理部３３は、命令デコード部３２によってデコードされた非結合拡張済み命令Ｂを実行する。続いて、命令コミット判定部３５は、非結合拡張済み命令Ｂをコミットすると、ＸＡＲ２６のＸＡＲ＿Ｓに格納される命令Ｂ用の拡張情報をゼロにリセットする。
【０１０１】
上述した図１９〜図２２の例で検討すると、ＸＡＲ２６のＸＡＲ＿Ｓには、ＳＸＡＲ２命令が結合されるか否かに関わらず、直後２命令目の拡張情報を書き込む必要がある。しかし、コミットスタックエントリのフィールドを増やしていくことは、回路の増大につながり、できるだけ避けたい。また、ＸＡＲ２６による拡張は、ＳＸＡＲ命令の拡張を行うことはない。このような命令列が出た場合には、ハードウェアは例外トラップに入る。また、ＳＸＡＲ２は、直後の命令と結合された場合でも、コミットスタックエントリにおいて連続して格納する必要はない。よって、ＳＸＡＲ２命令用にＸＡＲ＿Ｓ情報を更新するのに必要なコミットスタックエントリの格納部は、２個のエントリに対して１つ持つような構成をとることで十分である。
【０１０２】
以上を考慮すると、バッファ３４の構成は、図２３のような構成にすることが好ましい。具体的には、ＸＡＲ＿Ｓをセットするか否かを示す１ビットフィールドと、ＸＡＲ＿Ｓをリセットするか否かを示す１ビットフィールドとは、すべてのコミットスタックエントリごとに有する。ＸＡＲ＿Ｓをセットするフラグが立っている場合には（例えば、１の場合）、そのコミットスタックエントリに対応するＸＡＲ＿Ｓ更新用フィールドのデータを命令コミットした場合に、ＸＡＲ＿Ｓへ書き込む。また、ＸＡＲ＿Ｓをリセットするフラグは、ＸＡＲ＿Ｓで拡張される命令をコミットスタックエントリに登録する際に、フラグが立つ。こうすることで、コミットステージでフラグが確認されて、フラグが立っている場合は、ＸＡＲ＿Ｓフィールドがリセットされる。
【０１０３】
（テンポラリＸＡＲ＿Ｓ更新用バッファ）
また、例えば、コミットスタックエントリ３４ｂ又はバッファ３４の使用数が１つを残して使用中となった状態について検討する。この場合、図２４に示すように、ＳＸＡＲ２命令のＸＡＲ＿Ｓ更新用データに必要なフィールドが２個のエントリで共有しているため、ＳＸＡＲ２をデコードして新たにコミットスタックエントリを割り当てると、コミットスタックエントリの先頭の命令のＸＡＲ＿Ｓ更新用データを上書きしてしまう可能性がある。
【０１０４】
これを解消するために、コミットスタックエントリの使用可能数が１つの状態で、ＳＸＡＲ２命令をデコードした場合、一時的にＸＡＲ＿Ｓ更新用の拡張情報を格納しておくバッファ（テンポラリＸＡＲ＿Ｓ更新用バッファ）を備えさすようにすることもできる（図２５）。このテンポラリＸＡＲ＿Ｓ更新用バッファには、ＳＸＡＲ２命令をデコードした場合、一時的にＸＡＲ＿Ｓ更新用の拡張情報を格納しておき、その後、１つ以上命令がコミットしたら、それを契機に命令が該当するＸＡＲ＿Ｓ更新用データフィールドにデータを移すようにする。
【０１０５】
このような構成のコミットスタットエントリ（バッファ３４）を用いることで、命令や拡張命令を実行する資源をより効率的に利用することができる。
【０１０６】
なお、図１９は、ＳＸＡＲ１命令と結合された命令の処理の流れを示す図であり、図２０は、ＳＸＡＲ１命令と結合されなかった命令の処理の流れを示す図である。図２１は、ＳＸＡＲ２命令による２命令の拡張かつ直後の命令と結合された命令の処理の流れを示す図である。また、図２２は、ＳＸＡＲ２命令による２命令の拡張かつ直後の命令と結合されなかった命令の処理の流れを示す図であり、図２３は、推奨されるコミットスタットエントリ（バッファ３４）の構成を示す図である。図２４は、テンポラリＸＡＲ＿Ｓ更新用バッファを説明する図である。
【実施例５】
【０１０７】
さて、これまで開示する演算処理装置の実施例について説明したが、開示する演算処理装置は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に示すように、異なる実施例を説明する。
【０１０８】
（中間状態レジスタ）
例えば、図２５に示すように、ＳＸＡＲと、それによって拡張される命令が同時に命令プリデコード部３１のスロットに入らなかった場合が考えられる。図２５では、ＳＸＡＲ２（Ｄ、Ｅ）に後続するはずの命令Ｅが、命令Ｄと同じタイミングで、命令プリデコード部３１のスロットに入っていないことが示されている。この場合、次のサイクル以降に命令プリデコードされる命令Ｅに拡張情報を付加する必要がある。そのため、拡張対象の命令が命令プリデコードされるまでの間、ＳＸＡＲの情報を保持する中間状態レジスタ「ＰＤ＿ＸＡＲレジスタ」を有するようにすることもできる。
【０１０９】
このＰＤ＿ＸＡＲレジスタは、命令プリデコード部３１及び命令デコード部３２に近い場所に備えさすことが有効である。また、ＳＸＡＲとＳＸＡＲによって拡張される命令が同時に命令プリデコード部３１のスロットに入らなかった場合のほかに、分岐予測ミスやトラップ処理に遷移するなどの理由でパイプラインフラッシュを行った場合にも有効である。具体的には、マスターであるＸＡＲレジスタの値をＰＤ＿ＸＡＲにコピーして、それ以降の命令拡張情報付加を行うようにすればよい。図２５は、中間状態レジスタを説明する図である。
【０１１０】
（前置命令）
上述した実施例では、基本的に前置命令ＳＸＡＲ２を用いた例について説明したが、ＳＸＡＲ１を用いても同様に処理することができる。図２６に示すように、ＳＸＡＲ１とＳＸＡＲ２とは、ソフト的に等価であるので、コンパイラではＳＸＡＲ２でコード生成することが好ましい。例えば、図１５で説明したスロット数について説明する。拡張したい連続する２つの命令に対して、ＳＸＡＲ２と被拡張命令２つではなく、ＳＸＡＲ１命令と被拡張命令１つ、ＳＸＡＲ１命令と被拡張命令１つというようにすることもできる。この場合、図１５とは異なり、実効命令デコード数を３つにすることで無駄な領域を抑止して処理を実行することができる。図２６は、ＳＸＡＲ１とＳＸＡＲ２との関係を示す図である。
【０１１１】
（システム構成等）
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１１２】
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１１３】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１１４】
（付記１）命令を拡張する拡張情報を記憶する第一フィールドと第二フィールドとを有する命令拡張情報レジスタと、
当該命令の直後の命令の拡張情報を前記第一フィールドに拡張情報を書き込む１命令分の拡張情報を保持する第一前置命令と、当該命令の直後の命令の拡張情報を前記第一フィールドに書き込み、当該命令の直後２命令目の命令の拡張情報を前記第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令とを有し、
前記命令を記憶する記憶部から読み出した命令が、前記第一前置命令または前記第二前置命令である場合に、前記第一前置命令または前記第二前置命令と、前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を生成する命令結合部と、
前記命令結合部によって生成された結合済み命令をデコードし、１命令として実行する命令実行部と、
前記命令実行部によって実行された結合済み命令に対するコミットを行う場合に、プログラムカウンタを２命令分更新するレジスタ更新部と、
を有することを特徴とする演算処理装置。
【０１１５】
（付記２）前記命令実行部は、複数の命令を同時にデコードして処理するパイプライン処理を行うものであって、
前記命令結合部は、前記命令実行部が同時に実行できる命令数が偶数の場合には、前記命令数の半分の命令数を前記記憶部から読み出して格納するスロットを追加して構成し、前記命令実行部が同時に実行できる命令数が奇数の場合には、前記命令数の半分に０．５を加算した命令数を前記記憶部から読み出して格納するスロットを追加して構成することを特徴とする付記１に記載の演算処理装置。
【０１１６】
（付記３）前記命令結合部は、前記記憶部から読み出した複数の命令の先頭から所定命令数までに一つ以上の前記前置命令が含まれている場合には、前記所定命令数の次の命令まで前記命令実行部に出力し、前記記憶部から読み出した複数の命令の先頭から前記所定命令数の次の命令までに、二つ以上の前記第一前置命令または前記第二前置命令が含まれている場合には、前記所定命令数の二つ次の命令まで前記命令実行部に出力することを特徴とする付記２に記載の演算処理装置。
【０１１７】
（付記４）前記命令結合部によって生成された結合済み命令のうち、前記第一前置命令または前記第二前置命令の直後の命令が起因でトラップ処理が発生した場合、または、前記第二前置命令の直後２命令目の命令が起因でトラップ処理が発生した場合、前記第一前置命令または前記第二前置命令をコミットせずに前記パイプラインをフラッシュさせるコミット判定部をさらに有し、
前記命令結合部は、前記コミット判定部によってパイプラインがフラッシュされた場合には、前記トラップ処理が発生した結合済み命令に含まれる前記第一前置命令または前記第二前置命令と直後の命令とを結合することなく、別々に前記命令実行部に出力し、
前記命令実行部は、前記命令結合部から受け付けた前記第一前置命令または前記第二前置命令と直後の命令とをそれぞれで別々に実行し、
前記レジスタ更新部は、前記命令実行部によって実行された命令数分のプログラムカウンタを更新することを特徴とする付記１に記載の演算処理装置。
【０１１８】
（付記５）前記レジスタ更新部は、前記結合済み命令が前記命令実行部によって実行された場合、前記プログラムカウンタを２命令分更新するとともに、前記命令拡張情報レジスタの第一フィールドに記憶されている情報をリセットすることを特徴とする付記１に記載の演算処理装置。
【０１１９】
（付記６）前記レジスタ更新部は、前記第一前置命令が先に実行され、続いて、前記第一前置命令が保持する拡張情報によって拡張される命令が前記命令実行部によって実行された場合、前記プログラムカウンタを１命令分ずつ更新するとともに、前記第一前置命令が実行された後に、前記命令拡張情報レジスタの第一フィールドに前記拡張情報を格納し、前記第一前置命令の直後の命令が前記第一フィールドの拡張情報を用いて実行された後に、前記命令拡張情報レジスタの第一フィールドに記憶されている情報をリセットすることを特徴とする付記１に記載の演算処理装置。
【０１２０】
（付記７）前記レジスタ更新部は、前記結合済み命令が前記命令実行部によって実行された場合、前記プログラムカウンタを２命令分更新するとともに、前記命令拡張情報レジスタの第一フィールドに記憶される情報をリセットし、前記第二前置命令が保持する直後２命令目の命令の拡張情報を前記第二フィールドに格納することを特徴とする付記１に記載の演算処理装置。
【０１２１】
（付記８）前記レジスタ更新部は、前記第二前置命令が先に実行され、続いて、前記第二前置命令が保持する拡張情報によって拡張される後続の２命令が前記命令実行部によって実行された場合、前記プログラムカウンタを１命令分ずつ更新するとともに、前記第二前置命令が実行された後に、前記第二前置命令の直後の命令の拡張情報を前記命令拡張情報レジスタの第一フィールドに格納するとともに、前記第二前置命令の直後２命令目の命令の拡張情報を前記命令拡張情報レジスタの第二フィールドに格納し、前記第二前置命令の直後の命令が前記第一フィールドの拡張情報を用いて実行された後に前記第一フィールドをリセットし、前記第二前置命令の直後２命令目の命令が前記第二フィールドの拡張情報を用いて実行された後に前記第二フィールドをリセットすることを特徴とする付記１に記載の演算処理装置。
【０１２２】
（付記９）前記命令実行部によって命令が実行されてコミットされるまでの間、前記命令実行部によって格納された情報であって、少なくとも当該実行された命令のオペコードを含む情報を保持するコミット領域をさらに有し、
前記コミット領域は、前記第一フィールドを更新する情報を保持する第一領域と、前記第二フィールドを更新する第二領域とを有し、前記第二領域は、連続する二つの第一領域に対して一つ有することを特徴とする付記１に記載の演算処理装置。
【０１２３】
（付記１０）前記コミット領域は、前記第一領域および第二領域とは別の領域であるテンポラリ領域をさらに有し、
前記命令実行部は、前記コミット領域の前記第一領域の空きが一つであり、前記第二前置命令もしくは前記結合済み命令を実行した場合に、前記第二前置命令の直後２命令目の拡張情報を前記テンポラリ領域に格納することを特徴とする付記９に記載の演算処理装置。
【０１２４】
（付記１１）命令を記憶する記憶部から読み出した命令が、前記命令の直後の命令の拡張情報を命令拡張情報レジスタの第一フィールドに拡張情報を書き込む１命令分の拡張情報を保持する第一前置命令であるか、または、当該命令の直後の命令の拡張情報を前記第一フィールドに書き込み、当該命令の直後２命令目の命令の拡張情報を命令拡張情報レジスタの第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令である場合に、前記第一前置命令または前記第二前置命令と前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を生成する命令結合ステップと、
前記命令結合ステップによって生成された結合済み命令をデコードし、１命令として実行する命令実行ステップと、
前記命令実行ステップによって実行された結合済み命令に対するコミットを行う場合に、プログラムカウンタを２命令分更新するレジスタ更新ステップと、
を含んだことを特徴とする制御方法。
【０１２５】
（付記１２）命令を拡張する拡張情報を記憶する第一フィールドと第二フィールドとを有する命令拡張情報レジスタと、
当該命令の直後の命令の拡張情報を前記第一フィールドに拡張情報を書き込む１命令分の拡張情報を保持する第一前置命令と、当該命令の直後の命令の拡張情報を前記第一フィールドに書き込み、当該命令の直後２命令目の命令の拡張情報を前記第二フィールドに書き込む２命令分の拡張情報を保持する第二前置命令とを有し、
前記命令を記憶する記憶部から読み出した命令が、前記第一前置命令または前記第二前置命令である場合に、前記第一前置命令または前記第二前置命令と前記第一前置命令または前記第二前置命令の直後にデコードされる命令とを結合した結合済み命令を生成する命令結合部と、
前記命令結合部によって生成された結合済み命令をデコードし、１命令として実行する命令実行部と、
前記命令実行部によって実行された結合済み命令に対するコミットを行う場合に、プログラムカウンタを２命令分更新するレジスタ更新部と、
を有することを特徴とする演算回路。
【符号の説明】
【０１２６】
１０  演算処理装置
１１  メモリ
１２  レジスタ
１３  命令拡張情報レジスタ
１４  命令結合部
１５  命令実行部
１６  レジスタ更新部
２０  演算処理装置
２１  メモリ
２２  ２次キャッシュ
２３  命令キャッシュ
２４  データキャッシュ
２５  レジスタ
２６  ＸＡＲ
３０  命令バッファ部
３１  命令プリデコード部
３２  命令デコード部
３３  実行処理部
３４  バッファ
３４ａ  ＸＡＲ更新用バッファ
３４ｂ  コミットスタックエントリ
３５  命令コミット判定部
【図１】
0005471082.tif 000002
【図２】
0005471082.tif 000003
【図３】
0005471082.tif 000004
【図４】
0005471082.tif 000005
【図５】
0005471082.tif 000006
【図６】
0005471082.tif 000007
【図７】
0005471082.tif 000008
【図８】
0005471082.tif 000009
【図９】
0005471082.tif 000010
【図１０】
0005471082.tif 000011
【図１１】
0005471082.tif 000012
【図１２】
0005471082.tif 000013
【図１３】
0005471082.tif 000014
【図１４】
0005471082.tif 000015
【図１５】
0005471082.tif 000016
【図１６】
0005471082.tif 000017
【図１７】
0005471082.tif 000018
【図１８】
0005471082.tif 000019
【図１９】
0005471082.tif 000020
【図２０】
0005471082.tif 000021
【図２１】
0005471082.tif 000022
【図２２】
0005471082.tif 000023
【図２３】
0005471082.tif 000024
【図２４】
0005471082.tif 000025
【図２５】
0005471082.tif 000026
【図２６】
0005471082.tif 000027