(57)【要約】【課題】マイクロコンピュータにおいて、分岐ペナルティの発生を防止すること。【解決手段】マイクロコンピュータは、命令メモリから命令キューに出力される命令から分岐命令を検出する分岐検出回路と、分岐命令が検出された場合に、対応する分岐先命令が命令キューに格納されているか否かを判定する分岐先判定回路と、キュー制御回路と、を備える。コピー対象は、当該検出された分岐命令に対応する分岐先命令から当該検出された分岐命令の直前の命令までである。キュー制御回路は、コピー対象の命令が実行される度に、それを命令キューに再度格納する。分岐命令に関する分岐条件が成立した場合、キュー制御回路は、命令キューに格納しておいたコピー対象を、命令キューの先頭に移動させる。【選択図】図２
2014059665.tif 000002
【特許請求の範囲】
【請求項１】
命令メモリからフェッチされる命令を格納する命令キューと、
前記命令メモリから前記命令キューに出力される命令から分岐命令を検出する分岐検出回路と、
前記分岐命令が検出された場合に、前記検出された分岐命令に対応する分岐先命令が前記命令キューに格納されているか否かを判定する分岐先判定回路と、
前記命令キューの制御を行うキュー制御回路と
を備え、
コピー対象は、前記検出された分岐命令に対応する前記分岐先命令から前記検出された分岐命令の直前の命令までであり、
前記キュー制御回路は、前記コピー対象の命令が実行される度に前記実行されたコピー対象を前記命令キューに再度格納し、
前記分岐命令に関する分岐条件が成立した場合、前記キュー制御回路は、前記命令キューに再度格納した前記コピー対象を、前記命令キューの先頭に移動させる
マイクロコンピュータ。
【請求項２】
請求項１に記載のマイクロコンピュータであって、
前記命令キューは、前記分岐命令に続く所定数の後続命令を格納する
マイクロコンピュータ。
【請求項３】
請求項２に記載のマイクロコンピュータであって、
前記分岐命令に関する前記分岐条件が成立した場合、前記キュー制御回路は、更に、前記分岐命令及び前記所定数の後続命令を、前記移動後の前記コピー対象に続く位置に移動させる
マイクロコンピュータ。
【請求項４】
請求項１に記載のマイクロコンピュータであって、
前記分岐命令に関する前記分岐条件が不成立の場合、前記キュー制御回路は、前記命令キューに再度格納した前記コピー対象を、前記命令キューから削除する
マイクロコンピュータ。
【請求項５】
マイクロコンピュータにおける命令処理方法であって、
前記コンピュータは、命令メモリからフェッチされる命令を格納する命令キューを備え、
前記命令処理方法は、
（Ａ）前記命令メモリから前記命令キューに出力される命令から分岐命令を検出するステップと、
（Ｂ）前記分岐命令が検出された場合に、前記検出された分岐命令に対応する分岐先命令が前記命令キューに格納されているか否かを判定するステップと、
ここで、コピー対象は、前記検出された分岐命令に対応する前記分岐先命令から前記検出された分岐命令の直前の命令までであり、
（Ｃ）前記コピー対象の命令が実行される度に前記実行されたコピー対象を前記命令キューに再度格納するステップと、
（Ｄ）前記分岐命令に関する分岐条件が成立した場合、前記命令キューに再度格納した前記コピー対象を、前記命令キューの先頭に移動させるステップと
を含む
命令処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロコンピュータにおける命令処理技術に関する。
【背景技術】
【０００２】
マイクロコンピュータは、命令のフェッチ、デコード及び実行をパイプライン処理により行う。そのようなマイクロコンピュータでは、「分岐命令（branch instruction）」の実行を終了したのちに、「分岐先命令（branch
target instruction）」のフェッチを開始しなければならない。この場合、パイプラインに空きスロットが発生するハザード状態が発生し、それは、マイクロコンピュータの処理性能を低下させる。このような分岐命令の実行によって発生する性能低下は、「分岐ペナルティ（branch penalty）」と呼ばれている。
【０００３】
一般的にマイクロコンピュータが処理する命令のうち、約２０％が分岐命令である。従って、マイクロコンピュータの処理を高速化するには、分岐ペナルティをできるだけ回避することが重要である。
【０００４】
分岐ペナルティを抑えるための１つの方法として、分岐先予測（branch target prediction）が知られている。分岐先予測は、分岐命令の履歴に基づいて分岐先を予測し、先行して命令フェッチを行う。
【０００５】
特許文献１は、分岐命令実行時のキューフラッシュに伴う命令フェッチの方法を最適化し、プリフェッチ回数を減らすための技術を開示している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平０７−０７３０３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
マイクロコンピュータにおいて、割り込み信号を待ったり、一定時間の経過を待ったりするために、ループ処理が行われる場合がある。そのようなループ処理を行うために必要な分岐は、既に実行した後のアドレスに分岐するため、「後方分岐（backward branch）」と呼ばれる。これに対し、まだ実行していないアドレスへの分岐は、「前方分岐（forward branch）」と呼ばれる。
【０００８】
上述の関連技術では、後方分岐を伴う分岐命令の場合に分岐ペナルティが発生する。これは、分岐先命令が命令キュー内に含まれているか否かを判定するタイミングが分岐命令実行時であり、その時点では、既に実行した分岐先命令が命令キューに存在しないためである。
【課題を解決するための手段】
【０００９】
一実施の形態において、マイクロコンピュータが提供される。マイクロコンピュータは、命令メモリからフェッチされる命令を格納する命令キューと、命令メモリから命令キューに出力される命令から分岐命令を検出する分岐検出回路と、分岐命令が検出された場合に、当該検出された分岐命令に対応する分岐先命令が命令キューに格納されているか否かを判定する分岐先判定回路と、命令キューの制御を行うキュー制御回路と、を備える。コピー対象は、当該検出された分岐命令に対応する分岐先命令から当該検出された分岐命令の直前の命令までである。キュー制御回路は、コピー対象の命令が実行される度に、当該実行されたコピー対象を命令キューに再度格納する。分岐命令に関する分岐条件が成立した場合、キュー制御回路は、命令キューに再度格納したコピー対象を、命令キューの先頭に移動させる。
【００１０】
一実施の形態において、マイクロコンピュータにおける命令処理方法が提供される。コンピュータは、命令メモリからフェッチされる命令を格納する命令キューを備える。命令処理方法は、（Ａ）命令メモリから命令キューに出力される命令から分岐命令を検出するステップと、（Ｂ）分岐命令が検出された場合に、当該検出された分岐命令に対応する分岐先命令が命令キューに格納されているか否かを判定するステップと、を含む。ここで、コピー対象は、当該検出された分岐命令に対応する分岐先命令から当該検出された分岐命令の直前の命令までである。命令処理方法は、更に、（Ｃ）コピー対象の命令が実行される度に、当該実行されたコピー対象を命令キューに再度格納するステップと、（Ｄ）分岐命令に関する分岐条件が成立した場合、命令キューに再度格納したコピー対象を、命令キューの先頭に移動させるステップと、を含む。
【発明の効果】
【００１１】
後方分岐を伴う分岐命令の場合でも、分岐ペナルティの発生を防止することが可能となる。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施の形態に係るマイクロコンピュータの構成を示すブロック図である。
【図２】図２は、実施の形態に係るマイクロコンピュータの命令フェッチ制御回路の構成を示すブロック図である。
【図３Ａ】図３Ａは、実施の形態に係る命令フェッチ制御回路の動作例を示すタイミングチャートである。
【図３Ｂ】図３Ｂは、実施の形態に係る命令フェッチ制御回路の動作例を示すタイミングチャートである。
【図３Ｃ】図３Ｃは、実施の形態に係る命令フェッチ制御回路の動作例を示すタイミングチャートである。
【発明を実施するための形態】
【００１３】
添付図面を参照して、本発明の実施の形態を説明する。
【００１４】
１．構成
図１は、本実施の形態に係るマイクロコンピュータ１００の構成を示すブロック図である。マイクロコンピュータ１００は、ＣＰＵ（Central Processing Unit）１０１、命令メモリ１０２、周辺Ｉ／Ｏ１１０、及びデータメモリ１１１を備えている。
【００１５】
ＣＰＵ１０１は、命令メモリ１０２に格納されている命令コードに応じて各種処理を実行する。処理としては、演算実行や、周辺Ｉ／Ｏ１１０やデータメモリ１１１へのリード／ライト・アクセスが挙げられる。
【００１６】
命令メモリ１０２は、ＣＰＵ１０１が実行する命令コードを格納するメモリである。
【００１７】
周辺Ｉ／Ｏ１１０としては、タイマユニットやシリアル転送ユニットが挙げられる。データメモリ１１１は、ＲＡＭなどのメモリである。
【００１８】
また、ＣＰＵ１０１は、命令フェッチ制御回路１０３、命令デコーダ１０４、命令実行制御回路１０５、演算回路１０６、実行結果格納回路１０７、パイプライン制御回路１０８、及びメモリアクセス制御回路１０９を備えている。
【００１９】
命令フェッチ制御回路１０３は、命令メモリ１０２からの命令コードのフェッチ制御を行う。その詳細は後述される。
【００２０】
命令デコーダ１０４は、命令フェッチ制御回路１０３によってフェッチされた命令コードをデコードする。
【００２１】
命令実行制御回路１０５は、命令デコーダ１０４によるデコード結果に応じて命令実行を制御する。
【００２２】
演算回路１０６は、命令実行制御回路１０５の状態に応じて演算を実行する。
【００２３】
実行結果格納回路１０７は、演算回路１０６による演算結果を格納する。また、実行結果格納回路１０７は、メモリアクセス制御回路１０９が周辺Ｉ／Ｏ１１０やデータメモリ１１１からロードした結果を格納する。
【００２４】
パイプライン制御回路１０８は、命令フェッチ制御回路１０３、命令デコーダ１０４、命令実行制御回路１０５、演算回路１０６、実行結果格納回路１０７及びメモリアクセス制御回路１０９の状態に基づいて、ＣＰＵ１０１全体の動作を制御する。
【００２５】
メモリアクセス制御回路１０９は、命令デコーダ１０４によるデコード結果に応じてメモリアクセスを制御する。
【００２６】
図２は、本実施の形態に係る命令フェッチ制御回路１０３の構成を示すブロック図である。命令フェッチ制御回路１０３は、命令キュー２０１、フェッチャ２０２、分岐検出回路２０３、分岐先判定回路２０４、キュー制御回路２０５、分岐条件判定回路２０７、後続命令数確認回路２０８、及び後続命令数設定レジスタ２０９を備えている。
【００２７】
命令キュー２０１は、命令メモリ１０２からフェッチされる命令コード２１７を格納するためのレジスタである。命令キュー２０１は、複数の命令コードを保持し、保持した命令コードを順次命令デコーダ１０４へ送信する。図２の例では、命令キュー２０１は、６段のレジスタ構成を有する。より詳細には、命令キュー２０１は、キュー［０］２３０、キュー［１］２３１、キュー［２］２３２、キュー［３］２３３、キュー［４］２３４、及びキュー［５］２３５を備えている。
【００２８】
命令キュー２０１の先頭はキュー［０］であり、先頭キュー［０］に格納されている命令コードが、命令キュー出力信号２１８として命令デコーダ１０４に出力される。フェッチ開始直後は、命令コード２１７が命令メモリ１０２からフェッチされる毎に、キュー［０］から、キュー［１］、キュー［２］、キュー［３］、キュー［４］、キュー［５］の順番に格納される。そして、先頭キュー［０］の命令コードが処理される毎に、命令キュー２０１に格納されている命令コードは先頭キュー［０］の方向に１つずつシフトする。命令キュー２０１に空きが生じると、フェッチされた命令コード２１７は、空いているキューのうち最も小さな番号のものに格納される。例えば、キュー［４］、［５］が空いていれば、フェッチされた命令コード２１７はキュー［４］に格納される。
【００２９】
また、各キューは、３ビットの命令有効フラグを格納するフラグレジスタを備えている。キュー［０］フラグレジスタ２４０は、キュー［０］の命令有効フラグを格納する。キュー［１］フラグレジスタ２４１は、キュー［１］の命令有効フラグを格納する。キュー［２］フラグレジスタ２４２は、キュー［２］の命令有効フラグを格納する。キュー［３］フラグレジスタ２４３は、キュー［３］の命令有効フラグを格納する。キュー［４］フラグレジスタ２４４は、キュー［４］の命令有効フラグを格納する。キュー［５］フラグレジスタ２４５は、キュー［５］の命令有効フラグを格納する。
【００３０】
命令有効フラグの最上位ビットは、当該キューに命令が格納されているか否かを識別するためのビットである。具体的には、最上位ビットは、当該キューに命令が格納されている場合に“１”、命令が格納されていない場合に“０”となる。また、命令有効フラグの２、３ビット目は、当該キューに格納されている命令の「種別」を示す。命令有効フラグが取りうる状態は、以下の５通りである。
１＿０１：キューに命令が格納されていて、その命令が「分岐命令」である。
１＿１０：キューに命令が格納されていて、その命令が「分岐先命令」である。
１＿１１：キューに命令が格納されていて、その命令が分岐命令に続く「後続命令」である。
１＿００：キューに命令が格納されていて、その命令が上記３つの命令以外の「通常命令」である。
０＿００：キュー内に命令が存在しない。
【００３１】
命令キュー２０１は、後述する分岐先命令検出信号２１９等に基づいて、各キューの命令有効フラグの設定を行う。
【００３２】
フェッチャ２０２は、命令メモリ１０２からの命令コード２１７のフェッチを制御する。より詳細には、フェッチャ２０２は、分岐条件判定回路２０７から出力される分岐条件成立信号２１３と、後続命令数確認回路２０８から出力されるフェッチ停止要求信号２１１を受け取る。そして、フェッチャ２０２は、分岐条件成立信号２１３やフェッチ停止要求信号２１１に基づいて、命令メモリ１０２に対するフェッチアドレス２２３の出力を制御する。
【００３３】
分岐検出回路２０３は、命令メモリ１０２から命令キュー２０１に送られる命令コード２１７（命令メモリ１０２からフェッチされ、命令キュー２０１に格納される前の命令コード２１７）の中から分岐命令を検出する。具体的には、分岐検出回路２０３は、命令メモリ１０２からフェッチされた命令コード２１７をデコードし、当該命令が分岐命令か否かを判定する。そして、分岐検出回路２０３は、判定結果を示す分岐命令検出信号２１５を分岐先判定回路２０４に出力する。調べた命令コード２１７が分岐命令である場合、分岐命令検出信号２１５は“１”である。調べた命令コード２１７が分岐命令ではない場合、分岐命令検出信号２１５は“０”である。
【００３４】
分岐検出回路２０３によって分岐命令が検出された場合、分岐先判定回路２０４は、検出された分岐命令に対応する分岐先命令が命令キュー２０１に格納されているか否かを判定する。具体的には、上記の分岐命令検出信号２１５が“１”のとき、分岐先判定回路２０４は、命令コード２１７（分岐命令）中に存在する分岐先アドレス計算用コードを使用して、分岐先アドレスを計算する。そして、分岐先判定回路２０４は、命令キュー２０１の状態を示す命令キュー情報２２５を参照し、分岐先アドレスに該当する命令（すなわち、分岐先命令）が命令キュー２０１内に存在するか否かを判定する。分岐検出回路２０３は、判定結果を示す分岐先命令検出信号２１９を命令キュー２０１に出力する。対応する分岐先命令が命令キュー２０１内に存在している場合、分岐先命令検出信号２１９は“１”である。対応する分岐先命令が命令キュー２０１内に存在しない場合、分岐先命令検出信号２１９は“０”である。
【００３５】
キュー制御回路２０５は、命令キュー２０１の制御を行う。より詳細には、キュー制御回路２０５は、命令キュー制御信号２２０を命令キュー２０１に出力することによって、命令キュー２０１内における命令のシフト、コピー、削除等の制御を行う。その制御のために、キュー制御回路２０５は、コピー実行フラグレジスタ２０６を有している。コピー実行フラグレジスタ２０６は、キュー［０］フラグレジスタ２４０（先頭キュー［０］の命令有効フラグ）の状態を示すキュー［０］有効フラグ信号２１４に従って設定される。更に、キュー制御回路２０５は、分岐条件判定回路２０７から出力される分岐条件成立信号２１３も参照して、命令キュー２０１の制御を行う。命令キュー２０１による制御の詳細は後述される。
【００３６】
分岐条件判定回路２０７は、命令デコーダ１０４から出力されるデコード信号２２４に基づいて、分岐命令に関する分岐条件が成立したか否かを判定する。そして、分岐条件判定回路２０７は、判定結果を示す分岐条件成立信号２１３を、フェッチャ２０２及びキュー制御回路２０５に出力する。
【００３７】
後続命令数確認回路２０８は、命令キュー２０１内に存在する後続命令（分岐命令に続く命令）の数を調べる。具体的には、後続命令数確認回路２０８は、命令キュー２０１内に格納されている命令に関するキュー内命令格納情報２２２を、命令キュー２０１から受け取る。また、後続命令数確認回路２０８は、命令キュー２０１内に保持される後続命令の最大数を示す後続命令数設定値２１２を、後続命令数設定レジスタ２０９から受け取る。そして、後続命令数確認回路２０８は、命令キュー２０１内に格納されている後続命令の数を、後続命令数設定値２１２と比較する。命令キュー２０１内に格納されている後続命令の数が後続命令数設定値２１２と一致した場合、後続命令数確認回路２０８は、フェッチ停止要求信号２１１をフェッチャ２０２に出力する。
【００３８】
後続命令数設定レジスタ２０９は、命令キュー２０１内に保持すべき後続命令の数を示す後続命令数設定値２１２を設定する。
【００３９】
２．動作
図３Ａ〜図３Ｃは、本実施の形態に係る命令フェッチ制御回路１０３の動作例を示すタイミングチャートである。本例では、命令メモリ１０２のレイテンシは２、また、一度にフェッチする命令の数は２である。また、命令キュー２０１内に、分岐先命令が格納されていることを前提に説明を行う。
【００４０】
図３Ａ〜図３Ｃにおいて、Ｔ０〜Ｔ１４は、マイクロコンピュータ１００が動作する基準クロックのクロックサイクルを表している。また、「ＩＤ」、「ＩＦ」、「ＥＸ」は、各命令に対するＣＰＵ１０１の状態（ステージ）を表している。具体的には、「ＩＤ」は、命令デコード（インストラクションデコード）を行っているＩＤステージを意味し、「ＩＦ」は、命令フェッチ（インストラクションフェッチ）を行っているＩＦステージを意味し、「ＥＸ」は、命令実行を行っているＥＸステージを意味する。
【００４１】
図３Ａ〜図３Ｃには、更に、キュー[５]〜キュー[０]の各々に格納されている命令コード及び命令有効フラグの状態も示されている。命令コードが格納されていないキューは、空きスロットと参照される。本例では、命令３が分岐先命令であり、命令６が分岐命令であり、命令７、８が後続命令である。
【００４２】
図３Ａ〜図３Ｃには、更に、各種信号の状態も示されている。本例において、後続命令数設定値２１２は“０１０”である。これは、命令キュー２０１に格納される後続命令の最大数（所定数）が２であることを意味する。
【００４３】
以下、各クロックサイクルについて詳しく説明する。
【００４４】
クロックサイクルＴ０：
キュー［０］に命令Ａが、キュー［１］に命令０が、キュー［２］に命令１が、キュー［３］に命令２が、キュー［４］に命令３（分岐先命令）が、キュー［５］に命令４が、それぞれ格納されている。命令キュー２０１は、先頭キュー［０］に格納されている命令Ａの命令コードを、命令キュー出力信号２１８として命令デコーダ１２４に出力している。つまり、命令ＡがＩＤステージとなっている。命令Ａに続く命令０は、ＩＤステージに移行する前のＩＦステージとなっている。コピー実行フラグ２０６は“０”である。また、フェッチアドレス２２３として、命令５、命令６のアドレスが出力されている。
【００４５】
クロックサイクルＴ１：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令０が、キュー［１］に命令１が、キュー［２］に命令２が、キュー［３］に命令３（分岐先命令）が、キュー［４］に命令４が、それぞれ格納される。キュー［５］は空きスロットとなる。命令０がＩＤステージに移行し、続く命令１がＩＦステージとなる。
【００４６】
このタイミングにおいて命令メモリ１０２から出力されている命令コード２１７は、命令５及び命令６（分岐命令）である。分岐検出回路２０３は、命令コード２１７の中に分岐命令（命令６）が含まれていることを検出するため、分岐命令検出信号２１５が“１”になる。
【００４７】
更に、分岐先判定回路２０４は、検出された分岐命令（命令６）中に存在する分岐先アドレス計算用コードを使用して、分岐先アドレスを計算する。そして、分岐先判定回路２０４は、命令キュー情報２２５を参照し、分岐先アドレスに該当する命令（すなわち、分岐先命令）が命令キュー２０１内に存在するか否かを判定する。本例では、分岐命令（命令６）に対応する分岐先命令（命令３）が命令キュー２０１内に存在している。従って、分岐先判定回路２０４は、分岐先命令検出信号２１９として“１”を出力する。
【００４８】
先頭キュー［０］の命令０が通常命令であるため、キュー［０］有効フラグ信号２１４は“１＿００”である。この場合、コピー実行フラグ２０６は変わらない。尚、空きスロットが１つしかないことから、レイテンシが２である命令メモリ１０２に対してフェッチ要求を出せないため、フェッチアドレス２２３は出力されない。
【００４９】
クロックサイクルＴ２：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令１が、キュー［１］に命令２が、キュー［２］に命令３（分岐先命令）が、キュー［３］に命令４が、それぞれ格納される。また、キュー［４］、キュー［５］には、命令メモリ１０２からフェッチされてきた命令５、命令６（分岐命令）が、それぞれ格納される。命令０がＥＸステージに移行し、命令１がＩＤステージに移行し、命令２がＩＦステージとなる。
【００５０】
上記クロックサイクルＴ１において生成された分岐先命令検出信号２１９＝“１”に応答して、命令キュー２０１は、命令有効フラグを更新する。具体的には、命令キュー２０１は、命令６（分岐命令）が格納されたキュー［５］の命令有効フラグを“１＿０１”に設定し、命令３（分岐先命令）が格納されたキュー［２］の命令有効フラグを“１＿１０”に設定する。その後、分岐命令検出信号２１５及び分岐先命令検出信号２１９は“０”に戻る。
【００５１】
先頭キュー［０］の命令１が通常命令であるため、キュー［０］有効フラグ信号２１４は“１＿００”である。この場合、コピー実行フラグ２０６は変わらない。フェッチアドレス２２３としては、命令７、命令８のアドレスが出力される。
【００５２】
クロックサイクルＴ３：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令２が、キュー［１］に命令３（分岐先命令）が、キュー［２］に命令４が、キュー［３］に命令５が、キュー［４］に命令６（分岐命令）が、それぞれ格納される。キュー［５］は空きスロットとなる。命令１がＥＸステージに移行し、命令２がＩＤステージに移行し、命令３（分岐先命令）がＩＦステージとなる。
【００５３】
先頭キュー［０］の命令２が通常命令であるため、キュー［０］有効フラグ信号２１４は“１＿００”である。この場合、コピー実行フラグ２０６は変わらない。尚、空きスロットが１つしかないことから、命令メモリ１０２に対してフェッチ要求を出せないため、フェッチアドレス２２３は出力されない。
【００５４】
クロックサイクルＴ４：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令３（分岐先命令）が、キュー［１］に命令４が、キュー［２］に命令５が、キュー［３］に命令６（分岐命令）が、それぞれ格納される。また、キュー［４］、キュー［５］には、命令メモリ１０２からフェッチされてきた命令７、命令８が、それぞれ格納される。命令２がＥＸステージに移行し、命令３（分岐先命令）がＩＤステージに移行し、命令４がＩＦステージとなる。
【００５５】
キュー［３］の命令有効フラグ２４３が分岐命令を示す“１＿０１”であるため、命令キュー２０１は、後続命令に関する命令有効フラグを更新する。具体的には、命令キュー２０１は、後続命令である命令７、８のそれぞれが格納されたキュー［４］、［５］の命令有効フラグを“１＿１１”に設定する。ここで、後続命令数設定値２１２が“０１０”であり、キュー［４］、［５］に２個の後続命令が格納されたため、後続命令数確認回路２０８は、フェッチ停止要求信号２１１＝“１”を出力する。フェッチ停止要求信号２１１が“１”である期間、フェッチアドレス２２３は出力されない。
【００５６】
また、本クロックサイクルにおいて、先頭キュー［０］の命令３が分岐先命令であるため、キュー［０］有効フラグ信号２１４は“１＿１０”である。この場合、キュー制御回路２０５は、コピー実行フラグ２０６を“１”に変化させる。
【００５７】
クロックサイクルＴ５：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令４が、キュー［１］に命令５が、キュー［２］に命令６（分岐命令）が、キュー［３］に命令７が、キュー［４］に命令８が、それぞれ格納される。命令３（分岐先命令）がＥＸステージに移行し、命令４がＩＤステージに移行し、命令５がＩＦステージとなる。
【００５８】
ここで、コピー実行フラグ２０６が“１”になっている。この場合、キュー制御回路２０５は、命令キュー２０１において命令のコピーを行う。具体的には、キュー制御回路２０５は、前クロックサイクルＴ４で先頭キュー［０］に格納されていた（つまり、現クロックサイクルＴ５でＥＸステージになっている）命令３（分岐先命令）をコピーし、命令キュー２０１のキュー［５］に再度格納する。このキュー［５］は、分岐命令である命令６が格納されているキュー［２］よりも後段であることに留意されたい。
【００５９】
先頭キュー［０］の命令４が通常命令であるため、キュー［０］有効フラグ信号２１４は“１＿００”である。この場合、コピー実行フラグ２０６は変わらない。また、フェッチ停止要求信号２１１が“１”であるため、フェッチアドレス２２３は出力されない。
【００６０】
クロックサイクルＴ６：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令５が、キュー［１］に命令６（分岐命令）が、キュー［２］に命令７が、キュー［３］に命令８が、キュー［４］に命令３（分岐先命令）が、それぞれ格納される。命令４がＥＸステージに移行し、命令５がＩＤステージに移行し、命令６（分岐命令）がＩＦステージとなる。
【００６１】
上記のクロックサイクルＴ５の場合と同様に、コピー実行フラグ２０６が“１”である。従って、キュー制御回路２０５は、前クロックサイクルＴ５で先頭キュー［０］に格納されていた（つまり、現クロックサイクルＴ６でＥＸステージになっている）命令４をコピーし、命令キュー２０１のキュー［５］に再度格納する。それ以外は、前クロックサイクルＴ５と同様である。
【００６２】
クロックサイクルＴ７： 
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令６（分岐命令）が、キュー［１］に命令７が、キュー［２］に命令８が、キュー［３］に命令３（分岐先命令）が、キュー［４］に命令４が、それぞれ格納される。命令５がＥＸステージに移行し、命令６（分岐命令）がＩＤステージに移行する。
【００６３】
上記のクロックサイクルＴ５の場合と同様に、コピー実行フラグ２０６が“１”である。従って、キュー制御回路２０５は、前クロックサイクルＴ６で先頭キュー［０］に格納されていた（つまり、現クロックサイクルＴ７でＥＸステージになっている）命令５をコピーし、命令キュー２０１のキュー［５］に再度格納する。このように、コピー実行フラグ２０６が“１”になった後のクロックサイクルＴ５〜Ｔ７において、命令のコピーが実行される。より詳細には、コピー対象は、検出された分岐命令（命令６）に対応する分岐先命令（命令３）から、当該検出された分岐命令（命令６）の直前の命令５までである。キュー制御回路２０５は、コピー対象の命令が実行される度に、当該命令を命令キュー２０１に再度格納する。
【００６４】
命令６（分岐命令）がＩＤステージとなり、命令キュー出力信号２１８が命令デコーダ１０４によってデコードされる。分岐条件判定回路２０７は、命令デコーダ１０４から出力されるデコード信号２２４に基づいて、命令６（分岐命令）に関する分岐条件が成立したか否かを判定する。ここでは、分岐条件が成立するとする。その場合、分岐条件判定回路２０７は、分岐条件成立信号２１３＝“１”を出力する。
【００６５】
先頭キュー［０］の命令６が分岐命令であるため、キュー［０］有効フラグ信号２１４は“１＿０１”である。この場合、キュー制御回路２０５は、分岐条件成立信号２１３を参照して、コピー実行フラグ２０６を制御する。具体的には、分岐条件成立信号２１３が“１”である場合、コピー実行フラグ２０６は変わらない。
【００６６】
クロックサイクルＴ８：
上記クロックサイクルＴ７において生成された分岐条件成立信号２１３＝“１”に応答して、キュー制御回路２０５は、命令キュー２０１において命令の入れ替え（シフトとコピー）を行う。具体的には、キュー制御回路２０５は、前もってコピーしておいた上述のコピー対象（命令３（分岐先命令）、命令４、命令５）を、命令キュー２０１の先頭に移動させる。つまり、キュー制御回路２０５は、前クロックサイクルＴ７においてキュー［５：３］に格納されていた命令５、命令４、命令３（分岐先命令）を、キュー［２：０］にシフトさせる。同時に、キュー制御回路２０５は、命令６（分岐命令）及び命令７、８（後続命令）を、移動後のコピー対象に続く位置に移動させる。つまり、キュー制御回路２０５は、前クロックサイクルＴ７においてキュー［２：０］に格納されていた命令８、命令７、命令６（分岐命令）を、キュー［５：３］にコピーする。
【００６７】
結果として、命令６（分岐命令）がＥＸステージとなり、命令３（分岐先命令）がＩＤステージとなる。このように、分岐条件が成立した場合の分岐ペナルティの発生が防止される。尚、キュー［１］に格納されている命令４は、上記クロックサイクルＴ６でコピーされた命令であり、命令フェッチを伴っていないことから、ＩＦステージではないと見なす（以降、クロックサイクルＴ１２までは、命令フェッチが行われないため、ＩＦステージは存在しない）。
【００６８】
先頭キュー［０］の命令３が分岐先命令であるため、キュー［０］有効フラグ信号２１４は“１＿１０”である。従って、コピー実行フラグ２０６は“１”のまま変わらない。
【００６９】
クロックサイクルＴ９：
上記のクロックサイクルＴ５の場合と同様の動作が行われる。
【００７０】
クロックサイクルＴ１０：
上記のクロックサイクルＴ６の場合と同様の動作が行われる。
【００７１】
クロックサイクルＴ１１：
上記のクロックサイクルＴ７の場合とほとんど同様であるが、ここでは、分岐条件が不成立であるとする。この場合、分岐条件判定回路２０７は、分岐条件成立信号２１３＝“０”を出力する。
【００７２】
先頭キュー［０］の命令６が分岐命令であるため、キュー［０］有効フラグ信号２１４は“１＿０１”である。この場合、キュー制御回路２０５は、分岐条件成立信号２１３を参照して、コピー実行フラグ２０６を制御する。具体的には、分岐条件成立信号２１３が“０”である場合、キュー制御回路２０５は、クロックサイクルＴ１１の完了時に、コピー実行フラグ２０６を“０”に戻す。また、この場合、後続命令数確認回路２０８は、フェッチ停止要求信号２１１を”０”に戻す。
【００７３】
クロックサイクルＴ１２：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令７が、キュー［１］に命令８が、それぞれ格納される。命令６（分岐命令）がＥＸステージとなり、後続命令である命令７がＩＤステージとなる。このように、分岐条件が不成立の場合であっても、分岐ペナルティの発生が防止される。
【００７４】
また、キュー制御回路２０５は、コピー実行フラグ２０６が“１”から“０”に変わったことをトリガーとして、上述のコピー対象（命令３（分岐先命令）、命令４、命令５）を命令キュー２０１から削除する。つまり、分岐条件が不成立となった場合、キュー制御回路２０５は、命令有効フラグが分岐先命令を示す“１＿１０”であるキュー以降の命令を削除する。結果として、キュー［５：２］の各々の命令有効フラグは“０＿００”となる。
【００７５】
先頭キュー［０］の命令７が後続命令であるため、キュー［０］有効フラグ信号２１４は“１＿１１”である。この場合、コピー実行フラグ２０６は変わらない。フェッチアドレス２２３としては、後続命令に続く命令９、命令１０のアドレスが出力される。
【００７６】
クロックサイクルＴ１３：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。その結果、キュー［０］に命令８が格納される。命令７がＥＸステージに移行し、命令８がＩＤステージとなり、命令９がＩＦステージとなる。
【００７７】
命令キュー２０１に２つ以上の空きスロットが存在するため、フェッチアドレス２２３としては、命令１１、命令１２のアドレスが出力される。
【００７８】
クロックサイクルＴ１４：
キュー制御回路２０５は、命令キュー２０１内に格納されている命令をシフトさせる。また、キュー［０］、キュー［１］には、命令メモリ１０２からフェッチされてきた命令９、命令１０が、それぞれ格納される。命令８がＥＸステージに移行し、命令９がＩＤステージに移行し、命令１０がＩＦステージとなる。
【００７９】
命令キュー２０１に２つ以上の空きスロットが存在するため、フェッチアドレス２２３としては、命令１３、命令１４のアドレスが出力される。
【００８０】
３．効果
本実施の形態によれば、分岐命令が命令キュー２０１に格納される前に当該分岐命令が検出され、その分岐命令に対応する分岐先命令が命令キュー２０１に格納されているか否か判定される。その分岐先命令が命令キュー２０１に格納されている場合、当該分岐先命令の実行と共にその分岐先命令が命令キュー２０１に再度格納される。そして、分岐命令に関する分岐条件が成立した場合には、その分岐先命令が命令キュー２０１の先頭に移動させられる。従って、後方分岐の場合であっても、分岐ペナルティの発生が防止される。
【００８１】
また、本実施の形態によれば、分岐命令に続く所定数の後続命令も命令キュー２０１に保持される。分岐命令に関する分岐条件が不成立の場合は、その後続命令が続けて実行される。従って、分岐条件が成立するしないに拘わらず、分岐ペナルティの発生が防止される。
【００８２】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【符号の説明】
【００８３】
１００  マイクロコンピュータ
１０１  ＣＰＵ
１０２  命令メモリ
１０３  命令フェッチ制御回路
１０４  命令デコーダ
１０５  命令実行制御回路
１０６  演算回路
１０７  実行結果格納回路
１０８  パイプライン制御回路
１０９  メモリアクセス制御回路
１１０  周辺Ｉ／Ｏ
１１１  データメモリ
２０１  命令キュー
２０２  フェッチャ
２０３  分岐検出回路
２０４  分岐先判定回路
２０５  キュー制御回路
２０６  コピー実行フラグレジスタ
２０７  分岐条件判定回路
２０８  後続命令数確認回路
２０９  後続命令数設定レジスタ
２１１  フェッチ停止要求信号
２１２  後続命令数設定値
２１３  分岐条件成立信号
２１４  キュー［０］有効フラグ信号
２１５  分岐命令検出信号
２１７  命令コード
２１８  命令キュー出力信号
２１９  分岐先命令検出信号
２２０  命令キュー制御信号
２２２  キュー内命令格納情報
２２３  フェッチアドレス
２２４  デコード信号
２２５  命令キュー情報
２３０  キュー［０］
２３１  キュー［１］
２３２  キュー［２］
２３３  キュー［３］
２３４  キュー［４］
２３５  キュー［５］
２４０  キュー［０］フラグレジスタ
２４１  キュー［１］フラグレジスタ
２４２  キュー［２］フラグレジスタ
２４３  キュー［３］フラグレジスタ
２４４  キュー［４］フラグレジスタ
２４５  キュー［５］フラグレジスタ
【図１】
2014059665.tif 000003
【図２】
2014059665.tif 000004
【図３Ａ】
2014059665.tif 000005
【図３Ｂ】
2014059665.tif 000006
【図３Ｃ】
2014059665.tif 000007