(57)【要約】【課題】ストア命令とロード命令との順序入れ替わりの発生を抑制する【解決手段】  キャッシュメモリと、メモリアクセス命令をデコードするデコード部１２と、デコード部１２がデコードしたメモリアクセス命令を格納し、格納したメモリアクセス命令をキャッシュメモリに出力する格納部２２と、格納部２２にメモリアクセス命令を格納できるかを判断する判断部２０と、判断部２０が格納部２２にメモリアクセス命令を格納できないと判断した場合に、メモリアクセス命令に後続するメモリアクセス命令についての判断部２０による判断結果にかかわらず、所定期間、後続するメモリアクセス命令の実行を抑止する抑止部３０ａとを備える。【選択図】図６
2020060926.tif 000002
【特許請求の範囲】
【請求項１】
キャッシュメモリと、
メモリアクセス命令をデコードするデコード部と、
前記デコード部がデコードしたメモリアクセス命令を格納し、格納した前記メモリアクセス命令を前記キャッシュメモリに出力する格納部と、
前記格納部にメモリアクセス命令を格納できるかを判断する判断部と、
前記判断部が前記格納部にメモリアクセス命令を格納できないと判断した場合に、前記メモリアクセス命令に後続するメモリアクセス命令についての前記判断部による判断結果にかかわらず、所定期間、前記後続するメモリアクセス命令の実行を抑止する抑止部と
を備えることを特徴とする、演算処理装置。
【請求項２】
前記抑止部が、
前記判断部から出力される、前記判断部における判断結果を示す出力信号に基づく信号を伝搬する、直列に配置された複数の信号保持回路と、
前記信号保持回路のそれぞれから出力される信号が入力され、出力抑止信号を出力するＯＲゲートと、
を備え、
前記信号保持回路の数に応じた所定時間、メモリアクセス命令の実行を抑止した状態で維持する
ことを特徴とする、請求項１記載の演算処理装置。
【請求項３】
前記抑止部が、
複数の命令が、予め規定された順序で処理されているという命令順序要件を満たしているかを判断する、命令順序要件判断部を備え、
前記命令順序要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、請求項１または２記載の演算処理装置。
【請求項４】
前記抑止部が、
複数の命令においてアクセス先が一致するというアクセス先一致要件を満たしているかを判断する、アクセス先一致要件判断部を備え、
前記アクセス先一致要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、請求項１〜３のいずれか１項に記載の演算処理装置。
【請求項５】
前記抑止部が、
ストア命令の後にロード命令が発行されるという命令種類要件を満たしているかを判断する、命令種類要件判断部を備え、
前記命令種類要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、請求項１〜４のいずれか１項に記載の演算処理装置。
【請求項６】
キャッシュメモリと、メモリアクセス命令をデコードするデコード部と、前記デコード部がデコードしたメモリアクセス命令を格納し、格納した前記メモリアクセス命令を前記キャッシュメモリに出力する格納部とを有する演算処理装置の制御方法であって、
前記格納部にメモリアクセス命令を格納できるかを判断し、
前記格納部にメモリアクセス命令を格納できないと判断した場合に、前記メモリアクセス命令に後続するメモリアクセス命令についての前記判断部による判断結果にかかわらず、所定期間、前記後続するメモリアクセス命令の実行を抑止する
ことを特徴とする、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置および演算処理装置の制御方法に関する。
【背景技術】
【０００２】
情報処理装置が有する演算処理装置としてのプロセッサは、１つ又は複数のプロセッサコアを備える。
【０００３】
プロセッサコアは、命令キャッシュ、命令バッファ、デコード部、リザベーションステーション、演算実行部およびロードストアユニットを有する。プロセッサコアは、命令の実行に際して以下の処理を行なう。
【０００４】
命令キャッシュには命令が格納されており、読み出された命令は命令バッファに格納され、順次デコード部に送られる。デコード部は命令解釈を行ない、リザベーションステーションへの命令の投入を行なう。
【０００５】
リザベーションステーションには、演算命令を蓄積するＲＳＥ（Reservation Station  for Execution）およびロードストア命令を蓄積するＲＳＡ（Reservation Station for  Address）が含まれる。
【０００６】
リザベーションステーションから演算器への命令の投入の判断は各リザベーションステーションが行なう。この際の命令の投入は、演算器の使用効率の向上を図るべく、命令の並び順に依存せずに処理可能な命令から順次処理していくアウトオブオーダで行なわれる。ＲＳＡで選ばれたロード命令やストア命令はアドレス生成演算器で実行される。
【０００７】
ＲＳＡは、アドレス計算に用いるデータのために固定小数点レジスタ（ＧＰＲ）の番号を演算実行部に送る。このレジスタ番号を元に参照された固定小数点レジスタのデータはアドレス生成演算器に送られ、演算実行に使用される。アドレス生成演算器の出力はロード命令やストア命令がアクセスするメモリのアドレスである。
【０００８】
ＲＳＡは、アドレス計算が行なわれたタイミングに合わせてロードストアユニットにロードもしくはストアのリクエストを出す。ロードストアユニットは、そのリクエストを受けて、ロード命令やストア命令を蓄積するＬＤＳＴＱ（Load & Store Queue）に格納しつつ、ロードまたはストアを実行する。ＲＳＡは、ロードストアユニットにリクエストを出したタイミングでその命令が格納されていたエントリを解放し、その通知をデコード部に送る。
【０００９】
ロードストアユニットは、実行しているロード命令が完了した場合は固定小数点レジスタにメモリを読み出した結果を格納し、ＬＤＳＴＱを解放する。キャッシュミスなどでロード命令が完了しなかった場合は、そのリクエストはアボートしＬＤＳＴＱから再発行される。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００９−１９３３７８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、このような従来のプロセッサにおいては、キャッシュラインに対してデータをストアした後に、この同一のキャッシュラインからロードする、という命令列において、アウトオブオーダ制御によってストアよりも先にロードが実行されてしまうことがある。
【００１２】
この場合、ストア実行前にキャッシュメモリからデータを読み出すことで、誤ったデータを結果として返してしまう。ＬＤＳＴＱは、ＲＳＡから命令が発行されアドレス計算の後にリクエストを受け取らなければ、ロードの前にストアがあり、且つ、それがロードと同じアドレスを参照することを知ることができない。ＬＤＳＴＱがＲＳＡからの先行命令発行待ちをするような制御は、アウトオブオーダを無効にすることとほぼ等しく、性能の観点から行なわれない。
【００１３】
そのため、ロード命令は実行が首尾よくいったものとして、ＬＤＳＴＱから解放される。ロードの実行をやり直す必要があるが、やり直しを必要かどうかが判明するのはストア命令がＬＤＳＴＱに到達した時であるため、やり直しはストア命令をきっかけとしてその次の命令から行なわれることになる。そのため、ＲＳＡやＬＤＳＴＱから既に解放された命令に対してやり直しを行なうため、再び命令フェッチから実行することとなる。このやり直しの時間が性能低下に多大な影響を与えるという課題がある。
【００１４】
１つの側面では、本発明は、ストア命令とロード命令との順序入れ替わりの発生を抑制することを目的とする。
【課題を解決するための手段】
【００１５】
このため、この演算処理装置は、キャッシュメモリと、メモリアクセス命令をデコードするデコード部と、前記デコード部がデコードしたメモリアクセス命令を格納し、格納した前記メモリアクセス命令を前記キャッシュメモリに出力する格納部と、前記格納部にメモリアクセス命令を格納できるかを判断する判断部と、前記判断部が前記格納部にメモリアクセス命令を格納できないと判断した場合に、前記メモリアクセス命令に後続するメモリアクセス命令についての前記判断部による判断結果にかかわらず、所定期間、前記後続するメモリアクセス命令の実行を抑止する抑止部とを備える。
【発明の効果】
【００１６】
一実施形態によれば、ストア命令とロード命令との順序入れ替わりの発生を抑制することができる。
【図面の簡単な説明】
【００１７】
【図１】実施形態の一例としてのプロセッサコアに関連する命令パイプラインを示す図である。
【図２】実施形態の一例としてのプロセッサコアに関連するＬＤＳＴＱの管理方法を説明するための図である。
【図３】プロセッサコアにおける命令列の例を示す図である。
【図４】実施形態の一例としてのプロセッサコアに関連するプロセッサコアにおけるストア／ロードの順序入れ替わりについて説明するためのタイムチャートである。
【図５】第１実施形態の一例としてのプロセッサコアの構成を例示する図である。
【図６】第１実施形態の一例としてのプロセッサコアの命令パイプラインを示す図である。
【図７】第１実施形態の一例としてのプロセッサコアにおける処理を説明するためのタイムチャートである。
【図８】第２実施形態の一例としてのプロセッサコアの命令パイプラインを示す図である。
【図９】第２実施形態の一例としてのプロセッサコアにおける処理を説明するためのフローチャートである。
【図１０】第２実施形態の一例としてのプロセッサコアにおける処理を説明するためのフローチャートである。
【図１１】第２実施形態の一例としてのプロセッサコアにおける処理を説明するためのフローチャートである。
【図１２】第２実施形態のプロセッサコアの命令パイプラインの変形例を例示する図である。
【図１３】第２実施形態のプロセッサコアの変形例のストア−ロード確認部の構成を例示する図である。
【発明を実施するための形態】
【００１８】
以下、図面を参照して本演算処理装置および演算処理装置の制御方法に係る実施の形態を説明する。ただし、以下に示す実施形態はあくまでも例示に過ぎず、実施形態で明示しない種々の変形例や技術の適用を排除する意図はない。すなわち、本実施形態を、その趣旨を逸脱しない範囲で種々変形（実施形態および各変形例を組み合わせる等）して実施することができる。また、各図は、図中に示す構成要素のみを備えるという趣旨ではなく、他の機能等を含むことができる。
【００１９】
（Ａ）関連技術
プロセッサコアは、演算処理を行なう演算処理装置であり、ＣＰＵ（Central Processing Unit）に備えられる。
【００２０】
ＣＰＵはコンピュータ等の情報処理装置に備えられ、各種の演算処理を実現する。情報処理装置は、例えば、ＣＰＵ、メインメモリおよび記憶装置を備える。これらのＣＰＵ，メインメモリおよび記憶装置は、バスで接続され、互いに通信を行なう。ＣＰＵは、１つ又は複数のプロセッサコア１を有する。
【００２１】
図１は実施形態の一例としてのプロセッサコアに関連する命令パイプラインを示す図である。
【００２２】
命令パイプラインは、複数の処理段階（パイプラインステージ）を有する。処理段階には、例えば、Ｄ（Decode）サイクルおよびＤＴ（Decode Transfer）サイクルと呼ばれる処理段階が存在する。ＤサイクルおよびＤＴサイクルは、ロードストア命令および演算命令の双方に共通の処理段階である。
【００２３】
さらに、処理段階には、Ｐ（Priority）サイクル、ＰＴ（Priority Transfer）サイクル、Ｂ（Buffer）１サイクル、Ｂ（Buffer）２サイクル、およびＡ（Address Generate）サイクルと呼ばれる処理段階が存在する。
【００２４】
ロードストア命令は、ロードやストアを含むメモリに対するデータアクセスを伴うメモリアクセス命令であって、Ｐサイクル、ＰＴサイクル、Ｂ１サイクル、Ｂ２サイクルおよびＡサイクルの５つの処理段階を有する命令パイプライン１２００で実行される。以下、ロードストア命令を実行する命令パイプラインをロードストアパイプライン１２００という場合がある。ロードストアパイプライン１２００は、ＲＳＡ１３からＬＤＳＴＱ２２までの経路に対応する。
【００２５】
Ｄサイクルでは、デコード部１２が命令バッファ１１から命令を取得する。そして、デコード部１２は、取得した命令をデコードし、デコードした命令を、リザベーションステーションのＲＳＡ１３へ送るためにフリップフロップ１０１へ出力する。Ｄサイクルでは、デコード部１２により、ＬＤＳＴＱ２２へ向けて出力されるロードストア命令の数の管理や、ロードストア命令に対するＬＤＳＴＱ２２のエントリの仮の割り当てが行なわれる。ここで、仮の割当とは、ＬＤＳＴＱ２２のエントリ数を仮想的に増やした識別情報を仮想のエントリとしてロードストア命令に割り当てることを指す。
【００２６】
ＤＴサイクルでは、Ｄサイクルでデコードされた命令がフリップフロップ１０１を経由して転送され、リザベーションステーションのＲＳＡ１３に格納される。
【００２７】
次に、ロードストアパイプライン１２００の各処理段階について説明する。Ｐサイクルでは、リザベーションステーションのＲＳＡ１３が有する命令の中から、エントリ選択部１６が、アドレス生成演算部２１へ投入する命令を決定する。そして、エントリ選択部１６は、決定した命令のデータをフリップフロップ１０２へ出力する。
【００２８】
ＰＴサイクルでは、Ｐサイクルで決定された命令の命令コードが、フリップフロップ１０２からフリップフロップ１０３へ転送される。
【００２９】
Ｂ１サイクルおよびＢ２サイクルでは、固定小数点レジスタ（ＧＰＲ）からデータが読み出されるタイミングに合わせてフリップフロップ１０３〜１０５によりデータに遅延が与えられる。それとともに、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２から出力されたＬＤＳＴＱ解放信号を用いて、Ｄサイクルで仮に割り当てたエントリに対応するＬＤＳＴＱ２２のエントリが実際に空いているか否かのチェックを行なう。
【００３０】
ＬＤＳＴＱ２２のエントリが空いている場合、実ＬＤＳＴＱ管理部２０は、アドレス生成演算部２１へ入力する命令コードをフリップフロップ１０５へ出力する。一方、ＬＤＳＴＱ２２のエントリが空いていない場合、実ＬＤＳＴＱ管理部２０は、ＲＳＡ１３へ戻す命令コードをフリップフロップ１０５へ出力するとともに、インターロック信号をフリップフロップ１０５へ出力する。
【００３１】
Ａサイクルでは、ＬＤＳＴＱ２２のエントリが空いていない場合、フリップフロップ１０５を経由した命令コードは、実行をキャンセルされＲＳＡ１３へ戻される。さらに、フリップフロップ１０５を経由したインターロック信号がＲＳＡ１３へ送信される。これに対して、ＬＤＳＴＱ２２のエントリが空いている場合、フリップフロップ１０５を経由した命令コードは、アドレス生成演算部２１へ入力される。さらに、アドレス生成演算に用いられるデータがアドレス生成演算部２１に入力される。
【００３２】
アドレス生成演算部２１は、アドレス生成演算を行ない、生成したアドレスおよびロードストア要求をＬＤＳＴＱ２２へ送る。ＬＤＳＴＱ２２は、アドレスをデータキャッシュ（図１においては図示省略）に対して出力すると、ＬＤＳＴＱ解放信号をＲＳＡ１３および実ＬＤＳＴＱ管理部２０へ出力する。
【００３３】
実ＬＤＳＴＱ管理部２０は、実際のＬＤＳＴＱ２２のエントリ数を用いてロードストア命令がエントリに割り当て可能か否か、すなわち、ロードストア命令をＬＤＳＴＱ２２に格納可能か否かを判定する。ロードストア命令がエントリに割り当て可能な場合、デコード部１２により与えられた仮のエントリが実ＬＤＳＴＱ管理部２０においてＬＤＳＴＱ２２の実際のエントリに変更される。
【００３４】
このように、デコード部１２においてＬＤＳＴＱ２２のエントリ数よりも大きい命令発行上限数を上限としてロードストア命令に仮のエントリ番号が割り当てられる。そして、後ろの処理段階であるＢ２サイクルに配置された実ＬＤＳＴＱ管理部２０において、ＬＤＳＴＱ２２の実際の空きがチェックされる。これにより、ＬＤＳＴＱ解放信号がＬＤＳＴＱ２２から出力されてからＬＤＳＴＱ２２のエントリに新たにロードストア命令が割り当てられるまでのサイクル数を短縮することができる。すなわち、ＬＤＳＴＱ２２のエントリが解放されてから、その空いたエントリが埋まるまでのサイクル数を短縮することができる。
【００３５】
例えば、デコード部１２で実際のＬＤＳＴＱ２２のエントリをロードストア命令に割り当てる場合、空いたエントリが埋まるまでのサイクルは、最大でＤサイクルからＡサイクルまでの７サイクルかかる。これに対して、実ＬＤＳＴＱ管理部２０で実際のＬＤＳＴＱ２２のエントリをロードストア命令に割り当てる場合、空いたエントリが埋まるまでのサイクルは、最大でＢ２サイクルおよびＡサイクルの２サイクルに短縮することができる。また、インターロックがＲＳＡ１３でかかっている場合であっても、ＬＤＳＴＱ解放信号が出力されてから空いたエントリが埋まるまでのサイクルを、最大でＰサイクルからＡサイクルまでの５サイクルに短縮することができる。
【００３６】
ここで、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２に格納するロードストア命令が選択されてからロードストア命令に対して実際のＬＤＳＴＱ２２のエントリの割り当てを行なうことで処理を減らしている。例えば、ＲＳＡ１３において仮の割り当てを実際のＬＤＳＴＱ２２のエントリへの割り当てに変換できるかを判定する場合、ＲＳＡ１３が保持するロードストア命令全てに対して判定を行なう機構が配置されてもよい。ＲＳＡ１３は、最大で命令発行上限数のロードストア命令を保持するため、実際のＬＤＳＴＱ２２のエントリへの割り当て判定用の機構が配置される。
【００３７】
このようにＬＤＳＴＱ２２に格納するロードストア命令の選択前の段階で判定を行なう場合、回路規模が大きくなってしまう。そこで、実ＬＤＳＴＱ管理部２０は、エントリ選択部１６の後に配置されることが好ましい。そして、実ＬＤＳＴＱ管理部２０は、エントリ選択部１６とアドレス生成演算部２１の間であればどの場所に配置することも可能であるが、なるべくアドレス生成演算部２１に近い場所に配置することが好ましい。アドレス生成演算部２１に近いほど、ＬＤＳＴＱ解放信号が出力されてから空いたエントリが埋まるまでのサイクルを短縮することができるからである。
【００３８】
上述したＤサイクルでは仮のＬＤＳＴＱ番号を割り当て、Ｂ２サイクルで仮のＬＤＳＴＱ番号を元に実際にＬＤＳＴＱに空きがあるかの判定が行なわれる。Ｂ２サイクルで空きが無いと判定されると、命令はＲＳＡ１３に戻され、ＬＤＳＴＱ２２に空きが無いときに発行を繰り返すのを防ぐために発行抑止のインターロックがかけられる。ＬＤＳＴＱ２２の使用数の管理のため、ＬＤＳＴＱ解放信号がデコード部１２とＢ２サイクルとに送られる。また、インターロックの解除のためにＲＳＡ１３にもＬＤＳＴＱ解放信号は送られる。
【００３９】
図２は実施形態の一例としてのプロセッサコアに関連するＬＤＳＴＱの管理方法を説明するための図である。
【００４０】
図２に示すＬＤＳＴＱ２２は、実際にはIDが0〜9の10エントリとして構成されるとともに、これらのIDにX_ID（0〜3）を付して表すことで仮想的に拡張され、40エントリあるものとして管理される。
【００４１】
図２において、符号（ａ）は初期状態におけるＬＤＳＴＱ２２の使用状況を示す。符号（ｂ）はある時点におけるＬＤＳＴＱ２２の使用状態を示し、符号（ｃ）は符号（ｂ）で示した状態から所定時間経過後の時点におけるＬＤＳＴＱ２２の使用状態を示す。
【００４２】
ＴＯＱ（Top of Queue）は、ＬＤＳＴＱ２２に格納されたロードストア命令のうち先頭のロードストア命令の位置（ＬＤＳＴＱ番号）を示す。
【００４３】
実際のＬＤＳＴＱ２２は10エントリなので、初期状態では、符号（ａ）で示すように、ID_X=0でID=0から10エントリ分の太枠で囲まれた部分が実際に使用可能なID_XとIDとの組み合わせである。
【００４４】
Ｂ２サイクルの実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２が空いているかの判定としてデコード部の割り当てたIDとID_Xとがこの太枠内に入っているかの確認を行なう。
【００４５】
ＴＯＱの更新はＬＤＳＴＱ２２の解放によって行なうので、例えば符号（ａ）で示した状態から2エントリ解放されたときは、符号（ｂ）で示す状態に移行する。ＬＤＳＴＱ２２のエントリの解放はインオーダでありＴＯＱから解放されるため、ＴＯＱが2つ進んだエントリであるID_X=0，ID=2に移動する。ＴＯＱが移動したため有効な10エントリを示す枠線も2エントリずれる。同じID=0でも符号（ａ）で示す状態ではID_X=0が有効だったものが、符号（ｂ）に示す状態においては無効になりID_X=1が有効になっている。
【００４６】
ＬＤＳＴＱ２２のIDとID_Xとの割り当ては、仮ＬＤＳＴＱ管理部１２１によって行なわれ、IDとID_Xとは番号順に割り当てられる。IDおよびID_Xはそれぞれサイクリックに更新される。すなわち、IDおよびID_Xはそれぞれラップアラウンドとなる。例えば、IDが（ここでは例として10エントリなので）9を超えると次は0になり、ID_Xはインクリメントされる。
【００４７】
次にＬＤＳＴＱ２２のチェックタイミングのずれによるストアとロードの順序入れ替わりが発生するまでの動作を説明する。
【００４８】
図３はプロセッサコアにおける命令列の例を示す図である。
【００４９】
この図３においては、ストア命令（store）とロード命令（load）とを示す。この図３に例示するストア命令は、g10に格納されているデータに+4したメモリアドレスに対して、固定小数点レジスタg4に格納されているデータを書き込む。
【００５０】
また、図３に例示するロード命令は、固定小数点レジスタg10に格納されているデータに+4したメモリアドレスを参照し、その読み出しデータをg5に格納する。
【００５１】
これらのストア命令とロード命令とは同じ固定小数点レジスタg10を参照し、足しこむ値も同じなので全く同じメモリアドレスにアクセスする。つまり、このロード命令がメモリから読み出すデータはストア命令が格納したg4の値であるため、ロード命令はストア命令の実行後に実行されなければデータの整合性が保たれない。
【００５２】
この順序が入れ替わることがストア／ロード発行順の入れ替わりであり、このようなストア命令とロード命令との順序入れ替わりが発生すると、その場合はデータの整合性が保たれなくなってしまう。
【００５３】
図４は実施形態の一例としてのプロセッサコアに関連するプロセッサコアにおけるストア／ロードの順序入れ替わりについて説明するためのタイムチャートである。
【００５４】
この図４においては、図３に例示した、ストア命令（store）とロード命令（load）とを処理する例について示す。
【００５５】
図４に示す例において、サイクル1で“store”が、また、サイクル2で“load”が、ＲＳＡ１３によってそれぞれ選ばれる。なお、ＲＳＡ１３は基本的に古い命令から優先的に選ぶ。この時点で命令順序は入れ替わっていない。
【００５６】
サイクル4で“store”のために実ＬＤＳＴＱ管理部２０がＬＤＳＴＱ２２の空き判定を行なう。この時点のＬＤＳＴＱ２２の状態を図２の符号（ｂ）で示す状態とする。図３に示すように、“store”のLDSTQ_IDが2でID_Xが1であるので、図２の符号（ｂ）における太枠内に入っていない。そのため、空きが無いと判定され、サイクル4でchk_ngとなる。
【００５７】
これにより、“store”はサイクル6でＲＳＡ１３に戻され、サイクル7で再びＲＳＡ１３によって選ばれる。ＬＤＳＴＱ解放がサイクル4で2になっているため、次のサイクル5ではＬＤＳＴＱ２２は2エントリ進んだ図２（ｃ）の状態になる。このタイミングにおいては“store”のＬＤＳＴＱ２２に空きはあるが既に判定済のため、ＲＳＡ１３に戻される決定は覆らない。
【００５８】
一方、“load”に関して、実ＬＤＳＴＱ管理部２０は、サイクル5のタイミングでＬＤＳＴＱ２２の空き判定を行なうため、IDとID_Xとが“store”よりも後ろにも関わらず空いていると判定される（chk_ok）。そのため、“load”はサイクル6のタイミングでＬＤＳＴＱ２２へと送られる。この時点で“load”が“store”を追い抜いてしまい、ストアとロードとの順序入れ替わりが発生する。
【００５９】
上述した関連技術のプロセッサコアにおいては、ストア−ロード間の発行順入れ替わりの機会を増大させてしまうという問題がある。
【００６０】
ストア命令とロード命令とが本来の順序でＲＳＡ１３から発行されたときに、先行するストア命令だけがＬＤＳＴＱ２２の割り当てを失敗するケースがあり得る。ＬＤＳＴＱ２２の割り当てを行なうに際して、ＲＳＡ１３から発行された命令に対して、仮で割り当てられたＬＤＳＴＱ２２が実際に空いているかのチェックが行なわれる。
【００６１】
また、ＬＤＳＴＱ２２は先頭から順に解放され、同時に複数エントリが解放されることがあり得る。そして、あるタイミングにおいて、先行のストア命令ではＬＤＳＴＱ２２は解放されておらず割り当てることができないが、次のサイクルで実行される後続のロード命令のチェックまでに多数のＬＤＳＴＱ２２が解放され、ロード命令はＬＤＳＴＱ２２に割り当て可能となることがある。
【００６２】
このような場合、ストア命令は割り当てが失敗するので、一旦、ＲＳＡ１３に戻されて再発行されるが、その隙にロード命令がＬＤＳＴＱ２２に発行されてしまう。このような動作によって、前述の如きストア命令とロード命令との実行順の入れ替わりが発生してしまう。
【００６３】
（Ｂ）第１実施形態
実施形態の一例としてのプロセッサにおいては、同一アドレスに対するストア命令とロード命令との実行順入れ替わりにおけるやり直しのリスクを低減する。
（Ｂ−１）構成
図５は第１実施形態の一例としてのプロセッサコア１の構成を例示する図である。
【００６４】
情報処理装置は、１つ又は複数のプロセッサコア１を有するプロセッサを備える。プロセッサは演算処理装置である。
【００６５】
図５に例示するプロセッサコア１は、命令キャッシュ１０、命令バッファ１１、デコード部１２、ＲＳＡ１３、演算実行部１４およびロードストアユニット１５を備える。プロセッサコア１は、命令の実行に際して以下の処理を行なう。
【００６６】
命令キャッシュ１０には命令が格納されており、命令キャッシュ１０から読み出された命令は命令バッファ１１に格納され、順次デコード部１２に送られる。デコード部１２は命令解釈を行ない、リザベーションステーションへの命令の投入を行なう。
【００６７】
リザベーションステーションには、演算命令を蓄積するＲＳＥ（命令：図示省略）およびロードストア命令を蓄積するＲＳＡ１３が含まれる。ロードストア命令はメモリアクセス命令である。また、リザベーションステーションには分岐命令を蓄積するＲＳＢＲ（Reservation Station for Branch）を含んでもよい。
【００６８】
リザベーションステーションから演算器への命令の投入の判断は各リザベーションステーションが行なう。この際の命令の投入はアウトオブオーダ、つまり本来の命令順ではなくレジスタ依存が解消されたものを優先してリザベーションステーションから発行することで演算器の使用効率の向上を図る。
【００６９】
ＲＳＡ１３は、仮ＬＤＳＴＱ番号とともにロードストア命令の入力をデコード部１２から受ける。ＲＳＡ１３は、取得したロードストア命令を仮ＬＤＳＴＱ番号とともに蓄積する。そして、ＲＳＡ１３は、蓄積したロードストア命令の中から出力するロードストア命令を選択する。その後、ＲＳＡ１３は、選択したロードストア命令においてデータの読み出し又は書き込みなどを表す命令コード（命令ID）を仮ＬＤＳＴＱ番号とともに実ＬＤＳＴＱ管理部２０へ出力する。また、ＲＳＡ１３は、選択したロードストア命令で指定される固定小数点レジスタ番号をＧＰＲ１４１へ出力する。さらに、ＲＳＡ１３は、ロードストア命令を出力したことを表すＲＳＡ１３の解放信号をデコード部１２へ出力する。
【００７０】
ＲＳＡ１３は、ＬＤＳＴＱ２２へ出力されなかったロードストア命令の入力を実ＬＤＳＴＱ管理部２０から受ける。さらに、ＲＳＡ１３は、戻されたロードストア命令とともに、インターロック信号の入力を実ＬＤＳＴＱ管理部２０から受ける。そして、ＲＳＡ１３は、戻されたロードストア命令にインターロックを掛けてそのロードストア命令の出力を待機する。
【００７１】
この時、ＲＳＡ１３は、インターロックを掛けていないロードストア命令については実ＬＤＳＴＱ管理部２０への出力を継続する。そのため、ＲＳＡ１３は、複数のロードストア命令がインターロック信号とともに実ＬＤＳＴＱ管理部２０から戻される場合がある。その場合、ＲＳＡ１３は、戻されたロードストア命令の全てにインターロックを掛け出力を待機する。これにより、ＬＤＳＴＱ２２が長時間解放されない場合に、ＲＳＡ１３が繰り返し同じロードストア命令を発行してしまい、他の命令の発行を妨げて本プロセッサコア１の処理性能が低下してしまうことを防ぐことができる。
【００７２】
その後、ＲＳＡ１３は、ＬＤＳＴＱ解放信号の入力をＬＤＳＴＱ２２から受ける。そして、ＬＤＳＴＱ解放信号の入力をトリガとして、ＲＳＡ１３は、インターロックを掛けた全てのロードストア命令のインターロックを解除する。そして、ＲＳＡ１３は、インターロックを解除したロードストア命令の再発行を含む保持する全てのロードストア命令の出力を順次行なう。
【００７３】
ここで、ＬＤＳＴＱ２２の開放は本来の命令順にしたがって行なわれる。そこで、前のロードストア命令が出力されない場合、その後のロードストア命令を格納するエントリも解放されない。そのため、ひとたびＬＤＳＴＱ２２からＬＤＳＴＱ解放信号が出力された場合、ＲＳＡ１３は、連続でＬＤＳＴＱ２２からＬＤＳＴＱ解放信号の入力を受ける可能性が高い。
【００７４】
そこで、ＲＳＡ１３は、１つのＬＤＳＴＱ解放信号を受けた際に、全てのインターロックを解除することで、その後に解放信号を受ける可能性の高いロードストア命令を前もって出力することができる。これにより、ＬＤＳＴＱ解放信号が出力されるタイミングでの新しいロードストア命令のＬＤＳＴＱ２２への格納が可能となり、ロードストア命令のＬＤＳＴＱ２２への格納の効率が向上する。さらに、このインターロックの解除には、ＬＤＳＴＱ２２のエントリ番号の把握や空き数の勘定を用いないので、本プロセッサコア１における回路増加が抑えられる。
【００７５】
ＲＳＡ１３で選ばれたロード命令やストア命令はアドレス生成演算部２１で実行される。ＲＳＡ１３は、アドレス計算に用いるデータのために固定小数点レジスタ（ＧＰＲ）の番号を演算実行部１４に送る。このレジスタ番号を元に参照された固定小数点レジスタのデータはアドレス生成演算部２１に送られ、演算実行に使用される。アドレス生成演算部２１の出力はロード命令やストア命令がアクセスするメモリのアドレスである。
【００７６】
ＲＳＡ１３は、蓄積したロード命令やストア命令の中で発行可能なもののうち最も古いものを選ぶ。その命令はアドレス生成演算部２１で実行される。
【００７７】
ＲＳＡ１３は、アドレス生成に用いるデータのために固定小数点レジスタ（ＧＰＲ：General Purpose Register）の番号を演算実行部１４に送る。このレジスタ番号を元に参照されたＧＰＲの読み出しデータはアドレス生成演算部２１に送られ、演算実行に使用される。アドレス生成演算部２１の出力は、ロード命令やストア命令がアクセスするメモリのアドレスである。
【００７８】
ＲＳＡ１３は、アドレス生成が行なわれたタイミングに合わせてロードストアユニット１５にロードもしくはストアのリクエストを出す。ロードストアユニット１５は、そのリクエストを受けて、ロード命令やストア命令を蓄積するＬＤＳＴＱ２２（例えば10エントリ）に格納しつつ、ロードまたはストアを実行する。ＲＳＡ１３は、ロードストアユニット１５にリクエストを出したタイミングでその命令が格納されていたエントリを解放し、その通知をデコード部１２に送る。
【００７９】
ロードストアユニット１５は、データキャッシュ１５１およびＬＤＳＴＱ２２を備える。ロードストアユニット１５は、実行しているロード命令やストア命令が完了した場合は、固定小数点レジスタ（ＧＰＲ）１４１にメモリを読み出した結果を格納する。命令の処理が完了すると、ロードストアユニット１５はＬＤＳＴＱ２２のエントリを解放する。ＬＤＳＴＱ２２のエントリの解放は、ldstq_IDの番号順に従う。つまり、先行命令が完了しないと解放できない本来の命令順に従うインオーダ制御を行なう。ＬＤＳＴＱの解放信号は、デコード部１２やＲＳＡ１３等に送信される。キャッシュミスなどでロード命令が完了しなかった場合は、そのリクエストはアボートしＬＤＳＴＱ２２から再発行される。命令はパイプラインで処理される。
【００８０】
実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２のエントリ数の情報を予め有する。実ＬＤＳＴＱ管理部２０は、ロードストア命令の命令IDの入力をＲＳＡ１３から受ける。また、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ解放信号の入力をＬＤＳＴＱ２２から受ける。
【００８１】
実ＬＤＳＴＱ管理部２０は、自己がＬＤＳＴＱ２２へ出力したロードストア命令の数とＬＤＳＴＱ２２から入力されたＬＤＳＴＱ解放信号とから、ＬＤＳＴＱ２２が保持するロードストア命令の数を求める。そして、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２が保持するロードストア命令の数がＬＤＳＴＱ２２のエントリ数未満か否かを判定する。
【００８２】
ＬＤＳＴＱ２２が保持するロードストア命令の数がＬＤＳＴＱ２２のエントリ数未満であれば、実ＬＤＳＴＱ管理部２０は、ＲＳＡ１３から入力されたロードストア命令の命令コードをアドレス生成演算部２１へ出力する。一方、ＬＤＳＴＱ２２が保持するロードストア命令の数がＬＤＳＴＱ２２のエントリ数以上の場合、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２がフル、すなわちＲＳＡ１３から入力されたロードストア命令の格納場所がＬＤＳＴＱ２２に無い（空きなし）と判定する。実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２にロードストア命令を格納できるかを判断する判断部として機能する。
【００８３】
ＬＤＳＴＱ２２がフル（空きなし）の場合、実ＬＤＳＴＱ管理部２０は、ＲＳＡ１３から入力されたロードストア命令をＲＳＡ１３へ戻すとともにインターロック信号をＲＳＡ１３へ送信する。ＲＳＡ１３から入力されたロードストア命令をＲＳＡ１３へ戻すことは、実ＬＤＳＴＱ管理部２０がそのロードストア命令を破棄し、ＲＳＡ１３にそのロードストア命令の再送信を要求することにあたる。
【００８４】
アドレス生成演算部２１は、ロードストア命令の命令コードの入力を実ＬＤＳＴＱ管理部２０から受ける。さらに、アドレス生成演算部２１は、計算に使用する値の入力をＧＰＲ１４１から受ける。そして、アドレス生成演算部２１は、ＧＰＲ１４１から入力された値を用いてアドレスを生成する。例えば、アドレス生成演算部２１は、ＧＰＲ１４１から入力された値を所定倍するなどしてアドレスを生成する。そして、アドレス生成演算部２１は、生成したアドレスと命令コードとをＬＤＳＴＱ２２へ出力し、生成したアドレスおよび命令コードをＬＤＳＴＱ２２に格納する。
【００８５】
ＬＤＳＴＱ２２は、デコード部１２がデコードしたロードストア命令（メモリアクセス命令）を格納し、格納したロードストア命令をデータキャッシュ（キャッシュメモリ）１５１に出力する格納部である。
【００８６】
ＬＤＳＴＱ２２は、ロードストア命令の命令コードおよび処理対象のアドレスの入力をアドレス生成演算部２１から受ける。そして、ＬＤＳＴＱ２２は、アドレス生成演算部２１からエントリ数を上限としてロードストア命令の命令コードおよび処理対象のアドレスを格納する。ここでは、ＬＤＳＴＱ２２におけるロードストア命令の命令IDおよび処理対象のアドレスの格納を、単にＬＤＳＴＱ２２におけるロードストア命令の格納という。ＬＤＳＴＱ２２は、処理順にロードストア命令を格納する。
【００８７】
そして、ＬＤＳＴＱ２２は、処理の順番が早い順にロードストア命令を処理する。具体的には、ＬＤＳＴＱ２２は、１つ前のロードストア命令の処理が完了すると、次のロードストア命令で指定されたアドレスをデータキャッシュ１５１に送信する。そして、ＬＤＳＴＱ２２は、格納したロードストア命令の処理が完了すると、ＬＤＳＴＱ解放信号をデコード部１２，ＲＳＡ１３および実ＬＤＳＴＱ管理部２０へ出力する。ここで、データキャッシュ１５１によるキャッシュミスなどでロードストア命令が完了しなかった場合、既に出力されたロードストア命令は中断され、ＬＤＳＴＱ２２は、同じロードストア命令を再発行する。このＬＤＳＴＱ２２が、格納部の一例にあたる。
【００８８】
データキャッシュ１５１は、命令コードおよびアドレスの入力をＬＤＳＴＱ２２から受ける。そして、データキャッシュ１５１は、指定されたアドレスに対応するデータが有る場合、そのデータを用いて処理を行なう。
【００８９】
ロード命令の場合、指定されたアドレスにデータが無ければ、データキャッシュ１５１は、図示しないメインメモリからデータを取得する。そして、データキャッシュ１５１は、取得したデータを自己に格納するとともに取得したデータをＧＰＲ１４１に格納する。また、ストア命令の場合、データキャッシュ１５１は、取得したデータを自己に格納するとともに取得したデータをメインメモリの指定されたアドレスに格納する。
【００９０】
図６は第１実施形態の一例としてのプロセッサコア１の命令パイプライン（ロードストアパイプライン）を示す図である。
【００９１】
なお、図中、既述の符号と同一の符号は同様の部分を示しているので、その説明は省略する。
【００９２】
図６に例示する本第１実施形態の一例としてのプロセッサコア１の命令パイプライン（ロードストアパイプライン）１２００ａは、図１に示した命令パイプライン１２００に加えて、check_ng伝搬部３０ａを備える。
【００９３】
check_ng伝搬部３０ａは、実ＬＤＳＴＱ管理部２０とフリップフロップ１０５との間に介装される。
【００９４】
check_ng伝搬部３０ａは、図６に示すように、ＡＮＤゲート３１，ＯＲゲート３２，反転回路４０１，４０２および１つ以上（図６に示す例では５つ）のフリップフロップ（信号保持回路）３３〜３７を備える。
【００９５】
ＡＮＤゲート３１は、実ＬＤＳＴＱ管理部２０の下流側に配置される。実ＬＤＳＴＱ管理部２０は、ストア命令（store）を発行するに際して、ＬＤＳＴＱ２２のエントリが空いているか否かのチェックを行ない、ＬＤＳＴＱ２２のエントリに空きがある場合には、check_ok信号として1を出力する。
【００９６】
一方、実ＬＤＳＴＱ管理部２０は、ＬＤＳＴＱ２２のエントリが空いているか否かのチェックを行なった結果、ＬＤＳＴＱ２２のエントリに空きがない合には、check_ok信号として0を出力する。ＬＤＳＴＱ２２に空きが無いと判定された場合には、ストア命令の発行はキャンセルされ、ストア命令はＲＳＡ１３に戻される。また、命令発行抑止のインターロックがかけられる。
【００９７】
ＡＮＤゲート３１には、実ＬＤＳＴＱ管理部２０から出力されるcheck_ok信号が入力される。ＡＮＤゲート３１は、実ＬＤＳＴＱ管理部２０の出力信号（check_ok）を、その命令自身以外からの入力で0に落として、ldstq_go信号として出力する。
【００９８】
ldstq_go信号はフリップフロップ１０５を介してアドレス生成演算部２１に入力される。ldstq_go=0の場合、命令はＬＤＳＴＱ２２に発行されずＲＳＡ１３に戻る。
【００９９】
実ＬＤＳＴＱ管理部２０から出力されるcheck_ok信号は、反転回路４０２にも入力される。反転回路４０２はcheck_ok信号を極性反転させたcheck_ng信号をフリップフロップ３３に入力する。フリップフロップ３３の下流にはフリップフロップ３４〜３７が直列に配置されている。これにより反転回路４０２から出力されるcheck_ng信号は、複数（本実施形態においては５つ）のフリップフロップ３３〜３７に順次、伝搬された後、ＯＲゲート３２に入力される。また、フリップフロップ３３〜３６の各出力も、それぞれＯＲゲート３２に入力される。
【０１００】
check_ng伝搬部３０aにおいては、複数のフリップフロップ３３~３７を直列に配置し、実ＬＤＳＴＱ管理部２０から出力されるcheck_ok信号に基づくcheck_ng信号を順次伝搬する。
これにより、これらのフリップフロップ３３〜３７の数（本実施形態においては５つ）に応じた所定時間（本実施形態では５サイクル分）だけ出力が維持され、実ＬＤＳＴＱ管理部２０からフリップフロップ１０５へのldstq_go信号の入力を遅延させる。すなわち、check_ng伝搬部３０ａにおいては、直列に配置された複数のフリップフロップ３３〜３７と、各フリップフロップ３３〜３７からの出力がそれぞれ入力されるＯＲゲート３２とにより、所定時間（例えば、５サイクル分）check_ngの出力を維持する出力維持回路が構成される。
【０１０１】
この出力維持回路は、実ＬＤＳＴＱ管理部２０からＬＤＳＴＱ２２に空きがない旨を示すcheck_ok信号=０が出力されると、所定期間（本実施形態では５サイクル分）だけ、フリップフロップ１０５へ入力されるldstq_go信号を０に維持する。実ＬＤＳＴＱ管理部２０からその後check_ok信号=１が出力されたとしても、所定時間が経過するまでは、ldstq_go信号は０に維持される。
【０１０２】
Ｂ２サイクルにおいて出力されたcheck_ok信号は、反転回路４０２を介してフリップフロップ３３に入力される。その後、Ｂ２＋１サイクルにおいて、フリップフロップ３３から出力されるcheck_ng信号は、フリップフロップ３４とＯＲゲート３２とにそれぞれ伝搬される。
【０１０３】
同様に、Ｂ２＋２サイクルにおいて、フリップフロップ３４から出力されるcheck_ng信号は、フリップフロップ３５とＯＲゲート３２とにそれぞれ伝搬される。また、Ｂ２＋３サイクルにおいて、フリップフロップ３５から出力されるcheck_ng信号は、フリップフロップ３６とＯＲゲート３２とにそれぞれ伝搬される。また、Ｂ２＋４サイクルにおいて、フリップフロップ３６から出力されるcheck_ng信号は、フリップフロップ３７とＯＲゲート３２とにそれぞれ伝搬される。また、Ｂ２＋５サイクルにおいて、フリップフロップ３７から出力されるcheck_ng信号は、ＯＲゲート３２に伝搬される。
【０１０４】
すなわち、実ＬＤＳＴＱ管理部２０によるＬＤＳＴＱ２２のチェック結果（check_ok）を極性反転させたcheck_ng信号は、フリップフロップ３３〜３７を通じて５サイクル後まで伝搬され、その伝搬途中において各フリップフロップ３３〜３７から出力される信号がＯＲゲート３２に入力される。
【０１０５】
ＯＲゲート３２からはinh_ldstq_go信号が出力される。このinh_ldstq_go信号は反転回路４０１に入力されて極性反転された後、ＡＮＤゲート３１に入力される。
【０１０６】
反転回路４０１の出力はinh_ldstq_go信号を反転させた信号であり、ＬＤＳＴＱ２２への命令発行を抑止するために用いられる。ひとたび実ＬＤＳＴＱ管理部２０においてcheck_ngが検出されると、以降5サイクルにわたって、inh_ldstq_go信号に1が出力される。inh_ldstq_go信号に1が出力されている間は、ldstq_go=0がフリップフロップ１０５（アドレス生成演算部２１）に入力される。
【０１０７】
すなわち、ひとたび実ＬＤＳＴＱ管理部２０においてcheck_ngが検出されると、以降5サイクルにわたって、ＲＳＡ１３から発行される後続の命令に対して、ＬＤＳＴＱ２２への発行抑止とＲＳＡ１３への戻しが行なわれる。
【０１０８】
このように、実ＬＤＳＴＱ管理部２０のＬＤＳＴＱチェック結果（check_ok）を極性反転させたcheck_ng信号をフリップフロップ３３〜３７を通じて5サイクル後まで伝搬させ、伝搬途中の信号をＯＲゲート３２の入力として用いられる。そしてこのＯＲゲート３２の出力信号は、反転回路４０１により極性反転させてＡＮＤゲート３１に入力され、ldstq_goを0に落とすために用いられる。
【０１０９】
check_ng伝搬部３０ａは、実ＬＤＳＴＱ管理部２０がＬＤＳＴＱ２２に空きがないと判断してcheck_ngを出力すると、所定期間（本実施形態では５サイクル分）、ldstq_go信号として0（ldstq_go=0）をアドレス生成演算部２１に入力させる。これにより、後続するロードストア命令の実行を抑止する抑止部として機能する。
【０１１０】
check_ng伝搬部３０ａに備えられるフリップフロップの数（本実施形態においてはフリップフロップ３３〜３７の５つ）を変更することで、ロードストア命令の実行を抑止する時間を変更することができる。check_ng伝搬部３０ａに備えられるフリップフロップの数は、適宜変更することができ、例えば、ストアがＲＳＡ１３から選ばれてＲＳＡ１３に戻るまでにＲＳＡ１３から発行されうる命令数に合わせて決定してもよい。
【０１１１】
次に、デコード部１２によるＬＤＳＴＱ２２の管理とリザベーションステーションへの命令発行に関する処理について説明する。
【０１１２】
デコード部１２は、ＬＤＳＴＱ２２の空き数を管理し、命令を格納すべきＬＤＳＴＱ２２のエントリ番号を決定する。デコード部１２は、LDSTQ_IDに0から順に連続した値を割り当てる。本実施形態において、ＬＤＳＴＱ２２は10エントリであるので、LDSTQ_ID に0から9までの整数をサイクリックに割り当てる。すなわち、LDSTQ_ID=9の次は0となる。
【０１１３】
また、図２に示したように、デコード部１２が管理するＬＤＳＴＱ２２のエントリ数を仮想的に増やしており、本実施形態においては、10エントリに対して仮想的に4倍にした40エントリとする。
【０１１４】
仮想的にエントリ数を増やすため、同じLDSTQ_IDを複数の命令が持つ可能性がある。それを避けるために、デコード部１２は、LDSTQ_ID_Xを用いてＬＤＳＴＱ２２のエントリを管理する。LDSTQ_ID_Xは同一のLDST_IDを割り当てた命令を区別するために用いられ、後のサイクルでＬＤＳＴＱ２２が空いているかどうかの判断に使用する。LDSTQ_ID_Xの割り当ては、LDSTQ_IDと同様に0から順に割り当てられるが、LDSTQ_IDが9を超えたときにカウントアップが行なわれる。また、本実施形態において、LDSTQ_ID_Xの上限は3である。
【０１１５】
なお、LDSTQ_ID_Xの上限は3に限定されるものではなく、適宜変更して実施することができる。例えば、仮想的に増やすエントリ数が8倍の場合は上限が7であり、16倍の場合は上限15となる。LDSTQ_ID_Xもサイクリックに更新され、上限を超えたときは0になる。
【０１１６】
ロードストアユニット１５は、Ａサイクルで受け取ったリクエストとアドレスを用いてロード命令やストア命令を実行しつつLDSTQ_IDが示すＬＤＳＴＱ２２のエントリに命令を入れる。しかし、Ｂ２サイクル時点でＬＤＳＴＱ２２が空いていない場合は、ロードストアユニット１５へのリクエストが出ないため、命令はＬＤＳＴＱ２２には入らない。その命令はＲＳＡ１３に戻され、また、ＲＳＡ１３のエントリの解放もされない。
【０１１７】
本プロセッサコア１においては、ロードストアの命令順序入れ替わりによる性能低下を防ぐためにcheck_ng伝搬部３０ａを備える。このcheck_ng伝搬部３０ａにより、Ｂ２サイクル時点でＬＤＳＴＱ２２に空きがあった場合でも、ロードストアユニット１５に対して命令発行がされない場合がある。
【０１１８】
（Ｂ−２）動作
上述の如く構成された第１実施形態の一例としてのプロセッサコア１における処理を、図７に示すタイムチャートを用いて説明する。
【０１１９】
この図７においても、図３に例示した、ストア命令（store）とロード命令（load）とを処理する例について示す。
【０１２０】
図７に示す例において、サイクル1で“store”が、また、サイクル2で“load”が、ＲＳＡ１３によってそれぞれ選ばれる。なお、ＲＳＡ１３は基本的に古い命令から優先的に選ぶ。この時点で命令順序は入れ替わっていない。
【０１２１】
サイクル4で“store”のために実ＬＤＳＴＱ管理部２０がＬＤＳＴＱ２２の空き判定を行なう。この時点のＬＤＳＴＱ２２の状態を図２の符号（ｂ）で示す状態とする。図３に示すように、“store”のLDSTQ_IDが2でID_Xが1であるので、図２の符号（ｂ）における太枠内に入っていない。そのため、空きが無いと判定され、サイクル4でchk_ngとなる。
【０１２２】
本プロセッサコア１においては、ひとたび実ＬＤＳＴＱ管理部２０においてcheck_ngが検出されると、以降5サイクルにわたって、inh_ldstq_go信号に1が出力される（維持される）。これにより、実ＬＤＳＴＱ管理部２０においてcheck_ngが検出されてから以降5サイクルにわたって、ldstq_go=0がフリップフロップ１０５（アドレス生成演算部２１）に入力される。
【０１２３】
一方、“load”に関して、実ＬＤＳＴＱ管理部２０は、サイクル5のタイミングでＬＤＳＴＱ２２の空き判定を行ない、その結果、ＬＤＳＴＱ２２が空いていると判定される（chk_ok）。しかしながら、inh_ldstq_goが1であるのでＡＮＤゲート３１によりldstq_go信号が0に落とされる。
【０１２４】
ldstq_go信号が0なので、“load”はＬＤＳＴＱ２２に発行されず（発行が抑止され）、ＲＳＡ１３に戻される。inh_ldstq_goが立つきっかけとなったのは、サイクル4におけるchk_ngの1である。
【０１２５】
このようにして“store”のchk_ngによるキャンセルが後続する“load”を巻き込んで発行を抑止させるため、同一アドレスに対するストアとロードとの実行順の入れ替わりの発生を防止することができる。
【０１２６】
“store”はサイクル7で、“load”はサイクル8で、それぞれＲＳＡ１３によって再び選ばれる。これらの“store”および“load”がサイクルＢ２となるサイクル10，11においては、 “store”および“load”は、どちらもchk_okであり、且つ、inh_ldstq_goも立っていない（=0）ため、“store”，“load”の順で発行されることとなる。
【０１２７】
（Ｂ−３）効果
このように、第１実施形態の一例としてのプロセッサコア１においては、実ＬＤＳＴＱ管理部２０において、ストア命令の発行に際してＬＤＳＴＱ２２の空き不足を検出した場合に、check_ok信号として0を出力する。
【０１２８】
そして、check_ng伝搬部３０ａは、実ＬＤＳＴＱ管理部２０からcheck_ngが検出されると、以降、所定期間（本実施形態では5サイクル）にわたって、ldstq_go信号として1の発行を抑止する。これにより、ＲＳＡ１３から発行される後続の命令に対して、ＬＤＳＴＱ２２への命令発行抑止とＲＳＡ１３への戻しとが行なわれる。
【０１２９】
このように、ストア命令がＬＤＳＴＱ２２の空き不足によりキャンセルされた場合に、check_ng伝搬部３０ａが、所定期間、後続する命令を巻き込んでキャンセルする。これにより、ストア命令とロード命令との入れ替わりによる、命令発行のやり直しのリスクを低減させることができる。
【０１３０】
（Ｃ）第２実施形態
（Ｃ−１）構成
図８は第２実施形態の一例としてのプロセッサコア１の命令パイプラインを示す図である。
【０１３１】
本第２実施形態においては、図６に例示した第１実施形態のプロセッサコアの命令パイプラインのcheck_ng伝搬部３０ａに代えて、check_ng伝搬部３０ｂを備えるものであり、その他の部分は第１実施形態の命令パイプラインと同様に構成されている。
【０１３２】
なお、図中、既述の符号と同一の符号は同様の部分を示しているので、その説明は省略する。
【０１３３】
check_ng伝搬部３０ｂにおいて、各フリップフロップ３３〜３７とＯＲゲート３２との間に、ＩＤ・アドレス比較部３９−１〜３９−５をそれぞれ備える。具体的には、フリップフロップ３３とＯＲゲート３２との間にＩＤ・アドレス比較部３９−１が備えられ、フリップフロップ３４とＯＲゲート３２との間にＩＤ・アドレス比較部３９−２が備えられる。
【０１３４】
また、フリップフロップ３５とＯＲゲート３２との間にＩＤ・アドレス比較部３９−３が備えられ、フリップフロップ３６とＯＲゲート３２との間にＩＤ・アドレス比較部３９−４が備えられる。さらに、フリップフロップ３７とＯＲゲート３２との間にＩＤ・アドレス比較部３９−５が備えられる。
【０１３５】
なお、ＩＤ・アドレス比較部３９−１〜３９−５は同様の構成を有する。以下、ＩＤ・アドレス比較部を示す符号としては、複数のＩＤ・アドレス比較部のうち１つを特定する必要があるときには符号３９−１〜３９−５を用いるが、任意のＩＤ・アドレス比較部を指すときには符号３９を用いる。
【０１３６】
ＩＤ・アドレス比較部３９は、ＩＤ新旧比較部３９１，ＯＰ一致比較部３９２およびＡＮＤゲート３９３を備える。
【０１３７】
ＩＤ・アドレス比較部３９において、ＩＤ新旧比較部３９１からの出力信号およびＯＰ一致比較部３９２からの出力信号はＡＮＤゲート３９３に入力される。
【０１３８】
また、ＡＮＤゲート３９３には、該当ＩＤ・アドレス比較部３９の前段のフリップフロップ３３〜３７から出力されるcheck_ng信号も入力される。
【０１３９】
すなわち、ＩＤ・アドレス比較部３９−１のＡＮＤゲート３９３にはフリップフロップ３３から出力されるcheck_ng信号が入力される。また、ＩＤ・アドレス比較部３９−２のＡＮＤゲート３９３にはフリップフロップ３４から出力されるcheck_ng信号が入力される。さらに、ＩＤ・アドレス比較部３９−３のＡＮＤゲート３９３にはフリップフロップ３５から出力されるcheck_ng信号が入力される。また、ＩＤ・アドレス比較部３９−４のＡＮＤゲート３９３にはフリップフロップ３６から出力されるcheck_ng信号が入力される。さらに、ＩＤ・アドレス比較部３９−５のＡＮＤゲート３９３にはフリップフロップ３７から出力されるcheck_ng信号が入力される。
【０１４０】
また、ＩＤ・アドレス比較部３９のＩＤ新旧比較部３９１には、フリップフロップ１０４から出力される命令ID（Ｂ２サイクルの命令ID）と、各ＩＤ・アドレス比較部３９の前段のフリップフロップ３３〜３７から出力される命令IDとが入力される。
【０１４１】
すなわち、ＩＤ・アドレス比較部３９−１のＩＤ新旧比較部３９１にはフリップフロップ３３から出力される命令IDと、フリップフロップ１０４から出力される命令IDとが入力される。また、ＩＤ・アドレス比較部３９−２のＩＤ新旧比較部３９１にはフリップフロップ３４から出力される命令IDと、フリップフロップ１０４から出力される命令IDとが入力される。
【０１４２】
さらに、ＩＤ・アドレス比較部３９−３のＩＤ新旧比較部３９１にはフリップフロップ３５から出力される命令IDと、フリップフロップ１０４から出力される命令IDとが入力される。また、ＩＤ・アドレス比較部３９−４のＩＤ新旧比較部３９１にはフリップフロップ３６から出力される命令IDと、フリップフロップ１０４から出力される命令IDとが入力される。さらに、ＩＤ・アドレス比較部３９−５のＩＤ新旧比較部３９１にはフリップフロップ３７から出力される命令IDと、フリップフロップ１０４から出力される命令IDとが入力される。
【０１４３】
なお、命令IDにおいては、例えば、後に発行される命令の命令IDは、先に発行された命令の命令IDよりも大きい値が設定され、これにより発行される複数の命令の間においては命令IDを参照することで、発行された順序を特定することができるものとする。
【０１４４】
また、本第２実施形態においては、フリップフロップ１０４からフリップフロップ３３〜３７にかけて、命令IDおよびオペランドレジスタ番号（以下、単にオペランド番号という）が、check_ng信号と同様に順次伝搬される。図８に示す例においては、check_ng信号，命令IDおよびオペランド番号は、Ｂ２サイクルからＢ２＋５サイクルにかけて５サイクル分伝搬される。
【０１４５】
実ＬＤＳＴＱ管理部２０から出力されるcheck_ok信号は、ＡＮＤゲート３１および反転回路４０２のそれぞれに入力される。反転回路４０２はcheck_ok信号を極性反転させたcheck_ng信号をフリップフロップ３３に入力する。
【０１４６】
フリップフロップ１０４から出力される命令IDおよびオペランド番号は、フリップフロップ３３および各ＩＤ・アドレス比較部３９−１〜３９−５のそれぞれに入力される。
【０１４７】
フリップフロップ３３の下流にはフリップフロップ３４〜３７が直列に配置されている。これにより反転回路４０２から出力されるcheck_ng信号，命令IDおよびオペランド番号は、それぞれ複数（本実施形態においては５つ）のフリップフロップ３３〜３７に順次、伝搬された後、ＩＤ・アドレス比較部３９−５を介してＯＲゲート３２に入力される。
【０１４８】
ＩＤ新旧比較部３９１は、入力されたＢ２サイクルの命令IDと、自身を備えるＩＤ・アドレス比較部３９（以下、自アドレス比較部３９）の前段に備えられたフリップフロップから入力される命令IDとを比較する。すなわち、ＩＤ新旧比較部３９１においては、Ｂ２サイクルの命令ID（巻き込まれてキャンセルされる命令のID）と、Ｂ２+１サイクル〜Ｂ２+５サイクルのいずれかの命令IDとが比較される。
【０１４９】
ＩＤ新旧比較部３９１は、Ｂ２サイクルの命令IDがＢ２+１サイクル〜Ｂ２+５サイクルのいずれかの命令IDよりも新しい場合に1を出力し、Ｂ２サイクルの命令IDがＢ２+１サイクル〜Ｂ２+５サイクルのいずれかの命令IDよりも新しくない場合に0を出力する。
【０１５０】
ＩＤ新旧比較部３９１の出力信号はＡＮＤゲート３９３に入力される。これにより、Ｂ２サイクルの命令IDがＢ２+１サイクルからＢ２+５サイクルのいずれかの命令IDよりも新しくない場合には0がＡＮＤゲート３９３に入力される。これにより、check_ng信号が0にリセットされ、実ＬＤＳＴＱ管理部２０においてcheck_ngとなった命令に後続する所定サイクル分の命令を巻き込んでキャンセルすることができる。
【０１５１】
また、ＩＤ・アドレス比較部３９のＯＰ一致比較部３９２には、フリップフロップ１０４から出力されるオペランド番号（Ｂ２サイクルのオペランド番号）と、各ＩＤ・アドレス比較部３９の前段のフリップフロップ３３〜３７から出力されるオペランド番号とが入力される。
【０１５２】
すなわち、ＩＤ・アドレス比較部３９−１のＯＰ一致比較部３９２にはフリップフロップ３３から出力されるオペランド番号と、フリップフロップ１０４から出力されるオペランド番号とが入力される。また、ＩＤ・アドレス比較部３９−２のＯＰ一致比較部３９２にはフリップフロップ３４から出力されるオペランド番号と、フリップフロップ１０４から出力されるオペランド番号とが入力される。
【０１５３】
さらに、ＩＤ・アドレス比較部３９−３のＯＰ一致比較部３９２にはフリップフロップ３５から出力されるオペランド番号と、フリップフロップ１０４から出力されるオペランド番号とが入力される。また、ＩＤ・アドレス比較部３９−４のＯＰ一致比較部３９２にはフリップフロップ３６から出力されるオペランド番号と、フリップフロップ１０４から出力されるオペランド番号とが入力される。さらに、ＩＤ・アドレス比較部３９−５のＯＰ一致比較部３９２にはフリップフロップ３７から出力されるオペランド番号と、フリップフロップ１０４から出力されるオペランド番号とが入力される。
【０１５４】
ＩＤ新旧比較部３９１は、入力されたＢ２サイクルのオペランド番号と、自アドレス比較部３９の前段に備えられたフリップフロップから入力されるオペランド番号とを比較する。すなわち、ＯＰ一致比較部３９２においては、Ｂ２サイクルの命令ID（巻き込まれてキャンセルされる命令の使用するレジスタの番号）と、Ｂ２+１サイクルからＢ２+５サイクルのいずれかのオペランド番号とが比較される。
【０１５５】
ＯＰ一致比較部３９２は、Ｂ２サイクルのオペランド番号がＢ２+１サイクルからＢ２+５サイクルのいずれかのオペランド番号と一致する場合に1を出力し、不一致の場合に0を出力する。
【０１５６】
ＯＰ一致比較部３９２の出力信号はＡＮＤゲート３９３に入力される。これにより、Ｂ２サイクルのオペランド番号がＢ２+１サイクルからＢ２+５サイクルのいずれかのオペランド番号と不一致の場合には0がＡＮＤゲート３９３に入力される。これにより、check_ng信号が0にリセットされ、実ＬＤＳＴＱ管理部２０においてcheck_ngとなった命令と同じオペランドを参照する場合に、当該命令を、その命令に後続するロードストア命令を巻き込んでキャンセルすることができる。
【０１５７】
なお、比較対象のオペランドを増やしたい場合は、ＩＤ・アドレス比較部３９において、ＯＰ一致比較部３９２を増やし、ＡＮＤゲート３９３の入力を増やせばよい。また、即値なども含めて厳密に一致を取りたい場合やその他条件を増やす場合も同様に、比較一致回路とＡＮＤゲート３９３の入力を増やせばよい。
【０１５８】
check_ng伝搬部３０ｂにおいては、Ｂ２＋１サイクルからＢ２＋５サイクルのＩＤ・アドレス比較部３９の出力がそれぞれＢ２サイクルを巻き込んでキャンセルすることを指示している。そして、各ＩＤ・アドレス比較部３９の出力をＯＲゲート３２でまとめたものがinh_ldstq_go信号となる。
【０１５９】
inh_ldstq_go信号は反転回路４０１により極性反転された後、ＡＮＤゲート３１に入力される。ＡＮＤゲート３１は、極性反転されたinh_ldstq_go信号とＢ２サイクルの実ＬＤＳＴＱ管理部２０の出力であるcheck_ok信号とのＡＮＤの結果を、ldstq_go信号として出力する。ldstq_go信号はフリップフロップ１０５に入力される。
【０１６０】
これにより、inh_ldstq_go信号が1の場合にcheck_ok信号を0にリセットする働きをし、ＬＤＳＴＱ２２への命令発行を抑止（キャンセル）してＲＳＡ１３に戻すことができる。
【０１６１】
（Ｃ−２）動作
上述の如き第２実施形態の一例としてのプロセッサコア１における処理を、図９〜図１１に示すフローチャート（ステップＳ１〜Ｓ１８）に従って説明する。なお、図９はステップＳ１〜Ｓ７の処理を、図１０はステップＳ８〜Ｓ１３の処理を、図１１はステップＳ１４〜Ｓ１８の処理を、それぞれ示す。
【０１６２】
図９のステップＳ１において、実ＬＤＳＴＱ管理部２０は、処理対象のストア命令（自命令）についてＢ２サイクルでＬＤＳＴＱ２２に空きがあるかを判定する。空きが無い場合は（ステップＳ１のＮＯルート参照）、図１１のステップＳ１８に移行する。
【０１６３】
ステップＳ１８においては、ＬＤＳＴＱ２２に命令を発行せず、当該命令をキャンセルしてＲＳＡ１３に命令を戻す処理が実行される。その後、処理を終了する。
【０１６４】
一方、ステップＳ１における判定の結果、ＬＤＳＴＱ２２に空きがある場合は（ステップＳ１のＹＥＳルート参照）、図９のステップＳ２に移行する。
【０１６５】
ステップＳ２において、Ｂ２＋１サイクルの状態がcheck_ng=１であるかの確認が行なわれる。確認の結果、Ｂ２＋１サイクルの状態がcheck_ng=１である場合には（ステップＳ２のＹＥＳルート参照）、Ｂ２＋１サイクルによって巻き込んでキャンセルされる可能性がある。巻き込みキャンセルの条件を絞るため、図９のステップＳ３に移行する。
【０１６６】
ステップＳ３においては、ＩＤ新旧比較部３９１により、Ｂ２サイクルの命令がＢ２+１サイクルの命令よりも新しいかどうか（命令順序要件）のチェックが行なわれる。
【０１６７】
確認の結果、Ｂ２サイクルの命令がＢ２+１サイクルの命令よりも新しい場合には（ステップＳ３のＹＥＳルート参照）、図９のステップＳ４に移行する。
【０１６８】
ステップＳ４においては，ＯＰ一致比較部３９２により、Ｂ２サイクルの命令とＢ２+１サイクルの命令とでオペランドレジスタ番号が一致するか（アクセス先一致要件）のチェックが行なわれる。
【０１６９】
確認の結果、Ｂ２サイクルの命令とＢ２+１サイクルの命令とでオペランドレジスタ番号が一致する場合には（ステップＳ４のＹＥＳルート参照）、図１１のステップＳ１８に移行する。ステップＳ１８においては、巻き込んでキャンセルされる条件を満たしているので、命令をＬＤＳＴＱ２２に発行しない、キャンセルしてＲＳＡ１３に命令を戻す処理を実行し、その後、処理を終了する。
【０１７０】
ステップＳ２における確認の結果、Ｂ２＋１サイクルの状態がcheck_ng=０である場合には（ステップＳ２のＮＯルート参照）、図９のステップＳ５に移行する。また、ステップＳ３における確認の結果、Ｂ２サイクルの命令がＢ２+１サイクルの命令よりも新しくない場合にも（ステップＳ３のＮＯルート参照）、ステップＳ５に移行する。さらに、ステップＳ４における確認の結果、Ｂ２サイクルの命令とＢ２+１サイクルの命令とでオペランドレジスタ番号が不一致の場合にも（ステップＳ４のＮＯルート参照）、ステップＳ５に移行する。
【０１７１】
ステップＳ５においては、Ｂ２＋２サイクルの状態がcheck_ng=１であるかの確認が行なわれる。確認の結果、Ｂ２＋２サイクルの状態がcheck_ng=１である場合には（ステップＳ５のＹＥＳルート参照）、Ｂ２＋２サイクルによって巻き込んでキャンセルされる可能性がある。巻き込みキャンセルの条件を絞るため、図９のステップＳ６に移行する。
【０１７２】
ステップＳ６においては、ＩＤ新旧比較部３９１により、Ｂ２サイクルの命令がＢ２+２サイクルの命令よりも新しいかどうか（命令順序要件）のチェックが行なわれる。
【０１７３】
確認の結果、Ｂ２サイクルの命令がＢ２+２サイクルの命令よりも新しい場合には（ステップＳ６のＹＥＳルート参照）、図９のステップＳ７に移行する。
【０１７４】
ステップＳ７においては，ＯＰ一致比較部３９２により、Ｂ２サイクルの命令とＢ２+２サイクルの命令とでオペランドレジスタ番号が一致するか（アクセス先一致要件）のチェックが行なわれる。
【０１７５】
確認の結果、Ｂ２サイクルの命令とＢ２+２サイクルの命令とでオペランドレジスタ番号が一致する場合には（ステップＳ７のＹＥＳルート参照）、図１１のステップＳ１８に移行する。
【０１７６】
また、ステップＳ５における確認の結果、Ｂ２＋２サイクルの状態がcheck_ng=０である場合には（ステップＳ５のＮＯルート参照）、図１０のステップＳ８に移行する。また、ステップＳ６における確認の結果、Ｂ２サイクルの命令がＢ２+２サイクルの命令よりも新しくない場合にも（ステップＳ６のＮＯルート参照）、ステップＳ８に移行する。さらに、ステップＳ７における確認の結果、Ｂ２サイクルの命令とＢ２+２サイクルの命令とでオペランドレジスタ番号が不一致の場合にも（ステップＳ７のＮＯルート参照）、ステップＳ８に移行する。
【０１７７】
ステップＳ８において、Ｂ２＋３サイクルの状態がcheck_ng=１であるかの確認が行なわれる。確認の結果、Ｂ２＋３サイクルの状態がcheck_ng=１である場合には（ステップＳ８のＹＥＳルート参照）、Ｂ２＋３サイクルによって巻き込んでキャンセルされる可能性がある。巻き込みキャンセルの条件を絞るため、図１０のステップＳ９に移行する。
【０１７８】
ステップＳ９においては、ＩＤ新旧比較部３９１により、Ｂ２サイクルの命令がＢ２+３サイクルの命令よりも新しいかどうか（命令順序要件）のチェックが行なわれる。
【０１７９】
確認の結果、Ｂ２サイクルの命令がＢ２+３サイクルの命令よりも新しい場合には（ステップＳ９のＹＥＳルート参照）、図１０のステップＳ１０に移行する。
【０１８０】
ステップＳ１０においては，ＯＰ一致比較部３９２により、Ｂ２サイクルの命令とＢ２+３サイクルの命令とでオペランドレジスタ番号が一致するか（アクセス先一致要件）のチェックが行なわれる。
【０１８１】
確認の結果、Ｂ２サイクルの命令とＢ２+３サイクルの命令とでオペランドレジスタ番号が一致する場合には（ステップＳ１０のＹＥＳルート参照）、図１１のステップＳ１８に移行する。
【０１８２】
ステップＳ８における確認の結果、Ｂ２＋３サイクルの状態がcheck_ng=０である場合には（ステップＳ８のＮＯルート参照）、図１０のステップＳ１１に移行する。また、ステップＳ９における確認の結果、Ｂ２サイクルの命令がＢ２+３サイクルの命令よりも新しくない場合にも（ステップＳ９のＮＯルート参照）、ステップＳ１１に移行する。さらに、ステップＳ１０における確認の結果、Ｂ２サイクルの命令とＢ２+３サイクルの命令とでオペランドレジスタ番号が不一致の場合にも（ステップＳ１０のＮＯルート参照）、ステップＳ１１に移行する。
【０１８３】
ステップＳ１１においては、Ｂ２＋４サイクルの状態がcheck_ng=１であるかの確認が行なわれる。確認の結果、Ｂ２＋４サイクルの状態がcheck_ng=１である場合には（ステップＳ１１のＹＥＳルート参照）、Ｂ２＋４サイクルによって巻き込んでキャンセルされる可能性がある。巻き込みキャンセルの条件を絞るため、図１０のステップＳ１２に移行する。
【０１８４】
ステップＳ１２においては、ＩＤ新旧比較部３９１により、Ｂ２サイクルの命令がＢ２+２サイクルの命令よりも新しいかどうか（命令順序要件）のチェックが行なわれる。
【０１８５】
確認の結果、Ｂ２サイクルの命令がＢ２+４サイクルの命令よりも新しい場合には（ステップＳ１２のＹＥＳルート参照）、図１０のステップＳ１３に移行する。
【０１８６】
ステップＳ１３においては，ＯＰ一致比較部３９２により、Ｂ２サイクルの命令とＢ２+４サイクルの命令とでオペランドレジスタ番号が一致するか（アクセス先一致要件）のチェックが行なわれる。
【０１８７】
確認の結果、Ｂ２サイクルの命令とＢ２+４サイクルの命令とでオペランドレジスタ番号が一致する場合には（ステップＳ１３のＹＥＳルート参照）、図１１のステップＳ１８に移行する。
【０１８８】
また、ステップＳ１１における確認の結果、Ｂ２＋４サイクルの状態がcheck_ng=０である場合には（ステップＳ１１のＮＯルート参照）、図１１のステップＳ１４に移行する。また、ステップＳ１２における確認の結果、Ｂ２サイクルの命令がＢ２+４サイクルの命令よりも新しくない場合にも（ステップＳ１２のＮＯルート参照）、ステップＳ１４に移行する。さらに、ステップＳ１３における確認の結果、Ｂ２サイクルの命令とＢ２+４サイクルの命令とでオペランドレジスタ番号が不一致の場合にも（ステップＳ１３のＮＯルート参照）、ステップＳ１４に移行する。
【０１８９】
ステップＳ１４においては、Ｂ２＋５サイクルの状態がcheck_ng=１であるかの確認が行なわれる。確認の結果、Ｂ２＋５サイクルの状態がcheck_ng=１である場合には（ステップＳ１４のＹＥＳルート参照）、Ｂ２＋５サイクルによって巻き込んでキャンセルされる可能性がある。巻き込みキャンセルの条件を絞るため、図１１のステップＳ１５に移行する。
【０１９０】
ステップＳ１５においては、ＩＤ新旧比較部３９１により、Ｂ２サイクルの命令がＢ２+５サイクルの命令よりも新しいかどうか（命令順序要件）のチェックが行なわれる。
【０１９１】
確認の結果、Ｂ２サイクルの命令がＢ２+５サイクルの命令よりも新しい場合には（ステップＳ１５のＹＥＳルート参照）、図１１のステップＳ１６に移行する。
【０１９２】
ステップＳ１６においては，ＯＰ一致比較部３９２により、Ｂ２サイクルの命令とＢ２+５サイクルの命令とでオペランドレジスタ番号が一致するか（アクセス先一致要件）のチェックが行なわれる。
【０１９３】
確認の結果、Ｂ２サイクルの命令とＢ２+５サイクルの命令とでオペランドレジスタ番号が一致する場合には（ステップＳ１６のＹＥＳルート参照）、ステップＳ１８に移行する。
【０１９４】
また、ステップＳ１４における確認の結果、Ｂ２＋５サイクルの状態がcheck_ng=０である場合には（ステップＳ１４のＮＯルート参照）、図１１のステップＳ１７に移行する。また、ステップＳ１５における確認の結果、Ｂ２サイクルの命令がＢ２+５サイクルの命令よりも新しくない場合にも（ステップＳ１５のＮＯルート参照）、ステップＳ１７に移行する。さらに、ステップＳ１６における確認の結果、Ｂ２サイクルの命令とＢ２+５サイクルの命令とでオペランドレジスタ番号が不一致の場合にも（ステップＳ１６のＮＯルート参照）、ステップＳ１７に移行する。
【０１９５】
ステップＳ１７においては、先行命令によって巻き込まれてキャンセルされないと判定され、ＬＤＳＴＱ２２に命令が発行され、また、ＲＳＡ１３を解放する処理が実行される。その後、処理を終了する。
【０１９６】
（Ｃ−３）効果
このように、第２実施形態のプロセッサコア１においては、check_ng伝搬部３０ｂのＩＤ・アドレス比較部３９において、Ｂ２サイクルの命令IDがＢ２＋１〜Ｂ２＋５サイクルのいずれかの命令IDよりも新しい場合に、ＬＤＳＴＱ２２への命令発行を抑止する。ＩＤ新旧比較部３９１は、ＬＤＳＴＱ２２に発行される複数の命令の命令IDを比較することで、これらの複数の命令が予め規定された正しい順序でＬＤＳＴＱ２２に発行されているかを確認する。すなわち、ＩＤ新旧比較部３９１は、複数の命令が、予め規定された正しい順序でＬＤＳＴＱ２２に発行されているかという命令順序要件を満たしているかを判断する。
【０１９７】
また、check_ng伝搬部３０ｂのＩＤ・アドレス比較部３９において、Ｂ２サイクルのオペランド番号がＢ２＋１〜Ｂ２＋５サイクルのいずれかのオペランド番号と一致の場合に、ＬＤＳＴＱ２２への命令発行を抑止する。すなわち、ＯＰ一致比較部３９２は、複数の命令において、アドレス計算に使用されるレジスタの番号（オペランド番号）が一致するというアクセス先一致要件を満たしているかを判断する。
【０１９８】
そして、実ＬＤＳＴＱ管理部２０によるＬＤＳＴＱ２２の空きチェックの結果check_ngとなった場合において、check_ng伝搬部３０ｂは、命令順序要件およびアクセス先一致要件を満たす場合に、ＬＤＳＴＱ２２への命令発行を抑止し、ＲＳＡ１３へ命令を戻す処理を行なわせる。
【０１９９】
また、命令IDがＢ２＋ｎのcheck_ng=1を条件に含めることで、Ｂ２サイクルの命令の発行を抑止させることができる。
【０２００】
このように、第１実施形態に比べてＬＤＳＴＱ２２への命令発行を抑止し、ＲＳＡ１３へ命令を戻す処理を行なわせる条件を厳しくしている。これにより、第２実施形態のプロセッサコア１においては、上述した第１実施形態と同様の作用効果を得ることができる他、ＬＤＳＴＱ２２への命令発行が過剰に抑止されることを防止することができる。
【０２０１】
（Ｄ）その他
本発明は上述した実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形して実施することができる。
【０２０２】
例えば、命令IDに基づく命令順序要件およびオペランド番号に基づくアクセス先一致要件とは異なる他の要件を満たす場合に、ＬＤＳＴＱ２２への命令発行を抑止し、ＲＳＡ１３へ命令を戻す処理を行なわせてもよい。
【０２０３】
図１２は第２実施形態のプロセッサコア１の命令パイプラインの変形例を例示する図である。
【０２０４】
この図１２に例示する命令パイプラインにおいては、図８に例示した命令パイプラインのcheck_ng伝搬部３０ｂに代えてcheck_ng伝搬部３０ｃを備える。このcheck_ng伝搬部３０ｃにおいては、check_ng伝搬部３０ｂに加えてストア−ロード確認部４０−１〜４０−５を備える。
【０２０５】
ストア−ロード確認部４０−１〜４０−５は、ＩＤ・アドレス比較部３９−１〜３９−５のそれぞれに対応して備えられる。
【０２０６】
なお、ストア−ロード確認部４０−１〜４０−５は同様の構成を有する。以下、ストア−ロード確認部を示す符号としては、複数のストア−ロード確認部のうち１つを特定する必要があるときには符号４０−１〜４０−５を用いるが、任意のストア−ロード確認部を指すときには符号４０を用いる。
【０２０７】
ストア−ロード確認部４０は、ストア命令の後にロード命令が発行されるという命令種類要件を満たしているかを判断する。
【０２０８】
フリップフロップ２０１には、ストア命令（ＳＴ）およびロード命令（ＬＤ）がそれぞれ入力される。そして、フリップフロップ２０１はストア命令およびロード命令を、それぞれ出力する。
【０２０９】
フリップフロップ２０１から出力されるロード命令は、ストア−ロード確認部４０−１〜４０−５のそれぞれに入力される。
【０２１０】
図１３は第２実施形態のプロセッサコア１の変形例のストア−ロード確認部４０の構成を例示する図である。
【０２１１】
図１３に示すように、ストア−ロード確認部４０はＡＮＤゲート４０１を備える。各ストア−ロード確認部４０のＡＮＤゲート４０１にはフリップフロップ２０１を介してＢ２サイクルのロード命令がそれぞれ入力される。
【０２１２】
フリップフロップ２０１から出力されるストア命令は、複数（本実施形態においては５つ）のフリップフロップ２０２〜２０６に順次、伝搬される。
【０２１３】
フリップフロップ２０２はＢ２＋１サイクルに、フリップフロップ２０３はＢ２＋２サイクルに、フリップフロップ２０４はＢ２＋３サイクルに、フリップフロップ２０５はＢ２＋４サイクルに、フリップフロップ２０６はＢ２＋５サイクルに、それぞれ対応する。
【０２１４】
そして、フリップフロップ２０２から出力されるストア命令は、フリップフロップ２０３に入力されるとともに、ストア−ロード確認部４０−１のＡＮＤゲート４０１に入力される。フリップフロップ２０３から出力されるストア命令は、フリップフロップ２０４に入力されるとともに、ストア−ロード確認部４０−２のＡＮＤゲート４０１に入力される。フリップフロップ２０４から出力されるストア命令は、フリップフロップ２０５に入力されるとともに、ストア−ロード確認部４０−３のＡＮＤゲート４０１に入力される。フリップフロップ２０５から出力されるストア命令は、フリップフロップ２０６に入力されるとともに、ストア−ロード確認部４０−４のＡＮＤゲート４０１に入力される。フリップフロップ２０６から出力されるストア命令は、ストア−ロード確認部４０−５のＡＮＤゲート４０１に入力される。
【０２１５】
ストア−ロード確認部４０においては、Ｂ２サイクルのロード命令（B2_LD）と、Ｂ２＋１サイクル〜Ｂ２＋５サイクルのいずれかのストア命令（B2+n_ST）とがＡＮＤゲート４０１に入力される。そして、このＡＮＤゲート４０１の出力は、対応するＩＤ・アドレス比較部３９のＡＮＤゲート３９３に入力される。
【０２１６】
これにより、ストア−ロード確認部４０は、Ｂ２サイクルのロード命令（B2_LD）が、Ｂ２サイクル以前（Ｂ２＋１サイクル〜Ｂ２＋５サイクル）のストア命令（B2+n_ST）よりも後に発行されたものであることを確認する。確認の結果、ロード命令がストア命令よりも後に発行されたものである場合には、ストア−ロード確認部４０は1をＡＮＤゲート３９３に入力する。一方、ロード命令がストア命令よりも後に発行されたものでない場合には、ストア−ロード確認部４０は0をＡＮＤゲート３９３に入力する。
【０２１７】
これにより、check_ng信号が0にリセットされ、実ＬＤＳＴＱ管理部２０において、ストア(Ｂ２＋１〜５)の後にロード（Ｂ２）という命令種条件を満たす場合にのみcheck_ngとなった命令に後続する所定サイクル分の命令を巻き込んでキャンセルすることができる。
【０２１８】
上述した第２実施形態の変形例においては、命令IDに基づく命令順序要件およびオペランド番号に基づくアクセス先一致要件、ストア命令とロード命令との順序に基づく命令種類要件を満たす場合に、ＬＤＳＴＱ２２への命令発行を抑止し、ＲＳＡ１３へ命令を戻す処理を行なわせているが、これに限定されるものではない。
【０２１９】
例えば、命令IDに基づく命令順序要件もしくはオペランド番号に基づくアクセス先一致要件のいずれか一方を満たす場合に、ＬＤＳＴＱ２２への命令発行を抑止し、ＲＳＡ１３へ命令を戻す処理を行なわせてもよい。
【０２２０】
また、上述した各実施形態および変形例のプロセッサコア１においては、アウトオブオーダ制御を想定しているので、ＲＳＡ１３によって選ばれる命令が本来の命令順序とは異る場合がある。そのため、check_ngとなったストアによるinh_ldstq_goがストアよりも先行する命令に及ぶ可能性があるため、命令IDを比較して後続命令のみを巻き込んでキャンセルにする制御にしても良い。
【０２２１】
また、ストアとロードの順序が入れ替わってもアクセスするアドレスが異なれば問題ないため、キャンセル対象を絞るために、アドレス計算に使うオペランドのレジスタ番号を比較して一致した場合にのみ巻き込んでキャンセルするという仕組みにしてもよい。アドレス計算に使用されるレジスタ番号が全く異なるにも関わらずたまたまメモリアドレスが一致したケースは防げないが、プログラムの意図として、例えば固定小数点レジスタのデータをストア命令でメモリに退避させた後にロード命令で復元するような場合はアドレス計算に使用するレジスタを使いまわしているケースが多いため、このような対象の絞りこみは有効であるといえる。この場合の一致をみるオペランドは1つでもそれ以上でも良い。
【０２２２】
また、上述した開示により本実施形態を当業者によって実施・製造することが可能である。
【０２２３】
（Ｅ）付記
以上の実施形態に関し、さらに以下の付記を開示する。
【０２２４】
（付記１）
キャッシュメモリと、
メモリアクセス命令をデコードするデコード部と、
前記デコード部がデコードしたメモリアクセス命令を格納し、格納した前記メモリアクセス命令を前記キャッシュメモリに出力する格納部と、
前記格納部にメモリアクセス命令を格納できるかを判断する判断部と、
前記判断部が前記格納部にメモリアクセス命令を格納できないと判断した場合に、前記メモリアクセス命令に後続するメモリアクセス命令についての前記判断部による判断結果にかかわらず、所定期間、前記後続するメモリアクセス命令の実行を抑止する抑止部と
を備えることを特徴とする、演算処理装置。
【０２２５】
（付記２）
前記抑止部が、
前記判断部から出力される、前記判断部における判断結果を示す出力信号に基づく信号を伝搬する、直列に配置された複数の信号保持回路と、
前記信号保持回路のそれぞれから出力される信号が入力され、出力抑止信号を出力するＯＲゲートと、
を備え、
前記信号保持回路の数に応じた所定時間、メモリアクセス命令の実行を抑止した状態で維持する
ことを特徴とする、付記１記載の演算処理装置。
【０２２６】
（付記３）
前記抑止部が、
複数の命令が、予め規定された順序で処理されているという命令順序要件を満たしているかを判断する、命令順序要件判断部を備え、
前記命令順序要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記１または２記載の演算処理装置。
【０２２７】
（付記４）
前記抑止部が、
複数の命令においてアクセス先が一致するというアクセス先一致要件を満たしているかを判断する、アクセス先一致要件判断部を備え、
前記アクセス先一致要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記１〜３のいずれか１項に記載の演算処理装置。
【０２２８】
（付記５）
前記抑止部が、
ストア命令の後にロード命令が発行されるという命令種類要件を満たしているかを判断する、命令種類要件判断部を備え、
前記命令種類要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記１〜４のいずれか１項に記載の演算処理装置。
【０２２９】
（付記６）
キャッシュメモリと、メモリアクセス命令をデコードするデコード部と、前記デコード部がデコードしたメモリアクセス命令を格納し、格納した前記メモリアクセス命令を前記キャッシュメモリに出力する格納部とを有する演算処理装置の制御方法であって、
前記格納部にメモリアクセス命令を格納できるかを判断し、
前記格納部にメモリアクセス命令を格納できないと判断した場合に、前記メモリアクセス命令に後続するメモリアクセス命令についての前記判断部による判断結果にかかわらず、所定期間、前記後続するメモリアクセス命令の実行を抑止する
ことを特徴とする、演算処理装置の制御方法。
【０２３０】
（付記７）
前記演算処理装置が、前記判断結果を示す出力信号に基づく信号を伝搬する、直列に配置された複数の信号保持回路と、前記信号保持回路のそれぞれから出力される信号が入力され、出力抑止信号を出力するＯＲゲートとを備え、
前記信号保持回路の数に応じた所定時間、メモリアクセス命令の実行を抑止した状態で維持する
ことを特徴とする、付記６記載の演算処理装置の制御方法。
【０２３１】
（付記８）
複数の命令が、予め規定された順序で処理されているという命令順序要件を満たしているかを判断し、
前記命令順序要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記６または７記載の演算処理装置の制御方法。
【０２３２】
（付記９）
複数の命令においてアクセス先が一致するというアクセス先一致要件を満たしているかを判断し、
前記アクセス先一致要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記６〜８のいずれか１項に記載の演算処理装置の制御方法。
【０２３３】
（付記１０）
ストア命令の後にロード命令が発行されるという命令種類要件を満たしているかを判断し、
前記命令種類要件を満たす場合に、メモリアクセス命令の実行を抑止する
ことを特徴とする、付記６〜９のいずれか１項に記載の演算処理装置の制御方法。
【符号の説明】
【０２３４】
１    プロセッサコア
１０    命令キャッシュ
１１    命令バッファ
１２    デコード部
１２１    仮ＬＤＳＴＱ管理部
１０１〜１０５，３３〜３７，２０１〜２０５    フリップフロップ
１３    ＲＳＡ
１４    演算実行部
１５    ロードストアユニット
１６    エントリ選択部
２０    実ＬＤＳＴＱ管理部
２１    アドレス生成演算部
２２    ＬＤＳＴＱ２０
３０ａ，３０ｂ，３０ｃ    check_ng伝搬部
３１，３９３，４０１，    ＡＮＤゲート
３２    ＯＲゲート，
３９−１〜３９−５，３９    ＩＤ・アドレス比較部
４０−１〜４０−５，４０    ストア−ロード確認部
１４１    ＧＰＲ
１５１    データキャッシュ
３９１    ＩＤ新旧比較部
３９２    ＯＰ一致比較部
４０１，４０２    反転回路
１２００，１２００ａ    ロードストアパイプライン，命令パイプライン
【図１】
2020060926.tif 000003
【図２】
2020060926.tif 000004
【図３】
2020060926.tif 000005
【図４】
2020060926.tif 000006
【図５】
2020060926.tif 000007
【図６】
2020060926.tif 000008
【図７】
2020060926.tif 000009
【図８】
2020060926.tif 000010
【図９】
2020060926.tif 000011
【図１０】
2020060926.tif 000012
【図１１】
2020060926.tif 000013
【図１２】
2020060926.tif 000014
【図１３】
2020060926.tif 000015