(57)【要約】      （修正有）【課題】プロセッサの脆弱性の原因となる投機的な実行を柔軟に抑制する演算処理装置を提供する。【解決手段】方法は、バリア設定条件が設定されるバリア設定条件レジスタと、フェッチ命令がバリア設定条件レジスタに設定されているバリア設定条件に該当するか判定し、該当する場合、フェッチ命令の後にバリアマイクロ命令を追加し、実行命令及びバリアマイクロ命令を、それぞれの命令に対応する実行キュー部に割振るバリア設定・命令デコーダと、実行命令の一種であるメモリアクセス命令とバリアマイクロ命令をアウトオブオーダーで発行・実行する第１の実行キュー部・メモリアクセス制御部とを有する。第１の実行キュー部にバリアマイクロ命令が割振られた場合、第１の実行キュー部とメモリアクセス制御部は共同し、バリアマイクロ命令より後のメモリアクセス命令はバリアマイクロ命令より前のバリア属性に対応する所定の実行命令を追い抜いて投機実行しない。【選択図】図４
2019200523.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のフローチャート図である。
【図１５】BBM属性フラグが付けられた命令の後ろにバリアマイクロ命令が追加された具体例３に対するRSAにおけるバリア制御例を示す図である。
【図１６】BBM属性フラグが付けられた命令の後ろにバリアマイクロ命令が追加された具体例３に対するRSAにおけるバリア制御例を示す図である。
【図１７】メモリアクセス制御部のフェッチポートのキューFP_QUEでの制御例を示すフローチャート図である。
【図１８】フェッチポートのキューFP_QUEの例を示す図である。
【図１９】ABM属性のバリアマイクロ命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図２０】メモリアクセス制御部のフェッチポートでのバリア制御BC5のフローチャート図である。
【図２１】具体例４についてメモリアクセス制御部のフェッチポートでのバリア制御BC5を説明する図である。
【図２２】具体例４についてメモリアクセス制御部のフェッチポートでのバリア制御BC5を説明する図である。
【図２３】バリア属性ABAのバリアマイクロ命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。
【図２４】命令デコーダにおけるバリアマイクロ命令（BA命令）とその前後の命令に対するバリア制御BC6を示すフローチャート図である。
【図２５】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【図２６】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【図２７】具体例Example_5の命令列についてバリア制御BC6を説明する図である。
【図２８】第２の実施の形態におけるプロセッサの構成例を示す図である。
【図２９】第２の実施の形態におけるバリア設定部BA_SETと命令デコーダI_DECの概略構成を示す図である。
【図３０】命令デコーダI_DECの構成例を示す図である。
【図３１】命令デコーダのプリデコーダの１つのスロットPD1とプリデコーダバッファの１つのスロットPB0とメインデコーダの１つのスロットD1の詳しい構成例を示す図である。
【図３２】命令デコーダ内のプリデコーダとプリデコーダバッファの動作を示すフローチャート図である。
【発明を実施するための形態】
【００１６】
図１は、プロセッサの脆弱性の一例を説明する図である。図１には、プロセッサCPUと、メインメモリM_MEMとが示される。また、図１には、プロセッサCPUが実行する命令列の例が示される。
【００１７】
この命令列の例は、不正なプログラムの第１の例であり、各命令の内容は以下のとおりである。
JMP C                        //分岐先Aに分岐する分岐命令//
B LOAD2 X0 [秘密値格納のアドレス] //秘密値が格納されたアドレスでロードし
レジスタX0に秘密値を格納//
A LOAD1 *[X0]                 //レジスタX0のアドレスでロードする//
上記の命令列には、不正なロード命令“B LOAD2”が追加されている。そこで、不正なプログラムは、最初にキャッシュメモリをクリアしておき（S1）、特権モード（OSモード）に遷移する（S2）。そして、プロセッサが、特権モードで、分岐命令JMPCを実行するが、分岐命令の分岐先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内に含められても良い。バリア設定については後で詳述する。
【００３１】
上記のバリア命令は、ハードウエアが処理する処理の単元であるマイクロ命令（micro operation, uop）である。命令セットアーキテクチャ（Instruction set architecture: ISA）に規定される命令のうち、単純な命令は１つのマイクロ命令に対応し分解されることなくハードウエアにより実行される。また、複雑な命令は複数のマイクロ命令に分解され複数のマイクロ命令がハードウエアにより実行される。バリア命令はマイクロ命令に対応し、分解されることなくハードウエアにより実行される。以下、バリア命令は、バリアマイクロ命令またはバリアuop（uはギリシャ文字のμの意味）と称する。
【００３２】
次に、命令デコーダで生成された実行命令は、インオーダーで、リザベーションステーションと呼ばれるキュー構造のストレージにキューインされ蓄積される。リザベーションステーションは、実行命令をキューに蓄積する実行キューであり、命令を実行する演算器毎に設けられる。リザベーションステーションは、例えば、オペランドアドレス生成器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の構成例を示す図である。バリア設定部と命令デコーダとは、合体してバリア設定・命令デコーダであってもよい。バリア設定部BA_SETは、前述のとおりフェッチ命令がバリア設定条件に該当するか否かを判定し、該当するフェッチ命令の後ろにバリアマイクロ命令を追加する。命令デコーダ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と、バリア属性を付加されたフェッチ命令の後ろにバリアマイクロ命令を追加するバリアマイクロ命令発生部BA_UOP_GENとを有する。バリア判定部とフリップフロップも、命令デコーダI_DECの４スロット構成に合わせて４スロット構成である。但し、命令デコーダが１スロット構成の場合は、バリア判定部も１スロット構成でもよい。
【００４４】
バリア判定部BA_DETは、命令バッファからインオーダーで入力されたフェッチ命令が、バリア設定条件レジスタBA_SET_CND_REGに設定されたバリア設定条件に該当するか否かを判定する。バリア設定条件レジスタに設定されるバリア設定条件は、例えば、バリア設定条件に対応する命令のオペコード、または、逆にバリア設定条件からマスクされるオペコードである。この場合、バリア判定部は、フェッチ命令がバリア設定条件に対応するオペコードと一致するか、または、フェッチ命令がマスクされているオペコードと不一致であるかを判定する。
【００４５】
さらに、バリア設定条件は、例えば、通常モード（ユーザモード）よりレベルが高い特権モードなどの例外レベル、ユーザプログラム（ユーザプロセス）を特定するコンテンツIDなどである。この場合、バリア判定部は、フェッチ命令が、例外レベルの命令か否か、コンテンツIDの命令か否かを判定する。
【００４６】
そして、バリア設定条件レジスタに設定されるバリア設定条件は、命令の実行順序の保障の種類を示す順序保障属性毎に異なる。バリア判定部は、フェッチ命令が上記のバリア判定条件に該当した場合、該当したバリア判定条件に対応する順序保障属性（またはバリア属性）を、フェッチ命令に付加する。バリア属性を付加するとは、フェッチ命令にバリア属性フラグを追加することを意味する。そして、バリア判定部は、バリア属性フラグが付加された命令をフリップフロップFF0-FF3に転送する。バリアマイクロ命令発生部は、フリップフロップFF0-FF3にラッチされたバリア属性フラグ付き命令の後ろにバリア属性に対応するバリアマイクロ命令を追加発生する。バリア判定部による判定処理については後で説明する。
【００４７】
命令の実行順序保障は、概略を言えば、順序保障属性が付加された命令の後ろに順序保障属性に対応するバリアマイクロ命令が追加され、追加されたバリアマイクロ命令が、ＲＳ（RSA）やストレージユニットSUで、順序保障属性（バリア属性）に対応した順序保障に適合する態様または順序で実行され、命令の投機的な実行を抑止される。または、命令デコーダによるインオーダーでの命令の処理に対しても、バリアマイクロ命令に対応する所定の順序保障の制約が課され、命令の投機的な実行が抑止される。
【００４８】
上記の通り、バリア判定部が、メモリバッファから入力されたインオーダーの４つのフェッチ命令が、バリア設定条件（順序保障対象の命令であるか否か）に該当するか否か判定する。４つのフェッチ命令がいずれもバリア設定条件に該当しなければ、フェッチ命令は、そのまま、命令デコーダI_DECの４つのスロットに並行して入力される。
【００４９】
また、バリア判定部で４つのフェッチ命令のいずれかがバリア設定条件に該当すれば、そのフェッチ命令にバリア属性フラグが付加される。そして、バリアマイクロ命令発生部が、バリア属性フラグが付加されたフェッチ命令の後ろにバリアマイクロ命令を発生する。
【００５０】
その結果、バリア設定部BA_SETは、命令バッファから入力された４つのフェッチ命令に加えて、バリアマイクロ命令を出力する。その場合、最初のクロックサイクルで、バリアマイクロ命令より前のフェッチ命令がフリップフロップから命令デコーダI_DECの対応するスロットに入力され、次のクロックサイクルで、バリアマイクロ命令がセレクタSLを介して命令デコーダのスロットD0に入力される。そして、更に、次のクロックサイクルで、バリアマイクロ命令より後のフェッチ命令が、命令デコーダの対応するスロットに入力される。バリアマイクロ命令は、バリア制御用のバリア命令であり、したがって、ＲＳＡなどで順序保障の制御が課される。
【００５１】
図４は、バリア設定部の動作例を示すフローチャート図である。バリア設定部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 to 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に対応する順序保障属性（バリア属性）の順序制御の制約を受ける。
【００６５】
図５は、リザベーションステーション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データキャッシュに登録される。
【００６８】
バリア属性BBM,MBM,ABMのバリアマイクロ命令は、リザベーションステーションのうちRSAにキューインされ、RSAで命令実行の順序保障に従って発行制御される。この発行制御により、RSAは、バリアマイクロ命令とそれに関連する命令をアウトオブオーダーで発行せず、バリアマイクロ命令のバリア属性の順序保障に基づく順序、インオーダー、で命令を発行する。更に、必要な場合、１次データキャッシュL1_DCACHE内のフェッチポートキューFP_QUEは、RSAから発行されたメモリアクセス命令を前のメモリアクセス命令の完了を待って次のメモリアクセス命令を実行できるようメモリアクセス命令の発行制御を行う。
【００６９】
但し、All Barrier to All（ABA）属性のバリアマイクロ命令は、命令デコーダI_DECにて、バリアマイクロ命令とその前後の命令との間でABA属性の順序保障に従う発行制御が行われる。
【００７０】
以下、４種類のバリア属性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は、バリアマイクロ命令にインターロックをかけてその発行を禁止しておき直前の分岐命令のIIDを記憶しておく。そして、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_UOPを追加し、分岐命令JMP1 Cと、バリアマイクロ命令BA_UOPと、メモリアクセス命令B LOAD2、B LOAD1を、命令デコーダI_DECに出力する。
【００７７】
図９のRSAの入力キューIN_QUEは、命令デコーダがインオーダーで発行した命令を１０個のエントリRSA0-RSA9にキューインする。入力キューIN_QUEからはアウトオブオーダーで命令が発行されるので、入力キュー内にキューインされた命令は必ずしもエントリRSA0-RSA9の順に格納されない。RSAの入力キューには、命令列のうち、バリアマイクロ命令BA_UOPと２つのロード命令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_UOPがキューインし、RSAは入力キュー内にそのエントリを作成する（図７のS21）。RSAは、バリアマイクロ命令にストレージユニットブロックフラグ（以下SUブロックフラグ）をSU_BLK_flg=1でエントリを作成する。そして、RSAは、バリアマイクロ命令BA_UOPの直前の分岐命令JMP1 Cが未完了であるので（S23のYES）、インターロックをInerlock=1に設定し直前の分岐命令のIIDを記憶し（S24）、直前の分岐命令が完了するまで発行を抑止する。前述の通り、CSEは分岐命令間ではインオーダーで完了処理を行うので、バリアマイクロ命令の直前の分岐命令が完了であることは、それより前の全ての分岐命令も完了であることを意味する。よって、バリアマイクロ命令の直前の分岐命令が完了したことを監視することで、バリアマイクロ命令より前の全分岐命令が完了したことを検出できる。尚、インターロックがInterlock=1に設定されると、レディーフラグRDY_flgは発行レディー状態ではない「０」に設定される。
【００８１】
一方、図８において、RSAは、バリアマイクロ命令BA_UOPより後のメモリアクセス命令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_UOPのエントリのインターロックの原因IIDと一致したことを検出し（S26のYES）、バリアマイクロ命令BA_FLWのインターロックをInterlock=0に解除する（S27）。その後、RSAは、バリア命令が、レディーフラグがRDY_flg=1で且つ最古の命令であることを検出し（S28のYES）、バリアマイクロ命令をL1データキャッシュのメモリアクセス制御部MEM_AC_CNTに発行する（S29）。尚、バリアマイクロ命令は一種のダミー命令であり、メモリアクセス制御部によるメモリアクセスを実行されないし、バリアマイクロ命令の完了処理によりプログラムカウンタPCが更新されることもない。
【００８３】
バリアマイクロ命令が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は、バリアマイクロ命令の前の全ての分岐命令JMP1 C(BBM)の処理完了するまで、その分岐命令より後のメモリアクセス命令を発行しない。それにより、BJMP1 Cバリアマイクロ命令より後ろのメモリアクセス命令B LOAD2,A LOAD1は、バリアマイクロ命令より前の分岐命令を追い抜いて投機実行されない。分岐命令JMP1 C(BBM)の完了処理後に、正しい分岐先のメモリアクセス命令A LOAD1が実行され、メモリアクセス命令B_LOAD2は投機実行されないので、秘密値がメモリから読み出されてL1データキャッシュに登録されることはない。
【００８５】
［具体例２：バリア属性フラグが付加された命令がメモリアクセス命令の場合］
図１１、図１２は、RSAとRSBRの入力キューの構成例を示す図である。図１１に、具体例Example_2として、図１に示した分岐命令JMP C、２つのメモリアクセス命令（ロード命令）B LOAD2、A LOAD1を有する命令列が示される。また、具体例２では、１番目のメモリアクセス命令B LOAD2がBBM属性に該当し、BBM属性フラグが付加されているので、メモリアクセス命令B LOAD2の後ろにバリアマイクロ命令BA_UOPが追加されている。この場合、バリア設定部BA_SETは、分岐命令JMP1 Cと、BBM属性フラグ付きメモリアクセス命令B LOAD2（BBM）及びバリアマイクロ命令BA_UOPと、後続のメモリアクセス命令B LOAD1を、命令デコーダI_DECに出力する。そして、命令デコーダは、分岐命令JMP1 CをRSBRに割振り、バリアマイクロ命令BA_UOPと２つのメモリアクセス命令B LOAD2（BBM）、B LOAD1をRSAに発行する。
【００８６】
RSAでのバリア制御BC1,BC2は、具体例１で説明した図７，図８に示したのと同じである。また、RSBRでの分岐命令に対する処理も具体例１と同じである。
【００８７】
バリア属性フラグ付きのメモリアクセス命令B LOAD2(BBM)の後ろに追加されたバリアマイクロ命令BA_UOPがキューインし、RSAは入力キュー内にそのエントリを作成する（図７のS21）。RSAは、バリアマイクロ命令BA_UOPに、SUブロックフラグをSU_BLK_flg=1に設定してエントリを作成する。そして、RSAは、バリアマイクロ命令の直前の分岐命令JMP1 Cが未完了であるので（S23のYES）、バリアマイクロ命令のインターロックをInerlock=1に設定し直前の分岐命令のIIDを記憶し（S24）、直前の分岐命令が完了するまでメモリアクセス命令B LOAD2(BBM)の発行を抑止する。インターロックがInterlock=1に設定されると、レディーフラグRDY_flgは発行レディー状態ではない「０」に設定される。
【００８８】
一方、図８において、RSAは、バリアマイクロ命令の後ろのメモリアクセス命令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がバリアマイクロ命令に記憶したIIDと一致したことを検出し（S26のYES）、バリアマイクロ命令のインターロックをInterlock=0に解除する（S27）。その後、RSAは、バリアマイクロ命令がレディーフラグがRDY_flg=1で且つ最古の命令であることを検出し（S28のYES）、バリアマイクロ命令をL1データキャッシュのメモリアクセス制御部MEM_AC_CNTに発行する（S29）。
【００９０】
バリアマイクロ命令がRSAから発行されると入力キューから消えるため、各RSAのエントリのオールダーフラグOlder_flgも更新され、後続のメモリアクセス命令A LOAD1のインターロックはInterlock=0に解除される（図８のS30のNO,S32）。それにより、後続のメモリアクセス命令A LOAD1のレディーフラグはRDY_flg=１となり、RSAから発行できるようになる（S33のYES,S34）。
【００９１】
以上のバリア制御により、RSAは、バリアマイクロ命令より前の分岐命令の処理完了まで、バリアマイクロ命令を発行しないし、バリアマイクロ命令が発行されるまで、そのバリアマイクロ命令より後のメモリアクセス命令A LOAD1を発行しない。それにより、RSAは、バリアマイクロ命令より前の分岐命令JMP1 C(BBM)の処理が完了するまで、バリアマイクロ命令より後のメモリアクセス命令A LOAD1を発行しない。その結果、バリアマイクロ命令より後ろのメモリアクセス命令A LOAD1は、バリアマイクロ命令のメモリアクセス命令以前の分岐命令JMP1 Cを追い抜いて投機実行されない。
【００９２】
この場合、分岐命令JMP1が分岐処理完了後に、メモリアクセス命令A_LOAD1が実行されるため、メモリアクセス命令B LOAD2は投機実行されるが、分岐予測ミスによりメモリアクセス命令B LOAD2のレジスタX0内の秘密値はクリアされる。その後、メモリアクセス命令A LOAD1が実行されてもレジスタX0内の秘密値が不明であるので、秘密値をアドレスとするキャッシュラインにデータを登録することはできない。
【００９３】
[Memory Barrier to memory access (MBM)]
図１３は、MBM属性のバリアマイクロ命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。まず、図６のBBM属性のバリアマイクロ命令と同様に、バリア設定部BA_SETが、命令バッファから入力されたフェッチ命令がMBMのバリア設定条件に該当する命令か否かを判定し、該当する場合、バリア設定条件に該当したフェッチ命令の後ろにバリアマイクロ命令を追加するバリア設定を行う（バリア制御BA0）。そして、RSAとメモリアクセス制御部MEM_AC_CNTは、バリアマイクロ命令について以下のバリア制御を行う。
【００９４】
MBM属性の場合、プロセッサが、バリアマイクロ命令より後ろのメモリアクセス命令は、このバリアマイクロ命令より前のメモリアクセス命令を追い抜いて投機実行されない、という順序保障制御を行う。
【００９５】
この順序保障制御のために、第１に、RSAは、命令デコーダI_DECから入力された実行命令にバリアマイクロ命令が含まれていると、そのバリアマイクロ命令が発行されるまで、バリアマイクロ命令の後ろのメモリアクセス命令を発行しない（BC2）。但し、バリアマイクロ命令はバリアマイクロ命令より前のメモリアクセス命令を追い越して発行されてもよい。
【００９６】
RSAがバリアマイクロ命令が発行されるまでその後ろのメモリアクセス命令を発行しない（BC2）という発行制御を行うことで、バリアマイクロ命令とその後ろのメモリアクセス命令がインオーダーでメモリアクセス制御部MA_AC_CNTのフェッチポートキューFP_QUEにキューインされる。
【００９７】
第２に、メモリアクセス制御部は、RSAから通知されたメモリアクセス命令について、プログラムの順番通りに完了処理できるフェッチポートキューで管理を行う。即ち、メモリアクセス制御部MEM_AC_CNTのフェッチポートキューFP_QUEは、（１）バリアマイクロ命令よりも前のメモリアクセス命令が全て完了処理するまで、そのバリアマイクロ命令を発行しない。また、フェッチポートキューは、（２）バリアマイクロ命令よりも後ろのメモリアクセス命令について、バリアマイクロ命令が完了処理するまで、後ろのメモリアクセス命令を発行（そして実行）しない。（１）（２）がバリア制御BC4である。
【００９８】
これにより、フェットポートは、バリアマイクロ命令と、それより後ろのメモリアクセス命令を、バリアマイクロ命令より前のメモリアクセス命令が完了処理するまで、発行（そして実行）しない。
【００９９】
上記のフェッチポートのバリア制御BC4の（１）（２）と、前述のRSAによる、「バリアマイクロ命令が発行されるまで、バリアマイクロ命令の後ろのメモリアクセス命令を発行しないというバリア制御BC2」との組み合わせにより、プロセッサは前述の順序保障制御を実現する。すなわち、順序保障制御は、「バリアマイクロ命令より後ろのメモリアクセス命令は、このバリアマイクロ命令より前のメモリアクセス命令を追い抜いて投機実行されない」という制御である。
【０１００】
尚、前述した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属性フラグが付けられた命令の後ろにバリアマイクロ命令が追加された具体例３に対するRSAにおけるバリア制御例を示す図である。図１５に示された具体例Example_3は、加算命令ADD1と、３つのメモリアクセス命令LOAD3、B LOAD2、A LOAD1と、メモリアクセス命令B LOAD2の後ろに追加されたバリアマイクロ命令BA_UOPの命令列である。この命令列が命令デコーダからRSAにインオーダーでキューインされる。RSAは、メモリアクセス命令LOAD3とB LOAD2とバリアマイクロ命令BA_UOPの間はアウトオブオーダーで、バリアマイクロ命令BA_UOPとA LOAD1との間はインオーダーでメモリアクセス制御部に発行する。
【０１０４】
図１５のRSAの入力キューIN_QUEにおいて、バリアマイクロ命令がキューインすると（S21のYES）、RSAは、バリアマイクロ命令BA_UOPにストレージユニットブロックフラグSU_BLK_flg=1でエントリを作成する。
【０１０５】
一方、RSAは、バリアマイクロ命令より後のメモリアクセス命令A LOAD1について、入力キューIN_QUE内に自分（A LOAD1）より順番が古く（順番が前で）SU_BLK_flg=1の命令があるか否か判定する（図８のS30）。図１５の例では、メモリアクセス命令A LOAD1は、自分（メモリアクセス命令A LOAD1）より順番が古くSU_BLK_flg=1であるバリアマイクロ命令BA_UOPが存在するので、この判定が真となる（S30のYES）。それにより、RSAは、メモリアクセス命令A LOAD1のインターロックをInterlock=1に設定する（S31）。Interlock=1によりレディーフラグはRDY_flg=0となり、このメモリアクセス命令A LOAD1はRSAから発行できない状態になる。
【０１０６】
次に、図１６の入力キューの状態に遷移する。図１４に示すとおり、バリアマイクロ命令は、Interlockがかかっていないので、リードアフターライトの問題などが解決できればレディーフラグRDY_flgは「１」となり、最古の命令になればRSAから発行される（図１４のS28のYES,S29）。この発行によりバリアマイクロ命令はRSAから消去され、各エントリのオールダーフラグにも反映される。その結果、メモリアクセス命令A LOAD1のインターロックは「０」に解除され（図８のS32）、レディーフラグは発行レディー状態「１」になる。その後、RSAは、メモリアクセス命令A LOAD1を発行する（図８のS34）。
【０１０７】
以上のバリア制御BC1_BとBC2により、バリアマイクロ命令とその後ろのメモリアクセス命令A LOAD1とは、RSAからインオーダーでSUアクセス制御部内のフェッチポートキューFP_QUEにキューインされる。
【０１０８】
以上のバリア制御により、RSAは、バリアマイクロ命令が発行されるまでバリアマイクロ命令より後のメモリアクセス命令を発行しない。よって、バリアマイクロ命令BA_UOPとA LOAD1とはRSAからフェッチポートキューFP_QUEにインオーダーで発行される。
【０１０９】
第２に、メモリアクセス制御部MEM_AC_CNTは、バリアマイクロ命令より前の全メモリアクセス命令と、バリアマイクロ命令と、その後ろのメモリアクセス命令に対して、インオーダーで完了処理する。
【０１１０】
図１７は、メモリアクセス制御部のフェッチポートのキュー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,BA_UOP,A LOAD1がフェッチポートキューのQue1-4にエントリを作成されている。前述のとおり、RSAは、バリアマイクロ命令BA_UOPとその後のメモリアクセス命令A LOAD1とをインオーダーで発行制御するが、バリアマイクロ命令BA_UOPより前のメモリアクセス命令LOAD3,B LOAD2との間はアウトオブオーダーで発行する場合がある。しかし、フェッチポートが、以下の制御により、バリアマイクロ命令BA_UOPとその後のメモリアクセス命令A LOAD1にインターロックをかけることで、バリアマイクロ命令BA_UOPより前のメモリアクセス命令LOAD3, B LOAD2がフェッチポートにキューインするまで発行を抑止する。
【０１１６】
即ち、図１７に示したとおり、フェッチポートキューは、バリアマイクロ命令が（S40のYES）、トップオブキューポインタTOQ_PTRにより指されていないと（S41のNO）、バリアマイクロ命令のインターロックを「１」に設定して、バリアマイクロ命令BA_UOPより前のメモリアクセス命令が全て発行されるまで発行を抑止する（S42）。
【０１１７】
同時に、フェッチポートキューは、バリアマイクロ命令より後ろのメモリアクセス命令は（S44のYES）、自分より前にバリアマイクロ命令がフェッチポートキュー内にエントリされている場合（S45のYES）、そのインターロックを「１」に設定して、バリアマイクロ命令が発行されるまで発行を抑止する。
【０１１８】
一方、フェッチポートキューは、バリアマイクロ命令BA_UOPがTOQ_PTRにより指されると（S41のYES）、バリアマイクロ命令のインターロックを「０」に解除し（S43）、バリアマイクロ命令より後のメモリアクセス命令A LOAD1のインターロックを「０」に解除する（S45,S47）。
【０１１９】
そして、フェッチポートは、TOQ_PTRからみて最も古い（最も前の）発行可能な命令を（S48のYES）、メモリアクセス制御部に発行する（S49）。
【０１２０】
フェッチポートのこれらの制御により、バリアマイクロ命令BA_UOPとその後ろのメモリアクセス命令A LOAD1は、フェッチポートにバリアマイクロ命令より前のメモリアクセス命令LOAD3がキューインされ、発行され、完了処理されて消えるまで、フェッチポート内に留まる。図１８の左側の状態は、メモリアクセス命令LOAD3がキューインされたときの状態を示している。
【０１２１】
次に、図１８の左側から時間経過後の右側では、Que3のバリアマイクロ命令の前のメモリアクセス命令LOAD3, B LOAD2が発行され完了処理されると、トップオブキューポインタTOQ_PTRがバリアマイクロ命令BA_UOPを指すようになる（S41のYES）。すると、フェッチポートキューは、バリアマイクロ命令BA_UOPのインターロックを「０」に解除する（S43）。その結果、バリアマイクロ命令はメモリアクセス制御部に発行される（S48のYES,S49）。
【０１２２】
バリアマイクロ命令が発行され、その後完了処理され、フェッチポートキューからなくなると、Que4のメモリアクセス命令A LOAD1のインターロックが「０」に解除され（S45のNO,S47）、その後、メモリアクセス命令A LOAD1はフェッチポートキューから発行され（S49）、その後完了処理される。バリアマイクロ命令より後の複数のメモリアクセス命令は、バリアマイクロ命令が完了処理された後は、アウトオブオーダーで発行され、実行される。
【０１２３】
以上のとおり、RSAでのバリア制御とメモリアクセス制御部のフェッチポートでのバリア制御により、MBM属性のバリアマイクロ命令に対する順序保障が遵守される。それにより、プロセッサは、バリアマイクロ命令より後ろのメモリアクセス命令A LOAD1が、バリアマイクロ命令より前のメモリアクセス命令LOAD3,B LOAD2が完了するまでに投機的に実行されることを防止する。
【０１２４】
上記の具体例では、メモリアクセス命令B LOAD2が完了処理されるまでその後ろのメモリアクセス命令A LOAD1は投機実行されない。そのため、メモリアクセス命令B LOAD2が特権領域へのロードを理由にトラップされ、レジスタX0のデータはクリアされる。したがって、その後メモリアクセス命令A LOAD1を実行しても秘密値をアドレスとする、L1データキャッシュ内のキャッシュラインにデータを登録できず、秘密値を知ることができない。
【０１２５】
[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がLOAD3を指していて、LOAD3のIID＝１は、メモリアクセス制御部のフェッチポート内のバリアマイクロ命令BA_UOPのIID=3と一致しない（S51のNO）。そのため、フェッチポートは、バリアマイクロ命令のインターロックを「１」に設定して発行を抑止する（S42）。これに伴い、命令A LOAD1より前にバリアマイクロ命令BA_UOPが存在するので（S45のYES）、命令A_LOAD1もインターロックが「１」に設定され発行を抑止される（S47）。
【０１４１】
次に、図２２の状態では、CSEのトップオブキューポインタCSE_TOQ_PTRがバリアマイクロ命令BA_UOPを指し、そのIID＝３は、フェッチポート内のバリアマイクロ命令BA_UOPのIID=3と一致する（S51のYES）。そのため、フェッチポートは、バリアマイクロ命令のインターロックを「０」に解除し発行可能状態にする（S43）。その後、バリアマイクロ命令が発行される（S49）。これに伴い、命令A LOAD1より前にバリアマイクロ命令BA_UOPが存在しなくなり（S45のNO）、命令A_LOAD1もインターロックが「０」に解除され（S47）、発行可能状態にされ、その後、発行される（S49）。
【０１４２】
以上のRSAとメモリアクセス制御部のフェッチポートでのバリア制御により、ABM属性のバリアマイクロ命令に対する順序保障が遵守される。それにより、バリアマイクロ命令BA_UOPの後ろのメモリアクセス命令A LOAD1が、バリアマイクロ命令BA_UOPより前の全ての命令の完了処理までに投機的に実行されることが防止される。
【０１４３】
具体例４では、メモリアクセス命令B LOAD2が完了処理されるまでメモリアクセス命令A LOAD1は実行されないことから、メモリアクセス命令B LOAD2が特権領域へのアドレスであるためトラップされ、レジスタX0の秘密値はクリアされる。したがって、その後、メモリアクセス命令A LOAD1を実行しても、秘密値をアドレスとするL1データキャッシュのキャッシュラインにデータを登録できないので、秘密値を知ることができない。
【０１４４】
[All Barrier All (ABA)]
図２３は、バリア属性ABAのバリアマイクロ命令に関するプロセッサ内での順序保障制御（バリア制御）の概略を示す図である。バリア属性ABAの場合、メモリアクセス命令に限らず全ての命令について追い越しを許さない。したがって、バリア制御BC6は、すべての命令を発行する命令デコーダで行う。
【０１４５】
更に、命令デコーダは、バリアマイクロ命令より前の全命令が完了処理済みであることと、バリアマイクロ命令が完了処理済みであることを、全命令の完了処理を行うCSEのトップオブキューポインタが指すIIDにより判定する（BC6_CSE）。
【０１４６】
これにより、プロセッサは、バリア属性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の場合、バリア設定部は、バリア設定条件に該当すると、バリア属性を付加されたフェッチ命令の後ろにバリアマイクロ命令を追加し、フェッチ命令とバリアマイクロ命令とを命令デコーダI_DECにインオーダーで出力する。
【０１５４】
図２５、図２６，図２７は、具体例Example_5の命令列についてバリア制御BC6を説明する図である。命令列のB LOAD2にバリア属性ABAが付加されている。
【０１５５】
図２５において、命令デコーダのキューに、命令列Example_5のADD1、、B LOAD2、BA_UOP、A LOAD1が入力済みである。この場合、バリアマイクロ命令BA_UOPとその後ろの命令B LOAD2のインターロックを「１」に設定する（S61）。そして、命令デコーダは、命令ADD1とB LOAD2をインオーダーでCSEと図示しないRSに発行する（S62）。また、命令デコーダは、CSE内の命令数をCSE使用カウンタCSE_USE_CTRで管理する。命令デコーダが２つの命令ADD1、B LOAD2をCSEに発行したため、このCSE使用カウンタのカウント値は「２」となる。
【０１５６】
図２６において、CSEが２つの命令ADD1とB LOAD2の完了処理を行い、トップオブキューポインタCES_TOQ_PTRがCSE2に移動している。CSEから２つの命令それぞれの完了処理報告に基づいて、命令デコーダが管理するCSE使用カウンタのカウント値は「０」になる。これにより、命令デコーダはCSEが空状態になったことを検出する（S63のYES）。その結果、命令デコーダは、バリアマイクロ命令BA_UOPのインターロックを「０」に解除し（S64）、その後バリアマイクロ命令BA_UOPをCSEと図示しないRSに発行する（S64）。この時、命令デコーダは、バリアマイクロ命令の次の命令A LOAD1のインターロックを「１」に維持する（S64）。
【０１５７】
図２７において、CSEがバリアマイクロ命令BA_UOPの完了処理を行い、CSEからバリアマイクロ命令の完了処理報告に基づいて、命令デコーダが管理するCSE使用カウンタのカウント値は「０」になる。これにより、命令デコーダはCSEが空状態になったことを検出する（S65のYES）。その結果、命令デコーダは、バリアマイクロ命令BA_UOPの後の命令A LOAD1のインターロックを「０」に解除し（S66）、後の命令A LOAD1をCSEと図示しないRSに発行する（S66）。
【０１５８】
この結果、命令デコーダは空になり、次のフェッチ命令をインオーダーで入力する。それ以後、上記と同様にバリアマイクロ命令の前の命令の発行、CSEの空状態の検出、バリアマイクロ命令の発行、CSEの空検出、バリアマイクロ命令の後の命令の発行を繰り返す。
【０１５９】
上記のバリア制御により、プロセッサは、バリア属性ABAのバリアマイクロ命令より後ろの全ての命令を、このバリアマイクロ命令以前の全ての命令を追い抜いて投機実行させない、という順序保障を遵守する。
【０１６０】
具体例５の場合、メモリアクセス命令B LOAD2が完了処理されるまでメモリアクセス命令A LOAD1は実行されないことから、メモリアクセス命令B LOAD2が特権領域へのアドレスであるためトラップされ、レジスタX0の秘密値はクリアされる。したがって、その後、メモリアクセス命令A LOAD1を実行しても、秘密値をアドレスとするL1データキャッシュのキャッシュラインにデータを登録できないので、秘密値を知ることができない。
【０１６１】
［第２の実施の形態］
図２８は、第２の実施の形態におけるプロセッサの構成例を示す図である。図２８の構成のうち図２の構成と異なるところは、命令デコーダI_DECが、プリデコーダPDECとメインデコーダMDECの２段構成を有し、更に、プリデコーダPDEC内の命令を一時的に格納するプリデコーダバッファPDEC_BUFを有することである。そして、後述するとおり、プリデコーダPDECまたはプリデコーダバッファPDEC_BUFは、マルチフロー命令を複数のマイクロ命令に分割するマルチフロー命令分割部を有する。更に、マルチフロー命令分割部は、バリア属性が付加されたフェッチ命令を、フェッチ命令とバリアマイクロ命令に分割する。
【０１６２】
プリデコーダPDECとメインデコーダMDECは、Ｎ個（Ｎは複数）のスロットを有し、以下の例ではＮ＝４，４スロット有する。プリデコーダPDECの各スロットは、分割前のマルチフロー命令またはシングル命令を入力し保持する。一方、メインデコーダMDECの各スロットは、分割後の命令（分割命令）またはシングル命令を入力し保持する。そして、プリデコーダバッファPDEC_BUFは、Ｎ−Ｋ個（Ｎ＞Ｋ）のスロットを有し、以下の例ではＮ＝４，Ｋ＝１で、３スロット有する。プリデコーダバッファPDEC_BUFの各スロットは、シングル命令または分割前のマルチフロー命令ベースでプリデコーダPD内に残っている命令を一時的に格納する。
【０１６３】
第１の実施の形態では、図３に示したとおり、バリア設定部が、フェッチ命令がバリア設定条件に該当する場合、該当したバリア設定条件に対応するバリア属性をフェッチ命令に付加し、そのフェッチ命令の後ろにバリアマイクロ命令を追加した。
【０１６４】
それに対して、第２の実施の形態では、バリア設定部がバリアマイクロ命令を追加するのではなく、命令デコーダI_DEC内のマルチフロー命令分割部が、バリア属性を付加されたフェッチ命令にバリアマイクロ命令を追加する。
【０１６５】
第２の実施の形態では、バリア属性を付加された命令全てにバリアマイクロ命令を追加することで、フロー数の増大を招く。そこで、命令デコーダI_DECをマルチスロット構成にすると共に、命令デコーダI_DECが、プリデコーダPDECとメインデコーダMDECの２段構成を有し、更に、プリデコーダPDEC内の命令を一時的に格納するプリデコーダバッファPDEC_BUFを有する。この構成を有する命令デコーダは、後述するとおり、フェッチ命令またはマルチフロー命令を分割した複数のマイクロ命令を、効率的にＲＳに発行する。したがって、バリア属性を付加された命令全てにバリアマイクロ命令を追加しても、命令デコーダの処理効率の低下を抑止できる。
【０１６６】
図２９は、第２の実施の形態におけるバリア設定部BA_SETと命令デコーダI_DECの概略構成を示す図である。図３と同様に、バリア設定部と命令デコーダは合体して、バリア設定・命令デコーダを構成してもよい。
【０１６７】
バリア設定部BA_SETは、図３と同様に、４つのスロットのバリア判定部BA_DET0-BA_DET3と、バリア判定部が参照するバリア設定条件レジスタBA_SET_CND_REGを有する。但し、バリア設定部は、バリア判定部がバリア属性を付加した命令の後ろにバリアマイクロ命令を追加する構成を有していない。
【０１６８】
一方、命令デコーダI_DECは、４スロットのプリデコーダPD0-PD3を有するプリデコーダPDECと、４スロットのメインデコーダD0-D3を有するメインデコーダMDECと、３スロットのプリデコーダバッファPB0-PB2を有するプリデコーダバッファPDEC_BUFとを有する。プリデコーダPD0-PD3内のフェッチ命令は、セレクタSL0-SL3を介してメインデコーダD0-D3にシフトする。但し、シフトできなかったプリデコーダPD1-PD3内のフェッチ命令は、プリデコーダバッファPB0-PB2を経由し、セレクタSL0-SL3を介してメインデコーダD0-D3にシフトする。その間、４つの新たなフェッチ命令がプリデコーダPD0-PD3にラッチされる。
【０１６９】
尚、図２９では、プリデコーダPD0からメインデコーダD0-D3へ向かう経路線と、プリでコードバッファPDEC_BUFからメインデコーダD0-D3へ向かう経路線は、一部省略されている。以下の図３０にそれらの経路線が明示されている。
【０１７０】
図３０は、命令デコーダI_DECの構成例を示す図である。プリデコーダPDECは、命令バッファI_BUFから供給されるインオーダーの４つのフェッチ命令を同時にエントリまたは入力する４つのスロットPD0〜PD3を有する。フェッチ命令をエントリする制御信号は、クロックCLKと第１のイネーブル信号EN1の論理積信号である。
【０１７１】
メインデコーダMDECは、原則として、プリデコーダPDECの４スロット内の４つの命令を同時にエントリする４つのスロットD0〜D3を有する。プリデコーダのいずれかのスロットがマルチフロー命令の分割命令またはバリア属性を付加された命令のバリアマイクロ命令を発行する場合は、プリデコーダ内の４つのスロットPD0-PD3の順にスロット内の分割命令、バリアマイクロ命令またはシングル命令を詰められるだけメインデコーダ内の４つのスロットD0-D3にエントリする。命令をエントリする制御信号は、クロックCLKである。但し、リザベーションステーション内のキューに空きがない場合は、４つのスロットD0-D3の命令はリザベーションステーションに移動せず、パイプラインクロックがディセーブルされ、命令デコーダI_DECの状態が保持される。以下の説明では、リザベーションステーション内のキューには常に空きがあると仮定する。
【０１７２】
そして、プリデコーダバッファPDEC_BUFは、プリデコーダPDEC内の２番目から４番目のスロットPD1,PD2,PD3に残っているフェッチ命令（マルチフロー命令、バリア属性付き命令またはシングル命令）を同時にエントリし一時的に格納する３つのスロットPB0〜PB2を有する。エントリする制御信号は、クロックCLKと第２のイネーブル信号EN2である。
【０１７３】
さらに、メインデコーダMDECの各スロットD0-D3の入力側には、それぞれセレクタSL0〜SL3が設けられる。これにより、プリデコーダバッファの３スロットPB0〜PB2とプリデコーダの４スロットPD0〜PD3内の分割命令、バリアマイクロ命令またはシングル命令が、PB0〜PB2、PD0〜PD3の順に、４命令ずつ、メインデコーダMDECの４スロットD0〜D3にエントリされる。
【０１７４】
プリデコーダ・プリバッファ制御部PD/PB_CNTは、第１のイネーブル信号EN１と、第２のイネーブル信号EN2と、４つのセレクタSL0-SL3それぞれのセレクト信号SLCT0−SLCT3を生成する。
【０１７５】
第１のイネーブル信号EN1は、プリデコーダPDEC内の第１スロットPD0が空になる場合にアクティブ「１」になる。第１のイネーブル信号EN1がアクティブ「１」になると、クロックCLKに応答して、４つのスロットPD0-PD3が新たな４つのフェッチ命令を入力する。
【０１７６】
第２のイネーブル信号EN2は、プリデコーダバッファPB0-PB2と少なくともプリデコーダの第１スロットPD0が空になる場合にアクティブ「１」になる。第２のイネーブル信号EN2がアクティブ「１」になると、クロックCLKに応答して、プリデコーダバッファ内の３つのスロットPB0-PB2が、３つのスロットPD1-PD3内に残っているマルチフロー命令、バリア属性付き命令またはシングル命令を入力する。
【０１７７】
そして、プリデコーダ・プリバッファ制御部PD/PB_CNTは、プリデコーダバッファの３スロットPB0〜PB2とプリデコーダの４スロットPD0〜PD3から分割命令、バリアマイクロ命令またはシングル命令が、PB0〜PB2、PD0〜PD3の順に（インオーダーに）、４命令ずつ、メインデコーダMDECの４スロットD0〜D3にエントリされるように、４つのセレクト信号SLCT0-SLCT3を生成する。
【０１７８】
図３１は、命令デコーダのプリデコーダの１つのスロットPD1とプリデコーダバッファの１つのスロットPB0とメインデコーダの１つのスロットD1の詳しい構成例を示す図である。プリデコーダPDEC内の例えばスロットPD1は、命令バッファからフェッチ命令を入力する入力ラッチIN_FFを有する。命令バッファからのフェッチ命令は、マルチフロー命令MIとシングル命令SIとバリア属性付き命令の３種類である。
【０１７９】
さらに、スロットPD1は、マルチフロー命令を解析してフロー数（分割数）を検出するマルチフロー命令解析部MI_ANLと、分析結果に基づいてマルチフロー命令を分割して複数のフロー（分割命令）DIV_INSTsを生成し、更に、バリア属性付き命令にバリアマイクロ命令を追加するマルチフロー命令分割・バリアマイクロ命令追加部MI_DIVとを有する。他のスロットPD0,PD2,PD3も同様の構成である。
【０１８０】
プリデコーダバッファPDEC_BUFのスロットPB0は、プリデコーダのスロットPD1からシングル命令SI、マルチフロー命令MI、バリア属性付き命令とその解析情報及び残りフロー数を供給される入力ラッチIN_FFを有する。さらに、スロットPB0は、マルチフロー命令と残りフロー数に基づいてマルチフロー命令を分割して複数のフロー（複数の分割命令、複数のマイクロ命令）DIV_INSTsを生成し、更に、バリア属性付き命令にバリアマイクロ命令BA_UOPを追加するマルチフロー命令分割部MI_DIVを有する。他のスロットPB0,PD2も同様の構成である。
【０１８１】
一方、メインデコーダの１つのスロットD1は、プリデコーダPDECまたはプリデコーダバッファPDEC_BUFから分割命令DIV_INSTs、シングル命令SI、バリアマイクロ命令BA_UOPを供給される入力ラッチIN_FFを有する。さらに、スロットD1は、分割命令、シングル命令、バリアマイクロ命令BA_UOPをデコードして実行形式の命令（実行命令）EX_INSTを生成する実行命令生成部EX_INST_GENと、実行命令EX_INSTを発行する実行命令発行部EX_INST_ISSとを有する。
【０１８２】
尚、命令デコーダに入力されるフェッチ命令は命令のオペコードである。それに対して、命令デコーダで生成される実行命令は、フェッチされた命令のオペコードを実行可能にするためのデコード結果を含んだ命令である。例えば、どのリザベーションステーションを使用するか、どの演算器を使用するか、オペランドにどのデータを使用するかなど、演算に必要な情報を含む命令である。実行命令生成部EX_INST_GENは、フェッチされた命令オペコードをデコードし、演算実行に必要な情報を得て実行命令を生成する。
【０１８３】
図３１に示されるとおり、プリデコーダPDEC内のスロットPD0は、命令をメインデコーダMDEC内の４つのスロットD0-D3に出力でき、スロットPD1は命令を３つのスロットD1-D3に出力でき、スロットPD2は命令を２つのスロットD2,D3に出力でき、スロットPD3は命令をスロットD3に出力できる。一方、プリデコーダバッファPDEC_BUFの３つのスロットPB0-PB2は、命令をメインデコーダの４つのスロットD0-D3のいずれにも出力できる。
【０１８４】
このような構成により、プリデコーダPDECの４スロットPD0-PD3に供給された４つのシングル命令は、プリバッファPB0-PB2に命令がなければ、メインデコーダMDECの４つのスロットD0-D3に同時に送信される。一方、プリデコーダPDECの先頭スロットPD0にマルチフロー命令が供給された場合、マルチフロー命令を分割して生成された複数の分割命令は、メインデコーダMDECの４つのスロットD0-D3にインオーダーで送信される。更に、スロットPD0にバリア属性付き命令が供給された場合、バリア属性付き命令とその後ろに追加されたバリアマイクロ命令は、メインデコーダのスロットD0,D1にインオーダーで送信される。また、プリデコーダの３つのスロットPD1-PD3の分割命令、シングル命令、バリア属性付き命令は、先頭スロットPD0の分割命令、シングル命令、バリアマイクロ命令がメインデコーダの先頭スロットD0に送信されるとき一緒に、３つのスロットD1-D3のいずれか送信される。更に、プリデコーダバッファPDEC_BUFの３つのスロットPB0-PB2のシングル命令、マルチフロー命令の分割命令、バリアマイクロ命令は、メインデコーダのいずれのスロットD0-D3にも送信可能である。
【０１８５】
図３２は、命令デコーダ内のプリデコーダとプリデコーダバッファの動作を示すフローチャート図である。まず、命令デコーダI_DECがフェッチ命令の処理をスタートするとき、プリデコーダPDECとプリデコーダバッファPDEC_BUFの各スロットには命令が入っていない状態である。
【０１８６】
そこで、命令バッファI_BUFからプリバッファの４つのスロットPD0-PD3にシングル命令SI、マルチフロー命令MIまたはバリア属性付き命令がインオーダーでPD0からPD3の順に供給され、各スロットPD0-PD3内の入力ラッチIN_FFがラッチする（S1）。
【０１８７】
次に、４つのスロットが、マルチフロー命令を供給された場合、各スロットの命令解析部MI_ANLがそれぞれのマルチフロー命令を解析し、フロー数（分割命令数）を検出する（S2）。同様に、４つのスロットが、バリア属性付き命令を供給された場合、各スロットの命令解析部MI_ANLがそれぞれのバリア属性マルチフロー命令を解析し、フロー数（バリアマイクロ命令数）を検出する（S2）。さらに、各スロットの命令分割・バリアマイクロ命令追加部MI_DIVが、それぞれのマルチフロー命令を分割して分割命令DIV_INSTsを生成する（S2）。同様に、それぞれのバリア属性命令の後ろにバリアマイクロ命令を追加生成する（S2）。
【０１８８】
そして、命令デコーダは、プリデコーダバッファPDEC_BUF内の３つのスロットPB0-PB2と、プリデコーダPDEC内の４つのスロットPD0-PD3内のシングル命令SI、分割命令DIV_INSTs、またはバリアマイクロ命令BA_UOPを、PB0-PB2,PD0-PD3の順に、分割後フロー数ベース（シングル命令SIと分割命令DIV_INSTsとバリアマイクロ命令の数）で、メインデコーダMDEC内の４つのスロットD0-D3に入るだけ格納する（S3）。４つのスロットPD0-PD3内の分割命令の数の合計まで、メインデコーダの４つのスロットD0-D3に移行できるだけ移行する。
【０１８９】
命令デコーダは、プリデコーダバッファとプリデコーダ内のスロットPB0-PB2,PD0-PD3内の全てのフロー（シングル命令SI、分割命令DIV_INSTs及びバリアマイクロ命令）を、メインデコーダ内のスロットD0-D3に移動できた場合（S4のYES）、命令バッファI_BUFから新たな４つのフェッチ命令をプリデコーダの４つのスロットPD0-PD3に入力する（S1）。
【０１９０】
初回は、スロットPB0-PB2内に命令は格納されていないので、S4の判定は、４つのスロットPD0-PD3内の全てのフローをメインデコーダ内のスロットD0-D3に移動できたか否かの判断になる。初回の場合、４つのスロットPD0-PD3内に４つのシングル命令SIが入力された場合、全ての命令がメインデコーダの４つのスロットD0-D3に移動できる。４つのスロットPD0-PD3のいずれかにマルチフロー命令やバリア属性付き命令が入力された場合、分割後のフロー数ベースで５個以上になるので、S4の判定はNOになる。尚、フロー数とは、マイクロ命令の数であり、具体的には、シングル命令の数、分割命令の数、バリアマイクロ命令の数である。
【０１９１】
スロットPB0-PB2,PD0-PD3内の全てのフローをメインデコーダ内のスロットD0-D3に移動できなかった場合（S4のNO）、少なくともスロットPB0-PB2とPD0内の全てのフロー（SIまたはDIV_INSTs）を、メインデコーダの４つのスロットD0−D3に移動できなかった場合（S5のNO）、再度、工程S3,S4,を繰り返す。
【０１９２】
一方、スロットPB0-PB2,PD0-PD3内の全てのフローをメインデコーダ内の４スロットに移動できなかった場合でも（S4のNO）、少なくともスロットPB0-PB2とPD0内の全てのフロー（SIまたはDIV_INSTs）を、メインデコーダの４つのスロットD0−D3に移動できれば（S5のYES）、プリデコーダの３つのスロットPD1,PD2,PD3は、メインバッファのD0-D3に移動できなかった残された命令を、プリデコーダバッファPDEC_BUFの３つのスロットPB0-PB2に、PB0,PB1,PB2の順に移動する（S6）。メインバッファのD0-D3に移動できなかった残された命令は、シングル命令SI、マルチフロー命令MIまたはバリア属性付き命令であり、マルチフロー命令MIまたはバリア属性付き命令に付随して残りのフロー数とMI解析情報も移動される。
【０１９３】
そして、最初の工程S1に戻り、プリデコーダPDECの４つのスロットPD0-PD3は、命令バッファI_BUFから新たな４つのフェッチ命令をインオーダーで入力する（S1）。
【０１９４】
上記のとおり、プリデコーダPDECの４つのスロットPD0-PD3には４つのフェッチ命令（シングル命令SI、マルチフロー命令MIまたはバリア属性付き命令）が同時に入力される。そして、プリデコーダのスロットPD0-PD3でマルチフロー命令が分割されまたはバリア属性付き命令にバリアマイクロ命令が追加され、プリデコーダのスロットPD0-PD3からメインデコーダのスロットD0-D3にシングル命令SI、分割命令DIV_ISNTsまたはバリアマイクロ命令が移動する。少なくともプリデコーダの先頭スロットPD0内の命令が全てメインデコーダに移動されれば、プリデコーダ内に残っているフェッチ命令が一旦プリデコーダバッファの３つのスロットPB0-PB2に移動され、同時に、新たな４つのフェッチ命令が命令バッファI_BUFから入力される。その後は、プリデコーダバッファの３つのスロットPB0-PB2とプリデコーダの４つのスロットPD0-PD3内のシングル命令または分割命令が、４フロー（４命令）ずつメインデコーダの４つのスロットD0-D3に移動する。
【０１９５】
図３２のとおり、命令デコーダI_DECをマルチフロー命令の解析と分割を行うプリデコーダPDECと、シングル命令、分割命令またはバリアマイクロ命令をデコードして実行命令を生成するメインデコーダMDECとで構成する。そして、マルチフロー命令が複数の分割命令に分割されまたはバリア属性付き命令にバリアマイクロ命令が追加されてプリデコーダ内の命令を全てメインデコーダに移動できない場合は、少なくともプリデコーダ内の先頭スロットPD0の命令が空になると、プリデコーダPD1-PD3内の残った命令を一旦プリデコーダバッファの３つのスロットPB0-PB2に移動し、プリデコーダの４つのスロットに新たに４つのフェッチ命令を入力する。このような構成にすることで、フェッチ命令にマルチフロー命令またはバリア属性付き命令が挿入されても、命令デコーダが毎サイクル４つの実行命令を発行するので、命令デコーダI_DECのスループットの低下を抑制できる。
【０１９６】
［バリア設定条件レジスタへの設定例］
本実施の形態では、最初に図１などで説明したメモリアクセス命令が投機的に実行されることを防止するために、バリア設定条件レジスタにバリア設定条件を設定する。例えば、図１で示した例のように、分岐命令が分岐確定する前に分岐予測先のメモリアクセス命令が投機的に実行されることを防止したい場合、バリア設定条件レジスタには、バリア設定条件として特権モードでの分岐命令にバリア属性BBMが付加されるよう設定する。また、図１の第１の例の後に説明した第２の命令列において２つのロード命令が投機的に実行されることを防止したい場合、バリア設定条件レジスタには、バリア設定条件として特権モードでのメモリアクセス命令にバリア属性MBMが付加されるよう設定する。上記以外のある命令の投機的実行を防止したい場合、バリア設定条件として特権モードでのある命令にバリア属性ABMまたはABAが付加されるように設定する。
【０１９７】
プロセッサのセキュリティの脆弱性はユーザに応じて異なるので、それぞれのユーザが必要なバリア属性を選択して、バリア設定条件を設定するようにするのが望ましい。
【０１９８】
いずれの場合も、例えば、ユーザがアプリケーションを実行する初期化処理で、バリア設定条件レジスタに望ましいバリア設定条件を設定したり、アプリケーションのあるタイミングでバリア条件レジスタにバリア設定条件を設定したりする。
【０１９９】
以上の通り、本実施の形態によれば、ユーザのプロセッサのセキュリティの脆弱性の原因に対応して、バリア設定レジスタにバリア設定条件を設定することで、ＲＳＡ、メモリアクセス制御部、メモリデコーダで、命令実行の順序保障を実現するバリア制御を行う。これにより、プロセッサのある命令の投機実行を防止することができる。
【０２００】
以上の実施の形態をまとめると，次の付記のとおりである。
【０２０１】
（付記１）
バリア設定条件が設定されるバリア設定条件レジスタと、
フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記該当したフェッチ命令の後ろに前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリアマイクロ命令を追加し、前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリアマイクロ命令を、それぞれの命令に対応する実行キュー部に割振るバリア設定・命令デコーダと、
前記実行命令の一種であるメモリアクセス命令と前記バリアマイクロ命令を割振られ、プログラムの順番と異なるアウトオブオーダーで前記メモリアクセス命令と前記バリアマイクロ命令を発行する第１の実行キュー部と、
前記第１の実行キュー部が発行した前記メモリアクセス命令と前記バリアマイクロ命令を実行するメモリアクセス制御部とを有し、
前記第１の実行キュー部に前記バリアマイクロ命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリアマイクロ命令より後のメモリアクセス命令を、前記バリアマイクロ命令より前の前記バリア属性に対応する所定の実行命令を追い抜いて投機実行しない、演算処理装置。
【０２０２】
（付記２）
前記バリア属性が分岐命令対メモリアクセス命令の属性を有し、
前記バリア設定・命令デコーダは、前記分岐命令対メモリアクセス命令のバリア属性に該当するフェッチ命令の後ろに前記バリアマイクロ命令を追加し、メモリアクセス命令と前記バリアマイクロ命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリアマイクロ命令より前の分岐命令が完了処理されるまで、前記バリアマイクロ命令より後ろの前記メモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０２０３】
（付記３）
前記第１の実行キュー部が、前記バリアマイクロ命令より前の分岐命令が完了処理されるまで、前記バリアマイクロ命令より後ろの前記メモリアクセス命令を前記メモリアクセス制御部に発行しない、付記２に記載の演算処理装置。
【０２０４】
（付記４）
前記バリア属性がメモリアクセス命令対メモリアクセス命令の属性を有し、
前記バリア設定・命令デコーダは、前記メモリアクセス命令対メモリアクセス命令のバリア属性に該当するフェッチ命令の後ろに前記バリアマイクロ命令を追加し、メモリアクセス命令と前記バリアマイクロ命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリアマイクロ命令より前の前記メモリアクセス命令が完了処理されるまで、前記バリアマイクロ命令より後ろのメモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０２０５】
（付記５）
前記第１の実行キュー部が、前記バリアマイクロ命令より後に、前記バリアマイクロ命令より後ろの前記メモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記バリアマイクロ命令より前の前記メモリアクセス命令が完了処理されるまで、前記バリアマイクロ命令を実行せず、前記バリアマイクロ命令が完了処理されるまで、前記バリアマイクロ命令より後の前記メモリアクセス命令を実行する、付記４に記載の演算処理装置。
【０２０６】
（付記６）
前記バリア属性が全命令対メモリアクセス命令の属性を有し、
前記バリア設定・命令デコーダは、前記全命令対メモリアクセス命令のバリア属性に該当するフェッチ命令の後ろに前記バリアマイクロ命令を追加し、メモリアクセス命令と前記バリアマイクロ命令を、前記第１の実行キュー部に割振りし、
前記第１の実行キュー部と前記メモリアクセス制御部は共同して、前記バリアマイクロ命令より前の全命令が完了処理されるまで、前記バリアマイクロ命令より後ろの前記メモリアクセス命令を実行しない、付記１に記載の演算処理装置。
【０２０７】
（付記７）
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記第１の実行キュー部が、前記バリアマイクロ命令より後に、前記バリアマイクロ命令より後ろの前記メモリアクセス命令を前記メモリアクセス制御部に発行し、
前記メモリアクセス制御部が、前記完了処理部からの完了処理報告に基づいて、前記バリアマイクロ命令より前の全命令が完了処理されるまで、前記バリアマイクロ命令を実行せず、前記バリアマイクロ命令が完了処理されるまで、前記バリアマイクロ命令より後の前記メモリアクセス命令を実行しない、付記６に記載の演算処理装置。
【０２０８】
（付記８）
前記バリア属性が全命令対全命令の属性を有し、
更に、前記命令デコーダがインオーダーで発行する命令を割振られ、前記命令をインオーダーで完了処理する完了処理部を有し、
前記バリア設定・命令デコーダは、前記全命令対全命令のバリア属性に該当するフェッチ命令の後ろに前記バリアマイクロ命令を追加し、前記バリアマイクロ命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリアマイクロ命令より後ろの全命令を、前記バリアマイクロ命令より前の全命令が完了処理されるまで発行しない、付記１に記載の演算処理装置。
【０２０９】
（付記９）
前記バリア設定・命令デコーダは、前記バリアマイクロ命令を入力した場合、前記完了処理部からの完了処理報告に基づいて、前記バリアマイクロ命令より前の全命令が完了処理されるまで前記バリアマイクロ命令を前記実行キュー部に発行せず、前記バリアマイクロ命令が完了処理されるまで前記バリアマイクロ命令より後の全命令を前記実行キュー部に発行しない、付記８に記載の演算処理装置。
【０２１０】
（付記１０）
前記バリア設定・命令デコーダは、前記フェッチ命令がマルチフロー命令の場合に前記マルチフロー命令を複数のマイクロ命令に分割する命令分割部を有し、
前記命令分割部が、前記バリア設定条件に該当するフェッチ命令の後ろに前記バリアマイクロ命令を追加する、付記１に記載の演算処理装置。
【０２１１】
（付記１１）
前記命令の投機実行は、
前記バリアマイクロ命令より前の前記分岐命令の分岐先が確定していない段階で前記バリアマイクロ命令より後のメモリアクセス命令を投機的に実行することと、
前記メモリアクセス命令がメモリ内のアクセス禁止領域へのアクセスか否かを判定し、前記アクセス禁止領域へのアクセスと判定した場合に前記メモリアクセス命令をトラップしてキャンセルする処理が、完了していない段階で、前記バリアマイクロ命令より後ろのメモリアクセス命令を投機的に実行すること、
を含む、付記１に記載の演算処理装置。
【０２１２】
（付記１２）
前記バリア属性に対応する所定の前記実行命令は、分岐命令と、メモリアクセス命令と、全命令のうち、前記バリア属性で指定されたいずれかの命令である、付記１に記載の演算処理装置。
【０２１３】
（付記１３）
バリア設定条件レジスタにバリア設定条件を設定する工程と、
バリア設定・命令デコーダにより、フェッチ命令が前記バリア設定条件レジスタに設定されている前記バリア設定条件に該当するか否か判定し、該当する場合、前記該当したフェッチ命令の後ろに前記該当したバリア設定条件に対応するバリア属性のバリア制御を受けるバリアマイクロ命令を追加し、前記フェッチ命令をデコードして実行命令を生成し、前記実行命令及び前記バリアマイクロ命令を、それぞれの命令に対応する実行キュー部に割振る工程と、
前記実行命令の一種であるメモリアクセス命令と前記バリアマイクロ命令を割振られる第１の実行キュー部により、プログラムの順番と異なるアウトオブオーダーで前記メモリアクセス命令を発行する工程と、
メモリアクセス制御部により、前記第１の実行キュー部が発行した前記メモリアクセス命令と前記バリアマイクロ命令を実行する工程と、
前記第１の実行キュー部に前記バリアマイクロ命令が割振られた場合、前記第１の実行キュー部と前記メモリアクセス制御部とにより共同して、前記バリアマイクロ命令より後の前記メモリアクセス命令を、前記バリアマイクロ命令より前の前記バリア属性に対応する所定の前記実行命令を追い抜いて投機実行しない工程、とを有する演算処理装置の制御方法。
【符号の説明】
【０２１４】
BA_SET：バリア設定部
BA_DET：バリア判定部
BA_uop_GEN：バリアマイクロ命令発生部
BA_SET_CND_REG：バリア設定条件レジスタ
I_DEC：命令デコーダ
RSA,RSE,TRSF,RSBR：リザベーションステーション
CSE：コミットスタックエントリ、完了処理部
L1_DCACHE：L1データキャッシュ
FP_QUE：フェッチポートのキュー
MEM_AC_CNT：メモリアクセス制御部
BC：バリア制御
BA_UOP：バリアマイクロ命令
【図１】
2019200523.tif 000003
【図２】
2019200523.tif 000004
【図３】
2019200523.tif 000005
【図４】
2019200523.tif 000006
【図５】
2019200523.tif 000007
【図６】
2019200523.tif 000008
【図７】
2019200523.tif 000009
【図８】
2019200523.tif 000010
【図９】
2019200523.tif 000011
【図１０】
2019200523.tif 000012
【図１１】
2019200523.tif 000013
【図１２】
2019200523.tif 000014
【図１３】
2019200523.tif 000015
【図１４】
2019200523.tif 000016
【図１５】
2019200523.tif 000017
【図１６】
2019200523.tif 000018
【図１７】
2019200523.tif 000019
【図１８】
2019200523.tif 000020
【図１９】
2019200523.tif 000021
【図２０】
2019200523.tif 000022
【図２１】
2019200523.tif 000023
【図２２】
2019200523.tif 000024
【図２３】
2019200523.tif 000025
【図２４】
2019200523.tif 000026
【図２５】
2019200523.tif 000027
【図２６】
2019200523.tif 000028
【図２７】
2019200523.tif 000029
【図２８】
2019200523.tif 000030
【図２９】
2019200523.tif 000031
【図３０】
2019200523.tif 000032
【図３１】
2019200523.tif 000033
【図３２】
2019200523.tif 000034