(57)【要約】【課題】スーパースカラプロセッサにおいて、依存関係のある複数の演算命令を同時に１サイクルで実行する。【解決手段】プロセッサ１０は、第１のデータを処理する第１の演算器５１と、第１の演算器５１の出力および第２のデータの一方を選択するセレクタ６０と、セレクタ６０の出力を処理する第２の演算器５２と、命令列から選択した実行対象の命令に応じてセレクタを切替える制御回路８０とを備える。【選択図】図１
2014164659.tif 000002
【特許請求の範囲】
【請求項１】
第１のデータを処理する第１の演算器と、
前記第１の演算器の出力および第２のデータの一方を選択するセレクタと、
前記セレクタの出力を処理する第２の演算器と、
命令列から前記第１および第２の演算器での実行対象となる複数の命令を選択し、選択した実行対象の命令に応じて前記セレクタを切替える制御回路とを備えたプロセッサ。
【請求項２】
前記制御回路は、前記実行対象の命令の組み合わせに応じて前記セレクタを切替える、請求項１に記載のプロセッサ。
【請求項３】
前記制御回路は、前記実行対象の命令のオペランドの依存関係に応じて前記セレクタを切替える、請求項２に記載のプロセッサ。
【請求項４】
前記制御回路は、前記実行対象の命令の少なくとも１つが特定の条件を満たす場合には、前記実行対象の命令の組み合わせによらず、前記第２のデータを選択するように前記セレクタを制御する、請求項２に記載のプロセッサ。
【請求項５】
第３のデータを処理する第３の演算器をさらに備え、
前記第３の演算器は、前記第１および第２の演算器で実行する命令の種類と異なる特定の種類の命令を実行対象とし、
前記制御回路は、前記命令列から選択した命令の種類に応じて、前記第１もしくは第２の演算器で命令を実行するか、または前記第３の演算器で命令を実行するかを決定する、請求項１に記載のプロセッサ。
【請求項６】
前記第１および第２の演算器の各々は加算器およびシフト演算器を含み、
前記第３の演算器は乗算器を含む、請求項５に記載のプロセッサ。
【請求項７】
前記第３の演算器は、ロードストアユニットを含む、請求項５に記載のプロセッサ。
【請求項８】
前記制御回路は、前記第１の演算器での命令の実行と同時に、前記第２の演算器で命令を実行しない場合には、前記第２のデータを選択するように前記セレクタを制御する、請求項１に記載のプロセッサ。
【請求項９】
前記セレクタは、固定データの入力をさらに受け、前記第１の演算器の出力、前記第２のデータ、および前記固定データのうちの１つを選択し、
前記制御回路は、前記第１の演算器での命令の実行と同時に、前記第２の演算器で命令を実行しない場合には、前記固定データを選択するように前記セレクタを制御する、請求項１に記載のプロセッサ。
【請求項１０】
前記第１の演算器は、
実行対象となる一部の演算の演算結果を出力可能な第１の出力ノードと、
実行対象となる全ての演算の演算結果を出力可能な第２の出力ノードとを有し、
前記セレクタは、前記第１の演算器の前記第１の出力ノードからの出力および前記第２のデータの一方を選択し、
前記プロセッサは、前記第１の演算器の前記第２の出力ノードからの出力を保持可能なレジスタをさらに備え、前記レジスタの出力は前記第２のデータとして前記セレクタに入力可能である、請求項１に記載のプロセッサ。
【請求項１１】
前記第１の演算器は、
演算結果を出力するための第１の出力ノードと、
演算結果の状態を表すフラグを出力するための第２の出力ノードとを有し、
前記セレクタは、前記第１の演算器の前記第１の出力ノードからの出力および前記第２のデータの一方を選択し、
前記プロセッサは、前記第１の演算器の前記第２の出力ノードからの出力を保持可能なレジスタをさらに備え、前記レジスタの出力は、前記セレクタを介さずに前記第２の演算器に入力可能である、請求項１に記載のプロセッサ。
【請求項１２】
複数のデータを保持するレジスタファイルと、
第１のデータを処理する第１の演算器と、
前記第１の演算器の出力および第２のデータの一方を選択するセレクタと、
前記セレクタの出力を処理する第２の演算器と、
命令列から前記第１および第２の演算器での実行対象となる複数の命令を選択し、選択した実行対象の命令に応じて前記レジスタファイルに保持された複数のデータから前記第１および第２のデータを選択し、前記実行対象の命令に応じて前記セレクタを切替える制御回路とを備えたプロセッサ。
【請求項１３】
前記制御回路の選択に従って前記レジスタファイルから読み出された前記第１のデータを保持する第１のレジスタと、
前記制御回路の選択に従って前記レジスタファイルから読み出された前記第２のデータを保持する第２のレジスタをさらに備え、
前記第１の演算器は、前記第１のレジスタから読み出された前記第１のデータを処理し、
前記セレクタは、前記第１の演算器の出力および前記第２のレジスタから読み出された前記第２のデータの一方を選択し、
前記第１および第２の演算器の各々の出力は、前記レジスタファイルならびに前記第１および第２のレジスタに入力可能である、請求項１２に記載のプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明はプロセッサに関し、たとえば、スーパースカラプロセッサで好適に用いられる。
【背景技術】
【０００２】
ＣＰＵの高速化の手法として、複数の実行ユニットでパイプライン処理を行なうスーパースカラプロセッサが提案されている。スーパースカラプロセッサは、プログラム順に隣接する命令を並列処理するインオーダ型と、プログラム順に関係なく並列処理するアウトオブオーダ型に分けられる。インオーダ型の場合には、隣接する命令のオペランドに依存関係がある場合には一般的には並列処理はできない。アウトオブオーダ型はインオーダ型に比べて並列度は高くなるが、制御回路が複雑化するために回路規模が大きくなるというディメリットがある。そこで、インオーダ型で並列度を上げる手法が提案されている。
【０００３】
たとえば、特開平９−３１１７８６号公報（特許文献１）に記載のデータ処理装置では、隣接する２つの２オペランド命令が１つの３オペランド命令と同等であることを検出し、その場合に２つの２オペランド命令を１つの３オペランド命令に統合して後続の実行ステージに送出する回路が命令デコーダに設けられる。
【０００４】
特開２００４−２１５７３号公報（特許文献２）に記載のデータ処理装置において、演算回路は、乗算、加算、および乗加算の３種を選択して実行可能とされる。この演算回路により乗算命令と加算命令の列に対して乗算−加算のデータ依存処理を高速で行なえるようにする。
【０００５】
特開２００７−５００４０６号公報（特許文献３）に記載のデータプロセッサは、その実行の結果オペランドレジスタの内容がデスティネーションレジスタに記憶されることになる第１の命令の実行が完了する前に、前記デスティネーションレジスタを参照する第２の命令を前記オペランドレジスタの内容を使用して実行する。
【０００６】
特開平９−９１１３８号公報（特許文献４）に記載のデータ処理装置では、単一の演算器で同時に実行可能な命令対が検出され、この命令対を同時に実行させることにより命令処理時間が短縮される。たとえば、レジスタにロードする命令とレジスタの内容を加算する命令とが単一の演算器で同時に実行される。
【０００７】
特開２０１１−２４８５３９号公報（特許文献５）に記載の情報処理装置は、２つのシフト命令のシフト数を加減算するシフト数生成回路を含む。情報処理装置は、シフト数生成回路により求めたシフト数に応じてシフト演算を実行することによって、データ依存関係のある２つのシフト命令を１回のシフト演算で実行することができる。
【０００８】
Ｍ．Ｏｚａｗａ等の文献（M.Ozawa  et al.,  "Performance  Evaluation  of  Cascade  ALU  Architecture  for  Asynchronous  Super-Scalar  Processors",  ASYNC  2001,  p162-172，IEEE）は、複数のＡＬＵ（Arithmetic  Logic  Unit）がカスケードに接続されることによって構成されるカスケードＡＬＵアーキテクチャを開示する。この文献のカスケードＡＬＵでは、１サイクルの長さを可変にすることで依存関係のある複数の演算処理が１サイクルに収められる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平９−３１１７８６号公報
【特許文献２】特開２００４−２１５７３号公報
【特許文献３】特表２００７−５００４０６号公報
【特許文献４】特開平９−９１１３８号公報
【特許文献５】特開２０１１−２４８５３９号公報
【非特許文献】
【００１０】
【非特許文献１】M.Ozawa  et al.,  "Performance  Evaluation  of  Cascade  ALU  Architecture  for  Asynchronous  Super-Scalar  Processors",  In 7th International Symposium on Advanced Research in Asynchronous Circuits and Systems (ASYNC 2001),  p162-172，  IEEE  Computer  Society,  2001
【発明の概要】
【発明が解決しようとする課題】
【００１１】
上記の従来技術では、連続する複数の命令のオペランドに依存関係がある場合でも同時に実行することを可能にするものであるが、命令の組み合わせが限定されていたり、クロック１サイクルでの実行が前提でなかったりしていた。
【００１２】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１３】
一実施の形態によるプロセッサは、第１のデータを処理する第１の演算器と、第１の演算器の出力および第２のデータの一方を選択するセレクタと、セレクタの出力を処理する第２の演算器と、命令列から実行対象となる命令を選択し、選択した実行対象の命令に応じてセレクタを切替える制御回路とを備える。
【発明の効果】
【００１４】
上記の一実施の形態によれば、スーパースカラプロセッサにおいて、依存関係のある複数の演算命令を同時に１サイクルで実行できる。なお、上記の一実施の形態の技術は、インオーダ型だけでなくアウトオブオーダ型のスーパースカラプロセッサにも適用可能である。
【図面の簡単な説明】
【００１５】
【図１】実施の形態１による半導体装置の構成を概略的に示すブロック図である。
【図２】図１のプロセッサのより具体的な構成例を示すブロック図である。
【図３】図２の比較例としてのプロセッサの構成を示すブロック図である。
【図４】図３の比較例のプロセッサにおいて複数の命令を実行する際のタイミング図である。
【図５】図２に示す実施の形態１のプロセッサにおいて複数の命令を実行する際のタイミング図である。
【図６】実施の形態１の変形例によるプロセッサの構成を示すブロック図である。
【図７】実施の形態２によるプロセッサの構成を示すブロック図である。
【図８】実施の形態２の一変形例によるプロセッサの構成を示すブロック図である。
【図９】実施の形態２の他の変形例によるプロセッサの構成を示すブロック図である。
【図１０】実施の形態３によるプロセッサの構成を示すブロック図である。
【図１１】実施の形態４によるプロセッサの構成を示すブロック図である。
【図１２】実施の形態５の変形例によるプロセッサの構成を示すブロック図である。
【図１３】実施の形態６によるプロセッサの構成を示すブロック図である。
【図１４】図１３の第１命令用ＡＬＵの構成の一例を示すブロック図である。
【図１５】図１３の第１命令用シフト演算器の構成の一例を示すブロック図である。
【図１６】実施の形態７によるプロセッサの構成を示すブロック図である。
【発明を実施するための形態】
【００１６】
以下、各実施の形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰り返さない。
【００１７】
＜実施の形態１＞
［半導体装置の全体構成］
図１は、実施の形態１による半導体装置の構成を概略的に示すブロック図である。図１を参照して、半導体装置（マイクロコンピュータチップ）１は、プロセッサ（ＣＰＵ：Central  Processing  Unit）１０と、メモリ６（命令メモリ７およびデータメモリ８）と、図示しない入出力装置などを含む。なお、図１および後続する図２、図３、図６〜図１２において、データの流れを実線の矢印で示し、命令コードおよび制御信号の流れを破線の矢印で示す。
【００１８】
メモリ６は、命令（プログラム）を格納する命令メモリ７とデータを格納するデータメモリ８とが分離された構成となっているが、プログラムとデータを同一のメモリに格納する構成であってもよい。後者の場合、命令またはデータを選択するための選択回路が、メモリ６とプロセッサ１０との間に設けられる。
【００１９】
プロセッサ１０は、スーパースカラプロセッサであり、クロックに同期して動作する同期プロセッサである。プロセッサ１０は、レジスタファイル２５と、制御回路８０と、第１命令用の演算ユニット５１と、第２命令用の演算ユニット５２と、セレクタ６０とを含む。
【００２０】
レジスタファイル２５は、データメモリ８から読出命令（ロード命令）に従って読み出された複数のデータを保持する。レジスタファイル２５は、さらに、演算ユニット５１，５２の演算結果を保持する。
【００２１】
制御回路８０は、フェッチ制御部８１と、命令デコーダ８２と、命令選択回路８３とを含む。フェッチ制御部８１は、命令メモリ７に格納された命令を逐次読み出す。命令デコーダ８２は、読み出した命令をデコードする。
【００２２】
命令選択回路８３は、デコードされた命令列から、演算ユニット５１および５２でそれぞれ実行する実行対象となる第１命令および第２の命令を選択する。インオーダ型の場合には連続する２つの命令が選択される。すなわち、第１命令はプログラム順序において先に実行される命令であり、第２命令はプログラム順序において第１命令の次に実行される命令である。
【００２３】
命令選択回路８３は、さらに、実行対象として選択した第１命令のオペランドに応じて、レジスタファイル２５に保持されているデータＤＴ１を選択する。データＤＴ１は演算ユニット５１で処理されるデータであり、レジスタの値でなく即値の場合もあり得る。命令選択回路８３は、第１および第２命令のオペランドに依存関係が無い場合には、実行対象として選択した第２命令のオペランドに応じて、レジスタファイル２５に保持されているデータＤＴ２を選択する。データＤＴ２は、演算ユニット５２で処理されるデータであり、レジスタの値でなく即値の場合もあり得る。
【００２４】
命令選択回路８３は、さらに、実行対象として選択した第１および第２の命令の組み合わせに応じて（たとえば、第１および第２命令のオペランドの依存関係に応じて）、セレクタ６０の選択を切替える。たとえば、第１命令の出力オペランド（レジスタファイル２５のレジスタ名）と、第２命令の入力オペランド（レジスタファイル２５のレジスタ名）とが一致している場合には、第１命令のオペランドと第２命令のオペランドとは依存関係にある。
【００２５】
演算ユニット５１は、データＤＴ１を処理する。セレクタ６０は、命令選択回路８３の制御に従って、演算ユニット５１の出力およびデータＤＴ２のうち一方を選択して出力する。すなわち、セレクタ６０は、第１および第２命令のオペランドに依存関係がある場合には演算ユニット５１の出力を選択して出力し、依存関係が無い場合にはデータＤＴ２を選択して出力する。演算ユニット５２は、セレクタ６０の出力を処理する。演算ユニット５１および５２の各々の出力は、レジスタファイル２５に書き戻される。
【００２６】
［プロセッサの構成および動作］
図２は、図１のプロセッサのより具体的な構成例を示すブロック図である。プロセッサ１０は、レジスタ群２０と、第１命令用の演算ユニット５１と、第２命令用の演算ユニット５２と、セレクタ６１，６２と、制御回路とを含む。ただし、図２では図１の制御回路８０の一部である命令選択回路８３のみが示されている。演算ユニット５１，５２の各々は、ＡＬＵおよびシフト演算器（ＳＦＴ）を含む。
【００２７】
図２のプロセッサでは、レジスタファイル２５からのデータの読出しとその処理とが２サイクルに分けて実行される。このために、レジスタ群２０は、図１のレジスタファイル２５に加えて、レジスタファイル２５から読み出されたデータを保持するレジスタ３１〜３４と、レジスタ３１〜３４にそれぞれ対応して設けられたセレクタ４１〜４４とを含む。セレクタ４１〜４４は、演算ユニット５１，５２の出力データＯＴ１，ＯＴ２と、レジスタファイル２５から読み出されたデータとのうち一方を選択するために設けられている。セレクタ４１〜４４の選択結果がレジスタ３１〜３４にそれぞれ入力される。
【００２８】
演算ユニット５１は、レジスタ３１および３２にそれぞれ保持されているデータＤＴ１１およびＤＴ１２を処理する。セレクタ６１は、演算ユニット５１の出力とレジスタ３３に保持されているデータＤＴ２１の一方を選択する。セレクタ６２は、演算ユニット５１の出力とレジスタ３４に保持されているデータＤＴ２２の一方を選択する。演算ユニット５２は、セレクタ６１および６２の出力を処理する。ＡＬＵは命令に応じて２つの入力データに対し例えば加算演算、減算演算及び種々の論理演算（論理和、論理積等）を行う。シフト演算器ＳＦＴは指定されたシフト量だけ入力データをシフトする演算を行う。
【００２９】
上記のレジスタファイル２５からのデータの読出しと、読み出されたデータを用いた演算ユニット５１，５２による演算の実行とはパイプライン処理される。
【００３０】
具体的には、Ｄ（デコード：Decode）ステージにおいて、図１の命令デコーダ８２は連続する２つの命令のデコードを行なう。命令選択回路８３はデコードされた第１および第２命令を選択し、発行する。このとき、図２のプロセッサ１０は、第１および第２命令のオペランドに依存関係があるかないかに関わらず二つの命令を選択する。第１命令で使用するデータがレジスタファイル２５からレジスタ３１，３２にそれぞれ読み出され、第２命令で使用するデータがレジスタファイル２５からレジスタ３３，３４にそれぞれ読み出される。
【００３１】
次に、Ｅ（実行：Execute）ステージにおいて、第１および第２命令のオペランドに依存関係が無い場合には、セレクタ６１，６２の入力は、レジスタ３３，３４側にそれぞれ切替えられる。この結果、レジスタ３３，３４から読み出されたデータＤＴ２１，ＤＴ２２が演算ユニット５２に入力される。演算ユニット５１がレジスタ３１，３２から読み出されたデータＤＴ１１，ＤＴ１２を用いて第１命令を実行し、演算ユニット５２がセレクタ６１，６２の出力を用いて第２命令を実行する。演算ユニット５１，５２の実行結果ＯＴ１，ＯＴ２は、レジスタファイル２５に書き戻される。ただし、次にＥステージ実行される第１命令または第２命令（Ｄステージまで実行されている命令）が演算ユニット５１または５２の出力データを使用する場合には、その使用される出力データは、セレクタ４１〜４４を介してレジスタ３１〜３４のいずれかのレジスタに入力される。
【００３２】
一方、Ｅステージにおいて、第１および第２命令のオペランドに依存関係がある場合には（第２命令が第１の命令の演算結果を使用する場合には）、セレクタ６１，６２の少なくとも一方の入力が演算ユニット５１の出力側に切替えられる。たとえば、第２命令の第１オペランド（セレクタ６１によって選択される演算ユニット５１への入力オペランド）が第１命令の演算結果に依存する場合には、セレクタ６１の入力が演算ユニット５１の出力側に切替えられ、演算ユニット５１の出力とレジスタ３４に保持されているデータＤＴ２２が演算ユニット５２に入力される。このように、第１命令及び第２命令のオペランドに依存関係がある場合及びない場合に関わらず、それぞれのＥステージに要する時間（１サイクル分の時間）は同じである。
【００３３】
［セレクタ６１，６２の動作］
次に、図２の第２命令用の演算ユニット５２の入力側のセレクタ６１，６２の動作を具体的に説明する。
【００３４】
（１）  第１命令の演算結果（出力オペランド）を第２命令の入力オペランドのうち一方が参照する場合には、セレクタ６１，６２の一方が演算ユニット５１の出力側を選択する。
【００３５】
たとえば、次の２つの命令（第１命令および第２命令）を同時に実行した場合について説明する。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｄ  ｒ３，ｒ４，ｒ５  （ｒ３＋ｒ４の結果をｒ５に格納）
第１命令は、レジスタファイル２５のレジスタｒ１に格納されているデータと、レジスタファイル２５のレジスタｒ２に格納されているデータの加算結果を、レジスタファイル２５のレジスタｒ３に格納する命令である。第２命令は、レジスタファイル２５のレジスタｒ３に格納されているデータと、レジスタファイル２５のレジスタｒ４に格納されているデータの加算結果を、レジスタファイル２５のレジスタｒ５に格納する命令である。
【００３６】
上記の２つの命令を図２のプロセッサ１０で実行する場合には、セレクタ６１によって第１命令の演算結果（演算ユニット５１の出力）が選択され、セレクタ６２によってレジスタ３４（レジスタｒ４の値）が選択される。もしくは、セレクタ６１によってレジスタ３３（レジスタｒ４の値）が選択され、セレクタ６２によって第１命令の演算結果（演算ユニット５１の出力）が選択される。
【００３７】
（２）  第１命令の演算結果を第２命令の入力オペランドの両方が参照する場合には、セレクタ６１，６２の両方とも演算ユニット５１の出力側を選択する。たとえば、次の２つの命令を同時に実行した場合には、両方のセレクタ６１，６２が第１命令の演算結果（演算ユニット５１の出力）を選択する。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｄ  ｒ３，ｒ３，ｒ４  （ｒ３＋ｒ３の結果をｒ４に格納）
（３）  第１命令の演算結果を第２命令が参照しない場合には、セレクタ６１，６２はレジスタ３３，３４をそれぞれ選択する。たとえば、次の２つの命令を同時に実行した場合には、第２命令の入力オペランドはどちらも第１命令の演算結果とは無関係であるため、セレクタ６１，６２はレジスタ３３，３４（レジスタｒ５の値とレジスタｒ６の値）をそれぞれ選択する。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｄ  ｒ５，ｒ６，ｒ７  （ｒ５＋ｒ６の結果をｒ７に格納）
［セレクタ６１，６２が設けられていない場合との比較］
（１）  比較例の場合
図３は、図２の比較例としてのプロセッサの構成を示すブロック図である。図３のプロセッサ１１０は、セレクタ６１，６２が設けられていない点で図２のプロセッサ１０と異なる。図３の場合には、演算ユニット５１にレジスタ３１，３２に保持されているデータＤＴ１１，ＤＴ１２が入力され、演算ユニット５２にレジスタ３３，３４に保持されているデータＤＴ２１，ＤＴ２２が入力される。図３のその他の点は図２の場合と同様であるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【００３８】
図４は、図３の比較例のプロセッサにおいて複数の命令を実行する際のタイミング図である。図４では次の４つの命令（命令１〜命令４）を実行する場合のタイミング図が示される。
【００３９】
（命令１）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（命令２）  ａｄｄ  ｒ３，ｒ４，ｒ５  （ｒ３＋ｒ４の結果をｒ５に格納）
（命令３）  ａｄｄ  ｒ５，ｒ６，ｒ７  （ｒ５＋ｒ６の結果をｒ７に格納）
（命令４）  ａｄｄ  ｒ７，ｒ８，ｒ９  （ｒ７＋ｒ８の結果をｒ９に格納）
上記の命令列の場合には、命令１の出力結果（レジスタｒ３の値）を命令２が入力オペランドとして参照するために、命令１と命令２には依存関係がある。したがって、図３のプロセッサでは、命令１のＥステージと命令２のＥステージとを同じサイクルで実行できない。同様に、命令２の出力結果（レジスタｒ５の値）を命令３が入力オペランドとして参照するために、命令２と命令３には依存関係がある。したがって、命令２のＥステージと命令３のＥステージとを同じサイクルで実行できない。命令３の出力結果（レジスタｒ７の値）を命令４が入力オペランドとして参照するために、命令３と命令４には依存関係がある。したがって、命令３のＥステージと命令４のＥステージを同じサイクルで実行できない。以上により、図３のプロセッサでは、命令１〜４のＥステージを実行するのに合計４サイクル費やす。この結果、図４に示すように、命令１，２のＩＦ（命令フェッチ：Instruction  Fetch）ステージから始めて、最後の命令４のＥステージまで合計６サイクルを要する。
【００４０】
具体的に図３、図４を参照して、サイクル１では、命令１および命令２が図１の命令メモリ７からフェッチされる。
【００４１】
サイクル２では、命令１および命令２がデコードされるとともに、命令３が命令メモリ７からフェッチされる。命令１および命令２のデコード結果に応じて、命令１で使用されるレジスタファイル２５のレジスタｒ１，ｒ２の値がレジスタ３１，３２に読み出される。命令２で使用されるレジスタファイル２５のレジスタｒ３は命令１の演算結果に依存するため、命令選択回路８３は命令２を選択、発行せず、命令２はＤステージでストールする。
【００４２】
サイクル３では、演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ１，ｒ２の値）の加算演算が実行され、演算結果がセレクタ４１を介してレジスタ３１に格納されるとともに、レジスタファイル２５のレジスタｒ３に書き戻される。さらに、命令２と命令３がデコードされ、命令４が命令メモリ７からフェッチされる。命令２および命令３のデコード結果に応じて、命令２で使用されるレジスタファイル２５のレジスタｒ４の値がレジスタ３２に読み出される。命令３で使用されるレジスタファイル２５のレジスタｒ５は命令２の演算結果に依存するため、命令選択回路８３は命令３を選択、発行せず、命令３はＤステージでストールする。
【００４３】
サイクル４では、演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ３，ｒ４の値）の加算演算が実行され、演算結果がセレクタ４１を介してレジスタ３１に格納されるとともに、レジスタファイル２５のレジスタｒ５に書き戻される。さらに命令３と命令４がデコードされる。命令３および命令４のデコード結果に応じて、命令３で使用されるレジスタファイル２５のレジスタｒ６の値がレジスタ３２に読み出される。命令４で使用されるレジスタファイル２５のレジスタｒ７は命令３の演算結果に依存するため、命令選択回路８３は命令４を選択、発行せず、命令４はＤステージでストールする。
【００４４】
サイクル５では、演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ５，ｒ６の値）の加算演算が実行され、演算結果がセレクタ４１を介してレジスタ３１に格納されるとともに、レジスタファイル２５のレジスタｒ７に書き戻される。命令４のデコード結果に応じて、命令４で使用されるレジスタファイル２５のレジスタｒ８の値がレジスタ３２に読み出される。
【００４５】
サイクル６では、演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ７，ｒ８の値）の加算演算が実行され、演算結果がレジスタファイル２５のレジスタｒ９に書き戻される。
【００４６】
（２）  実施の形態１の場合
図５は、図２に示す実施の形態１のプロセッサにおいて複数の命令を実行する際のタイミング図である。図５では、図４の場合と同じ４つの命令（命令１〜命令４）を実行する場合のタイミング図が示される。
【００４７】
図２のプロセッサでは、セレクタ６１，６２を用いることによって、依存関係にある命令１のＥステージと命令２のＥステージとを同じサイクルで実行することができる。同様に、依存関係にある命令３のＥステージと命令４のＥステージとを同じサイクルで実行することができる。したがって、図２のプロセッサでは、命令１〜４のＥステージを実行するのに合計２サイクルで完了する。この結果、図５に示すように、命令１，２のＩＦステージから始めて最後の命令３，４のＥステージまで合計４サイクルかかり、比較例の場合に比べて、命令列の実行に要するサイクル数を短縮することができる。
【００４８】
具体的に図２、図５を参照して、サイクル１では、命令１および命令２が図１の命令メモリ７からフェッチされる。
【００４９】
サイクル２では、命令１および命令２がデコードされるとともに、命令３および命令４が命令メモリ７からフェッチされる。命令１および命令２のデコード結果に応じて、命令１で使用されるレジスタファイル２５のレジスタｒ１，ｒ２の値がレジスタ３１，３２に読み出され、命令２で使用されるレジスタファイル２５のレジスタｒ４の値がレジスタ３４に読み出される。
【００５０】
サイクル３では、セレクタ６１が演算ユニット５１の出力側に切替えられ、セレクタ６２がレジスタ３４側に切替えられる。演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ１，ｒ２の値）の加算演算が実行され、演算結果がセレクタ６１を介して演算ユニット５２に入力されるとともに、レジスタファイル２５のレジスタｒ３に書き戻される。演算ユニット５２においてセレクタ６１，６２の出力（レジスタｒ３，ｒ４の値）の加算演算が実行され、演算結果がセレクタ４１を介してレジスタ３１に格納されるとともに、レジスタファイル２５のレジスタｒ５に書き戻される。サイクル３では、さらに、命令３および命令４がデコードされ、命令３および命令４のデコード結果に応じて、命令３で使用されるレジスタファイル２５のレジスタｒ６の値がレジスタ３２に格納され、命令４で使用されるレジスタファイル２５のレジスタｒ８の値がレジスタ３４に格納される。
【００５１】
サイクル４では、演算ユニット５１においてレジスタ３１，３２の値（レジスタｒ５，ｒ６の値）の加算演算が実行され、演算結果がセレクタ６１を介して演算ユニット５２に入力されるとともに、レジスタファイル２５のレジスタｒ７に書き戻される。演算ユニット５２においてセレクタ６１，６２の出力（レジスタｒ７，ｒ８の値）の加算演算が実行され、演算結果がレジスタファイル２５のレジスタｒ９に書き戻される。
【００５２】
［実施の形態１の効果］
実施の形態１では、インオーダ型のスーパースカラプロセッサにおいて、先行する命令の演算結果を、後続する命令を処理する演算器の入力へバイパスする回路（セレクタ６１，６２）と、依存関係のある二つの命令を同時に実行するか否かを判断しバイパスを制御する命令選択回路８３とが設けられる。これにより、二つの依存関係のある演算命令を同時に１サイクルで処理することができる。
【００５３】
さらに、実施の形態１のプロセッサによれば、スーパースカラプロセッサ向けに命令レベルの並列度を上げる最適化を行うコンパイラが無い場合であっても、図２のセレクタ６１，６２が設けられていない従来のスーパースカラプロセッサの場合に比べてサイクル性能を上げることができる。
【００５４】
［実施の形態１の変形例］
（１）  変形例１
上記の例では、加算命令（ａｄｄ）のみを使って説明したが、他の命令でも同様のことができる。たとえば、依存関係のある減算命令とシフト命令を図２の演算ユニット５１，５２で同時に実行することができる。
【００５５】
（２）  変形例２
インオーダ型のスーパースカラプロセッサでは、第１命令として実行できる命令と第２命令として実行できる命令を同一にしない場合がある。具体的には、実行頻度の低い命令を第１命令でしか実行しないようにする例が挙げられる。たとえば、図２の演算ユニット５１はＡＬＵとシフト演算器を含み、演算ユニット５２はＡＬＵのみを含んでシフト演算器を含まないようにする。これによって、第２命令用の演算器の回路面積や消費電力を少なくすることができる。このように第１命令用の演算ユニットと第２命令用の演算ユニットの構成が同一でない場合にも、本実施の形態の構成を適用することができる。
【００５６】
（３）  変形例３
上記の例では、連続する２命令が選択される想定で説明を行ったが、第１命令と第２命令は必ずしも連続する２命令である必要はない。本実施の形態の構成をアウトオブオーダ型のスーパースカラプロセッサに適用することもできる。
【００５７】
（４）  変形例４
上記の例では、同時に実行する命令が２個の場合を説明したが、３命令以上を同時に実行するプロセッサに対しても本実施の形態の構成を適用することもできる。
【００５８】
図６は、実施の形態１の変形例によるプロセッサの構成を示すブロック図である。図６には、３命令を同時に実行するスーパースカラプロセッサの例が示される。図６を参照して、プロセッサ１０Ａは、レジスタ群２０Ａと、第１命令用の演算ユニット５１と、第２命令用の演算ユニット５２と、第３命令用の演算ユニット５３と、セレクタ６１〜６４と、制御回路とを含む。ただし、図６では図１の制御回路８０の一部である命令選択回路８３のみが示されている。演算ユニット５１〜５３の各々は、ＡＬＵおよびシフト演算器を含む。第２命令はプログラム順序において第１命令の次の命令であり、第３命令はプログラム順序において第２命令の次の命令である。
【００５９】
レジスタ群２０Ａは、図１のデータメモリ８から読み出されたデータを保持するレジスタファイル２５と、レジスタファイル２５から読み出されたデータを保持するレジスタ３１〜３６と、レジスタ３１〜３６にそれぞれ対応して設けられたセレクタ４１〜４６とを含む。セレクタ４１〜４６は、演算ユニット５１〜５３の出力データＯＴ１〜ＯＴ３と、レジスタファイル２５から読み出されたデータとのうち一方を選択するために設けられている。セレクタ４１〜４６の選択結果がレジスタ３１〜３６にそれぞれ保持される。
【００６０】
演算ユニット５１は、レジスタ３１，３２にそれぞれ保持されているデータＤＴ１１，ＤＴ１２を処理する。セレクタ６１は、演算ユニット５１の出力とレジスタ３３に保持されているデータＤＴ２１の一方を選択する。セレクタ６２は、演算ユニット５１の出力とレジスタ３４に保持されているデータＤＴ２２の一方を選択する。演算ユニット５２は、セレクタ６１および６２の出力を処理する。セレクタ６３は、演算ユニット５１の出力、演算ユニット５２の出力、およびレジスタ３５に保持されているデータＤＴ３１のいずれか１つを選択する。セレクタ６４は、演算ユニット５１の出力、演算ユニット５２の出力、およびレジスタ３６に保持されているデータＤＴ３２のいずれか１つを選択する。演算ユニット５３は、セレクタ６３および６４の出力を処理する。
【００６１】
上記のレジスタファイル２５からのデータの読出しと、読み出されたデータを用いた演算の実行とはパイプライン処理される。演算ユニット５１〜５３のそれぞれの出力ＯＴ１，ＯＴ２，ＯＴ３は、レジスタファイル２５に書き戻される。ただし、次のＥステージで実行される第１命令〜第３命令（Ｄステージまで完了している命令）のいずれかが演算ユニット５１または５２または５３の出力データを使用する場合には、その使用される出力データは、セレクタ４１〜４６のいずれかを介してレジスタ３１〜３６のうち対応するレジスタに入力される。
【００６２】
なお、図３のプロセッサ１０Ａにおいて、第１命令用の演算ユニット５１の出力は、セレクタ６１，６２のみに入力され、セレクタ６３，６４には入力されないようにしてもよい。第２命令用の演算ユニット５２の出力はセレクタ６３，６４には入力されないようにしてもよい。
【００６３】
＜実施の形態２＞
［プロセッサの構成］
図７は、実施の形態２によるプロセッサの構成を示すブロック図である。実施の形態２のプロセッサ１１では、セレクタ６１，６２を用いる実施の形態１の構成が一部の演算器にのみ適用される。図７の例では、ＡＬＵに対して実施の形態１の構成が適用され、シフト演算器（ＳＦＴ）については従来の構成のままである。
【００６４】
具体的に図７を参照して、プロセッサ１１は、レジスタ群２０と、第１命令用の演算ユニット５１（５１Ａ，５１Ｂ）と、第２命令用の演算ユニット５２（５２Ａ，５２Ｂ）と、セレクタ６１，６２，６５，６６と、制御回路とを含む。ただし、図７では図１の制御回路８０の一部である命令選択回路８３のみが示されている。レジスタ群２０の構成は図２の場合と同じであるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【００６５】
第１命令用の演算ユニットはＡＬＵ５１Ａとシフト演算器５１Ｂとに区分され、第２命令用の演算ユニットはＡＬＵ５２Ａとシフト演算器５２Ｂに区分される。ＡＬＵ５１Ａおよびシフト演算器５１Ｂの各々は、レジスタ３１および３２にそれぞれ保持されているデータＤＴ１１およびＤＴ１２を処理する。セレクタ６１は、ＡＬＵ５１Ａの出力とレジスタ３３に保持されているデータＤＴ２１の一方を選択する。セレクタ６２は、ＡＬＵ５１Ａの出力とレジスタ３４に保持されているデータＤＴ２２の一方を選択する。ＡＬＵ５２Ａは、セレクタ６１および６２の出力を処理する。シフト演算器５２Ｂは、レジスタ３３および３４にそれぞれ保持されているデータＤＴ２１およびＤＴ２２を処理する。
【００６６】
セレクタ６５は、命令選択回路８３の制御に従って、ＡＬＵ５１Ａとシフト演算器５１Ｂの出力ＯＴ１Ａ，ＯＴ１Ｂの一方を選択し、選択結果をレジスタファイル２５に書き戻す。セレクタ６５の出力は、セレクタ４１〜４４を介してレジスタ３１〜３４のいずれかに書き戻し可能である。
【００６７】
セレクタ６６は、命令選択回路８３の制御に従って、ＡＬＵ５２Ａとシフト演算器５２Ｂの出力ＯＴ２Ａ，ＯＴ２Ｂの一方を選択し、選択結果をレジスタファイル２５に書き戻す。セレクタ６６の出力は、セレクタ４１〜４４を介してレジスタ３１〜３４のいずれかに書き戻し可能である。
【００６８】
［プロセッサの動作］
ＡＬＵで実行する加算命令（ａｄｄ）と、シフト演算器で実行する左シフト演算命令（ｓｈｌｌ）とを組み合わせた例について説明する。実施の形態２のプロセッサ１１では、実施の形態１のプロセッサ１０と異なり、命令選択回路８３によるＤステージでの命令選択において第１および第２命令のオペランドの依存関係有無と、命令が使用する演算器の種類を考慮する。
【００６９】
例１：第１命令および第２命令が共に加算命令の場合には、依存関係があっても図７のプロセッサ１１で同時に実行できる。たとえば、次の２つの命令は同時に実行可能である。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｄ  ｒ３，ｒ４，ｒ５  （ｒ３＋ｒ４の結果をｒ５に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係があるが、使用する演算器間に同時に実行するためのバイパス経路がある命令の組み合わせであることから、第１および第２命令を同時に選択、発行する。
【００７０】
例２：  第１命令が加算命令であり、第２命令がシフト命令であり、両者に依存関係がある場合には図７のプロセッサ１１で同時に実行できない。たとえば、以下の第１命令および第２命令は同時に実行できない。第２命令は、レジスタｒ３の値をレジスタｒ４の値（ビット数）だけ左シフトした結果（「ｒ３＜＜ｒ４」と記載する）をレジスタｒ５に格納する命令（左シフト命令）である。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ｓｈｌｌ  ｒ３，ｒ４，ｒ５  （ｒ３＜＜ｒ４の結果をｒ５に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係があり、かつ使用する演算器間に同時に実行するためのバイパス経路が無い命令の組み合わせであることから、第２命令の選択、発行を行わず、第１命令のみを選択、発行する。
【００７１】
例３：  上記の例２と同じ命令の組み合わせであっても、依存関係のない次の命令は図７のプロセッサ１１で同時に実行できる。
（命令１）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（命令２）  ｓｈｌｌ  ｒ５，ｒ６，ｒ７  （ｒ５＜＜ｒ６の結果をｒ７に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係がなく、同時に実行できる命令の組み合わせであることから、第１および第２命令を同時に選択、発行する。
【００７２】
このように一部の演算器にのみセレクタを追加した図７のスーパースカラプロセッサでは、命令種類（命令を実行する演算器）の組み合わせだけでは同時実行できるかどうかは決まらない。そのため、Ｄステージにある二つの命令を同時に実行できるかどうかを判断するためには、２命令間の依存関係の有無と、第１命令および第２命令の各々が特定の条件を満たすか否か（シフト演算であるか否か、すなわち、使用する第１命令用の演算ユニットの出力と、使用する第２命令用の演算ユニットの入力とがセレクタを介して接続されているか否か）を確認する必要がある。
【００７３】
図７のプロセッサ１１の場合には、第１命令および第２命令のどちらか一方がシフト演算器を使う命令であれば、第２命令用のＡＬＵ５２Ａの入力側に設けられているセレクタ６１，６２の入力を、両方ともレジスタ３３，３４側に切替えることができる。第１命令と第２命令のいずれもＡＬＵを使う命令である場合にのみ依存関係の有無を確認して、依存関係が有る場合にはセレクタ６１，６２の少なくとも一方の入力を第１命令用のＡＬＵ５１Ａ側に切替える。
【００７４】
［実施の形態２の効果］
実施の形態２のプロセッサの構成によれば、たとえばシフト演算器の回路遅延がＡＬＵの回路遅延に比べて大きい場合に効果的である。セレクタ６１，６２によって第１命令用の演算ユニットの出力側を選択した場合には、演算ユニット５１，５２の２段分の遅延が１サイクル内に収まるようにしなければならない。このため、演算ユニット自体の遅延が大きい場合には最大動作周波数を下げなければならないこともあり得る。そのような場合に前もって遅延の大きい演算器がわかっていれば、その遅延の大きい演算器については、従来構成のままとする（第１命令用の演算ユニットと第２命令用の演算ユニットとの間にセレクタを設けない）ことで最大動作周波数を低下しないようにできる。実施の形態１の場合と比べて、スーパースカラプロセッサの並列度は若干低下するが、最大動作周波数を高く維持できるという利点がある。
【００７５】
［実施の形態２の変形例］
図８は、実施の形態２の一変形例によるプロセッサの構成を示すブロック図である。図８のプロセッサ１１Ａは、第１命令用のシフト演算器５１Ｂの出力もセレクタ６１，６２に入力される点で図７のプロセッサ１１と異なる。図８の構成によれば、第２命令がシフト演算でありかつ第１命令と依存関係にある場合には、第１命令と第２命令を同時に実行できないが、その他の場合には第１命令と第２命令とを同時に実行できる。
【００７６】
図９は、実施の形態２の他の変形例によるプロセッサの構成を示すブロック図である。図９のプロセッサ１１Ｂは、第２命令用のシフト演算器５２Ｂに対応するセレクタ６７，６８をさらに含む点で図７のプロセッサ１１と異なる。セレクタ６７には第１命令用のＡＬＵ５１Ａの出力とレジスタ３３の出力とが入力され、セレクタ６８には第１命令用のＡＬＵ５１Ａの出力とレジスタ３４の出力とが入力される。第２命令用のシフト演算器５２Ｂは、セレクタ６７および６８の出力を処理する。図９の構成によれば、第１命令がシフト演算でありかつ第２命令と依存関係にある場合には、第１命令と第２命令を同時に実行できないが、その他の場合には第１命令と第２命令とを同時に実行できる。
【００７７】
なお、第１命令用の演算ユニットの構成と第２命令用の演算ユニットの構成とは同じでなくてもよい。たとえば、図７から第２命令用のシフト演算器５２Ｂを削除した構成も可能である。
【００７８】
＜実施の形態３＞
実施の形態３によるスーパースカラプロセッサ１２では、乗算器および除算器などのように面積が大きくかつ遅延の大きい演算器については第１命令と第２命令で共用する構成としたものである。このような演算器の構成のプロセッサに対しても図２に示した実施の形態１の構成を適用することができる。
【００７９】
［プロセッサの構成］
図１０は、実施の形態３によるプロセッサの構成を示すブロック図である。図１０を参照して、実施の形態３によるプロセッサ１２は、レジスタ群２０Ｂと、第１命令用の演算ユニット５１と、第２命令用の演算ユニット５２と、第１および第２命令共用の演算ユニット５４と、セレクタ６１，６２，６５，６６と、制御回路とを含む。ただし、図１０では、図１の制御回路８０の一部である命令選択回路８３のみが示されている。
【００８０】
レジスタ群２０Ｂは、レジスタ３７，３８とセレクタ４７，４８とをさらに含む点で図２のレジスタ群２０と異なる。セレクタ４７，４８の各々には、レジスタファイル２５から読み出されセレクタ４１〜４４を介してレジスタ３１〜３４に入力されるデータ（第１命令および第２命令の入力オペランドに対応するデータ）が入力される。セレクタ４７，４８の各々には、さらに、セレクタ６５，６６の出力が入力される。セレクタ４７，４８の選択結果がレジスタ３７，３８にそれぞれ入力される。
【００８１】
演算ユニット５１，５２の各々は、加算器、減算器、シフト演算器、および論理演算器を含み、乗算器および除算器を含まない。演算ユニット５４は、乗算器および除算器を含み、加算器、減算器、シフト演算器、および論理演算器を含まない。演算ユニット５１は、レジスタ３１，３２にそれぞれ保持されているデータＤＴ１１，ＤＴ１２を処理する。セレクタ６１は、演算ユニット５１の出力とレジスタ３３に保持されているデータＤＴ２１の一方を選択する。セレクタ６２は、演算ユニット５１の出力とレジスタ３４に保持されているデータＤＴ２２の一方を選択する。演算ユニット５２は、セレクタ６１および６２の出力を処理する。演算ユニット５４は、レジスタ３７，３８の出力を処理する。
【００８２】
セレクタ６５は、命令選択回路８３の制御に従って、演算ユニット５１と演算ユニット５４の出力ＯＴ１，ＯＴ４の一方を選択し、選択結果をレジスタファイル２５に書き戻す。セレクタ６５の出力は、セレクタ４１〜４４，４７，４８のいずれかを介してレジスタ３１〜３４，３７，３８のいずれかに書き戻し可能である。
【００８３】
セレクタ６６は、命令選択回路８３の制御に従って、演算ユニット５２と演算ユニット５４の出力ＯＴ２，ＯＴ４の一方を選択し、選択結果をレジスタファイル２５に書き戻す。セレクタ６６の出力は、セレクタ４１〜４４，４７，４８のいずれかを介してレジスタ３１〜３４，３７，３８のいずれかに書き戻し可能である。
【００８４】
［プロセッサの動作］
以下、演算ユニット５１，５２で実行する加算命令（ａｄｄ）と、演算ユニット５４で実行する乗算命令（ｍｕｌ）とを組み合わせた例について説明する。
【００８５】
例１：第１命令および第２命令が共に加算命令の場合には、依存関係があっても図１０のプロセッサ１２で同時に実行できる。たとえば、次の２つの命令は同時に実行可能である。ここで、第１命令が演算ユニット５１で実行され、第２命令が演算ユニット５２で実行される。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｄ  ｒ３，ｒ４，ｒ５  （ｒ３＋ｒ４の結果をｒ５に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係があるが、使用する演算器間に同時に実行するためのバイパス経路がある命令の組み合わせであることから、第１および第２命令を同時に選択、発行する。
【００８６】
例２：第１命令が加算命令であり、第２命令が乗算命令であり、両者に依存関係がある場合には図１０のプロセッサ１２で同時に実行できない。たとえば、以下の第１命令および第２命令は同時に実行できない。第１命令は演算ユニット５１または５２で実行される。第２命令は、レジスタｒ３の値とレジスタｒ４の値とを乗算した結果をレジスタｒ５に格納する命令（乗算命令）であり、演算ユニット５４で実行される。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ｍｕｌ  ｒ３，ｒ４，ｒ５  （ｒ３＊ｒ４の結果をｒ５に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係があり、かつ使用する演算器間に同時に実行するためのバイパス経路が無い命令の組み合わせであることから、第２命令の選択、発行を行わず、第１命令のみを選択、発行する。
【００８７】
例３：上記の例２と同じ命令の組み合わせであっても、依存関係のない次の命令は図１０のプロセッサ１２で同時に実行できる。
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ｍｕｌ  ｒ５，ｒ６，ｒ７  （ｒ５＊ｒ６の結果をｒ７に格納）
この場合、Ｄステージにおいて命令選択回路８３は、第１および第２命令のオペランドに依存関係がなく、同時に実行できる命令の組み合わせであることから、第１および第２命令を同時に選択、発行する。
【００８８】
このように一部の演算について第１命令と第２命令の共用の演算ユニットで実行している図１０のプロセッサ１２の場合には、命令種類の組み合わせだけでは同時実行できるかどうかは決まらない。そのため、Ｄステージにある二つの命令を同時に実行できるかどうかを判断するためには、２命令間の依存関係の有無と、第１命令および第２命令の各々が特定の条件を満たすか否か（乗算命令であるか否か、すなわち、使用する第１命令用の演算ユニットの出力と第２命令用の演算ユニットの入力とがセレクタを介して接続されているか否か）を確認する必要がある。
【００８９】
図１０のプロセッサ１２の場合には、第１命令および第２命令のどちらか一方が乗算器を使う命令であれば、第２命令用の演算ユニット５２の入力側に設けられているセレクタ６１，６２の入力を両方ともレジスタ３３，３４側に切替えることができる。第１命令と第２命令のいずれも演算ユニット５１，５２を使う命令である場合にのみ依存関係の有無を確認して、依存関係がある場合にはセレクタ６１，６２の少なくとも一方の入力を第１命令用の演算ユニット５１の出力側に切替える。
【００９０】
［実施の形態３の効果］
実施の形態３のプロセッサ１２によれば、実施の形態１の場合と比べて、スーパースカラプロセッサの並列度は若干低下するが、最大動作周波数を高く維持できるという利点がある。
【００９１】
＜実施の形態４＞
図１１は、実施の形態４によるプロセッサの構成を示すブロック図である。実施の形態４のプロセッサ１３では、乗算および除算に代えてメモリアクセスを行なう命令（ロードおよびストア）について第１命令と第２命令とで共用の演算器を設ける構成としたものである。
【００９２】
図１１を参照して、第１命令用の演算ユニット５１および第２命令用の演算ユニット５２の各々は、ＡＬＵおよびシフト演算器を含む。第１および第２命令共用の演算ユニット５５は、図１０の演算ユニット５４に代えて設けられたものであり、ロードストアユニット（ＬＳＵ：Load  Store  Unit）を含む。
【００９３】
ロードストアユニットは、図１のデータメモリ８からデータをレジスタファイル２５に読み出すロード命令を実行するとき、およびレジスタファイル２５からデータメモリ８にデータを書き込むストア命令を実行するときに、アドレス計算を行なう。ロードストアユニットから出力されるアドレス（演算ユニット５５の出力ＯＴ５）は、データメモリ８に直接出力可能な構成となっており、これによってアドレス計算を第２命令用演算ユニットの一部で行うのに比べてメモリアクセスするタイミングが早まるので、最大動作周波数を高く維持できる。
【００９４】
演算ユニット５５の出力ＯＴ５は、さらに、セレクタ６６を介してレジスタファイル２５およびレジスタ３１〜３４，３７，３８に書き戻し可能な構成となっている。図１１のその他の構成は図１０と同様であるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【００９５】
＜実施の形態５＞
図２のプロセッサ１０において、演算ユニット５１によって第１命令が実行されるのと同じサイクルでは、演算ユニット５２によって第２命令が実行されない場合がある。たとえば、第１命令および第２命令の実行前に、第２命令で処理するデータをデータメモリ８からレジスタファイル２５に読み出すロード命令が実行されているが、未だデータの読出しが完了していない場合には、第２命令は第１命令と同時に実行できない。
【００９６】
さらに、既に説明したように、図７のプロセッサ１１において、第１および第２命令の少なくとも一方がシフト命令であり、かつ、第１および第２命令に依存関係がある場合には、第２命令は第１命令と同時に実行できない。図１０のプロセッサ１２において、第１および第２命令の少なくとも一方が乗算命令であり、かつ、第１および第２命令に依存関係がある場合には、第２命令は第１命令と同時に実行できない。
【００９７】
実施の形態５のプロセッサでは、上記のように演算ユニット５１で第１命令を実行するサイクルにおいて、演算ユニット５２で第２命令を実行しない場合には、命令選択回路８３は、セレクタ６１，６２の入力がそれぞれレジスタ３３，３４側になるようにセレクタ６１，６２の切替えを制御する。この結果、演算ユニット５１の演算結果に応じて演算ユニット５２の出力が変化しないので、消費電力をより削減することができる。
【００９８】
上記以外の点については、実施の形態５のプロセッサは図２、図７、図１０、図１１のプロセッサ１０，１１，１２，１３のいずれか１つと同じである。
【００９９】
図１２は、実施の形態５の変形例によるプロセッサの構成を示すブロック図である。図１２のプロセッサ１４は、固定値（たとえば、“００…０”）を有する信号７１，７２がレジスタ６１，６２にそれぞれ入力される点で図２のプロセッサ１０と異なる。信号７１，７２として、プロセッサ内に設けられたレジスタに格納されている値がレジスタ６１，６２に入力されるように構成してもよい。セレクタ６１は、演算ユニット５１の出力、レジスタ３３の値、および信号７１の値のうちいずれか１つを選択し、選択結果を出力する。セレクタ６２は、演算ユニット５１の出力、レジスタ３４の値、および信号７２の値のうちいずれか１つを選択し、選択結果を出力する。演算ユニット５１で第１命令を実行するサイクルにおいて、演算ユニット５２で第２命令を実行しない場合には、命令選択回路８３は、セレクタ６１，６２の入力が信号７１，７２側にそれぞれ切替わるようにセレクタ６１，６２を制御する。これによって、上述した実施の形態５の場合と同様の効果が得られる。
【０１００】
図１２のその他の点は図２の場合と同じであるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【０１０１】
＜実施の形態６＞
［プロセッサの全体構成］
図１３は、実施の形態６によるプロセッサの構成を示すブロック図である。図１３のプロセッサ１５は、図８のプロセッサ１１Ａを変形したものである。
【０１０２】
具体的に、図１３のプロセッサ１５は、第１命令用の演算ユニット５１（ＡＬＵ５１Ａおよびシフト演算器５１Ｂの各々）の出力ノードが２つに分離されている点で図８のプロセッサ１１Ａと異なる。第１の出力（ＯＴ１Ｃ，ＯＴ１Ｄ）は、第２命令用の演算ユニット５２（５２Ａ，５２Ｂ）の入力側のセレクタ６１，６２へつながるカスケーディング用の出力（以後、便宜上「直列出力」と記載）であり、第２の出力（ＯＴ１Ａ，ＯＴ１Ｂ）は、セレクタ６５を介してレジスタファイル２５への書き戻し経路につながる出力（以後、便宜上「並列出力」と記載）である。図１３のその他の構成は図８の場合と同じであるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【０１０３】
第１命令用ＡＬＵ５１Ａに関して、直列出力ＯＴ１Ｃから出力されるデータは、並列出力ＯＴ１Ａからも同時に出力できる。直列出力ＯＴ１Ｃから演算結果を出力できるのは第１命令用ＡＬＵ（５１Ａ）で処理できる命令のうちの一部の命令であり、並列出力ＯＴ１Ａから演算結果を出力できるのは第１命令用ＡＬＵ（５１Ａ）で処理できる命令のうちの全ての命令である。
【０１０４】
同様に、第１命令用シフト演算器５１Ｂに関して、直列出力ＯＴ１Ｄから出力されるデータは、並列出力ＯＴ１Ｂからも同時に出力できる。直列出力ＯＴ１Ｄから演算結果を出力できるのは第１命令用シフト演算器５１Ｂで処理できる命令のうちの一部の命令であり、並列出力ＯＴ１Ｂから演算結果を出力できるのは第１命令用シフト演算器５１Ｂで処理できる命令のうちの全ての命令である。
【０１０５】
［第１命令用ＡＬＵの構成例］
図１４は、図１３の第１命令用ＡＬＵの構成の一例を示すブロック図である。図１３、図１４を参照して、第１命令用ＡＬＵ（５１Ａ）は、加算・論理演算器９１と、セレクタ９２と、選択制御回路９３とを含む。
【０１０６】
加算・論理演算器９１は、レジスタ３１および３２にそれぞれ保持されているデータＤＴ１１およびＤＴ１２（第１命令用ＡＬＵ５１Ａへの入力データ）に対して、加算、減算、および論理演算のうちの１つを実行する。加算・論理演算器９１の演算結果は、直列出力ＯＴ１Ｃから出力されるとともに、セレクタ９２に入力される。
【０１０７】
セレクタ９２は、選択制御回路９３の指令に従って、レジスタ３１および３２にそれぞれ保持されているデータＤＴ１１およびＤＴ１２、ならびに加算・論理演算器９１の演算結果のうちの１つを選択する。セレクタ９２の選択結果は、並列出力ＯＴ１Ａから出力される。
【０１０８】
選択制御回路９３は、命令選択回路８３から、ＡＬＵ５１Ａで実行する命令の種類の情報を受け、加算・論理演算器９１から、サインフラグ（演算結果の正負）およびオーバフローフラグ（オーバフローの発生の有無）などの情報を受ける。選択制御回路９３は、これらの情報に基づいて、セレクタ９２の選択を制御する。
【０１０９】
たとえば、ＭＡＸ命令（最大値選択命令）を実行する場合、命令選択回路８３の制御に従って、加算・論理演算器９１は、減算（Ａ−Ｂ）を行なう。選択制御回路９３は、減算結果が正だった場合は被減数側（Ａ）のレジスタを、負だった場合には減数（Ｂ）側のレジスタを選択するという制御をする。ＭＩＮ命令（最小値選択命令）の場合には、選択制御回路９３の判断が逆になる。
【０１１０】
並列出力ＯＴ１Ａから出力できるが、直列出力ＯＴ１Ｃから出力できない命令として、ＭＡＸ（最大値選択）、ＭＩＮ（最小値選択）、ＡＢＳ（絶対値）、およびＳＡＴ（符号付き飽和処理：正または負のオーバーフローのときそれぞれ所定の値を出力する）などが挙げられる。
【０１１１】
［第１命令用シフト演算器の構成例］
図１５は、図１３の第１命令用シフト演算器の構成の一例を示すブロック図である。図１３、図１５を参照して、第１命令用シフト演算器５１Ｂは、バレルシフタ９４と、マスク処理回路Ａ（９５）と、マスク処理回路Ｂ（９６）と、マスク制御回路９７とを含む。
【０１１２】
バレルシフタ９４は、与えられたビット数分だけ多ビットの入力データをシフトする回路である。図１５の場合、シフトするビット数は、レジスタ３１からデータＤＴ１１として与えられ、多ビットの入力データはレジスタ３２からデータＤＴ１２として与えられる。
【０１１３】
マスク処理回路Ａ（９５）およびマスク処理回路Ｂ（９６）の各々は、マスク制御回路９７から与えられたマスクデータによって、バレルシフタ９４の出力にマスクをかける。マスク処理回路Ａ（９５）の処理結果は、並列出力ＯＴ１Ｂから出力され、マスク処理回路Ｂ（９６）の処理結果は、直列出力ＯＴ１Ｄから出力される。したがって、直列出力ＯＴ１Ｄと並列出力ＯＴ１Ｂとは、それぞれ別のマスク処理を行った結果が出力される。
【０１１４】
マスク制御回路９７は、命令選択回路８３から、シフト演算器５１Ｂで実行する命令の種類の情報を受け、レジスタ３１，３２から、シフト量および入力データの情報を受ける。マスク制御回路９７は、命令の種類とシフト量に応じてマスクデータを生成し、生成したマスクデータをマスク処理回路Ａ（９５）およびマスク処理回路Ｂ（９６）にそれぞれ出力する。命令の種類が右シフトか左シフトかによって、上位側のビットがマスクされたマスクデータを作成するのか、下位側のビットがマスクされたマスクデータを作成するのかが変わる。マスク制御回路９７は、命令の種類が論理シフト命令の場合はマスクされた部分が０になるようにする。マスク制御回路９７は、命令の種類が算術右シフトの場合には、入力データ（シフトされるデータ）の最上位ビットの値に応じてマスクされた部分を０にするか１にするかを判断する。マスク制御回路９７は、シフト量に応じて何ビット分マスクするのかを決定する。
【０１１５】
並列出力ＯＴ１Ｂから出力できるが、直列出力ＯＴ１Ｃから出力できない命令として、ＲＯＴＬ（左回転）、ＲＯＴＲ（右回転）、ＲＯＬＣ（キャリ付き左回転）、およびＲＯＬＲ（キャリ付き右回転）が挙げられる。
【０１１６】
［プロセッサの動作］
再び図１３を参照して、命令選択回路８３で選択した第１命令と第２命令との依存関係に応じた、プロセッサ１５の動作について説明する。
【０１１７】
第１命令と第２命令に依存関係がないとき、第１命令および第２命令は、それぞれ第１命令用演算ユニット５１（５１Ａ，５１Ｂ）および第２命令用演算ユニット５２（５２Ａ，５２Ｂ）で同時に実行可能である。
【０１１８】
一方、第１命令と第２命令との間に依存関係があるとき、第１命令が、第１命令用演算ユニット５１（５１Ａ，５１Ｂ）の直列出力から演算結果を出力可能な命令である場合に、第１命令と第２命令は同時に実行可能である。この場合、命令選択回路８３の制御に従って、第２命令用演算ユニット５２（５２Ａ，５２Ｂ）の入力側のセレクタ６１および６２の少なくとも一方は、第１命令用演算ユニット５１（５１Ａ，５１Ｂ）の演算結果を選択する。
【０１１９】
［効果］
第１命令用演算ユニット５１（５１Ａ，５１Ｂ）で処理する命令のうち、相対的に処理時間がかかる命令を直列出力の対象から除くことで、最大動作周波数を高く維持することができる。直列出力の対象外とする命令に、プログラムでの実行頻度の低い命令を選ぶことができれば、全ての命令を直列出力から出力する場合に比べて性能の低下を抑えることができる。
【０１２０】
なお、上記の説明は、図８のプロセッサ１１Ａの変形例として説明したが、図２および図１０の第１命令用演算ユニット５１の出力、図６の第１および第２命令用演算ユニット５１，５２の出力、ならびに図７、図９、および図１１の第１命令用ＡＬＵ５１Ａの出力についても同様に、直列出力と並列出力とに分けることができる。
【０１２１】
＜実施の形態７＞
［プロセッサの全体構成］
図１６は、実施の形態７によるプロセッサの構成を示すブロック図である。図１６のプロセッサ１６は、図２のプロセッサ１０を変形したものである。
【０１２２】
具体的に、図１６を参照して、第１命令用演算ユニット５１は、演算結果を出力するための出力ノードＯＴ１Ａと、演算結果の状態を表すフラグを出力するための出力ノードＯＴ１Ｂとを含む。同様に、第２命令用演算ユニット５２は、演算結果を出力するための出力ノードＯＴ２Ａと、演算結果の状態を表すフラグを出力するための出力ノードＯＴ２Ｂとを含む。フラグとして、たとえば、Ｃ（キャリフラグ）、Ｚ（ゼロフラグ）、Ｓ（サインフラグ）、およびＯ（オーバフローフラグ）がある。
【０１２３】
第１命令用演算ユニット５１の出力ノードＯＴ１Ａは、セレクタ６１，６２につながっている。セレクタ６１は、命令選択回路８３の制御に従って、第１命令用演算ユニット５１の出力ノードＯＴ１Ａからの出力と、レジスタ３３の出力データＤＴ２１との一方を選択する。セレクタ６２は、命令選択回路８３の制御に従って、第１命令用演算ユニット５１の出力ノードＯＴ１Ａからの出力と、レジスタ３４の出力データＤＴ２２との一方を選択する。
【０１２４】
図１６のプロセッサ１６は、セレクタ６９をさらに含む。第１命令用の演算ユニット５１のフラグ用の出力ＯＴ１Ｂは、第２命令用の演算ユニット５２の入力側のカスケーディング用のセレクタ６１，６２にはつながっておらず、このセレクタ６９の入力ノードに接続される。セレクタ６９は、演算ユニット５１の出力ノードＯＴ１Ｂから出力されたフラグと、演算ユニット５２の出力ノードＯＴ２Ｂから出力されたフラグとのうち一方を選択する。
【０１２５】
図１６のレジスタ群２０では、フラグを保持するためのレジスタ３９（プロセッサステータスワード（ＰＳＷ）の一部のビットに相当する）が、レジスタファイル２５とは別個に描かれている。レジスタ３９には、セレクタ６９の出力が入力される。レジスタ３９の出力は、第１命令用演算ユニット５１に入力されるとともに、セレクタ６１，６２を介さずに第２命令用演算ユニット５２に入力される。
【０１２６】
図１６のその他の構成は図２の場合と同じであるので、同一または相当する部分には同一の参照符号を付して説明を繰り返さない。
【０１２７】
［プロセッサの動作］
演算ユニット５１で実行される第１命令がフラグの値を更新する命令であり、演算ユニット５２で実行される第２命令がフラグの値を参照する命令の場合（すなわち、第１命令と第２命令とにカスケーディング経路がない場合）、第１命令と第２命令とは同時に実行できない。この場合、演算ユニット５１によって第１命令が実行されたときのフラグ出力ＯＴ１Ｂは、レジスタ３９に一旦格納される。次のサイクルに、演算ユニット５１は、レジスタ３９に格納されたフラグを参照することにより第２命令を実行する。
【０１２８】
第１命令によってフラグが更新されないか、または第２命令がフラグを参照しない場合には、フラグの値に関して第１命令と第２命令とに依存関係はない。この場合に、フラグ以外のオペランドデータに関して第１命令と第２命令との間に依存関係があったとしても、演算ユニット５１，５２間にカスケーディング経路があるので、命令選択回路８３は第１命令および第２命令を同時に発行し、第１命令および第２命令はそれぞれ同時に演算ユニット５１，５２で実行される。
【０１２９】
フラグの種類ごとに、たとえば、上記の４種類のフラグ（Ｏ、Ｓ、Ｚ、Ｃ）の各々に対して個別に依存関係を判定することは可能である。しかしながら、そうすると依存関係判定の処理時間がかかり、最大動作周波数が悪化するおそれがある。そこで、命令選択回路８３は、第１命令によってフラグ（Ｏ、Ｓ、Ｚ、Ｃ）のうちどれか１つでも更新される場合にはフラグの更新ありと判定し、第２命令によってフラグ（Ｏ、Ｓ、Ｚ、Ｃ）のうちどれか１つでも参照される場合にはフラグの参照ありと判定する。以下、具体例を挙げて説明する。
【０１３０】
例１：第１命令がａｄｄ（加算）命令であり、第２命令がａｄｃ（キャリ付き加算）命令の場合について説明する。なお、以下の各例において、ｒ１〜ｒ５はレジスタの番号を表す。
【０１３１】
（第１命令）  ａｄｄ  ｒ１，ｒ２，ｒ３  （ｒ１＋ｒ２の結果をｒ３に格納）
（第２命令）  ａｄｃ  ｒ４，ｒ５  （ｒ４＋ｒ５＋キャリフラグをｒ５に格納）
この場合、第１命令はフラグを参照しないが、演算の結果、Ｏ，Ｓ，Ｚ，Ｃフラグの全てが更新される。第２命令はＣフラグを参照し、演算の結果、Ｏ，Ｓ，Ｚ，Ｃフラグの全てが更新される。この結果、命令選択回路８３は、第１命令によってフラグの更新ありと判定し、第２命令によってフラグの参照ありと判定する。第１命令と第２命令とにフラグの依存関係があるので、命令選択回路８３は、第１命令と第２命令とを同時に発行しない。
【０１３２】
例２：第１命令がａｎｄ（論理積）命令であり、第２命令がａｄｃ（キャリ付き加算）命令の場合について説明する。
【０１３３】
（第１命令）  ａｎｄ  ｒ１，ｒ２  （ｒ１とｒ２の論理積をｒ２に格納）
（第２命令）  ａｄｃ  ｒ４，ｒ５  （ｒ４＋ｒ５＋キャリフラグをｒ５に格納）
この場合、第１命令はフラグを参照しないが、演算の結果、Ｓ，Ｚフラグが更新される。具体的に、Ｚ（ゼロ）フラグは、論理積が“０…０”のとき“１”となり、それ以外のとき“０”になる。Ｓ（サイン）フラグは、論理積のＭＳＢ（最上位ビット）が“１”のとき“１”となり、それ以外のとき“０”になる。一方、第２命令はＣフラグを参照し、演算の結果、Ｏ，Ｓ，Ｚ，Ｃフラグの全てが更新される。この結果、命令選択回路８３は、第１命令によってフラグの更新ありと判定し、第２命令によってフラグの参照ありと判定する。第１命令と第２命令とにフラグの依存関係があるので、命令選択回路８３は、第１命令と第２命令とを同時に発行しない。
【０１３４】
例３：第１命令がｍｏｖ．ｌ（転送）命令であり、第２命令がａｄｃ（キャリ付き加算）命令の場合について説明する。なお、ｍｏｖ．ｌの「ｌ」は処理サイズがロングワードであることを意味する。
【０１３５】
（第１命令）  ｍｏｖ．ｌ  ｒ１，ｒ２  （ｒ１の値をｒ２に転送）
（第２命令）  ａｄｃ  ｒ４，ｒ５  （ｒ４＋ｒ５＋キャリフラグをｒ５に格納）
この場合、第１命令はフラグを参照せず、演算の結果、フラグを更新しない。第２命令はＣフラグを参照し、演算の結果、Ｏ，Ｓ，Ｚ，Ｃフラグの全てが更新される。この結果、命令選択回路８３は、第１命令によってフラグの更新がなく、第２の命令によってフラグの参照有りと判定する。第１命令と第２命令とにフラグの依存関係がなく、レジスタのデータにも依存関係がないので、命令選択回路８３は、第１命令と第２命令とを同時に選択し、発行する。
【０１３６】
［効果］
フラグの生成は、フラグ以外の出力データの生成よりも時間がかかる。このため、第１命令用演算器のフラグの出力パスを第２命令用演算器につなげないことでプロセッサの最大動作周波数を高く維持できる。図２に示す実施の形態１の場合には、フラグも出力データの一部としていた。しかし、フラグとフラグ以外の出力データとでは信号経路が別々であり、参照先の用途も違うことなどから、実施の形態７では、データ生成に時間がかかるフラグをカスケーディングの対象外にしている。
【０１３７】
なお、上記の説明は、図２のプロセッサ１０の変形例として説明したが、図６の第１〜第３の演算ユニット５１，５２，５３、ならびに図７〜図１１の第１、第２の演算ユニット５１，５２についても同様に、フラグ出力と、フライ以外のデータ出力とに分け、フラグ出力をカスケーディングの対象外にすることができる。
【０１３８】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【符号の説明】
【０１３９】
１  半導体装置、６  メモリ、７  命令メモリ、８  データメモリ、１０，１０Ａ，１１，１１Ａ，１１Ｂ，１２，１３，１４，１５，１６  プロセッサ、２０，２０Ａ，２０Ｂ  レジスタ群、２５  レジスタファイル、３１〜３９  レジスタ、４１〜４８，５１，５２，６０〜６９  セレクタ、５１〜５４  演算ユニット、５５  ロードストアユニット、５１Ａ，５２Ａ  ＡＬＵ、５１Ｂ，５２Ｂ  シフト演算器、７１，７２  信号、８０  制御回路、８１  フェッチ制御部、８２  命令デコーダ、８３  命令選択回路、ＤＴ１，ＤＴ２，ＤＴ１１，ＤＴ１２，ＤＴ２１，ＤＴ２２，ＤＴ３１，ＤＴ３２  データ。
【図１】
2014164659.tif 000003
【図２】
2014164659.tif 000004
【図３】
2014164659.tif 000005
【図４】
2014164659.tif 000006
【図５】
2014164659.tif 000007
【図６】
2014164659.tif 000008
【図７】
2014164659.tif 000009
【図８】
2014164659.tif 000010
【図９】
2014164659.tif 000011
【図１０】
2014164659.tif 000012
【図１１】
2014164659.tif 000013
【図１２】
2014164659.tif 000014
【図１３】
2014164659.tif 000015
【図１４】
2014164659.tif 000016
【図１５】
2014164659.tif 000017
【図１６】
2014164659.tif 000018