(57)【要約】      （修正有）【課題】プロセッサの性能低下を回避しつつ、プロセッサのセキュリティの強化を図る。【解決手段】キャッシュ制御部は、（１）命令発行部から発行された、投機的実行を示す投機アクセスフラグと分岐命令の識別子が付加された投機的第１のメモリアクセス命令に応答して、メモリアクセス要求を発行したとき、メモリアクセス要求により取得したデータをキャッシュデータメモリに登録し、付加された投機アクセスフラグに基づいて、投機的メモリアクセス命令の実行によりキャッシュ登録されたことを示す仮登録状態の仮登録情報をキャッシュタグに登録し、（２）投機的第１のメモリアクセス命令の後に発行され、投機的第１のメモリアクセス命令と同じアドレス宛の第２のメモリアクセス命令に応答して、キャッシュタグ内のキャッシュヒットしたエントリの仮登録情報が仮登録状態の場合、投機エントリキャッシュミスと判定してメモリアクセス要求を発行する。【選択図】図６
2019212129.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>
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、分岐命令の分岐条件が確定する前に、プログラム内に不正に追加されたロード命令が投機的に実行され、プロテクトされているメモリ領域内の秘密の値が読み出されるリスクがある。そして、その後、秘密の値をアドレスとしてロード命令が投機的に実行されてしまうことが考えられる。
【０００８】
上記の場合、最初にキャッシュメモリをフラッシュしておくと、２番目の秘密の値をアドレスとするロード命令の実行により、キャッシュメモリ内の秘密の値をアドレスとするキャッシュラインにメモリから読み出されたデータが登録され、他のキャッシュラインはデータ未登録のままになる。そして、分岐命令の分岐条件が確定した後に、アドレスをスキャンしながらロード命令を実行しそれぞれのレイテンシを測定すると、秘密の値をアドレスとするロード命令のレイテンシが他のアドレスより短くなる。その結果、秘密の値を不正に獲得できる。
【０００９】
上記のようなプロセッサの脆弱性を回避するためには、例えば、分岐命令の分岐先未確定中に投機的に実行されるメモリアクセス命令（ロード命令）を抑止することが考えられる。
【００１０】
しかし、分岐先未確定中に分岐予測先のメモリアクセス命令の投機的実行を抑止すると、分岐確定まで長い時間を要する場合、不正ではないメモリアクセス命令の投機実行も抑止され、プロセッサの著しい性能低下を招く。
【００１１】
そこで，本実施の形態の第1の側面の目的は，プロセッサの性能低下を回避し、しかし、プロセッサのセキュリティの強化を図る演算処理装置及び演算処理装置の制御方法を提供することにある。
【課題を解決するための手段】
【００１２】
本実施の形態の第１の側面は，命令を発行する命令発行部と、複数のキャッシュエントリを有するキャッシュデータメモリ及びキャッシュタグと、前記命令発行部から発行されたメモリアクセス命令に応答して、前記メモリアクセス命令のアドレスに基づくキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合にメモリ側にメモリアクセス要求を発行するキャッシュ制御部とを有する、キャッシュユニットとを有し、
前記キャッシュ制御部は、（１）前記命令発行部から発行された、投機的実行を示す投機アクセスフラグと分岐命令の識別子が付加された投機的第１のメモリアクセス命令に応答して、前記メモリアクセス要求を発行したとき、前記メモリアクセス要求により取得したデータを前記キャッシュデータメモリに登録し、前記投機的第１のメモリアクセス命令に付加された前記投機アクセスフラグの投機的実行に基づいて、投機的メモリアクセス命令の実行によりキャッシュ登録されたことを示す仮登録状態の仮登録情報を前記キャッシュタグに登録し、（２）前記投機的第１のメモリアクセス命令の後に発行され、前記投機的第１のメモリアクセス命令と同じアドレス宛の第２のメモリアクセス命令に応答して、前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合、投機エントリキャッシュミスと判定して前記メモリアクセス要求を発行する、演算処理装置である。
【発明の効果】
【００１３】
第１の側面によれば，プロセッサの性能低下を回避しつつ、プロセッサのセキュリティの強化を図ることができる。
【図面の簡単な説明】
【００１４】
【図１】プロセッサの脆弱性の一例を説明する図である。
【図２】本実施の形態のプロセッサを搭載する情報処理装置の概略図である。
【図３】本実施の形態におけるプロセッサの構成例を示す図である。
【図４】命令発行部とL1キャッシュ制御部とL2キャッシュ制御部の概略構成例を示す図である。
【図５】本実施の形態における命令デコーダの構成例を示す図である。
【図６】本実施の形態におけるシングルコアの場合のL1、L2キャッシュ制御部の構成を示す図である。
【図７】命令発行部がL1キャッシュ制御部に発行する命令について説明する図である。
【図８】L1キャッシュ制御部の動作を示すフローチャート図である。
【図９】投機エントリヒット判定部の論理回路の第１の例を示す図である。
【図１０】制御１の動作を示すシーケンスチャートの図である。
【図１１】制御２の動作を示すシーケンスチャートの図である。
【図１２】制御３の動作を示すシーケンスチャートの図である。
【図１３】L1キャッシュ制御部の制御４のフローチャート図である。
【図１４】L1キャッシュ制御部の制御４のシーケンスチャート図である。
【図１５】シングルコアの場合における投機エントリヒット判定部の第２の例である。
【図１６】マルチコアの場合のL1、L2キャッシュ制御部の構成を示す図である。
【図１７】マルチコアの場合のL2キャッシュでのL2キャッシュヒット判定と、投機エントリキャッシュヒット判定のフローチャート図である。
【図１８】コア１から投機実行されるメモリアクセス命令によりデータ登録要求が発行された場合の種々のL2キャッシュタグの状態での、投機エントリキャッシュヒット判定を示す図である。
【図１９】マルチコアの場合のL1,L2キャッシュでの処理例Ａのシーケンスを示す図である。
【図２０】マルチコアの場合のL1,L2キャッシュでの処理例Ｂのシーケンスを示す図である。
【図２１】マルチコアの場合のL1,L2キャッシュでの処理例Ｃ−１のシーケンスを示す図である。
【図２２】マルチコアの場合のL1,L2キャッシュでの処理例Ｃ−２のシーケンスを示す図である。
【図２３】マルチコアの場合のL1,L2キャッシュでの処理例Ｄのシーケンスを示す図である。
【図２４】マルチコアの場合における分岐確定処理のフローチャート図である。
【発明を実施するための形態】
【００１５】
図１は、プロセッサの脆弱性の一例を説明する図である。図１には、プロセッサCPUと、メインメモリM_MEMとが示される。また、図１には、プロセッサCPUが実行する命令列の例が示される。
【００１６】
この命令列の例は、不正なプログラムの一つの例であり、各命令の内容は以下のとおりである。
JMP C                        //分岐先Cに分岐する分岐命令//
B LOAD1 R0 [秘密値格納のアドレス] //秘密値が格納されたアドレスでロードし
レジスタR0に秘密値を格納//
A LOAD2 *[100+R0]                 //レジスタR0内のアドレス（秘密値）でロードする//
上記の命令列には、不正なロード命令“LOAD1”“LOAD2”が追加されている。不正なプログラムは、最初にキャッシュメモリをクリアしておき（S1）、特権モード（OSモード）に遷移する。そして、プロセッサが、特権モードで、分岐命令JMP Cを実行するが、分岐命令の分岐先Cが確定する前に、分岐予測先Bのロード命令LOAD1を投機的に実行（投機実行）する（S2）。この分岐予測先Bは分岐予測情報として不正に登録されていて、分岐命令の正しい分岐先はCであるとする。
【００１７】
プロセッサが、この誤った分岐予測先Bのロード命令LOAD1を投機的に実行すると（S2）、特権モードでしかアクセスが許可されていないプロテクトされたメモリ領域M0内の秘密値Xを読み出し、レジスタR0に格納する。更に、秘密値Xをアクセス許可領域M1の先頭アドレス「100」に加算し（S3）、次のロード命令A LOAD2を投機的に実行すると、先頭アドレス[100]にレジスタR0内の秘密値Xを加算したアドレス100+Xに対するロード命令LOAD2が、ユーザモードでアクセスが許可されているメモリ領域M1内のアドレス100+XのデータDA1を読み出す（S4）。この結果、プロセッサのキャッシュメモリCACHE内のアドレス100+XのエントリにデータDA1が登録される（S5）。
【００１８】
その後、プロセッサが、アドレスを変更しながら図示しないロード命令LOAD3を繰り返すと(S6)、データDA1が登録されているアドレス100+Xへのロード命令のアクセスレイテンシが他のアドレス100よりも短くなり、アドレス100+Xの内容を知ることができる。これにより、秘密値Xのセキュリティが低下する。このロード命令LOAD3は投機実行でも非投機実行でもよい。
【００１９】
２つのロード命令LOAD1, LOAD2が投機的に実行された後、分岐命令JMP Cの実行が完了して分岐先が確定すると、分岐予測先Bが分岐予測ミスであったことが判明する。その結果、プロセッサ内のパイプライン回路で投機的に実行されたロード命令LOAD1, LOAD2がクリアされ、レジスタR0（投機実行では命令未完了故、レジスタR0はリネーミングレジスタである）の内容がクリアされる。しかし、キャッシュメモリはクリアされないため、キャッシュメモリのレイテンシに基づいて秘密値Xを獲得することができる。
【００２０】
このように、分岐命令JMPの分岐先が確定する前に、誤った分岐予測先へのロード命令LOAD1,LOAD2が実行されることと、LOAD2によるキャッシュ登録状態が維持されることが、プロセッサの脆弱性の原因の一つである。
【００２１】
［本実施の形態のプロセッサ及び情報処理装置］
図２は、本実施の形態のプロセッサを搭載する情報処理装置の概略図である。情報処理装置、HPC：High Performance Computerやスーパーコンピュータは、複数のノードそれぞれに、プロセッサCPU（Central Processing Unit）と、メインメモリM_MEMと、入出力部I/Oとを有する。各ノードのプロセッサCPUは、プロセッサ内に設けたインターコネクトを介して相互にパケット通信する。
【００２２】
演算処理装置であるプロセッサCPUは、複数のコアCORE_0〜CORE_nと、複数のコアで共有されるラストレベルキャッシュLL$（Last Level Cache）と、メモリへのアクセスを制御するメモリアクセス制御部MACと、他のノードのプロセッサとの間のパケット通信を制御するインターコネクトI_CNCTとを有する。各コアCOREは、後述するとおり、命令発行部と、演算器と、L1キャッシュとを有する。そして、図２のラストレベルキャッシュLL$は、以下の実施の形態例では２次キャッシュ、第２レベルキャッシュまたはL2キャッシュ、とする。
【００２３】
図３は、本実施の形態におけるプロセッサの構成例を示す図である。図３のプロセッサは、命令発行部として、命令フェッチアドレス生成器I_F_ADD_GENと、L1命令キャッシュL1_ICACHEと、L2命令キャッシュL2_ICACHEと、命令バッファI_BUFと、命令デコーダI_DECと、複数の命令を演算器に発行する命令発行部である、リザベーションステーションRSA, RSE, RSFを有する。また、命令発行部は、分岐命令用リザベーションステーションRSBRと、コミットスタックエントリCSEを有する。
【００２４】
更に、プロセッサは、複数の演算器として、ストレージユニットSU、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCを有する。これらの演算器は、それぞれ単一または複数個を有する。
【００２５】
ストレージユニットSUは、アドレス計算するための加減算回路を含むオペランドアドレス生成器OP_ADD_GENと、１次データキャッシュL1_DCACHEを有する。１次データキャッシュは、キャッシュメモリに加えて、キャッシュメモリに対する制御を行うL1キャッシュ制御部L1$_CNTを有する。
【００２６】
また、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCは、例えば、加減算回路と論理演算器と乗算器などを有する。浮動小数点演算器は、例えば、SIMD（Single Instruction Multiple Data）演算ができるように、SIMD幅に対応した数の演算器を有する。プロセッサは、これらの演算器の処理結果を格納する固定小数点用レジスタファイルFX_REGと、浮動小数点用レジスタファイルFL_REGを有する。これらのレジスタファイルは、複数のレジスタを有し、その一部は命令完了前に処理結果が格納されるリネーミングレジスタと、命令完了時に処理結果が格納されるアーキテクチャレジスタである。アーキテクチャレジスタは、ソフトウエアからアクセス可能なレジスタであり、汎用レジスタである。
【００２７】
以上が、プロセッサ内のコアの構成である。プロセッサは、更に、複数のコアで共有されるL2キャッシュL2$を有し、図示しないメモリコントローラを介してメインメモリM_MEMに接続される。また、L2命令キャッシュL2_ICACHEもメモリコントローラを介してメインメモリM_MEMに接続される。L2キャッシュL2$は、前述のラストレベルキャッシュである。
【００２８】
プロセッサ全体の構成について、命令の処理の流れに沿って以下説明する。命令フェッチアドレス生成器I_F_ADD_GENがフェッチアドレスを生成し、プログラム内の実行順に（インオーダーで）、１次命令キャッシュL1_ICACHEからフェッチ命令を一旦命令バッファI_BUFに格納する。そして、命令デコーダI_DECが、命令バッファ内のフェッチ命令をインオーダーで入力しデコードし、実行に必要な情報を付加した実行可能命令（実行命令）を生成する。
【００２９】
次に、命令デコーダで生成された実行命令は、インオーダーで、リザベーションステーションと呼ばれるキュー構造のストレージにキューインされ蓄積される。リザベーションステーションは、実行命令をキューに蓄積する実行キューであり、命令を実行する演算器毎に設けられる。
【００３０】
リザベーションステーションは、例えば、L1データキャッシュL1$を含むストレージユニット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の命令コミット処理ユニットが、キューに格納された処理完了報告待ちの命令の中から処理完了報告に対応する実行命令をインオーダーで完了処理し、レジスタなどの回路資源の更新を行う。CSEは、完了処理でプログラムカウンタPCをインクリメントする。
【００３５】
分岐処理用のRSBRにキューインされた分岐命令は、分岐予測ユニットBR_PRDによって分岐予測され、予測結果に基づいて命令フェッチアドレス生成器I_F_ADD_GENが分岐先アドレスを生成する。その結果、分岐予測に基づく命令が、命令キャッシュから読み出され、命令バッファ、命令デコーダを経由して、演算器により投機的に実行される。RSBRは、分岐命令をインオーダーで実行する。但し、分岐命令の分岐先が確定する前に、分岐先を予測し、予測分岐先の命令を投機的に実行することが行われる。分岐予測が正しければ処理効率が上がり、一方、誤りであれば投機実行した命令はパイプライン内でキャンセルされるため処理効率が下がる。
【００３６】
［L1キャッシュ制御部の概略構成と動作］
図４は、命令発行部とL1キャッシュ制御部とL2キャッシュ制御部の概略構成例を示す図である。命令発行部I_ISSが発行するメモリアクセス命令の処理の概略を以下説明する。
【００３７】
命令発行部I_ISSのRSAは、メモリアクセス命令MA_INSTをL1キャッシュのL1キャッシュ制御部L1$_CNTに発行する。ここでは、メモリアクセス命令は例えばロード命令とする。発行されたメモリアクセス命令は、一旦フェッチポートF_PORTに格納される。フェッチポート内のメモリアクセス命令がまたはそれに対応するメモリアクセス要求MA_RQが、L1キャッシュ制御部のパイプラインに投入（入力）されると、まず、L1キャッシュタグL1$_TAGを検索してキャッシュヒット判定が行われる。ここでキャッシュヒットすると、L1キャッシュデータメモリL1$_D_RAM内のデータがデータ応答DATA_RSPとして命令発行部に返信される。このデータ応答のデータは、前述のリネーミングレジスタまたｈアーキテクチャレジスタに格納される。
【００３８】
一方、キャッシュミスL1$_MISSすると、L1キャッシュに要求されたデータを登録することが必要になる。そのために、まずデータ登録要求バッファDA_RQ_BUFが確保される。データ登録要求バッファには、メモリアクセス要求MA_RQの情報が格納される。もしデータ登録要求バッファを確保できない場合、メモリアクセス要求MA_RQはフェッチポートF_PORTに差し戻され、メモリアクセス要求はフェッチポート内に滞留する。
【００３９】
データ登録要求バッファが確保できると、L1キャッシュ制御部は、L2キャッシュのL2キャッシュ制御部L2$_CNTに、データ登録要求DA_RQを発行する。これに応答して、L2キャッシュ制御部は、前述のL1キャッシュ制御部と同様の制御（キャッシュ判定、キャッシュヒットの場合のデータ応答、キャッシュミスの場合のメインメモリへのデータ登録要求（メモリアクセス要求）等）を実行する。
【００４０】
やがて、L2キャッシュ制御部は、データ応答DATA_RSPをL1キャッシュ制御部に送信する。それに応答して、L1キャッシュ制御部は、L1キャッシュデータメモリL1$_D_RAMとL1キャッシュタグL1$_TAGにデータ応答のデータをキャッシュ登録する。そして、L1キャッシュ制御部は、L1キャッシュデータメモリL1$_D_RAMにキャッシュ登録したデータのデータ応答を出力する。
【００４１】
尚、後述するとおり、L1キャッシュ制御部は、L2キャッシュ制御部からデータ応答を受信すると、データ応答のデータをL1キャッシュデータメモリL1$_D_RAMとL1キャッシュタグL1$_TAGにキャッシュ登録し、再度、フェッチポートからメモリアクセス要求MA_RQをL1キャッシュ制御部のパイプラインに投入する。投入されたメモリアクセス要求は、L1キャッシュタグでキャッシュヒットし、L1キャッシュ制御部は、L1キャッシュデータメモリL1$_D_RAM内のデータをデータ応答する。L1キャッシュ制御部は、再投入されたメモリアクセス要求を処理してデータ応答することに替えて、L1キャッシュにデータ登録し、そのデータでデータ応答するようにしてもよい。
【００４２】
上記のL1キャッシュ制御部がL2キャッシュ制御部に発行するデータ登録要求DA_RG_RQと、L2キャッシュ制御部がメインメモリM_MEMに発行するデータ登録要求DA_RG_RQは、いずれもキャッシュミスした場合に、メインメモリ側に向けて発行するメモリアクセス要求の一種である。このメモリアクセス要求によりメインメモリから読み出されたデータ、または高いレベルのキャッシュ制御部のキャッシュメモリから読み出されたデータは、データ応答により返信され、キャッシュ登録される。
【００４３】
［命令デコーダ］
図５は、本実施の形態における命令デコーダの構成例を示す図である。命令デコーダI_DECは、命令バッファI_BUF内のフェッチ命令をインオーダーで入力し、フェッチ命令をデコードし、分岐命令が分岐予測中に発行するメモリアクセス命令に、未確定の分岐命令の命令識別子IID（Instruction ID）と投機アクセスフラグとを付加して、RSAに発行する。
【００４４】
命令デコーダI_DECは、フェッチ命令をデコードするデコーダ１０と、分岐命令の命令識別子IIDとそのバリッド信号Vを格納する分岐命令バッファ１２と、比較回路１４とを有する。命令デコーダ内のデコーダ１０は、分岐命令をデコードすると、分岐命令にIIDを割り当てて、分岐命令バッファ１２に格納し、そのバリッド信号Vを有効「１」にする。そして、デコーダ１０は、分岐命令をRSBRに発行する。
【００４５】
デコーダ１０は、分岐命令が未確定中にメモリアクセス命令を発行するとき、バリッド信号Vと分岐命令のIIDとを付加する。このバリッド信号Vは、発行するメモリアクセス命令が投機実行であることを示す投機アクセスフラグとなる。
【００４６】
RSBRは、分岐命令の分岐先が確定すると、分岐確定を示す分岐確定通知信号と分岐命令のIIDとを命令デコーダI_DECに送信する。命令デコーダ内の比較回路１４は、分岐命令バッファ１２内のIIDとRSBRから分岐確定通知に付加されたIIDとを比較し、一致すると、分岐命令バッファ１２のバリッド信号Vを無効「０」にする。これにより、分岐確定状態となる。デコーダ１０は、分岐確定状態で発行されるメモリアクセス命令に、無効「０」のバリッド信号Vを投機アクセスフラグとして付加して、RSAに発行する。
【００４７】
そして、デコーダ１０は、新たに分岐命令をデコードすると、その分岐命令の命令識別子IIDで分岐命令バッファ１２を更新する。このようにして、分岐命令バッファ１２には、直前の分岐命令のIIDと、分岐未確定状態（バリッド信号Vが「１」）か、分岐確定状態（バリッド信号Vが「０」）かを示すバリッド信号Vが格納される。
【００４８】
上記の通り、命令デコーダI_DECは、発行するメモリアクセス命令に、投機実行か非投機実行化を示す投機アクセスフラグとその分岐命令のIIDとを付加して、RSAに発行する。
【００４９】
メモリアクセス命令は、RSAの発行キューに格納される。さらに、RSAがメモリアクセス命令を発行すると、発行されたメモリアクセス命令は、L1キャッシュ制御部内のフェッチポートに格納される。そして、RSBRが分岐命令の分岐確定通知信号を分岐命令の命令識別子IIDを付加してRSAとL1キャッシュ制御部に送信すると、RSA内の発行キューに格納されているメモリアクセス命令の投機アクセスフラグが無効化され、L1キャッシュ制御部のフェッチポートに格納されているメモリアクセス命令の投機アクセスフラグも無効化される。L2キャッシュ制御部のフェッチポートに対しても同様に投機アクセスフラグが無効化される。
【００５０】
［本実施の形態のL1、L2キャッシュ制御部の詳細］
図６乃至図１４でL1,L2キャッシュ制御部の説明を行うが、説明の前に以下にて各用語の説明を行う。
・投機アクセス情報SP_AC_INF：メモリアクセス命令に付加される投機メモリアクセスに関する情報で、以下の３つの情報である。
・投機アクセスフラグSP_AC_FLG：投機メモリアクセスか否かを示す。「１」で投機メモリアクセス。命令デコーダの分岐命令レジスタのバリッド信号が投機アクセスフラグとして利用される。
・分岐命令IID：直前の分岐命令の命令識別子IID
・投機データ要求済フラグSP_DA_RQ_FLG：投機メモリアクセス要求に対して投機エントリキャッシュミスが発生してデータ登録要求が発行されたか否かを示すフラグ。投機エントリキャッシュミスによりデータ登録要求が発行されるとき「１」にセットされる。その後、投入されたメモリアクセス要求は、L1キャッシュヒットするが、投機データ要求済フラグが「１」であるため投機エントリキャッシュミスせず、再度データ登録要求を発行せずにデータ応答することができる。
・仮登録情報PR_R_INF：キャッシュに投機メモリアクセスにより登録されたか否かを示す情報で、L1キャッシュタグに格納され、投機エントリキャッシュヒット判定に利用される。仮登録情報は、投機エントリフラグSP_EN_FLGと分岐命令の命令識別子IIDとを有する。
・投機エントリフラグSP_EN_FLG：投機メモリアクセス要求の投機アクセスフラグが「１」の場合、「１」にセットされる。
・投機エントリヒット判定部SP_EN_H_JDG：キャッシュヒットした場合に、仮登録状態（投機エントリフラグが「１」）であり、投機データ要求済フラグが未要求「０」であれば、投機エントリキャッシュミスし（L2、メモリにデータ登録要求が発行され）、一方、キャッシュヒットし、仮登録状態であり、投機データ要求済フラグが要求済み「１」であれば、投機エントリキャッシュヒットし、データ応答される。
・キャッシュ確定制御部CA_DTR_CNT：分岐命令が完了して分岐予測成功で分岐先確定すると、キャッシュ確定制御部は、L2キャッシュの仮登録を本登録にし、L1キャッシュの分岐IIDが一致する仮登録のエントリを本登録にする（投機エントリフラグを「０」にリセットする）。分岐予測失敗で分岐先確定すると、L2キャッシュの仮登録のエントリを無効化し、L1キャッシュの仮登録のエントリも無効化する。これにより、その後のLOAD命令では、仮登録のエントリはL1キャッシュミスされる。
・データ登録要求DA_RG_RQ：キャッシュミスまたは投機エントリキャッシュミスしたときにメインメモリ側に発行されるメモリアクセス要求である。
【００５１】
［シングルコアの場合のL1、L2キャッシュ制御部］
図６は、本実施の形態におけるシングルコアの場合のL1、L2キャッシュ制御部の構成を示す図である。図６には、L1キャッシュ制御部L1$_CNTの詳細な構成が示され、以下その構成について説明するが、L2キャッシュ制御部L2$_CNTもL1キャッシュ制御部と同様の構成を有する。
【００５２】
図５と異なり、図６の場合、フェッチポートF_PORT、データ登録要求バッファDA_RG_RQ_BUFには、投機メモリアクセスに関する情報である投機アクセス情報SP_AC_INFとして、投機アクセスフラグSP_AC_FLG, 分岐命令のIIDがメモリアクセス命令または要求に付加されて格納される。フェッチポートF_PORTには、投機データ要求済フラグSP_DA_RQ_FLGも格納される。また、L1$タグL1$_TAG、L2$タグL2$_TAGには、投機メモリアクセス命令で登録されたエントリであることを示す仮登録情報PRV_RG_INFとして、投機エントリフラグSP_EN_FLGと分岐命令のIIDが、通常のタグ情報（アドレスや状態情報（MESI））に付加されて格納される。
【００５３】
そして、図５と異なり、図６の場合、L1キャッシュヒット判定部L1$_H_JDGに加えて、投機エントリキャッシュヒット判定部SP_EN_H_JDGが設けられる。投機エントリキャッシュヒット判定部は、L1キャッシュヒットした場合、ヒットしたL1キャッシュのエントリが仮登録状態であれば（投機エントリフラグSP_EN_FLGが「１」）、一度投機エントリキャッシュミスして、L2キャッシュにデータ登録要求を発行し、メインメモリへのメモリアクセスを実行させる（図８のS20のNO、S21のYES、S22のNO）。
【００５４】
投機メモリアクセス命令により、L1キャッシュタグに登録されている分岐命令の命令識別子IIDと異なるIIDでアクセスがあると、L1キャッシュ制御部は、投機エントリキャッシュミスに基づくデータ登録要求を発行し、それに対するデータ応答時に、投機メモリアクセス命令のIIDでL1キャッシュタグ内のIIDを更新する。または、更新しない方式も可能である。いずれの方式にするかにより、分岐命令が分岐予測成功で完了したときにキャッシュのどのエントリを本登録するかの処理が異なる。
【００５５】
非投機メモリアクセス命令が発行されると、L1キャッシュ制御部は、L1キャッシュヒットした場合、ヒットしたエントリが仮登録状態であれば、上記と同様に、一度投機エントリキャッシュミスする（図８のS20のNO、S21のNO）。そして、その後L2キャッシュからデータ応答を受信すると、L1キャッシュタグの投機エントリフラグを「０」に無効化し、エントリを本登録状態に変更する（図８のS18）。
【００５６】
上記のように、仮登録状態のエントリにアクセスした場合、L1キャッシュ制御部は、投機エントリキャッシュミスにより、一度はキャッシュミスに見せることにより、図１のアドレス100+X宛のメモリアクセス命令LOAD3のメモリアクセスレイテンシを隠蔽する。
【００５７】
但し、投機メモリアクセス命令が発行されると、L1キャッシュ制御部は、キャッシュミスし（S13のNO）、そしてL1キャッシュ内が全て本登録の場合(図８のS29のYES)、投機メモリアクセス命令の分岐命令が確定するまで、投機メモリアクセス命令の処理を抑止し、メモリアクセス要求をフェッチポートに差し戻し、フェッチポート内に滞留させる。これにより、投機実行されるメモリアクセス命令により、既に本登録されているキャッシュメモリ内のデータが追い出されることを回避することができる。この制御は、例えば、L1キャッシュに本登録でキャッシュフィル（登録）済みの状態で、投機LOAD3により攻撃を受けることがあった場合、キャッシュの状態を変更せずに、分岐命令が分岐確定するまで投機LOAD3をフェッチポート内に滞留させる制御である。
【００５８】
一方、投機エントリキャッシュヒット判定部は、L1キャッシュヒットした場合、ヒットしたL1キャッシュのエントリが仮登録状態でなく本登録状態（SP_EN_FLG=0）なら、投機エントリキャッシュヒットし、L1キャッシュデータメモリL1$_DA_RAMからデータを抽出してデータ応答させる。この処理は、通常のメモリアクセス命令と同じである。
【００５９】
また、図５と異なり、図６の場合、キャッシュ確定制御部CA_DTR_CNTは、分岐命令が完了して分岐先が確定したことを知らせる分岐確定通知BR_DTRを命令発行部のRSBRから受信すると、分岐予測成功なら仮登録のエントリを本登録に変更し、失敗なら仮登録のエントリを無効化する。
【００６０】
図７は、命令発行部がL1キャッシュ制御部に発行する命令について説明する図である。命令発行部I_ISSは、前述のとおり、命令デコーダI_DECとリザベーションステーションRSAを有する。図７には、命令発行部I_ISSがデコードする命令列INST_1が図示されている。L1キャッシュ制御部L1$_CNTは、L1キャッシュに対するメモリアクセス命令の処理を制御する回路であり、図７には、L1キャッシュ制御部に発行される命令INST_2が示される。
【００６１】
命令発行部がデコードする命令列INST_1は、命令種とその命令識別子IIDの例が示される。この例によれば、２つの分岐命令BR(B),BR(C)と、分岐命令BR(B)の後ろ側のロード命令LD(B)及びストア命令ST(B)と、分岐命令BR(C)の後ろ側のロード命令LD(C)と、分岐命令に属さないロード命令LD(A)とが含まれる。
【００６２】
一方、L1キャッシュ制御部のフェッチポートには、上記の命令発行部がデコードする命令列INST_1のうち、メモリアクセス命令であるロード命令LDとストア命令STとがキューインされる。そして、図５の命令デコーダで説明したとおり、これらのロード命令とストア命令には、投機アクセスフラグと分岐命令のIIDとが付加される。図７の例では、命令INST_2には、投機アクセスフラグが「０」のロード命令LD(A)と、「１」のロード命令LD(B),ストア命令ST(B),ロード命令LD(C)が含まれ、投機アクセスフラグが「１」のストア命令及びロード命令には、それらの命令が属する分岐命令のIIDが付加される。
【００６３】
図８は、L1キャッシュ制御部の動作を示すフローチャート図である。L2キャッシュ制御部の動作は、L1キャッシュ制御部がキャッシュミスしたときに発行するデータ登録要求がL2キャッシュ制御部宛であることに代えて、メインメモリ宛であることを除いて、L1キャッシュ制御部と同様である。
【００６４】
図８のフローチャートは、命令発行部からのメモリアクセス命令（以下MA命令と称する。）の発行S10、フェッチポートF_PORTにMA命令をセット（格納）する処理S11と、フェッチポートからL1キャッシュにMA命令に対するL1キャッシュアクセス要求が発行される処理S12と、L1キャッシュヒット判定部L1$_H_JDGの処理S13と、投機エントリヒット判定部SP_EN_H_JDGの処理S20-S22と、データ登録要求バッファDA_RG_RQ_BUFでの処理S14-S16、S23-25と、L2キャッシュからのデータ応答時のL1キャッシュでの登録処理S17-S19、S26-S28を有する。
【００６５】
［投機エントリヒット判定部の第１の例］
図９は、投機エントリヒット判定部の論理回路の第１の例を示す図である。この第１の例では、投機エントリヒット判定部SP_EN_H_JDGに、L1キャッシュヒットしたL1キャッシュTAGのエントリの投機エントリフラグSP_EN_FLGと、L1キャッシュヒット判定部L1$_H_JDGからのL1キャッシュヒット信号L1_$HITとが入力される。さらに、フェッチポートF_PORT内の発行されたMA命令の投機アクセスフラグSP_AC_FLGと、投機データ要求済フラグSP_DA_RG_RQ_FLGが入力される。投機エントリヒット判定部は、４つのアンド回路AND_A, AND_B, AND_C,AND_Eと、１つのオア回路OR_1とを有する。
【００６６】
L1キャッシュヒットしたエントリの投機エントリフラグが「０」の場合、そのエントリは本登録状態である。そこで、投機エントリヒット／ミス判定部は、投機エントリフラグが「０」の場合、アンド回路AND_Cにより、L1キャッシュヒット（L1_$HIT＝１）であれば、投機エントリキャッシュヒット信号もヒット「１」とし、L1キャッシュミス（L1_$HIT＝０）であれば、投機エントリキャッシュヒット信号もミス「０」とする。
【００６７】
一方、L1キャッシュヒットしたエントリの投機エントリフラグが「１」の場合、そのエントリは仮登録状態であり、アンド回路AND_Cの出力は「０」になる。一方、アンド回路AND_Bの出力は「１」となる。そして、フェッチポート内の投機アクセスフラグSP_AC_FLGが「１」であれば、アンド回路AND_Eの出力が「１」となるが、投機データ要求済フラグが未要求「０」であれば、アンド回路AND_Aの出力は「０」となり、投機エントリキャッシュヒット信号もミス「０」となる。但し、投機データ要求済フラグが未要求「１」であれば、アンド回路AND_Aの出力も「１」となり、投機エントリキャッシュヒット信号はヒット「１」となる。この投機データ要求済フラグによる投機エントリキャッシュミスとヒットの制御は、投機メモリアクセスを完了させるための理由であり、以下に記述するL1キャッシュ制御部の制御で詳述する。
【００６８】
また、L1キャッシュヒット「１」で、投機エントリフラグが「１」（仮登録）の場合に、L1キャッシュアクセス要求が非投機メモリアクセス命令であれば（SP_AC_FLG=0）、アンド回路AND_Eが、投機エントリキャッシュヒット信号をミス「０」にする。これは、図８の投機アクセスか否かの判定S21がNOになることによる投機エントリキャッシュミスである。この場合、非投機メモリアクセス命令のデータ登録要求に対するデータ応答のデータは、L1、L2キャッシュタグに投機エントリフラグ「０」（本登録）で登録される（S18）。
【００６９】
以下、図６，図８を参照して、L1キャッシュ制御部の４つの制御について説明する。
【００７０】
［L1キャッシュ制御部の制御１］
L1キャッシュ制御部の制御１は、図１の投機LOAD2に対する制御である。投機LOAD2では、L1キャッシュ制御部は、L1キャッシュミスし、L2キャッシュにデータ登録要求を発行する。L2キャッシュ制御部は、L2キャッシュミスし、メインメモリにアクセスし、L2キャッシュTAGに、投機エントリフラグ「１」（投機エントリまたは仮登録）、分岐命令のIIDで、メインメモリから読み出したデータをキャッシュ登録する。さらに、L1キャッシュ制御部も、L1キャッシュTAGに、投機エントリフラグ「１」（投機エントリまたは仮登録）、分岐命令のIIDで、読み出しデータをキャッシュ登録する。
【００７１】
図１０は、制御１の動作を示すシーケンスチャートの図である。最初に、命令発行部が投機LOAD2を発行し（S10）、L1キャッシュ制御部内のフェッチポートに投機LOAD2がキューインされる（S11）。フェッチポートの各エントリには、投機LOAD2の命令種やアクセス先アドレス等に加えて、投機アクセスフラグSP_AC_FLG=1、分岐命令のIID、投機データ要求済フラグSP_DA_RQ_FLG=0が格納される。
【００７２】
次に、フェッチポートから投機LOAD2のL1キャッシュアクセス要求L1$_AC_RQが発行され（S12）、L1キャッシュヒット判定部L1$_H_JDGが、L1キャッシュタグを参照して、キャッシュヒット判定を行う。図１で説明したとおり、最初にキャッシュフラッシュしているので、L1キャッシュタグのエントリはすべて無効であり、ここではL1$ミスする（S13のNO）。
【００７３】
これに応答して、データ登録要求バッファの確保要求BUF_RQが発生する。この要求に対し、データ登録要求バッファが確保できる場合、データ登録要求バッファは、投機LOAD2が投機的命令であるので（S14のYES）、フェッチポート内の投機LOAD2の投機データ要求済フラグをSP_DA_RQ_FLG＝１にセットする（S23）。さらに、データ登録要求バッファは、確保したデータ登録要求バッファ内にL1キャッシュアクセス要求の情報と、その投機アクセス情報SP_AC_INFを記録し（S24）、L2キャッシュ制御部に、データ登録要求DA_RG_RQを発行する（S25）。
【００７４】
L2キャッシュ制御部は、L1キャッシュ制御部からのデータ登録要求に対して、上記のL1キャッシュ制御部と同じ制御を行い、L2キャッシュミスが発生し、メインメモリにアクセスして、投機LOAD2のロード先データを読み出し、L2キャッシュに登録する。そして、L2キャッシュ制御部からのデータ応答（S26）に応答して、L1キャッシュ制御部は、L1キャッシュにキャッシュ登録する（S27）。
【００７５】
L1キャッシュにキャッシュ登録されると、フェッチポートから再度L1キャッシュアクセス要求L1$_AC_RQが発行され（S12）、L1キャッシュヒットする（S13のYES）。そして、投機エントリキャッシュヒット判定部が、フェッチポートの投機データ要求済フラグSP_DA_RQ_FLGが「１」であることから、投機エントリキャッシュヒットし（S20のNO、S21のYES、S22のYES）、データ応答DA_RSPが命令発行部に送信される（S29_1）。
【００７６】
以上のように、投機LOAD2を実行することにより、L1キャッシュタグとL2キャッシュタグには、通常のタグの情報（有効ビット、状態値（MESI）、アドレス）に加えて、投機エントリフラグSP_EN_FLG=1と投機LOAD2の直前の分岐命令のIIDが登録され、仮登録であることが記録される。
【００７７】
［L1キャッシュ制御部の制御２］
L1キャッシュ制御部の制御２は、図１の投機LOAD2と同じアドレス100+Xへの投機LOAD3を実行する場合の制御である。この場合、L1キャッシュヒットするが、投機エントリキャッシュヒット判定SP_EN_$H_JDGが、投機エントリキャッシュミスと判定し、L2キャッシュを経由して、メインメモリへのアクセスが発生する。そして、メインメモリからのデータ応答に対して、L2キャッシュ制御部は、L2キャッシュTAGに、投機エントリフラグ「１」（投機エントリまたは仮登録）、分岐命令のIIDで、キャッシュ登録する。さらに、L1キャッシュ制御部も、L1キャッシュTAGに、投機エントリフラグ「１」（投機エントリまたは仮登録）、分岐命令のIIDで、キャッシュ登録する。
【００７８】
このように、投機LOAD3では、L1キャッシュヒットするが、投機エントリキャッシュミスが発生し、メインメモリへのアクセスを発生させる。そして、再度、投機LOAD2の投機アクセス情報でL2キャッシュタグとL1キャッシュタグに仮登録情報（投機アクセスフラグ「１」と分岐命令のIID）を登録し、L2、L1キャッシュデータメモリにメインメモリから読み出したデータを登録する。
【００７９】
図１１は、制御２の動作を示すシーケンスチャートの図である。最初に、命令発行部が投機LOAD3を発行し（S10）、L1キャッシュ制御部内のフェッチポートに投機LOAD3が格納される（S11）。フェッチポートには、投機LOAD3の命令種やアクセス先アドレス等に加えて、投機アクセスフラグSP_AC_FLG=1、分岐命令のIID、投機データ要求済フラグSP_DA_RQ_FLG=0が格納される。
【００８０】
次に、フェッチポートから投機LOAD3のL1キャッシュアクセス要求が発行され（S12）、L1キャッシュヒット判定部L1$_H_JDGが、L1キャッシュタグを参照して、キャッシュヒット判定を行う。制御２では、投機LOAD2によりL1キャッシュにデータが既に登録されているので、L1キャッシュヒット判定部はL1キャッシュヒットする（S13のYES）。ここは制御１と異なる。
【００８１】
L1キャッシュヒットに応答して、投機エントリキャッシュヒット判定部は、L1キャッシュタグの投機エントリフラグがSP_EN_FLG＝１と仮登録であることから、投機エントリキャッシュミスと判定する（S22のNO）。つまり、図９のアンド回路AND_B、AND_Eの出力が「１」になり、フェッチポートの投機データ要求済フラグのSP_DA_RQ_FLG=0（未要求）により、図９のアンド回路AND_Cの出力が「０」となり、投機エントリキャッシュヒット信号はミス「０」になる。
【００８２】
その結果、データ登録要求バッファの確保要求BUF_RQが発生し、データ登録要求バッファに投機アクセス情報が登録され（S24）、L2キャッシュに対してデータ登録要求DA_RG_RQが発行される（S25）。同時に、フェッチポート内の投機LOAD3の投機データ要求済フラグが「１」される（S23）。この後の制御は、図１０の制御１と同じであり、メインメモリからのデータ応答のデータが、L2キャッシュとL1キャッシュで登録され、再度投入されたL1キャッシュアクセス要求に対してL1キャッシュヒットし、投機データ要求済フラグが「１」であるため、投機エントリキャッシュヒットし、データ応答が命令発行部に送信される。
【００８３】
以上のように、投機LOAD3を実行した場合、L1キャッシュヒットするが、L1キャッシュタグの仮登録情報PRV_RG_INF（投機エントリフラグSP_EN_FLGが「１」）により、投機エントリキャッシュミスが発生し、メインメモリへのアクセスが発生する。そのため、投機LOAD3のレイテンシは、他のアドレスのロード命令と同様に長くなり、キャッシュヒットによりレイテンシが短くなることが隠蔽され、アドレス100+Xが悪意の第三者に獲得されることが防止できる。
【００８４】
上記の投機LOAD3に対する制御において、L1キャッシュに仮登録した後（S27）、L1キャッシュアクセス要求を再投入することなく、データ応答(S29_1)を行うようにするようにしてもよい。その場合、投機LOAD3に対する最初のL1キャッシュアクセス要求L1$_AC_RQに応答してL1キャッシュヒットの後、投機エントリキャッシュヒット判定部は、L1キャッシュヒットしたエントリが仮登録であれば（SP_EN_FLG=1）、投機エントリキャッシュミスする。従って、図９の投機エントリキャッシュヒット判定部SP_EN_$H_JDGの論理回路は、アンド回路AND_Cだけとなり、L1キャッシュヒットの場合、投機エントリフラグが「１」の仮登録であれば、投機エントリキャッシュミスと判定し、投機エントリフラグが「０」の本登録であれば、投機エントリキャッシュヒットと判定する。
【００８５】
［L1キャッシュ制御部の制御３］
L1キャッシュ制御部の制御３は、図１のアドレス100+Xへの非投機LOAD3を実行する場合の制御である。この場合、L1キャッシュヒットし、投機エントリキャッシュヒット判定SP_EN_$H_JDGが、投機エントリキャッシュミスと判定し、L2キャッシュを経由して、メインメモリへのアクセスが発生する。そして、メインメモリからのデータ応答に対して、L2キャッシュTAGに、投機エントリフラグ「０」（非投機エントリまたは本登録）、分岐命令のIIDで、本登録する。さらに、L1キャッシュ制御部も、L1キャッシュTAGに、投機エントリフラグ「０」（非投機エントリまたは本登録）、分岐命令のIIDで、キャッシュ登録する。
【００８６】
図１２は、制御３の動作を示すシーケンスチャートの図である。最初に、命令発行部が非投機LOAD3を発行し（S10）、L1キャッシュ制御部内のフェッチポートに非投機LOAD3が格納される（S11）。フェッチポートには、非投機LOAD3の命令種やアクセス先アドレス等に加えて、投機アクセスフラグSP_AC_FLG=0、分岐命令のIID、投機データ要求済フラグSP_DA_RQ_FLG=0が格納される。
【００８７】
次に、フェッチポートから投機LOAD3のL1キャッシュアクセス要求L1$_AC_RQが発行され（S12）、L1キャッシュヒット判定部L1$_H_JDGが、L1キャッシュタグを参照して、キャッシュヒット判定を行う。制御３では、投機LOAD2によりL1キャッシュにデータが既に登録されているので、L1キャッシュヒット判定部はL1キャッシュヒットする（S13のYES）。
【００８８】
L1キャッシュヒットに応答して、投機エントリキャッシュヒット判定部は、L1キャッシュタグの投機エントリフラグがSP_EN_FLG＝１、即ち、仮登録（S20のNO）であるが、非投機LOAD3であるので、図９のアンド回路AND_Eの出力が「０」となり、投機エントリキャッシュミスと判定する（S21のNO）。
【００８９】
その結果、データ登録要求バッファの確保要求BUF_RQが発生し、データ登録要求バッファに投機アクセス情報が登録され（S15）、L2キャッシュに対してデータ登録要求が発行される（S16）。この場合、フェッチポート内の対応する命令の投機データ要求済フラグをセットすること（S23）は行われない。
【００９０】
データ応答（S17）後の制御は、図１１の制御２と異なり、メインメモリからのデータ応答のデータが、L2キャッシュとL1キャッシュで本登録される（S18）。その後、再度投入されたL1キャッシュアクセス要求（S12）に対してL1キャッシュヒットするが（S13のYES）、L1キャッシュが本登録されているため、投機エントリキャッシュヒットと判定され（S20のYES）、データ応答が命令発行部に送信される（S29_1）。非投機LOAD3を発行した場合、投機エントリキャッシュミス後に、L2,L1キャッシュに本登録されるため、再投入されたL1キャッシュアクセス要求に対して投機エントリキャッシュヒットする。
【００９１】
以上のように、非投機LOAD3を実行することにより、L1キャッシュヒットするが、L1キャッシュタグの仮登録情報PRV_RG_INF（投機エントリフラグSP_EN_FLGが「１」）と、フェッチポートの非投機LOAD3の投機アクセス情報（SP_AC_FLGが「０」）により、投機エントリキャッシュミスが発生する。これにより、メインメモリへのアクセスが発生し、非投機LOAD3のレイテンシは、他のアドレスのロード命令と同様に長くなり、アドレス100+Xが悪意の第三者に獲得されることが防止できる。
【００９２】
［L1キャッシュ制御部の制御４］
L1キャッシュ制御部の制御４は、命令発行部のRSBRからの分岐確定通知を受信した場合のキャッシュ確定制御部の処理である。制御４では、分岐確定通知が分岐予測成功の場合、L1,L2キャッシュのキャッシュ確定制御部が分岐命令のIIDが一致するエントリを仮登録から本登録に変更し、分岐予測失敗の場合、L1,L2キャシュの仮登録された全エントリを無効化する（バリッド信号を「０」にする）。
【００９３】
図１３は、L1キャッシュ制御部の制御４のフローチャート図である。また、図１４は、L1キャッシュ制御部の制御４のシーケンスチャート図である。
【００９４】
まず、命令発行部のRSBRからの受信する分岐確定通知BR_DTRには、分岐予測の成功か失敗のフラグと、分岐命令のIIDが含まれる。分岐確定通知を受信した場合、その分岐予測が成功の場合（S30のYES）、L1キャッシュ制御部内のキャッシュ確定制御部CA_DTR_CNTは、L2キャッシュ制御部に、分岐確定通知BR_DTRを発行する。そして、L2キャッシュ制御部内のキャッシュ確定制御部が、L2キャッシュで仮登録されたエントリのうち、分岐確定通知の分岐命令のIIDと一致するエントリの投機エントリフラグSP_EN_FLGを「０」にして本登録に変更する（S31）。更に、L2キャッシュ制御部のキャッシュ確定制御部がL1キャッシュ制御部に対してキャッシュ本登録の要求＄＿RG/INV_RQを発行すると、L1キャッシュ制御部のキャッシュ確定制御部＄＿DTR_CNTが、L1キャッシュで仮登録されたエントリのうち、分岐命令のIIDと一致するエントリの投機エントリフラグSP_EN_FLGを「０」にして本登録に変更する（S32）。
【００９５】
上記の本登録に変更する処理（S31,S32）では、前述した、投機メモリアクセス命令の分岐命令のIIDが、キャッシュタグの仮登録のエントリの分岐命令のIIDと異なる場合に、キャッシュタグのエントリのIIDを更新しない方式であれば、仮登録した最初の分岐命令のIID以降の投機メモリアクセス命令のエントリを一括して本登録に変更できる。一方、更新する方式であれば、分岐確定した分岐命令のIIDに対応するエントリがその都度本登録に変更される。
【００９６】
一方、分岐予測が失敗の場合（S30のNO）、L1キャッシュ制御部内のキャッシュ確定制御部CA_DTR_CNTは、L2キャッシュ制御部に、分岐確定通知BR_DTRを発行する。そして、L2キャッシュ制御部内のキャッシュ確定制御部が、L2キャッシュ内の仮登録された全てのエントリを無効化する（S33）。更に、L2キャッシュ制御部のキャッシュ確定制御部がL1キャッシュ制御部に対してキャッシュ無効化の要求を発行すると、L1キャッシュ制御部のキャッシュ確定制御部が、L1キャッシュ内の仮登録された全てのエントリを無効化する（S34）。
【００９７】
分岐予測が失敗した場合、分岐予測失敗した分岐命令の分岐予測先のメモリアクセス命令と、分岐予測失敗した分岐命令の後ろの分岐命令の分岐予測先のメモリアクセス命令は、パイプライン内で全てキャンセルので、L2キャッシュとL1キャッシュで、仮登録の全てのエントリが無効化される。分岐予測失敗した分岐命令の前の分岐命令は分岐確定済みであるので、前の分岐命令後のメモリアクセス命令に対応する仮登録のキャッシュエントリは存在しない。
【００９８】
上記の分岐予測失敗で分岐確定した場合、本実施の形態では、キャッシュタグの仮登録状態のエントリを無効化することができる。その結果、分岐予測失敗で分岐確定後は、前述の非投機LOAD3によるアタックに対して、キャッシュミスが発生して、レイテンシの違いを隠蔽することができる。
【００９９】
［投機エントリヒット判定部の第２の例］
図１５は、シングルコアの場合における投機エントリヒット判定部の第２の例である。第２の例でも、図６の構成と図８のフローチャートは第１の例の場合と同じである。第１の例では、仮登録状態のキャッシュエントリ（SP_EN_FLG=1）の場合、投機データ要求済フラグを利用して、一度目は投機エントリミスを判定し、その後、再投入されたL1キャッシュ要求に対して投機エントリヒットを判定した。
【０１００】
しかしながら、同じ分岐命令後のメモリアクセス命令については、図１のLOAD3のようなセキュリティ攻撃対象ではないので、メモリアクセスの実行時間（レイテンシ）を隠蔽する必要はない。以下は、命令列の一例である。
分岐命令BR1（IID=A）
投機LOAD2（IID=A）
投機LOAD_L（IID=A）
投機LOAD_M（IID=A）
--------
分岐命令BR2（IID=X）
投機又は非投機LOAD3（IID=X）
上記の場合、分岐命令BR1の分岐未確定中に投機LOAD2によりL1キャッシュタグに仮登録され、分岐命令BR2の後の投機又は非投機のLOAD3でメモリアクセスの実行時間を測定してセキュリティ攻撃される。上記の例において、分岐命令BR1の後の投機LOAD_Lと投機LOAD_Mは、セキュリティ攻撃用の命令ではなく、メモリアクセスの実行時間を隠蔽する必要はない。一方、分岐命令BR1とは異なる分岐命令BR2の後の投機又は非投機LOAD3は、セキュリティ攻撃用の命令である可能性が高い。
【０１０１】
そこで、第２の例では、上記例の投機LOAD_L,LOAD_Mのように投機LOAD2と同じ分岐命令BR1後の投機メモリアクセス命令の場合は、投機エントリキャッシュヒットとして、キャッシュミスによる性能低下を防ぐ。そのための構成が、分岐命令IIDマッチ回路MTCHと、アンド回路AND_A1である。即ち、L1キャッシュヒットし、L1キャッシュタグが仮登録（投機エントリフラグが「１」）の場合、アンド回路AND_Bの出力が「１」になる。さらに、フェッチポートの分岐IIDとL1キャッシュタグ内の分岐IIDとが一致する場合、分岐命令IIDマッチ回路MTCHの出力が「１」になる。そして、投機LOAD_L,LOAD_Mは投機アクセスフラグが「１」である。従って、アンド回路AND_A1の出力は「１」となり、投機エントリキャッシュヒットと判定される。
【０１０２】
一方、上記例の投機又は非投機LOAD3のように投機LOAD2と異なる分岐命令後のメモリアクセス命令の場合は、投機エントリキャッシュミスと判定して、メモリアクセスの実行時間を隠蔽する。すなわち、分岐命令IIDマッチ回路の出力が「０」となり、投機エントリキャッシュミスと判定される。その結果、L2キャッシュ制御部にデータ登録要求が発行され、L2キャッシュ制御部によりメモリアクセスが実行される。
【０１０３】
第２の例では、上記の例の、投機LOAD2と同じ分岐命令BR1内の命令である投機LOAD_L,投機LOAD_Mについては、セキュリティ攻撃対象外とみなして、投機エントリキャッシュヒットさせて性能低下を防止することができる。
【０１０４】
［マルチコアの場合のL1、L2キャッシュ制御部］
図１６は、マルチコアの場合のL1、L2キャッシュ制御部の構成を示す図である。コア０とコア１は、それぞれ図６に示したL1キャッシュ制御部L1$_CNT_0、L1$_CNT_1を有する。一方、コア０とコア１が共有するL2キャッシュ制御部L2$_CNTは、ラストレベルキャッシュの制御部に対応する。L2キャッシュ制御部L2$_CNTも、図６に示した構成を有する。
【０１０５】
但し、L2キャッシュ制御部のL2$_TAGは、L1キャッシュ制御部のL1$_TAGと異なり、コア０からのデータ登録要求DA_RG_RQに対応して管理される仮登録情報SP_RG_INF_0（投機エントリフラグSP_EN_FLG、分岐命令のIID）と、コア１からのデータ登録要求DA_RG_RQに対応して管理される仮登録情報SP_RG_INF_1を格納する。また、L2$_TAGには、通常のキャッシュタグと同様に、有効ビットVALIDと、MESI制御の状態ビット、アドレスなども格納される。
【０１０６】
マルチコアの場合のL2キャッシュタグに基づくキャッシュ判定は、L1キャッシュタグに基づくキャッシュ判定と同様に、アドレスの一致に基づくL2キャッシュヒット判定と、仮登録情報（投機エントリフラグと分岐命令のIID）やフェッチポート内の投機データ要求済フラグ（図９）または分岐命令のIID（図１５）に基づく、L2投機エントリキャッシュヒット判定とがある。L2キャッシュヒット判定は、図１６には示していないL2キャッシュヒット判定部が行い、L2投機エントリキャッシュヒット判定は、図１６に示していないL2投機エントリキャッシュヒット判定部が行う。図６のL1キャッシュ制御部内の投機エントリキャッシュヒット判定部と同様である。
【０１０７】
マルチコアの場合のL2キャッシュタグに基づくL2投機エントリキャッシュヒット判定は、原則として、L2キャッシュタグ内のデータ登録要求を発行した発行元コアに対応する仮登録情報SP_RG_INFに基づいて行われる。つまり、L2キャッシュでの投機エントリヒット判定は、L1キャッシュでのL1キャッシュタグ内の仮登録情報SP_RG_INFに基づいて行った判定と同様の判定になる。
【０１０８】
図１７は、マルチコアの場合のL2キャッシュでのL2キャッシュヒット判定と、投機エントリキャッシュヒット判定のフローチャート図である。これによれば、前提としてL2キャッシュヒット判定（L2キャッシュタグL2$_TAGの有効ビットVALIDが有効「１」で且つアドレスが一致）の場合（S40のYES）、L2投機エントリキャッシュヒット判定部は、概略すると、次の判定を行う。即ち、L2投機エントリキャッシュヒット判定部は、L2キャッシュタグの情報に基づいて、データ登録要求の発行元のコアがL2キャッシュで、データを未登録か、仮登録か、本登録かを判定する。そして、（１）データが仮登録の場合、図６，８のL1キャッシュ制御と同様に、投機エントリキャッシュヒット判定を行う。（２）データが本登録の場合、L2投機エントリキャッシュヒットと判定し、L2キャッシュヒット判定に従う。（３）データが未登録の場合、L2キャッシュヒット判定は他のコアの仮登録に基づくもの（バリッドビットが「１」）であるので、L2投機エントリキャッシュミスと判定する。この場合、L2キャッシュヒット判定は発行元コアに対する判定としては誤りであったことになる。
【０１０９】
具体的には、L2投機エントリキャッシュヒット判定部は、L2キャッシュヒット判定（S40のYES）の場合、以下の制御を行う。
【０１１０】
（１）まず、L2投機エントリキャッシュヒット判定部は、発行元コアに対応する投機エントリフラグSP_EN_FLGが仮登録を示す「１」の場合（S42のYES）、図９または図１２の論理回路と同様の投機エントリキャッシュ判定を行う（S43）。つまり、図９の例では、投機データ要求済フラグが未要求を示す「０」なら投機エントリキャッシュミスと判定し、要求済みを示す「１」なら投機エントリキャッシュヒットと判定する。図１２の例では、フェッチポートの分岐命令のIIDとL2キャッシュタグの分岐命令のIIDとが一致するか不一致かで、投機エントリキャッシュヒットかミスとそれぞれ判定する。
【０１１１】
（２）L2投機エントリキャッシュヒット判定部は、発行元コアに対応する投機エントリフラグSP_EN_FLGが「０」の場合で、且つそれが本登録を意味するとき（S42のNO且つS44のNO）、図９または図１２の論理回路と同様に投機エントリキャッシュヒットと判定する（S46）。
【０１１２】
ここで、注意すべきことは、L2キャッシュタグには全コアに共通のバリッドビットVALIDを有するため、投機エントリフラグSP_EN_FLGを1ビットで構成すると、各コア毎に未登録、仮登録、本登録を区別できない。特に、投機エントリフラグSP_EN_FLGは、未登録も「０」、本登録も「０」となり、未登録と本登録を区別できない。そこで、本実施の形態では、複数コアのうちいずれかのコアでL2キャッシュに本登録された場合、全コアの投機エントリフラグSP_EN_FLGを「０」にして本登録状態が区別できるようにしている。これは、L2キャッシュで本登録されると、投機エントリの判定は不要になり、L2キャッシュではヒット判定となるからである。この点については、後述する図１８で説明する。
【０１１３】
従って、発行元コアに対応する投機エントリフラグSP_EN_FLGが本登録を示す「０」の場合とは、本実施の形態では、L2キャッシュタグが、バリッドビットが有効「１」で、全コアの投機エントリフラグが「０」の場合を意味する。全コアの投機エントリフラグが「０」か否かの判定は、全コアの投機エントリフラグの論理和（OR）が「０」（OR=0）か否かで行う。
【０１１４】
（３）L2投機エントリキャッシュヒット判定部は、発行元コアに対応する投機エントリフラグSP_EN_FLGが「０」の場合で、且つそれが未登録を意味するとき（S42のNO且つS44のYES）、投機エントリキャッシュミスと判定する（S45）。発行元コアとは異なるコアに対応する投機エントリフラグが仮登録を示す「１」の場合、L2キャッシュヒット判定は、発行元コアとは異なるコアの仮登録に基づいて行われたとみなし、発行元コアに対しては投機エントリキャッシュミスと判定し、メモリアクセスを実行させる。これにより、L2キャッシュヒット判定は、否定されることになる。
【０１１５】
ここで、注意すべきことは、一般に、キャッシュタグでは未登録の判定はバリッドビットが無効の「０」か否かで行う。しかし、L2キャッシュタグでは、コア別に投機エントリフラグを有するので、あるコアからのデータ登録要求に対して仮登録されると共通のバリッドビットが有効の「１」になる。そのため、コア毎に投機エントリが未登録か否かを判別するためには、バリッドビットだけで判定できない。
【０１１６】
本実施の形態では、L2キャッシュタグのバリッドビットが有効の「１」で、発行元コアの投機エントリフラグが「０」、発行元コア以外のいずれかのコアの投機エントリフラグが仮登録の「１」の場合、発行元コアの投機エントリフラグの「０」を未登録とみなし、投機エントリキャッシュミスと判定される。この点も、後述する図１８で説明する。
【０１１７】
上記の（２）の本登録の判定と、（３）の未登録の判定において、投機エントリフラグSP_EN_FLGが未登録、仮登録、本登録を区別できる場合は、データ登録要求を発行した発行元コアの投機エントリフラグでそれらを区別する判定をしても良い。
【０１１８】
図１８は、コア１から投機実行されるメモリアクセス命令によりデータ登録要求が発行された場合の種々のL2キャッシュタグの状態での、投機エントリキャッシュヒット判定を示す図である。
【０１１９】
まず、状態０（STATE_0）は、バリッドビットが「０」で、各コアの投機エントリフラグも「０」になっているので、コア０とコア１の両方からデータの仮登録も本登録も行われていないことを示す。この状態０に対して、コア１からデータ登録要求が発行されると、L2キャッシュヒット判定部がL2キャッシュミスと判定し、メモリアクセスが実行される。
【０１２０】
次の、状態１（STATE_1）では、バリッドビットが「１」で、コア０の投機エントリフラグが「１」でその分岐命令IIDには「0xA」が登録され、コア１の投機エントリフラグは「１」でその分岐命令IIDは「0xB」が登録されている。この状態１は、後述する状態３のとき、コア１が投機LOAD2により、L2キャッシュにデータを仮登録した状態である。この状態１のときにコア１から投機LOAD3によってデータ登録要求が発行された場合、L2キャッシュでは、L2キャッシュヒット判定され、投機エントリキャッシュヒット判定部は、図１７の工程S43により、図９または図１２の論理回路によりヒット判定またはミス判定になる。
【０１２１】
また、状態２（STATE_2）では、バリッドビットが「１」で、コア０の投機エントリフラグが「０」でその分岐命令IIDは無効な状態が登録され、コア１の投機エントリフラグは「１」でその分岐命令IIDは「0xB」が登録されている。この場合は、発行元のコア１については、仮登録状態であるので、状態１と同様に、図１７の工程S43により投機エントリキャッシュヒット判定される。
【０１２２】
一方、状態３（STATE_3）では、バリッドビットが「１」で、コア０の投機エントリフラグが「１」でその分岐命令IIDには「0xA」が登録され、コア１の投機エントリフラグは「０」でその分岐命令IIDは無効な情報である。これは、状態０からコア０が投機LOAD2により、L2キャッシュにデータを仮登録した状態である。この状態３のときにコア１から投機LOAD3によってデータ登録要求が発行された場合、コア１に対するL2キャッシュの状態は未登録であるので、L2キャッシュでの投機エントリキャッシュヒット判定は、図１７の工程S45により、ミス判定になる。つまり、L2キャッシュヒット判定が否定される結果になる。
【０１２３】
そして、状態４（STATE_4）は、バリッドビットが「１」で、コア０とコア１の投機エントリフラグが共に「０」でそれらの分岐命令IIDは無効な情報である。この状態４は、状態１（STATE_1）で、いずれかのコア（例えばコア１）からのデータ登録要求で本登録され、コア１の投機エントリフラグが「０」にされた状態に該当する。
【０１２４】
この場合、コア１の投機エントリフラグだけを「０」にすると、状態３のL2キャッシュタグの状態と同じになる。そこで、状態３（STATE_3）の未登録と区別するために、コア０とコア１の投機エントリフラグが共に「０」にされ、バリッドビット「１」との組み合わせから、本登録と認識できるようにする。また、この状態４は、状態３（STATE_3）のときにコア１からのデータ登録要求で投機エントリフラグが「０」と本登録された状態にも該当する。状態４の場合、L2キャッシュでは本登録状態であるので、投機エントリキャッシュヒット判定部は、図１７の工程S46により、ヒット判定をする。
【０１２５】
L2キャッシュに本登録されると、もはや仮登録に対する投機エントリキャッシュヒット判定は不要になるので、全コアに対する投機エントリフラグを「０」にしても問題はない。
【０１２６】
［マルチコアのL1、L2キャッシュの処理例Ａ］
図１９は、マルチコアの場合のL1,L2キャッシュでの処理例Ａのシーケンスを示す図である。この例Ａでは、最初にキャッシュをフラッシュ（全て無効化）した後、コア０が投機LOAD2を実行し、コア０でL1,L2キャッシュに仮登録する。その後、コア０が投機LOAD3を同じアドレスに実行し、コア０のL1,L2キャッシュに仮登録する。
【０１２７】
この場合、キャッシュフラッシュされているので、コア０の投機LOAD2の発行に応答して、L1キャッシュでキャッシュミスし（L1$_miss）、データ登録要求がL2キャッシュに発行され、L2キャッシュでもキャッシュミスし（L2$_miss）する。メモリアクセス後、L2キャッシュタグのコア０に仮登録（SP_EN_FLG=1, IID=0xA）し、コア０のL1キャッシュタグに仮登録（SP_EN_FLG=1, IID=0xA）する。
【０１２８】
次に、コア１の投機LOAD3の発行に応答して、L1キャッシュヒットするが、L1投機エントリキャッシュミス（L1$_SP_miss）し、データ登録要求がL2キャッシュに発行される。L2キャッシュでは、L2キャッシュタグのコア０の投機エントリフラグが仮登録「１」であるので、L2投機エントリキャッシュミスし（L2$_SP_miss）、メモリアクセスが実行される。その後、L2キャッシュタグのコア０に仮登録（SP_EN_FLG=1,IID=0xB）し、コア０のL1キャッシュタグに仮登録（SP_EN_FLG=1, IID=0xB）する。
【０１２９】
この例では、L2キャッシュタグの分岐命令のIIDが0xBに更新される処理である。
【０１３０】
［マルチコアのL1、L2キャッシュの処理例Ｂ］
図２０は、マルチコアの場合のL1,L2キャッシュでの処理例Ｂのシーケンスを示す図である。この例では、最初にキャッシュをフラッシュ（全て無効化）した後、コア０が投機LOAD2を実行し、コア０でL1,L2キャッシュに仮登録する。その後、コア１が投機LOAD3を同じアドレスに実行し、コア１のL1,L2キャッシュに仮登録する。
【０１３１】
コア０の投機LOAD2の発行に対する処理は、図１９の処理Ａと同じである。その後のコア１の投機LOAD3の発行に応答して、L1キャッシュミスし、データ登録要求がL2キャッシュに発行される。L2キャッシュでは、L2キャッシュヒット（L2$_hit）するが、L2キャッシュタグのコア１の投機エントリフラグが「０」であるので、全コアの投機エントリフラグSP_EN_FLGの論理和（OR）が判定され、論理和ORが「１」であるので、コア１については未登録であると判定される。これに基づいて、L2投機エントリキャッシュミスし（L2$_SP_miss）、メモリアクセスが実行される。その後、L2キャッシュタグのコア１に仮登録（SP_EN_FLG=1, IID=0xB）し、コア１のL1キャッシュタグに仮登録（SP_EN_FLG=1,IID=0xB）する。
【０１３２】
［マルチコアのL1、L2キャッシュの処理例Ｃ−１］
図２１は、マルチコアの場合のL1,L2キャッシュでの処理例Ｃ−１のシーケンスを示す図である。この例では、最初にキャッシュをフラッシュ（全て無効化）した後、コア０が投機LOAD2を実行し、コア０でL1,L2キャッシュに仮登録する。その後、コア１が非投機LOAD3を同じアドレスに実行し、コア１のL1,L2キャッシュに本登録する。
【０１３３】
コア０の投機LOAD2の発行に対する処理は、図１９の処理Ａと同じである。その後のコア１の非投機LOAD3の発行に応答して、L1キャッシュミスし、データ登録要求がL2キャッシュに発行される。L2キャッシュでは、L2キャッシュヒット（L2$_hit）するが、L2キャッシュタグのコア１の投機エントリフラグが「０」であるので、全コアの投機エントリフラグSP_EN_FLGの論理和（OR）が判定され、論理和ORが「１」であるので、コア１については未登録であると判定される。これに基づいて、L2投機エントリキャッシュミスし（L2$_SP_miss）、メモリアクセスが実行される。その後、L2キャッシュタグのコア１に本登録（SP_EN_FLG=0, IID=0xB）し、コア１のL1キャッシュタグに本登録（SP_EN_FLG=0,IID=0xB）する。更に、L2キャッシュタグのコア０にも本登録（SP_EN_FLG=0, IID=0xA）する。これで、L2キャッシュは本登録状態になる。
【０１３４】
［マルチコアのL1、L2キャッシュの処理例Ｃ−２］
図２２は、マルチコアの場合のL1,L2キャッシュでの処理例Ｃ−２のシーケンスを示す図である。この例では、最初にキャッシュをフラッシュ（全て無効化）した後、コア０が投機LOAD2を実行し、コア０でL1,L2キャッシュに仮登録する。その後、コア０が非投機LOAD3（分岐命令IID=0xC）を投機LOAD2と同じアドレスに実行し、コア０のL1,L2キャッシュに本登録する。
【０１３５】
コア０の投機LOAD2の発行に対する処理は、図１９の処理Ａと同じである。その後のコア０の非投機LOAD3の発行に応答して、L1キャッシュヒットし（L1$_hit）、L1タグの投機エントリフラグが「１」であるので、L1投機エントリキャッシュミス（L1$_SO_miss）する。これにより、データ登録要求がL2キャッシュに発行される。L2キャッシュでは、L2キャッシュヒット（L2$_hit）し、L2キャッシュタグのコア０の投機エントリフラグが「１」で仮登録であるので、図１７のS43の処理により、L2投機エントリキャッシュミスし（L2$_SP_miss）、メモリアクセスが実行される。その後、L2キャッシュタグのコア０に本登録（SP_EN_FLG=0, IID=0xC）し、コア０のL1キャッシュタグに本登録（SP_EN_FLG=0,IID=0xC）する。更に、L2キャッシュタグのコア１にも本登録（SP_EN_FLG=0）にする。これで、L2キャッシュは本登録状態になる。
【０１３６】
［マルチコアのL1、L2キャッシュの処理例Ｄ］
図２３は、マルチコアの場合のL1,L2キャッシュでの処理例Ｄのシーケンスを示す図である。この例では、図２０の処理Ｂの後、コア０が非投機LOAD3（IID=0xC）を処理Ｂと同じアドレスに実行し、コア０のL1,L2キャッシュに本登録する。
【０１３７】
図２０の終了状態で、コア０の非投機LOAD3の発行に応答して、L1キャッシュヒット（L1$_hit）し、L1タグの投機エントリフラグが「１」の仮登録であるので、L1投機エントリキャッシュミスと判定される（L1$_SP_miss）。これにより、データ登録要求がL2キャッシュに発行される。L2キャッシュでは、L2キャッシュヒット（L2$_hit）するが、L2キャッシュタグのコア０の投機エントリフラグが「１」で仮登録であるので、L2投機エントリキャッシュミスする（L2$_SP_miss）。これにより、メモリアクセスが実行される。その後、L2キャッシュタグのコア０に本登録（SP_EN_FLG=0）し、コア０のL1キャッシュタグに本登録（SP_EN_FLG=0,IID=0xC）する。更に、L2キャッシュタグのコア１にも本登録（SP_EN_FLG=0, IID=0xB）する。これで、L2キャッシュは本登録状態になる。
【０１３８】
［マルチコアの場合の分岐確定処理］
図２４は、マルチコアの場合における分岐確定処理のフローチャート図である。コア０の命令発行部I_ISSのRSBRから送信された分岐命令の分岐予測が確定したことを知らせる分岐確定通知BR_DTRが、コア０のL1キャッシュ制御部L1$_CNT_0のキャッシュ確定制御部CA_DTR_CNT（図６参照）からL2キャッシュ制御部L2$_CNTのキャッシュ確定制御部に送信される（S50）。分岐確定通知BR_DTRには、分岐予測成功／失敗フラグと、分岐命令のIIDとが付加される。
【０１３９】
分岐予測が成功の場合（S51のYES）、L2キャッシュ制御部が、分岐確定通知BR_DTRに付加された分岐命令のIIDで L2キャッシュタグ内に仮登録されたエントリを検索し、その分岐命令IIDとマッチする分岐命令IIDを持つL2キャッシュタグ内のコア０の仮登録中のエントリを、本登録に変更する（S52）。具体的には、分岐確定通知の分岐命令IIDとマッチするL2キャッシュタグのコア０のIIDを検出し、そのマッチしたエントリの全コアの投機エントリフラグを「０」にリセットし、本登録状態にする。
【０１４０】
そして、L2キャッシュ制御部のキャッシュ確定制御部が、コア０のL1キャッシュ制御部のキャッシュ制御部にキャッシュ本登録要求CA_RG_RQを発行する。キャッシュ本登録要求にも分岐命令IIDが付加される。これのキャッシュ本登録要求に応答し、コア０のL1キャッシュ確定部は、L1キャッシュタグ内に仮登録されたエントリを検索し、キャッシュ本登録要求に添付される分岐命令のIIDとL1キャッシュタグ内の分岐命令のIIDとがマッチした仮登録中のエントリを、本登録に変更する（S53）。具体的には、マッチしたエントリの投機エントリフラグを「０」に変更する。
【０１４１】
一方、分岐予測が失敗の場合（S51のNO）、L2キャッシュ制御部のキャッシュ確定制御部が、L2キャッシュタグ内のコア０の仮登録状態の投機エントリフラグを「０」にリセットして、未登録状態にする（S54）。この投機エントリフラグをリセットしたことで、L2キャッシュタグ内の全コアの投機エントリフラグの論理和（OR）が「０」になると（S55のNO）、全コアで未登録状態になるので、L2キャッシュタグの全コアが未登録状態になったエントリのバリッドビットを「０」にして、そのエントリをインバリッド（無効）にする（S58）。これで、図１８の状態３（STATE_3）が、分岐確定後に、状態０（STATE_0）になる。
【０１４２】
また、前述の投機エントリフラグをリセットしたことで、L2キャッシュタグ内の全コアの投機エントリフラグの論理和（OR）が「１」のままだと（S55のYES）、未だ仮登録のコアがあるので、そのエントリの仮登録状態を保持する（S56）。これで、図１８の状態１（STATE_1）が、分岐確定後に、状態２（STATE_2）になる。
【０１４３】
そして、L2キャッシュ制御部のキャッシュ確定制御部が、コア０のL1キャッシュ制御部のキャッシュ制御部にキャッシュ無効化要求CA_INVL_RQを発行する。このキャッシュ無効化要求に応答し、コア０のL1キャッシュ確定部は、L1キャッシュタグ内に仮登録されたエントリを検索し、仮登録中のエントリを無効化し、投機エントリフラグも「０」にリセットする（S57）。
【０１４４】
以上の通り、本実施の形態によれば、投機実行されたメモリアクセス命令に対してメインメモリへのアクセスが発生し、メモリから読み出したデータをキャッシュメモリに登録するとき、通常のタグ情報に仮登録状態の仮登録情報を付加して、キャッシュタグに登録する。そして、その後、仮登録状態のキャッシュエントリにメモリアクセス命令または要求が投入されると、キャッシュヒットの場合でも、投機エントリキャッシュミスにより、メモリアクセスを実行させ、キャッシュレイテンシを隠蔽する。これにより、プロセッサのセキュリティの脆弱性をなくすことができる。
【０１４５】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１４６】
（付記１）
命令を発行する命令発行部と、
複数のキャッシュエントリを有するキャッシュデータメモリ及びキャッシュタグと、前記命令発行部から発行されたメモリアクセス命令に応答して、前記メモリアクセス命令のアドレスに基づくキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合にメモリ側にメモリアクセス要求を発行するキャッシュ制御部とを有する、キャッシュユニットとを有し、
前記キャッシュ制御部は、
前記命令発行部から発行された、投機的実行を示す投機アクセスフラグと分岐命令の識別子（IID）が付加された投機的第１のメモリアクセス命令に応答して、前記メモリアクセス要求を発行したとき、前記メモリアクセス要求により取得したデータを前記キャッシュデータメモリに登録し、前記投機的第１のメモリアクセス命令に付加された前記投機アクセスフラグの投機的実行に基づいて、投機的メモリアクセス命令の実行によりキャッシュ登録されたことを示す仮登録状態の仮登録情報を前記キャッシュタグに登録し、
前記投機的第１のメモリアクセス命令の後に発行され、前記投機的第１のメモリアクセス命令と同じアドレス宛の第２のメモリアクセス命令に応答して、前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合、投機エントリキャッシュミスと判定して前記メモリアクセス要求を発行する、演算処理装置。
【０１４７】
（付記２）
前記キャッシュ制御部は、
前記キャッシュヒット判定がキャッシュヒットの場合、前記キャッシュデータメモリ内のデータを付加したデータ応答を出力し、
前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合に発行した前記メモリアクセス要求に基づいて、前記メモリから読み出したデータを前記キャッシュデータメモリ及び前記キャッシュタグに登録した後、再度入力された前記第２のメモリアクセス命令に応答して、投機エントリキャッシュヒットと判定して前記データ応答を出力する、付記１に記載の演算処理装置。
【０１４８】
（付記３）
前記キャッシュ制御部は、
前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合、前記第２のメモリアクセス命令が非投機的実行されるとき、前記メモリアクセス要求により取得したデータを、前記キャッシュタグ内の前記キャッシュヒットしたエントリの前記仮登録情報を本登録状態に変更してキャッシュ登録する、付記１に記載の演算処理装置。
【０１４９】
（付記４）
前記キャッシュ制御部は、
前記キャッシュヒット判定がキャッシュヒットの場合、前記キャッシュデータメモリ内のデータを付加したデータ応答を出力し、
前記仮登録情報は、前記仮登録状態を示す投機エントリフラグと前記投機的第１のメモリアクセス命令に対する分岐命令の識別子を含み、
前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合、前記キャッシュヒットしたエントリの前記分岐命令の識別子と前記第２のメモリアクセス命令に対する分岐命令の識別子とが一致する場合、投機エントリキャッシュヒットと判定して前記データ応答を出力し、不一致の場合、前記投機エントリキャッシュミスと判定して前記メモリアクセス要求を発行する、付記１に記載の演算処理装置。
【０１５０】
（付記５）
前記キャッシュ制御部は、
前記投機的第１のメモリアクセス命令に付加された分岐命令の識別子と一致する分岐命令が分岐確定したとき、分岐予測成功であれば前記キャッシュタグ内の仮登録状態の仮登録情報を本登録状態に変更し、分岐予測失敗であれば前記キャッシュタグ内の仮登録状態の仮登録情報を有するエントリを無効化する、付記１に記載の演算処理装置。
【０１５１】
（付記６）
更に、前記キャッシュユニットと前記メモリとの間に設けられた第２レベルのキャッシュユニットを有し、
前記第２レベルのキャッシュユニットの第２レベルのキャッシュ制御部は、
前記投機的第１のメモリアクセス命令に応答して発行された前記メモリアクセス要求により取得したデータを、第２レベルのキャッシュデータメモリに登録すると共に、第２レベルのキャッシュタグに前記仮登録状態の仮登録情報を登録し、
前記第２のメモリアクセス命令に応答して発行された前記メモリアクセス要求に応答して、前記投機エントリキャッシュミスと判定して前記メモリアクセス要求を前記メモリに発行する、付記１に記載の演算処理装置。
【０１５２】
（付記７）
前記命令発行部と、第１レベルの前記キャッシュユニットとをそれぞれ有する複数のコアを有し、
前記第２レベルのキャッシュユニットが、前記複数のコアに共通に設けられ、前記複数のコアから前記メモリアクセス要求を発行され、
前記第２レベルのキャッシュユニットの前記第２レベルのキャッシュ制御部は、
前記複数のコアのうち第１のコアから発行された前記メモリアクセス要求に応答して、前記メモリアクセス要求が前記投機的第１のメモリアクセス命令に応じて発行された場合、第２レベルのキャッシュタグに前記第１のコアに対する前記仮登録情報を登録し、
前記複数のコアのうち第２のコアから発行された前記メモリアクセス要求に応答して、前記メモリアクセス要求が前記投機的第１のメモリアクセス命令に応じて発行された場合、第２レベルのキャッシュタグに前記第２のコアに対する前記仮登録情報を登録し、
前記第２のメモリアクセス命令に基づいて発行されたメモリアクセス要求に応答して、前記メモリアクセス要求の発行元コアに対する前記仮登録情報が前記仮登録状態の場合、前記投機エントリキャッシュミスと判定して前記メモリアクセス要求を前記メモリ側に発行する、付記６に記載の演算処理装置。
【０１５３】
（付記８）
前記第２レベルのキャッシュタグは、エントリが登録状態を示すバリッドビットを格納し、
前記第２のキャッシュ制御部は、
前記第２のメモリアクセス命令に基づいて前記第１のコアから発行されたメモリアクセス要求に応答して、前記第２のキャッシュタグに基づいてキャッシュヒットとなった場合、前記第１のコアに対する前記仮登録情報が非仮登録状態の場合、前記第２のコアに対する前記仮登録状態が仮登録状態であれば、投機エントリキャッシュミスと判定し、前記第２のコアに対する前記仮登録状態が非仮登録状態であれば、投機エントリキャッシュヒットと判定する、付記７に記載の演算処理装置。
【０１５４】
（付記９）
分岐予測失敗で分岐確定したとき、
前記第２レベルのキャッシュ制御部は、前記第２レベルのキャッシュタグの分岐確定元コアに対する仮登録状態の仮登録情報を非仮登録状態にリセットし、
前記分岐確定元のコアの前記L1キャッシュ制御部は、前記L1キャッシュタグの仮登録状態の仮登録情報を格納するエントリを無効化し、
分岐予測成功で分岐確定したとき、
前記第２レベルのキャッシュ制御部は、前記第２レベルのキャッシュタグの分岐確定元コアに対する前記仮登録情報が仮登録状態であり、前記分岐確定した分岐命令の識別子と一致する分岐命令の識別子が格納されているエントリを、本登録状態に変更し、
前記分岐確定元のコアの前記L1キャッシュ制御部は、前記分岐確定元のコアの前記L1キャッシュタグの前記仮登録情報が仮登録状態であり、前記分岐確定した分岐命令の識別子と一致する分岐命令の識別子が格納されているエントリを、本登録状態に変更する、付記７に記載の演算処理装置。
【０１５５】
（付記１０）
前記分岐予測失敗で分岐確定したとき、
前記第２のキャッシュ制御部は、
前記第２レベルのキャッシュタグの分岐確定元コアに対する仮登録状態の仮登録情報を非仮登録状態にリセットしたとき、前記分岐確定元コアとは異なるコアに対する仮登録情報も仮登録状態の場合、前記第２レベルのキャッシュタグのエントリを無効化する、付記８に記載の演算処理装置。
【０１５６】
（付記１１）
命令を発行する命令発行部と、
複数のキャッシュエントリを有するキャッシュデータメモリ及びキャッシュタグと、前記命令発行部から発行されたメモリアクセス命令に応答して、前記メモリアクセス命令のアドレスに基づくキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合にメモリ側にメモリアクセス要求を発行するキャッシュ制御部とを有する、キャッシュユニットとを有する演算処理装置の制御方法であって、
前記キャッシュ制御部は、
前記命令発行部から発行された、投機的実行を示す投機アクセスフラグと分岐命令の識別子が付加された投機的第１のメモリアクセス命令に応答して、前記メモリアクセス要求を発行したとき、前記メモリアクセス要求により取得したデータを前記キャッシュデータメモリに登録し、前記投機的第１のメモリアクセス命令に付加された前記投機アクセスフラグの投機的実行に基づいて、投機的メモリアクセス命令の実行によりキャッシュ登録されたことを示す仮登録状態の仮登録情報を前記キャッシュタグに登録し、
前記投機的第１のメモリアクセス命令の後に発行され、前記投機的第１のメモリアクセス命令と同じアドレス宛の第２のメモリアクセス命令に応答して、前記キャッシュタグ内のキャッシュヒットしたエントリの前記仮登録情報が前記仮登録状態の場合、投機エントリキャッシュミスと判定して前記メモリアクセス要求を発行する、演算処理装置の制御方法。
【符号の説明】
【０１５７】
I_ISS：命令発行部
L1$_CNT：L1キャッシュ制御部
L1$_TAG：L1キャッシュタグ
L1$_H_JDG：L1キャッシュヒット判定部
L1_EN_H_JDG：L1エントリキャッシュヒット判定部
L1$_DA_RAM：L1キャッシュデータメモリ
L2$_CNT：L2キャッシュ制御部
M_MEM：メインメモリ
SP_AC_INF：投機アクセス情報
SP_AC_FLG：投機アクセスフラグ
BR_IID：直前の分岐命令の命令識別子IID
SP_DA_RQ_FLG：投機データ要求済フラグ
PRV_RG_INF：仮登録情報
SP_EN_FLG：投機エントリフラグ
SP_EN_H_JDG：投機エントリヒット判定部
CA_DTR_CNT：キャッシュ確定制御部
【図１】
2019212129.tif 000003
【図２】
2019212129.tif 000004
【図３】
2019212129.tif 000005
【図４】
2019212129.tif 000006
【図５】
2019212129.tif 000007
【図６】
2019212129.tif 000008
【図７】
2019212129.tif 000009
【図８】
2019212129.tif 000010
【図９】
2019212129.tif 000011
【図１０】
2019212129.tif 000012
【図１１】
2019212129.tif 000013
【図１２】
2019212129.tif 000014
【図１３】
2019212129.tif 000015
【図１４】
2019212129.tif 000016
【図１５】
2019212129.tif 000017
【図１６】
2019212129.tif 000018
【図１７】
2019212129.tif 000019
【図１８】
2019212129.tif 000020
【図１９】
2019212129.tif 000021
【図２０】
2019212129.tif 000022
【図２１】
2019212129.tif 000023
【図２２】
2019212129.tif 000024
【図２３】
2019212129.tif 000025
【図２４】
2019212129.tif 000026