(57)【要約】【課題】本発明は、プログラムカウンタ制御方法及びプロセッサに関し、分岐のスループットの向上を、できるだけ小さい回路規模（実装面積）で図ることを目的とする。【解決手段】分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させ、プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するように構成する。【選択図】　　　図２
2004038256.tif 000002
【特許請求の範囲】
【請求項１】
分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【請求項２】
分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が成功して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【請求項３】
分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が失敗して分岐命令が分岐する時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【請求項４】
分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が失敗して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【請求項５】
分岐予測部を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐命令の分岐条件判定、分岐予測の成否及び命令再フェッチの制御を行い、複数の分岐命令を同時に制御可能な分岐命令制御部と、
分岐することが確定した分岐命令の分岐先アドレスを複数格納する分岐先アドレスレジスタとを備え、
該分岐先アドレスレジスタは、該分岐命令制御部及び該分岐予測部とは独立して制御可能であることを特徴とする、プロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はプログラムカウンタ制御方法及びプロセッサに係り、特に分岐予測を行うと共に分岐のための遅延命令を持つ命令制御において、分岐命令を含めた複数の命令が同時に完了する構成のプログラムカウンタ及びネクストプログラムカウンタを同時に更新・制御するためのプログラムカウンタ制御方法、及びそのようなプログラムカウンタ制御方法を用いるプロセッサに関する。
【０００２】
【従来の技術】
近年、プロセッサの性能を向上させるために、様々な命令処理方式が用いられる。その中の１つに、アウトオブオーダ処理方式がある。アウトオブオーダ処理方式を採用したプロセッサにおいては、１つの命令実行の完了を待たずに後続の命令列を順次、複数のパイプラインに投入して命令を実行させることで、性能の向上を行なっている。
【０００３】
しかし、先行している命令の実行結果が後続の命令の実行に影響を与える場合には、先行している命令実行が完了しなければ後続の命令を実行させることができない。後続の命令の実行に影響を与える命令の処理が遅ければ、その間後続の命令は実行できず、先行の命令完了を待ち続けることになる。このため、パイプラインに乱れが生じ、性能の低下を引き起こす。このようなパイプラインの乱れは、特に分岐命令の場合に顕著に現れる。
【０００４】
分岐命令の中でも、条件分岐と呼ばれる命令の場合、条件分岐命令の直前で分岐条件（通常はコンディションコード）を変更する命令があると、分岐条件を変更する命令が完了し、分岐条件が確定するまで分岐が確定しない。従って、分岐命令の後続のシーケンスがわからないために、後続の命令を投入できず、処理が止まってしまい処理能力が低下する。このことはアウトオブオーダ処理方式を採用したプロセッサに限らず、ロック・ステップ・パイプライン等の処理方式を採用しているプロセッサにおいても同様の問題が生じるが、アウトオブオーダ処理方式を採用しているプロセッサにおいては、より顕著に性能の低下が生じる。そこで、分岐命令による性能低下を抑えるために、通常は、分岐予測を行う分岐予測機構をプロセッサ内の命令制御装置に設けて、分岐命令の高速化を図っている。
【０００５】
分岐予測機構を備えたアウトオブオーダ処理方式を採用するプロセッサの場合、複数の分岐命令が分岐予測結果に基づいて実行パイプラインに投入される。分岐命令が分岐した場合は、分岐先アドレスを命令アドレスレジスタにセットする必要がある。尚、ＳＰＡＲＣアーキテクチャを採用するプロセッサでは、この命令アドレスレジスタは、プログラムカウンタ・ネクストプログラムカウンタと呼ばれる。実行パイプライン上に複数の分岐命令が存在している場合、命令アドレスレジスタは、各分岐命令の分岐先アドレスを命令完了まで保持する必要がある。しかし、各分岐命令の分岐確定のタイミングは異なるため、従来は、実際には分岐しない分岐命令の分岐先アドレスまで保持する必要があった。
【０００６】
実行パイプラインの分岐命令のスループットは、分岐命令制御部のスループット及び分岐先アドレスを保持するための分岐先アドレスレジスタの数で決まる。ところが、実際には分岐しない分岐命令の分岐先アドレスで分岐先アドレスレジスタを使用してしまうと、結果的に分岐命令のスループットを抑えてしまうことになる。このため、スループット改善のために、更に分岐先アドレスレジスタを増やす必要が生じてしまうという悪循環に陥ってしまっていた。
【０００７】
命令制御装置において、その実行速度を決定するものの１つに、１サイクルにおける処理可能な命令数がある。アウトオブオーダ方式による命令制御装置においては、同時に複数の命令を完了することができる。通常、命令完了とは使用するレジスタ等のリソースの更新が完了した時点を指すが、同時に複数の命令を完了させる場合には、使用するリソースの更新も複数同時に完了させる必要がある。当然、命令アドレスレジスタも、複数の命令分更新する必要がある。ＳＰＡＲＣアーキテクチャに代表される、分岐の遅延命令を有するアーキテクチャを制御する場合、分岐命令の分岐の可否により遅延命令の実行の有無が決まり、プログラムカウンタ・ネクストプログラムカウンタの２つのレジスタを更新する必要がある。このため、従来は、分岐命令は単独若しくは決まった位置（同時に命令完了する時の他の命令との相対的な位置）からしか命令完了（コミット）できなかった。通常、デコードのサイクルにおいて、パケット方式で分岐命令をパケットの最後の位置に置き命令完了する場合も、その位置を決めている。この場合、デコードサイクル及び命令完了サイクルは、分岐命令により制約を受けることになる。
【０００８】
【発明が解決しようとする課題】
近年、ＬＳＩ製造技術の向上等により、大容量のメモリを使用することが可能になり、オペレーテイングシステム（ＯＳ）やアプリケーションにおいて６４ビット化が進められるようになった。これに伴い、命令制御装置においても６４ビット化が求められている。しかし、６４ビット化に伴い、使用するレジスタ等の回路が増大してしまう。分岐命令の制御に関わるレジスタも、６４ビット化する必要があり、分岐先アドレスレジスタ等が増大してしまう。
【０００９】
このように、単純に３２ビット構成から６４ビット構成にした場合、エントリー数は変わらずに、回路が２倍必要になってしまい、回路規模（実装面積）が増大してしまうという問題があった。
【００１０】
しかし、現時点において、実際のプログラムの命令領域を４Ｇバイト以上使用するケースは少なく、プログラム中で４Ｇバイト境界を越えるケースが命令処理の性能を大きく左右することはあまり見られない。そこで、本発明は、分岐のスループットの向上を、できるだけ小さい回路規模（実装面積）で図れるプログラムカウンタ制御方法及びプロセッサを実現することを目的とする。
【００１１】
【課題を解決するための手段】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とするプログラムカウンタ制御方法によって達成できる。
【００１２】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐予測が成功して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とするプログラムカウンタ制御方法によっても達成できる。
【００１３】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐予測が失敗して分岐命令が分岐する時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とするプログラムカウンタ制御方法によっても達成できる。
【００１４】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐予測が失敗して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とするプログラムカウンタ制御方法によっても達成できる。
【００１５】
前記アーキテクチャは、６４ビット長の命令アドレス空間を使用し、プログラムカウンタ制御方法は、命令の下位３２ビットとキャリービット及びボロウビットのみを使用して、分岐命令制御及び分岐先アドレスの生成を行うステップを更に含んでも良い。
【００１６】
上記の課題は、分岐予測部を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、分岐命令の分岐条件判定、分岐予測の成否及び命令再フェッチの制御を行い、複数の分岐命令を同時に制御可能な分岐命令制御部と、分岐することが確定した分岐命令の分岐先アドレスを複数格納する分岐先アドレスレジスタとを備え、該分岐先アドレスレジスタは、該分岐命令制御部及び該分岐予測部とは独立して制御可能であることを特徴とするプロセッサによっても達成できる。
【００１７】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とするプロセッサによっても達成できる。
【００１８】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、分岐予測が成功して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とするプロセッサによっても達成できる。
【００１９】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、分岐予測が失敗して分岐命令が分岐する時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とするプロセッサによっても達成できる。
【００２０】
上記の課題は、分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、分岐予測が失敗して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とするプロセッサによっても達成できる。
【００２１】
従って、本発明によれば、分岐のスループットの向上を、できるだけ小さい回路規模（実装面積）で図れるプログラムカウンタ制御方法及びプロセッサを実現することができる。
【００２２】
【発明の実施の形態】
本発明になるプログラムカウンタ制御方法及び本発明になるプロセッサの各実施例を、以下図面と共に説明する。
【００２３】
【実施例】
図１は、本発明になるプロセッサの一実施例を示すブロック図である。同図中、プロセッサ１００は、命令ユニット２１、メモリユニット２２及び演算ユニット２３を含む。命令ユニット２１は、本発明になる命令制御方法の一実施例を採用する命令制御装置を構成する。メモリユニット２２は、命令やデータ等を格納するために設けられ、演算ユニット２３は、各種演算を実行するために設けられている。
【００２４】
命令ユニット２１は、図１に示す如く接続された分岐予測部１、命令フェッチ部２、命令バッファ部３、相対分岐アドレス生成部４、命令デコーダ部５、分岐命令実行部６、命令完了制御部９、分岐先アドレスレジスタ１０及びプログラムカウンタ部１１からなる。分岐命令実行部６は、分岐命令制御部７及びディレイスロットスタック部８からなる。プログラムカウンタ部１１には、プログラムカウンタＰＣ、ネクストプログラムカウンタｎＰＣ及び更新部が含まれる。
【００２５】
分岐命令の制御は、分岐予測部１、分岐命令制御部７、命令完了制御部９及び分岐先アドレスレジスタ１０において独立して制御できる。実行パイプライン上に存在する分岐命令は、命令デコーダ部５においてデコードされると、一旦分岐命令制御部７の制御下となる。分岐命令制御部７では、分岐命令の分岐条件判定、分岐予測の成否及び命令再フェッチの制御を行う。分岐命令制御部７で制御可能な分岐命令数は、エントリー数で決定される。分岐命令制御部７での制御は、分岐命令の分岐条件確定及び分岐先アドレス生成までであり、それ以降は命令完了制御部９において制御が行われる。分岐先アドレスレジスタ１０では、分岐命令制御部７での制御から開放された分岐する分岐命令の分岐先アドレスを制御しており、命令完了、即ち、プログラムカウンタ部１１の更新まで制御する。命令完了制御部９では、全命令の命令完了条件を制御しており、分岐命令は、分岐の可否によらず必ず制御される。実行パイプライン上に同時に存在できる分岐命令数ＭＡＸは、命令完了制御部９のエントリー数Ｎに依存し、分岐先アドレスレジスタ（エントリー数＝Ｍ）がフル（ＦＵＬＬ）になった時は、分岐する分岐命令数のＭＡＸは、分岐命令制御部７のエントリー数Ｌとの和Ｌ＋Ｍになる。分岐しない分岐命令は、分岐先アドレスレジスタ１０の数に依存しない。分岐先アドレスレジスタ１０の下での制御は、分岐命令制御部７から開放されて命令が完了するまでの間だけであるため、分岐命令制御部７の空きが存在する間は命令デコードが影響を受けることはない。
【００２６】
分岐先アドレス生成は、命令相対分岐とレジスタ相対分岐の２種類に分けられる。命令相対分岐の分岐先アドレス生成は、相対分岐アドレス生成部４で計算され、分岐命令制御部７経由で分岐先アドレスレジスタ１０に供給される。レジスタ相対分岐の分岐先アドレスは、命令実行ユニット２３内で計算され、分岐命令制御部７経由で分岐先アドレスレジスタ１０に供給される。例えば、レジスタ相対分岐の分岐先アドレスの下位３２ビットは分岐命令制御部７経由で、上位３２ビットは直接プログラムカウンタ部１１に供給される。アドレス相対分岐の分岐先アドレスは、上位３２ビットが変わる時はボロウ（Ｂｏｒｒｏｗ）ビット、キャリー（Ｃａｒｒｙ）ビットの有無に基づいて計算により求められるので、分岐命令制御部７では分岐先命令アドレスは（下位３２ビット＋４ビットパリティ＋Ｂｏｒｒｏｗビット＋Ｃａｒｒｙビット）＊エントリー数で制御される。分岐先アドレスレジスタ１０においても同様に、分岐先命令アドレスは（下位３２ビット＋４ビットパリティ＋Ｂｏｒｒｏｗビット＋Ｃａｒｒｙビット）＊エントリー数で構成されている。命令アドレスの上位３２ビットが変わる時は、一旦プログラムカウンタ部１１に値をセットした後にプログラムカウンタ部１１からのリトライにより命令フェッチを必ず行うようにする。
【００２７】
使用するリソースの更新のための制御は、命令完了制御部９及びプログラムカウンタ部１１で行われる。プログラムカウンタ部１１の場合、命令完了（コミット）では同時に何命令が命令完了したか及び分岐する命令が命令完了したかどうかの情報が供給される。尚、分岐する命令が命令完了した場合は、その情報が分岐命令制御部７にも供給される。本実施例では、ＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝ｎＰＣ＋（同時に命令完了した数＊４）若しくは分岐先アドレスとなる。本実施例では、分岐する分岐命令はそれより前にある命令とは同時に命令完了できるが、その後ろにある命令とは同時に命令完了しないようになっている。これは、プログラムカウンタＰＣにセットするパスに、分岐先アドレスのパスを入れていないからであり、ネクストプログラムカウンタｎＰＣと同様に、プログラムカウンタＰＣにも分岐先アドレスのパスを入れれば、分岐命令の同時命令完了数の制約はなくなる。分岐しない分岐命令においては、本実施例においても、同時命令完了数の制約は受けない。本実施例では、分岐命令が命令完了する際に、命令完了する位置の制約はなく、又、デコード時にも制約を受けない。
【００２８】
図２は、図１に示す命令ユニット２１の要部を、演算ユニット２３と共に示すブロック図である。図２中、図１と同一部分には同一符号を付し、その説明は省略する。図２において、命令デコーダ部５から分岐命令制御部７及び命令完了制御部９への入力の図示は省略する。プログラムカウンタ部１１は、プログラムカウンタＰＣ、ネクストプログラムカウンタｎＰＣ、ラッチ回路１１−１、プログラムカウンタ（ＰＣ）用更新回路１１−２及びネクストプログラムカウンタ（ｎＰＣ）用更新回路１１−３からなる。以下の説明で、特に明記していない場合を除き、アドレスは全てロジカルアドレスであるものとする。
【００２９】
本実施例では、説明の便宜上、ＳＰＡＲＣアーキテクチャが採用されているものとして説明する。命令は、アウトオブオーダで処理され、分岐命令実行部６においては、分岐命令制御部７内に複数のＲＳＢＲ０〜ＲＳＢＲｍ（Ｒｅｓｅｒｖａｔｉｏｎ　Ｓｔａｔｉｏｎ　ｆｏｒ　Ｂｒａｎｃｈ）が設けられ、ディレイスロットスタック部８内に複数のＤＳＳ０〜ＤＳＳｎ（Ｄｅｌａｙ　Ｓｌｏｔ　Ｓｔａｃｋ）が設けられている。又、分岐命令予測機構として、分岐予測部１が設けられている。
【００３０】
図３は、上記の如き分岐命令制御時の動作を説明するフローチャートである。同図中、ステップＳ１は、分岐命令が終了したか否かを判定し、判定結果がＹＥＳになると、ステップＳ２は、分岐命令が分岐するか否かを判定する。ステップＳ２の判定結果がＮＯであると、処理は後述するステップＳ４へ進む。他方、ステップＳ２の判定結果がＹＥＳであると、ステップＳ３は、分岐先アドレスレジスタ１０に空きエントリーが存在するか否かを判定する。ステップＳ３の判定結果がＹＥＳになると、処理はステップＳ４へ進む。
【００３１】
ステップＳ４は、分岐命令制御部７での分岐命令の制御を完了し、処理はステップＳ５及びステップＳ６へ進む。ステップＳ５は、分岐命令の完了を命令完了制御部９へ通知する。ステップＳ５と同時に、ステップＳ６は、分岐する場合は分岐アドレスの保持を分岐先アドレスレジスタ１０に指示する。ステップＳ５及びステップＳ６の後、ステップＳ７は、リソースの更新、即ち、プログラムカウンタ部１１の更新を更新回路１１−２，１１−３により行う。
【００３２】
図４は、プログラムカウンタ部１１の更新時の動作を説明するフローチャートである。同図に示す処理は、図３に示すステップＳ７の処理に対応する。図４において、ステップＳ１１は、命令完了の条件がそろっているか否かを判定する。ステップＳ１１の判定結果がＹＥＳになると、ステップＳ１２は、同時に何命令が命令完了したか及び分岐する命令が命令完了したかの情報をプログラムカウンタ部１１へ通知する。ステップＳ１２の後、ステップＳ１３及びステップＳ１４が同時に行われる。
【００３３】
ステップＳ１３は、分岐する命令が命令完了した場合、その情報を分岐先アドレスレジスタ１０へ通知し、処理は後述するステップＳ１５へ進む。他方、ステップＳ１４は、通知される情報に、分岐する命令が含まれているか否かを判定し、判定結果がＹＥＳであると処理はステップＳ１５へ進み、ＮＯであると処理はステップＳ１６へ進む。ステップＳ１５は、ＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝分岐先アドレスに設定する。又、ステップＳ１６は、ＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝ｎＰＣ＋（同時に命令完了した数＊４）に設定する。
【００３４】
図２にの説明に戻るに、命令フェッチ要求が命令フェッチ部２から出されると、命令フェッチ要求が要求する命令アドレスに対して、分岐予測部１で分岐予測が行われる。分岐予測部１に、命令フェッチ要求が要求する命令アドレスに該当するエントリーが存在する場合は、対応する命令フェッチデータに分岐予測が行われたことを示すフラグＢＲＨＩＳ＿ＨＩＴが付加され、分岐予測された分岐先命令アドレスの命令フェッチ要求が命令フェッチ部２へ出力される。命令フェッチデータは、命令フェッチ部２から、付加されたフラグＢＲＨＩＳ＿ＨＩＴと共に命令デコーダ部５に供給される。命令デコーダ部５で命令がデコードされ、命令が無効（Ａｎｎｕｌ）ビットを持つＢＰｒ，Ｂｉｃｃ，ＢＰｃｃ，　ＦＢｃｃ，ＦＢＰｃｃ等の分岐命令の場合は、フラグＢＲＨＩＳ＿ＨＩＴと共に無効ビットを参照する。
【００３５】
命令デコーダ部５は、フラグＢＲＨＩＳ＿ＨＩＴ＝１の場合には、無条件で後続の１命令を実行するが、フラグＢＲＨＩＳ＿ＨＩＴ＝０で無効ビット＝１の場合には、後続の１命令をＮｏｎ−Ｏｐｅｒａｔｉｏｎ命令（ＮＯＰ命令）としてデコードを行う。つまり、命令デコーダ部５は、フラグＢＲＨＩＳ＿ＨＩＴ＝１であれば通常通りにデコードを行い、デコード結果が分岐命令でフラグＢＲＨＩＳ＿ＨＩＴ＝０であり無効ビット＝１の場合は、後続の１命令をＮＯＰ命令に変える。ＳＰＡＲＣアーキテクチャでは、無効ビットを有する分岐命令は、分岐成立の場合はディレイスロット命令（遅延命令）を実行し、分岐不成立の場合で無効ビットが１の場合はディレイスロット命令を実行せず、無効ビットが０の場合のみディレイスロット命令を実行する。分岐予測を行うということは、命令が分岐命令であり、且つ、分岐成立と予測していることであるので、ディレイスロット命令を実行すると予測していることと実質的に同じである。尚、無効ビットを持たないＣＡＬＬ命令、ＪＭＰＬ命令及びＲＥＴＵＲＮ命令は、無条件分岐であり、いずれもディレイスロット命令を必ず実行することから、同じように取り扱える。ＣＯＮＤ＝１０００であるＡＬＷＡＹＳ＿ＢＲＡＮＣＨ命令については、無条件分岐であるにもかかわらず、無効ビット＝１の時はディレイスロット命令を実行しないが、このようなケースは出現頻度が少ないことから、命令再フェッチによりリカバリーすることができる。
【００３６】
分岐予測を行った場合、予測が当たった場合は再命令フェッチを行う必要はなく、予測した分岐先の命令シーケンスと実際の命令シーケンスは同じである。又、分岐予測が当たったということは、ディレイスロット命令の実行も正しく行われているということであり、この場合はそのまま命令を実行し続ける。
【００３７】
分岐予測を行い予測が外れた場合は、再命令フェッチが必要である。分岐先の命令シーケンスは、間違ったものを実行しており、実際の命令シーケンスを実行し直す必要がある。この場合、ディレイスロット命令の実行も誤っているため、ディレイスロット命令からやり直す必要がある。本実施例では、分岐命令制御部８から分岐先の再命令フェッチ要求を命令フェッチ部２に出力した後、ディレイスロットスタック部８より再実行するディレイスロット命令を取り出し、命令デコーダ部５へディレイスロット命令を供給する。これにより、ディレイスロット命令を含めて、分岐予測のリカバリーを行っている。
【００３８】
全ての分岐命令は、命令デコード部５でデコードされると、分岐命令制御部７及び命令完了制御部９にエントリーを作成する。分岐命令制御部７では、分岐命令の分岐先アドレス及び分岐条件の確定まで分岐命令を制御する。命令完了制御部９では、命令完了のための制御、即ち、命令をインオーダで完了させるための制御が行われる。
【００３９】
ＳＰＡＲＣでは、上記の如く、命令相対分岐及びレジスタ相対分岐の２種類が定義されている。命令相対分岐の分岐先アドレスは、相対分岐アドレス生成部４で生成され、レジスタ相対分岐の分岐先アドレスは、演算ユニット２３で生成される。相対分岐アドレス生成部４で生成された分岐先アドレスは、分岐命令制御部７に供給される。分岐命令制御部７は、相対分岐アドレス生成部４から分岐先アドレスＰＣＲＡＧ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］、ＣＡＲＲＹビットＰＣＲＡＧ＿ＴＧＴＰＣ＿ＣＡＲＲＹ、ＢＯＲＲＯＷビットＰＣＲＡＧ＿ＴＧＴＰＣ＿ＢＯＲＲＯＷを供給され、演算ユニット２３から分岐先アドレスＥＸＡ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］を供給される。又、演算ユニット２３は、この時ＥＸＡ＿ＴＧＴ＿ＰＣ［６３：３２，Ｐ７：Ｐ４］をプログラムカウンタ部１１に供給する。
【００４０】
分岐命令制御部７での分岐命令の制御が完了すると、分岐命令は命令完了制御部９で命令完了まで制御される。分岐命令が分岐命令制御部７から開放される時、分岐命令が分岐する場合は、分岐先アドレスが分岐先アドレスレジスタ１０に格納される。分岐先アドレスレジスタ１０に格納されている分岐先アドレスは、対応する分岐命令のサイクルＷでプログラムカウンタ部１１のネクストプログラムカウンタｎＰＣの更新に使われる。サイクルＷは、レジスタ類の更新サイクルであり、プログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣもこのサイクルＷにおいて更新される。分岐命令制御部７から分岐命令を開放する時、開放される分岐命令が分岐する時は分岐アドレスレジスタ１０のエントリーに空きがあるか否かが確認され、空きがある場合は分岐命令制御部７から開放されるが、空きがない場合は分岐命令制御部７から開放されない。しかし、分岐アドレスレジスタ１０がフル（ＦＵＬＬ）であっても、分岐命令が分岐しない場合は、分岐命令は分岐命令制御部７から開放される。
【００４１】
本実施例では、分岐命令制御部７は１０個のエントリーを持ち、分岐アドレスレジスタ１０は２個のエントリーを持っている。分岐アドレスレジスタ１０がフル（ＦＵＬＬ）であっても、分岐命令制御部７内にある後続の分岐命令の制御は、分岐命令制御部７がフル（ＦＵＬＬ）になるまで制御が止まることはない。分岐アドレスレジスタ１０のエントリーは、ＶＡＬＩＤ、分岐先アドレスＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］、ＣＡＲＲＹビットＴＧＴ＿ＰＣ＿ＣＡＲＲＹ、ＢＯＲＲＯＷビットＴＧＴ＿ＰＣ＿ＢＯＲＲＯＷ、ＩＩＤ［５：０］により構成されている。エントリーの有効性を示すＶＡＬＩＤ＝１である時は、そのエントリーが有効であることを示す。分岐する分岐命令が分岐命令制御部７から開放されると、分岐アドレスレジスタ１０にエントリーが作成され、ＶＡＬＩＤ＝１にセットされ、その分岐命令のサイクルＷまでエントリーが保持される。
【００４２】
図５は、分岐命令制御部７内のエントリーを示す概念図である。同図に示す１０個エントリーは、夫々ＶＡＬＩＤ、分岐先アドレスＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］、分岐アドレスＰＣ［３１：０，Ｐ３：Ｐ０］、ＣＡＲＲＹビット、ＢＯＲＲＯＷビット及びＩＩＤを含む。
又、図６は、分岐先アドレスレジスタ１０の概要図である。同図に示す２個のエントリーＡ、Ｂは、夫々ＶＡＬＩＤ、分岐先アドレスＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］、ＣＡＲＲＹビット、ＢＯＲＲＯＷビット及びＩＩＤを含む。
【００４３】
図７は、プログラムカウンタ部１１の構成を示すブロック図である。プログラムカウンタ部１１のプログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣの更新は、命令の完了（命令完了サイクル）後のサイクルＷにおいて同時に行われる。更新については、大きく分けて以下のケース（１）〜（４）が存在する。
（１）複数の命令が同時に命令完了し、その中に分岐する分岐命令が存在しない場合。
（２）複数の命令が同時に命令完了し、その中に分岐する分岐命令が存在する場合。
（３）命令が４Ｇバイト境界を跨いで実行される場合。
（４）命令が命令完了した時その命令で割り込みが発生した場合。
【００４４】
プログラムカウンタ部１１のプログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣの更新は、基本的にはＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝ｎＰＣ＋（同時に命令完了した数＊４）ｏｒ分岐先アドレスとなる。従って、ＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝ＰＣ＋４　ｏｒ分岐先アドレスとなる。
【００４５】
本実施例では、分岐命令の遅延命令（ディレイスロット（ＤＳＳ）命令）を、無効（ＡＮＮＵＬ）にするという事象を、無効にされるＤＳＳ命令をＮｏｎ−Ｏｐｅｒａｔｉｏｎ命令（ＮＯＰ命令）相当に置き換えることで実現している。プログラムカウンタ部１１のプログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣについても、命令を実行した時と同じように更新を行う。従って、分岐しない分岐命令が命令完了する場合と、同時に命令完了する命令群の中に分岐命令が含まれていない場合（上記ケース（１）の場合）には、プログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣの更新はＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４、ｎＰＣ＝ＰＣ＋４となる。ＤＳＳ命令が無効にされた時、ＮＯＰ命令に置き換えたＤＳＳ命令の命令完了時に割り込みを許すと、プロセッサ外にＤＳＳ命令終了時のプログラムカウンタＰＣの値が見えてしまう。このようなＮＯＰ命令に置き換えたＤＳＳ命令は、実際には実行されない命令であるため、ＰＣ＝（ＮＯＰ命令に置き換えたＤＳＳ命令の命令アドレス）となっていると、割り込みから復帰した場合に実行命令列を誤る。そこで、これを防ぐため、本実施例では、このような場合にプログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣの値をＤＳＳ命令分（４バイト）更に更新するようにする。
【００４６】
分岐する分岐命令が、複数の命令と同時に命令完了する場合、分岐命令は、それ以前の命令と同時に命令完了することはできるが、後続の命令とは同時に命令完了することができない。即ち、分岐する分岐命令が命令完了する場合は、必ず同時に命令完了する命令群の最後の命令となるため、ＰＣ＝（ＤＳＳ命令の命令アドレス）、ｎＰＣ＝（分岐の分岐先アドレス）となる（上記ケース（２）の場合）。
【００４７】
本実施例では、分岐する分岐命令の命令完了時に制約を設けることで、プログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣの更新回路１１−２，１１−３を簡素化しているが、プログラムカウンタＰＣの更新回路１１−２に対して、分岐する分岐命令の後続命令が何命令同時に命令完了したかを通知することで、ＰＣ＝ＴＧＴ＿ＰＣ＋（同時に命令完了した分岐命令の後続命令数＊４）、ｎＰＣ＝ＰＣ＋４になり、命令完了時の制約は不要となる。
【００４８】
分岐する分岐命令のＴＧＴ＿ＰＣは、分岐先アドレスレジスタ１０からネクストプログラムカウンタｎＰＣにサイクルＷにおいてセットされる。分岐する分岐命令が命令完了すると、そのサイクルＷにその命令の命令番号（Ｉｎｓｔｒｕｃｔｉｏｎ　ＩＤ：ＩＩＤ）が命令完了制御部９から供給され、分岐先アドレスレジスタ１０にある同じＩＩＤを持つエントリーから、ネクストプログラムカウンタｎＰＣに対してＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］がセットされる。このようにネクストプログラムカウンタｎＰＣにセットすると同時に、分岐先アドレスレジスタ１０のエントリーは開放され、分岐先アドレスレジスタ１０には新たなエントリーをセットすることが可能となる。
【００４９】
分岐命令が命令完了し、その分岐命令が分岐し、分岐先のアドレスが４Ｇバイト境界を跨いでいる場合の動作は、次のようになる。プログラムカウンタＰＣはＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４で求められるため、特別な制御は必要としない。ネクストプログラムカウンタｎＰＣは、ｎＰＣ＝（分岐先アドレス）となるため、分岐先アドレスレジスタ１０からセットされるが、分岐先アドレスレジスタ１０は、下位３２ビット（＋４ＰＡＲＩＴＹ）しかアドレスを保持していない。このため、命令完了した分岐命令が、命令相対分岐である場合は、分岐先アドレスレジスタ１０に保持してあるＴＧＴ＿ＰＣ＿ＣＡＲＲＹ、ＴＧＴ＿ＰＣ＿ＢＯＲＲＯＷに基づいて、上位３２ビット（＋４ＰＡＲＩＴＹ）が生成される。分岐先アドレスが４Ｇバイト境界を跨ぐか否かは、ＴＧＴ＿ＰＣ＿ＣＡＲＲＹ、ＴＧＴ＿ＰＣ＿ＢＯＲＲＯＷのいずれかが「１」であるか否かで判断できる。尚、ＴＧＴ＿ＰＣ＿ＣＡＲＲＹ、ＴＧＴ＿ＰＣ＿ＢＯＲＲＯＷが同時に「１」になることはない。
【００５０】
レジスタ相対分岐の場合、分岐先アドレスは、演算ユニット２３で生成される。下位３２ビット（＋４ＰＡＲＩＴＹ）については、分岐先アドレスレジスタ１０より得られる。上位３２ビット（＋４ＰＡＲＩＴＹ）については、演算ユニット２３での分岐先アドレス生成後、分岐命令制御部７に下位３２ビット（＋４ＰＡＲＩＴＹ）が供給されると同時に、プログラムカウンタ部１１に上位３２ビット（＋４ＰＡＲＩＴＹ）が供給される。この際、演算ユニット２３から分岐先アドレスを生成した分岐命令のＩＩＤ［５：０］が、分岐先アドレスと同時に、分岐命令制御部７及びプログラムカウンタ部１１に供給される。プログラムカウンタ部１１では、分岐先アドレスの上位３２ビット（＋４ＰＡＲＩＴＹ）及びその時のＩＩＤ［５：０］を保持する。本実施例では、プログラムカウンタ部１１に、１命令分保持するためのＡＤＲＳ＿ＨＯＬＤラッチ回路１１−１が設けられている。この時、供給されてくる分岐先アドレスの上位３２ビットとプログラムカウンタＰＣの上位３２ビットとが比較され、一致しない場合には４Ｇバイト境界を跨ぐと判断し、信号＋ＪＭＰＬ＿ＲＥＴＵＲＮ＿ＴＧＴ＿ＥＱ＿ＰＣ＿ＨＩＧＨ＝０となる。
【００５１】
レジスタ相対分岐が分岐して命令完了した場合、命令完了した命令のＩＩＤがプログラムカウンタ部１１で保持しているＡＤＲＳ＿ＨＯＬＤラッチ回路１１−１のＩＩＤと一致すると、上位３２ビット（＋４ＰＡＲＩＴＹ）は、このプログラムカウンタ部１１にあるＡＤＲＳ＿ＨＯＬＤラッチ回路１１−１よりセットされる。レジスタ相対分岐が分岐する場合は、分岐先アドレスが４Ｇバイト境界を跨ぐか否かに関わらず、上位３２ビット（＋４ＰＡＲＩＴＹ）はＡＤＲＳ＿ＨＯＬＤラッチ回路１１−１から、下位３２ビット（＋４ＰＡＲＩＴＹ）は分岐先アドレスレジスタ１０からネクストプログラムカウンタｎＰＣにセットされることになる。ただし、分岐先アドレスが４Ｇバイト境界を跨ぐ場合は、信号＋ＪＭＰＬ＿ＲＥＴＵＲＮ＿ＴＧＴ＿ＥＱ＿ＰＣ＿ＨＩＧＨ＝０となる。
【００５２】
命令列が４Ｇバイト境界を跨いで実行される場合、命令フェッチ部２は、命令フェッチアドレスの上位３２ビットについて、境界直前の値で命令フェッチを行っているため、境界直前の命令が完了した時点で命令フェッチをやり直す必要がある。これは、命令アドレスの上位３２ビットの値が、境界直前の命令と境界直後の命令では異なるためである。従って、本実施例では、境界直前の命令が完了した後、プログラムカウンタ部１１から命令再フェッチ要求ＲＥＩＦＣＨが命令フェッチ部２に供給される。この時、プログラムカウンタＰＣの値は、境界直後の命令アドレスに更新されているので、命令フェッチ部２は、プログラムカウンタＰＣの値から命令フェッチを再開する。
【００５３】
命令完了時に割り込みが発生し、割り込み処理を終えた後、命令制御装置が再スタートした場合、ｎＰＣ≠ＰＣ＋４となっている状態が発生することがある。この場合、プログラムカウンタ部１１から命令再フェッチ要求ＲＥＩＦＣＨが命令フェッチ部２に供給されるが、この時の要求アドレスは、プログラムカウンタＰＣが指すアドレスとなるものの、その次に実行しなければならない命令は、ネクストプログラムカウンタｎＰＣが指すアドレスの命令である。従って、この場合、一度プログラムカウンタＰが指すアドレスで命令フェッチが行われ、１命令（プログラムカウンタＰＣが指していたアドレスの命令）完了すると、プログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣを更新した後、再度、命令再フェッチ要求ＲＥＩＦＣＨが命令フェッチ部２に供給される。これは、命令フェッチ部２は、プログラムカウンタ部１１から命令再フェッチ要求ＲＥＩＦＣＨがあると、プログラムカウンタＰＣが指すアドレスで命令フェッチを行い、その後続の命令を供給しようとするからである。
【００５４】
分岐命令のディレイスロット命令が無効にされた場合、ディレイスロット命令は、ＮＯＰ命令扱いにして命令制御を行うが、この無効にされたディレイスロット命令の直前の分岐命令完了時に割り込みが発生した場合には、ＰＣ＝（無効にされたディレイスロット命令のアドレス）、ｎＰＣ＝（実際に分岐命令の次に実行されるべき命令のアドレス）となってしまう。この状態で、割り込み処理を行い再スタートさせると、実際には実行してはいけない無効にされたディレイスロット命令からスタートしてしまう。そこで、本実施例では、分岐命令完了時に割り込みが発生した場合、後続のディレイスロット命令を無効にする場合は信号＋ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲ＝１とし、この信号がＯＮの場合に割り込みが発生した場合には一度プログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣを更新した後、割り込み処理中にＰＣ＝ｎＰＣ、ｎＰＣ＝ｎＰＣ＋４と再度プログラムカウンタＰＣ及びネクスト付グラムカウンタｎＰＣを更新している。
【００５５】
次に、分岐命令制御部７の構成について、図８〜図１１と共に説明する。図８〜図１１は、分岐命令制御部７内の要部の論理回路図である。
【００５６】
図８において、アンド回路１７１〜１７２及びオア回路１７４は、分岐命令制御部７で分岐する分岐命令が少なくとも１つ制御完了した時に「１」になる信号＋ＲＳＢＲ＿ＣＯＭＰＬＥＴＥ＿ＴＡＫＥＮ＿ＲＥＬＥＡＳＥを生成する。アンド回路１７１には、分岐命令制御部７の０番のエントリーにある分岐命令の制御完了時に「１」となる信号＋ＲＳＢＲ０＿ＣＯＭＰＬＥＴＥと、分岐命令制御部７の０番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ０＿ＴＡＫＥＮとが入力される。同様にして、アンド回路１７２には、分岐命令制御部７の１番のエントリーにある分岐命令の制御完了時に「１」となる信号＋ＲＳＢＲ１＿ＣＯＭＰＬＥＴＥと、分岐命令制御部７の１番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ１＿ＴＡＫＥＮとが入力され、アンド回路１７３には、分岐命令制御部７の２番のエントリーにある分岐命令の制御完了時に「１」となる信号＋ＲＳＢＲ２＿ＣＯＭＰＬＥＴＥと、分岐命令制御部７の２番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ２＿ＴＡＫＥＮとが入力される。オア回路１７４には、アンド回路１７１〜１７３の出力が入力される。
【００５７】
エクスクルシブノア（排他的否定論理和）回路２７１及びアンド回路２７２，２７３は、分岐命令制御部７内にある分岐先アドレスレジスタ１０内のエントリＡに保持されている分岐命令のＩＩＤと分岐する分岐命令が命令完了した時のその分岐命令のＩＩＤとを比較する。エクスクルシブノア回路２７１には、分岐命令制御部７（又はプログラムカウンタ部１１）内で分岐する分岐命令が命令完了した時のその分岐命令のＩＩＤを示す信号＋ＣＯＭＩＴ＿ＴＡＫＥＮ＿ＩＩＤ［５：０］と、分岐命令制御部７内にある分岐先アドレスレジスタ１０のエントリーＡに保持されている分岐命令のＩＩＤを示す信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＩＩＤ［５：０］とが入力される。信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＩＩＤ［５：０］は、後述する信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＩＩＤ［５：０］と同等である。アンド回路２７２には、分岐先アドレスレジスタ１０よりネクストプログラムカウンタに値をセットする必要がある時に「１」になる信号＋ＬＯＡＤ＿ＴＧＴ＿ＴＯ＿ＮＰＣと、分岐先アドレスレジスタ１０内のエントリーＡが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤとが入力される。アンド回路２７３は、エクスクルシブノア回路２７１及びアンド回路２７２の出力が入力される。
【００５８】
エクスクルシブノア回路２７４及びアンド回路２７５，２７６は、分岐命令制御部７内にある分岐先アドレスレジスタ１０内のエントリＢに保持されている分岐命令のＩＩＤと分岐する分岐命令が命令完了した時のその分岐命令のＩＩＤとを比較する。エクスクルシブノア回路２７４には、分岐命令制御部７（又はプログラムカウンタ部１１）内で分岐する分岐命令が命令完了した時のその分岐命令のＩＩＤを示す信号＋ＣＯＭＩＴ＿ＴＡＫＥＮ＿ＩＩＤ［５：０］と、分岐命令制御部７内にある分岐先アドレスレジスタ１０のエントリーＢに保持されている分岐命令のＩＩＤを示す信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＩＩＤ［５：０］とが入力される。信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＩＩＤ［５：０］は、後述する信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＩＩＤ［５：０］と同等である。アンド回路２７５には、分岐先アドレスレジスタ１０よりネクストプログラムカウンタに値をセットする必要がある時に「１」になる信号＋ＬＯＡＤ＿ＴＧＴ＿ＴＯ＿ＮＰＣと、分岐先アドレスレジスタ１０内のエントリーＢが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤとが入力される。アンド回路２７６は、エクスクルシブノア回路２７４及びアンド回路２７５の出力が入力される。
【００５９】
図９において、アンド回路２７７は、分岐先アドレスレジスタ１０のエントリーＡを開放する時に「１」となる信号−ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＲＥＬ及び分岐先アドレスレジスタ１０内のエントリーＡが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤに基づいて、分岐先アドレスレジスタ１０のエントリーＡに対するクロックイネーブル信号＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａを生成する。アンド回路２７８は、分岐先アドレスレジスタ１０のエントリーＢを開放する時に「１」となる信号−ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＲＥＬ及び分岐先アドレスレジスタ１０内のエントリーＢが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤに基づいて、分岐先アドレスレジスタ１０のエントリーＢに対するクロックイネーブル信号＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂを生成する。
【００６０】
ナンド回路３７１は、分岐命令制御部７の０番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ０＿ＴＡＫＥＮ、分岐先アドレスレジスタ１０内のエントリーＡが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤ、分岐先アドレスレジスタ１０内のエントリーＢが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤ及び分岐する分岐命令が命令完了したことを示す信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮに基づいて、分岐命令制御部７内の０番目のエントリーの分岐命令が分岐する分岐命令である時に分岐先アドレスレジスタ１０にエントリーの空きがないことを示す信号−ＲＳＢＲ０＿ＴＧＴ＿ＢＵＦＦ＿ＢＵＳＹを生成する。信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮは、サイクルＷにおける信号であり、分岐する分岐命令の命令完了＋１τのサイクルで「１」となる。
【００６１】
ナンド回路３７２は、分岐命令制御部７の１番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ１＿ＴＡＫＥＮ、分岐先アドレスレジスタ１０内のエントリーＡが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤ、分岐先アドレスレジスタ１０内のエントリーＢが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤ及び分岐する分岐命令が命令完了したことを示す信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮに基づいて、分岐命令制御部７内の１番目のエントリーの分岐命令が分岐する分岐命令である時に分岐先アドレスレジスタ１０にエントリーの空きがないことを示す信号−ＲＳＢＲ１＿ＴＧＴ＿ＢＵＦＦ＿ＢＵＳＹを生成する。信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮは、サイクルＷにおける信号であり、分岐する分岐命令の命令完了＋１τのサイクルで「１」となる。
【００６２】
ナンド回路３７１は、分岐命令制御部７の２番のエントリーにある分岐命令の分岐確定時に「１」となる信号＋ＲＳＢＲ２＿ＴＡＫＥＮ、分岐先アドレスレジスタ１０内のエントリーＡが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤ、分岐先アドレスレジスタ１０内のエントリーＢが有効である時に「１」となる信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤ及び分岐する分岐命令が命令完了したことを示す信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮに基づいて、分岐命令制御部７内の２番目のエントリーの分岐命令が分岐する分岐命令である時に分岐先アドレスレジスタ１０にエントリーの空きがないことを示す信号−ＲＳＢＲ２＿ＴＧＴ＿ＢＵＦＦ＿ＢＵＳＹを生成する。信号＋Ｗ＿ＣＯＭＭＩＴ＿ＢＲ＿ＴＡＫＥＮは、サイクルＷにおける信号であり、分岐する分岐命令の命令完了＋１τのサイクルで「１」となる。
【００６３】
図１０において、ラッチ回路３７４のセット端子ＳＥＴには信号＋ＲＳＢＲ＿ＣＯＭＰＬＥＴＥ＿ＴＡＫＥＮ＿ＲＥＬＥＡＳＥが入力され、入力端子ＩＮＨＳには実行パイプライン上にある全命令をクリアすることを示す信号−ＣＬＥＡＲ＿ＰＩＰＥＬＩＮＥが入力される。ノア回路３７５には信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＲＥＬ及び信号＋ＣＬＥＡＲ＿ＰＩＰＥＬＩＮＥが入力され、ノア回路３７５の出力はラッチ回路３７４のリセット端子ＲＳＴに入力される。ラッチ回路３７４は、上記信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＶＡＬＩＤを生成する。
【００６４】
ラッチ回路３７６のセット端子ＳＥＴには、信号＋ＲＳＢＲ＿ＣＯＭＰＬＥＴＥ＿ＴＡＫＥＮ＿ＲＥＬＥＡＳＥ及びクロックイネーブル信号＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａが入力されるアンド回路３７７の出力が入力される。ラッチ回路３７６の入力端子ＩＮＨＳには、実行パイプライン上にある全命令をクリアすることを示す信号−ＣＬＥＡＲ＿ＰＩＰＥＬＩＮＥが入力される。ノア回路３７８には信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＲＥＬ及び信号＋ＣＬＥＡＲ＿ＰＩＰＥＬＩＮＥが入力され、ノア回路３７８の出力はラッチ回路３７６のリセット端子ＲＳＴに入力される。ラッチ回路３７６は、上記信号＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＶＡＬＩＤを生成する。
【００６５】
図１１において、ラッチ回路４７１には信号＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＩＩＤ［５：０］、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＣＡＲＲＹ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＢＯＲＲＯＷ及び＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］が入力され、信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＩＩＤ［５：０］、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＯＶＦ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＵＤＦ及び＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ［３１：０，Ｐ３：Ｐ０］が出力される。＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａは、分岐先アドレスレジスタ１０のエントリーＡのクロックイネーブル信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＩＩＤ［５：０］は、分岐命令制御部７から開放した（分岐命令の制御完了時の）分岐命令のＩＩＤ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＣＡＲＲＹは、分岐命令制御部７から開放した分岐命令の分岐先アドレスでＣＡＲＲＹが発生した場合に「１」となる信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＢＯＲＲＯＷは、分岐命令制御部７から開放した分岐命令の分岐先アドレスでＢＯＲＲＯＷが発生した場合に「１」となる信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］は、分岐命令制御部７から開放した分岐命令の分岐先アドレスである。＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＩＩＤ［５：０］は、分岐先アドレスレジスタ１０のエントリーＡに保持されている分岐命令のＩＩＤ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＯＶＦは、分岐先アドレスレジスタ１０のエントリーＡに保持されている分岐命令のＣＡＲＲＹビット、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＵＤＦは、分岐先アドレスレジスタ１０のエントリーＡに保持されている分岐命令のＢＯＲＲＯＷビット、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ［３１：０，Ｐ３：Ｐ０］は、分岐先アドレスレジスタ１０のエントリーＡに保持されている分岐命令の分岐先アドレスである。
【００６６】
ラッチ回路４７２には信号＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＩＩＤ［５：０］、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＣＡＲＲＹ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＢＯＲＲＯＷ及び＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］が入力され、信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＩＩＤ［５：０］、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＯＶＦ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＵＤＦ及び＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ［３１：０，Ｐ３：Ｐ０］が出力される。＋ＨＯＬＤ＿ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂは、分岐先アドレスレジスタ１０のエントリーＢのクロックイネーブル信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＩＩＤ［５：０］は、分岐命令制御部７から開放した（分岐命令の制御完了時の）分岐命令のＩＩＤ、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＣＡＲＲＹは、分岐命令制御部７から開放した分岐命令の分岐先アドレスでＣＡＲＲＹが発生した場合に「１」となる信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＢＯＲＲＯＷは、分岐命令制御部７から開放した分岐命令の分岐先アドレスでＢＯＲＲＯＷが発生した場合に「１」となる信号、＋ＣＯＭＰＬＥＴＥ＿ＲＳＢＲ＿ＴＧＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］は、分岐命令制御部７から開放した分岐命令の分岐先アドレスである。＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＩＩＤ［５：０］は、分岐先アドレスレジスタ１０のエントリーＢに保持されている分岐命令のＩＩＤ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＯＶＦは、分岐先アドレスレジスタ１０のエントリーＢに保持されている分岐命令のＣＡＲＲＹビット、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＵＤＦは、分岐先アドレスレジスタ１０のエントリーＢに保持されている分岐命令のＢＯＲＲＯＷビット、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ［３１：０，Ｐ３：Ｐ０］は、分岐先アドレスレジスタ１０のエントリーＢに保持されている分岐命令の分岐先アドレスである。
【００６７】
次に、命令完了制御部９の構成について、図１２及び図１３と共に説明する。図１２及び図１３は、命令完了制御部９内の要部の論理回路図である。
【００６８】
図１２において、アンド回路９１には、１番目に命令完了したのが分岐命令であり後続の遅延命令を無効にする場合に「１」となる信号＋ＴＯＱ＿ＣＳＥ＿ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ、少なくとも１つの命令が完了したことを示す信号＋ＣＯＭＭＩＴ＿ＴＯＱ＿ＣＳＥ、少なくとも２つの命令が完了したことを示す信号−ＣＯＭＭＩＴ＿２ＮＤ＿ＣＳＥ、最初に命令完了する命令が命令の再実行（ＲＥＲＵＮ）を行う場合に「１」となる信号−ＴＯＱ＿ＲＥＲＵＮ＿ＲＥＩＦＣＨ＿ＯＷＮ＿ＯＲが入力される。アンド回路９２には、２番目に命令完了したのが分岐命令であり後続の遅延命令を無効にする場合に「１」となる信号＋２ＮＤ＿ＣＳＥ＿ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ、少なくとも２つの命令が完了したことを示す信号＋ＣＯＭＭＩＴ＿２ＮＤ＿ＣＳＥ、少なくとも３つの命令が完了したことを示す信号−ＣＯＭＭＩＴ＿３ＲＤ＿ＣＳＥが入力される。アンド回路９３には、３番目に命令完了したのが分岐命令であり後続の遅延命令を無効にする場合に「１」となる信号＋３ＲＤ＿ＣＳＥ＿ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ、少なくとも３つの命令が完了したことを示す信号＋ＣＯＭＭＩＴ＿３ＲＤ＿ＣＳＥ、少なくとも４つの命令が完了したことを示す信号−ＣＯＭＭＩＴ＿４ＴＨ＿ＣＳＥが入力される。アンド回路９４には、４番目に命令完了したのが分岐命令であり後続の遅延命令を無効にする場合に「１」となる信号＋４ＴＨ＿ＣＳＥ＿ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ、少なくとも４つの命令が完了したことを示す信号＋ＣＯＭＭＩＴ＿４ＴＨ＿ＣＳＥが入力される。ノア回路９５は、アンド回路９１〜９４の出力を入力される。
【００６９】
アンド回路９６には、割り込み処理が発生した時に「１」となる信号−ＲＳ１、次に最初に完了する命令がＮＯＰ化された遅延命令であることを示す信号＋ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲが入力され、ナンド回路９７には、少なくとも１つの命令が完了したことを示す信号−ＣＯＭＭＩＴ＿ＴＯＱ＿ＣＳＥ及びアンド回路９６の出力が入力される。アンド回路９８には、ノア回路９５の出力及びナンド回路９７の出力が入力される。ラッチ回路９９は、入力端子１Ｈに演算ユニット２３等で例外が発生した時に「１」となる信号＋ＥＵ＿ＸＣＰＴＮ＿ＯＲを入力され、セット端子ＳＥＴにアンド回路９８の出力を入力され、次に最初に完了する命令がＮＯＰ化された遅延命令であることを示す信号−ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲを出力する。
【００７０】
図１３において、ナンド回路１９１には、トラップ処理を行う命令が命令完了したことを示すサイクルＷの信号＋Ｗ＿ＴＲＡＰ＿ＶＡＬＩＤ、命令が少なくとも１つ完了したことを示す信号＋ＣＯＭＭＩＴ＿ＥＮＤＯＰ＿ＯＲが入力される。アンド回路１９２には、ナンド回路１９１の出力及び信号＋ＢＲ＿ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲ＝１の時に非同期の割り込み（外部割り込み）が発生すると「１」となる信号＋ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲ、割り込み処理が発生した時に「１」となる信号−ＲＳ１が入力される。アンド回路１９２の出力は、ラッチ回路１９３のセット端子ＳＥＴに入力される。ラッチ回路１９３は、信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲを出力する。信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲは、分岐命令が命令完了し、ディレイスロット命令が命令完了するまでの間が延びた時にディレイスロット命令が無効化（ＮＯＰ化）されている場合において割り込み処理が発生した時にプログラムカウンタＰＣ及びネクストプログラムカウンタｎＰＣをディレイスロット命令分（４バイト）更新しなければならない時に「１」となる信号である。つまり、信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲは、信号＋ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲの１τ後に立ち上がる、サイクルＷ＋１より有効となる信号である。
【００７１】
次に、プログラムカウンタ部１１内のｎＰＣ用更新回路１１−３について、図１４〜図１８と共に説明する。図１４〜図１８は、プログラムカウンタ部１１内のｎＰＣ用更新回路１１−３の論理回路図である。
【００７２】
図１４において、インクリメンタ１１１は、信号＋ＰＣ［５３：３２，Ｐ７：Ｐ４］、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＯＶＦ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ＿ＵＤＦを入力され、信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ａ［６３：３２，Ｐ７：Ｐ４］を出力する。信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ａ［６３：３２，Ｐ７：Ｐ４］は、分岐先アドレスレジスタ１０のエントリーＡでＣＡＲＲＹビット又はＢＯＲＲＯＷビットが「１」の時のハイ側の分岐先アドレスを示す。インクリメンタ１１２は、信号＋ＰＣ［５３：３２，Ｐ７：Ｐ４］、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＯＶＦ、＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ＿ＵＤＦを入力され、信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ｂ［６３：３２，Ｐ７：Ｐ４］を出力する。信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ｂ［６３：３２，Ｐ７：Ｐ４］は、分岐先アドレスレジスタ１０のエントリーＢでＣＡＲＲＹビット又はＢＯＲＲＯＷビットが「１」の時のハイ側の分岐先アドレスを示す。
【００７３】
図１５において、アンド回路１１３には信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ａ［６３：３２，Ｐ７：Ｐ４］、＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＲＥＬが入力され、アンド回路１１４には信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ＿Ｂ［６３：３２，Ｐ７：Ｐ４］、＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＲＥＬが入力される。オア回路１１５は、アンド回路１１３，１１４の出力に基づいて信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］を出力する。信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］は、分岐先アドレスレジスタ１０からネクストプログラムカウンタｎＰＣにセットするハイ側の分岐先アドレスを示す。
【００７４】
アンド回路１１６には信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ａ［３１：０，Ｐ３：Ｐ０］、＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ａ＿ＲＥＬが入力され、アンド回路１１７には信号＋ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＢＵＦＦＥＲ＿Ｂ［３１：０，Ｐ３：Ｐ０］、＋ＲＳＢＲ＿ＴＧＴ＿ＢＵＦＦ＿Ｂ＿ＲＥＬが入力される。オア回路１１８は、アンド回路１１６，１１７の出力に基づいて信号＋ＳＥＬＥＣＴＥＤ＿ＴＧＴ＿ＡＤＲＳ＿ＢＵＦＦ［３１：０，Ｐ３：Ｐ０］を出力する。信号＋ＳＥＬＥＣＴＥＤ＿ＴＧＴ＿ＡＤＲＳ＿ＢＵＦＦ［３１：０，Ｐ３：Ｐ０］は、分岐先アドレスレジスタ１０からネクストプログラムカウンタｎＰＣにセットするロー側の分岐先アドレスを示す。
【００７５】
図１６において、インクリメンタ２１１は、信号＋ＮＰＣ［６３：０，Ｐ７：Ｐ０］、＋ＮＰＣ＿ＩＮＣＲＥＭＥＮＴ［３：０］、＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲを入力され、信号＋ＩＮＣＲ＿ＮＰＣ［６３：０，Ｐ７：Ｐ０］を出力する。信号＋ＮＰＣ＿ＩＮＣＲＥＭＥＮＴ［３：０］は、いくつの命令が同時に命令完了したかを示す。例えば、ビット３が「１」であると４命令が同時に命令完了したことを示し、ビット２が「１」であると３命令が同時に命令完了したことを示す。信号＋ＩＮＣＲ＿ＮＰＣ［６３：０，Ｐ７：Ｐ０］は、＋ＦＯＲＣＥ＿ＮＯＰ＿ＴＧＲ＝１の時はｎＰＣ＋４なる演算を行うことを示す。又、アンド回路２１２には信号＋ＣＯＭＭＩＴ＿ＵＰＤＡＴＥ＿ＰＣ、−ＲＳ１が入力される。信号＋ＣＯＭＭＩＴ＿ＵＰＤＡＴＥ＿ＰＣは、プログラムカウンタＰＣ又はネクストプログラムカウンタｎＰＣの更新が必要であることを示す。ノア回路２１３には、アンド回路２１２の出力及び信号＋ＴＲＡＰ＿ＳＷ１、＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲが入力される。ノア回路２１３の出力は、ネクストプログラムカウンタｎＰＣのクロックイネーブル信号−ＣＥ＿ＮＰＣ及びプログラムカウンタＰＣのクロックイネーブル信号−ＣＥ＿ＰＣとして使用される。
【００７６】
図１７において、アンド回路２１４には信号＋ＣＯＭＭＩＴ＿ＵＰＤＡＴＥ＿ＰＣ、−ＢＲＴＫＮ＿ＥＱ＿ＪＵＭＰＬ＿ＨＯＬＤ＿ＶＡＬＩＤ、−ＬＯＡＤ＿ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣが入力される。信号−ＢＲＴＫＮ＿ＥＱ＿ＪＵＭＰＬ＿ＨＯＬＤ＿ＶＡＬＩＤは、命令完了したレジスタ相対の分岐命令の分岐アドレスのハイ側がオール０（Ａｌｌ０）でなくラッチ回路１１−１に保持されている時に「１」となる信号である。オア回路２１５には、アンド回路２１４の出力及び信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲが入力される。アンド回路２１６には、オア回路２１５の出力信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＬＯＷ及び信号−ＰＳＴＡＴＥ＿ＡＭが入力される。信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＬＯＷは、ネクストプログラムカウンタｎＰＣのロー側へセットする際に信号＋ＩＮＣＲ＿ＮＰＣを選択する時に「１」となる信号である。信号−ＰＳＴＡＴＥ＿ＡＭは、「１」の時に３２ビットアドレスモードを示す信号である。アンド回路２１６は、信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨを出力する。信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨは、ネクストプログラムカウンタｎＰＣのハイ側へセットする際に信号＋ＩＮＣＲ＿ＮＰＣを選択する時に「１」となる信号である。
【００７７】
アンド回路２１７には信号−ＢＲＴＫＮ＿ＥＱ＿ＪＵＭＰＬ＿ＨＯＬＤ＿ＶＡＬＩＤ、＋ＬＯＡＤ＿ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣが入力される。オア回路２１８には、アンド回路２１７の出力及び信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲが入力される。アンド回路２１９には、オア回路２１８の出力及び信号−ＰＳＴＡＴＥ＿ＡＭが入力される。アンド回路２１９は、信号＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨを出力する。信号＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨは、ネクストプログラムカウンタｎＰＣのハイ側へセットする際に信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳを選択する時に「１」となる信号である。又、バッファ３１１は、信号＋ＬＯＡＤ＿ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣに基づいて信号＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＬＯＷを出力する。信号＋ＬＯＡＤ＿ＴＡＲＧＥＴ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣは、ネクストプログラムカウンタｎＰＣに分岐先アドレスレジスタ１０から値をセットしなければならない時に「１」となる信号である。信号＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＬＯＷは、ネクストプログラムカウンタｎＰＣのハイ側へセットする際に信号＋ＳＥＬＥＣＴＥＤ＿ＴＧＴ＿ＡＤＲＳ＿ＢＵＦＦを選択する時に「１」となる信号である。アンド回路３１２は、信号＋ＢＲＴＫＮ＿ＥＱ＿ＪＵＭＰＬ＿ＨＯＬＤ＿ＴＧＲ、−ＰＳＴＡＴＥ＿ＡＭに基づいて信号＋ＳＥＬ＿ＪＵＭＰＬ＿ＡＨ＿ＴＯ＿ＮＰＣを出力する。信号＋ＳＥＬ＿ＪＵＭＰＬ＿ＡＨ＿ＴＯ＿ＮＰＣは、ネクストプログラムカウンタｎＰＣのハイ側へセットする際にラッチ回路１１−１からの値（＋ＪＭＰＬ＿ＡＤＲＳ＿ＨＯＬＤ）を選択する時に「１」となる信号である。
【００７８】
図１８において、アンド回路４１１は信号＋ＩＮＣＲ＿ＮＰＣ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨを入力され、アンド回路４１２は信号＋ＭＯＤ＿ＰＣ＿ＦＯＲ＿ＴＧＴ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＨＩＧＨを入力される。アンド回路４１３は信号＋ＪＵＭＰＬ＿ＡＤＲＤ＿ＨＯＬＤ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＪＵＭＰＬ＿ＡＨ＿ＴＯ＿ＮＰＣを入力され、アンド回路４１４は信号＋ＴＲＡＰ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣを入力される。信号＋ＴＲＡＰ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］は、ＳＰＡＲＣアーキテクチャで定義されており、トラップが発生した場合（＋Ｗ＿ＴＲＡＰ＿ＶＡＬＩＤ＝１）に専用のトラップ（ＴＲＡＰ）アドレスを選択する信号である。信号＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣは、トラップが発生した場合に信号＋ＴＲＡＰ＿ＡＤＲＳを選択する時に「１」となる信号である。オア回路４１５は、アンド回路４１１〜４１４の出力に基づいて、ネクストプログラムカウンタｎＰＣのセット信号＋ＳＥＴ＿ＮＰＣ［６３：３２，Ｐ７：Ｐ４］を出力する。アンド回路４１６は信号＋ＩＮＣＲ＿ＮＰＣ［３１：０，Ｐ３：Ｐ０］、＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＮＰＣ＿ＬＯＷを入力され、アンド回路４１７は信号＋ＳＥＬＥＣＴＥＤ＿ＴＧＴ＿ＡＤＲＳ＿ＢＵＦＦ［３１：０，Ｐ３：Ｐ０］、＋ＳＥＬ＿ＴＡＲＧＥＴ＿ＴＯ＿ＮＰＣ＿ＬＯＷを入力され、アンド回路４１８は信号＋ＴＲＡＰ＿ＡＤＲＳ［３１：０，Ｐ３：Ｐ０］、＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＮＰＣを入力される。オア回路４１９は、アンド回路４１６〜４１８の出力に基づいて信号＋ＳＥＴ＿ＮＰＣ［３１：０，Ｐ３：Ｐ０］を出力する。
【００７９】
次に、プログラムカウンタ部１１内のＰＣ用更新回路１１−２について、図１９及び図２０と共に説明する。図１９及び図２０は、プログラムカウンタ部１１内のＰＣ用更新回路１１−２の論理回路図である。
【００８０】
図１９において、オア回路５１１には信号＋ＣＯＭＭＩＴ＿ＵＰＤＡＴＥ＿ＰＣ、＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲが入力される。アンド回路５１２には、オア回路５１１の出力信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＬＯＷ及び信号−ＰＳＴＡＴＥ＿ＡＭが入力される。信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＬＯＷは、プログラムカウンタＰＣのロー側へセットする際に信号＋ＩＮＣＲ＿ＰＣを選択する時に「１」となる信号である。信号＋ＩＮＣＲ＿ＰＣは、図１６に示す信号＋ＩＮＣＲＲ＿ＮＰＣと同様に、＋ＮＰＣ＿ＩＮＣＲＥＭＥＮＴ≠０の場合は（ＩＮＣＲ＿ＰＣ＝）ＰＣ＝ｎＰＣ＋（同時に命令完了した数−１）＊４が計算されることを示し、＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＲＧ＝１の場合は（ＩＮＣＲ＿ＰＣ＝）ＰＣ＝ｎＰＣとなる。信号＋ＮＰＣ＿ＩＮＣＲＥＭＥＮＴと信号＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲは、同時に有効にはならない。アンド回路５１２は、信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＨＩＧＨを出力する。信号＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＨＩＧＨは、プログラムカウンタＰＣのハイ側へセットする際に信号＋ＩＮＣＲ＿ＰＣを選択する時に「１」となる信号である。又、インクリメンタ５１３は、上記信号＋ＰＣ［６３：０，Ｐ７：Ｐ０］、＋ＮＰＣ＿ＩＮＣＲＥＭＥＮＴ［３：０］、＋ＦＯＲＣＥ＿ＰＣ＿ＩＮＣＲ＿ＴＧＲを入力され、信号＋ＩＮＣＲ＿ＰＣ［６３：０，Ｐ７：Ｐ０］を出力する。
【００８１】
図２０において、アンド回路６１１には信号＋ＩＮＣＲ＿ＰＣ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＨＩＧＨが入力され、アンド回路６１２には信号＋ＴＲＡＰ＿ＡＤＲＳ［６３：３２，Ｐ７：Ｐ４］、＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＰＣが入力される。信号＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＰＣは、トラップが発生した場合に信号＋ＴＲＡＰ＿ＡＤＲＳを選択する時に「１」となる信号である。オア回路６１３は、アンド回路６１１，６１２の出力に基づいて、プログラムカウンタＰＣのセット信号＋ＳＥＴ＿ＰＣ［６３：３２，Ｐ７：Ｐ４］を出力する。アンド回路６１４には信号＋ＩＮＣＲ＿ＰＣ［３１：０，Ｐ３：Ｐ０］、＋ＳＥＬ＿ＩＮＣＲ＿ＴＯ＿ＰＣ＿ＬＯＷが入力され、アンド回路６１５には信号＋ＴＲＡＰ＿ＡＤＲＳ［３１：０，Ｐ３：Ｐ０］、＋ＳＥＬ＿ＴＲＡＰ＿ＡＤＲＳ＿ＴＯ＿ＰＣが入力される。オア回路６１６は、アンド回路６１４，６１５の出力に基づいて、プログラムカウンタＰＣのセット信号＋ＳＥＴ＿ＰＣ［３１：０，Ｐ３：Ｐ０］を出力する。
【００８２】
以上のように、本実施例では、分岐先アドレスレジスタを設け、命令アドレスレジスタを同時に完了した命令数に合わせて高速に更新す。又、分岐命令の制御が、分岐命令制御部、分岐予測部、分岐先アドレスレジスタ及び命令完了制御部で夫々独立して制御できるので、分岐のスループットを向上させてできるだけ少ない実装面積で回路を実現可能とする。
【００８３】
又、６４ビット長の命令アドレス空間を使用するアーキテクチャにおいて、分岐命令制御部及び分岐先アドレスを生成する部分において、下位３２ビットとＣＡＲＲＹビット及びＢＯＲＲＯＷビットのみを使用して分岐命令の制御が行える。
【００８４】
尚、本発明は、以下に付記する発明をも包含するものである。
【００８５】
（付記１）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【００８６】
（付記２）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が成功して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【００８７】
（付記３）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が失敗して分岐命令が分岐する時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【００８８】
（付記４）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐予測が失敗して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させるステップと、
プログラムカウンタ及びネクストプログラムカウンタを、完了した命令数に合わせて同時に更新するステップとを含むことを特徴とする、プログラムカウンタ制御方法。
【００８９】
（付記５）　前記アーキテクチャは、６４ビット長の命令アドレス空間を使用し、
命令の下位３２ビットとキャリービット及びボロウビットのみを使用して、分岐命令制御及び分岐先アドレスの生成を行うステップを更に含むことを特徴とする、付記１〜４のいずれか１項記載のプログラムカウンタ制御方法。
【００９０】
（付記６）　分岐予測部を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
分岐命令の分岐条件判定、分岐予測の成否及び命令再フェッチの制御を行い、複数の分岐命令を同時に制御可能な分岐命令制御部と、
分岐することが確定した分岐命令の分岐先アドレスを複数格納する分岐先アドレスレジスタとを備え、
該分岐先アドレスレジスタは、該分岐命令制御部及び該分岐予測部とは独立して制御可能であることを特徴とする、プロセッサ。
【００９１】
（付記７）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、
分岐予測が成功して分岐命令が分岐した時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、
該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とする、プロセッサ。
【００９２】
（付記８）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、
分岐予測が成功して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、
該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とする、プロセッサ。
【００９３】
（付記９）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、
分岐予測が失敗して分岐命令が分岐する時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、
該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とする、プロセッサ。
【００９４】
（付記１０）　分岐予測機構を用いてアウトオブオーダ方式による命令制御を行うと共に、分岐の遅延命令を有するアーキテクチャを制御するプロセッサにおいて、
プログラムカウンタ及びネクストプログラムカウンタからなるプログラムカウンタ手段と、
分岐予測が失敗して分岐命令が分岐しない時に、分岐命令を含めた複数の命令を同時に命令完了させる手段と、
該プログラムカウンタ及び該ネクストプログラムカウンタを、完了した命令数に合わせて同時に更新する手段とを備えたことを特徴とする、プロセッサ。
【００９５】
（付記１１）　前記アーキテクチャは、６４ビット長の命令アドレス空間を使用し、
命令の下位３２ビットとキャリービット及びボロウビットのみを使用して、分岐命令制御及び分岐先アドレスの生成を行う手段を更に備えたことを特徴とする、付記６〜１０のいずれか１項記載のプロセッサ。
【００９６】
以上、本発明を実施例により説明したが、本発明は上記実施例に限定されるものではなく、種々の変形及び改良が可能であることは、言うまでもない。
【００９７】
【発明の効果】
本発明によれば、分岐のスループットの向上を、できるだけ小さい回路規模（実装面積）で図れるプログラムカウンタ制御方法及びプロセッサを実現することができる。
【図面の簡単な説明】
【図１】本発明になるプロセッサの一実施例を示すブロック図である。
【図２】命令ユニットの要部を示すブロック図である。
【図３】分岐命令制御時の動作を説明するフローチャートである。
【図４】プログラムカウンタ部の更新時の動作を説明するフローチャートである。
【図５】分岐命令制御部内のエントリーを示す概要図である。
【図６】分岐先アドレスレジスタ内のエントリーを示すの概要図である。
【図７】プログラムカウンタ部の構成を示すブロック図である。
【図８】分岐命令制御部内の要部の論理回路図である。
【図９】分岐命令制御部内の要部の論理回路図である。
【図１０】分岐命令制御部内の要部の論理回路図である。
【図１１】分岐命令制御部内の要部の論理回路図である。
【図１２】命令完了制御部内の要部の論理回路図である。
【図１３】命令完了制御部内の要部の論理回路図である。
【図１４】プログラムカウンタ部内のｎＰＣ用更新回路の論理回路図である。
【図１５】プログラムカウンタ部内のｎＰＣ用更新回路の論理回路図である。
【図１６】プログラムカウンタ部内のｎＰＣ用更新回路の論理回路図である。
【図１７】プログラムカウンタ部内のｎＰＣ用更新回路の論理回路図である。
【図１８】プログラムカウンタ部内のｎＰＣ用更新回路の論理回路図である。
【図１９】プログラムカウンタ部内のＰＣ用更新回路の論理回路図である。
【図２０】プログラムカウンタ部内のＰＣ用更新回路の論理回路図である。
【符号の説明】
１　　　分岐予測部
２　　　命令フェッチ部
３　　　命令バッファ部
４　　　相対分岐アドレス生成部
５　　　命令デコーダ部
６　　　分岐命令実行部
７　　　分岐命令制御部
８　　　ディレイスロットスタック部
９　　　命令完了制御部
１０　　　分岐先アドレスレジスタ
１１　　　プログラムカウンタ部
１１−１　　　ラッチ回路
１１−２，１１−３　　　更新回路
２１　　　命令ユニット
２２　　　メモリユニット
２３　　　演算ユニット
ＰＣ　　　　プログラムカウンタ
ｎＰＣ　　　　ネクストプログラムカウンタ
【図１】
2004038256.tif 000003
【図２】
2004038256.tif 000004
【図３】
2004038256.tif 000005
【図４】
2004038256.tif 000006
【図５】
2004038256.tif 000007
【図６】
2004038256.tif 000008
【図７】
2004038256.tif 000009
【図８】
2004038256.tif 000010
【図９】
2004038256.tif 000011
【図１０】
2004038256.tif 000012
【図１１】
2004038256.tif 000013
【図１２】
2004038256.tif 000014
【図１３】
2004038256.tif 000015
【図１４】
2004038256.tif 000016
【図１５】
2004038256.tif 000017
【図１６】
2004038256.tif 000018
【図１７】
2004038256.tif 000019
【図１８】
2004038256.tif 000020
【図１９】
2004038256.tif 000021
【図２０】
2004038256.tif 000022