(57)【要約】      （修正有）【課題】マルチフロー命令による命令デコーダのスループット低下を抑制した演算処理装置を提供する。【解決手段】演算処理装置は、マルチフロー命令とシングル命令を処理する。命令デコーダは、マルチフロー命令の分割数を検出し、複数の分割命令に分割するＮスロットのプリデコーダと分割命令またはシングル命令をデコード・発行するＮスロットのメインデコーダとプリデコーダ内の命令を一時的に格納するＮ−Ｋ（Ｎ＞Ｋ）スロットのプリデコーダバッファを有する。命令デコーダは、プリデコーダとプリデコーダバッファから分割命令またはシングル命令をインオーダで可能な限りメインデコーダに繰返し移動する。移動繰返し中にプリデコーダバッファとプリデコーダの先頭のＫ個のスロット内の命令が全てメインデコーダに移動したとき、プリデコーダ内に残っている命令をプリデコーダバッファに移動し、プリデコーダに次のＮ個の命令を入力する。【選択図】図５
2019169046.tif 000002
【特許請求の範囲】
【請求項１】
メモリからフェッチされたフェッチ命令をデコードし実行命令を発行する命令デコーダと、
前記命令デコーダが発行した実行命令を一時的に格納するリザベーションステーションと、
前記リザベーションステーション内に格納された実行命令を実行する演算部とを有し、
前記フェッチ命令は、複数の分割命令に分割されるマルチフロー命令と、分割されないシングル命令とを有し、
前記命令デコーダは、
それぞれ、前記フェッチ命令を入力し、前記マルチフロー命令の分割数を検出し、前記マルチフロー命令を複数の分割命令に分割するＮ個（Ｎは正の整数）のスロットを有するプリデコーダと、
それぞれ、前記分割命令またはシングル命令をデコードし、前記分割命令またはシングル命令に対応する実行命令を発行するＮ個のスロットを有するメインデコーダと、
前記プリデコーダ内の命令を一時的に格納するＮ−Ｋ個（Ｎ＞Ｋ）（Ｋは正の整数）のスロットを有するプリデコーダバッファを有し、
前記命令デコーダは、
前記プリデコーダのＮ個のスロットと前記プリデコーダバッファのＮ−Ｋ個のスロットから前記分割命令またはシングル命令をインオーダで可能な限り前記メインデコーダのＮ個のスロットに移動することを繰り返し、前記移動することを繰返し中に、少なくとも前記プリデコーダバッファのＮ−Ｋ個のスロットと前記プリデコーダの先頭のＫ個のスロット内の前記分割命令またはシングル命令が全て前記メインデコーダに移動したとき、前記プリデコーダ内に残っている命令を前記プリデコーダバッファに移動するとともに、前記プリデコーダのＮ個のスロットに次のＮ個のフェッチ命令をそれぞれ入力する、演算処理装置。
【請求項２】
前記プリデコーダバッファは、前記プリデコーダが前記メインデコーダに移動してない分割命令のマルチフロー命令または前記シングル命令を一時的に格納し、前記マルチフロー命令を分割して前記分割命令を生成し、前記メインデコーダに移動する、請求項１に記載の演算処理装置。
【請求項３】
前記プリデコーダバッファは、前記プリデコーダが分割したが前記メインデコーダに移動してない分割命令またはシングル命令を一時的に格納し、前記一時的に格納した分割命令またはシングル命令を前記メインデコーダに移動する、請求項１に記載の演算処理装置。
【請求項４】
前記命令デコーダは、前記移動することを繰返し中に、前記プリデコーダバッファのＮ−Ｋ個のスロットと前記メインデコーダのＮ個のスロット内の前記分割命令またはシングル命令が全て前記メインデコーダに移動したとき、前記プリデコーダのＮ個のスロットに次のＮ個のフェッチ命令をそれぞれ入力する、請求項１に記載の演算処理装置。
【請求項５】
前記Ｋ個は、１個である、請求項１に記載の演算処理装置。
【請求項６】
更に、
前記命令デコーダがループ内の複数の実行命令を発行するとき、前記ループ内の複数の実行命令を格納するループキャッシュと、
前記命令デコーダが前記ループ内の複数の実行命令を発行するとき、前記命令デコーダが発行する前記ループ内の複数の実行命令を選択し、前記命令デコーダが前記ループ内の複数の実行命令を発行した後に前記ループキャッシュが前記ループ内の複数の実行命令を発行するとき、前記ループキャッシュが発行する前記ループ内の複数の実行命令を選択し、選択した実行命令を前記リザベーションステーションに供給する命令セレクタを有する、請求項１に記載の演算処理装置。
【請求項７】
前記命令セレクタが前記ループキャッシュが発行する前記実行命令を選択中、前記命令デコーダは動作を停止するよう制御される、請求項６に記載の演算処理装置。
【請求項８】
メモリからフェッチされたフェッチ命令をデコードし実行命令を発行する命令デコーダと、
前記命令デコーダが発行した実行命令を一時的に格納するリザベーションステーションと、
前記リザベーションステーション内に格納された実行命令を実行する演算部とを有する演算処理装置の制御方法であって、
前記フェッチ命令は、複数の分割命令に分割されるマルチフロー命令と、分割されないシングル命令とを有し、
前記命令デコーダでは、
Ｎ個（Ｎは正の整数）のスロットを有するプリデコーダが、それぞれ、前記フェッチ命令を入力し、前記マルチフロー命令の分割数を検出し、前記マルチフロー命令を複数の分割命令に分割し、
Ｎ個のスロットを有するメインデコーダが、それぞれ、前記分割命令またはシングル命令をデコードし、前記分割命令またはシングル命令に対応する実行命令を発行し、
Ｎ−Ｋ個（Ｎ＞Ｋ）（Ｋは正の整数）のスロットを有するプリデコーダバッファが、前記プリデコーダ内の命令を一時的に格納し、
前記命令デコーダは、
前記プリデコーダのＮ個のスロットと前記プリデコーダバッファのＮ−Ｋ個のスロットから前記分割命令またはシングル命令をインオーダで可能な限り前記メインデコーダのＮ個のスロットに移動することを繰り返し、
前記移動することを繰り返し中、少なくとも前記プリデコーダバッファのＮ−Ｋ個のスロットと前記プリデコーダの先頭のＫ個のスロット内の前記分割命令またはシングル命令が全て前記メインデコーダに移動したとき、前記プリデコーダ内に残っている命令を前記プリデコーダバッファに移動するとともに、前記プリデコーダのＮ個のスロットに次のＮ個のフェッチ命令をそれぞれ入力する、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置は、プロセッサまたはCPU（Central Processing Unit）である。プロセッサは、メインメモリからフェッチしたフェッチ命令を登録する命令キャッシュと、命令キャッシュからフェッチした命令を一旦格納する命令バッファとを有する。さらに、プロセッサは、命令バッファ内の命令をプログラムの順番（インオーダ）でデコードする命令デコーダと、デコードされた命令を命令キューに格納するリザベーションステーションとを有する。そして、リザベーションステーションにキューインされた命令は、命令実行の準備が整うと、演算器により実行される。これら命令バッファ、命令デコーダは、パイプラインの構成を有し、プロセッサ内のクロックに同期して命令を順番に処理する。
【０００３】
フェッチ命令のデコード処理のスループットを上げるために、命令デコーダを複数スロットの構成にし、複数のフェッチ命令を並列してデコードし、デコードされた複数の実行命令を並列してリザベーションステーションにキューインする。上記のプロセッサについては、例えば、以下の特許文献１，２にも開示される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１４−０８９６９９号公報
【特許文献２】特表平８−５０４０４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
近年において、プロセッサは、フェッチ命令を複数の分割命令（マイクロ命令）に分割し、複数の分割命令を実行することが要求される。例えば、多数のレジスタを使用する複雑な命令を、複数の単純な命令に分割し、その複数の分割命令を順番に実行することで、プロセッサの演算効率を向上することができる。このように複数の命令に分割して実行される命令を、マルチフロー命令と称する。マルチフロー命令は、命令デコーダで分割が必要な命令と判断されると、マルチフロー命令分割部がマルチフロー命令を複数のサブ命令（分割命令、マイクロ命令、マイクロオペ命令等、以下分割命令と称する。）に分割し、リザベーションステーションにキューインする。
【０００６】
しかしながら、複数スロットに構成にされた命令デコーダにこのようなマルチフロー命令が入力すると、命令デコーダとは別に設けられたマルチフロー命令分割部がマルチフロー命令を分割し、順番にリザベーションステーションにキューインする。その結果、マルチフロー命令の分割処理と分割命令の発行処理によって、複数スロットを有する命令デコーダの処理スループットが一時的に低下する。命令デコーダは、パイプライン全体の動作を制御する要となる処理ユニットであるので、このような命令デコーダのスループットの低下は、プロセッサの処理の低下を招く。
【０００７】
そこで，本開示の第1の側面の目的は，マルチフロー命令による命令デコーダのスループットの低下を抑制した演算処理装置及び演算処理装置の制御方法を提供することにある。
【課題を解決するための手段】
【０００８】
本実施の形態の第１の側面は，メモリからフェッチされたフェッチ命令をデコードし実行命令を発行する命令デコーダと、前記命令デコーダが発行した実行命令を一時的に格納するリザベーションステーションと、前記リザベーションステーション内に格納された実行命令を実行する演算部とを有し、前記フェッチ命令は、複数の分割命令に分割されるマルチフロー命令と、分割されないシングル命令とを有し、
前記命令デコーダは、
それぞれ、前記フェッチ命令を入力し、前記マルチフロー命令の分割数を検出し、前記マルチフロー命令を複数の分割命令に分割するＮ個（Ｎは正の整数）のスロットを有するプリデコーダと、
それぞれ、前記分割命令またはシングル命令をデコードし、前記分割命令またはシングル命令に対応する実行命令を発行するＮ個のスロットを有するメインデコーダと、
前記プリデコーダ内の命令を一時的に格納するＮ−Ｋ個（Ｎ＞Ｋ）（Ｋは正の整数）のスロットを有するプリデコーダバッファを有し、
前記命令デコーダは、
前記プリデコーダのＮ個のスロットと前記プリデコーダバッファのＮ−Ｋ個のスロットから前記分割命令またはシングル命令をインオーダで可能な限り前記メインデコーダのＮ個のスロットに移動することを繰り返し、前記移動することを繰返し中に、少なくとも前記プリデコーダバッファのＮ−Ｋ個のスロットと前記プリデコーダの先頭のＫ個のスロット内の前記分割命令またはシングル命令が全て前記メインデコーダに移動したとき、前記プリデコーダ内に残っている命令を前記プリデコーダバッファに移動するとともに、前記プリデコーダのＮ個のスロットに次のＮ個のフェッチ命令をそれぞれ入力する、演算処理装置である。
【発明の効果】
【０００９】
第１の側面によれば，マルチフロー命令による命令デコーダのスループットの低下を抑制できる。
【図面の簡単な説明】
【００１０】
【図１】本実施の形態における情報処理装置の構成例を示す図である。
【図２】本実施の形態における演算処理装置（以下プロセッサと称する。）の構成例を示す図である。
【図３】命令デコーダI_DECの構成例を示す図である。
【図４】命令デコーダのプリデコーダの１つのスロットPD1とプリデコーダバッファの１つのスロットPB0とメインデコーダの１つのスロットD1の詳しい構成例を示す図である。
【図５】命令デコーダ内のプリデコーダとプリデコーダバッファの動作を示すフローチャート図である。
【図６】図４，５の命令デコーダの動作を具体的なフェッチ命令列の例に基づいて説明するタイミングチャート図である。
【図７】図４，５の命令デコーダの動作を具体的なフェッチ命令列の例に基づいて説明するタイミングチャート図である。
【図８】第２の実施の形態における命令デコーダI_DECの構成例を示す図である。
【図９】第３の実施の形態における演算処理装置の構成例を示す図である。
【図１０】プロセッサの別の構成例を示す図である。
【図１１】図１０のプロセッサの命令デコーダによるマルチフロー命令の処理を示すタイムチャートの図である。
【図１２】図１０のプロセッサの命令デコーダによるマルチフロー命令の処理を示すタイムチャートの図である。
【発明を実施するための形態】
【００１１】
図１は、本実施の形態における情報処理装置の構成例を示す図である。情報処理装置１０は、例えばHPC（High Performance Computer）やサーバなどのコンピュータである。情報処理装置は、複数の演算処理装置（プロセッサまたはCPU）CPU_0，CPU_1と、複数のメモリMEM_0, MEM_1と、インターコネクト制御部１１とを有する。演算処理装置は、それぞれのメモリにアクセス可能である。さらに、複数の演算処理装置CPU_0，CPU_1は、インターコネクト制御部（チップ）１１を介して、ストレージ等の複数の外部装置12_0、12_1や図示しないネットワークなどに接続される。インターコネクト制御部１１は、外部装置やネットワークに対して入出力制御を行う。
【００１２】
図２は、本実施の形態における演算処理装置（以下プロセッサと称する。）の構成例を示す図である。図２のプロセッサは、スーパースカラプロセッサの例である。但し、本実施の形態のプロセッサは、図２の構成に限定されない。プロセッサは、少なくとも、命令バッファI_BUFと、命令デコーダI_DECと、リザベーションステーションRSA,RSE,RSFと、演算器FX_ALU,  FL_ALUなどを有する。
【００１３】
命令フェッチアドレス生成部I_F_ADD_GENは、プログラムカウンタPCと分岐予測回路BR_PRDの情報に基づいてフェッチ先アドレスを生成し、プロセッサ外部のメインメモリM_MEM内の命令を読み出し、２次命令キャッシュ2_ICACHE及び１次命令キャッシュ1_ICACHEに読み出した命令をキャッシュ登録する。そして、プログラム順（インオーダ）に1次命令キャッシュから読み出されたフェッチ命令が、一旦、命令バッファI_BUF内に格納される。
【００１４】
命令デコーダI_DECは、命令バッファからプログラム順にフェッチ命令を入力し、フェッチ命令を解読し、実行命令を発行する。発行された実行命令はリザベーションステーションと呼ばれるキュー構造のストレージに蓄積される。リザベーションステーションは、固定小数点計算用のRSE（Reservation Station for Execution）、浮動小数点計算用のRSF（Reservation Station for Floating point）、命令の実行を制御する主記憶オペランドアドレス生成用のRSA（Reservation Station for Address generate）、分岐命令用のRSBR（Reservation Station for BRanch）に、実行命令の種類ごとに設けられる。そして、命令デコーダが発行した実行命令は、命令の種類に応じて、上記のいずれかのリザベーションステーション内のキューにエントリされる。キューにエントリされた実行命令は、それぞれ命令実行の準備が整ったものからプログラム順（インオーダ）ではなく、アウトオブオーダで演算器等により実行される。
【００１５】
固定小数点演算器FX_ALUに、固定小数点リネーミングレジスタFX_REN_REGと固定小数点レジスタFX_ERGが、浮動小数点演算器FL_ALUに、浮動小数点リネーミングレジスタFL_REN_REGと浮動小数点レジスタFL_ERGが、それぞれ設けられる。リネーミングレジスタに演算結果を格納することにより、上記のアウトオブオーダでの命令実行が可能になる。
【００１６】
一方、命令デコーダが発行した実行命令は、そのプログラム順に命令識別子（Instruction Identification , IID）を割り振られ、順番通りにコミットスタックエントリCSE（Commit Stack Entry）に送られる。コミットスタックエントリは、送られてきた実行命令のコミット処理（完了処理）を行う。コミットスタックエントリCSEは、命令デコーダが発行した実行命令をその発行順（インオーダ）にためておくキュー構造のストレージと、キューの情報と各処理パイプからの完了報告に基づいてコミット処理を行う完了処理回路とを有する。各々のリザベーションステーションにおいてアウトオブオーダで実行された命令の終了報告が、演算器などからコミットスタックエントリに送られる。この終了報告に応答して、コミットスタックエントリの完了処理回路は、プログラム順（インオーダ）に、キューに格納された完了報告待ちの命令のうち終了報告に対応する命令を完了処理し、レジスタなどの回路資源の更新を行う。
【００１７】
RSAの命令は、オペランドアドレス生成部OP_ADD_GEｎにより実行され、生成されたオペランドアドレスが1次データキャッシュ1_DCACHEに記憶される。１次データキャッシュは、オペランドアドレスを、リネーミングレジスタFX_REN_REG、FL_REN_REGや、レジスタFX_REG、FL_REGに格納する。
【００１８】
プログラムカウンタPCは、実行する命令のアドレスを出力する。分岐予測回路BR_PRDは、RSBRの分岐命令完了報告に基づいて、分岐命令が分岐するか否かを予測し、次に実行するアドレスを命令フェッチアドレス生成部に出力する。
【００１９】
図２のプロセッサの命令デコーダI_DECは、プリデコーダI_PDとメインデコーダI_Dの２段構成を有し、さらに、プリデコーダ内の命令を一時的に格納するプリデコーダバッファPBを有する。本実施の形態の命令デコーダの説明をする前に、本実施の形態の命令デコーダが解決しようとする課題について説明する。
【００２０】
図１０は、プロセッサの別の構成例を示す図である。図１０において図２のプロセッサと異なる構成は、命令デコーダI_DECが２段構成ではないことと、マルチフロー命令を分割するマルチフロー命令分割部M_INST_DIVと、命令デコーダかマルチフロー命令分割部のいずれかを選択する命令セレクタI_SELを有することである。
【００２１】
マルチフロー命令の具体例は、以下のとおりである。
LDP X0, X1, [X2], #4
このマルチフロー命令は、（１）レジスタX2内のアドレスに格納されている値をレジスタX0に格納し、（２）レジスタX2内のアドレスにデータサイズ（８バイトであれば「８」）を加算したアドレスに格納されている値をレジスタX1に格納し、（３）レジスタX2を、X2に即値「４」を加算したアドレスで更新する（加算したアドレスを上書きする）処理に分解できる。
【００２２】
この場合、上記のマルチフロー命令は、以下の２つのロード命令と加算命令に分解され実行される。以下の３つの命令が、マルチフロー命令を分割した後の分割命令の例である。
Load X0, [X2]
Load X1, [X2+8]
Add  X2, X2, #4
命令デコーダI_DECは、命令バッファI_BUFから供給される複数のフェッチ命令をそれぞれデコードし実行命令を発行する複数のスロット（図示せず）を有する。したがって、命令デコーダの複数のスロットが、複数のフェッチ命令を並列にデコードし、それぞれの実行命令を並列に発行する。
【００２３】
一方、マルチフロー命令は、１つの命令を複数のフロー（命令）に分割して実行される命令である。命令デコーダに供給されるフェッチ命令がマルチフロー命令の場合、命令デコーダ内のマルチフロー命令が供給されたスロットは、命令をデコードしマルチフローに分割すべきと判定し、マルチフロー命令をプログラム順に（インオーダで）マルチフロー命令分割部M_INST_DIVに転送する。
【００２４】
マルチフロー命令分割部は、転送されたマルチフロー命令を一旦格納し、複数のフロー（命令）に分割し、１フローずつ発行する。ここで、分割されたフロー（命令）を、以下、分割命令と称する。マルチフロー命令分割部が、分割命令を発行している間、命令セレクタI_SELは、マルチフロー命令分割部が発行する分割命令を選択し、対応するリザベーションステーションに送信する。
【００２５】
図１０のプロセッサでは、マルチフロー命令の頻度が低いため、フェッチ命令がマルチフロー命令の場合は例外処理と見なし、命令デコーダは命令の発行を停止し、マルチフロー命令分割部に命令の分割と分割命令の発行を実行させる。但し、その場合、複数のスロットを有する命令デコーダのスループットが低下する。命令デコーダのスループットとは、１クロックサイクルで処理されるフェッチ命令の数である。以下、具体例で説明する。
【００２６】
図１１、図１２は、図１０のプロセッサの命令デコーダによるマルチフロー命令の処理を示すタイムチャートの図である。図１１は、各クロックサイクルC0-C11において、命令デコーダI_DECの４スロットD0-D3に供給された４つのフェッチ命令MI_1, MI_2, SI_3, SI_4が、命令デコーダへのエントリサイクルE、命令をデコードするデコードサイクルD、命令を発行する発行ステージD及びDMのいずれかを示す。一方、図１２は、各クロックサイクルC0-C11において、命令デコーダの４つのスロットD0-D3とマルチフロー命令分割部M_INST_DIVとに滞在するフェッチ命令MI_1, MI_2, SI_3, SI_4を示す。
【００２７】
具体例では、サイクルC0で、４フロー（分割命令）に分割される２つのマルチフロー命令MI_1, MI_2と、２つのシングル命令SI_3, SI_4とが、命令デコーダI_DECの４つのスロットD0-D3に並列に供給される。次のサイクルC1で、命令デコーダの各スロットがそれぞれに供給されたフェッチ命令をデコードし、２つのスロットD0, D1が先頭の２つのフェッチ命令がマルチフロー命令であると判定する。判定と共に、スロットD0はマルチフロー命令MI_1の先頭フロー（分割命令）MI_11を発行し、同時に先頭のマルチフロー命令MI_1の命令オペコードをマルチフロー命令分割部に転送し、マルチフロートリガMF_TGRを「１」にする。そして、次の２サイクルC2,C3,C4で、マルチフロー命令分割部が２番目のフローMI_12から最終フローMI_14までを１フローずつ発行する。マルチフロートリガMF_TGRが「１」であるので、命令セレクタI_SELは、マルチフロー命令分割部からのフローを選択する。最終フローMI_14を発行すると、マルチフロー命令分割部は、マルチフロートリガMF_TGRを「０」に戻す。これにより、スロットD0のマルチフロー命令の処理が完了する。
【００２８】
次に、サイクルC5-C8の４サイクルで、スロットD1とマルチフロー命令分割部が４フローMI_21〜MI_24を１フローずつ発行する。その後、サイクルC9で、命令デコーダのスロットD2,D3が２つのシングル命令SI_3,SI_4を並列に発行する。この結果、命令デコーダ内の４スロットのフェッチ命令の処理が完了する。そのため、サイクルC9で、命令デコーダ内の４スロットが、４つのシングル命令SI_5〜SI_8を同時にエントリし、次のサイクルC10のタイミングで４つのシングル命令SI_5〜SI_8を同時に発行する。サイクルC9のタイミングが、４つのシングル命令SI_5,6,7,8のエントリEのタイミングであり、パイプライン構成であるのでシングル命令SI_3,4のDのタイミングと後続のシングル命令SI_5,6,7,8のEのタイミングは重なることができる。
【００２９】
上記のように、４スロットを有する命令デコーダI_DECは、４つのシングル命令が同時にエントリする場合は、次のサイクルで４つのシングル命令を同時に発行するとともに、次の４つのシングル命令をエントリする。これにより、命令デコーダのスループットは４命令と最大になる。しかし、エントリしたフェッチ命令にマルチフロー命令が含まれていると、命令デコーダとマルチフロー命令分割部によって、マルチフロー命令を分解した複数のフロー（分割命令）を１フローずつインオーダで発行する。その間、命令デコーダのスループットは大幅に低下する。特に、マルチフロー命令が続いた場合、命令デコーダのスループットは分割後のフロー（分割命令）ベースでスループットが１命令となる。
【００３０】
［本実施の形態のプロセッサ］
図２の本実施の形態におけるプロセッサの命令デコーダI_DECは、プリデコーダPDECとメインデコーダMDECの２段構成を有し、さらに、プリデコーダ内の命令を一時的に格納するプリデコーダバッファPBを有する。
【００３１】
プリデコーダPDECとメインデコーダMDECは、Ｎ個（Ｎは複数）のスロットを有し、以下の例ではＮ＝４，４スロット有する。プリデコーダPDECの各スロットは、分割前のマルチフロー命令またはシングル命令を入力し保持する。一方、メインデコーダMDECの各スロットは、分割後の命令（分割命令）またはシングル命令を入力し保持する。そして、プリデコーダバッファPDEC_BUFは、Ｎ−Ｋ個（Ｎ＞Ｋ）のスロットを有し、以下の例ではＮ＝４，Ｋ＝１で、３スロット有する。プリデコーダバッファPDEC_BUFの各スロットは、シングル命令または分割前のマルチフロー命令ベースでプリデコーダPD内に残っている命令を一時的に格納する。
【００３２】
図３は、命令デコーダ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を生成する。
【００３７】
第1のイネーブル信号EN1は、プリデコーダPDEC内の第1スロット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を生成するマルチフロー命令分割部MI_DIVを有する。他のスロットPB0,PD2も同様の構成である。
【００４３】
一方、メインデコーダの１つのスロットD1は、プリデコーダPDECまたはプリデコーダバッファPDEC_BUFから分割命令DIV_INSTsまたはシングル命令SIを供給される入力ラッチIN_FFを有する。さらに、スロットD1は、分割命令またはシングル命令をデコードして実行形式の命令（実行命令）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にインオーダで送信される。また、プリデコーダの３つのスロット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_DIVがそれぞれのマルチフロー命令を分割して分割命令DIV_INSTsを生成する（S2）。
【００５０】
そして、命令デコーダは、プリデコーダバッファPDEC_BUF内の３つのスロットPB0-PB2と、プリデコーダPDEC内の４つのスロットPD0-PD3内のシングル命令SIまたは分割命令DIV_INSTsを、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の命令が空になると、プリデコーダ内の残った命令を一旦プリデコーダバッファの３つのスロットPB0-PB2に移動し、プリデコーダの４つのスロットに新たに４つのフェッチ命令を入力する。このような構成にすることで、フェッチ命令にマルチフロー命令が挿入されても、命令デコーダが毎サイクル４つの実行命令を発行し、命令デコーダI_DECのスループットの低下を抑制できる。
【００５８】
図６、図７は、図４，５の命令デコーダの動作を具体的なフェッチ命令列の例に基づいて説明するタイミングチャート図である。具体的なフェッチ命令列の例は、以下のとおりである。
MI_1（3分割命令（3dl））
MI_2（６分割命令（6dl））
MI_3（２分割命令（2dl））
SI_4〜SI_8
図６は、サイクルC0-C5での各フェッチ命令のエントリサイクルE、プリデコードサイクルPD,プリデコーダバッファサイクルPB、メインデコードサイクルDを示す。図７は、サイクルC0-C5での、プリデコーダの４スロットPD0-PD3とプリデコーダバッファの３スロットPB0-PB2内の、フェッチ命令MI_#,SI_#及び分割命令MI_#1〜 MI_#6（＃はフェッチ命令の順番を示す）などを示す。
【００５９】
サイクルC0
４つのフェッチ命令MI_1,MI_2,MI_3,SI_4が、プリデコーダの４つのスロットPD0-PD3に同時に入力（エントリ）される（S1）。
【００６０】
サイクルC1
スロットPD0-PD2は、マルチフロー命令MI_1,MI_2,MI_3をそれぞれ解析し、それぞれ３フロー、６フロー、２フローであることを検出し、それぞれのフロー数の分割命令を生成する(S2)。
【００６１】
サイクルC2
スロットPD0内の３つの分割命令MI_11,MI_12,MI_13と、スロットPD1内の１つの分割命令MI_21とが、メインデコーダの４スロットD0-D3に移動し（S3）、４スロットD0-D3がそれぞれの命令をデコードし、実行命令を生成し発行する。このとき、プリデコーダの先頭スロットPD0の３つの分割命令MI_11,MI_12,MI_13が全てメインデコーダのスロットD0-D3に移動する（S5のYES）。そのため、プリデコーダのスロットPD1-PD3内に残ったフェッチ命令MI_2,MI_3,SI_4は、プリデコーダバッファPDEC_BUFの３つのスロットPB0-PB2に移動する（S6）。同時に、新たな４つのフェッチ命令SI_5〜SI_8が、プリデコーダの４つのスロットPD0-PD3に入力する（S1）。
【００６２】
サイクルC3
スロットPB0内のマルチフロー命令MI_2の４つの分割命令MI_22,MI_23,MI_24,MI_25が、メインデコーダのスロットD0-D3に移動し（S3）、デコードされて実行命令として発行される。このとき、プリデコーダの先頭スロットPD0の命令SI_5は残ったままであるので（S5のNO）、プリデコーダ内の残った命令はプリデコーダバッファに移動しない。
【００６３】
サイクルC4
スロットPB0内のマルチフロー命令MI_2の最後の分割命令MI_26と、スロットPB1内のマルチフロー命令MI_3の２つの分割命令MI_31,MI_32と、スロットPB2内のシングル命令SI_4が、メインデコーダのスロットD0-D3に移動し（S3）、デコードされて実行命令として発行される。このとき、プリデコーダの先頭スロットPD0の命令SI_5は残ったままであるので（S5のNO）、プリデコーダ内の命令はプリデコーダバッファに移動しない。
【００６４】
サイクルC5
スロットPD0-PD3内の４つのシングル命令SI_5-SI_8が、メインデコーダのスロットD0-D3に移動し（S3）、デコードされて実行命令として発行される。このとき、プリデコーダの全てのスロットPD0−PD3の命令が移動し空になるので（S4のYES）、後続の新たなシングル命令SI_9〜SI_12がプリデコーダの４つのスロットPD0-PD3に入力される。
【００６５】
サイクルC6
スロットPD0-PD3内の４つのシングル命令SI_9-SI_12が、メインデコーダのスロットD0-D3に移動し（S3）、デコードされて実行命令として発行される。
【００６６】
図５、図６で説明したとおり、フェッチ命令にマルチフロー命令が混在しても、命令デコーダのメインデコーダMDECの４つのスロットD0-D3は、毎サイクル４つの実行命令の発行を維持する。したがって、命令デコーダのスループットの低下は抑制される。
【００６７】
上記の命令デコーダは、プリデコーダとメインデコーダがそれぞれ４つのスロットを有し、プリデコーダバッファが３つのスロットを有する。これを一般化すると、プリデコーダとメインデコーダがＮ個のスロットをそれぞれ有し、プリデコーダバッファがＮ−Ｋ個のスロットを有する。上記の命令デコーダはＮ＝４，Ｋ＝１の例である。
【００６８】
Ｎ＝４、Ｋ＝２にすると、命令デコーダは、プリデコーダとメインデコーダがそれぞれ４つのスロットを有し、プリデコーダバッファが２つのスロットを有する。この場合、図５の工程S5では、プリデコーダバッファ内の２つのスロットPB0,PB1と、プリデコーダ内の少なくとも２つの先頭スロットPD0,PD1内の命令が全て、メインデコーダに移動した場合に（S5のYES）、プリデコーダの残りの２つのスロットPD2,PD3のフェッチ命令がプリデコーダバッファの２つのスロットPB0,PB1に移動し（S6）、且つプリデコーダの４つのスロットに新たな４つのフェッチ命令が入力される（S1）。
【００６９】
［第２の実施の形態］
図８は、第２の実施の形態における命令デコーダI_DECの構成例を示す図である。この命令デコーダは、図４の構成例とは、プリデコーダバッファPDEC_BUF内の構成が異なる。即ち、プリデコーダバッファ内のスロットPB0は、プリデコーダPDECのスロットPD1のマルチフロー命令分割部MI_DIVが分割した分割命令DIV_INSTsを入力してラッチする入力ラッチIN_FFを有する。プリデコーダバッファ内のスロットPB0はマルチフロー命令分割部を有していない。
【００７０】
第２の実施の形態は、マルチフロー命令の最大分割数が比較的少ない場合に適用可能である。即ち、スロットPB0の入力ラッチIN_FFは、プリデコーダPDECのスロットPD1のマルチフロー命令分割部MI_DIVが分割した分割命令DIV_INSTs全てまたは残った命令をラッチする必要があるので、ラッチ回路のリソースを減らすためには、マルチフロー命令の最大分割数が比較的少ない場合に適している。
【００７１】
マルチフロー命令分割部は比較的多くの選択論理の回路リソースを必要とする。したがって、マルチフロー命令分割部の回路リソースと、最大分割数の分割命令をラッチする入力ラッチIN_FFの回路リソースとを比較して、後者のリソースが少ない場合に、第２の実施の形態の構成が選択される。
【００７２】
［第３の実施の形態］
図９は、第３の実施の形態における演算処理装置の構成例を示す図である。図２と比較すると、命令デコーダI_DECとリザベーションステーションRSA,RSE,RDFらとの間に、ループキャッシュLP_CACHEと命令セレクタI_SELとを有する。
【００７３】
ループキャッシュLP_CACHEは、命令デコーダI_DECが発行する実行命令のうち１つのループ内の実行命令を登録し、登録後、そのループ内の実行命令を命令デコーダに代わって発行する。そして、命令セレクタI_SELは、ループキャッシュ制御信号LPCH_CNTが「１」になることにより、ループキャッシュが発行する実行命令を選択し、実行命令の対応するリザベーションステーションにキューインする。
【００７４】
また、ループキャッシュが命令デコーダI_DECに代わって実行命令を発行している間は、命令デコーダI_DEC、命令バッファI_BUF、１次命令キャッシュ1_ICACHE、２次命令キャッシュ2_ICACHE、命令フェッチアドレス生成回路I_F_ADD_GEN、分岐予測回路BR_PRDの動作を停止する。これにより省電力化できる。
【００７５】
ループキャッシュは、分岐予測回路BR_PRDが命令フェッチアドレス生成回路が生成するアドレスに基づいてループ処理を予測した場合に命令バッファI_BUFに出力するループ処理タグによって、命令デコーダI_DECが発行する命令がループ内の命令か否かを判定する。ループ内の命令と判定した場合、ループキャッシュは、そのループ内の実行命令を登録（格納）し、前述のループキャッシュ制御信号LPCH_CNTを「１」に変更し、登録したループ内の実行命令をインオーダで発行する。
【００７６】
第３の実施の形態においても、命令デコーダI_DECは、図３、図４と同じ構成を有する。図３、図４の命令デコーダは、プリデコーダの４スロットPD0-PD3とプリデコーダバッファの３スロットPB0-PB2にマルチフロー命令分割部MI_DIVを有する。マルチフロー命令分割部内のマルチフロー命令分割のための選択論理回路が大規模である。したがって、ループキャッシュを設けてループ内の命令の発行処理を担わせることで、命令デコーダのスループットの向上に要する消費電力の増加をループキャッシュの利用による省電力化で抑制することができる。
【００７７】
以上説明したとおり、本実施の形態の命令デコーダによれば、フェッチ命令にマルチフロー命令が混在しても、命令デコーダのスループットの低下を抑制することができる。
【符号の説明】
【００７８】
I_BUF：命令バッファ
I_DEC：命令デコーダ
RSA,RAE,RSF：リザベーションステーション
PDEC：プリデコーダ
PD0-PD3：プリデコーダのスロット
PDEC_BUF：プリデコーダバッファ
PB0-PB2：プリデコーダバッファのスロット
MDEC：メインデコーダ
D0-D3：メインデコーダのスロット
SEL：セレクタ
IN_FF：入力ラッチ
MI_ANY：マルチフロー命令解析部
MI_DIV：マルチフロー命令分割部
MI：マルチフロー命令
SI：シングル命令
DIV_INSTs：分割命令
EX_INST：実行命令
【図１】
2019169046.tif 000003
【図２】
2019169046.tif 000004
【図３】
2019169046.tif 000005
【図４】
2019169046.tif 000006
【図５】
2019169046.tif 000007
【図６】
2019169046.tif 000008
【図７】
2019169046.tif 000009
【図８】
2019169046.tif 000010
【図９】
2019169046.tif 000011
【図１０】
2019169046.tif 000012
【図１１】
2019169046.tif 000013
【図１２】
2019169046.tif 000014