(57)【要約】      （修正有）【課題】投機的な実行を柔軟に抑制する演算処理装置を提供する。【解決手段】バリア設定条件が設定されるバリア設定条件レジスタと、フェッチ命令がバリア設定条件に該当するか否か判定し、該当する場合、フェッチ命令を該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力するバリア設定部と、実行命令及びバリア命令を、それぞれの命令に対応する実行キュー部に割振る命令デコーダと、実行命令の一種であるメモリアクセス命令をアウトオブオーダーで発行する第１の実行キュー部と、メモリアクセス命令を実行するメモリアクセス制御部とを有する。第１の実行キュー部にバリア命令が割振られた場合、第１の実行キュー部とメモリアクセス制御部は共同し、バリア命令より後のメモリアクセス命令を、バリア命令及びバリア命令より前のバリア属性に対応する所定の実行命令を追い抜いて投機実行しない。【選択図】図２
2019197442.tif 000002
【特許請求の範囲】
【請求項１】
バリア設定条件が設定されるバリア設定条件レジスタと、
フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記フェッチ命令を前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力するバリア設定部と、
前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリア命令を、それぞれの命令に対応する実行キュー部に割振る命令デコーダと、
前記実行命令の一種であるメモリアクセス命令を割振られ、プログラムの順番と異なるアウトオブオーダーで発行する第１の実行キュー部と、
前記第１の実行キュー部が発行した前記メモリアクセス命令を実行するメモリアクセス制御部とを有し、
前記第１の実行キュー部に前記バリア命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より後のメモリアクセス命令を、前記バリア命令及び前記バリア命令より前の前記バリア属性に対応する所定の実行命令を追い抜いて投機実行しない、演算処理装置。
【請求項２】
前記バリア属性が分岐命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記分岐命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記分岐命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部は、前記バリア命令より前の分岐命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を実行しない、請求項１に記載の演算処理装置。
【請求項３】
前記第１の実行キュー部が、前記バリア命令より前の分岐命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行しない、請求項２に記載の演算処理装置。
【請求項４】
前記バリア属性がメモリアクセス命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記メモリアクセス命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記メモリアクセス命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より前のメモリアクセス命令が完了処理されるまで、前記メモリアクセスを実行するバリア命令と、前記バリア命令より後ろのメモリアクセス命令を実行しない、請求項１に記載の演算処理装置。
【請求項５】
前記第１の実行キュー部が、前記バリア命令より後に、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記バリア命令より前のメモリアクセス命令が完了処理されるまで、前記バリア命令を実行せず、前記バリア命令が完了処理されるまで、前記バリア命令より後のメモリアクセス命令を実行する、請求項４に記載の演算処理装置。
【請求項６】
前記バリア属性が全命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記全命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記全命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より前の全命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を実行しない、請求項１に記載の演算処理装置。
【請求項７】
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記第１の実行キュー部が、前記バリア命令より後に、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より前の全命令が完了処理されるまで、前記バリア命令を実行せず、前記バリア命令が完了処理されるまで、前記バリア命令より後のメモリアクセス命令を実行しない、請求項６に記載の演算処理装置。
【請求項８】
前記バリア属性が全命令対全命令の属性を有し、
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記バリア設定部は、前記全命令対全命令のバリア属性に該当するフェッチ命令を、前記該当したフェッチ命令を実行するバリア命令に変更し、
前記命令デコーダは、前記バリア命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より後ろの全命令を、前記バリア命令より前の全命令が完了処理されるまで発行しない、請求項１に記載の演算処理装置。
【請求項９】
前記命令デコーダは、前記バリア命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より前の全命令が完了処理されるまで前記バリア命令を前記実行キュー部に発行せず、前記バリア命令が完了処理されるまで前記バリア命令より後の全命令を前記実行キュー部に発行しない、請求項８に記載の演算処理装置。
【請求項１０】
バリア設定条件レジスタにバリア設定条件を設定する工程と、
バリア設定部により、フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記フェッチ命令を前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力する工程と、
命令デコーダにより、前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリア命令を、それぞれの命令に対応する実行キュー部に割振る工程と、
前記実行命令の一種であるメモリアクセス命令を割振られる第１の実行キュー部により、プログラムの順番と異なるアウトオブオーダーで前記メモリアクセス命令を発行する工程と、
メモリアクセス制御部により、前記第１の実行キュー部が発行した前記メモリアクセス命令を実行する工程と、
前記第１の実行キュー部に前記バリア命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部とにより共同して、前記バリア命令より後のメモリアクセス命令を、前記バリア命令及び前記バリア命令より前の前記バリア属性に対応する所定の前記実行命令を追い抜いて投機実行しない工程、とを有する演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置は、プロセッサまたはCPU（Central Processing Unit）チップである。以下、演算処理装置をプロセッサと称する。プロセッサは、プログラムの命令を効率的に実行するために、様々な構成上または制御上の特徴を有する。例えば、複数の命令の処理を同時に並行して行うパイプライン構成、プログラム上の命令の順序（インオーダー）に基づかずにアウトオブオーダーで実行準備ができた命令から実行する構成、分岐命令の分岐条件が確定しない前に分岐予測先の命令を投機的に実行する構成などである。
【０００３】
一方、プロセッサは、ユーザのプログラムを実行するユーザモードに加えて、OS(Operating System)のプログラムを実行する特権モードまたはOSモード（カーネルモード）を有する。ユーザモードの命令は、特権モードでしかアクセスできないプロテクトされたメモリ領域には、アクセスすることが禁じられる。ユーザモードの命令が上記プロテクトされたメモリ領域にアクセスしようとすると、プロセッサは、不正なメモリアクセスを検出してその命令の実行をトラップし、命令の実行をキャンセルする。このような構成を有することで、プロテクトされているメモリ領域内のデータが不正にアクセスされることを防止している。
【０００４】
プロセッサの投機実行などについては、以下の特許文献に記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−３２２２５７号公報
【特許文献２】特開２０１０−１５２９８号公報
【非特許文献】
【０００６】
【非特許文献１】Jann Horn, “Reading privileged memory with a side-channel”, [online], [searched on May 9, 2018],  internet <https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html?m=1>
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、分岐命令の分岐条件が確定しない前に、プログラム内に不正に追加されたロード命令が投機実行され、プロテクトされているメモリ領域内の秘密データが読み出されるリスクがある。そして、その後、秘密データをアドレスとしてロード命令が投機的に実行されてしまうことが考えられる。
【０００８】
または、プログラム内に不正に追加された不正なロード命令が実行され、プロセッサにより不正なロード命令の実行が検出されトラップが発生する前に、不正なロード命令によりプロテクトされたメモリ領域内の秘密データが読み出されるリスクがある。そして、その後、秘密データをアドレスとしてロード命令が投機的に実行されてしまうことが考えられる。
【０００９】
上記の場合、２番目のロード命令の実行により、キャッシュメモリ内の秘密データのアドレスのキャッシュラインにロードされたデータが登録される。そして、分岐命令の分岐条件が確定した後や、トラップが発生した後に、キャッシュメモリ内のデータを読み出してレイテンシを測定し、レイテンシが短いアドレスを検出することで、秘密データを不正に獲得できる。
【００１０】
上記のようなプロセッサの脆弱性を回避するためには、例えば、不正なメモリアクセス命令（ロード命令）の投機的実行を抑止することが必要である。また、不正なメモリアクセス命令（ロード命令）の実行とトラップ検出が完了する前に、後続のメモリアクセス命令（ロード命令）が投機的に実行されることを抑止することが必要である。
【００１１】
しかし、分岐予測先命令の分岐先未確定中に分岐予測先命令を投機的実行することや、ロード命令の完了処理前に次のロード命令を投機的実行することは、プロセッサの処理効率を高めるための手段である。したがって、画一的に投機的実行を抑止することは、プロセッサのプログラム処理効率の低下を招き好ましくない。また、既存のプログラム内に投機的実行を抑止する追加のコードを埋め込むことは、多大な工数を要するので現実的な解決とはいえない。
【００１２】
そこで，本開示の第１の側面の目的は，プロセッサの脆弱性の原因となる投機的な実行を柔軟に抑制する演算処理装置及び演算処理装置の制御方法を提供することにある。
【課題を解決するための手段】
【００１３】
本開示の第１の側面は，バリア設定条件が設定されるバリア設定条件レジスタと、フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記フェッチ命令を前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力するバリア設定部と、前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリア命令を、それぞれの命令に対応する実行キュー部に割振る命令デコーダと、前記実行命令の一種であるメモリアクセス命令を割振られ、プログラムの順番と異なるアウトオブオーダーで発行する第１の実行キュー部と、前記第１の実行キュー部が発行した前記メモリアクセス命令を実行するメモリアクセス制御部とを有し、前記第１の実行キュー部に前記バリア命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より後のメモリアクセス命令を、前記バリア命令及び前記バリア命令より前の前記バリア属性に対応する所定の実行命令を追い抜いて投機実行しない、演算処理装置である。
【発明の効果】
【００１４】
第１の側面によれば，プロセッサの脆弱性の原因となる投機的な実行を柔軟に抑制することができる。
【図面の簡単な説明】
【００１５】
【図１】プロセッサの脆弱性の一例を説明する図である。
【図２】本実施の形態におけるプロセッサの構成例を示す図である。
【図３】バリア設定部BA_SETと命令デコーダI_DECの構成例を示す図である。
【図４】バリア設定部の動作例を示すフローチャート図である。
【図５】リザベーションステーションRSAと１次データキャッシュL1_DCACHEの構成例を示す図である。
【図６】BBM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図７】RSAにおけるバリア命令に対するバリア制御BC1のフローチャート図である。
【図８】RSAにおけるバリア命令以外の命令に対するバリア制御BC2のフローチャート図である。
【図９】RSAとRSBRの入力キューの構成例を示す図である。
【図１０】RSAとRSBRの入力キューの構成例を示す図である。
【図１１】RSAとRSBRの入力キューの構成例を示す図である。
【図１２】RSAとRSBRの入力キューの構成例を示す図である。
【図１３】MBM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図１４】RSAにおけるバリア命令に対するバリア制御BC1_Bのフローチャート図である。
【図１５】MBM属性フラグが付けられた命令がメモリアクセス命令の場合の具体例３に対するRSAにおけるバリア制御例を示す図である。
【図１６】MBM属性フラグが付けられた命令がメモリアクセス命令の場合の具体例３に対するRSAにおけるバリア制御例を示す図である。
【図１７】メモリアクセス制御部のフェッチポートのキューFP_QUEでの制御例を示すフローチャート図である。
【図１８】フェッチポートのキューFP_QUEの例を示す図である。
【図１９】ABM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図２０】メモリアクセス制御部のフェッチポートでのバリア制御BC5のフローチャート図である。
【図２１】具体例４についてメモリアクセス制御部のフェッチポートでのバリア制御BC5を説明する図である。
【図２２】具体例４についてメモリアクセス制御部のフェッチポートでのバリア制御BC5を説明する図である。
【図２３】バリア属性ABAが付加された命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図２４】命令デコーダにおけるバリア命令（BA命令）とその前後の命令に対するバリア制御BC6を示すフローチャート図である。
【図２５】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【図２６】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【図２７】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【発明を実施するための形態】
【００１６】
図１は、プロセッサの脆弱性の一例を説明する図である。図１には、プロセッサCPUと、メインメモリM_MEMとが示される。また、図１には、プロセッサCPUが実行する命令列の例が示される。
【００１７】
この命令列の例は、不正なプログラムの第１の例であり、各命令の内容は以下のとおりである。
JMP C                        //分岐先Cに分岐する分岐命令//
B LOAD2 X0 [秘密値格納のアドレス] //秘密値が格納されたアドレスでロードし
レジスタX0に秘密値を格納//
A LOAD1 *[X0]                //レジスタX0のアドレスでロードする//
【００１８】
上記の命令列には、不正なロード命令“B LOAD2”“A LOAD1”が追加されている。そこで、不正なプログラムは、最初にキャッシュメモリをクリアしておき（S1）、特権モード（OSモード）に遷移する（S2）。そして、プロセッサが、特権モードで、分岐命令JMP Cを実行するが、分岐命令の分岐先Cが確定する前に、分岐予測先Bのロード命令LOAD2を投機的に実行（投機実行）する（S3）。この分岐予測先Bは分岐予測情報として不正に登録されているが、分岐命令の正しい分岐先はCであるとする。
【００１９】
プロセッサが、この誤った分岐予測先Bのロード命令LOAD2を投機的に実行すると（S3）、特権モードでしかアクセスが許可されていないプロテクトされたメモリ領域M0内の秘密値SVを読み出し、レジスタX0に格納する。更に、次のロード命令A LOAD1を投機的に実行すると、レジスタX0内の秘密値をアドレスとするユーザモードでのアクセスが許可されているメモリ領域M1内のデータDA1を読み出す（S4）。この結果、プロセッサ内のキャッシュメモリCACHE内のアドレスSVにデータDA1が登録される。
【００２０】
その後、プロセッサが、アドレスを変更しながら図示しないロード命令を繰り返すと、データDA1が登録されているアドレスSVへのロード命令のアクセスレイテンシが他のアドレスよりも短くなり、アドレスSVの内容を知ることができる。これにより、秘密値SVのセキュリティが低下する。
【００２１】
２つのロード命令LOAD2, LOAD1が投機的に実行された後、分岐命令JMP Cの実行が完了すると、分岐予測先Bが分岐予測ミスであったことが判明され、プロセッサ内のパイプライン回路の投機的に実行されたロード命令の状態がクリアされる。しかし、キャッシュメモリはクリアされないため、キャッシュメモリのレイテンシに基づいて秘密値SVを獲得することができる。
【００２２】
このように、分岐命令JMPの分岐先が確定する前に、誤った分岐予測先のロード命令LOAD2,LOAD1が実行されることが、プロセッサの脆弱性の原因の一つである。
【００２３】
プロセッサの脆弱性の原因になる命令列の第２の例は、以下のとおりである。
LOAD1 X0 [特権領域]
LOAD2 X1 [X0]
LOAD1は、特権領域のアドレスの秘密値をレジスタX0に格納するロード命令であり、LOAD2は、レジスタX0に格納された値（秘密値）をアドレスとするメモリ内の値をレジスタX1に格納するロード命令である。両ロード命令はユーザモードで実行されることを想定している。
【００２４】
この場合、最初のロード命令LOAD1は、ユーザモードでの実行では、プロテクトされたメモリ領域（特権領域）にアクセスしているので、実行中にトラップが発生し、プロセッサ内のパイプライン回路がクリアされる。しかし、２番目のロード命令LOAD2が最初のロード命令LOAD1の実行が完了する前で未だトラップが発生していないタイミングで投機的に実行されると、レジスタX0内の秘密値をアドレスとする領域のデータがキャッシュに登録される。そして、図１の例と同様に、プロセッサが、アドレスを変更しながらロード命令を繰り返すと、秘密値のアドレスへのロード命令のアクセスレイテンシが他のアドレスよりも短くなり、アドレスの秘密値を知ることができる。
【００２５】
この命令列では、最初のロード命令LOAD1の実行が完了してトラップ判定が完了後に、２番目のロード命令LOAD2が投機的に実行されたことが、プロセッサの脆弱性の原因と考えられる。このような脆弱性をなくすためには、最初のロード命令LOAD1の実行完了まで、次のロード命令LOAD2が実行されないような順序保障制御を行えばよい。
【００２６】
上記の２つの例では、プロセッサの脆弱性の原因となる命令の投機実行は、（１）バリア命令より前の分岐命令の分岐先が確定していない段階でバリア命令より後の命令を投機的に実行することと、（２）メモリアクセスを実行するバリア命令がメモリ内のアクセス禁止領域へのアクセスした場合、そのバリア命令がトラップされキャンセル処理が完了していない段階で、そのバリア命令より後ろの命令を投機的に実行することである。上記の例以外にも、何らかの状況において発生する命令の投機的実行がプロセッサの脆弱性の原因になることがある。
【００２７】
［本実施の形態］
［プロセッサの構成］
図２は、本実施の形態におけるプロセッサの構成例を示す図である。図２に示したプロセッサは、複数の演算器として、ストレージユニットSU、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCを有する。これらの演算器は、それぞれ単一または複数個を有する。
【００２８】
ストレージユニットSUは、アドレス計算するための加減算回路を含むオペランドアドレス生成器OP_ADD_GENと、１次データキャッシュL1_DCACHEを有する。１次データキャッシュは、キャッシュメモリに加えて、キャッシュミスした場合のメインメモリへのアクセス制御を行うメモリアクセス制御部MEM_AC_CNTを有する。
【００２９】
また、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCは、例えば、加減算回路と論理演算器と乗算器などを有する。浮動小数点演算器は、例えば、SIMD（Single Instruction Multiple Data）演算ができるように、SIMD幅に対応した数の演算器を有する。
【００３０】
プロセッサ全体の構成について、命令の処理の流れに沿って以下説明する。命令フェッチアドレス生成器I_F_ADD_GENがフェッチアドレスを生成し、プログラム内の実行順に（インオーダーで）１次命令キャッシュL1_ICACHEからフェッチされたフェッチ命令を一旦命令バッファI_BUFに格納する。そして、命令デコーダI_DECが、命令バッファ内のフェッチ命令をインオーダーで入力しデコードし、実行に必要な情報を付加した実行可能命令（実行命令）を生成する。
【００３１】
本実施の形態では、プロセッサは、命令バッファI_BUFと命令デコーダI_DECとの間に、バリア設定部BA_SETを有する。バリア設定部BA_SETは、バリア設定条件レジスタBA_SET_CND_REGに設定されたバリア設定条件を参照し、フェッチ命令がバリア設定条件に該当するか否か（マッチするか否か）を判定し、該当する場合、フェッチ命令にバリア属性を付加する、またはフェッチ命令の後ろにバリアフロー命令を追加するなどの、バリア設定を行う。そして、バリア設定部BA_SETは、フェッチ命令とバリア属性を付加された命令とバリアフロー命令を命令デコーダI_DECに出力する。バリア設定部BA_SETは、命令デコーダI_DEC内に含められても良い。バリア設定については後で詳述する。
【００３２】
次に、命令デコーダで生成された実行命令は、インオーダーで、リザベーションステーションと呼ばれるキュー構造のストレージにキューインされ蓄積される。リザベーションステーションは、実行命令をキューに蓄積する実行キューであり、命令を実行する演算器毎に設けられる。リザベーションステーションは、例えば、オペランドアドレス生成器OP_ADD_GENとL1データキャッシュL1_DCAHCEを含むストレージユニットSUに設けられた、RSA（Reservation Station for Address generation）と、固定小数点演算器FX_EXCに設けられたRSE(Reservation Station for Execution)と、浮動小数点演算器FL_EXCに設けられたRSF（Reservation Station for Floating point）とを有する。さらに、分岐予測ユニットBR_PRDに対応するRSBR(Reservation Station for Branch)を有する。
【００３３】
以下、リザベーションステーションは、適宜、省略してRSと称する。
【００３４】
そして、各ＲＳにキューインされた実行命令は、命令実行に必要な入力オペランドが前の命令の演算処理の完了処理により汎用レジスタファイルから読み出し可能であるか否か（リードアフターライト（RAW）制約が満たされるか否か）や、演算器の回路資源を使用できるか否かなど、命令の実行条件が整ったものから、順不同で（アウトオブオーダーで）演算器に発行され演算器で実行される。
【００３５】
一方、命令デコーダI_DECは、フェッチ命令をデコードして生成した実行命令に、そのプログラム内の実行順に命令識別子（Instruction Identification: IID）を割り振り、実行命令をインオーダーでコミットスタックエントリCSE（Commit Stack Entry、以下CSEと称する）に送信する。CSEは、送信されてきた実行命令をインオーダーで格納するキュー構造のストレージと、演算器のパイプライン回路からの命令の処理完了報告に応答してキュー内の情報等に基づき各命令のコミット処理（完了処理）を行う命令コミット処理ユニットとを有する。したがって、CSEは命令の完了処理を行う完了処理回路（完了処理部）である。
【００３６】
実行命令は、CSE内のキューにインオーダーで格納され、各演算器からの命令の処理完了報告を待つ。そして、上記したとおり、各ＲＳから実行命令がアウトオブオーダーで演算器に送信され、演算器により実行される。その後、命令の処理完了報告がCSEに送られると、CSEの命令コミット処理ユニットが、キューに格納された処理完了報告待ちの命令の中から処理完了報告に対応する実行命令をインオーダーで完了処理し、レジスタなどの回路資源の更新を行う。
【００３７】
プロセッサは、更に、ソフトウエアからアクセス可能なアーキテクチャレジスタファイル（または汎用ジスタファイル）ARC_REGと、演算器による演算結果を一時的に格納するリネーミングレジスタファイルREN_REGとを有する。それぞれのレジスタファイルは複数のレジスタを有する。また、それぞれのレジスタファイルは、固定小数点演算器と浮動小数点演算器それぞれに対応して設けられる。
【００３８】
実行命令をアウトオブオーダーで実行することを可能にするため、リネーミングレジスタファイルは、演算結果を一時的に格納し、実行命令の完了処理で、リネーミングレジスタに格納した演算結果がアーキテクチャレジスタファイル内のレジスタに格納され、リネーミングレジスタファイル内のレジスタが開放される。また、CSEは、完了処理でプログラムカウンタPCをインクリメントする。
【００３９】
分岐処理用のRSBRにキューインされた分岐命令は、分岐予測ユニットBR_PRDによって分岐予測され、予測結果に基づいて命令フェッチアドレス生成器I_F_ADD_GENが分岐先アドレスを生成する。その結果、分岐予測に基づく命令が、命令キャッシュから読み出され、命令バッファ、命令デコーダを経由して、演算器により投機的に実行される。RSBRは、分岐命令をインオーダーで実行する。但し、分岐命令の分岐先が確定する前に、分岐先を予測し、予測分岐先の命令を投機的に実行することが行われる。分岐予測が正しければ処理効率が上がり、一方、誤りであれば投機実行した命令はキャンセルされ処理効率が下がる。分岐予測の精度を上げることで処理効率の向上が図られている。
【００４０】
また、プロセッサ内には、２次命令キャッシュL2_CACHEを有し、２次命令キャッシュは図示しないメモリアクセスコントローラを介してメインメモリM_MEMにアクセスする。同様に、１次データキャッシュL1_DCACHEは、そのキャッシュ制御部内に図示しないメモリアクセス制御部を有し、図示しない２次データキャッシュに接続され、メインメモリM_MEMへのメモリアクセスを制御する。メモリアクセス制御部は、メモリアクセス命令をインオーダーで処理する。
【００４１】
図３は、バリア設定部BA_SETと命令デコーダI_DECの構成例を示す図である。命令デコーダI_DECは、命令バッファI_BUFから転送されるフェッチ命令F_INSTをデコードして実行命令EX_INSTを生成する。本実施の形態では、命令デコーダの処理効率を高めるために、例えば、４スロットのデコーダD0-D3を有する。各スロットのデコーダD0-D3は、フェッチ命令を入力する入力フリップフロップIN_FFと、フェッチ命令をデコードして実行命令を生成する実行命令生成部１３と、実行命令を演算器のレザベーションステーションに発行する実行命令発光部１４とを有する。
【００４２】
実行命令EX_INSTは、フェッチされた命令F_INSTのオペコードを実行可能にするためのデコード結果を含んだ命令である。例えば、どのリザベーションステーションを使用するか、どの演算器を使用するか、オペランドにどのデータを使用するかなど、演算に必要な情報を含む命令である。実行命令生成部１３は、フェッチされた命令オペコードをデコードし、演算実行に必要な情報を得て実行命令を生成する。
【００４３】
［バリア設定部］
本実施の形態では、命令バッファI_BUFと命令デコーダI_DECの間にバリア設定部BA_SETを有する。バリア設定部BA_SETは、命令デコーダI_DECの４スロットに対応して同様に４スロットの構成を有する。バリア設定部BA_SETは、フェッチ命令がバリア設定条件に該当（マッチ）するか否かを判定し、該当する場合にフェッチ命令にバリア属性を付加するバリア判定部BA_DET0-BA_DET3と、バリア属性を付加されたフェッチ命令などを一旦ラッチするフリップフロップFF0-FF3を有する。バリア判定部とフリップフロップも、命令デコーダI_DECの４スロット構成に合わせて４スロット構成である。但し、命令デコーダが１スロット構成の場合は、バリア判定部も１スロット構成でもよい。
【００４４】
バリア判定部BA_DETは、命令バッファからインオーダーで入力されたフェッチ命令が、バリア設定条件レジスタBA_SET_CND_REGに設定されたバリア設定条件に該当するか否かを判定する。バリア設定条件レジスタに設定されるバリア設定条件は、例えば、バリア設定条件に対応する命令のオペコード、または、逆にバリア設定条件からマスクされるオペコードである。この場合、バリア判定部は、フェッチ命令がバリア設定条件に対応するオペコードと一致するか、または、フェッチ命令がマスクされているオペコードと不一致であるかを判定する。
【００４５】
さらに、バリア設定条件は、例えば、通常モード（ユーザモード）よりレベルが高い特権モードなどの例外レベル、ユーザプログラム（ユーザプロセス）を特定するコンテンツIDなどである。この場合、バリア判定部は、フェッチ命令が、例外レベルの命令か否か、コンテンツIDの命令か否かを判定する。
【００４６】
そして、バリア設定条件レジスタに設定されるバリア設定条件は、命令の実行順序の保障の種類を示す順序保障属性毎に異なる。バリア判定部は、フェッチ命令が上記のバリア判定条件に該当した場合、該当したバリア判定条件に対応する順序保障属性（またはバリア属性）を、フェッチ命令に付加する。バリア属性を付加するとは、フェッチ命令にバリア属性フラグを追加することを意味する。そして、バリア判定部は、バリア属性フラグが付加された命令をフリップフロップFF0-FF3に転送する。バリア判定部による判定処理については後で説明する。
【００４７】
バリア判定部によりバリア属性フラグを付加された命令は、ストレージユニットSUに対応するＲＳ（RSA）などでバリア属性に対応した順序保障を実現できるように、実行される。命令の順序保障は、概略を言えば、順序保障属性が付加された命令は、ＲＳ（RSA）やストレージユニットSUで、順序保障属性（バリア属性）に対応した順序保障に適合する態様または順序で実行され、命令の投機的な実行を抑止される。または、命令デコーダによるインオーダーでの命令の処理に対しても、所定の順序保障の制約が課され、命令の投機的な実行が抑止される。
【００４８】
図３に示すとおり、バリア設定部BA_SETは、バリアフロー発生部BA_FL_GENを有する。バリアフロー発生部は、フリップフロップFF0-FF3にラッチされたバリア属性フラグ付き命令がメモリアクセス命令かそれ以外の命令かを判定し、メモリアクセス命令以外の場合にバリアフロー命令を追加発生する。
【００４９】
バリアフロー命令は、順序保障の制約を課すための命令であり、バリア属性フラグ付き命令も、順序保障の制約を課すための命令であり、いずれもバリア属性を有するバリア命令の一つである。
【００５０】
上記の通り、バリア判定部が、メモリバッファから入力されたインオーダーの４つのフェッチ命令が、バリア設定条件（順序保障対象の命令であるか否か）に該当するか否か判定する。４つのフェッチ命令がいずれもバリア設定条件に該当しなければ、フェッチ命令は、そのまま、命令デコーダI_DECの４つのスロットに並行して入力される。
【００５１】
また、バリア判定部で４つのフェッチ命令のいずれかがバリア設定条件に該当すれば、そのフェッチ命令にバリア属性フラグが付加される。そして、メモリアクセス命令に対してバリア制御するバリア属性フラグ付きフェッチ命令がメモリアクセス命令の場合、バリアフロー命令を追加する必要がなく、その場合、バリア属性フラグ付きメモリアクセス命令を含む４つの命令が、命令デコーダI_DECの４つのスロットに並行して入力される。バリア属性フラグ付きメモリアクセス命令は、メモリアクセスを実行するバリア命令であり、したがって、ＲＳＡなどで順序保障の制御が課される。
【００５２】
一方、メモリアクセス命令に対しバリア制御するバリア属性フラグが付加された命令がメモリアクセス命令以外の場合、バリアフロー発生部がバリアフロー命令を発生する。その結果、バリア設定部BA_SETは、命令バッファから入力された４つのフェッチ命令に加えて、バリアフロー命令を出力する。その場合、最初のクロックサイクルで、バリアフロー命令より前のフェッチ命令がフリップフロップから命令デコーダI_DECの対応するスロットに入力され、次のクロックサイクルで、バリアフロー命令がセレクタSLを介して命令デコーダのスロットD0に入力される。そして、更に、次のクロックサイクルで、バリアフロー命令より後のフェッチ命令が、命令デコーダの対応するスロットに入力される。バリアフロー命令は、バリア制御用のバリア命令であり、したがって、ＲＳＡなどで順序保障の制御が課される。
【００５３】
バリア属性フラグが後述する全命令に対しバリア制御するバリア属性（ABA）の場合、バリアフロー命令を追加する必要はない。
【００５４】
後述するとおり、バリア属性に対応する順序保障の制御を受けるバリア命令は、以下に説明するメモリアクセス命令に対しバリア制御するBBM，MBM,ABMのバリア属性の場合は、バリア属性が付加されたメモリアクセス命令と、バリアフロー命令である。一方、全命令に対しバリア制御するABAのバリア属性の場合は、バリア属性が付加された命令である。
【００５５】
図４は、バリア設定部の動作例を示すフローチャート図である。バリア設定部BA_SETでは、命令バッファから４つのインオーダーのフェッチ命令が入力されると（S10）、バリア判定部BA_DETが、フェッチ命令がバリア設定条件レジスタBA_SET_CND_REGに設定されているバリア設定条件に該当（マッチ）するか否かを判定する（S11）。上記したとおり、バリア設定条件は、複数の順序保障属性（バリア属性）毎に設定される。バリア判定部は、複数の順序保障属性のバリア設定条件について、それぞれ独立に判定してもよく、または、より順序規制が強い順序保障属性を優先して判定してもよい。
【００５６】
本実施の形態では、より強い順序保障属性が優先して設定される。本実施の形態の順序保障属性は、順序規制が弱い順に、以下の４種類である。
Branch Barrier to memory access (BBM)：分岐命令対メモリアクセス命令のバリア属性
Memory Barrier to memory access (MBM)：メモリアクセス命令対メモリアクセス命令のバリア属性
All Barrier to memory access (ABM)：全命令対メモリアクセス命令のバリア属性
All Barrier to All (ABA)：全命令対全命令のバリア属性
【００５７】
上記の４つの順序保障属性（バリア属性）の順序保障内容は次の通りである。この順序保障は、プロセッサのハードウエアが採用するInstruction Set Architecture(ISA)にすでに定義されているものの場合もあれば、ハードウエアが独自に定義するものもある。
【００５８】
Branch Barrier to memory access (BBM)の場合、プロセッサが、このバリア属性フラグがついた命令より後ろのメモリアクセス命令は、このフラグがついた命令以前の分岐命令を追い抜いて投機実行されない、という順序保障制御（またはバリア制御）を行う。
【００５９】
Memory Barrier to memory access (MBM)の場合、プロセッサが、このバリア属性フラグがついた命令より後ろのメモリアクセス命令は、このフラグがついた命令以前のメモリアクセス命令を追い抜いて投機実行されない、という順序保障制御を行う。
【００６０】
All barrier to memory access (ABM)の場合、プロセッサが、このバリア属性フラグがついた命令より後ろのメモリアクセス命令は、このフラグがついた命令以前の全ての命令を追い抜いて投機実行されない、という順序保障制御を行う。
【００６１】
そして、All barrier to All access (ABA)の場合、プロセッサが、このフラグがついた命令より後ろの全ての命令は、このフラグがついた命令以前の全ての命令を追い抜いて投機実行されない、という順序保障制御を行う。
【００６２】
上記のバリア属性フラグが付加された命令（バリア属性フラグ付き命令とバリアフロー命令を含む。以下単にバリア命令と称する。）は、上記のような命令実行の順序保障が課されるので、ABAが最も強い順序規制であり、ABM, MBM, BBMの順に順序規制が弱くなる。
【００６３】
図４に示されるとおり、バリア設定部のバリア判定部は、フェッチ命令がAll Barrier All(ABA)のバリア設定条件に該当する場合（S12のYES）、他のバリア属性のバリア設定条件に該当するか否かにかかわらず、All Barrier to All(ABA)のバリア属性フラグを命令に付加する（S16）。
【００６４】
バリア判定部は、フェッチ命令がABAのバリア設定条件に該当せず（S12のNO）、All Barrier memory access (ABM)のバリア設定条件に該当する場合（S13のYES）、残りのバリア属性のバリア属性のバリア設定条件に該当するか否かにかかわらず、All Barrier to memory access(ABM)のバリア属性フラグを命令に付加する（S16）。
【００６５】
さらに、バリア判定部は、フェッチ命令がABMのバリア設定条件に該当せず（S13のNO）、Memory  Barrier to memory access (MBM)のバリア設定条件に該当する場合（S14のYES）、残りのバリア属性のバリア属性のバリア設定条件に該当するか否かにかかわらず、Memory Barrier to memory access(MBM)のバリア属性フラグを命令に付加する（S16）。
【００６６】
同様に、バリア判定部は、フェッチ命令がMBMのバリア設定条件に該当せず（S14のNO）、Branch  Barrier to memory access (BBM)のバリア設定条件に該当する場合（S15のYES）、Branch Barrier to memory access(BBM)のバリア属性フラグを命令に付加する（S16）。
【００６７】
バリア判定部は、フェッチ命令がいずれのバリア属性のバリア設定条件にも該当しない場合（S15のNO）、フェッチ命令にバリア属性を付加することはない。
【００６８】
そして、バリア判定部は、フェッチ命令とバリア属性付きフェッチ命令とバリアフロー命令を命令デコーダI_DECに出力する（S17）。この場合、バリア属性フラグ付きメモリアクセス命令（メモリアクセスを実行するバリア命令）は、そのまま命令デコーダに出力され、バリア属性フラグ付き命令がメモリアクセス命令以外の命令の場合、バリア属性フラグが付加された命令とその後ろに追加されたバリアフロー命令が、命令デコーダに出力される。
【００６９】
ここで、上記したバリア属性フラグ付きメモリアクセス命令とバリアフロー命令、またはバリア属性フラグ付き命令は、いずれもバリア制御を受けるバリア命令に属する。以下、単にバリア命令と言う場合は、バリア属性BBM,MBM,ABMでは、メモリアクセスを実行するバリア命令（バリア属性フラグ付きメモリアクセス命令）と、バリア制御用のバリア命令（バリアフロー命令）を含む。また、バリア属性ABAでは、バリア属性ABAが付加された命令がバリア命令になる。いずれのバリア命令も、対応する順序保障属性（バリア属性）の順序制御の制約を受ける。
【００７０】
図５は、リザベーションステーションRSAと１次データキャッシュL1_DCACHEの構成例を示す図である。リザベーションステーションRSAは、命令デコーダI_DECが発行する実行命令が入力される入力ポートIN_POと、入力ポートIN_POから入力される実行命令を格納する入力キューIN_QUEを有する。RSAにはメモリアクセス命令が入力される。さらに、RSAは、入力キューに格納された命令のうち、実行準備が整った命令のうち最も古い命令を選択して１次データキャッシュに発行する命令選択回路１５を有する。これにより、入力キューに格納された命令は、アウトオブオーダーで１次データキャッシュに発行される。
【００７１】
他の演算器EXCに設けられたリザベーションステーションRS#も同様の構成を有し、同様の命令の発行制御がされる。
【００７２】
RSAから発行されたメモリアクセス命令は、オペランドアドレス生成器（図２参照）により必要なアドレス演算を行われ、アクセス先アドレスと共に１次データキャッシュL1_DCACHE内のフェッチポート内のキューFP_QUEに入力される。そして、フェッチポートキューにエントリされたメモリアクセス命令は、メモリアクセス制御部MEM_AC_CNTに発行される。そして、メモリアクセス制御部は、キャッシュメモリであるデータRAM（D_RAM）にアクセスアドレスのデータが登録済みか否かのキャッシュ判定をし、キャッシュヒットならキャッシュメモリ内のデータを読み出し、汎用レジスタに格納する。キャッシュミスなら、メモリアクセス制御部が、２次データキャッシュやメインメモリにメモリアクセス要求を発行する。メモリアクセスで取得されたデータは、L1データキャッシュに登録される。
【００７３】
バリア命令（バリア属性フラグが付加されたメモリアクセス命令またはバリアフロー命令）は、例えば、RSAで命令実行の順序保障に従って発行制御される。この発行制御により、RSAは、バリア命令とそれに関連する命令をアウトオブオーダーで発行せず、バリア命令に付加されたバリア属性の順序保障に基づく順序、インオーダー、で命令を発行する。更に、必要な場合、１次データキャッシュL1_DCACHE内のフェッチポートキューFP_QUEは、RSAから発行されたメモリアクセス命令を前のメモリアクセス命令の完了を待って次のメモリアクセス命令を実行できるようメモリアクセス命令の発行制御を行う。
【００７４】
但し、All Barrier to All（ABA）属性のバリア命令は、メモリアクセス命令以外の命令も含まれRSAにキューインされるとは限らないので、命令デコーダI_DECにて順序保障に従う発行制御が行われる。
【００７５】
以下、４種類のバリア属性BBM、MBM、ABM、ABAの命令が、どのようにして順序保障されるかについて、順番に説明する。
【００７６】
[Branch Barrier to memory access (BBM)]
図６は、BBM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。まず、前述のとおり、バリア設定部BA_SETが、命令バッファから入力されたフェッチ命令がBBMのバリア設定条件に該当する命令か否かを判定し、該当する場合バリア設定を行う（バリア制御BA0）。
【００７７】
BBM属性の場合、プロセッサが、このバリア属性フラグがついた命令より後ろのメモリアクセス命令は、このフラグがついた命令以前の分岐命令を追い抜いて投機実行されない、という順序保障制御を行う。この順序保障制御のために、RSAは、命令デコーダI_DECから入力された実行命令にバリア命令が含まれていると、第１に、バリア命令をそのバリア命令の前の分岐命令が完了するまで発行せず（BC1）、第２に、バリア命令が発行されるまでそのバリア命令の後ろのメモリアクセス命令を発行しない（BC2）。その結果、RSAは、バリア命令の前の分岐命令が実行完了するまで、バリア命令の後ろのメモリアクセス命令を発行しない（BC3）。要すれば、RSAは、バリア命令の前の分岐命令が実行完了するまで、バリア命令の後ろのメモリアクセス命令を発行しない（BC3）のであり、その手段として第１のバリア制御BC1と第２のバリア制御BC2を行う。第１及び第２のバリア制御BC1,BC2以外の制御でバリア制御BC3を行っても良い。
【００７８】
さらに、この順序保障制御のために、分岐命令用RS（RSBR）は、分岐命令の完了報告を分岐命令の命令ID（IID）及び分岐結果と共に、コミットスタックエントリCSEとRSAに通知する（BC1_CSE）。CSEは、RSBRからの分岐命令の処理完了報告（IID付き）に応答して、その分岐命令の完了処理（コミット処理）をインオーダーで行う。RSBRは分岐命令間をインオーダーで処理する。これにより、分岐命令間では、分岐命令の完了処理がインオーダーで行われる。そして、RSBRは、CSEに通知したのと同様に、分岐命令の完了処理後に、分岐命令の完了報告を分岐命令の命令ID（IID）及び分岐結果と共に、RSAに通知する。RSAは、バリア命令にインターロックをかけてその発行を禁止しておき、RSBRからの分岐命令の完了報告を受けると、バリア命令の直前の分岐命令のIIDとマッチングをとり、一致すれば、バリア命令をL1データキャッシュL1_DCACHEに発行する（BC1）。
【００７９】
以下、具体例で上記のバリア制御を説明する。
【００８０】
図７は、RSAにおけるバリア命令に対するバリア制御BC1のフローチャート図である。図８は、RSAにおけるバリア命令以外の命令に対するバリア制御BC2のフローチャート図である。これらのフローチャートを参照して、RSAでのバリア制御BC1,BC2,BC3を２つの具体例について説明する。
【００８１】
［具体例１：バリア属性フラグが付加された命令が分岐命令の場合］
図９、図１０は、RSAとRSBRの入力キューの構成例を示す図である。図９に、具体例Example_1として、図１に示した分岐命令JMP1 C、２つのロード命令B LOAD 2、A LOAD 1を有する命令列が示される。また、具体例では、メモリアクセス命令以外の分岐命令JMP1 CがBBM属性に該当し、バリア属性フラグが付加されている。そのため、バリア設定部BA_SETは、バリアフロー命令BA_FLWを追加し、分岐命令JMP1 Cと、バリアフロー命令BA_FLOWと、メモリアクセス命令B LOAD2、B LOAD1を、命令デコーダI_DECに出力する。この場合、バリアフロー命令がバリア命令になる。
【００８２】
図９のRSAの入力キューIN_QUEは、命令デコーダがインオーダーで発行した命令を１０個のエントリRSA0-RSA9にキューインする。入力キューIN_QUEからはアウトオブオーダーで命令が発行されるので、入力キュー内にキューインされた命令は必ずしもエントリRSA0-RSA9の順に格納されない。RSAの入力キューには、命令列のうち、バリアフロー命令BA_FLWと２つのロード命令B LOAD2、A LAOD1とが格納される。加算命令ADD1,ADD2は、例えば、分岐命令JMP1 Cの前の命令であり、オペランドアドレス生成器により実行される命令であり、特にバリア制御には関係しない。
【００８３】
RSAの入力キューIN_QUEは、キューインされた命令に、ストレージユニット（L1データキャッシュ）への発行を禁止するストレージユニットブロックフラグSU_BLK_flgと、RSAからの発行を禁止するインターロックフラグInterlockと、RSAから発行準備が整ったことを示すレディーフラグRDY_flgなどを付加する。レディーフラグとは、RSAから発行できる状態を示すフラグであり、インターロックの発行禁止状態以外に、リードアフターライトが解決していることなどが、発行可能状態（レディー状態）になる条件である。また、RSAは、レディーフラグが発行可能状態「１」である最も古い命令を発行する。
【００８４】
さらに、入力キューIN_QUEは、キューインされた命令それぞれに、その命令より古い順番（順番が前）の命令が他のエントリに存在するか否かを示すオールダーフラグOlder_flgを関連つける。図９には、エントリRSA0のロード命令B LOAD2に対して、そのロード命令より順番が前の（古い）命令のエントリRSA3,5,6,7にフラグ「１」を有するオールダーフラグOlder_flgが示される。他の命令にもオールダーフラグが関連付けられるが、図９には示していない。
【００８５】
バリア命令であるバリアフロー命令BA_FLWがキューインし、RSAは入力キュー内にそのエントリを作成する（図７のS21）。RSAは、バリア命令にストレージユニットブロックフラグ（以下SUブロックフラグ）をSU_BLK_flg=1でエントリを作成する。そして、RSAは、バリアフロー命令BA_FLWの直前の分岐命令JMP1 Cが未完了であるので（S23のYES）、インターロックをInerlock=1に設定し直前の分岐命令のIIDを記憶し（S24）、直前の分岐命令が完了するまで発行を抑止する。前述の通り、RSBRは分岐命令間ではインオーダーで処理を完了するので、バリア命令の直前の分岐命令が完了であることは、それより前の全ての分岐命令も完了であることを意味する。よって、バリア命令の直前の分岐命令が完了したことを監視することで、バリア命令より前の全分岐命令が完了したことを検出できる。尚、インターロックがInterlock=1に設定されると、レディーフラグRDY_flgは発行レディー状態ではない「０」に設定される。
【００８６】
一方、図８において、RSAは、バリアフロー命令BA_FLWより後のメモリアクセス命令B LOAD2, A LOAD1について、入力キューIN_QUE内に自分より順番が古く（順番が前で）SU_BLK_flg=1の命令があるか否か判定し（S30）、判定が真なら（S30のYES）、それらのメモリアクセス命令B LOAD2, A LOAD1のインターロックをInterlock=1に設定する（S31）。このInterlock=1によりレディーフラグはRDY_flg=0となり、これらバリアフロー命令より後ろのメモリアクセス命令はRSAから発行できない状態になる。
【００８７】
次に、図１０の入力キューの状態に遷移する。図７において、分岐命令JMP1 Cが分岐予測成功で完了処理されると、RSAは、RSBRからJMP1 CのIIDが分岐予測成功で完了処理した報告を受信し（S25のYES）、RSAは処理完了報告のIIDがバリアフロー命令BA_FLWのエントリのインターロックの原因IIDと一致したことを検出し（S26のYES）、バリアフロー命令BA_FLWのインターロックをInterlock=0に解除する（S27）。その後、RSAは、バリアフロー命令が、レディーフラグがRDY_flg=1で且つ最古の命令であることを検出し（S28のYES）、L1データキャッシュのメモリアクセス制御部MEM_AC_CNTに発行する（S29）。
【００８８】
バリアフロー命令がRSAから発行されると入力キューから消えるため、各RSAのエントリのオールダーフラグOlder_flgも更新され、メモリアクセス命令B LOAD2,A LOAD1のインターロックはInterlock=0に解除される（図８のS31のNO,S32）。それにより、メモリアクセス命令B LOAD2,A LOAD1のレディーフラグはそれぞれRDY_flg=１となり、RSAから発行できるようになる（S33のYES,S34）。
【００８９】
以上のバリア制御により、RSAは、バリアフロー命令より前の分岐命令の処理完了まで、バリアフロー命令を発行しないし、バリアフロー命令が発行されるまで、バリアフロー命令より後のメモリアクセス命令を発行しない。その結果、RSAは、BBM属性フラグが付加された分岐命令JMP1 C(BBM)の処理完了するまで、その分岐命令より後のメモリアクセス命令を発行しない。それにより、BBMのバリア属性フラグが付加された分岐命令JMP1 C(BBM)より後ろのメモリアクセス命令B LOAD2,A LOAD1は、BBMのバリア属性フラグの分岐命令以前の分岐命令を追い抜いて投機実行されない。
【００９０】
［具体例２：バリア属性フラグが付加された命令がメモリアクセス命令の場合］
図１１、図１２は、RSAとRSBRの入力キューの構成例を示す図である。図１１に、具体例Example_2として、図１に示した分岐命令JMP C、２つのメモリアクセス命令（ロード命令）B LOAD2、A LOAD1を有する命令列が示される。また、具体例２では、１番目のメモリアクセス命令B LOAD2がBBM属性に該当し、BBM属性フラグが付加されているので、バリア命令がメモリアクセス命令の例である。この場合、バリア設定部BA_SETは、バリアフロー命令BA_FLWを追加せず、分岐命令JMP1 Cと、BBM属性フラグ付きメモリアクセス命令B LOAD2（BBM）と、後続のメモリアクセス命令B LOAD1を、命令デコーダI_DECに出力する。そして、命令デコーダは、分岐命令JMP1 CをRSBRに割振り、２つのメモリアクセス命令B LOAD2（BBM）、B LOAD1をRSAに発行する。
【００９１】
RSAでのバリア制御BC1,BC2は、具体例１で説明した図７，図８に示したのと同じである。また、RSBRでの分岐命令に対する処理も具体例１と同じである。
【００９２】
バリア命令であるバリア属性フラグ付きのメモリアクセス命令B LOAD2(BBM)がキューインし、RSAは入力キュー内にそのエントリを作成する（図７のS21）。RSAは、バリア命令であるメモリアクセス命令B LOAD2(BBM)に、SUブロックフラグをSU_BLK_flg=1に設定してエントリを作成する。そして、RSAは、メモリアクセス命令B LOAD2(BBM)の直前の分岐命令JMP1 Cが未完了であるので（S23のYES）、メモリアクセス命令B LOAD2(BBM)のインターロックをInterlock=1に設定し直前の分岐命令のIIDを記憶し（S24）、直前の分岐命令が完了するまでメモリアクセス命令B LOAD2(BBM)の発行を抑止する。インターロックがInterlock=1に設定されると、レディーフラグRDY_flgは発行レディー状態ではない「０」に設定される。
【００９３】
一方、図８において、RSAは、バリア命令であるメモリアクセス命令B LOAD2(BBM)の後ろのメモリアクセス命令A LOAD1について、入力キューIN_QUE内に自分より順番が古く（順番が前で）SU_BLK_flg=1の命令があるか否か判定し（S30）、判定が真なら（S30のYES）、後ろのメモリアクセス命令A LOAD1のインターロックをInterlock=1に設定する（S31）。このInterlock=1によりレディーフラグはRDY_flg=0となり、後続のメモリアクセス命令A LOAD1はRSAから発行できない状態になる。
【００９４】
次に、図１２の入力キューの状態に遷移する。図７において、分岐命令JMP1 Cが分岐予測成功で完了処理すると、RSAは、RSBRからJMP1 CのIIDの分岐命令が分岐予測成功で完了処理した報告を受信し（S25のYES）、RSAは処理完了報告のIIDがバリア命令であるメモリアクセス命令B LOAD2に記憶したIIDと一致したことを検出し（S26のYES）、メモリアクセス命令B LOAD2(BBM)のインターロックをInterlock=0に解除する（S27）。その後、RSAは、メモリアクセス命令B LOAD2(BBM)がレディーフラグがRDY_flg=1で且つ最古の命令であることを検出し（S28のYES）、メモリアクセス命令B LOAD2(BBM)をL1データキャッシュのメモリアクセス制御部MEM_AC_CNTに発行する（S29）。
【００９５】
メモリアクセス命令B LOAD2がRSAから発行されると入力キューから消えるため、各RSAのエントリのオールダーフラグOlder_flgも更新され、後続のメモリアクセス命令A LOAD1のインターロックはInterlock=0に解除される（図８のS30のNO,S32）。それにより、後続のメモリアクセス命令A LOAD1のレディーフラグはRDY_flg=１となり、RSAから発行できるようになる（S33のYES,S34）。
【００９６】
以上のバリア制御により、RSAは、バリア命令であるメモリアクセス命令B LOAD2(BBM)より前の分岐命令の処理完了まで、バリア命令であるメモリアクセス命令B LOAD2(BBM)を発行しないし、バリア命令であるメモリアクセス命令B LOAD2(BBM)が発行されるまで、そのメモリアクセス命令B LOAD2(BBM)命令より後のメモリアクセス命令A LOAD1を発行しない。それにより、RSAは、BBM属性フラグが付加されたバリア命令のメモリアクセス命令B LOAD2(BBM)より前の分岐命令JMP1 C(BBM)の処理が完了するまで、バリア命令のメモリアクセス命令B LOAD2(BBM)より後のメモリアクセス命令A LOAD1を発行しない。その結果、バリア命令のメモリアクセス命令B LOAD2(BBM)より後ろのメモリアクセス命令A LOAD1は、バリア命令のメモリアクセス命令以前の分岐命令JMP1 Cを追い抜いて投機実行されない。
【００９７】
[Memory Barrier to memory access (MBM)]
図１３は、MBM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。まず、図６のBBM属性のバリア命令と同様に、バリア設定部BA_SETが、命令バッファから入力されたフェッチ命令がMBMのバリア設定条件に該当する命令か否かを判定し、該当する場合バリア設定を行う（バリア制御BA0）。バリア設定は、前述したとおり、バリア設定条件に該当するフェッチ命令にバリア属性フラグを付加する。バリア設定部は、バリア属性フラグ付き命令がメモリアクセス命令の場合は、そのままバリア属性フラグ付きメモリアクセス命令（メモリアクセスを実行するバリア命令）を出力し、メモリアクセス命令以外の場合は、バリア属性フラグ付き命令の後にバリアフロー命令（バリア制御用のバリア命令）を追加して出力する。そして、RSAとメモリアクセス制御部MEM_AC_CNTは、メモリアクセスを実行するバリア命令とバリア制御用のバリア命令について以下のバリア制御を行う。
【００９８】
MBM属性の場合、プロセッサが、バリア制御を受けるバリア命令（即ち、バリア属性フラグ付きメモリアクセス命令とバリアフロー命令）より後ろのメモリアクセス命令は、このフラグが付いた命令以前のメモリアクセス命令を追い抜いて投機実行されない、という順序保障制御を行う。
【００９９】
バリア属性フラグ付き命令は、バリア制御対象としては、実質的に、バリア属性フラグがついたメモリアクセス命令（メモリアクセスを実行するバリア命令）とバリアフロー命令（バリア制御用のバリア命令）と等価である。これらのバリア命令がRSAにキューインされメモリアクセス制御部で実行されるからである。メモリアクセス命令以外のバリア属性フラグ付き命令は、必ずしもRSAにキューインされないのでバリア制御対象とはならないが、追加されたバリアフロー命令が代わりにRSA等でバリア制御対象となる。バリア制御対象となるバリア属性フラグがついたメモリアクセス命令（メモリアクセスを実行するバリア命令）とバリアフロー命令（バリア制御用のバリア命令）を、以下、バリア制御対象のバリア命令と呼ぶ。
【０１００】
さて、この順序保障制御のために、第１に、RSAは、命令デコーダI_DECから入力された実行命令にバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）が含まれていると、そのバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）が発行されるまで、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）の後ろのメモリアクセス命令を発行しない（BC2）。但し、バリア命令はバリア命令より前のメモリアクセス命令を追い越して発行されてもよい。
【０１０１】
RSAがバリア命令が発行されるまでその後ろのメモリアクセス命令を発行しない（BC2）という発行制御を行うことで、バリア命令とその後ろのメモリアクセス命令がインオーダーでメモリアクセス制御部MA_AC_CNTのフェッチポートキューFP_QUEにキューインされる。
【０１０２】
第２に、メモリアクセス制御部は、RSAから通知されたメモリアクセス命令について、プログラムの順番通りに完了処理できるフェッチポートキューで管理を行う。即ち、メモリアクセス制御部MEM_AC_CNTのフェッチポートキューFP_QUEは、（１）バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）よりも前のメモリアクセス命令が全て完了処理するまで、そのバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）を発行（そして実行）しない（即ちメモリアクセス制御部による処理をさせない）。また、フェッチポートキューは、（２）バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）よりも後ろのメモリアクセス命令について、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）が完了処理するまで、後ろのメモリアクセス命令を発行（そして実行）しない。（１）（２）がバリア制御BC4である。
【０１０３】
これにより、フェットポートは、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）と、それより後ろのメモリアクセス命令を、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）より前のメモリアクセス命令が完了処理するまで、発行（そして実行）しない。
【０１０４】
上記のフェッチポートのバリア制御BC4の（１）（２）と、前述のRSAによる、「バリア命令が発行されるまで、バリア命令の後ろのメモリアクセス命令を発行しないというバリア制御BC2」との組み合わせにより、プロセッサは前述の順序保障制御を実現する。すなわち、順序保障制御は、「このバリア属性フラグMBMがついた命令（即ち、バリア属性フラグ付きメモリアクセス命令とバリアフロー命令）より後ろのメモリアクセス命令は、このフラグが付いた命令以前のメモリアクセス命令を追い抜いて投機実行されない」という制御である。
【０１０５】
尚、前述したBBMのバリア属性のバリア命令の場合、RSAがバリア命令より前の分岐命令の完了処理後にバリア命令を発行しているので、上記のメモリアクセス制御部内のフェッチポートキューでのバリア制御BC4を行う必要はない。
【０１０６】
図１４は、RSAにおけるバリア命令に対するバリア制御BC1_Bのフローチャート図である。バリア制御BC1_Bでは、図７のバリア制御BC1から工程S23-S27が削除されている。つまり、RSAは、バリア命令がキューインされると（S21のYES）、バリア命令のストレージユニットブロックフラグSU_BLK_flgを「１」に設定する（S22）。そして、RSAは、キューインされた命令のうち、レディーフラグRDY_flgが「１」で最も古い命令を、メモリアクセス制御部MEM_AC_CNTに発行する。
【０１０７】
以下、具体例３について、RSAでのバリア制御を説明する。このバリア制御では、図１４のバリア命令に対するバリア制御のフローチャートに加えて、図８に示したRSAにおけるバリア命令以外の命令に対するバリア制御BC2のフローチャートも参照する。
【０１０８】
［具体例３：MBM属性フラグが付けられた命令がメモリアクセス命令の例］
図１５、図１６は、MBM属性フラグが付けられた命令がメモリアクセス命令の場合の具体例３に対するRSAにおけるバリア制御例を示す図である。図１５に示された具体例Example_3は、加算命令ADD1と、３つのメモリアクセス命令LOAD3、B LOAD2(MBM)、A LOAD1の命令列である。この命令列が命令デコーダからRSAにインオーダーでキューインされる。RSAは、メモリアクセス命令LOAD3とB LOAD2(BMB)との間はアウトオブオーダーで、B LOAD2(BMB)とA LOAD1との間はインオーダーでメモリアクセス制御部に発行する。
【０１０９】
図１５のRSAの入力キューIN_QUEにおいて、バリア命令であるメモリアクセス命令B_LOAD2(MBM)がキューインすると（S21のYES）、RSAは、メモリアクセス命令B_LOAD2(MBM)にストレージユニットブロックフラグSU_BLK_flg=1でエントリを作成する。
【０１１０】
一方、RSAは、バリア命令のメモリアクセス命令B_LOAD2(MBM)より後のメモリアクセス命令A LOAD1について、入力キューIN_QUE内に自分（A LOAD1）より順番が古く（順番が前で）SU_BLK_flg=1の命令があるか否か判定する（図８のS30）。図１５の例では、メモリアクセス命令A LOAD1は、自分（メモリアクセス命令A LOAD1）より順番が古くSU_BLK_flg=1であるメモリアクセス命令B_LOAD2(BMB)が存在するので、この判定が真となる（S30のYES）。それにより、RSAは、メモリアクセス命令A LOAD1のインターロックをInterlock=1に設定する（S31）。Interlock=1によりレディーフラグはRDY_flg=0となり、このメモリアクセス命令A LOAD1はRSAから発行できない状態になる。
【０１１１】
次に、図１６の入力キューの状態に遷移する。図１４に示すとおり、バリア命令のメモリアクセス命令B LOAD2(MBM)は、Interlockがかかっていないので、リードアフターライトの問題などが解決できればレディーフラグRDY_flgは「１」となり、最古の命令になればRSAから発行される（図１４のS28のYES,S29）。この発行によりメモリアクセス命令B LOAD2(BMB)はRSAから消去され、各エントリのオールダーフラグにも反映される。その結果、メモリアクセス命令A LOAD1のインターロックは「０」に解除され（図８のS32）、レディーフラグは発行レディー状態「１」になる。その後、RSAは、メモリアクセス命令A LOAD1を発行する（図８のS34）。
【０１１２】
以上のバリア制御BC1_BとBC2により、バリア命令のメモリアクセス命令B LOAD2(BMB)とその後ろのメモリアクセス命令A LOAD1とは、RSAからインオーダーでSUアクセス制御部内のフェッチポートキューFP_QUEにキューインされる。
【０１１３】
以上のバリア制御により、RSAは、バリア命令が発行されるまでバリア命令より後のメモリアクセス命令を発行しない。その結果、RSAは、MBM属性フラグが付加されたメモリアクセス命令（メモリアクセスを実行するバリア命令）B LOAD2(BMB)を発行するまで、その命令より後のメモリアクセス命令A LOAD1を発行しない。よって、B LOAD2(BMB)とA LOAD1とはRSAからフェッチポートキューFP_QUEにインオーダーで発行される。
【０１１４】
第２に、メモリアクセス制御部MEM_AC_CNTは、MBM属性フラグ付きメモリアクセス命令（バリア命令）より前の全メモリアクセス命令と、バリア命令と、その後ろのメモリアクセス命令に対して、インオーダーで完了処理する。
【０１１５】
図１７は、メモリアクセス制御部のフェッチポートのキューFP_QUEでの制御例を示すフローチャート図である。図１８は、フェッチポートのキューFP_QUEの例を示す図である。図１８には、具体例３の命令がRSAからキューインされた状態（左側）と、その後、フェッチポートから発行された状態（右側）とが示される。
【０１１６】
メモリアクセス制御部MEM_AC_CNTの入力キューはフェッチポートと呼ばれ、命令に対してプログラムの順番通り（インオーダー）にキュー番号Que0-Que7が循環して割振られる。循環して割振るとは、キュー番号Que7の次はキュー番号Que0が割振られるという意味である。そのため、キューのどのエントリが最も古いエントリかを示すトップオブキューポインタTOQ_PTRが管理される。
【０１１７】
フェッチポートキューからメモリアクセス制御部への発行ルールは、発行できる最も古いエントリの命令を発行する、である。したがって、TOQ_PTRのエントリから後ろ側に見ていって最初に見つかった発行可能なエントリの命令が発行される。発行できる状態とは、RSAから発行された後、メモリアクセス命令のメモリアドレスが判明した状態であり、且つインターロックされていない状態である。メモリアドレスは、例えばオペランドアドレス生成部による演算により生成される。
【０１１８】
したがって、RSAからアウトオブオーダーで命令が発行されるため、フェッチポートのキューでは、必ずしもキュー番号の順にメモリアクセス命令が完了するとは限らない。そこで、以下に示す順序保障のためのバリア制御BC4が行われる。
【０１１９】
尚、メモリアクセス制御部のフェッチポートには、メモリアクセスを要求するメモリアクセス命令がキューインされる。メモリアクセス命令はL1データキャッシュでキャッシュヒットすればレイテンシは短いが、キャッシュミスしてメインメモリへのアクセスが発生するとレイテンシが長くなる。また、メモリアクセス命令はメモリアクセス制御部によるアクセス制御中にアボートされて再度フェッチポートから発行されることもある。そして、フェッチポートから発行されたメモリアクセス命令は、メモリアクセスの処理が完了してデータ応答を受信し、トップオブキューポインタTOQ_PTRがそのメモリアクセス命令を指したら、フェッチポートから消える。これにより、フェッチポートはメモリアクセス命令のエントリをインオーダーで割振り、エントリの開放もインオーダーで行う。
【０１２０】
図１８の左側では、具体例３の命令列のうちLOAD3,B LOAD2(MBM),A LOAD1がフェッチポートキューのQue2-4にエントリを作成されている。前述のとおり、RSAは、バリア命令B LOAD2(MBM)とその後のメモリアクセス命令A LOAD1とをインオーダーで発行制御するが、バリア命令B LOAD2(MBM)より前のメモリアクセス命令LOAD3との間はアウトオブオーダーで発行する場合がある。しかし、フェッチポートが、以下の制御により、バリア命令B LOAD2(MBM)とその後のメモリアクセス命令A LOAD1にインターロックをかけることで、バリア命令B LOAD2(MBM)より前のメモリアクセス命令LOAD3がフェッチポートにキューインするまで発行を抑止する。
【０１２１】
即ち、図１７に示したとおり、フェッチポートキューは、バリア命令であるメモリアクセス命令B LOAD2(MBM)が（S40のYES）、トップオブキューポインタTOQ_PTRにより指されていないと（S41のNO）、そのインターロックを「１」に設定して、メモリアクセス命令B LOAD2(BMB)より前のメモリアクセス命令が全て発行されるまで発行を抑止する（S42）。
【０１２２】
同時に、フェッチポートキューは、バリア命令より後ろのメモリアクセス命令は（S44のYES）、自分より前にMBM属性のバリア命令がフェッチポートキュー内にエントリされている場合（S45のYES）、そのインターロックを「１」に設定して、MBM属性のバリア命令が発行されるまで発行を抑止する。
【０１２３】
一方、フェッチポートキューは、バリア命令B LOAD2(MBM)がTOQ_PTRにより指されると（S41のYES）、バリア命令のインターロックを「０」に解除し（S43）、バリア命令より後のメモリアクセス命令A LOAD1が、その前にMBM属性のバリア命令B LOAD2(MBM)がなくなると（S45のNO）、そのインターロックを「０」に解除する（S47）。
【０１２４】
そして、フェッチポートは、TOQ_PTRからみて最も古い（最も前の）発行可能な命令を（S48のYES）、メモリアクセス制御部に発行する（S49）。
【０１２５】
フェッチポートのこれらの制御により、バリア命令B LOAD2(MBM)とその後ろのメモリアクセス命令A LOAD1は、フェッチポートにバリア命令より前のメモリアクセス命令LOAD3がキューインされ、発行され、完了処理されて消えるまで、フェッチポート内に留まる。図１８の左側の状態は、メモリアクセス命令LOAD3がキューインされたときの状態を示している。
【０１２６】
次に、図１８の左側から時間経過後の右側では、Que3のバリア命令のメモリアクセス命令B LOAD2(MBM)の前のメモリアクセス命令LOAD3が発行され完了処理されると、トップオブキューポインタTOQ_PTRがメモリアクセス命令B LOAD2(MBM)を指すようになる（S41のYES）。すると、フェッチポートキューは、メモリアクセス命令B LOAD2(MBM)のインターロックを「０」に解除する（S43）。その結果、メモリアクセス命令B LOAD2(MBM)はメモリアクセス制御部に発行される（S48のYES,S49）。
【０１２７】
MBM属性のバリア命令が発行され、その後完了処理され、フェッチポートキューからなくなると、Que4のメモリアクセス命令A LOAD1のインターロックが「０」に解除され（S45のNO,S47）、その後、メモリアクセス命令A LOAD1はフェッチポートキューから発行され（S49）、その後完了処理される。バリア命令より後のメモリアクセス命令は、バリア命令が完了処理された後は、アウトオブオーダーで発行され、実行される。
【０１２８】
［MBM属性フラグが付けられた命令がメモリアクセス命令以外の命令の場合］
MBM属性フラグが付けられた命令がメモリアクセス命令以外の場合、バリア設定部がMBM属性フラグが付けられた命令の後ろにバリアフロー命令（バリア制御用のバリア命令）を追加し、命令デコーダがバリアフロー命令をRSAに割振る。そして、上記したRSAでのバリア制御BC1_B、BC2と、メモリアクセス制御部のフェッチポートでのバリア制御BC4により、バリアフロー命令より前のメモリアクセス命令とバリアフロー命令より後のメモリアクセス命令との順序保障が遵守される。
【０１２９】
具体的には、図１５，１６，１８のバリア命令B LOAD2(MBM)がバリアフロー命令BA_FLWに置き換えられる。そして、バリア制御は、バリア命令B LOAD2(MBM)に対して行った制御と同じ制御が、バリアフロー命令に対して行われる。したがって、バリア属性が付けられた命令がメモリアクセス命令以外の命令の具体例についての説明は省略する。
【０１３０】
以上のとおり、RSAでのバリア制御とメモリアクセス制御部のフェッチポートでのバリア制御により、MBM属性のバリア命令に対する順序保障が遵守される。それにより、プロセッサは、バリア命令であるメモリアクセス命令B LOAD2(MBM)より後ろのメモリアクセス命令A LOAD1が、バリア命令B LOAD2(MBM)とそのバリア命令より前のメモリアクセス命令LOAD3が完了するまでに投機的に実行されることを防止する。
【０１３１】
[All Barrier to memory access (ABM)]
図１９は、ABM属性のバリア命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。バリア設定部BA_SETの制御BC0は、MBM属性の場合と同じである。
【０１３２】
ABM属性の場合、プロセッサが、このバリア属性フラグABMがついた命令より後ろのメモリアクセス命令は、バリア属性フラグがついた命令以前の全ての命令（MBMのようにメモリアクセス命令に限られない）を追い抜いて投機実行されない、という順序保障制御を行う。
【０１３３】
この順序保障制御のために、第１に、RSAは、命令デコーダI_DECから入力された実行命令にバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）が含まれていると、バリア命令が発行されるまでその後ろのメモリアクセス命令を発行しない（BC2）。そのため、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）より後ろのメモリアクセス命令は、このバリア命令よりも後に、メモリアクセス制御部に発行される。
【０１３４】
RSAがバリア命令が発行されるまでそのバリア命令の後ろのメモリアクセス命令を発行しない（BC2）という発行制御を行うことで、バリア命令とそのバリア命令の後ろのメモリアクセス命令がインオーダーでメモリアクセス制御部MEM_AC_CNTのフェッチポートキューFP_QUEにキューインされる。この制御BC2も、MBM属性のRSAの制御と同じである。
【０１３５】
第２に、メモリアクセス制御部は、RSAより通知されたメモリアクセス命令について、プログラムの順番通りに完了処理できるフェッチポートで管理を行う。メモリアクセス制御部MEM_AC_CNTのフェッチポートキューFP_QUEは、（１）バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）よりも前の全命令が全て完了処理を終えるまで、そのバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）を発行しない。また、フェッチポートキューは、（２）バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）よりも後ろのメモリアクセス命令について、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）が完了処理をするまで、後ろのメモリアクセス命令を発行しない（バリア制御BC5）。
【０１３６】
第３に、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）より前の全命令が全て完了処理済みになったことは、CSEの入力キューのトップオブキューポインタのIIDが、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）のIIDに一致したか否かで検知できる。フェッチポートはこの検知処理でバリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）より前の全命令が完了処理したことを検出し、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）を発行する制御（BC5の（１））を行う。
【０１３７】
これにより、フェットポートは、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）と、それより後ろのメモリアクセス命令を、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）より前の全ての命令が処理完了するまで、発行しない。
【０１３８】
以下、具体例４について、RSAでのバリア制御を説明する。このバリア制御では、図１４のバリア命令に対するバリア制御のフローチャートに加えて、図８に示したRSAにおけるバリア命令以外の命令に対するバリア制御BC2のフローチャートも参照する。
【０１３９】
［具体例４：バリア属性フラグがついた命令がメモリアクセス命令の場合］
具体例４の命令列Example_4は図２１，図２２に示されるとおり、図１５，図１６の具体例３の命令列Example_3と同じである。
【０１４０】
第１に、RSAによるバリア制御BC1_BとBC2は、バリア属性MBMについて説明した図１５、図１６に示したバリア制御BC1_BとBC2と同じである。第２に、メモリアクセス制御部のフェッチポートでのバリア制御BC5については、以下に示すとおりである。
【０１４１】
図２０は、メモリアクセス制御部のフェッチポートでのバリア制御BC5のフローチャート図である。図２０のフローチャートの処理S40, S42-S49は、図１７の処理S40, S42-S49と同じである。但し、図２０のフローチャートの処理S51は、図１７の処理S41と異なる。具体的には、フェッチポートは、CSEのトップオブキューポインタCSE_TOQ_PTRが指す命令ID(IID)が、バリア命令（バリア属性付きメモリアクセス命令またはバリアフロー命令）のIIDと一致するか否かを判定し、そのバリア命令より前の全命令が完了処理済みであるか否かを判定する（S51）。
【０１４２】
図２０のフローチャートによれば、フェッチポートは、キュー内にエントリを作成された命令が、バリア命令の場合（S40）、CSEのトップオブキューポインタCSE_TOQ_PTRが指す命令ID(IID)がバリア命令のIIDと不一致の場合（S51のNO）、バリア命令のインターロックを「１」に設定して発行を抑止する。一方、一致する場合（S51のYES）、バリア命令のインターロックを「０」に解除して発行を許可する（S43）。その後バリア命令が最古の発行可能命令になると発行され、メモリアクセス制御部により実行される。
【０１４３】
一方、フェッチポートのキュー内の命令がバリア命令以外のメモリアクセス命令の場合（S44）、そのメモリアクセス命令より前にバリア命令があると（S45のYES）、そのインターロックは「１」に設定され（S46）、前のバリア命令がなくなると（S45のNO）、そのインターロックは「０」に解除される（S47）。
【０１４４】
図２１，図２２は、具体例４についてメモリアクセス制御部のフェッチポートでのバリア制御BC5を説明する図である。図２１，図２２には、メモリアクセス制御部のフェッチポートのキューと、CSEのキューとが示される。
【０１４５】
CSEのキューには、命令列のすべての命令がエントリされ、全命令にIIDが割振られ、全命令の完了処理がされる度にトップオブキューポインタCSE_TOQ_PTRがシフトされる。一方、メモリアクセス制御部のフェッチポートには、命令列内のメモリアクセス命令がエントリされ、それぞれのインターロックInterlockとIIDが保持される。したがって、CSEのトップオブキューポインタCSE_TOQ_PTRが指すIIDをチェックすれば、どの命令まで完了処理されたかを知ることができる。
【０１４６】
図２１の状態では、CSEのトップオブキューポインタCSE_TOQ_PTRがADD1を指していて、ADD1のIID＝１は、メモリアクセス制御部のフェッチポート内のバリア命令B LOAD2(ABM)のIID=3と一致しない（S51のNO）。そのため、フェッチポートは、バリア命令のインターロックを「１」に設定して発行を抑止する（S42）。これに伴い、命令A LOAD1より前にバリア命令B LOAD2(ABM)が存在するので（S45のYES）、命令A_LOAD1もインターロックが「１」に設定され発行を抑止される（S47）。
【０１４７】
次に、図２２の状態では、CSEのトップオブキューポインタCSE_TOQ_PTRがバリア命令B LOAD2(ABM)を指し、そのIID＝３は、フェッチポート内のバリア命令B LOAD2(ABM)のIID=3と一致する（S51のYES）。そのため、フェッチポートは、バリア命令のインターロックを「０」に解除し発行可能状態にする（S43）。その後、バリア命令が発行される（S49）。これに伴い、命令A LOAD1より前にバリア命令B LOAD2(ABM)が存在しなくなり（S45のNO）、命令A_LOAD1もインターロックが「０」に解除され（S47）、発行可能状態にされ、その後、発行される（S49）。
【０１４８】
［バリア属性を付加された命令がメモリアクセス命令以外の命令の場合］
バリア属性が付加された命令がメモリアクセス命令以外の場合、バリア設定部がバリア属性が付加された命令の後ろにバリアフロー命令を追加発行し、命令デコーダがバリアフロー命令をRSAに割振る。前述のとおり、バリアフロー命令はバリア命令の一つであり、RSAやメモリアクセス制御部でバリア制御を受ける。つまり、上記したRSAでのバリア制御BC1_B、BC2と、メモリアクセス制御部のフェッチポートでのバリア制御BC5によりバリアフロー命令とその後のメモリアクセス命令との順序保障が遵守される。
【０１４９】
具体的には、図２１，２２のバリア命令B LOAD2(MBM)がバリアフロー命令BA_FLWに置き換えられる。そして、バリア制御は、バリア命令B LOAD2(MBM)に対して行った制御と同じ制御が、バリアフロー命令に対して行われる。したがって、バリア属性が付加された命令がメモリアクセス命令以外の具体例についての説明は省略する。
【０１５０】
以上のRSAとメモリアクセス制御部のフェッチポートでのバリア制御により、ABM属性のバリア命令に対する順序保障が遵守される。それにより、メモリアクセス命令B LOAD2(MBM)の後ろのメモリアクセス命令A LOAD1が、命令B LOAD2(MBM)より前の全ての命令の完了処理までに投機的に実行されることが防止される。
【０１５１】
[All Barrier All (ABA)]
図２３は、バリア属性ABAが付加された命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。バリア属性ABAの場合、メモリアクセス命令に限らず全ての命令について追い越しを許さない。したがって、バリア制御BC6は、すべての命令を発行する命令デコーダで行う。
【０１５２】
命令デコーダはすべての命令が処理されるので、バリア属性ABAが付加された命令に対して、バリアフロー命令を追加することは行わない。したがって、バリア属性ABAの場合、バリア命令はバリア属性ABAが付加された命令だけである。
【０１５３】
更に、命令デコーダは、バリア命令より前の全命令が完了処理済みであることと、バリア命令が完了処理済みであることを、全命令の完了処理を行うCSEのトップオブキューポインタが指すIIDにより判定する（BC6_CSE）。
【０１５４】
これにより、プロセッサは、バリア属性ABAが付加されたバリア命令より後ろの全ての命令を、このバリア命令以前の全ての命令を追い抜いて投機実行させない、という順序保障制御を行う。
【０１５５】
最初に、バリア設定部がバリア命令（バリア属性ABA付き命令）の生成を行う（BC0）。次に、順序保障の制御を行うために、命令デコーダI_DECが、バリア設定部BA_SETからバリア命令を受信すると、（１）バリア命令より前の全命令を対応するRSとCSEにインオーダーで発行し、（２）バリア命令より前の全命令の完了処理をCSEが空状態になったことにより検出すると、バリア命令を発行し、（３）バリア命令の完了処理をCSEが空状態になったことにより検出すると、バリア命令の後の命令をインオーダーで発行する（BC5）。命令デコーダI_DECは、CSEからの命令の完了処理の報告に基づいて、CSEの空状態を検出する（BC6_CSE）。
【０１５６】
このように、バリア属性ABAのバリア命令の場合、バリア命令の前の全命令を実行し完了処理を確認し、それからバリア命令を実行しその完了処理を確認し、その後、バリア命令の後の全命令を実行する。よって、命令実行の順序保障のための規制が最も厳しいバリア制御となる。この場合、バリア命令より後の全ての命令について投機実行をさせない。何らかの命令の投機実行が、プロセッサの脆弱性の原因になる場合、このバリア属性ABAを命令に付加することで、投機実行を防止することができる。
【０１５７】
図２４は、命令デコーダにおけるバリア命令（BA命令）とその前後の命令に対するバリア制御BC6を示すフローチャート図である。命令デコーダは、バリア命令が入力されると（S60のYES）、バリア命令とバリア命令の後ろの命令のインターロックを「１」に設定し、発行抑止状態にする（S61）。そして、バリア命令より前のインターロックが「０」の命令を発行する（S62）。
【０１５８】
その後、命令デコーダは、CSEからの命令の完了処理通知により現在のCSEのキューに残っている命令数を管理し、CSE内の命令数がゼロになるとCSEが空になったことを検出する（S63のYES）。CESの空状態の検出に応答して、命令デコーダは、バリア命令のインターロックを「０」に解除し、バリア命令を発行する（S64）。それと共に、命令デコーダは、バリア命令の後の命令のインターロックを「１」のまま維持する（S64）。
【０１５９】
その後、命令デコーダは、CSEからの命令の完了処理通知によりCSE内の命令数を管理し、CSE内の命令数がゼロになるとCSEが空になったことを検出する（S65のYES）。CESの空状態の検出に応答して、命令デコーダは、バリア命令の後の命令のインターロックを「０」に解除し、後の命令を発行する（S66）。
【０１６０】
命令デコーダは、バリア命令が入力されていない間は、命令をインオーダーでRSとCSEに発行する（S67）。
【０１６１】
［具体例５］
バリア属性ABAの場合、バリア設定部は、バリア設定条件に該当すると、バリア属性を付加された命令がメモリアクセス命令かメモリアクセス命令以外の命令かにかかわらず、すべて、該当した命令にバリア属性を付加して命令デコーダに発行する。RSAによるバリア制御は行われない。以下では、バリア属性を付加した命令がバリア命令となる。
【０１６２】
図２５、図２６，図２７は、具体例Example_5の命令列についてバリア制御BC6を説明する図である。命令列のB LOAD2にバリア属性ABAが付加されている。
【０１６３】
図２５において、命令デコーダのキューに、命令列Example_5のADD1、ADD2、B LOAD2(ABA)、A LOAD1が入力済みである。この場合、バリア命令B LOAD2(ABA)とその後ろの命令A LOAD1のインターロックを「１」に設定する（S61）。そして、命令デコーダは、命令ADD1とADD2をインオーダーでCSEと図示しないRSに発行する（S62）。また、命令デコーダは、CSE内の命令数をCSE使用カウンタCSE_USE_CTRで管理する。命令デコーダが２つの命令ADD1とADD2をCSEに発行したため、このCSE使用カウンタのカウント値は「２」となる。
【０１６４】
図２６において、CSEが２つの命令ADD1とADD2の完了処理を行い、トップオブキューポインタCES_TOQ_PTRがCSE2に移動している。CSEから上記２つの命令それぞれの完了処理報告に基づいて、命令デコーダが管理するCSE使用カウンタのカウント値は「０」になる。これにより、命令デコーダはCSEが空状態になったことを検出する（S63のYES）。その結果、命令デコーダは、バリア命令B LOAD2(ABA)のインターロックを「０」に解除し（S64）、その後バリア命令B LOAD2(ABA)をCSEと図示しないRSに発行する（S64）。この時、命令デコーダは、バリア命令の次の命令A LOAD1のインターロックを「１」に維持する（S64）。
【０１６５】
図２７において、CSEがバリア命令B LOAD2(ABA)の完了処理を行い、CSEからバリア命令の完了処理報告に基づいて、命令デコーダが管理するCSE使用カウンタのカウント値は「０」になる。これにより、命令デコーダはCSEが空状態になったことを検出する（S65のYES）。その結果、命令デコーダは、バリア命令B LOAD2(ABA)の後の命令A LOAD1のインターロックを「０」に解除し（S66）、後の命令A LOAD1をCSEと図示しないRSに発行する（S66）。
【０１６６】
この結果、命令デコーダは空になり、次のフェッチ命令をインオーダーで入力する。それ以後、上記と同様にバリア命令の前の命令の発行、CSEの空状態の検出、バリア命令の発行、CSEの空検出、バリア命令の後の命令の発行を繰り返す。
【０１６７】
上記のバリア制御により、プロセッサは、バリア属性ABAが付加された命令（バリア命令）より後ろの全ての命令を、このバリア属性ABAが付加された命令（バリア命令）以前の全ての命令を追い抜いて投機実行させない、という順序保障を遵守する。
【０１６８】
［バリア設定条件レジスタへの設定例］
本実施の形態では、最初に図１で説明したメモリアクセス命令が投機的に実行されることを防止するために、バリア設定条件レジスタにバリア設定条件を設定する。例えば、図１で示した第１の例のように、分岐命令が分岐確定する前に分岐予測先のメモリアクセス命令が投機的に実行されることを防止したい場合、バリア設定条件レジスタには、バリア設定条件として特権モードでの分岐命令にバリア属性BBMが付加されるよう設定する。また、第２の例の後に説明した２つのロード命令が投機的に実行されることを防止したい場合、バリア設定条件レジスタには、バリア設定条件として特権モードでのメモリアクセス命令にバリア属性MBMが付加されるよう設定する。上記以外のある命令の投機的実行を防止したい場合、バリア設定条件として特権モードでのある命令にバリア属性ABMまたはABAが付加されるように設定する。
【０１６９】
プロセッサのセキュリティの脆弱性はユーザに応じて異なるので、それぞれのユーザが必要なバリア属性を選択して、バリア設定条件を設定するようにするのが望ましい。
【０１７０】
いずれの場合も、例えば、ユーザがアプリケーションを実行する初期化処理で、バリア設定条件レジスタに望ましいバリア設定条件を設定したり、アプリケーションのあるタイミングでバリア条件レジスタにバリア設定条件を設定したりする。
【０１７１】
以上の通り、本実施の形態によれば、ユーザのプロセッサのセキュリティの脆弱性の原因に対応して、バリア設定レジスタにバリア設定条件を設定することで、ＲＳＡ、メモリアクセス制御部、メモリデコーダで、命令実行の順序保障を実現するバリア制御を行う。これにより、プロセッサのある命令の投機実行を防止することができる。
【０１７２】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１７３】
（付記１）
バリア設定条件が設定されるバリア設定条件レジスタと、
フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記フェッチ命令を前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力するバリア設定部と、
前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリア命令を、それぞれの命令に対応する実行キュー部に割振る命令デコーダと、
前記実行命令の一種であるメモリアクセス命令を割振られ、プログラムの順番と異なるアウトオブオーダーで発行する第１の実行キュー部と、
前記第１の実行キュー部が発行した前記メモリアクセス命令を実行するメモリアクセス制御部とを有し、
前記第１の実行キュー部に前記バリア命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より後のメモリアクセス命令を、前記バリア命令及び前記バリア命令より前の前記バリア属性に対応する所定の実行命令を追い抜いて投機実行しない、演算処理装置。
【０１７４】
（付記２）
前記バリア属性が分岐命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記分岐命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記分岐命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部は、前記バリア命令より前の分岐命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０１７５】
（付記３）
前記第１の実行キュー部が、前記バリア命令より前の分岐命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行しない、付記２に記載の演算処理装置。
【０１７６】
（付記４）
前記バリア属性がメモリアクセス命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記メモリアクセス命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記メモリアクセス命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より前のメモリアクセス命令が完了処理されるまで、前記メモリアクセスを実行するバリア命令と、前記バリア命令より後ろのメモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０１７７】
（付記５）
前記第１の実行キュー部が、前記バリア命令より後に、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記バリア命令より前のメモリアクセス命令が完了処理されるまで、前記バリア命令を実行せず、前記バリア命令が完了処理されるまで、前記バリア命令より後のメモリアクセス命令を実行する、付記４に記載の演算処理装置。
【０１７８】
（付記６）
前記バリア属性が全命令対メモリアクセス命令の属性を有し、
前記バリア設定部は、前記全命令対メモリアクセス命令のバリア属性に該当するフェッチ命令がメモリアクセス命令の場合、前記メモリアクセス命令をメモリアクセスを実行するバリア命令に変更し、前記全命令対メモリアクセス命令のバリア属性に該当するフェッチ命令が前記メモリアクセス命令以外の第１の命令の場合、前記第１の命令を前記第１の命令と前記第１の命令の後ろのバリア制御用のバリア命令に変更し、
前記命令デコーダは、前記メモリアクセスを実行するバリア命令と前記バリア制御用のバリア命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリア命令より前の全命令が完了処理されるまで、前記バリア命令より後ろのメモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０１７９】
（付記７）
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記第１の実行キュー部が、前記バリア命令より後に、前記バリア命令より後ろのメモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より前の全命令が完了処理されるまで、前記バリア命令を実行せず、前記バリア命令が完了処理されるまで、前記バリア命令より後のメモリアクセス命令を実行しない、付記６に記載の演算処理装置。
【０１８０】
（付記８）
前記バリア属性が全命令対全命令の属性を有し、
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記バリア設定部は、前記全命令対全命令のバリア属性に該当するフェッチ命令を、前記該当したフェッチ命令を実行するバリア命令に変更し、
前記命令デコーダは、前記バリア命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より後ろの全命令を、前記バリア命令より前の全命令が完了処理されるまで発行しない、付記１に記載の演算処理装置。
【０１８１】
（付記９）
前記命令デコーダは、前記バリア命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリア命令より前の全命令が完了処理されるまで前記バリア命令を前記実行キュー部に発行せず、前記バリア命令が完了処理されるまで前記バリア命令より後の全命令を前記実行キュー部に発行しない、付記８に記載の演算処理装置。
【０１８２】
（付記１０）
前記命令の投機実行は、
前記バリア命令より前の前記分岐命令の分岐先が確定していない段階で前記バリア命令より後の命令を投機的に実行することと、
前記メモリアクセスを実行するバリア命令がメモリ内のアクセス禁止領域へのアクセスか否かを判定し、前記アクセス禁止領域へのアクセスと判定した場合に前記メモリアクセスを実行するバリア命令をトラップしてキャンセルする処理が、完了していない段階で、前記バリア命令より後ろの命令を投機的に実行すること、
を含む、付記１に記載の演算処理装置。
【０１８３】
（付記１１）
前記バリア属性に対応する所定の前記実行命令は、分岐命令と、メモリアクセス命令と、全命令のうち、前記バリア属性で指定されたいずれかの命令である、付記１に記載の演算処理装置。
【０１８４】
（付記１２）
バリア設定条件レジスタにバリア設定条件を設定する工程と、
バリア設定部により、フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記フェッチ命令を前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリア命令に変更し出力する工程と、
命令デコーダにより、前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリア命令を、それぞれの命令に対応する実行キュー部に割振る工程と、
前記実行命令の一種であるメモリアクセス命令を割振られる第１の実行キュー部により、プログラムの順番と異なるアウトオブオーダーで前記メモリアクセス命令を発行する工程と、
メモリアクセス制御部により、前記第１の実行キュー部が発行した前記メモリアクセス命令を実行する工程と、
前記第１の実行キュー部に前記バリア命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部とにより共同して、前記バリア命令より後のメモリアクセス命令を、前記バリア命令及び前記バリア命令より前の前記バリア属性に対応する所定の前記実行命令を追い抜いて投機実行しない工程、とを有する演算処理装置の制御方法。
【符号の説明】
【０１８５】
BA_SET：バリア設定部
BA_DET：バリア判定部
BA_FL_GEN：バリアフロー命令発生部
BA_SET_CND_REG：バリア設定条件レジスタ
I_DEC：命令デコーダ
RSA,RSE,TRSF,RSBR：リザベーションステーション
CSE：コミットスタックエントリ、完了処理部
L1_DCACHE：L1データキャッシュ
FP_QUE：フェッチポートのキュー
MEM_AC_CNT：メモリアクセス制御部
BC：バリア制御
BA_INST：バリア制御を受ける命令（バリア属性フラグ付き命令またはバリアフロー命令）、単にバリア命令
【図１】
2019197442.tif 000003
【図２】
2019197442.tif 000004
【図３】
2019197442.tif 000005
【図４】
2019197442.tif 000006
【図５】
2019197442.tif 000007
【図６】
2019197442.tif 000008
【図７】
2019197442.tif 000009
【図８】
2019197442.tif 000010
【図９】
2019197442.tif 000011
【図１０】
2019197442.tif 000012
【図１１】
2019197442.tif 000013
【図１２】
2019197442.tif 000014
【図１３】
2019197442.tif 000015
【図１４】
2019197442.tif 000016
【図１５】
2019197442.tif 000017
【図１６】
2019197442.tif 000018
【図１７】
2019197442.tif 000019
【図１８】
2019197442.tif 000020
【図１９】
2019197442.tif 000021
【図２０】
2019197442.tif 000022
【図２１】
2019197442.tif 000023
【図２２】
2019197442.tif 000024
【図２３】
2019197442.tif 000025
【図２４】
2019197442.tif 000026
【図２５】
2019197442.tif 000027
【図２６】
2019197442.tif 000028
【図２７】
2019197442.tif 000029