(57)【要約】【課題】命令キュー内に残っている命令コードを再利用し、消費電力を最適化する。【解決手段】半導体装置１において、ＣＰＵ２が分岐命令を実行し、かつ、分岐先の命令が命令キャッシュ４０に記憶され、かつ、分岐先の命令に後続する命令が命令キュー３０に記憶されているとき、命令キャッシュ４０から分記先の命令が命令キュー３０にフェッチされ、分岐先の命令に後続する命令は再利用するために命令キュー３０にフェッチされない。【選択図】図２
2014194586.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を格納するためのメモリと、
前記メモリからフェッチした命令を一時記憶する命令キューと、
前記命令キューから供給された命令を実行する中央処理装置と、
前記中央処理装置が過去に実行した命令を記憶する命令キャッシュと、
命令のフェッチを制御する制御回路とを備え、
前記中央処理装置が分岐命令を実行し、かつ、分岐先の命令が前記命令キャッシュに記憶され、かつ、前記分岐先の命令に後続する命令が前記命令キューに記憶されているとき、前記制御回路は、前記分岐先の命令を前記命令キャッシュから前記命令キューにフェッチさせ、前記分岐先の命令に後続する命令を前記命令キューにフェッチさせない、半導体装置。
【請求項２】
前記中央処理装置が分岐命令を実行し、かつ、分岐先の命令が前記命令キャッシュに記憶されていないとき、前記制御回路は、前記メモリから前記分岐先の命令を前記命令キューにフェッチさせるとともに前記命令キャッシュに記憶させる、請求項１に記載の半導体装置。
【請求項３】
前記中央処理装置が分岐命令を実行し、かつ、分岐先の命令が前記命令キャッシュに記憶され、かつ、前記分岐先の命令に後続する命令が前記命令キューに記憶されていないとき、前記制御回路は、前記命令キャッシュから前記分岐先の命令を前記命令キューにフェッチさせ、前記メモリから前記分岐先の命令に後続する命令を前記命令キューにフェッチさせる、請求項２に記載の半導体装置。
【請求項４】
前記命令キューは、Ｎ個（Ｎ≧２）のエントリを含み、
前記命令キューの各エントリは、１または複数の命令を記憶可能であり、
前記命令キューは、前記メモリからエントリ単位で命令をフェッチし、
前記命令キャッシュは、複数のエントリを含み、
前記命令キャッシュの各エントリは、前記命令キューの一部であるＭ個（Ｍ＜Ｎ）のエントリ分の命令を記憶する、請求項３に記載の半導体装置。
【請求項５】
前記制御回路は、前記中央処理装置が分岐命令を実行し、かつ、分岐先の命令が前記命令キャッシュのいずれかのエントリに記憶されているとき、前記分岐先の命令が記憶されている前記命令キャッシュのエントリから、前記命令キューの第１番目から第Ｍ番目までのエントリに命令をフェッチさせる、請求項４に記載の半導体装置。
【請求項６】
前記制御回路は、前記命令キューの第Ｍ＋１番目から第Ｐ番目（Ｍ＜Ｐ≦Ｎ）の各エントリに記憶されている命令が、分岐命令が前回実行された後に前記中央処理装置に未だ供給されていないか又は前記中央処理装置に供給された後に前記メモリから新たにフェッチされていないという再利用条件が満たされているか否かを判定し、
前記制御回路は、前記中央処理装置が分岐命令を実行し、かつ、分岐先の命令が前記命令キャッシュのうち一番最近に用いられたエントリに記憶され、かつ、前記再利用条件が満たされているとき、前記中央処理装置によって再利用するため前記命令キューの前記Ｍ＋１番目から第Ｐ番目の各エントリに命令をフェッチさせない、請求項５に記載の半導体装置。
【請求項７】
前記制御回路は、Ｑ個（Ｑ＝Ｎ−Ｍ＋２）の状態を有するステートマシンを含み、
前記ステートマシンは、
プログラムの実行開始時に第１の状態になり、
前記第１の状態において前記中央処理装置によって分岐命令が実行されたとき、第２の状態に移行し、
第１＋ｉの状態（１≦ｉ≦Ｎ−Ｍ）において第Ｍ＋ｉ番目のエントリに命令がフェッチされたとき、第２＋ｉの状態に移行し、
前記第Ｑの状態において、前記命令キューの第Ｍ＋１番目のエントリに前記メモリから命令がフェッチされると第１の状態に移行し、
前記第３〜第Ｑの状態において、前記中央処理装置によって分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュのうち一番最近に用いられたエントリに記憶されていなかったとき、前記第２の状態に移行するように構成される、請求項５に記載の半導体装置。
【請求項８】
前記制御回路は、前記第２＋ｉの状態（１≦ｉ≦Ｎ−Ｍ）において、前記中央処理装置によって分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュの一番最近に用いられたエントリに記憶されていたとき、前記中央処理装置によって再利用するため前記命令キューの第Ｍ＋１番目から第Ｍ＋ｉ番目までのエントリに命令をフェッチさせない、請求項７に記載の半導体装置。
【請求項９】
前記命令キューは、
前記メモリから命令をフェッチする毎に１増加し、０から２×Ｎ−１までを循環する整数値Ｗを記憶する書込ポインタと、
前記中央処理装置によって実行されるエントリが切替わる毎に１増加し、０から２×Ｎ−１までを循環する整数値Ｒを記憶する読出ポインタとを含み、
前記命令キューは、
プログラムの実行開始時、または、前記中央処理装置によって分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュのいずれのエントリにも記憶されていなかったとき、前記読出ポインタの値Ｒおよび前記書込ポインタの値Ｗを０に設定し、
前記中央処理装置によって分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュのうち一番最近用いられたエントリ以外に記憶されていたとき、前記読出ポインタの値Ｒを０に設定し、前記書込ポインタの値ＷをＭに設定し、
前記第１または第２の状態において前記分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュの一番最近用いられたエントリに記憶されていたとき、前記読出ポインタの値Ｒを０に設定し、前記書込ポインタの値ＷをＭに設定し、
前記第２＋ｉ（１≦ｉ≦Ｎ−Ｍ）の状態において前記分岐命令が実行され、かつ、分岐先の命令が前記命令キャッシュの一番最近用いられたエントリに記憶されていたとき、前記読出ポインタの値Ｒを０に設定し、前記書込ポインタの値ＷをＭ＋ｉに設定するように構成される、請求項７に記載の半導体装置。
【請求項１０】
前記中央処理装置は、前記Ｗと前記Ｒの差の絶対値が前記Ｎに等しい場合には、前記メモリから前記命令キューへの命令のフェッチを要求しない、請求項９に記載の半導体装置。
【請求項１１】
前記中央処理装置は、前記命令キューの第ｊ番目（１≦ｊ≦Ｎ）のエントリに記憶されている全命令のデコードが完了したときに、前記命令キューの第ｊ番目のエントリに前記メモリからの命令のフェッチを要求する、請求項１０に記載の半導体装置。
【請求項１２】
前記中央処理装置は、前記命令キューの第ｊ番目（２≦ｊ≦Ｎ）のエントリに記憶されている全命令のデコードが完了したときに、前記命令キューの第ｊ−１番目のエントリに前記メモリからの命令のフェッチを要求し、前記命令キューの第１番目のエントリに記憶されている全命令のデコードが完了したときに、前記命令キューの第Ｎ番目のエントリに前記メモリからの命令のフェッチを要求する、請求項１０に記載の半導体装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、メモリからフェッチされた命令を実行する中央処理装置（ＣＰＵ：Central  Processing  Unit）を備えた半導体装置に関し、たとえば、フェッチされた命令を一時的に記憶するための命令キューおよび過去に実行された命令を記憶するための命令キャッシュを備えた半導体装置に好適に用いられるものである。
【背景技術】
【０００２】
近年、マイクロプロセッサシステムはクロック周波数の向上などによる性能向上に伴い、メモリアクセスの遅延が増加し、システムの性能向上のボトルネックとなっている。この遅延を減らすために、一般的なマイクロプロセッサシステムは、命令キューおよび／またはキャッシュメモリを搭載することによってメモリアクセスの遅延を隠している。
【０００３】
命令キューは、ＣＰＵが命令コードをデコードするよりも前に、先行して命令をフェッチ（プリフェッチ）して保持しておくことで、命令フェッチによる遅延を減らすことができる。キャッシュメモリは、一度アクセスされたアドレスの命令およびデータを小さいメモリに保持しておくことによって、再度同じアドレスにアクセスする場合の遅延を減らすことができる。
【０００４】
命令キューおよびキャッシュメモリを備えたプロセッサを開示する文献として、たとえば、特開平５−８８８９１号公報（特許文献１）が挙げられる。この文献のプロセッサには、さらに、分岐命令の格納番地から分岐先番地を予測する分岐予測回路が設けられている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平５−８８８９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
近年のマイクロプロセッサシステムでは、クロック周波数の向上およびチップ面積の増加によって生じる消費電力の増大もまた問題となっている。特に大容量のメモリが搭載されている場合には、メモリで消費される電力がチップ全体に対して大きな割合を占める傾向がある。そのため、メモリのアクセスを減らすことが電力削減に効果的であることが知られている。
【０００７】
これまで、命令キューを用いたプロセッサシステムでは、分岐命令を実行したときには、命令キューをリセットし、分岐先の命令をメモリから命令キューにフェッチすることが一般的に行われていた。
【０００８】
しかしながら、命令キューのサイズ程度の命令コード列の繰返しによって構成されるループ処理（以下、「ショートループ処理」と称する）の場合には、分岐命令の実行時に命令キューに分岐先の命令コードが残っているので、命令キューをリセットする必要がない。それにもかかわらず、命令キューをリセットして再度メモリから命令コードのフェッチを行うと、メモリへのアクセスによる電力を余分に消費していることになる。
【０００９】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１０】
一実施の形態による半導体装置では、ＣＰＵが分岐命令を実行し、かつ、分岐先の命令が命令キャッシュに記憶され、かつ、分岐先の命令に後続する命令が命令キューに記憶されているとき、分記先の命令が命令キャッシュから命令キューにフェッチされ、分岐先の命令に後続する命令は再利用するために命令キューにフェッチされない。
【発明の効果】
【００１１】
上記の一実施の形態によれば、ショートループ処理の場合には、命令キュー内に残っている命令コードを再利用し、消費電力を最適化することができる。
【図面の簡単な説明】
【００１２】
【図１】実施の形態１による半導体装置としてのマイクロプロセッサの構成を示すブロック図である。
【図２】図１の命令フェッチユニットのより詳細な構成を示すブロック図である。
【図３】命令フェッチ制御の概要を説明するための図である。
【図４】プログラム実行開始時の命令フェッチの概要について説明するための図である。
【図５】図４に続く状態を示す図である。
【図６】分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されていなかった場合を説明するための図である。
【図７】図６に続く状態を示す図である。
【図８】分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されている場合を説明するための図である（ショートループでない場合）。
【図９】図８に続く状態を示す図である。
【図１０】図９に続く状態を示す図である。
【図１１】分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されている場合を説明するための図である（ショートループの場合）。
【図１２】図１１に続く状態を示す図である。
【図１３】図１２に続く状態を示す図である。
【図１４】図２のショートループ判定回路の判定手順を示すフローチャートである。
【図１５】図２のショートループ判定回路の動作を示す状態遷移図である。
【図１６】図１５の各状態における分岐要求時の制御動作を表形式で示した図である。
【図１７】ショートループでないプログラムの例を示す図である。
【図１８】キャッシュミス時における図２のマイクロプロセッサの動作例を示すタイミング図である（ショートループでない場合）。
【図１９】キャッシュヒット時における図２のマイクロプロセッサの動作例を示すタイミング図である（ショートループでない場合）。
【図２０】ショートループのプログラムの例を示す図である。
【図２１】ショートループ処理時における図２マイクロプロセッサの動作例を示すタイミング図である。
【図２２】図２１の比較例を示すタイミング図である。
【図２３】実施の形態２によるマイクロプロセッサの動作例を示すタイミング図である。
【発明を実施するための形態】
【００１３】
以下、各実施の形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰返さない。
【００１４】
＜実施の形態１＞
［マイクロプロセッサの全体構成］
図１は、実施の形態１による半導体装置としてのマイクロプロセッサの構成を示すブロック図である。半導体装置は、主面に集積回路が形成された単一の半導体チップで構成され、マイクロプロセッサはその集積回路により実現される。図１を参照して、マイクロプロセッサ１は、中央処理装置（ＣＰＵ）２と、命令フェッチユニット（ＩＦＵ：Instruction  Fetch  Unit）２０と、データキャッシュメモリ５と、メモリ６（ＥＥＰＲＯＭ−Electrically  Erasable  Programmable  Read-Only  Memoryまたはフラッシュメモリ−Flash  Memoryなど）と、ＳＲＡＭ（Static  Random  Access  Memory）７と、周辺回路８とを含む。命令フェッチユニット２０は、命令バス（Instruction  Bus）１０を介してメモリ６およびＳＲＡＭ７と接続される。データキャッシュメモリ５は、データバス（Data  Bus）１１を介してメモリ６、ＳＲＡＭ７、および周辺回路８と接続され、ＣＰＵ２で一度使用されたデータを再利用のため保持する。
【００１５】
ＣＰＵ２は、主記憶メモリ（メモリ６およびＳＲＡＭ７）から命令フェッチユニット２０を介して命令コードをフェッチする。ＣＰＵ２は８Ｂ（バイト）（８Ｂ＝６４ｂ（ビット））幅のバスによって命令フェッチユニット２０と接続される。ＣＰＵ２は、パイプライン処理が可能であり、フェッチした命令コードをＤステージ（Decode  Stage）でデコードし、Ｅステージ（Execute  Stage）で実行する。実施の形態１のプロセッサ１では、各ステージの処理に１サイクルかかるものとする。なお、以下では、特にアクセス速度が問題となるメモリ６から命令がフェッチされるとして説明する。
【００１６】
命令フェッチユニット２０は、命令キュー３０と、命令キャッシュメモリ４０と、命令のフェッチを制御する制御回路５０とを含む。命令キュー３０は、ＣＰＵ２が命令コードをデコードするよりも前に、先行して命令をプリフェッチして一時的に保持する。命令キャッシュメモリ４０は、分岐命令コードが実行されたときに分岐先の命令を保持することによって、再度同じ分岐命令コードが実行されたときに命令フェッチによるペナルティを削減する。
【００１７】
ＣＰＵ２は、分岐命令コードを実行したときには、分岐要求および分岐先アドレスを命令フェッチユニット２０の後述する命令キャッシュメモリ４０および制御回路５０に出力する。命令キャッシュメモリ４０は、分岐要求を受けると、分岐先アドレスに該当する命令を検索する。命令キャッシュメモリ４０に該当する命令があった場合には（ヒットした場合）、命令キュー３０は、メモリ６から命令のフェッチを行わずに命令キャッシュメモリ４０のヒットしたエントリから命令コードの転送を受ける。命令キャッシュメモリ４０に分岐先アドレスに該当する命令がなかった場合には（ミス）、命令キュー３０は、主記憶メモリ（メモリ６）にフェッチを行い、分岐先の命令コードを命令キュー３０に登録するとともに命令キャッシュメモリ４０に登録する。
【００１８】
図２は、図１の命令フェッチユニットのより詳細な構成を示すブロック図である。
図２を参照して、命令キュー３０は、エントリ０（ＱＥ０）〜エントリ３（ＱＥ３）の４個のエントリを含む。各エントリは、８Ｂ（バイト）のサイズを有し、メモリ６と８Ｂのバスで接続される。メモリ６からの命令フェッチは８Ｂ単位で行われる（各命令コードの命令長に応じて１または複数の命令が１度にフェッチされる）。フェッチした命令は命令キューのエントリにエントリ番号順に登録される。エントリ３（ＱＥ３）にフェッチした命令が登録された後は、エントリ０（ＱＥ０）が更新される。ただし、あるエントリに格納された命令がＣＰＵに転送されてデコードされるまではそのエントリを更新する命令フェッチは行われない。セレクタ２５は、ＣＰＵ２への命令コードの転送元のエントリを選択するために設けられている。
【００１９】
命令キュー３０への命令フェッチおよびＣＰＵ２への命令コードの転送を制御するために、命令キューの３０の制御回路には、書込ポインタ（Ｗポインタ）３２と読出ポインタ（Ｒポインタ）３３とが設けられている。書込ポインタ３２は、０から７までを循環する整数値Ｗを記憶する。整数値Ｗを４（より一般的には、命令キュー３０の総エントリ数Ｎ）で割った余りをｗとすると、命令キュー３０のエントリｗ（ＱＥｗ）にメモリ６からフェッチされた命令が書き込まれる。読出ポインタ３３も同様に、０から７までを循環する整数値Ｒを記憶する。整数値Ｒを４（より一般的には、命令キュー３０の総エントリ数Ｎ）で割った余りをｒとすると、命令キュー３０のエントリｒ（ＱＥｒ）に記憶されている命令コードがＣＰＵ２に転送され、ＣＰＵ２によってデコードされて実行される。書込ポインタ３２の値Ｗの最大値および読出ポインタの値Ｒの最大値をそれぞれ７に設定しているのは、命令キュー３０の全てのエントリが有効な場合（すなわち、いずれのエントリもＣＰＵ２への転送が完了していない場合）を判定するためである。以下、この場合を「命令キューフル」（Instruction Queue Full）と称する。書込ポインタ３２の値Ｗと読出ポインタの値Ｒとの差の絶対値が４（すなわち、命令キュー３０の総エントリ数Ｎ）に等しい場合、命令キューフルの状態であると判定される。
【００２０】
命令キャッシュメモリ４０は、エントリ０（ＣＥ０）〜エントリ７（ＣＥ７）の８個のエントリを含む。各エントリは、１６Ｂのサイズを有し、命令キュー３０の２エントリ分の命令を記憶する。命令キャッシュメモリ４０は、フルアソシアティブマッピング方式のＬＲＵ（Least  Recently  Used）リプレース方式とする。ＣＰＵ２によって分岐命令が実行されたとき、分岐先のアドレスに該当する命令が命令キャッシュメモリ４０のあるエントリに記憶されている場合、そのエントリに格納されている命令がセレクタ２１，２２によって選択されて命令キュー３０のエントリ０，１（ＱＥ０，ＱＥ１）に転送される。命令キュー３０のエントリ０，１（ＱＥ０，ＱＥ１）の入力側には、メモリ６から命令をフェッチするか、または命令キャッシュメモリ４０から命令をフェッチするかを選択するためのセレクタ２３，２４が設けられている。以下、命令フェッチ制御の概要について説明する。
【００２１】
［命令フェッチ制御の概要］
図３は、命令フェッチ制御の概要を説明するための図である。図３に示すように、メモリ６には、８Ｂ単位で命令データＤ１〜Ｄ８が格納されているとする。
【００２２】
１．プログラムの実行開始時
図４は、プログラム実行開始時の命令フェッチの概要について説明するための図である。図４を参照して、メモリ６からフェッチされた命令データＤ１，Ｄ２，Ｄ３が命令キュー３０のエントリ０（ＱＥ０）からエントリ２（ＱＥ２）の順で格納される。
【００２３】
図５は、図４に続く状態を示す図である。図５を参照して、命令データＤ４が命令キューのエントリ３（ＱＥ３）に格納された後、命令データＤ５がエントリ０（ＱＥ０）に格納される。ただし、エントリ０（ＱＥ０）が更新される前に、エントリ０（ＱＥ０）に記憶されている全ての命令コードがＣＰＵ２へ転送完了している必要がある。
【００２４】
２．分岐命令実行時（ミスの場合）
図６は、分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されていなかった場合を説明するための図である。図６を参照して、分岐命令実行時にはＣＰＵ２から分岐要求が出力される。そのとき、分岐先の命令が命令キャッシュメモリ４０に格納されていなかった場合には（ミスの場合）、命令キュー３０はリセットされる。
【００２５】
図７は、図６に続く状態を示す図である。図７を参照して、キャッシュミスの場合は、命令キュー３０のエントリ０（ＱＥ０）に入る命令コードから命令フェッチが開始される。命令フェッチの１回目の命令データＤ１は、命令キュー３０のエントリ０（ＱＥ０）と、命令キャッシュメモリ４０のエントリｉ（ＬＲＵエントリ）の前半の８Ｂ（ＣＥｉ＿０）との両方に保持される。命令フェッチの２回目の命令データＤ２は、命令キュー３０のエントリ１（ＱＥ１）と命令キャッシュメモリ４０のエントリｉ（ＬＲＵエントリ）の後半の８Ｂ（ＣＥｉ＿１）との両方に保持される。
【００２６】
３．分岐命令実行時（ヒットの場合、ショートループでない場合）
図８は、分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されている場合を説明するための図である（ショートループでない場合）。図８では、命令キュー３０のエントリ１（ＱＥ１）に記憶されている分岐命令（命令データＤ６に含まれる）がＣＰＵ２によって実行された場合が示されている。この場合に、分岐先の命令（命令データＤ１に含まれる）が命令キャッシュメモリ４０のエントリｉの前半（ＣＥｉ＿０）に記憶されていたとする。
【００２７】
図９は、図８に続く状態を示す図である。図９を参照して、分岐先の命令が命令キャッシュメモリ４０のエントリｉ（ＣＥ＿ｉ）に記憶されていた場合には（ヒットした場合）、ヒットしたエントリｉ（ＣＥ＿ｉ）の１６Ｂ分の命令データＤ１，Ｄ２が命令キュー３０のエントリ０，１（ＱＥ０，ＱＥ１）に転送される。
【００２８】
図１０は、図９に続く状態を示す図である。図１０を参照して、後続する命令（命令データＤ３，Ｄ４）は、メモリ６からフェッチされ、命令キュー３０のエントリ２，３（ＱＥ２，ＱＥ３）にそれぞれ格納される。
【００２９】
４．分岐命令実行時（ヒットの場合、ショートループの場合）
図１１は、分岐命令実行時に命令キャッシュメモリに分岐先の命令が記憶されている場合を説明するための図である（ショートループの場合）。図１１では、命令キュー３０のエントリ３（ＱＥ２）に記憶されている分岐命令（命令データＤ４に含まれる）がＣＰＵ２によって実行された場合が示されている。この場合に、分岐先の命令（命令データＤ１に含まれている）が命令キャッシュメモリ４０のＭＲＵ（Most  Recently  Used）エントリｉの前半（ＣＥｉ＿０）に記憶されていたとする。
【００３０】
図１２は、図１１に続く状態を示す図である。図１２を参照して、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリｉ（ＣＥｉ＿０，ＣＥｉ＿１）に記憶されていた場合には（すなわち、連続ヒットした場合）、ヒットしたＭＵＲエントリｉ（ＣＥｉ＿０，ＣＥｉ＿１）の１６Ｂ分の命令データＤ１，Ｄ２が命令キュー３０のエントリ０，１（ＱＥ０，ＱＥ１）に転送される。ただし、図１２では、分岐先の命令（命令データＤ１，Ｄ２）に後続する命令（命令データＤ３，Ｄ４）が命令キュー３０のエントリ２，３（ＱＥ２，ＱＥ３）に格納されている。このようなショートループの場合には、命令キュー３０のエントリ２，３（ＱＥ２，ＱＥ３）には命令メモリ３から新たに命令がフェッチされずに、エントリ２，３（ＱＥ２，ＱＥ３）に記憶されている命令が再利用される。
【００３１】
図１３は、図１２に続く状態を示す図である。図１３を参照して、命令データＤ３，Ｄ４に後続する命令（命令データＤ５，Ｄ６）は、メモリ６からフェッチされ、命令キュー３０のエントリ０，１（ＱＥ０，ＱＥ１）にそれぞれ格納される。ただし、エントリ０，１（ＱＥ０，ＱＥ１）が更新される前に、エントリ０，１（ＱＥ０，ＱＥ１）に記憶されている全ての命令コードがそれぞれＣＰＵ２へ転送完了している必要がある。
【００３２】
［命令フェッチ制御の詳細］
再び図２を参照して、制御回路５０による命令フェッチ制御の詳細について説明する。命令フェッチユニット２０の制御回路５０は、命令フェッチ制御回路５１と、ショートループ判定回路５２とを含む。
【００３３】
ＣＰＵ２からの分岐要求時に分岐先アドレスが命令キャッシュメモリ４０に出力される。命令キャッシュメモリ４０は、分岐先アドレスに該当する命令を検索し、検索結果（ヒット／ミス）を命令キュー３０の制御回路３１と命令フェッチ制御回路５１とに出力する。命令キャッシュメモリ４０は、さらにＭＲＵエントリにヒットしたか否かの情報をショートループ判定回路５２に出力する。
【００３４】
ショートループ判定回路５２は、ＣＰＵ２から分岐要求を受けたとき、命令キャッシュメモリ４０のＭＲＵエントリにヒットしたか否かの情報と、Ｗポインタの値に基づいて上記のショートループに該当するか否かを判定する。
【００３５】
命令フェッチ制御回路５１は、主記憶メモリ（メモリ６）に対して、命令フェッチアドレスと共に命令フェッチ要求を出力する。ＣＰＵ２が分岐要求を出力した場合には、命令フェッチ制御回路５１は、分岐先アドレスが命令キャッシュメモリ４０にヒットしたか否かの情報と、ショートループか否かの判定結果、および分岐先アドレスに基づいて、次に命令キュー３０にフェッチすべき命令が格納されているアドレス（命令フェッチアドレス）を命令フェッチ要求と共にメモリ（ＭＥＭ）６に出力する。ただし、「命令キューフル」の場合には、命令フェッチ制御回路５１は、メモリ６への命令フェッチ要求および命令フェッチアドレスの出力を停止する（すなわち、命令フェッチは停止される）。
【００３６】
図１４は、図２のショートループ判定回路の判定手順を示すフローチャートである。図２、図１４を参照して、プログラムの開始後の初期状態において、ＣＰＵによって分岐命令が実行された結果、ＣＰＵ２から分岐要求が出力されたとする（ステップＳ１００でＹＥＳ）。そして、この結果、命令キュー３０のエントリ０（ＱＥ０）からエントリ２（ＱＥ２）までメモリ６から命令がフェッチされたとする（ステップＳ１０５でＹＥＳ）。
【００３７】
このステップＳ１０５でＹＥＳの状態で、ＣＰＵ２から再度分岐要求が出力され、命令キャッシュメモリ４０の検索結果としてＭＲＵエントリがヒットした場合に（ステップＳ１１０でＹＥＳ、ステップＳ１１５でＹＥＳ）、ショートループ判定回路５２は、ショートループに該当すると判定する（ステップＳ１２０）。このとき、命令キュー３０の書込ポインタの値Ｗは３に設定され、読出ポインタの値Ｒは０に設定される。命令フェッチ制御回路５１は、エントリ２に格納されている命令に後続する命令をメモリ６からフェッチするように、命令フェッチアドレスを切り替える。一方、ステップＳ１０５でＹＥＳの状態で、ＣＰＵ２から分岐要求が出力されたが、命令キャッシュメモリ４０の検索結果としてＭＲＵエントリがヒットしなかった場合には（ステップＳ１１０でＹＥＳ、ステップＳ１１５でＮＯ）、ショートループに該当しないと判定され、ステップＳ１０５に処理が戻る。
【００３８】
次に、上記のステップＳ１０５でＹＥＳの状態で、さらに、命令キュー３０のエントリ３（ＱＥ３）にメモリ６から命令がフェッチされたとする（ステップＳ１２５でＹＥＳ）。
【００３９】
このステップＳ１２５でＹＥＳの状態で、ＣＰＵ２から分岐要求が出力され、命令キャッシュメモリ４０の検索結果としてＭＲＵエントリがヒットした場合に（ステップＳ１３０でＹＥＳ、ステップＳ１３５でＹＥＳ）、ショートループ判定回路５２は、ショートループに該当すると判定する（ステップＳ１４０）。このとき、命令キュー３０の書込ポインタの値Ｗは４に設定され、読出ポインタの値Ｒは０に設定される。命令フェッチ制御回路５１は、エントリ３に格納されている命令に後続する命令をメモリ６からフェッチするように、命令フェッチアドレスを切り替える。一方、ステップＳ１２５でＹＥＳの状態で、ＣＰＵ２から分岐要求が発行されたが、命令キャッシュメモリ４０の検索結果としてＭＲＵエントリがヒットしなかった場合には（ステップＳ１３０でＹＥＳ、ステップＳ１３５でＮＯ）、ショートループに該当しないと判定され、ステップＳ１０５に処理が戻る。
【００４０】
次に、上記のステップＳ１２５でＹＥＳの状態で、さらに、命令キュー３０のエントリ０（ＱＥ０）からエントリ２（ＱＥ２）までメモリ６から命令がフェッチされたとする（すなわち、２周目のエントリ２の更新）（ステップＳ１４５でＹＥＳ）。この場合は、ショートループの範囲外と判定され、初期状態（ステップＳ１００）に処理が戻る。
【００４１】
以上をより一般的にまとめると次のようになる。以下では前提として、命令キュー３０は、Ｎ個（Ｎ≧２）のエントリを含み、メモリ６からエントリ単位で命令をフェッチするとする。命令キャッシュメモリ４０は、複数のエントリを含み、命令キャッシュの各エントリは、命令キューの一部のエントリであるＭ個（Ｍ＜Ｎ）のエントリ分の命令を記憶するとする（図１４の例は、Ｎ＝４、Ｍ＝２の場合である）。
【００４２】
まず、ＣＰＵ２が分岐命令を実行し、かつ、分岐先の命令が命令キャッシュメモリ４０のいずれかのエントリにヒットした場合には、命令キャッシュメモリ４０のヒットしたエントリから、命令キュー３０の第１番目から第Ｍ番目までのエントリに命令がフェッチされる。
【００４３】
ＣＰＵ２が分岐命令を実行したときにはさらに、ショートループ判定回路５２は、命令キュー３０の第Ｍ＋１番目から第Ｐ番目（Ｍ＜Ｐ≦Ｎ）の各エントリに記憶されている命令が、前回分岐命令が実行された後に未だＣＰＵ２に転送されていないか又はＣＰＵ２に転送された後にメモリ６から別の命令がフェッチされることにより更新されていない、という再利用可能条件が満たされているか否かを判定する。そして、ショートループ判定回路５２は、ＣＰＵ２から分岐要求が出力されたときに、分記先の命令が命令キャッシュメモリ４０のＭＲＵエントリにヒットし、かつ、上記の再利用可能条件が満たされているときに、ショートループに該当すると判定する。この場合、命令フェッチ制御回路５１は、ＣＰＵ２によって再利用するため命令キュー３０の第Ｍ＋１番目から第Ｐ番目の各エントリにメモリ６から命令をフェッチさせない（第Ｐ＋１番目から第Ｎ番目のエントリには、メモリ６から命令がフェッチされる）。一方、ショートループでない場合には、命令フェッチ制御回路５１は、命令キュー３０の第Ｍ＋１番目から第Ｎ番目の各エントリにメモリ６から命令をフェッチさせる。
【００４４】
［ステートマシンの構成］
上記のようにショートループであるか否かを判定するためには、命令キュー３０のエントリ２，３（ＱＥ２，ＱＥ３）に再利用可能な命令コードが保持されているか否かを管理する必要がある。そのために、ショートループ判定回路５２は、ステートマシンとして構成されるのが望ましい。
【００４５】
図１５は、図２のショートループ判定回路の動作を示す状態遷移図である。図１６は、図１５の各状態における分岐要求時の制御動作を表形式で示した図である。
【００４６】
図２、図１５、図１６を参照して、ショートループ判定回路５２（ステートマシン）は、ＩＮＶ（Invalid）、ＶＡＬ１（Valid1）、ＶＡＬ２、およびＶＡＬ３の４状態を有する。ＩＮＶ状態は、初期状態（ＲＥＳＥＴ状態）またはショートループの範囲外であることを示す。ＶＡＬ１状態に移行直後には、命令キュー３０のエントリ０（ＱＥ０）のみ、またはエントリ０〜１（ＱＥ０〜ＱＥ１）が有効である（ＣＰＵ２への命令の転送が完了していない）。ＶＡＬ２状態に移行直後には、命令キュー３０のエントリ０〜２（ＱＥ０〜ＱＥ２）が有効である。ＶＡＬ３状態に移行直後には、命令キュー３０のエントリ０〜３（ＱＥ０〜ＱＥ３）が有効である。
【００４７】
ＩＮＶ状態においてＣＰＵ２から分岐要求が発行されたとき、ステートマシンはＶＬＤ１状態に移行する。ＶＬＤ１状態に移行するときの分岐要求に応答して、命令キャッシュメモリ４０が検索され、分岐先の命令がヒットした場合には、ヒットしたエントリの命令が命令キュー３０のエントリ０，１に転送される。この場合、書込ポインタ３２の値Ｗは２に設定され、読出ポインタ３３の値Ｒは０に設定される。一方、分岐先の命令が命令キャッシュメモリ４０にヒットしなかった場合には、命令キュー３０はリセットされ、書込ポインタ３２の値Ｗおよび読出ポインタ３３の値Ｒは共に０に設定される。
【００４８】
ＶＬＤ１状態においてＣＰＵ２から分岐要求が発行されたとき、ステートマシンはＶＬＤ１状態のまま維持される。命令キャッシュメモリ４０が検索され、分岐先の命令がヒットした場合には、ヒットしたエントリの命令が命令キュー３０のエントリ０，１に転送される。この場合、書込ポインタ３２の値Ｗは２に設定され、読出ポインタ３３の値Ｒは０に設定される。一方、分岐先の命令が命令キャッシュメモリ４０にヒットしなかった場合には、命令キュー３０はリセットされ、書込ポインタ３２の値Ｗおよび読出ポインタ３３の値Ｒは０に設定される。
【００４９】
ＶＬＤ１状態において、命令キュー３０のエントリ２（ＱＥ２）にメモリ６から命令がフェッチされると（すなわち、書込ポインタ３２の値Ｗが３に変更されると）、ステートマシンはＶＬＤ２状態に移行する。
【００５０】
ＶＬＤ２状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリにヒットした場合には、ステートマシンはＶＬＤ２状態のまま維持される。この場合、ＭＲＵエントリに保持されている命令が命令キュー３０のエントリ０，１に転送される。書込ポインタ３２の値Ｗは３に設定され、読出ポインタ３３の値Ｒは０に設定される。したがって、命令キュー３０のエントリ２の命令は再利用される。
【００５１】
ＶＬＤ２状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリ以外にヒットした場合には、ステートマシンはＶＬＤ１状態に移行する。この場合、ヒットしたエントリの命令が命令キュー３０のエントリ０，１に転送され、書込ポインタ３２の値Ｗは２に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００５２】
ＶＬＤ２状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０にヒットしなかった場合には、ステートマシンはＶＬＤ１状態に移行する。この場合、命令キュー３０はリセットされ、書込ポインタ３２の値Ｗは０に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００５３】
ＶＬＤ２状態において、命令キュー３０のエントリ３（ＱＥ３）にメモリ６から命令がフェッチされると（すなわち、書込ポインタ３２の値Ｗが４に変更されると）、ステートマシンはＶＬＤ３状態に移行する。
【００５４】
ＶＬＤ３状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリにヒットした場合には、ステートマシンはＶＬＤ３状態のまま維持される。この場合、ＭＲＵエントリに保持されている命令が命令キュー３０のエントリ０，１に転送される。書込ポインタ３２の値Ｗは４に設定され、読出ポインタ３３の値Ｒは０に設定される。したがって、命令キュー３０のエントリ２，３の命令は再利用される。なお、読出ポインタ３３の値Ｒが１に変更されるまで、メモリ６からの命令フェッチは停止される。
【００５５】
ＶＬＤ３状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリ以外にヒットした場合には、ステートマシンはＶＬＤ１状態に移行する。この場合、ヒットしたエントリの命令が命令キュー３０のエントリ０，１に転送され、書込ポインタ３２の値Ｗは２に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００５６】
ＶＬＤ３状態においてＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０にヒットしなかった場合には、ステートマシンはＶＬＤ１状態に移行する。この場合、命令キュー３０はリセットされ、書込ポインタ３２の値Ｗは０に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００５７】
ＶＬＤ３状態において、命令キュー３０のエントリ０（ＱＥ０）からエントリ２（ＱＥ２）までメモリ６から命令が順にフェッチされると（すなわち、書込ポインタ３２の値が７に変更されると）、ステートマシンはＩＮＶ状態に移行する。この場合は、ショートループの範囲にないと判断されたことになる。
【００５８】
以上をより一般的にまとめると次のようになる。以下では前提として、命令キュー３０は、Ｎ個（Ｎ≧２）のエントリを含み、メモリ６からエントリ単位で命令をフェッチするとする。命令キャッシュメモリ４０は、複数のエントリを含み、命令キャッシュの各エントリは、命令キューの一部のエントリであるＭ個（Ｍ＜Ｎ）のエントリ分の命令を記憶する（図１５、図１６では、Ｎ＝４、Ｍ＝２の場合が示される）。この場合、ショートループ判定回路５２は、Ｑ個（Ｑ＝Ｎ−Ｍ＋２）の状態（ＩＮＶ，ＶＡＬ＿１，…，ＶＡＬ＿Ｑ−１）を有するステートマシンを含む。
【００５９】
プログラムの実行開始時にステートマシンはＩＮＶ状態になる。ＩＮＶ状態においてＣＰＵ２から分岐要求が発行されたとき、ステートマシンはＶＡＬ＿１状態に移行する。ＶＡＬ＿ｉ状態（１≦ｉ≦Ｎ−Ｍ）において第Ｍ＋ｉ番目のエントリに命令がフェッチされたとき（すなわち、書込ポインタ３２の値ＷがＭ＋ｉ＋１となったとき）、ステートマシンはＶＡＬ＿ｉ＋１状態に移行する。ＶＡＬ_Ｑ−１状態において、命令キューの第Ｍ＋１番目のエントリにメモリから命令がフェッチされると（すなわち、書込ポインタ３２の値ＷがＮ＋Ｍ＋１となったとき）、ステートマシンはＩＮＶ状態に移行する。ＶＡＬ＿２〜ＶＡＬ_Ｑ−１の状態において、ＣＰＵ２から分岐要求が発行され、かつ、分岐先の命令が命令キャッシュメモリのＭＲＵエントリにヒットしなかったとき、ステートマシンはＶＡＬ＿１状態に移行する。ＶＡＬ＿１状態において、ＣＰＵ２から分岐要求が発行されたときステートマシンは現在の状態を維持する。
【００６０】
一方、ＶＡＬ＿１＋ｉ状態（１≦ｉ≦Ｎ−Ｍ）において、ＣＰＵ２から分岐要求が発行されたとき、分岐先の命令が命令キャッシュメモリ４０のＭＲＵエントリにヒットした場合には、ステートマシンは現在の状態を維持し、ＣＰＵによって再利用するため命令キューの第Ｍ＋１番目から第Ｍ＋ｉ番目までのエントリ（ＱＥ＿Ｍ〜ＱＥ＿Ｍ＋ｉ−１）に命令をフェッチさせない。すなわち、書込ポインタ３２の値ＷがＭ＋ｉに設定され、読出ポインタの値Ｒが０に設定される。
【００６１】
［命令フェッチ制御の具体例］
以下、図２の命令フェッチユニット２０における命令フェッチ制御の具体例について説明する。
【００６２】
１．キャッシュミスの場合の動作例（ショートループでない場合）
図１７は、ショートループでないプログラムの例を示す図である。図２、図１７を参照して、５００番地の分岐命令ＢＲＡの実行後の分岐先の番地が１０００番地になる。その後、ＮＯＰ（No  Operation）命令が順次実行される。２個のＮＯＰ命令ごとにメモリ６からフェッチされ、書込ポインタ３２が示す命令キュー３０のエントリに格納される。
【００６３】
図１８は、キャッシュミス時における図２のマイクロプロセッサの動作例を示すタイミング図である（ショートループでない場合）。
【００６４】
図２、図１８を参照して、サイクルＴ２においてＣＰＵ２が分岐命令を実行すると、ＣＰＵ２は、分岐要求を出力するとともに、命令キュー３０のエントリ０を更新するために命令フェッチリクエストＡを出力する。書込ポインタ３２の値Ｗおよび読出ポインタ３３の値Ｒは０に設定される。
【００６５】
次のサイクルＴ３において、２個のＮＯＰ命令（Ａ１，Ａ２）がメモリ６から読み出される。ＣＰＵ２は、命令キュー３０のエントリ１を更新するために命令フェッチリクエストＢを発行する。
【００６６】
次のサイクルＴ４において、２個のＮＯＰ命令（Ａ１，Ａ２）が命令キュー３０のエントリ０（ＱＥ０）に格納され、書込ポインタ３２の値Ｗが１に更新される。メモリ６の第２番目のアドレスに格納された２個のＮＯＰ命令（Ｂ１，Ｂ２）が読み出される。ＣＰＵ２は、命令キュー３０のエントリ２を更新するために命令フェッチリクエストＣを発行する。
【００６７】
次のサイクルＴ５において、ＮＯＰ命令（Ａ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｂ１，Ｂ２）が命令キュー３０のエントリ１（ＱＥ１）に格納され、書込ポインタ３２の値Ｗが２に更新される。メモリ６の第３番目のアドレスに格納された２個のＮＯＰ命令（Ｃ１，Ｃ２）が読み出される。ＣＰＵ２は、命令キューのエントリ３を更新するために命令フェッチリクエストＤを発行する。
【００６８】
次のサイクルＴ６において、ＮＯＰ命令（Ａ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ａ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが１に更新される。２個のＮＯＰ命令（Ｃ１，Ｃ２）が命令キュー３０のエントリ２（ＱＥ２）に格納され、書込ポインタ３２の値Ｗが３に更新される。メモリ６の第４番目のアドレスに格納された２個のＮＯＰ命令（Ｄ１，Ｄ２）が読み出される。
【００６９】
次のサイクルＴ７において、ＮＯＰ命令（Ａ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｄ１，Ｄ２）が命令キュー３０のエントリ３（ＱＥ３）に格納され、書込ポインタ３２の値Ｗが４に更新される。ＣＰＵ２は、命令キュー３０のエントリ０に登録された命令コードが全てＤステージに進むとエントリ０を更新するために命令フェッチリクエストＥを出力する。
【００７０】
次のサイクルＴ８において、ＮＯＰ命令（Ｂ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが２に更新される。メモリ６の第５番目のアドレスに格納された２個のＮＯＰ命令（Ｅ１，Ｅ２）が読み出される。
【００７１】
次のサイクルＴ９において、ＮＯＰ命令（Ｂ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｃ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｅ１，Ｅ２）が命令キュー３０のエントリ０（ＱＥ０）に格納され、書込ポインタ３２の値Ｗが５に更新される。ＣＰＵ２は、命令キュー３０のエントリ１に登録された命令コードが全てＤステージに進むとエントリ１を更新するために、命令フェッチリクエストＦを出力する。
【００７２】
次のサイクルＴ１０において、ＮＯＰ命令（Ｃ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｃ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが３に更新される。メモリ６の第６番目のアドレスに格納された２個のＮＯＰ命令（Ｆ１，Ｆ２）が読み出される。
【００７３】
次のサイクルＴ１１において、ＮＯＰ命令（Ｃ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｄ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｆ１，Ｆ２）が命令キュー３０のエントリ１（ＱＥ１）に格納され、書込ポインタ３２の値Ｗが６に更新される。
【００７４】
次のサイクルＴ１２において、ＮＯＰ命令（Ｄ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｃ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが４に更新される。
【００７５】
２．キャッシュヒットの場合の動作例（ショートループでない場合）
図１９は、キャッシュヒット時における図２のマイクロプロセッサの動作例を示すタイミング図である（ショートループでない場合）。
【００７６】
図２、図１９を参照して、サイクルＴ２においてＣＰＵ２が分岐命令を実行すると、ＣＰＵ２は分岐要求を発行するとともに、ＣＰＵ２は、命令キュー３０のエントリ２を更新するために命令フェッチリクエストＣを出力する。書込ポインタ３２の値Ｗは２に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００７７】
次のサイクルＴ３において、命令キャッシュメモリ４０のヒットしたエントリ０の前半（ＣＥ０＿０）から２個のＮＯＰ命令（Ａ１，Ａ２）が命令キュー３０のエントリ０（ＱＥ０）に転送され、エントリ０の後半（ＣＥ０＿１）から２個のＮＯＰ命令（Ｂ１，Ｂ２）が命令キュー３０のエントリ１（ＱＥ１）に転送される。２個のＮＯＰ命令（Ｃ１，Ｃ２）がメモリ６から読み出される。ＣＰＵ２は命令キュー３０のエントリ３を更新するために命令フェッチリクエストＤを出力する。
【００７８】
次のサイクルＴ４において、ＮＯＰ命令（Ａ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｃ１，Ｃ２）が命令キュー３０のエントリ２（ＱＥ３）に格納され、書込ポインタ３２の値Ｗが３に更新される。メモリ６の第４番目のアドレスに格納された２個のＮＯＰ命令（Ｄ１，Ｄ２）が読み出される。
【００７９】
次のサイクルＴ５において、ＮＯＰ命令（Ａ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ａ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが１に更新される。２個のＮＯＰ命令（Ｄ１，Ｄ２）が命令キュー３０のエントリ３（ＱＥ３）に格納され、書込ポインタ３２の値Ｗが４に更新される。
【００８０】
次のサイクルＴ６において、ＮＯＰ命令（Ａ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ１）がＣＰＵ２によってデコードされる。ＣＰＵ２は命令キュー３０のエントリ０を更新するために命令フェッチリクエストＥを出力する。
【００８１】
次のサイクルＴ７において、ＮＯＰ命令（Ｂ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが２に更新される。メモリ６の第５番目のアドレスに格納された２個のＮＯＰ命令（Ｅ１，Ｅ２）が読み出される。
【００８２】
次のサイクルＴ８において、ＮＯＰ命令（Ｂ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｃ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｅ１，Ｅ２）が命令キュー３０のエントリ０（ＱＥ０）に格納され、書込ポインタ３２の値Ｗが５に更新される。ＣＰＵ２は、命令キューのエントリ１を更新するために命令フェッチリクエストＦを出力する。
【００８３】
次のサイクルＴ９において、ＮＯＰ命令（Ｃ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｃ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが３に更新される。メモリ６の第６番目のアドレスに格納された２個のＮＯＰ命令（Ｆ１，Ｆ２）が読み出される。
【００８４】
次のサイクルＴ１０において、ＮＯＰ命令（Ｃ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｄ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｆ１，Ｆ２）が命令キュー３０のエントリ１（ＱＥ１）に格納され、書込ポインタ３２の値Ｗが６に更新される。
【００８５】
次のサイクルＴ１１において、ＮＯＰ命令（Ｄ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｄ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが４に更新される。
【００８６】
次のサイクルＴ１２において、ＮＯＰ命令（Ｄ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｅ１）がＣＰＵ２によってデコードされる。
【００８７】
３．ショートループの場合の動作例
図２０は、ショートループのプログラムの例を示す図である。図１９を参照して、最初の分岐命令の実行後の分記先のアドレスが１０００番地になる。その後、１０００番地から１０１８番地までＮＯＰ処理が４回実行され、１０２０番地の分岐命令ＢＲＡで再び１０００番地に戻るショートループ処理となっている。
【００８８】
図２１は、ショートループ処理時における図２マイクロプロセッサの動作例を示すタイミング図である。サイクルＴ１からＴ８までは、図１８の場合と同様であるので説明を繰り返さない。ただし、命令（Ｃ１）はＮＯＰ命令ではなく、分岐命令ＢＲＡとなっている。
【００８９】
図２、図２１を参照して、次のサイクルＴ９において、ＮＯＰ命令（Ｂ２）がＣＰＵ２によって実行される。分岐命令ＢＲＡ（Ｃ１）がＣＰＵ２によってデコードされる。２個のＮＯＰ命令（Ｅ１，Ｅ２）が命令キュー３０のエントリ０（ＱＥ０）に格納され、書込ポインタ３２の値Ｗが５に更新される。ＣＰＵ２は、命令キュー３０のエントリ１に登録された命令コードが全てＤステージに進むとエントリ１を更新するために、命令フェッチリクエストＦを出力する。
【００９０】
次のサイクルＴ１０において、分岐命令ＢＲＡ（Ｃ１）がＣＰＵ２によって実行され、ＣＰＵ２は分岐要求を出力する。分岐要求に応答して、ショートループ判定回路５２はショートループに該当すると判定する。書込ポインタ３２の値Ｗが４に設定され、読出ポインタ３３の値Ｒは０に設定される。
【００９１】
次のサイクルＴ１１において、命令キャッシュメモリ４０のヒットしたＭＲＵエントリ０の前半（ＣＥ０＿０）から２個のＮＯＰ命令（Ａ１，Ａ２）が命令キュー３０のＭＲＵエントリ０（ＱＥ０）に転送され、エントリ０の後半（ＣＥ０＿１）から２個のＮＯＰ命令（Ｂ１，Ｂ２）が命令キュー３０のエントリ１（ＱＥ１）に転送される。書込ポインタ３２の値Ｗと読出ポインタ３３の値Ｒとの差の絶対値が４に等しいために、ＣＰＵ２は命令フェッチリクエストを出力しない（命令フェッチが停止される）。
【００９２】
次のサイクルＴ１２において、ＮＯＰ命令（Ａ１）がＣＰＵ２によってデコードされる。
【００９３】
次にサイクルＴ１３において、ＮＯＰ命令（Ａ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ａ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが１に更新される。
【００９４】
次のサイクルＴ１４において、ＮＯＰ命令（Ａ２）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ１）がＣＰＵ２によってデコードされる。ＣＰＵ２は命令キュー３０のエントリ０を更新するために命令フェッチリクエストＥを出力する。
【００９５】
次のサイクルＴ１５において、ＮＯＰ命令（Ｂ１）がＣＰＵ２によって実行される。ＮＯＰ命令（Ｂ２）がＣＰＵ２によってデコードされ、読出ポインタ３３の値Ｒが２に更新される。メモリ６の第５番目のアドレスに格納された２個のＮＯＰ命令（Ｅ１，Ｅ２）が読み出される。
【００９６】
次のサイクルＴ１６〜Ｔ１８は、既に説明した図２１のサイクルＴ９〜Ｔ１１と同じである。
【００９７】
図２２は、図２１の比較例を示すタイミング図である。図２２の例では、ショートループ判定が行われない。このため、サイクルＴ１０において、書込ポインタ３２の値Ｗが２に設定され、読出ポインタ３３の値Ｒは０に設定される。この結果、サイクルＴ１０，Ｔ１１において、命令キュー３０のエントリ２，３を更新するための命令フェッチリクエストがマスクされない。図２２の場合と比較すると、図２１の場合には、ループ１周当たりの命令フェッチ要求回数が４回から２回に削減されている。
【００９８】
［実施の形態１の効果］
上記のとおり実施の形態１によれば、命令キューのサイズ程度のショートループの処理中で、再利用可能な命令コードが命令キュー内部に残っている場合、命令キューの内部に残っている命令コードを活用することによって、命令フェッチ要求をマスクする制御を行う。この結果、主記憶メモリへのアクセス回数を削減することができ、これにより、マイクロプロセッサの消費電力を削減することが期待できる。さらに、本実施の形態の方法では、マイクロプロセッサの性能を下げることがないため、性能あたりの消費電力を最適化することができる。
【００９９】
＜実施の形態２＞
実施の形態２によるマイクロプロセッサは、実施の形態１の場合の動作はほぼ同じであるが、命令フェッチ要求が出力される条件が異なる。具体的に、命令キュー３０のエントリ０の命令フェッチ要求は、エントリ１の命令が全てＤステージに進んだ際に行われる。命令キュー３０のエントリ１の命令フェッチ要求は、エントリ２の命令が全てＤステージに進んだ際に行われる。命令キュー３０のエントリ２の命令フェッチ要求は、エントリ３の命令が全てＤステージに進んだ際に行われる。命令キュー３０のエントリ３の命令フェッチ要求は、エントリ０の命令が全てＤステージに進んだ際に行われる。
【０１００】
図２３は、実施の形態２によるマイクロプロセッサの動作例を示すタイミング図である。図２３の例では、図２１と比較して命令フェッチリクエストが出力されるタイミングが異なっている。すなわち、図２３では、命令フェッチリクエストＤは命令Ａ２がＤステージに進んだタイミングで出力され、命令フェッチリクエストＥは命令Ｂ２がＤステージに進んだタイミングで出力されるため、図２１の場合と比べてそれぞれ２サイクル遅くなっている。
【０１０１】
この結果、図２１の場合には、ループ２周目以降のループ１周あたりの命令フェッチリクエスト回数が２回であったのに対して、図２３に示す実施の形態２の場合には、命令フェッチリクエストのタイミングが遅れるため、命令フェッチリクエストＦが無くなり、ループ１周あたりの命令フェッチリクエスト回数が１回に減る。この結果、命令フェッチ回数をさらに削減することができる。
【０１０２】
ただし、実施の形態２は命令長が長いなどの原因で命令の消費が早い場合には、命令フェッチが供給に追いつかずにＣＰＵの処理に遅延を生じさせる可能性がある。したがって、このような場合には、図２１の制御方法の方が望ましい。
【０１０３】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【符号の説明】
【０１０４】
１  マイクロプロセッサ、２  ＣＰＵ、５  データキャッシュメモリ、６  メモリ、７  ＳＲＡＭ、８  周辺回路、２０  命令フェッチユニット、３０  命令キュー、３１，５０  制御回路、３２  書込ポインタ、３３  読出ポインタ、４０  命令キャッシュメモリ、５１  命令フェッチ制御回路、５２  ショートループ判定回路、ＱＥ０〜ＱＥ３  命令キューのエントリ０〜３、ＣＥ０〜ＣＥ７  命令キャッシュメモリのエントリ０〜７。
【図１】
2014194586.tif 000003
【図２】
2014194586.tif 000004
【図３】
2014194586.tif 000005
【図４】
2014194586.tif 000006
【図５】
2014194586.tif 000007
【図６】
2014194586.tif 000008
【図７】
2014194586.tif 000009
【図８】
2014194586.tif 000010
【図９】
2014194586.tif 000011
【図１０】
2014194586.tif 000012
【図１１】
2014194586.tif 000013
【図１２】
2014194586.tif 000014
【図１３】
2014194586.tif 000015
【図１４】
2014194586.tif 000016
【図１５】
2014194586.tif 000017
【図１６】
2014194586.tif 000018
【図１７】
2014194586.tif 000019
【図１８】
2014194586.tif 000020
【図１９】
2014194586.tif 000021
【図２０】
2014194586.tif 000022
【図２１】
2014194586.tif 000023
【図２２】
2014194586.tif 000024
【図２３】
2014194586.tif 000025