(57)【要約】【課題】回路構成の複雑化を抑制しつつ、プロセッサの処理速度を高速化する。【解決手段】演算対象のデータの性質に基づいて分類された、第１タイプの命令及び第２タイプの命令を含むプログラムから命令を順次取得してデコードするデコーダと、前記第１タイプの命令を前記デコーダから順次受信して実行する第１演算ユニットと、前記第２タイプの命令のオペランドに含まれる、前記第１演算ユニットに関連するレジスタにセットされる変数値を定数値に置換するオペランド処理回路と、前記デコーダによってデコードされ、前記オペランド処理回路によってオペランドが置換された前記第２タイプの命令をキューイングするバッファと、前記第２タイプの命令を前記バッファから順次取得して実行する第２演算ユニットと、を備えることを特徴とするプロセッサを提供する。【選択図】図３
2008242647.tif 000002
【特許請求の範囲】
【請求項１】
演算対象のデータの性質に基づいて分類された、第１タイプの命令及び第２タイプの命令を含むプログラムから命令を順次取得してデコードするデコーダと、
前記第１タイプの命令を前記デコーダから順次受信して実行する第１演算ユニットと、
前記第２タイプの命令のオペランドに含まれる、前記第１演算ユニットに関連するレジスタにセットされる変数値を定数値に置換するオペランド処理回路と、
前記デコーダによってデコードされ、前記オペランド処理回路によってオペランドが置換された前記第２タイプの命令をキューイングするバッファと、
前記第２タイプの命令を前記バッファから順次取得して実行する第２演算ユニットと、
を備えることを特徴とするプロセッサ。
【請求項２】
前記第２タイプの命令は、前記プログラムの目的の入出力データ、又は前記入出力データの演算途中のデータを演算対象として扱う命令であり、
前記第１タイプの命令は、前記入出力データ又は前記演算途中のデータ以外のデータを演算対象として扱う命令である
ことを特徴とする請求項１に記載のプロセッサ。
【請求項３】
前記第２タイプの命令は、浮動小数のデータを演算対象のデータとして扱う命令であり、
前記第１タイプの命令は、整数のデータを演算対象のデータとして扱う命令である
ことを特徴とする請求項１に記載のプロセッサ。
【請求項４】
前記第１演算ユニットは論理演算装置を含み、
前記第２演算ユニットは浮動小数演算装置を含む
ことを特徴とする請求項１乃至３のいずれか１項に記載のプロセッサ。
【請求項５】
前記デコーダは、分岐予測に基づいて投機実行を制御する投機実行制御回路を備え、
前記投機実行制御回路は、
投機実行されたことを示す投機実行情報を、投機実行される命令にセットし、
前記分岐予測が正しいと判明した場合に、前記投機実行情報がセットされた命令から当該投機実行情報をクリアするように前記第１演算ユニット、前記第２演算ユニット、及び前記バッファを制御し、
前記分岐予測が誤っていると判明した場合に、前記投機実行情報がセットされた命令を取り消すように前記第１演算ユニット、前記第２演算ユニット、及び前記バッファを制御する
ことを特徴とする請求項１乃至４のいずれか１項に記載のプロセッサ。
【請求項６】
前記第２演算ユニットから供給される、前記第２演算ユニットが前記第２タイプの命令を実行中であることを示す信号に応答して、前記第２演算ユニットによる次の前記第２タイプの命令の受信を停止させるストール制御回路を更に備えることを特徴とする請求項１乃至５のいずれか１項に記載のプロセッサ。
【請求項７】
演算対象のデータの性質に基づいて分類された、第１タイプの命令及び第２タイプの命令を含むプログラムから命令を順次取得してデコードするデコーダと、
前記第１タイプの命令を前記デコーダから順次受信して実行する第１演算ユニットと、
前記第２タイプの命令のオペランドに含まれる、前記第１演算ユニットに関連するレジスタにセットされる変数値を定数値に置換するオペランド処理回路と、
前記デコーダによってデコードされ、前記オペランド処理回路によってオペランドが置換された前記第２タイプの命令をキューイングするバッファと、
前記第２タイプの命令に係るレジスタの値を記憶するレジスタファイルと、
を備えるサブプロセッサを複数備え、
更に、
前記第２タイプの命令に係る演算を実行する複数の演算器と、
前記複数のサブプロセッサそれぞれの前記バッファから並行して前記第２タイプの命令を順次取得し、取得した命令により実行される演算の種類に基づいて前記複数の演算器から選択した演算器に前記取得した命令を供給する制御回路と、
を備えることを特徴とするプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算対象のデータの性質に基づいて分類された２つのタイプの命令を含むプログラムのためのプロセッサに関する。
【背景技術】
【０００２】
プロセッサの高速化技術として、パイプライン処理が知られている。パイプライン処理を実行可能なＣＰＵ、デジタル信号プロセッサ（ＤＳＰ）、及び特定用途向けプロセッサ（ＡＳＰ）などのプロセッサ（パイプラインプロセッサ）は、以下の処理を順に実行する（但し、処理のステージ数はプロセッサの実装に依存する）。
【０００３】
（１）命令をデコード
（２）レジスタ又はメモリからソースオペランドをフェッチ
（３）演算を実行
（４）演算結果をレジスタ又はメモリに書き込む
【０００４】
パイプラインプロセッサでは、以下の理由などにより、処理の停滞（パイプラインストール）が発生する場合がある。
【０００５】
（１）リソース（例えばメモリのポート、又は演算リソース）の衝突又は不足
（２）パイプラインレイテンシ（遅延）によって引き起こされる、依存関係のあるデータ（例えばソースオペランド、アドレス、又はフラグ）の準備未完了
【０００６】
パイプラインストールの発生を抑制してプロセッサを更に高速化する技術として、命令の順序を並び替えて実行する、アウト・オブ・オーダー実行（ＯｏＯ実行）が知られている（特許文献１）。
【０００７】
また、プロセッサの高速化のために、分岐命令と分岐の条件を計算するための命令（まとめて、「制御フローコード」と呼ぶ）を、それらを除く通常の命令から分離する技術も知られている（特許文献２）。
【特許文献１】特開２００１−２３６２２２号公報
【特許文献２】特開２００４−１７１２４８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ＯｏＯ実行を実現するためには、プロセッサは命令間の依存関係を確認する必要があり、プロセッサの回路構成が複雑化する。そのため、例えばプロセッサのトランジスタ数の増加と、それに伴う消費電力の増加、チップ面積の大型化、及びコストの上昇などの問題が存在する。この問題は、装置の小型化や消費電力の低減などが求められる移動体デバイスのためのプロセッサにとって、特に深刻である。
【０００９】
また、特許文献２の技術では、分岐条件の判定に使用される変数をループ中で利用できない。即ち、引用文献２の図１（ａ）のソースコードでは、変数ｉが「ｆｏｒ」で始まるループ中で変数ｚ及び変数ｂのインデックスとして利用されている。しかし、引用文献２の図１（ｂ）のアセンブリコードでは、変数ｉを計算するための命令を分離するために、変数ｉのレジスタ（Ｃ６）をループ中で利用することができない。そのため、命令数が増加し、プロセッサの高速化の妨げとなると共に、制御フローコードのためのレジスタを別途用意しなければならないという問題がある。
【００１０】
本発明はこのような状況に鑑みてなされたものであり、回路構成の複雑化を抑制しつつ、プロセッサの処理速度を高速化する技術を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題を解決するために、本発明によれば、演算対象のデータの性質に基づいて分類された、第１タイプの命令及び第２タイプの命令を含むプログラムから命令を順次取得してデコードするデコーダと、前記第１タイプの命令を前記デコーダから順次受信して実行する第１演算ユニットと、前記第２タイプの命令のオペランドに含まれる、前記第１演算ユニットに関連するレジスタにセットされる変数値を定数値に置換するオペランド処理回路と、前記デコーダによってデコードされ、前記オペランド処理回路によってオペランドが置換された前記第２タイプの命令をキューイングするバッファと、前記第２タイプの命令を前記バッファから順次取得して実行する第２演算ユニットと、を備えることを特徴とするプロセッサが提供される。
【００１２】
また、本発明の他の態様によれば、演算対象のデータの性質に基づいて分類された、第１タイプの命令及び第２タイプの命令を含むプログラムから命令を順次取得してデコードするデコーダと、前記第１タイプの命令を前記デコーダから順次受信して実行する第１演算ユニットと、前記第２タイプの命令のオペランドに含まれる、前記第１演算ユニットに関連するレジスタにセットされる変数値を定数値に置換するオペランド処理回路と、前記デコーダによってデコードされ、前記オペランド処理回路によってオペランドが置換された前記第２タイプの命令をキューイングするバッファと、前記第２タイプの命令に係るレジスタの値を記憶するレジスタファイルと、を備えるサブプロセッサを複数備え、更に、前記第２タイプの命令に係る演算を実行する複数の演算器と、前記複数のサブプロセッサそれぞれの前記バッファから並行して前記第２タイプの命令を順次取得し、取得した命令により実行される演算の種類に基づいて前記複数の演算器から選択した演算器に前記取得した命令を供給する制御回路と、を備えることを特徴とするプロセッサが提供される。
【００１３】
なお、その他の本発明の特徴は、添付図面及び以下の発明を実施するための最良の形態における記載によって更に明らかになるものである。
【発明の効果】
【００１４】
以上の構成により、本発明によれば、回路構成の複雑化を抑制しつつ、プロセッサの処理速度を高速化することが可能となる。
【発明を実施するための最良の形態】
【００１５】
以下、添付図面を参照して、本発明の実施形態を説明する。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。
【００１６】
なお、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。また、実施形態の中で説明されている特徴の組み合わせすべてが、本発明に必須とは限らない。
【００１７】
［第１の実施形態］
＜基本的な概念＞
図１のＣ言語で記述されたプログラムを参照して、第１の実施形態の基本的な概念を説明する。
【００１８】
本実施形態のプロセッサが実行する命令は、演算対象のデータの性質に基づいて分類された、オブジェクティブ命令と非オブジェクティブ命令を含む。
【００１９】
オブジェクティブ命令とは、プログラムの目的の入出力データ及びその中間物（計算途中のデータ）を演算対象として扱う命令である。
【００２０】
非オブジェクティブ命令とは、プログラムの目的の入出力データ或いはその中間物以外の、補助的なデータを演算対象として扱う命令である。
【００２１】
図１においては、Ｘ［ｉ］＊Ｙ［ｉ］における乗算命令（＊）や、乗算結果をＺ［ｉ］に代入する代入命令（＝）などがオブジェクティブ命令である。一方、「ｆｏｒ」で始まるループを制御するための変数ｉをインクリメントする命令（＋＋）や、ループの終了を判定するために変数ｉと定数Ｎを比較する命令（＜）などは非オブジェクディブ命令である。
【００２２】
また、本実施形態では、オブジェクティブ命令による演算対象データをオブジェクティブデータと呼び、非オブジェクティブ命令による演算対象データを非オブジェクティブデータと呼ぶ。
【００２３】
なお、同じ種類の演算子（例えば、「＋」）であっても、演算対象データによって、オブジェクティブ命令として扱われる場合もあれば、非オブジェクティブ命令として扱われる場合もあることに注意されたい。
【００２４】
図１においては、Ｘ［ｉ］、Ｙ［ｉ］、Ｚ［ｉ］がオブジェクティブデータであり、Ｎ、ｉが非オブジェクティブデータである。
【００２５】
一般的に、オブジェクティブデータは、単位（メートル、秒、メートル／秒など）を持つ物理量であり、プログラム中では浮動小数として扱われる。これは例えば、携帯電話のプロセッサは、電圧値や電流値などを算出するプログラムを実行するからである。
【００２６】
一方、非オブジェクティブデータは、ループを制御するための変数や配列のインデックスなどとして使用される値であるため、単位を持たず、プログラム中では整数として扱われる。
【００２７】
従って、一実施形態においては、オブジェクティブ命令は浮動小数のデータを演算対象のデータとして扱い、非オブジェクティブ命令は整数のデータを演算対象のデータとして扱うものとしてもよい。
【００２８】
本実施形態の基本的な概念は、プロセッサがオブジェクティブ命令と非オブジェクティブ命令とを分離し、それぞれを並行して実行することである。そのため、本発明のプロセッサは、オブジェクティブ命令用の浮動小数演算装置（浮動小数ＡＬＵ）と、非オブジェクティブ命令用の論理演算装置（整数ＡＬＵ）とを備える。
【００２９】
通常、プロセッサがオブジェクティブ命令を実行するには、非オブジェクティブ命令を実行するよりも多くのサイクル数を要する。そのため、本実施形態に係るプロセッサが図１のプログラムを実行すると、変数ｉに関連する処理（即ち、非オブジェクティブ命令の実行）は早期に完了し、プログラムのループは次のように展開される。
【００３０】
Ｚ［０］＝Ｘ［０］＊Ｙ［０］
Ｚ［１］＝Ｘ［１］＊Ｙ［１］
Ｚ［２］＝Ｘ［２］＊Ｙ［２］
Ｚ［３］＝Ｘ［３］＊Ｙ［３］
・・・
・・・
・・・
Ｚ［９９９］＝Ｘ［９９９］＊Ｙ［９９９］
【００３１】
浮動小数ＡＬＵは、展開済みの演算を順次実行すればよいので、非オブジェクティブ命令を分離しない場合に比べて高速に演算を完了することができる。
【００３２】
図２は、図１に示すプログラムをコンパイルして得られるアセンブリコードの一例を示す図である。ここで注意すべきことは、ループを制御するための変数ｉの値（レジスタｒ３にセットされる変数値）が、ループ中で配列Ｘ、Ｙ、及びＺのインデックスとしても使用されていることである。
【００３３】
図２に示すアセンブリコードにおいて、非オブジェクティブ命令とオブジェクティブ命令とを単純に分離しただけでは、プロセッサはレジスタｒ３を変化させる非オブジェクティブ命令
ａｄｄ  ｒ３，  ＃１
を、レジスタｒ３を使用するオブジェクティブ命令
ｆｍｏｖ  ｆｒ０，  ＠（ｒ０＋４＊ｒ３）
ｆｍｏｖ  ｆｒ１，  ＠（ｒ１＋４＊ｒ３）
ｆｍｏｖ  ＠（ｒ２＋４＊ｒ３），  ｆｒ０
よりも先に実行することができない。仮に、先に実行してしまったとすると、配列Ｘ、Ｙ、及びＺのインデックスの値は非オブジェクティブ命令の実行に依存して変化し、正しいメモリアドレスを指し示すことができない。
【００３４】
なお、アセンブリコードを生成するコンパイラを、オブジェクティブ命令と非オブジェクティブ命令が共通のレジスタを使用しないように構成することも可能であるが、「課題を解決するための手段」の欄で説明した通り、命令数の増加及び必要なレジスタ数の増加を招くため、本実施形態では採用しない。
【００３５】
そこで、本実施形態に係るプロセッサは、以下に詳述する構成を備える。
【００３６】
なお、全てのオブジェクティブ命令が浮動小数ＡＬＵによって処理されるわけでは必ずしもない。同様に、全ての非オブジェクティブ命令が整数ＡＬＵによって処理されるわけでは必ずしもない。例えば、図２のアセンブリコードにおける条件分岐命令（ｊｌｅ）は非オブジェクティブ命令であるが、整数ＡＬＵではなく、命令デコーダによって処理される。
【００３７】
＜プロセッサ３００の構成＞
図３は、第１の実施形態に係るプロセッサ３００の構成例を示すブロック図である。また、図４はプロセッサ３００の命令セットの一例を示す図、図５はプロセッサ３００が備えるレジスタの一例を示す図、図６は本実施形態におけるオペランドの表記法を説明する図である。本実施形態では、図４の整数命令が非オブジェクティブ命令であり、浮動小数命令がオブジェクティブ命令であるものとする。従って、整数データが非オブジェクティブデータであり、浮動小数データがオブジェクティブデータである。しかし、オブジェクティブ命令（及びデータ）、及び非オブジェクティブ命令（及びデータ）の定義は「基本的な概念」のセクションで説明した通りであり、これに限られるものではない。また、制御命令は、非オブジェクティブ命令であるが、後述する命令デコーダ３０５内で処理される。制御命令が図４に示すｊｌｅのようにフラグレジスタｃｃを分岐で使用する場合は、図３に示すように、フラグレジスタの値が整数レジスタファイル３１１あるいは浮動小数レジスタファイル３１３から命令デコーダ３０５に供給される。ここでフラグレジスタｃｃはソフトウエアから見た論理フラグレジスタであり、直前のフラグ生成を行う命令が整数演算であるか浮動小数演算であるかに応じて、整数レジスタファイル３１１あるいは浮動小数レジスタファイル３１３内の物理フラグレジスタ値（ｉｃｃあるいはｆｃｃ）のいずれかが選択される。整数部３０６と浮動小数部３０７がそれぞれ物理フラグレジスタを持つのは、整数部３０６と浮動小数部３０７における演算が並行して実行されるためである。仮に物理フラグレジスタが１つしかなく整数と浮動小数で共有されている場合、ＦＩＦＯ３０８（バッファ）によるキューイングのため遅れて実行されたオブジェクティブ命令が生成するフラグ値が、非オブジェクティブ命令により生成されたフラグ値を破壊するという問題が発生する。
【００３８】
図３において、プロセッサ３００は、メモリ３０１、メモリインタフェース（Ｉ／Ｆ）３０２、命令キュー及びフェッチ制御回路３０３、プログラムカウンタ３０４、命令デコーダ３０５、整数部３０６、浮動小数部３０７、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎｐｕｔ  Ｆｉｒｓｔ  Ｏｕｔ）３０８、オペランド処理回路３０９、及び変換回路３１４を備える。但し、図３に示す全てのブロック（構成要素）がプロセッサ３００に一体形成される必要は無い。例えば、メモリ３０１は、プロセッサ３００とは別のチップ上に備えられていてもよい。ＦＩＦＯ３０８は、半導体メモリなどの記憶素子によって実装可能である。
【００３９】
なお、本実施形態では、プロセッサ３００はＲＩＳＣプロセッサであるものとするが、ＣＩＳＣプロセッサに対しても本実施形態の概念を適用可能である。ここで言うＲＩＳＣプロセッサとは、ＡＬＵとメモリＩ／Ｆが並列接続されており、１命令でメモリアクセスと主たる演算のいずれか一方しかできないプロセッサのことである（図１１（ａ）参照）。ＣＩＳＣプロセッサに適用した場合は、メモリから読み出した入力オペランド値をＡＬＵに供給し、演算結果をメモリに書き戻すというという処理を１命令で行っても良い（図１１（ｂ）参照）。また、後述する整数ＡＬＵ３１０及び浮動小数ＡＬＵ３１２が受け付け可能なオペランドは、入力オペランドが２つまで、出力オペランドは１つであるものとするが、これに限られるものではない。
【００４０】
メモリ３０１は、プロセッサ３００が実行するプログラムや、プログラムによって処理されるデータを格納するためのものであり、メモリＩ／Ｆ３０２を介して他の構成要素からアクセスされる。
【００４１】
命令キュー及びフェッチ制御回路３０３は、プログラムカウンタ３０４が示すアドレスに従って、メモリ３０１から命令を取得し、キューイングする。
【００４２】
命令デコーダ３０５は、命令キュー及びフェッチ制御回路３０３から古い順（キューイングされた順）に命令を取得してデコードし、命令がオブジェクティブ命令か非オブジェクティブ命令かを判定する。
【００４３】
命令が非オブジェクティブ命令であれば、命令デコーダ３０５は、整数部３０６を制御する制御信号を生成する。整数部３０６の制御信号は、演算ユニット制御信号、レジスタファイル制御信号、及びメモリアクセス制御信号を含む。演算ユニット制御信号は、整数ＡＬＵ３１０に実行させる演算の種類（加算、減算等）を示す。レジスタファイル制御信号は、整数レジスタファイル３１１に含まれるレジスタのうち、アクセス対象のレジスタを示す。メモリアクセス制御信号は、整数部３０６がアクセスする、メモリ３０１における読み書きの制御信号を示す。
【００４４】
命令がオブジェクティブ命令であれば、命令デコーダ３０５は、浮動小数部３０７を制御する制御信号を生成し、ＦＩＦＯ３０８にキューイングする。ＦＩＦＯ３０８が一杯（フル）の場合は、ＦＩＦＯ３０８はＦＩＦＯ制御信号によって命令デコーダ３０５に通知し、ＦＩＦＯ３０８に空きができるまで命令デコーダ３０５は処理を停止する。浮動小数部３０７の制御信号は、演算ユニット制御信号、レジスタファイル制御信号、及びメモリアクセス制御信号を含む。演算ユニット制御信号は、浮動小数ＡＬＵ３１２に実行させる演算の種類を示す。レジスタファイル制御信号は、浮動小数レジスタファイル３１３に含まれるレジスタのうち、アクセス対象のレジスタを示す。メモリアクセス制御信号は、浮動小数部３０７がアクセスする、メモリ３０１における読み書きの制御信号を示す。
【００４５】
また、命令のオペランドに定数が含まれていた場合、命令デコーダ３０５はその定数をオペランド処理回路３０９に供給する。
【００４６】
更に、命令がオブジェクティブ命令であっても、命令のオペランドに整数レジスタが含まれていた場合、命令デコーダ３０５はその整数レジスタを示すレジスタファイル制御信号を生成して整数レジスタファイル３１１に供給することにより、その整数レジスタの値をオペランド処理回路３０９に供給する。
【００４７】
オペランド処理回路３０９は、オペランドを処理するが、その処理内容はオペランドがメモリを参照するタイプ（図６で＠マーク付きのもの）であるか否かによって異なる。また、命令がオブジェクティブ命令の場合と非オブジェクティブ命令の場合とでも異なる。なお、前述の通り、オペランドに含まれる定数は命令デコーダ３０５から供給され、整数レジスタの値は整数レジスタファイル３１１から供給される。
【００４８】
●オペランドがメモリを参照するタイプである場合
オペランド処理回路３０９は、オペランドのアドレスの演算を行う。例えば、オペランドが＠（ｒ０＋４＊ｒ３）であり、レジスタｒ０の値が０ｘ１０００、レジスタｒ３の値が０ｘ１００の場合、オペランド処理回路３０９は、ｒ０＋４＊ｒ３を計算することにより、アドレス０ｘ１４００を求める。
【００４９】
命令が非オブジェクティブ命令の場合、オペランド処理回路３０９はメモリＩ／Ｆ３０２にアドレス０ｘ１４００を供給する。メモリＩ／Ｆ３０２は、オペランドの位置に応じて、メモリ３０１のアドレス０ｘ１４００のデータをＩＸ−バス又はＩＹ−バスを介して整数ＡＬＵ３１０に供給するか、或いは、整数ＡＬＵ３１０による演算結果をＩＺ−バスを介してメモリ３０１のアドレス０ｘ１４００に書き込む。
【００５０】
命令がオブジェクティブ命令の場合、オペランド処理回路３０９は、＠（ｒ０＋４＊ｒ３）というオペランドを、アドレス演算後の＠（０ｘ１４００）というオペランドに変換し、ＦＩＦＯ３０８に供給する。これにより、例えば図２の
ｆｍｏｖ  ｆｒ０，  ＠（ｒ０＋４＊ｒ３）
という命令は、
ｆｍｏｖ  ｆｒ０，  ＠（０ｘ１４００）
という命令に変換される（厳密には、命令は命令デコーダ３０５によって浮動小数部３０７の制御信号の形式にデコードされている）。即ち、オペランド処理回路３０９は、オブジェクティブ命令のオペランドに含まれる、変数としての整数部３０６に係るレジスタ（例えば、ｒ０やｒ３など）の値を定数値に置換する。更に、置換後の定数値間の演算（例えば、加算や乗算）も実行してもよい。
【００５１】
これにより、ループを制御するための変数ｉを格納したレジスタｒ３との依存関係が解消される。変換された後の非オブジェクティブ命令はＦＩＦＯ３０８でキューイングされ、浮動小数部３０７が空き次第実行が開始される。メモリＩ／Ｆ３０２は、メモリを参照するオペランドの位置に応じて、メモリ３０１のアドレス０ｘ１４００の読み出しデータをＦＺ−バスを介して浮動小数レジスタファイル３１３に書き込むか、或いは、浮動小数レジスタファイル３１３から読み出されたデータをＦＸ−バス又はＦＹ−バスを介してメモリ３０１のアドレス０ｘ１４００に書き込む。上記の例では、オペランド「＠（０ｘ１４００）」は１つ目の入力オペランドであるので、メモリ３０１のアドレス０ｘ１４００のデータがＦＺ−バスを介して浮動小数レジスタファイル３１３に書き込まれる。
【００５２】
ＣＩＳＣプロセッサに適用する場合は、メモリをオペランドの位置に応じて、メモリ３０１のアドレス０ｘ１４００の読み出しデータをＦＺ−バスを介して浮動小数ＡＬＵ３１２に供給するか、或いは浮動小数ＡＬＵによる演算結果をＦＺ−バスを介してメモリに書き込む。入出力ともにメモリを参照するオペランドを持つ命令の場合は、これらの両方を行う。
【００５３】
●オペランドがメモリを参照しないタイプである場合
命令がオブジェクティブ命令の場合、ｆｍｏｖ以外の命令は、浮動小数のオペランドのみが使用可能である。このため、浮動小数部３０７と整数部３０６との間の依存関係の解消は必要ない。
【００５４】
整数データを浮動小数データに変換する場合、及び浮動小数データを整数データに変換する場合は、下記の通り、ｆｍｏｖのオペランドに整数レジスタが含まれる。
【００５５】
ｆｍｏｖ  ｆｒ０，  ｒ３  （整数を浮動小数に変換）
ｆｍｏｖ  ｒ３，  ｆｒ０  （浮動小数を整数に変換）
【００５６】
前者の場合、オペランド処理回路３０９がレジスタｒ３の値を取得してＦＩＦＯ３０８に供給し、浮動小数ＡＬＵ３１２がレジスタｒ３の値を浮動小数レジスタ３１３内のレジスタｆｒ０に書き込む。
【００５７】
後者の場合、ｆｍｏｖ命令は、変換回路３１４によって処理される。変換回路３１４は、浮動小数を整数に変換し、ＩＺ−バスを経由して変換結果を整数レジスタファイル３１１内のレジスタｒ３に書き込む。
【００５８】
なお、いずれの場合も、浮動小数部３０７と整数部３０６との間に依存関係が存在する。従って、変換元のデータの準備が完了するまで処理を停止するか、或いは、他の方法で依存関係を解消する必要がある（詳細は後述）。
【００５９】
整数部３０６は、整数ＡＬＵ３１０、整数レジスタファイル３１１、ＩＸ−バス、ＩＹ−バス、及びＩＺ−バスを含む。整数ＡＬＵ３１０は、命令デコーダ３０５から供給される演算ユニット制御信号に従って非オブジェクティブ命令を実行する。このとき、入力オペランドはＩＸ−バス及びＩＹ−バスの少なくとも一方を介して供給される。出力オペランドは、ＩＺ−バスに通知され、整数ＡＬＵ３１０の演算結果は、出力オペランドに従って整数レジスタファイル３１１に供給される（ＣＩＳＣプロセッサに適用する場合はメモリ３０１にも供給可能）。
【００６０】
浮動小数部３０７は、浮動小数ＡＬＵ３１２、浮動小数レジスタファイル３１３、ＦＸ−バス、ＦＹ−バス、及びＦＺ−バスを含む。浮動小数部３０７は、ＦＩＦＯ３０８から古い順（キューイングされた順）に命令（命令デコーダ３０５でデコードされて得られた制御信号、及びオペランド処理回路で得られたオペランド）の供給を受け付ける。浮動小数ＡＬＵ３１２は、ＦＩＦＯ３０８から供給される演算ユニット制御信号に従ってオブジェクティブ命令を実行する。このとき、入力オペランド値はＦＸ−バス及びＦＹ−バスの少なくとも一方を介して供給される。出力オペランド値は、ＦＺ−バスに通知され、浮動小数ＡＬＵ３１２の演算結果は、出力オペランドに従って浮動小数レジスタファイル３１３に供給される(ＣＩＳＣプロセッサに適用する場合はメモリ３０１にも供給可能)。
【００６１】
なお、プロセッサ３００は、整数部３０６を複数備えていてもよいし、また、浮動小数部３０７を複数備えていてもよい。
【００６２】
以上の構成により、プロセッサ３００は、実行に要するサイクル数が比較的多いオブジェクティブ命令と、実行に要するサイクル数が比較的少ない非オブジェクティブ命令とを分離し、それぞれを並行して実行することができる。
【００６３】
これにより、プロセッサの処理速度が高速化される。
【００６４】
ところで、プロセッサ３００は、例えば他の命令によって生成される演算対象のデータの準備（演算）が完了していない状況など、データやリソースの依存関係が原因で、処理を一時的に停止（ストール）しなければならない場合がある。以下では、プロセッサ３００がストールを制御するための構成と、ストールの発生を抑制して処理を高速化するための構成を説明する。
【００６５】
＜ストール制御＞
データやリソースの依存関係の例としては、アドレス生成によるもの（ＡＧＩ（Ａｄｄｒｅｓｓ  Ｇｅｎｅｒａｔｉｏｎ  Ｉｎｔｅｒｌｏｃｋ）ストール）、データ或いはフラグの依存関係によるもの、メモリアクセス待ちによるもの、演算リソース待ちによるものなどがある。
【００６６】
図９は、プロセッサ３００における、ストール制御のための構成例を示す図である。図９において、図３の構成要素と同一の構成要素には同一の符号を付し、説明を省略する。
【００６７】
プロセッサ３００は、ＡＧＩストール制御回路９０１、整数データ依存ストール制御回路９０２、及び浮動小数ストール制御回路９０３を備える。
【００６８】
●ＡＧＩストール制御
例えば図２のアセンブリコードに示される、
ｍｏｖ  ｒ３，  ＃０                        …（１）
ｆｍｏｖ  ｆｒ０，  ＠（ｒ０＋４＊ｒ３）    …（２）
という連続する２つの命令において、レジスタｒ３の依存関係があり、オペランド処理回路３０９が命令（２）のオペランドを処理する前にレジスタｒ３の値が確定しなければならない（即ち、命令（１）の実行結果が整数レジスタファイル３１１に書き戻されなければならない）。しかしながら、整数部３０６のパイプラインレイテンシのためにレジスタｒ３の値が確定できない場合は、処理待ちを行わなければならない。このため、ＡＧＩストール制御回路９０１は、オペランド処理回路３０９の前になければならない。ＡＧＩストールが必要かどうかは、整数レジスタの番号（ｒ３の３という番号）には依存するが、レジスタｒ３の内容には依存しない。
【００６９】
●データ生成の依存関係によるストール制御
連続する２つの命令、例えば、
ｆｍｏｖ  ＠（ｒ０），  ｆｒ１              …（３）
ｆｍｏｖ  ｆｒ０，＠（ｒ２＋４＊ｒ３）      …（４）
において、オペランド「＠（ｒ０）」と「＠（ｒ２＋４＊ｒ３）」が同じアドレスを指すかどうかは、オペランドのアドレスが確定したあとでなければ検出できない。データ生成の依存関係のストール制御回路はオペランド処理回路３０９の後になければならない（整数データ依存ストール制御回路９０２に対応）。
【００７０】
更に、浮動小数部３０７がメモリ３０１にアクセスするときに、メモリ３０１がビジーであるかどうかは、浮動小数部３０７がメモリ３０１にアクセスする直前まで分からない。また、例えば、図４に示したｆｓｑｒｔ命令で、誤差（この場合、演算結果の候補の二乗から入力値を引いたもの）を計算してそれが基準以内なら演算を終了するという場合、サイクル数は入力値に依存するので、演算が終了するまで知ることができない。こうした場合は、メモリ３０１あるいは浮動小数ＡＬＵ３１２等のビジー信号を用いて、ＦＩＦＯ３０８の後で浮動小数演算のストールを制御する必要がある（浮動小数ストール制御回路９０３に対応）。例えば、浮動小数部３０７は、ｆｓｑｒｔ命令を実行中の間、ビジー信号を浮動小数ストール制御回路９０３に供給する。浮動小数ストール制御回路９０３は、ビジー信号に応答して、浮動小数部３０７がＦＩＦＯ３０８から次の命令を受信することを停止させる。
【００７１】
＜バイパス回路＞
プロセッサ３００は、図７及び図８に示すようにパイプライン及びバイパス回路（ＢＰ）を備えることができる。図７及び図８において、図３の構成要素と同一の構成要素には同一の符号を付し、説明を省略する。
【００７２】
●同じ種類の命令におけるレジスタのデータのバイパス（図８参照）
例えば図２のアセンブリコードに示される、
ｆｍｏｖ  ｆｒ０，  ＠（ｒ０＋４＊ｒ３）    …（Ａ）
ｆｍｏｖ  ｆｒ１，  ＠（ｒ１＋４＊ｒ３）    …（Ｂ）
ｆｍｕｌ  ｆｒ０，  ｆｒ０，  ｆｒ１        …（Ｃ）
という連続する３つの命令において、命令（Ｂ）の実行結果は１命令後の命令（Ｃ）で使用され、命令（Ａ）の実行結果は２命令後の命令（Ｃ）で使用される。ここで、命令（Ａ）と命令（Ｂ）の実行結果はそれぞれ、メモリＩ／Ｆ３０２を通して浮動小数ＡＬＵ３１２へ同じサイクル数（レイテンシ）でＦＺ−バスに供給されるものとする。命令（Ｃ）が浮動小数レジスタファイル３１３のレジスタｆｒ０及びｆｒ１の内容を選択する時点で、命令（Ａ）及び命令（Ｂ）の実行結果の浮動小数レジスタファイル３１３への格納は完了していない。そこで、命令（Ａ）の実行結果は、バイパス回路８０３を通してレジスタｆｒ０の値の代わりに供給され、命令（Ｂ）の実行結果はバイパス回路８０２を通してＥＸ（Ｅｘｅｃｕｔｉｏｎ）ステージに直接供給することで、実行結果が浮動小数レジスタファイル３１３に書き戻されるのを待つことなく、命令（Ｃ）の実行が可能となる。バイパス条件としては、データの行き先とデータの由来元の比較を行い、一致すればバイパス回路よりデータが供給される。
【００７３】
●アドレス生成におけるバイパス（図７参照）
例えば図２のアセンブリコードに示される、
ｍｏｖ  ｒ３，  ＃０                        …（Ｄ）
ｆｍｏｖ  ｆｒ０，  ＠（ｒ０＋４＊ｒ３）    …（Ａ）
という連続する２つの命令において、命令（Ｄ）の実行結果は命令（Ａ）のオペランドのアドレスの計算で使用される。命令（Ａ）の実行結果が整数レジスタファイル３１１に書き戻されるためには、命令（Ａ）は２サイクル待たなければならない。そこで、命令（Ｄ）の実行結果をバイパス回路７０６を通して整数レジスタファイル３１１からの値の代わりに供給することで、命令（Ａ）の待ち時間が１サイクルに短縮される。
【００７４】
●メモリのバイパス
２つの連続する命令、例えば、
ｆｍｏｖ  ＠（ｒ０），  ｆｒ１              …（Ｅ）
ｆｍｏｖ  ｆｒ２，  ＠（ｒ２＋４＊ｒ３）    …（Ｆ）
で、オペランド「＠（ｒ０）」と「＠（ｒ２＋４＊ｒ３）」とが同じアドレスを指し示す場合は、命令（Ｅ）と命令（Ｆ）との間に依存関係が存在するが、異なるアドレスである場合は依存関係が存在しない。このため、オペランドの処理結果に応じてパイパスをさせるか、ストール制御をすることが必要である。この場合のバイパス回路は、図７及び図８に示すバイパス回路と同様にメモリインタフェース３０２内部に実装可能である。
【００７５】
●フラグ値のバイパス
フラグレジスタ（ｉｃｃ又はｆｃｃ）の値も、データの場合と同様に、バイパス回路７０７又はバイパス回路８０５を設けることで、フラグを使用する命令の待ち時間を短縮あるいはゼロにすることができる。
【００７６】
●オペランド処理回路３０９を経由した値がＡＬＵにロードされる場合（図７参照）
２つの連続する命令、例えば、
ｍｏｖ  ｒ３，  ＃０                        …（Ｇ）
ｍｏｖ  ｒ２，  ｒ０＋４＊ｒ３              …（Ｈ）
で、命令（Ｇ）の実行結果は命令（Ｈ）のオペランドの計算で使用される。この場合、命令（Ｈ）のオペランド「ｒ０＋４＊ｒ３」内に、命令（Ｇ）の実行結果を収めるレジスタｒ３が入るが、バイパス回路７０１を経由して、命令（Ｇ）の結果を命令（Ｈ）に供給してはいけない。（仮にパイパス回路７０１を使用すると、命令（Ｈ）のオペランド「ｒ０＋４＊ｒ３」が、ｒ３の値に置き換えられてしまう。）この場合、命令（Ｈ）の実行開始を１サイクル遅らせて、整数レジスタファイル３１１内のバイパス回路７０６を使用して命令（Ｇ）の実行結果をオペランド処理回路３０９に供給するのが、最も待ち時間が少ない。
【００７７】
また、例えば、
ｆｍｏｖ  ｆｒ３，  ＃０ｘ１０００          …（Ｉ）
のように定数値をロードする命令の場合、この前の命令が何であっても依存関係が存在しない。
【００７８】
これらを実現するために、オペランド処理回路を経由してＩＸ、ＩＹ、ＦＸ、ＦＹのいずれかのバスに供給される信号の場合、由来元として、いずれにも属さないＮＵＬＬとすることでＡＬＵ内のバイパス回路（７０１、７０２、８０１、８０２）の動作を防止する。
【００７９】
＜投機実行＞
プロセッサ３００は、投機実行機能を備えることができる。投機実行を利用すると、プロセッサ３００は、分岐条件の計算の完了を待つことなく、分岐予測（計算結果の予測）に基づいて処理を分岐し、分岐後の命令を実行することができる。分岐予測の正誤は、分岐条件の計算の完了により確定する。分岐予測が誤っていた場合は、投機実行により実行された命令を取り消す必要がある。
【００８０】
図１０は、プロセッサ３００に投機実行機能を追加した構成例を示す図である。図１０において、図３に示す各構成要素と同一の構成要素には同一の符号を付し、説明を省略する。
【００８１】
命令デコーダ３０５は、分岐予測回路１００１及び投機実行制御回路１００２を備える。デコードされた命令が条件分岐命令（例えば、図４に示すｊｌｅ）である場合、分岐予測回路１００１は、分岐条件の計算結果を予測し、投機実行制御回路１００２に通知する。投機実行制御回路１００２は、投機実行される命令（厳密には、デコードされた制御信号）に、その命令が投機実行されたことを示す投機実行フラグ（投機実行情報）をセットする。図１０においては、「１」が投機実行フラグがセットされた状態を示し、「０」が投機実行フラグがセットされていない（或いは、クリアされた）状態を示す。
【００８２】
ところで、オブジェクティブ命令の場合は、ＦＩＦＯ３０８にキューイングされるため、ＦＩＦＯ３０８にキューイングされている命令も含めて取り消す必要がある。ＦＩＦＯ３０８にキューイングされている命令の数は、処理状況に応じて変動するため、取り消す命令の数（分岐予測の誤りが判明してから何命令先まで取り消すかという数）に基づいて対応するパイプラインのステージを一意に定めることができない。
【００８３】
そこで、投機実行制御回路１００２は、承認信号と取り消し信号を用いて、投機的に発行された命令の制御を行う。分岐予測が正しいと判明したとき、投機実行制御回路１００２は、プロセッサ３００で実行されているパイプライン中の全命令に対して承認信号を発行し、投機実行フラグのクリアを行う。一方、分岐予測が誤っていると判明したとき、投機実行制御回路１００２は、プロセッサ３００で実行されているパイプライン中の全命令に対して取り消し信号を発行し、投機実行フラグがセットされている命令の削除を行う。投機実行フラグがセットされていない命令に対しては、承認信号或いは取り消し信号が発行されてもこのような操作は行われず、処理が継続される。承認信号も取り消し信号も発行されなかった場合は、パイプライン中の制御信号は、投機実行フラグの状態を維持したまま次のステージに移動する。
【００８４】
分岐予測が誤っており、投機実行を取り消した場合は、命令デコーダ３０５は予測対象の分岐命令まで戻り、フラグレジスタｃｃの値に基づいて分岐をやり直す。
【００８５】
本実施形態において、条件分岐命令は２つの候補の経路（分岐先）の中から１つの経路を選択するものであるが、３つ以上の候補から１つの経路を選択する条件分岐命令にも、ここで説明した投機実行は適用可能である。
【００８６】
また、本実施形態において、投機実行中に別の投機実行による分岐（即ち、投機実行のネスト）は行わないものとする。しかし、投機実行フラグを複数ビットに拡張すれば、投機実行のネストを行う場合も、投機実行制御回路１００２は、投機実行の承認及び取り消しの制御を行うことが可能である。
【００８７】
また、分岐予測は、必ず特定の分岐先を選択したり、前回の分岐先を選択したりするなど、任意の基準で実行することができる。
【００８８】
＜フラグの依存性＞
フラグ（フラグレジスタの値）は、整数ＡＬＵ３１０あるいは浮動小数ＡＬＵ３１２による演算によって生成され、条件分岐命令ｊｌｅ、整数或いは浮動小数の条件付選択命令ｓｅｌ，ｆｓｅｌなど（図４参照）で使用される。前述のように、オブジェクティブ命令と非オブジェクティブ命令とは並行して実行されるため、フラグを生成する命令と、フラグを使用する命令との間で、フラグに起因する依存関係が発生する場合がある。
【００８９】
従って、例えば、非オブジェクティブ命令で生成されるフラグがオブジェクティブ命令で使用される場合は、対応関係を保ったままフラグをオブジェクティブ命令へ伝播させる必要がある。反対に、オブジェクティブ命令で生成されるフラグが非オブジェクティブ命令（或いは、命令デコーダ３０５で実行される制御命令）で使用される場合は、浮動小数ＡＬＵ３１２でのオブジェクティブ命令の実行（フラグ生成）を待つ必要がある。以下、具体的に説明する。
【００９０】
●非オブジェクティブ命令で生成されるフラグがオブジェクティブ命令で使用される場合
例えば、最も直前の整数フラグレジスタｉｃｃの値を生成する命令が、
ｃｍｐ  ｒ３，＃０ｘ１０                      …（Ｊ）
であり、レジスタｉｃｃに基づきレジスタｆｒ１かレジスタｆｒ２のいずれかを選択してレジスタｆｒ０に代入する命令が、
ｆｓｅｌ  ｆｒ０，ｆｒ１，ｆｒ２              …（Ｋ）
であるとする。命令（Ｋ）は、以下のように関数ｆを用いてオペランド２個の命令として表すことができる。
【００９１】
ｆｍｏｖ  ｆｒ０，ｆ（ｉｃｃ，ｆｒ１，ｆｒ２）  …（Ｌ）
【００９２】
非オブジェクティブ命令によるメモリアクセスと同様に、オペランド処理回路３０９で、オペランド「ｆ（ｉｃｃ，ｆｒ１，ｆｒ２）」をレジスタｉｃｃに基づきｆｒ１あるいはｆｒ２に置換することにより、命令（Ｌ）は、
ｆｍｏｖ  ｆｒ０，ｆｒ１                      …（Ｍ）
あるいは、
ｆｍｏｖ  ｆｒ０，ｆｒ２                      …（Ｎ）
という命令に変換される（厳密には、命令は命令デコーダ３０５によって浮動小数部３０７の制御信号の形式にデコードされている）。これにより、レジスタｉｃｃとの依存関係が解消される。
【００９３】
●オブジェクティブ命令で生成されるフラグが非オブジェクティブ命令或いは制御命令で使用される場合
オブジェクティブ命令で生成されるフラグを、非オブジェクティブ命令或いは制御命令へ伝播させるためには、浮動小数部３０７の処理待ちをする必要がある。この場合、命令デコーダ３０５は、非オブジェクティブ命令のデコードを停止（或いは、制御命令のデコードを停止）することで、同期処理を行う。
【００９４】
多くの物理演算は微分可能な関数（連続でかつ滑らかな関数）で表され、物理量をもとに分岐が行われることは少ない。例えば、ＷＣＤＭＡ受信機における物理データの演算においては、浮動小数の比較に基づく分岐は全体の演算の１％程度である。このため、浮動小数部３０７での処理を待っても処理性能に大きな影響は出ない。
【００９５】
なお、命令デコーダ３０５は、フラグの生成を待つことなく投機実行を行ってもよい。
【００９６】
例えば、最も直前のフラグを生成する命令が、
ｆｃｍｐ  ｆｒ３，＃０ｘ１０                  …（Ｏ）
であり、そのレジスタｆｃｃに基づきｒ１かｒ２のいずれかを選択してｒ０に代入する命令が、
ｓｅｌ  ｒ０，ｒ１，ｒ２                      …（Ｐ）
であるとき、浮動小数部３０７でのフラグの生成を待たずに、例えば前回の演算結果などに基づいて投機的にｒ１あるいはｒ２を選択してｒ０に代入することができる。この場合、ＦＩＦＯ３０８が整数部３０６のパイプライン長よりも深い場合、浮動小数部３０７おける命令（Ｏ）の開始前に、命令（Ｐ）の投機実行の結果がレジスタｒ０に格納されてしまうという問題が発生する。この場合の投機実行をキャンセルするためには、投機実行前のレジスタｒ０の内容を保存しておかなければならない。そこで、図１０に示した投機実行フラグを用いて、投機実行前のレジスタｒ０の保存等の制御を行うことができる。
＜浮動小数と整数との間の変換＞
浮動小数と整数の変換を行う場合は、フラグの依存性と同様の処理が必要である。整数を浮動小数に変換する場合は、対応関係を保ったまま伝播させる必要がある。逆に、浮動小数を整数に変換する場合は、浮動小数演算の処理待ちをする必要がある。
【００９７】
●整数から浮動小数への変換
非オブジェクティブ命令からオブジェクティブ命令へのフラグの伝播と同様に、オペランド処理回路３０９で整数レジスタのオペランドを浮動小数レジスタのオペランドへ変換することができる。
【００９８】
●浮動小数から整数への変換
浮動小数から整数への変換結果を整数部３０６が直ちに使用する場合は、オブジェクティブ命令から条件分岐命令あるいは非オブジェクティブ命令へのフラグの伝播と同様に、浮動小数部３０７の処理待ちをする必要がある。この場合はハードウェアにより同期処理を行い、浮動小数部３０７と整数部３０６を直結する変換回路３１４で浮動小数部３０７から整数部３０６へ変換結果が転送されるのが好ましい。変換結果を直ちに使用しない場合は、浮動小数部３０７が変換結果をメモリへ格納して、必要になった段階で整数部３０６が読み出して使用することもできる。
【００９９】
以上説明したように、本実施形態によれば、プロセッサ３００が実行するプログラムは、演算対象のデータの性質に基づいて分類された２種類の命令を含む。２種類の命令は、典型的には、実行に要するサイクル数が比較的多いオブジェクティブ命令と、実行に要するサイクル数が比較的少ない非オブジェクティブ命令とである。プロセッサ３００は、命令デコーダ３０５及びＦＩＦＯ３０８を備える。命令デコーダ３０５は、オブジェクティブ命令をＦＩＦＯ３０８に供給し、オブジェクティブ命令と非オブジェクティブ命令とを、それぞれ異なる演算部（例えば、浮動小数部３０７と整数部３０６）に実行させる。浮動小数部３０７と整数部３０６は、それぞれオブジェクティブ命令と非オブジェクティブ命令を並行して実行する。
【０１００】
この構成により、プロセッサの回路構成の複雑化を抑制しつつ、処理速度を高速化することが可能となる。従って、トランジスタ数の増加と、それに伴う消費電力の増加、チップ面積の大型化、及びコストの上昇などを抑制しつつ、より高速なプロセッサを提供することが可能となる。
【０１０１】
［第２の実施形態］
第２の実施形態では、演算リソース（具体的には浮動小数ＡＬＵ）を複数のプロセッサで共有することにより、回路構成の複雑化を抑制しつつ、複数の命令を並列に実行可能に構成されたプロセッサを説明する。
【０１０２】
図１２は、第２の実施形態に係るプロセッサ１２００の構成例を示すブロック図である。プロセッサ１２００は、第１の実施形態に示したプロセッサ３００から浮動小数ＡＬＵ３１２を除いたプロセッサを１単位（以下、「単位プロセッサ」或いは「サブプロセッサ」と呼ぶ）とし、複数の単位プロセッサ１２０１、１２０２、及び１２０３を備える（単位プロセッサの数は、３個に限られるものではない）。また、プロセッサ１２００は、浮動小数ＡＬＵの演算リソースを共用する。プロセッサ１２００は、演算リソースとして、加算器、乗算器、平方根器等、さまざまな演算器を備えるが、これらの演算リソースが同時に使用されることは比較的少ない。そこで、演算リソースを複数の単位プロセッサで共有することで、回路規模が削減される。
【０１０３】
図１２において、プロセッサ１２００は、演算リソースとして、２つの加算器１２０５及び１２０６、２つの乗算器１２０７及び１２０８、及び１つの平方根器１２０９を備える。プロセッサ１２００はまた、調停及び選択回路１２０４を備える。但し、図３及び図１２に示す全てのブロック（構成要素）がプロセッサ１２００に一体形成される必要は無い。例えば、単位プロセッサ（１２０１、１２０２及び１２０３）に含まれるメモリ３０１は、プロセッサ１２００とは別のチップ上に備えられていてもよい。更に、メモリ３０１は、複数の単位プロセッサ１２０１、１２０２及び１２０３で共用されていても良い。
【０１０４】
プロセッサ１２００において、演算リソースは、演算の種類（加算、乗算等）の使用頻度に応じて設ける。図１２の例の場合、加算器と乗算器はそれぞれ２個に対して、使用頻度の少ない平方根器は１個しか設けられていない。各単位プロセッサ１２０１、１２０２及び１２０３は、調停及び選択回路１２０４を通して、演算器を選択し使用する。即ち、制御回路として機能する調停及び選択回路１２０４は、複数の単位プロセッサそれぞれのＦＩＦＯ３０８から並行してオブジェクティブ命令を順次受信し、受信した命令に係る演算の種類に基づいて演算器を選択し、選択した演算器に受信した命令を供給する。競合により、演算器のリソースが不足する場合は、浮動小数部のストールを行う。
【０１０５】
従来のプロセッサを単位プロセッサとして使用した場合、浮動小数部のストールを行うと、命令デコーダ及び整数部のストールも発生する。従来技術のＯｏＯ実行のスケジューリングでは、命令デコーダで事前にスケジューリングが行われるため、外部要因に応じた臨機応変なスケジューリングが困難である。これに対して、本実施形態の場合、浮動小数部のストールを行っても、単位プロセッサ１２０１、１２０２及び１２０３それぞれのＦＩＦＯ３０８で浮動小数命令がキューイングされるため、多くの場合において、命令デコーダ及び整数部のストールは発生しない。
【０１０６】
以上説明したように、本実施形態によれば、プロセッサ１２００は、浮動小数ＡＬＵを複数の単位プロセッサで共有するが、リソース不足により浮動小数部のストールが発生する場合は、単位プロセッサそれぞれに含まれるＦＩＦＯ３０８でオブジェクティブ命令をキューイングする。
【０１０７】
この構成により、プロセッサの回路構成の複雑化を抑制しつつ、複数の命令を並列に実行することが可能になる。また、リソース不足によるストールを抑制することが可能になる。
【図面の簡単な説明】
【０１０８】
【図１】第１の実施形態の基本的な概念を説明するための、Ｃ言語で記述されたプログラムを示す図である。
【図２】図１に示すプログラムをコンパイルして得られるアセンブリコードの一例を示す図である。
【図３】第１の実施形態に係るプロセッサの構成例を示すブロック図である。
【図４】第１の実施形態に係るプロセッサの命令セットの一例を示す図である。
【図５】第１の実施形態に係るプロセッサが備えるレジスタの一例を示す図である。
【図６】第１の実施形態におけるオペランドの表記法を説明する図である。
【図７】第１の実施形態に係るプロセッサの整数部のパイプライン及びバイパス回路の一例を示す図である。
【図８】第１の実施形態に係るプロセッサの浮動小数部のパイプライン及びバイパス回路の一例を示す図である。
【図９】第１の実施形態に係るプロセッサにおける、ストール制御のための構成例を示す図である。
【図１０】第１の実施形態に係るプロセッサに投機実行機能を追加した構成例を示す図である。
【図１１】ＲＩＳＣプロセッサ及びＣＩＳＣプロセッサそれぞれの整数部又は浮動小数部とメモリインタフェースとの間のデータの流れを示す図である。
【図１２】第２の実施形態に係るプロセッサの構成例を示すブロック図である。
【図１】
2008242647.tif 000003
【図２】
2008242647.tif 000004
【図３】
2008242647.tif 000005
【図４】
2008242647.tif 000006
【図５】
2008242647.tif 000007
【図６】
2008242647.tif 000008
【図７】
2008242647.tif 000009
【図８】
2008242647.tif 000010
【図９】
2008242647.tif 000011
【図１０】
2008242647.tif 000012
【図１１】
2008242647.tif 000013
【図１２】
2008242647.tif 000014