(57)【要約】      （修正有）【課題】セキュリティ脆弱性を突いた攻撃に対して投機実行を抑止する場合に、性能劣化を抑えることを目的とする。【解決手段】演算処理装置は、命令デコード部とリザベーションステーションと、投入された命令コードが演算命令である場合、演算に演算命令の書き込み先の演算用のレジスタを使用し、投入された命令コードがメモリアクセス命令である場合、アドレス計算には汎用レジスタを使用し、命令の完了時にレジスタ更新用バッファに一旦書き込まれた演算結果及びロードデータをレジスタ更新用バッファからレジスタに書き込む演算実行部を備える。リザベーションステーションは、演算実行部にメモリアクセス命令を発行するときは、メモリアクセス命令が完了するまで、後続命令を演算実行部に発行することを待機し、演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を演算実行部に発行する。【選択図】図２
2019212152.tif 000002
【特許請求の範囲】
【請求項１】
命令をデコードした結果である命令コードを出力するデコード部と、
前記命令コードを蓄積し、演算実行部へ投入できる命令コードから選択して投入するリザベーションステーションと、
投入された前記命令コードが演算命令である場合、演算に前記演算命令の書き込み先の演算用のレジスタを使用し、前記投入された前記命令コードがメモリアクセス命令である場合、アドレス計算に前記レジスタを使用し、命令の完了時にレジスタ更新用のバッファに一旦書き込まれた演算結果及びロードデータを前記バッファから前記レジスタに書き込む演算実行部と、
を備え、
前記リザベーションステーションは、
前記演算実行部に前記メモリアクセス命令を発行するときは、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機し、
前記演算実行部に前記演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を前記演算実行部に発行する、
ことを特徴とする、演算処理装置。
【請求項２】
前記リザベーションステーションは、前記メモリアクセス命令が投機的であるか否かを、先行の命令の状態に応じて判断して、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機することを特徴とする、請求項１記載の演算処理装置。
【請求項３】
前記デコード部は、
前記命令を解釈する際に、前記命令がメモリアクセス命令であるか、或いは、演算命令であるかを区別するための情報を、前記リザベーションステーションにセットし、
前記レジスタに対して前記バッファを割り当てることを特徴とする、請求項１又は２記載の演算処理装置。
【請求項４】
前記メモリアクセス命令は、前記バッファを参照せず、前記レジスタを参照して演算を実行し、前記バッファから前記レジスタへの書き込みは、命令の完了後に、当該命令が既に投機的でなくキャンセルされないことが確定してから行い、
先行の命令が完了することなく投機実行がキャンセルされた場合は、前記メモリアクセス命令は前記リザベーションステーションから発行されずにキャンセルされ、投機的なデータキャッシュへのアクセスを抑止する、
ことを特徴とする、請求項１乃至３のいずれか１項記載の演算処理装置。
【請求項５】
前記デコード部が前記レジスタに対して割り当てた前記バッファの第１の番号を記録するテーブルを有するレジスタ管理部と、
命令を本来の順序に従って完了させるリオーダバッファをと更に備え、
前記リオーダバッファは、前記デコード部から第２の番号を受け取り、前記レジスタ管理部から前記第１の番号を受け取り、命令完了時に前記演算実行部に前記第２の番号と前記第１の番号を送り、
前記演算実行部は、前記バッファのデータを前記レジスタに書き込み、命令完了時の処理を行うことで、前記レジスタに演算及びロードの結果を、ソフトウェアから観測可能に反映する、
ことを特徴とする、請求項１乃至４のいずれか１項記載の演算処理装置。
【請求項６】
デコード部とリザベーションステーションと演算実行部とを有する演算処理装置の制御方法であって、
前記デコード部が、命令をデコードした結果である命令コードを出力し、
前記リザベーションステーションが、命令を解釈した命令コードを蓄積し、前記演算実行部へ投入できる命令コードから選択して投入し、
前記演算実行部が、投入された前記命令コードが演算命令である場合、演算に前記演算命令の書き込み先の演算用のレジスタを使用し、前記投入された前記命令コードがメモリアクセス命令である場合、アドレス計算に前記レジスタを使用し、レジスタ更新用のバッファに一旦書き込まれた演算結果及びロードデータを命令の完了時に前記バッファから前記レジスタに書き込み、
前記リザベーションステーションが、前記演算実行部に前記メモリアクセス命令を発行するときは、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機し、
前記リザベーションステーションが、前記演算実行部に前記演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を前記演算実行部に発行する、
ことを特徴とする、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
セキュリティ脆弱性の指摘を契機に、ＣＰＵ（Central Processing Unit）等の演算処理装置（又は、プロセッサ）のセキュリティに対する関心が高まっている。セキュリティ脆弱性のうち、例えばスペクタ（Spectre）と呼ばれる攻撃は、（１）誤った経路の分岐先を実行させることで、プログラムの動作によって保護されている領域のアドレスに対して、ハードウェアが投機的にメモリアクセスを行ってデータを読み出し、（２）読み出したデータをアドレスに変換してメモリアクセスを行う、という手順を含む。上記（１），（２）の手順は、分岐予測ミスによる誤った経路に対する投機的な実行であるため最終的にはキャンセルされるが、上記（２）の手順におけるメモリアクセスの痕跡がキャッシュに残ってしまう。メモリアクセスの痕跡がデータキャッシュに残っていると、メモリアクセスの実行時間から上記（１）の手順で読み出したデータの内容を推定することができてしまう。
【０００３】
投機実行のハードウェア動作を止めれば、上記スペクタの如き攻撃は阻止できる。しかし、上記スペクタの如き攻撃への対策として投機実行を抑止すると、演算処理装置の性能が著しく劣化してしまう。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平３−２４０１３１号公報
【非特許文献】
【０００５】
【非特許文献１】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>
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従来、セキュリティ脆弱性を突いた攻撃に対して投機実行を抑止すると、演算処理装置の性能が著しく劣化してしまう。
【０００７】
そこで、１つの側面では、セキュリティ脆弱性を突いた攻撃に対して投機実行を抑止する場合に、性能劣化を抑えることができる演算処理装置及び演算処理装置の制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
１つの案によれば、命令をデコードした結果である命令コードを出力するデコード部と、前記命令コードを蓄積し、演算実行部へ投入できる命令コードから選択して投入するリザベーションステーションと、投入された前記命令コードが演算命令である場合、演算に前記演算命令の書き込み先の演算用のレジスタを使用し、前記投入された前記命令コードがメモリアクセス命令である場合、アドレス計算に前記レジスタを使用し、命令の完了時にレジスタ更新用のバッファに一旦書き込まれた演算結果及びロードデータを前記バッファから前記レジスタに書き込む演算実行部と、を備え、前記リザベーションステーションは、前記演算実行部に前記メモリアクセス命令を発行するときは、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機し、前記演算実行部に前記演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を前記演算実行部に発行する、演算処理装置が提供される。
【発明の効果】
【０００９】
一態様によれば、セキュリティ脆弱性を突いた攻撃に対して投機実行を抑止する場合に、性能劣化を抑えることができる。
【図面の簡単な説明】
【００１０】
【図１】演算処理装置のリザベーションステーション周辺の構成の一例を示すブロック図である。
【図２】一実施例における演算処理装置の構成の一例を示すブロック図である。
【図３】リオーダバッファと命令完了の一例を説明する図である。
【図４】エントリを選択する処理を説明するフローチャートである。
【図５】GUB_READY信号を生成する回路の一例を示す図である。
【図６】GPR_VALID信号を生成する回路の一例を示す図である。
【図７】READY信号を生成する回路の一例を示す図である。
【図８】リザベーションステーションの構成の一例を示す図である。
【図９】READY信号を生成する処理を説明するフローチャートである。
【発明を実施するための形態】
【００１１】
開示の演算処理装置及び演算処理装置の制御方法では、リザベーションステーションが、メモリアクセス命令と演算命令とを区別し、抑止対象をメモリアクセス命令に絞り、演算命令は投機的に実行可能とする。リザベーションステーションは、メモリアクセス命令が投機的であるか否かを、先行命令の状態に応じて判断する。演算実行部にメモリアクセス命令を発行するときは、先行命令の処理が完了するまで、後続命令を演算実行部に発行することを待機する。また、リザベーションステーションは、演算実行部に演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクル以降で、後続命令を演算実行部に発行する。
【００１２】
以下に、開示の演算処理装置及び演算処理装置の制御方法の各実施例を図面と共に説明する。
【実施例】
【００１３】
図１は、演算処理装置のリザベーションステーション（ＲＳ：Reservation Station）周辺の構成の一例を示すブロック図である。リザベーションステーション１１は、命令コードを蓄積するキューで、準備が整った命令コードから投機的に固定小数点演算器１２、アドレス計算演算器１３、及びデータキャッシュ１４に発行する。
【００１４】
スペクタ（Spectre）と呼ばれる攻撃は、
（１）誤った経路の分岐先を実行させることで、プログラムの動作によって保護されているアクセス禁止領域のアドレスに対して、ハードウェアが投機的にメモリアクセスを行ってデータを読み出し、（２）読み出したデータをアドレスに変換してメモリアクセスを行う、という手順を含む。アクセス禁止領域は、例えばオペレーティングシステム（ＯＳ：Operating System）により設定されている。この投機的なメモリアクセスは、ハードウェアが投機的に実行した、本来は実行されない命令であるため、上記（１），（２）の手順は、最終的にはキャンセルされるが、上記（２）の手順におけるメモリアクセスの痕跡がキャッシュに残ってしまう。メモリアクセスの痕跡がデータキャッシュに残っていると、メモリアクセスの実行時間から上記（１）の手順で読み出したデータの内容を推定することができてしまう。
【００１５】
しかし、スペクタの如き攻撃への対策として投機実行を抑止すると、演算処理装置の性能が著しく劣化してしまう。そこで、一実施例では、上記（２）の手順におけるメモリアクセスの投機実行を、リザベーションステーション１１で抑止するようにする。具体的には、上記（１）の手順におけるロード命令の完了、即ち、投機的なメモリアクセスでキャンセルされるか否かの判断を待つようにする。投機的なメモリアクセスがキャンセルされない場合は、上記（１）の手順も上記（２）の手順も実行されるべきロード命令である。これに対し、投機的なメモリアクセスがキャンセルされる場合は、上記（２）の手順におけるメモリアクセスを行う前に投機実行がキャンセルされるので、データキャッシュ１４にメモリアクセスの痕跡が残らない。このため、メモリアクセスの痕跡を用いて、メモリアクセスの実行時間から上記（１）の手順で読み出したデータの内容を推定することはできない。
【００１６】
リザベーションステーション１１は、命令コードがメモリアクセス命令であるか、或いは、演算命令であるかを区別し、抑止対象をメモリアクセス命令のみに絞り、演算命令等のメモリアクセス以外の命令は投機的に実行可能とする。また、リザベーションステーション１１は、メモリアクセス命令が投機的であるか否かを、先行の命令の状態に応じて判断するため、先行の命令が完了（以下、「命令完了」とも言う）している場合は、投機的であるか否かの判断待ちの時間は発生しない。これにより、セキュリティ脆弱性に対する対策を取る場合に、演算処理装置の性能劣化を抑えることができる。言い換えると、セキュリティ脆弱性を突いた攻撃に対して投機実行を部分的に抑止する場合に、演算処理装置の性能劣化を抑えることができる。なお、命令完了の定義については後述する。
【００１７】
図２は、一実施例における演算処理装置の構成の一例を示すブロック図である。図２は、演算処理装置の一例であるプロセッサ１の、プロセッサコアを示す。プロセッサ１は、リザベーションステーション１１、データキャッシュ１４、命令キャッシュ１５、命令バッファ１６、デコード部１７、レジスタ管理部１８、リオーダバッファ１９、及び演算実行部２０を有する。演算実行部２０は、固定小数点演算器１２と、アドレス計算演算器１３と、レジスタ部２１とを含む。
【００１８】
命令キャッシュ１５は、命令を格納し、命令バッファ１６は、命令キャッシュ１５に格納された命令を蓄積する。デコード部１７は、命令バッファ１６に蓄積された命令を解釈し（即ち、命令解釈を行い）、リザベーションステーション１１への命令コードの投入を行う。つまり、デコード部１７は、命令をデコードした結果である命令コードを出力する。リザベーションステーション１１は、命令解釈された命令コードを蓄積する。
【００１９】
リザベーションステーション１１は、演算実行部２０内の固定小数点演算器１２及びアドレス計算演算器１３へ命令コードを投入するか否かを判断する。リザベーションステーション１１は、本来のプログラムの命令順序（インオーダ）ではなく、演算実行部２０へ投入できる命令コードから選択し固定小数点演算器１２又はアドレス計算演算器１３へアウトオブオーダで投入することができる。また、リザベーションステーション１１は、後述するＧＵＢ番号及びＧＰＲ番号を演算実行部２０内のレジスタ部２１へ送る。ＧＵＢ番号は、第１の番号の一例であり、ＧＰＲ番号は、第２の番号の一例である。
【００２０】
演算実行部２０のレジスタ部２１は、固定小数点演算用の汎用レジスタであるＧＰＲ（General-Purpose Register）２１１と、演算速度の向上のために設けられた汎用レジスタ更新用のバッファであるＧＵＢ（GPR Update Buffer）２１２とを含む。演算実行部２０は、リザベーションステーション１１が選択して投入した命令コードが、演算命令であると演算にＧＰＲ２１１を使用し、メモリアクセス命令であるとアドレス計算にＧＰＲ２１１を使用する。ＧＰＲ２１１は、ＧＵＢ２１２を含んでも良い。演算結果やロードデータは、一旦ＧＵＢ２１２に書き込まれ、命令の完了時にＧＵＢ２１２からＧＰＲ２１１に書き込まれる。演算命令の演算にＧＵＢ２１２を使用することはできるが、メモリアクセス命令のアドレス計算にＧＵＢ２１２を使用することはできない。
【００２１】
具体的には、演算命令の場合、ＧＵＢ２１２若しくはＧＰＲ２１１のデータを読んで固定小数点演算器１２の演算に用いる。メモリアクセス命令（ロード／ストア命令）の場合、ＧＰＲ２１１のデータを読んでアドレス計算演算器１３のアドレス計算に用い、計算したメモリアドレスをデータキャッシュ１４に入力してデータを読み出す。データキャッシュ１４から読み出したデータは、ＧＵＢ２１２に一旦書き込まれ、命令の完了時にＧＵＢ２１２からＧＰＲ２１１に書き込まれる。なお、パイプラインの後でキャッシュミスしても、ＧＰＲ２１１のデータさえ読めれば命令の投機実行は可能である。
【００２２】
固定小数点書き込みデータは、固定小数点演算器１２からレジスタ部２１へ送られる。固定小数点読み出しデータは、レジスタ部２１から固定小数点演算器１２へ送られると共に、アドレス計算演算器１３へ送られる。データキャッシュ１４からのロードデータは、レジスタ部２１へ送られる。
【００２３】
デコード部１７は、演算命令の書き込み先のＧＰＲ２１１に対して、ＧＵＢ２１２を割り当てる。レジスタ管理部１８は、この例ではデコード部１７が割り当てたＧＵＢ２１２のＵＢＡ（Update Buffer Address）を記録するＧＰＲＴ（GPR Pending Register Table）を有する。ＧＵＢ２１２のＵＢＡは、ＧＵＢ番号の一例である。命令コードは、デコード部１７からリザベーションステーション１１に発行される際に、レジスタ管理部１８内の、ＧＰＲ番号で指定された書き込み先のＧＰＲ２１１に対応したＧＰＲＴのエントリにＵＢＡを登録すると共に、演算に使用するＧＰＲ番号のＧＰＲ２１１に対応したＧＰＲＴのエントリに登録されたＵＢＡ（即ち、ＧＵＢ番号）を読み出す。つまり、レジスタ管理部１８のＧＰＲＴにＧＵＢ番号が登録されている場合、命令コードはＧＵＢ番号のＧＵＢ２１２を参照し、ＧＵＢ番号が登録されていない場合、命令コードはＧＰＲ番号で指定されたＧＰＲ２１１を参照し、命令が実行される。また、命令の完了時にＧＵＢ２１２のデータはＧＰＲ２１１に書き込まれるため、レジスタ管理部１８のＧＰＲＴのＧＵＢ番号は、セットした命令が完了した時に無効となる。このため、リザベーションステーション１１は、保持しているＧＵＢ番号を破棄し、演算実行部２０は、ＧＰＲ番号のＧＰＲ２１１を参照して命令コードを実行する。
【００２４】
ロード命令が実行される際のパイプラインステージは、以下に説明するサイクルを含む。
【００２５】
デコード（Ｄ：Decode）サイクルでは、命令をデコードし、リザベーションステーション１１へ送る。
【００２６】
プライオリティ（Ｐ：Priority）サイクルでは、リザベーションステーション１１からアドレス計算演算器１３へ投入する命令を決定する。命令がリザベーションステーション１１に滞留している場合は、Ｐサイクルに移行しない。
【００２７】
バッファ（Ｂ：Buffer）サイクルでは、演算に必要なデータを決定する。Ｂサイクルでは、ＧＰＲ２１１の読み出しも行う。
【００２８】
アドレス（Ａ：Address）サイクルでは、アドレス計算を実行し、生成したアドレスをデータキャッシュ１４へ送る。
【００２９】
タグリード（Ｔ：Tag read）サイクルでは、データキャッシュ１４のタグを引く。
【００３０】
タグマッチ（Ｍ：tag Match）サイクルでは、データキャッシュ１４のタグマッチを行い、キャッシュヒットの判定、或いは、キャッシュミスの判定を行う。判定結果がキャッシュミスであると、Ａサイクルに戻る。なお、判定結果がキャッシュミスであると、Ｄサイクルに戻るようにしても良い。
【００３１】
リザルト（Ｒ：Result）サイクルでは、キャッシュヒットしたデータを、ＧＵＢ２１２へ書き込む。
【００３２】
コミット（Ｃ：Commit）サイクルでは、命令完了の判定を行う。命令完了は、本来の命令順序に従うので、先行の命令が完了（コミット）していない場合は、Ｃサイクルに移行しない。
【００３３】
ライト（Ｗ：Write）サイクルでは、ＧＵＢ２１２のデータをＧＰＲ２１１に書き込み、ＵＢＡを破棄する。
【００３４】
Ｂサイクルでは、ＧＵＢ２１２又はＧＰＲ２１１を参照した結果を選択する。即値を使う場合や、演算器１２，１３やロード命令からのバイパスを行う場合等のデータ選択も、このＢサイクルで行う。ＧＵＢ２１２のデータは、命令完了の処理を行うＷサイクルでＧＰＲ２１１に書き込まれる。空いたＧＵＢ２１２のエントリは、後続の命令に割り当てられるため、命令が完了した時点からそのＧＵＢ２１２のエントリを参照してはならない。このため、リザベーションステーション１１は、各エントリに演算がＧＰＲ２１１を参照するか否かを示すGPR_VALID信号を保持している。GPR_VALID信号が「１」の場合は、ＢサイクルでＧＰＲ２１１の読み出しデータを選択する。一方、GPR_VALID信号が「０」の場合は、バイパスデータ又はＧＵＢ２１２のデータを選択する。GPR_VALID信号は、ＧＰＲＴにＵＢＡと共に保持されており、ＵＢＡの割り当て時に「０」がセットされ、命令の完了時に「１」がセットされる。リザベーションステーション１１への登録は、ＧＰＲＴの参照時にＵＢＡと併せて行う。リザベーションステーション１１でのGPR_VALID信号のセットは、ＧＰＲＴと同様に命令の完了時に行う。
【００３５】
プロセッサ１は、アウトオブオーダで処理を行い、命令の実行は実際のプログラムの命令順序とは異なっても良いが、命令の完了は本来の命令順序に従ってインオーダで行われる。このため、命令の演算実行から命令の完了までは、即座に行われる場合も、先行の命令の命令実行を待つ場合等のように間が空く場合もある。
【００３６】
リオーダバッファ１９は、アウトオブオーダで命令コードを投入しても良いが、命令コードを本来の順序に従ってインオーダで完了させる。リオーダバッファ１９は、デコード部１７からＧＰＲ番号と、レジスタ管理部１８からＧＵＢ番号とを受け取る。また、リオーダバッファ１９は、命令完了時に、ＧＰＲ番号とＧＵＢ番号を演算実行部２０へ送る。更に、リオーダバッファ１９は、完了した命令の書き込み先ＵＢＡであるW_UBAをリザベーションステーション１１へ送る。演算実行部２０は、ＧＵＢ番号のＧＵＢ２１２のデータを、ＧＰＲ番号のＧＰＲ２１１に書き込む。この命令完了時の処理を行うことで、ＧＰＲ２１１に演算やロードの結果が反映される。つまり、ＧＰＲ２１１に演算やロードの結果が、ソフトウェアから観測可能に反映される。
【００３７】
図３は、リオーダバッファと命令完了の一例を説明する図である。図３に示す例では、説明の便宜上、リオーダバッファ１９が４つのエントリを有する。
【００３８】
命令を完了して良いか否かの判断には、固定小数点演算器１２からの演算終了通知やデータキャッシュ１４からのメモリアクセス終了通知等の、終了通知を使う。リオーダバッファ１９は、終了通知を受け取ったエントリを先頭から順に完了させて行く。図３中、終了通知を受け取ったエントリには「終了」と付す。リオーダバッファ１９は、例えばＦＩＦＯ（First-In-First-Out）キューで形成されており、先頭から順に完了処理を行う。図３の上部に示す例ＥｘＡでは、先頭が命令Ｉ１で命令Ｉ１は終了通知を受け取っているので、命令Ｉ１は完了できる。同時に複数の命令が完了できる場合は、命令Ｉ２は命令Ｉ１が終了しているので同時に完了できる。図３の上部に示す例ＥｘＢでは、命令Ｉ２は終了通知を受け取っているが、命令Ｉ１が終了していないので、命令Ｉ２は完了できない。図３の上部に示す例ＥｘＣでは、命令Ｉ１は終了しており先頭なので完了できるが、命令Ｉ３は命令Ｉ２が終了通知を受け取っていないので、命令Ｉ３自体は終了通知を受け取っているにも関わらず完了できない。なお、参考までに上記の例ＥｘＡ，ＥｘＢ，ＥｘＣ夫々の次の状態を、図３の下部に示す。夫々完了した命令は、キューから追い出されるので、その分が繰り下がり先頭位置が示す命令が変わっている。例ＥｘＢの次の状態では命令が完了していないので、例ＥｘＢの状態と、例ＥｘＢの次の状態とは同じである。
【００３９】
一実施例では、リザベーションステーション１１が各エントリに対して保持するGPR_VALID信号を使用してメモリアクセス命令の発行抑止を行う。リザベーションステーション１１は、メモリアクセス命令だけではなく、演算命令も蓄積するが、メモリアクセス命令と演算命令を区別するために、各エントリに対してMEM_INSTフラグを保持している。各エントリに対するMEM_INSTフラグは、対応するエントリに対するGUB_READY信号が立って例えば「１」になっても、対応するエントリに対するREADY信号を有効、即ち、この例では「１」にしないために設けられるフラグである。各エントリに対するGUB_READY信号は、ＧＵＢ２１２の対応するエントリからデータを読み出せるか否かを示す。エントリに対するMEM_INSTフラグが「１」の時は、当該エントリの命令がメモリアクセス命令であることを示す。デコード部１７は、命令を解釈する際に、このMEM_INSTフラグをセットするか否か、即ち、「１」にセットするか、或いは、「０」にリセットするかを判断する。つまり、デコード部１７は、命令がメモリアクセス命令であるか、或いは、演算命令であるかを区別するための情報の一例であるMEM_INSTフラグを、リザベーションステーション１１にセットする。リザベーションステーション１１の各エントリは、GPR_VALID信号とGUB_READY信号とを、演算に使用するソースオペランドの数だけ保持する。
【００４０】
例えば、この例では２つのソースオペランドを使用するものとするが、オペランドの数は２つに限定されず、１つであっても、例えば３つであっても良い。２つのソースオペランドSRC1, SRC2は、夫々ＵＢＡとGPR_VALID信号を保持しており、１つ目のソースオペランドSRC1はSRC1_UBAとSRC1_GPR_VALID信号、２つ目のソースオペランドSRC2はSRC2_UBAとSRC2_GPR_VALID信号を保持している。各ＵＢＡとGPR_VALID信号には、命令デコード時にレジスタ管理部１８のＧＰＲＴを参照して得られた値を登録する。ＧＰＲＴとリザベーションステーション１１が保持するGPR_VALID信号のセットは、命令の完了時に行う。また、ソースオペランドSRC1は、ＧＵＢ２１２のデータが読み出し可能であるか否かを示すSRC1_GUB_READY信号を保持する。ソースオペランドSRC2は、ＧＵＢ２１２のデータが読み出し可能であるか否かを示すSRC2_GUB_READY信号を保持する。例えばSRC1_GUB_READY信号が立っていて「１」であると、対応するソースオペランドSRC1はＧＵＢ２１２から読み出し可能、即ち、先行の命令が演算を実行したことを示す。演算命令に関しては、このGUB_READY信号又はGPR_VALID信号が全てのソースオペランドに対して立っていて「１」であれば、先行の依存がある命令が全て実行済であり、演算に使用するソースオペランドが揃ったことが分かる。この場合、リザベーションステーション１１は、命令コードを発行可能であることを示すREADY信号を立てて「１」とし、次サイクルで固定小数点演算器１２又はアドレス計算演算器１３に発行することができる。
【００４１】
図４は、リザベーションステーションのエントリを選択する処理を説明するフローチャートである。図４は、エントリ数が５である場合の例を示す。エントリを選択する方法は、特に限定されないが、この例ではバブルアップするようなキュー構成を前提として説明する。
【００４２】
この例では、リザベーションステーション１１のエントリ０が最も古く、エントリ４が最も新しい。このため、エントリを選択する際の優先度は、エントリ０が最も高い。エントリ０が選ばれた場合は、エントリ１以降のエントリは全て１エントリ分移動する。投機的にエントリを選ぶことができるので、エントリ１以降のエントリが選択される場合がある。例えば、エントリ１が選ばれた場合は、エントリ２以降のエントリが移動する。このような規則に基づくので、エントリの選択は、図４に示すようになる。
【００４３】
図４において、最初にエントリ０が「１」であるREADY信号であるか否かの判定を行う（ステップＳ１）。ステップＳ１の判定結果がＹＥＳの場合は、エントリ０が固定小数点演算器１２又はアドレス計算演算器１３に投入される（ステップＳ２）。ステップＳ１の判定結果がＮＯの場合は、エントリ１が「１」であるREADY信号であるか否かの判定を行う（ステップＳ３）。ステップＳ３の判定結果がＹＥＳの場合は、エントリ１が固定小数点演算器１２又はアドレス計算演算器１３に投入される（ステップＳ４）。ステップＳ３の判定結果がＮＯの場合は、エントリ２が「１」であるREADY信号であるか否かの判定を行う（ステップＳ５）。ステップＳ５の判定結果がＹＥＳの場合は、エントリ２が固定小数点演算器１２又はアドレス計算演算器１３に投入される（ステップＳ６）。ステップＳ５の判定結果がＮＯの場合は、エントリ３が「１」であるREADY信号であるか否かの判定を行う（ステップＳ７）。ステップＳ７の判定結果がＹＥＳの場合は、エントリ３が固定小数点演算器１２又はアドレス計算演算器１３に投入される（ステップＳ８）。ステップＳ７の判定結果がＮＯの場合は、エントリ４が「１」であるREADY信号であるか否かの判定を行う（ステップＳ９）。
【００４４】
ステップＳ９の判定結果がＹＥＳの場合は、エントリ４が固定小数点演算器１２又はアドレス計算演算器１３に投入される（ステップＳ１０）。ステップＳ９の判定結果がＮＯの場合は、全てのエントリに「１」であるREADY信号が無いため、固定小数点演算器１２又はアドレス計算演算器１３に命令を投入しない（ステップＳ１１）。ステップＳ２，Ｓ４，Ｓ６，Ｓ８，Ｓ１０，Ｓ１１のいずれかの後、処理は終了する。
【００４５】
なお、バブルアップを実現するバブルアップ回路自体は周知であるため、バブルアップ回路の図示及び説明は省略する。
【００４６】
一実施例において、メモリアクセス命令のREADY信号を立てて「１」にするのに、GUB_ READY信号のみに依存するのではなく、GPR_VALID信号が立っていて「１」であるときにREADY信号を立てて「１」にする。これにより、メモリアクセス命令はＧＵＢ２１２を参照せず、ＧＰＲ２１１を参照して演算を実行することが保証される。ＧＵＢ２１２からＧＰＲ２１１への書き込みは、命令の完了後、即ち、ＧＰＲ２１１を更新する命令が既に投機的でなく、キャンセルされないことが確定してから行われる。先行の命令が完了することなく投機実行がキャンセルされた場合は、GPR_VALID信号が立たず「０」であるため、スペクタの如き攻撃の上記（２）の手順におけるメモリアクセス命令はリザベーションステーション１１から発行されることなくキャンセルされるため、投機的にデータキャッシュ１４をアクセスをすること無く、データキャッシュ１４に痕跡が残ることもない。一方、演算命令は、GUB_READY信号を使用して演算命令のREADY信号を立てて「１」にするので、上記制御による直接的な影響を受けず、投機的に命令を実行できる。
【００４７】
図５は、リザベーションステーションのGUB_ READY信号を生成する回路の一例を示す図である。図５では、ソースオペランドSRC1について、１つのエントリに対する回路を示すが、ソースオペランドSRC2についての回路も同様の構成を有する。従って、各ソースオペランドについて、リザベーションステーション１１の各エントリに対して同様の回路が設けられる。図５に示す回路は、アンド（ＡＮＤ）回路５１，５２と、オア（ＯＲ）回路５３，５４と、一致検出回路５５とを含む。ＡＮＤ回路５１には、レジスタ管理部１８のＧＰＲＴからのGUB_ READY信号と、デコード部１７からこのエントリへのVALID信号とが入力される。ＡＮＤ回路５２には、ENTRY_VALID信号と、ＯＲ回路５４の出力とが入力される。ＯＲ回路５３には、ＡＮＤ回路５１，５２の出力が入力される。一致検出回路５５には、SRC1_UBAとT_UBAとが入力される。SRC1_UBAには、依存のある先行の命令の書き込み先ＵＢＡが入っている。データキャッシュ１４からのT_UBAは、ロード命令の書き込み先ＵＢＡであり、Ｔサイクルの信号である。ＯＲ回路５４には、一致検出回路５５の出力SET_SRC1_GUB_READY信号と、ＯＲ回路５３の出力SRC1_GUB_ READY信号とが入力される。
【００４８】
リザベーションステーション１１に命令コードを登録するとき（Ｄサイクルでは）、デコード部１７からこのエントリへのVALID信号が「１」になる。空いているエントリに命令コードを登録するので、リザベーションステーション１１のエントリが埋まっていて有効であるか否かを示すENTRY_VALID信号は「０」になる。このため、ＡＮＤ回路５２の出力は０になり、SRC1_GUB_ READY信号に「０」がセットされるか、或いは、「１」がセットされるかは、ＧＰＲＴからのGUB_ READY信号によって決まる。ENTRY_VALID信号が「１」の場合はエントリが空いていないので、デコード部１７からこのエントリへのVALID信号が「１」にならないことが保証され、ＡＮＤ回路５１の出力は「０」になる。ENTRY_VALID信号が「１」のとき、SRC1_GPR_VALID信号にセットされる値はＯＲ回路５４の出力によって決まり、ＯＲ回路５４の入力の一方はＯＲ回路５３の出力であるSRC1_GPR_VALID信号の値がループバックして入力されている。ここで、SRC1_GUB_READY信号が「１」の状態を保持しており、SRC1_GPR_VALID信号が「０」にリセットされるときは、ENTRY_VALID信号が「０」になるとき、即ち、命令コードがリザベーションステーション１１から固定小数点演算器１２又はアドレス計算演算器１３に投入されたときである。ENTRY_VALID信号が「１」のときにSRC1_GUB_READY信号を「１」にするには、一致検出回路５５の出力であるSET_SRC1_GUB_ READY信号が「１」であれば良い。SRC1_UBAには、依存のある先行の命令の書き込み先ＵＢＡが入っている。T_UBAは、ロード命令の書き込み先ＵＢＡであり、Ｔサイクルの信号である。Ｔサイクルの信号を使っている理由は、ＧＵＢ２１２への書き込みから後続命令のＧＵＢ２１２からの読み出しのタイミングを最短にするためである。SRC1_UBAとT_UBAが一致した時に、ロード結果がＧＵＢ２１２へ書き込まれたことが分かり、SRC1_GUB_ READY信号に「１」がセットされる。なお、図５では図示を省略するが、演算命令もＧＵＢ２１２を更新するため、一致検出回路５５は複数存在し得る。この場合は、全ての一致検出結果のオアを求める回路が一致検出回路５５の後段に追加される。
【００４９】
図６は、リザベーションステーションのGPR_VALID信号を生成する回路の一例を示す図である。図６では、ソースオペランドSRC1について、１つのエントリに対する回路を示しているが、ソースオペランドSRC2についての回路も同様の構成を有する。従って、各ソースオペランドについて、リザベーションステーション１１の各エントリに対して同様の回路が設けられる。図６に示す回路は、アンド（ＡＮＤ）回路６１，６２と、オア（ＯＲ）回路６３，６４と、一致検出回路６５とを含む。ＡＮＤ回路６１には、レジスタ管理部１８のＧＰＲＴからのGPR_VALID信号と、デコード部１７からこのエントリへのＶＡＬＩＤとが入力される。ＡＮＤ回路６２には、ENTRY_VALID信号と、ＯＲ回路６４の出力とが入力される。ＯＲ回路６３には、ＡＮＤ回路６１，６２の出力が入力される。一致検出回路６５には、SRC1_UBAと、リオーダバッファ１９からの、完了した命令の書き込み先ＵＢＡであるW_UBAとが入力される。ＯＲ回路６４には、一致検出回路６５の出力SET_SRC1_GPR_VALID信号と、ＯＲ回路６３の出力SRC1_GPR_VALID信号とが入力される。
【００５０】
リザベーションステーション１１に命令コードを登録するとき（Ｄサイクルでは）、デコード部１７からこのエントリへのVALID信号が「１」になる。空いているエントリに命令を登録するので、リザベーションステーション１１のエントリが埋まっていて有効であるか否かを示す信号ENTRY_VALID信号は「０」になる。このため、ＡＮＤ回路６２の出力は「０」になり、SRC1_GPR_VALID信号に「０」がセットされるか、或いは、「１」がセットされるかは、ＧＰＲＴからのGPR_VALID信号によって決まる。ENTRY_VALID信号が「１」の場合は、エントリが空いていないので、デコード部１７からこのエントリへのVALID信号が「１」にならないことが保証され、ＡＮＤ回路６１の出力は「０」になる。ENTRY_VALID信号が「１」のとき、SRC1_GPR_VALID信号にセットされる値はＯＲ回路６４の出力によって決まり、ＯＲ回路６４の入力の一方はＯＲ回路６３の出力であるSRC1_GPR_VALID信号の値がループバックして入力されている。ここで、SRC1_GPR_VALID信号が「１」の状態を保持しており、SRC1_GPR_VALIDが「０」にリセットされるときは、ENTRY_VALID信号が０になるとき、即ち、命令コードが固定小数点演算器１２又はアドレス計算演算器１３に投入されてリザベーションステーション１１から抜けたときである。ENTRY_VALID信号が「１」のときにSRC1_GPR_VALID信号を「１」にするには、一致検出回路６５の出力が「１」であれば良い。SRC1_UBAには、依存のある先行の命令の書き込み先ＵＢＡが入っている。この書き込み先ＵＢＡと、完了した命令の書き込み先ＵＢＡであるW_UBAとが一致した時に、依存元の命令が完了しSRC1_UBAが破棄され、ＧＵＢからＧＰＲへの書き込みが行われたことが分かり、SRC1_GPR_VALID信号に１がセットされる。
【００５１】
図７は、リザベーションステーションのREADY信号を生成する回路の一例を示す図である。図７に示す回路は、１つのエントリに対して設けられ、インバータ回路７１と、アンド（ＡＮＤ）回路７２，７３，７６と、オア（ＯＲ）回路７４，７５とを含む。MEM_INSTフラグは、インバータ回路７１を介してＡＮＤ回路７２，７３に入力される。ＡＮＤ回路７２には、SRC1_GUB_ READY信号も入力され、ＡＮＤ回路７３には、SRC2_GUB_ READY信号も入力される。ＯＲ回路７４には、ＡＮＤ回路７２の出力と、SRC1_GPR_VALID信号とが入力される。ＯＲ回路７５には、ＡＮＤ回路７３の出力と、SRC2_GPR_VALIDとが入力される。SRC1_GPR_VALID信号は、演算がこのエントリのソースオペランドSRC1を格納するＧＰＲ番号のＧＰＲ２１１を参照するか否かを示す。SRC2_GPR_VALID信号は、演算がこのエントリのソースオペランドSRC2を格納するＧＰＲ番号のＧＰＲ２１１を参照するか否かを示す。ＡＮＤ回路７６には、ＯＲ回路７４，７５の出力が入力される。ＡＮＤ回路７６は、READY信号を出力する。
【００５２】
READY信号は、ＧＰＲ２１１及びＧＵＢ２１２が読み出し可能でないと「１」にならない。SRC1_GUB_ READY信号とSRC2_GUB_ READY信号は、ソースオペランドSRC1とソースオペランドSRC2の依存元命令の演算結果がＧＵＢ２１２に格納されていて読み出せるか否かを示す。SRC1_GUB_READY信号は、このエントリのソースオペランドSRC1を格納するＧＵＢ番号のＧＵＢ２１２のデータを読み出せるか否かを示す。SRC2_GUB_READY信号は、このエントリのソースオペランドSRC2を格納するＧＵＢ番号のＧＵＢ２１２からデータを読み出せるか否かを示す。SRC1_GUB_READY信号及びSRC2_GUB_READY信号は、先行の命令が固定小数点演算器１２、アドレス計算演算器１３やデータキャッシュ１４へ発行された際にＵＢＡの一致検出によってセットされる。MEM_INSTフラグは、デコード部１７が行った命令解釈により生成された信号がリザベーションステーション１１に登録され、MEM_INSTフラグが「０」のときこのエントリの命令は演算命令であることを示す。MEM_INSTフラグは、インバータ回路７１によって極性反転され、「１」がＡＮＤ回路７２，７３に入力される。この場合は、ＡＮＤ回路７２，７３のもう一方の入力のSRC1_GUB_ READY信号とSRC2_GUB_ READY信号がＡＮＤ回路７２，７３の結果として出力される。MEM_INSTフラグが「１」のとき、このエントリの命令はメモリアクセス命令である。この場合は、ＡＮＤ回路７２，７３の入力の一方が「０」になるため、出力は「０」になる。ＯＲ回路７４では、ＡＮＤ回路７２の出力とSRC1_GPR_VALID信号の値がオアされる、つまりＯＲ回路７４の出力はソースオペランドSRC1がＧＵＢ又はＧＰＲにデータがあって読み出し可能であることを示す。ＯＲ回路７５の出力も同様に、ソースオペランドSRC2がＧＵＢ又はＧＰＲにデータがあって読み出し可能であることを示す。ＡＮＤ回路７６では、ソースオペランドSRC1とソースオペランドSRC2のどちらも読み出し可能な時に出力が「１」になりREADY信号に「１」がセットされる。
【００５３】
一実施例では、MEM_INSTフラグを極性反転した信号とGUB_ READY信号をＡＮＤ回路７２，７３にてアンドしている。これにより、メモリアクセス命令では常にＡＮＤ回路７２，７３の出力が「０」になるため、必然的にGPR_VALID信号が「１」になるまでREADY信号が「１」にならない。
【００５４】
図８は、リザベーションステーションの構成の一例を示す図であり、図５、図６、及び図７の接続関係を示す図である。図８では説明の便宜上、デコード部１７からの接続やその他信号の図示は省略する。図８は、説明の便宜上、１０のエントリに対する回路部分を示すが、エントリの数は用途に応じて設定可能である。
【００５５】
回路８５−０〜８５−９は、１０のエントリ０〜９に対して設けられ、夫々が図５に示す構成を有する。回路８１は、各エントリのGUB_ READY信号を記憶するフリップフロップ（Flip-Flop）等の記憶素子を有する。回路８１は、例えばエントリ「０」に対しては、回路８５−０からのソースオペランドSRC1,SRC2についてのRS_0_SRC1/2_GUB_READY信号を記憶する。回路８６−０〜８６−９は、１０のエントリ０〜９に対して設けられ、夫々が図６に示す構成を有する。回路８２は、各エントリのGPR_VALID信号を記憶するフリップフロップ等の記憶素子を有する。回路８２は、例えばエントリ０に対しては、回路８６−０からのソースオペランドSRC1,SRC2についてのRS_0_SRC1/2_GPR_READY信号を記憶する。回路８７−０〜８７−９は、１０のエントリ０〜９に対して設けられ、夫々が図７に示す構成を有する。回路８３は、各エントリのREADY信号を記憶するフリップフロップ等の記憶素子を有する。回路８３は、例えばエントリ０に対しては、回路８７−０からのRS_0 _READY信号を記憶する。セレクタ回路８４は、回路８３が記憶するエントリ０〜９に対するRS_0 _READY信号〜RS_9 _READY信号のうち、「１」となった信号から古い順に選択してREADY信号として演算実行部２０へ出力する。
【００５６】
図９は、READY信号を生成する処理を説明するフローチャートである。図９に示す処理は、図８に示すセレクタ回路８４の動作に対応する。
【００５７】
最初に、メモリアクセス命令であるか否かを判定する（ステップＳ２１）。メモリアクセス命令であると（ステップＳ２１がＹＥＳ）、ソースオペランドSRC1のGPR_VALID信号が立っているか否かを判定する（ステップＳ２２）。ステップＳ２２の判定結果がＹＥＳであると、ソースオペランドSRC2のGPR_VALID信号が立っているか否かを判定する（ステップＳ２３）。ステップＳ２３の判定結果がＹＥＳであると、対応するREADY信号を「１」（READY＝１）にセットして（ステップＳ２４）、処理は終了する。
【００５８】
一方、ソースオペランドSRC1のGPR_VALID信号が立っておらずステップＳ２２の判定結果がＮＯ、或いは、ソースオペランドSRC2のGPR_VALID信号が立っておらずステップＳ２３の判定結果がＮＯであると、対応するREADY信号を「０」（READY＝０）にセットして（ステップＳ２５）、終了は終了する。
【００５９】
最初のメモリアクセス命令であるか否かの判定でメモリアクセス命令ではなく、演算命令であると、ステップＳ２１の判定結果はＮＯである。この場合、ソースオペランドSRC1のGUB_ READY信号又はGPR_VALID信号が立っているか否かを判定する（ステップＳ２６）。ステップＳ２６の判定結果がＹＥＳであると、ソースオペランドSRC2のGUB_ READY信号又はGPR_VALID信号が立っているか否かを判定する（ステップＳ２７）。ステップＳ２７の判定結果がＹＥＳであると、対応するREADY信号を「１」（READY＝１）にセットして（ステップＳ２４）、処理は終了する。
【００６０】
ソースオペランドSRC1のGUB_READY信号とGPR_VALID信号がどちらも立っておらずステップＳ２６の判定結果がＮＯ、或いは、ソースオペランドSRC2のGUB_ READY信号とGPR_VALID信号がどちらも立っておらずステップＳ２７の判定結果がＮＯであると、対応するREADY信号を「０」（READY＝０）にセットして（ステップＳ２５）、処理は終了する。
【００６１】
なお、図９の点線で囲ったステップＳ２１〜Ｓ２３の処理により、スペクタの如き攻撃への対策として、上記（２）の手順におけるメモリアクセスの投機実行を、リザベーションステーション１１で抑止することができる。具体的には、上記（１）の手順におけるロード命令の完了、即ち、投機的なアクセスでキャンセルされるか否かの判断を待つ。投機的なアクセスがキャンセルされる場合は、上記（２）の手順におけるメモリアクセスを行う前に実行がキャンセルされるので、データキャッシュ１４にメモリアクセスの痕跡が残らない。
【００６２】
上記の例では、既存のGPR_VALID信号を使って一実施例の動作を実現しているが、GPR_VALID信号に相当する信号が存在しない場合でも、命令完了状態を見分けられるGPR_VALID信号相当の、ソースオペランドに対する依存元の命令の完了状態が見分けられる信号を追加して実現しても良い。
【００６３】
上記の実施例では、リザベーションステーションは、抑止対象をメモリアクセス命令に絞り、演算実行部にメモリアクセス命令を発行するときは、メモリアクセス命令が完了するまで、後続命令を演算実行部に発行することを待機する。また、リザベーションステーションは、演算実行部に演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を演算実行部に発行することで、演算命令は投機的に実行可能とする。アドレス生成の依存元の命令の完了を待って演算実行部にメモリアクセス命令を発行するため、プロセッサの性能劣化を抑えると共に、投機実行を部分的に抑止することで、プロセッサのセキュリティ脆弱性に対するセキュリティ強度を上げることができる。
【００６４】
以上の実施例を含む実施形態に関し、更に以下の付記を開示する。
（付記１）
命令をデコードした結果である命令コードを出力するデコード部と、
前記命令コードを蓄積し、演算実行部へ投入できる命令コードから選択して投入するリザベーションステーションと、
投入された前記命令コードが演算命令の場合、演算に前記演算命令の書き込み先の演算用のレジスタを使用し、前記投入された前記命令コードがメモリアクセス命令である場合、アドレス計算に前記レジスタを使用し、命令の完了時にレジスタ更新用のバッファに一旦書き込まれた演算結果及びロードデータを前記バッファから前記レジスタに書き込む演算実行部と、
を備え、
前記リザベーションステーションは、
前記演算実行部に前記メモリアクセス命令を発行するときは、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機し、
前記演算実行部に前記演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を前記演算実行部に発行する、
ことを特徴とする、演算処理装置。
（付記２）
前記リザベーションステーションは、前記メモリアクセス命令が投機的であるか否かを、先行の命令の状態に応じて判断して、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機することを特徴とする、付記１記載の演算処理装置。
（付記３）
前記デコード部は、
前記命令を解釈する際に、前記命令がメモリアクセス命令であるか、或いは、演算命令であるかを区別するための情報を、前記リザベーションステーションにセットし、
前記レジスタに対して前記バッファを割り当てることを特徴とする、付記１又は２記載の演算処理装置。
（付記４）
前記メモリアクセス命令は、前記バッファを参照せず、前記レジスタを参照して演算を実行し、前記バッファから前記レジスタへの書き込みは、命令の完了後に、当該命令が既に投機的でなくキャンセルされないことが確定してから行い、
先行の命令が完了することなく投機実行がキャンセルされた場合は、前記メモリアクセス命令は前記リザベーションステーションから発行されずにキャンセルされ、投機的なデータキャッシュへのアクセスを抑止する、
ことを特徴とする、付記１乃至３のいずれか１項記載の演算処理装置。
（付記５）
前記デコード部が前記レジスタに対して割り当てた前記バッファの第１の番号を記録するテーブルを有するレジスタ管理部と、
命令を本来の順序に従って完了させるリオーダバッファをと更に備え、
前記リオーダバッファは、前記デコード部から第２の番号を受け取り、前記レジスタ管理部から前記第１の番号を受け取り、命令完了時に前記演算実行部に前記第２の番号と前記第１の番号を送り、
前記演算実行部は、前記バッファのデータを前記レジスタに書き込み、命令完了時の処理を行うことで、前記レジスタに演算及びロードの結果を、ソフトウェアから観測可能に反映する、
ことを特徴とする、付記１乃至４のいずれか１項記載の演算処理装置。
（付記６）
前記演算実行部は、
前記演算命令の場合、前記レジスタのデータを読んで演算に用いる固定小数点演算器と、
前記メモリアクセス命令の場合、前記バッファのデータを読んで演算に用いるアドレス計算演算器と、
を有し、
前記アドレス計算演算器が計算したアドレスを入力してデータを読み出すデータキャッシュを更に備えたことを特徴とする、付記１乃至５のいずれか１項記載の演算処理装置。
（付記７）
前記リザベーションステーションが有する複数のエントリの各々は、演算が前記レジスタを参照するか否かを示す信号と、前記バッファの対応するエントリからデータを読み出せるか否かを示す信号とを、当該演算に使用するソースオペランドの数だけ保持することを特徴とする、付記１乃至６のいずれか１項記載の演算処理装置。
（付記８）  デコード部とリザベーションステーションと演算実行部とを有する演算処理装置の制御方法であって、
前記デコード部が、命令をデコードした結果である命令コードを出力し、
前記リザベーションステーションが、命令を解釈した命令コードを蓄積し、前記演算実行部へ投入できる命令コードから選択して投入し、
前記演算実行部が、投入された前記命令コードが演算命令である場合、演算に前記演算命令の書き込み先の演算用のレジスタを使用し、前記投入された前記命令コードがメモリアクセス命令である場合、アドレス計算に前記レジスタを使用し、レジスタ更新用のバッファに一旦書き込まれた演算結果及びロードデータを命令の完了時に前記バッファから前記レジスタに書き込み、
前記リザベーションステーションが、前記演算実行部に前記メモリアクセス命令を発行するときは、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを待機し、
前記リザベーションステーションが、前記演算実行部に前記演算命令を発行するときは、演算に使用するオペランドが揃ったことを検出した次のサイクルで、後続命令を前記演算実行部に発行する、
ことを特徴とする、演算処理装置の制御方法。
（付記９）
前記リザベーションステーションが、前記メモリアクセス命令が投機的であるか否かを、先行の命令の状態に応じて判断して、前記メモリアクセス命令が完了するまで、後続命令を前記演算実行部に発行することを特徴とする、付記８記載の演算処理装置の制御方法。
（付記１０）
デコード部が、前記命令を解釈する際に、前記命令がメモリアクセス命令であるか、或いは、演算命令であるかを区別するための情報を、前記リザベーションステーションにセットし、
前記デコード部が、前記レジスタに対して前記バッファを割り当てることを特徴とする、付記８又は９記載の演算処理装置の制御方法。
（付記１１）
前記メモリアクセス命令は、前記バッファを参照せず、前記レジスタを参照して演算を実行し、前記バッファから前記レジスタへの書き込みは、命令の完了後に、当該命令が既に投機的でなくキャンセルされないことが確定してから行い、
先行の命令が完了することなく投機実行がキャンセルされた場合は、前記メモリアクセス命令は前記リザベーションステーションから発行されずにキャンセルされ、投機的なデータキャッシュへのアクセスを抑止する、
ことを特徴とする、付記８乃至１０のいずれか１項記載の演算処理装置の制御方法。
（付記１２）
レジスタ管理部のテーブルが、デコード部が前記レジスタに対して割り当てた前記バッファの第１の番号を記録し、
リオーダバッファが、命令を本来の順序に従って完了し、
前記リオーダバッファが、前記デコード部から第２の番号を受け取り、前記レジスタ管理部から前記第１の番号を受け取り、命令完了時に前記演算実行部に前記第２の番号と前記第１の番号を送り、
前記演算実行部が、前記バッファのデータを前記レジスタに書き込み、命令完了時の処理を行うことで、前記レジスタに演算及びロードの結果を、ソフトウェアから観測可能に反映する、
ことを特徴とする、付記８乃至１１のいずれか１項記載の演算処理装置の制御方法。
（付記１３）
前記演算実行部の固定小数点演算器が、前記演算命令の場合、前記レジスタのデータを読んで演算に用い、
前記演算実行部のアドレス計算演算部が、前記メモリアクセス命令の場合、前記バッファのデータを読んで演算に用い、
データキャッシュに対して、前記アドレス計算演算器が計算したアドレスを入力してデータを読み出すことを特徴とする、付記８乃至１２のいずれか１項記載の演算処理装置の制御方法。
（付記１４）
前記リザベーションステーションが有する複数のエントリの各々が、演算が前記レジスタを参照するか否かを示す信号と、前記バッファの対応するエントリからデータを読み出せるか否かを示す信号とを、当該演算に使用するソースオペランドの数だけ保持することを特徴とする、付記８乃至１３のいずれか１項記載の演算処理装置の制御方法。
【００６５】
以上、開示の演算処理装置及び演算処理装置の制御方法を実施例により説明したが、本発明は上記実施例に限定されるものではなく、本発明の範囲内で種々の変形及び改良が可能であることは言うまでもない。
【符号の説明】
【００６６】
１      プロセッサ
１１      リザベーションステーション
１２      固定小数点演算器
１３      アドレス計算演算器
１４      データキャッシュ
１５      命令キャッシュ
１６      命令バッファ
１７      デコード部
１８      レジスタ管理部
１９      リオーダバッファ
２０      演算実行部
２１      レジスタ部
２１１      ＧＰＲ
２１２      ＧＵＢ
【図１】
2019212152.tif 000003
【図２】
2019212152.tif 000004
【図３】
2019212152.tif 000005
【図４】
2019212152.tif 000006
【図５】
2019212152.tif 000007
【図６】
2019212152.tif 000008
【図７】
2019212152.tif 000009
【図８】
2019212152.tif 000010
【図９】
2019212152.tif 000011