(57)【特許請求の範囲】
【請求項１】
複数の演算器と、
複数の命令を前記複数の演算器に対して同時並列に発行する命令発行部と
を含み、前記複数の演算器の少なくとも１つの演算器は、
シフト演算を実行するシフト回路と、
２つのシフト命令のシフト数を加減算するシフト数生成回路と、
を含み、前記シフト数生成回路により求めたシフト数に応じて前記シフト回路によるシフト演算を実行することにより、データ依存関係のある２つのシフト命令を１回のシフト演算で実行するよう構成されたことを特徴とする情報処理装置。
【請求項２】
前記命令発行部は、前記複数の演算器の他の１つの演算器に前記データ依存関係のある２つのシフト命令のうちの先行命令を発行すると共に、前記少なくとも１つの演算器に前記データ依存関係のある２つのシフト命令のうちの後続命令を発行することを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記少なくとも１つの演算器は、前記他の１つの演算器の第１のオペランドと前記少なくとも１つの演算器の第１のオペランドとを前記シフト数生成回路に入力する信号経路を含むことを特徴とする請求項１又は２記載の情報処理装置。
【請求項４】
前記少なくとも１つの演算器は、
前記シフト数生成回路の出力と前記少なくとも１つの演算器の前記第１のオペランドとの何れかを選択して前記シフト回路にシフト数として入力するマルチプレクサと、
前記他の１つの演算器の第２のオペランドと前記少なくとも１つの演算器の第２のオペランドとの何れかを選択して前記シフト数生成回路にシフト対象データとして入力するマルチプレクサと
を含むことを特徴とする請求項３記載の情報処理装置。
【請求項５】
前記シフト数生成回路は、
２つのシフト命令のシフト数の和を計算する加算器と、
２つのシフト命令のシフト数の差を計算する減算器と、
前記差とは正負が反転したシフト数の差を計算する減算器と、
を含み、前記シフト回路は、
左シフトを計算する左シフタと、
右シフトを計算する右シフタと、
を含むことを特徴とする請求項１乃至４何れか一項記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本願開示は、一般に情報処理装置に関し、詳しくは複数の命令を同時実行可能な情報処理装置に関する。
【背景技術】
【０００２】
１サイクルで複数の命令を同時発行可能であるスーパスカラプロセッサには、インオーダ型とアウトオブオーダ型の２つの命令発行方式がある。インオーダ型では、演算器への命令の発行順序がプログラム中の命令の順番と同一であり、比較的単純な制御で実現できる。アウトオブオーダ型では、演算器への命令の発行順序がプログラム中の命令の順番に制限されず、制御が複雑となるが効率的な演算実行が可能となる。一般には、発行候補である複数の命令のうち、例えば２番目の命令が１番目の命令にデータの依存関係を有する場合、これら２つの命令を同時並列に発行することができない。即ち、２番目の命令の発行は１番目の命令発行の後になる。この場合、３番目の命令に依存関係がなければ、アウトオブオーダ型であれば３番目の命令を２番目の命令に先行して１番目の命令と同時に発行できる。それに対してインオーダ型では、３番の命令を２番目の命令に先行して発行することはできない。
【０００３】
データ依存関係がある場合に同時並列発行を可能とするために、演算器をカスケード接続可能なように構成して、先行命令とそれにデータ依存関係がある後続命令とを同時並列に発行可能な演算器カスケード方式がある。例えば、第１の演算器に第１の命令を発行し、第２の演算器に第２の命令を発行するとともに、第１の演算器の出力を第２の演算器の入力にカスケード接続する。これにより、パイプライン動作の一段の実行ステージ内において、データ依存関係がある第１の命令と第２の命令とを纏めて実行することができる。
【０００４】
しかし、上記のような演算器カスケード方式では、単純に第１の演算器による演算を実行してから第２の演算器による演算を実行するので、実行ステージの完了までに要する遅延時間が増大してしまう。この実行ステージの実行時間がプロセッサ全体のクリティカルパスになってしまうと動作周波数の低下を招いてしまう。
【０００５】
従って、演算論理を圧縮して高速実行可能にした回路を用意しておき、演算器カスケードを行なう際に、この回路を利用して遅延時間を小さくすることが考えられる。特許文献１では、連続する加算命令同士にデータ依存関係がある場合に、単純に加算器を２つカスケード接続するのではなく、桁上げ保存加算器と通常の桁上げ加算器を組み合わせた回路を追加し、遅延時間の増大を抑えながら同時発行可能な方法を開示している。この方式では、加算−加算、加算−論理、論理−加算、論理−加算の全４つの加算及び論理の組み合わせに対してのみ、遅延時間の増大を抑えることができる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平６−５９８６１号公報
【特許文献２】特開平６−３１８１５５号公報
【特許文献３】特開平８−２７２６１１号公報
【非特許文献】
【０００７】
【非特許文献１】Blanck, G. and Krueger, S., “The SuperSPARC microprocessor,” In Proceedings of the Thirty-Seventh international Conference on COMPCON (San Francisco,California, United States),IEEE Computer Society Press,Los Alamitos, CA, 136-141, 1992.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
以上を鑑みると、加算及び論理の組み合わせ以外の演算に対して演算器カスケードの遅延時間の増大を抑えることが可能な情報処理装置が望まれる。
【課題を解決するための手段】
【０００９】
情報処理装置は、複数の演算器と、複数の命令を前記複数の演算器に対して同時並列に発行する命令発行部とを含み、前記複数の演算器の少なくとも１つの演算器は、シフト演算を実行するシフト回路と、２つのシフト命令のシフト数を加減算するシフト数生成回路とを含み、前記シフト数生成回路により求めたシフト数に応じて前記シフト回路によるシフト演算を実行することにより、データ依存関係のある２つのシフト命令を１回のシフト演算で実行するよう構成されたことを特徴とする。
【発明の効果】
【００１０】
本願開示の少なくとも１つの実施例によれば、シフト数生成回路を用いたシフト演算を実行することにより、データ依存関係のある２つのシフト命令を１回のシフト演算で実行する。従って、データ依存関係のある２つのシフト命令を同時並列に発行しながらも、遅延時間が長くなるのを避けることができる。
【図面の簡単な説明】
【００１１】
【図１】情報処理装置の構成の一例を示す図である。
【図２】ＡＬＵの構成の一例を示す図である。
【図３】演算器カスケードによりデータ依存関係にある２つのシフト命令を実行する構成を示す図である。
【図４】図３に示す構成によるシフト演算を説明するための図である。
【図５】図３に示す構成によるシフト演算を説明するための図である。
【図６】シフト数生成回路及びシフト回路の構成の一例を示す図である。
【図７】図６のシフト数生成回路及びシフト回路の動作制御の一例を示す図である。
【図８】図１の命令発行判定回路の動作の一例を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。
【００１３】
図１は、情報処理装置の構成の一例を示す図である。情報処理装置は、プログラムカウンタ（ＰＣ）１１、分岐予測器１２、命令キャッシュ１３、命令レジスタ１４、命令発行判定回路１５、レジスタファイル１６、第１〜第３の演算器２０乃至２２、データキャッシュ２５、及びマルチプレクサ（ＭＵＸ）２８を含む。情報処理装置は更に、パイプラインレジスタ１７〜１９、２３、２４、２６、２７を含む。図１には、インオーダ方式で３つの命令を同時並列に発行する例を示すが、情報処理装置の構成はこの例に限定されるものではなく、アウトオブオーダ方式でもよいし、また命令同時発行数も３に限られず任意の数であってよい。
【００１４】
プログラムカウンタ１１は、プログラムを構成する命令列を順次フェッチするために、現在のフェッチ対象である命令アドレスを指し示す値を保持し、この値を順次カウントアップしていく。プログラムカウンタ１１が指し示す命令アドレスは命令キャッシュ１３に供給され、この命令アドレスの命令が読み出され、命令レジスタ１４に順次格納される。なお命令キャッシュ１３に存在しない命令については、外部のメモリから命令キャッシュ１３に読み込まれ、更に命令キャッシュ１３から命令レジスタ１４に格納される。命令レジスタ１４には、プログラムの命令列の順番に従い、例えば４つの連続する命令が格納される。分岐予測器１２は、プログラムカウンタ１１からの命令アドレスと命令キャッシュ１３からの命令とに基づいて、当該命令が分岐命令であるときに、分岐先アドレスを予測する。分岐予測器１２が予測した分岐先アドレスは、マルチプレクサ２８を介してプログラムカウンタ１１に格納される。以上の動作が命令フェッチフェーズ（ＩＦ）を構成する。
【００１５】
命令発行判定回路１５は、命令レジスタ１４に格納される連続する命令のうち先頭の３つの命令を受け取り、各命令をデコードすると共に、同時並列に発行可能な命令であるか否かを判定する。３つの命令を同時並列に発行可能であれば、これら３つの命令を同時並列に発行する。先頭の２つの命令のみが同時並列に発行可能であれば、これら２つの命令のみを同時並列に発行する。1つの命令のみが発行可能であれば、この命令のみを発行する。この際、同時並列発行の候補である複数の命令間にデータ依存関係やハードウェア的な資源競合等が存在するか否かを判断し、この判断に基づいて同時並列に発行する命令を決定する。命令発行判定回路１５が発行した命令は、発行対象の演算器に対応するパイプラインレジスタ１７乃至１９に格納される。このとき、発行された命令に対応するオペランドがレジスタファイル１６から読み出され、対応するパイプラインレジスタ１７乃至１９に格納される。以上の動作が命令デコードフェーズ（ＩＤ）を構成する。
【００１６】
第１乃至第３の演算器２０乃至２２はそれぞれ、発行された命令を実行する。複数の命令が同時並列に発行されていれば、これら複数の命令が同時並列に実行される。図１の例において、第１の演算器２０は、分岐命令を実行して分岐先アドレスを計算する分岐計算回路３１を有する演算器であり、３つのウェイ（３つの同時実行可能なパイプライン）のうちでウェイｗａｙ２と表記されている。第２の演算器２１は、算術論理演算を実行するＡＬＵ（Arithmetic Logic Unit）３２を有する演算器であり、３つのウェイのうちのウェイｗａｙ０と表記されている。第３の演算器２２は、算術論理演算を実行するＡＬＵ３４を有する演算器であり、３つのウェイのうちのウェイｗａｙ１と表記されている。この第３の演算器２２は、更に、２つのシフト命令のシフト数を加減算するシフト数生成回路３３を含む。このシフト数生成回路３３については後程詳細に説明する。なお第３の演算器２２は、ロード命令及びストア命令の場合には、アクセス先を求めるためのアドレス計算をＡＬＵ３４により実行可能な構成となっている。第１の演算器２０により計算された分岐先アドレスはマルチプレクサ２８に供給される。第２の演算器２１及び第３の演算器２２により計算された演算結果は、それぞれパイプラインレジスタ２３及び２４に格納される。以上の動作が演算実行フェーズ（ＥＸ）を構成する。
【００１７】
第３の演算器２２により計算されたロード命令或いはストア命令のアクセス先であるアドレス及びストア命令の場合の格納対象データは、パイプラインレジスタ２４からデータキャッシュ２５に供給される。ロード命令の場合には、このアクセス先アドレスのデータがデータキャッシュ２５から読み出され、パイプラインレジスタ２７に格納される。なおデータキャッシュ２５に存在しないデータについては、外部のメモリからデータキャッシュ２５に読み込まれ、更にデータキャッシュ２５からパイプラインレジスタ２７に格納される。ストア命令の場合には、データキャッシュ２５に存在するアクセス先アドレスのデータを格納対象データにより上書きする。データキャッシュ２５に当該アドレスのデータが存在しない場合には、外部のメモリからデータキャッシュ２５に当該アドレスのデータが読み込まれ、そのデータを上記格納対象データで上書きする。実行した命令がロード命令及びストア命令でない場合には、パイプラインレジスタ２４のデータは、パイプラインレジスタ２７に格納される。またパイプラインレジスタ２３のデータは、同様に、パイプラインレジスタ２６に格納される。以上の動作がメモリアクセスフェーズ（ＭＡ）を構成する。
【００１８】
最後のライトバックフェーズ（ＷＢ）では、パイプラインレジスタ２６及び２７に格納されたデータが、レジスタファイル１６に転送され格納される。以上のＩＦ、ＩＤ、ＥＸ、ＭＡ、ＷＢの各フェーズがある着目命令について順次実行され、且つＩＦ、ＩＤ、ＥＸ、ＭＡ、ＷＢの全フェーズがある着目サイクルにおいて別個の命令に対して同時に実行されることにより、演算パイプラインが実現される。なおその際、複数の演算器２０乃至２２を設け、命令発行判定回路１５から複数の命令を複数の演算器２０乃至２２に対して同時並列に発行可能な構成となっている。これにより、複数の演算パイプラインが同時進行可能となる。
【００１９】
図２は、ＡＬＵの構成の一例を示す図である。図２に示すＡＬＵは、例えば図１のＡＬＵ３２又は３４に相当する。ＡＬＵ３２又は３４は、加減算回路４１、論理演算回路４２、及びシフト回路４３を含む。加減算回路４１は、２つのオペランドｉｎ０及びｉｎ１の加算或いは減算を実行する。論理演算回路４２は、２つのオペランドｉｎ０及びｉｎ１の論理演算（例えばビット毎のＡＮＤ演算やＯＲ演算等）を実行する。シフト回路４３は、オペランドｉｎ０の各ビットをオペランドｉｎ１が示す数だけ右シフト或いは左シフトするシフト演算を実行する。
【００２０】
図３は、演算器カスケードによりデータ依存関係にある２つのシフト命令を実行する構成を示す図である。図３において、図１と同一の構成要素は同一の番号で参照し、その説明は省略する。図３は、図１に示す第２の演算器２１と第３の演算器２２との詳細な構成を示す図である。第２の演算器２１のＡＬＵ３２は、加減算回路５０、論理演算回路５１、シフト回路５２、及びマルチプレクサ（ＭＵＸ）５３を含む。第３の演算器２２のＡＬＵ３４は、シフト回路５４、加減算回路５５、論理演算回路５６、及びマルチプレクサ（ＭＵＸ）５７乃至５９を含む。またシフト数生成回路３３は、加算器６０を含む。第２の演算器２１のマルチプレクサ５３及び第３の演算器２２のマルチプレクサ５９はそれぞれ、加減算回路、論理演算回路、及びシフト回路の演算結果の何れかを選択して次段に出力するためのものである。
【００２１】
図３に示されるように、第３の演算器２２は、シフト演算を実行するシフト回路５４と２つのシフト命令のシフト数を加減算するシフト数生成回路３３とを含む。これにより、第２の演算器２１と第３の演算器２２とをカスケード接続し、データ依存関係にある２つのシフト命令を実行することが可能となる。即ち、シフト数生成回路３３により求めたシフト数に応じてシフト回路５４によるシフト演算を実行することにより、データ依存関係のある２つのシフト命令を１回のシフト演算で実行可能な構成となっている。
【００２２】
具体的には、第３の演算器２２は、第２の演算器２１のオペランドｉｎ０１と第３の演算器２２のオペランドｉｎ１１とをシフト数生成回路３３に入力する信号経路を含む。また第３の演算器２２は、シフト数生成回路３３の出力と第３の演算器２２のオペランドｉｎ１１との何れかを選択してシフト回路５４にシフト数として入力するマルチプレクサ５８を含む。第３の演算器２２は更に、第２の演算器２１のオペランドｉｎ００と第３の演算器２２のオペランドｉｎ１０との何れかを選択してシフト数生成回路３３にシフト対象データとして入力するマルチプレクサ５７を含む。シフト回路５４は、マルチプレクサ５７から供給されたオペランドの各ビットを、マルチプレクサ５８から供給されたシフト数だけシフトすることで、シフト演算を実行する。なおシフト演算には、右シフト、左シフト、或いは算術右シフト等が存在するが、これらの区別は実行するシフト命令により指定されている。シフト命令を命令発行判定回路１５がデコードした結果に従って、第３の演算器２２を制御することにより、シフト命令により指定したタイプのシフト演算が実行される。
【００２３】
図４は、図３に示す構成によるシフト演算を説明するための図である。なお図４において、シフト演算に関係ない部分（例えば加減算回路等）については表示を省略してある。この図４に示すのは、各演算器の各シフト回路により、独立にシフト演算を並列実行する場合であり、有効データが流れる経路が太線で示してある。同時並列に発行される２つのシフト命令にデータ依存関係が無い場合には、以下に説明するように、独立にシフト演算が並列実行される。
【００２４】
第２の演算器２１は、第１のシフト命令に関連して、シフト対象データであるオペランドｉｎ００と、シフト数であるオペランドｉｎ０１とを受け取る。この例では、オペランドｉｎ００がデータＲ０であり、オペランドｉｎ０１が数８である。第２の演算器２１のシフト回路５２は、データＲ０を８ビットだけ例えば左シフトすることにより、シフト後のデータＲ１を出力ｏｕｔ０として出力する。ここでＲ１＝Ｒ０＜＜８となる。なお演算子“＜＜”は左シフトを示し、“＜＜”の左側の項はシフト対象データ、“＜＜”の右側の項はシフト数である。
【００２５】
第３の演算器２２は、第１のシフト命令とデータ依存関係に無い第２のシフト命令に関連して、シフト対象データであるオペランドｉｎ１０と、シフト数であるオペランドｉｎ１１とを受け取る。この例では、オペランドｉｎ１０がデータＲ３であり、オペランドｉｎ１１が数２である。第３の演算器２２のシフト回路５４は、データＲ３を２ビットだけ例えば左シフトすることにより、シフト後のデータＲ２を出力ｏｕｔ１として出力する。ここでＲ２＝Ｒ３＜＜２となる。
【００２６】
図５は、図３に示す構成によるシフト演算を説明するための図である。この図５に示すのは、データ依存関係のある２つのシフト命令を１回のシフト演算で実行する場合であり、有効データが流れる経路が太線で示してある。同時並列に発行される第１のシフト命令及び第２のシフト命令にデータ依存関係が有る場合には、以下に説明するように、第３の演算器２２のシフト回路５４により、２つのシフト命令を１回のシフト演算で実行する。
【００２７】
第２の演算器２１は、第１のシフト命令に関連して、シフト対象データであるオペランドｉｎ００と、シフト数であるオペランドｉｎ０１とを受け取る。この例では、オペランドｉｎ００がデータＲ０であり、オペランドｉｎ０１が数８である。第２の演算器２１のシフト回路５２は、データＲ０を８ビットだけ例えば左シフトすることにより、シフト後のデータＲ１を出力ｏｕｔ０として出力する。ここでＲ１＝Ｒ０＜＜８となる。この第１のシフト命令の演算結果Ｒ１は、第２のシフト命令以外にも後の命令の演算等に使用する可能性があるので、第２のシフト命令の演算結果とは独立に求めて保存しておく。
【００２８】
第３の演算器２２は、第１のシフト命令とデータ依存関係が有る第２のシフト命令を実行する。この場合実行すべき命令は、Ｒ２＝Ｒ１＜＜２である。ここでデータＲ１は、上記の第２の演算器２１のシフト演算結果である。この第２のシフト命令を実行するために、第３の演算器２２は、第２のシフト命令のシフト数“２”であるオペランドｉｎ１１を受け取る。シフト数生成回路３３は、第１のシフト命令のシフト数“８”と第２のシフト命令のシフト数“２”とを加算して、合計のシフト数“１０”を求める。このシフト数“１０”が、マルチプレクサ５８を介してシフト回路５４に供給される。シフト回路５４はまた、第２の演算器２１のシフト対象データであるオペランドｉｎ００（データＲ０）をマルチプレクサ５７を介して受け取る。シフト回路５４は、データＲ０を１０ビットだけ例えば左シフトすることにより、シフト後のデータＲ２を出力ｏｕｔ１として出力する。ここでＲ２＝Ｒ０＜＜１０となる。
【００２９】
ここで第３の演算器２２の出力Ｒ２は、
Ｒ２＝Ｒ０＜＜１０
＝（（Ｒ０＜＜８）＜＜２）
＝（Ｒ１＜＜２）
である。即ち、第３の演算器２２の出力Ｒ２は、第１のシフト命令の演算結果を第２のシフト命令によりシフト演算したものとなる。言葉を換えて言えば、第３の演算器２２は、データ依存関係のある第１のシフト命令及び第２のシフト命令の２つのシフト命令を１回のシフト演算で実行したことになる。
【００３０】
仮に、第２の演算器２１の出力データＲ１を第３の演算器２２の入力としてカスケード接続すれば、同時発行された第１のシフト命令と第２のシフト命令とを同一の演算フェーズ内で順次実行することができる。しかしながら、シフト回路の入出力間の論理ゲートの段数は比較的多く、シフト回路を２段カスケード接続してしまったのでは、データ入力から演算結果データ出力までの遅延時間が大幅に増大してしまう。それに対して、図３乃至図５で説明した構成を用いれば、シフト数生成回路３３と一段のシフト回路５４とによりシフト演算を実行するので、遅延時間は一段のシフト回路５４のみの場合と比較してそれ程増大しない。例えば、データ幅が３２ビットの場合、シフト数は高々３２であり、シフト数を５ビットで表現できる。この場合、シフト数生成回路３３は６ビット程度の加算器で構成できることになり、シフト数生成回路３３の入出力間の論理ゲートの段数は、シフト回路の入出力間の論理ゲートの段数に比較して格段に少ない数となる。従って、シフト数生成回路３３と一段のシフト回路５４とによりシフト演算を実行する構成では、単純に２つのシフト回路をカスケード接続する場合に比較して、遅延時間を小さくすることができる。
【００３１】
シフト命令では、一般に、命令のフィールドで指定される即値としてシフト数を指定する場合とレジスタ値によりシフト数を指定する場合の２つの場合がある。汎用レジスタの個数が３２個であれば、命令フィールド中の５ビットによりレジスタを指定できる。即値指定の場合は例えば、命令フィールド中の５ビットをシフト数生成回路の入力とすればよい。レジスタ指定の場合は、指定されるレジスタの値の下位５ビットのみをシフト数として供給する方式が多い。従って、シフト数生成回路３３において高々６ビット程度の加算器を用いることにより、シフト数を決定することができる。
【００３２】
図６は、シフト数生成回路３３及びシフト回路５４の構成の一例を示す図である。シフト命令には、例えば、論理右シフトや論理左シフト等の種類がある。図６には、論理右シフト及び論理左シフトの何れかを選択して実行可能なシフト演算回路の構成を示す。シフト数生成回路３３は、加算器６０、減算器６１、減算器６２、及びマルチプレクサ６３を含む。加算器６０は、第１のシフト命令のシフト数ｘ１と第２のシフト命令のシフト数ｙ１とを加算する。減算器６１は、第１のシフト命令のシフト数ｘ１から第２のシフト命令のシフト数ｙ１を減算する。減算器６２は、第２のシフト命令のシフト数ｙ１から第１のシフト命令のシフト数ｘ１を減算する。このように、シフト数生成回路３３は、２つのシフト命令のシフト数の和を計算する加算器６０、２つのシフト命令のシフト数の差を計算する減算器６１、及び、前記差とは正負が反転したシフト数の差を計算する減算器６２を含む。マルチプレクサ６３は、加算器６０、減算器６１、及び減算器６２の何れかの演算結果を選択し、シフト数生成回路３３の出力とする。シフト回路５４は、左シフタ６４、右シフタ６５、及びマルチプレクサ６６を含む。マルチプレクサ６６は、左シフタ６４及び右シフタ６５の何れかの演算結果を選択し、シフト回路５４の出力とする。
【００３３】
論理右シフト及び論理左シフトのそれぞれにおいて、シフト数指定方法として即値指定方式及びレジスタ指定方式がある。命令の表記としては、例えば、
即値指定の論理左シフト命令：      ＬＬＩ  Ｒｓ０，ｉｍｍ，Ｒｄ
レジスタ指定の論理左シフト命令：  ＬＬ  Ｒｓ０，Ｒｓ１，Ｒｄ
即値指定の論理右シフト命令：      ＬＲＩ  Ｒｓ０，ｉｍｍ，Ｒｄ
レジスタ指定の論理右シフト命令：  ＬＲ  Ｒｓ０，Ｒｓ１，Ｒｄ
等となる。ここで、Ｒｓ０はシフト対象データを格納するレジスタ、Ｒｄはシフト演算結果を格納するレジスタ、ｉｍｍは数値であり即値指定の場合のシフト数、Ｒｓ１はシフト数を格納するレジスタである。上記のような命令が命令発行判定回路１５に供給されると、命令発行判定回路１５は当該命令をデコードし、デコード結果に従って、当該命令を実行するための所定の制御信号を生成する。この制御信号に応じて、例えば図６のマルチプレクサ６３による選択動作及びマルチプレクサ６６による選択動作が制御され、所望のシフト演算結果が得られることになる。
【００３４】
図７は、図６のシフト数生成回路３３及びシフト回路５４の動作制御の一例を示す図である。図７（ａ）は、マルチプレクサ６３の選択動作を示したテーブルである。図７（ｂ）は、マルチプレクサ６６の選択動作を示したテーブルである。図７（ａ）に示すように、データ依存関係にある２つの命令のうちの先行命令が論理左シフト命令で後続命令が論理左シフト命令の場合、マルチプレクサ６３は、図６に示す加算器６０の出力Ａを選択して出力する。この場合、図７（ｂ）に示すように、マルチプレクサ６６は、図６に示す左シフタ６４の出力Ｄを選択して出力する。これにより、２つのシフト命令のシフト数同士が加算され、その合計シフト数に応じた左シフト演算の結果が得られることになる。
【００３５】
図７（ａ）に示すように、データ依存関係にある２つの命令のうちの先行命令が論理左シフト命令で後続命令が論理右シフト命令の場合、マルチプレクサ６３は、図６に示す減算器６１の出力Ｂ又は減算器６２の出力Ｃを選択して出力する。この際、互いに正負が反転した同一値である出力Ｂ及びＣのうちで、値が０以上である方の出力が選択される。なおこの際、減算器６１の出力Ｂ及び減算器６２の出力Ｃの少なくとも一方の最上位ビットに基づいて、何れを選択するかを判断することができる。更に、図７（ｂ）に示すように、マルチプレクサ６６は、上記の出力Ｂが選択された場合には図６に示す左シフタ６４の出力Ｄを選択して出力し、上記の出力Ｃが選択された場合には図６に示す右シフタ６５の出力Ｅを選択して出力する。これにより、第１のシフト命令の左シフト数が第２のシフト命令の右シフト数以上であるときには、シフト数の差に等しい数の左シフト演算の結果が得られ、それ以外の場合にはシフト数の差に等しい数の右シフト演算の結果が得られることになる。
【００３６】
図７（ａ）に示すように、データ依存関係にある２つの命令のうちの先行命令が論理右シフト命令で後続命令が論理左シフト命令の場合、マルチプレクサ６３は、図６に示す減算器６１の出力Ｂ又は減算器６２の出力Ｃを選択して出力する。この際、互いに正負が反転した同一値である出力Ｂ及びＣのうちで、値が０以上である方の出力が選択される。なおこの際、減算器６１の出力Ｂ及び減算器６２の出力Ｃの少なくとも一方の最上位ビットに基づいて、何れを選択するかを判断することができる。更に、図７（ｂ）に示すように、マルチプレクサ６６は、上記の出力Ｂが選択された場合には図６に示す右シフタ６５の出力Ｅを選択して出力し、上記の出力Ｃが選択された場合には図６に示す左シフタ６４の出力Ｄを選択して出力する。これにより、第１のシフト命令の右シフト数が第２のシフト命令の左シフト数以上であるときには、シフト数の差に等しい数の右シフト演算の結果が得られ、それ以外の場合にはシフト数の差に等しい数の左シフト演算の結果が得られることになる。
【００３７】
更に、図７（ａ）に示すように、データ依存関係にある２つの命令のうちの先行命令が論理右シフト命令で後続命令が論理右シフト命令の場合、マルチプレクサ６３は、図６に示す加算器６０の出力Ａを選択して出力する。この場合、図７（ｂ）に示すように、マルチプレクサ６６は、図６に示す右シフタ６５の出力Ｅを選択して出力する。これにより、２つのシフト命令のシフト数同士が加算され、その合計シフト数に応じた右シフト演算の結果が得られることになる。
【００３８】
図８は、図１の命令発行判定回路１５の動作の一例を示すフローチャートである。前述のように、命令発行判定回路１５は、複数の発行候補の命令をデコードして、同時並列に発行可能な命令を特定して発行する。なお説明の便宜上、以下の説明において、複数の発行候補の命令の数は２つであるとする。図１の例の場合のように発行候補の命令の数が３つの場合であっても、場合分けが複雑になるだけであり、同様の処理により同時並列に発行可能な命令を特定して発行することができる。
【００３９】
まずステップＳ１において、命令発行判定回路１５は、通常の発行判定を実行する。これは、同時並列発行の候補である複数の命令間にデータ依存関係やハードウェア的な資源競合等が存在するか否かを判断し、この判断に基づいて同時並列に発行する命令を特定するものである。命令レジスタ１４に格納される連続する命令のうち先頭の２つの命令を受け取り、２つの命令を同時並列に発行可能であれば、これら２つの命令を同時並列に発行可能な命令として特定する。先頭の1つの命令のみが発行可能であれば、この命令のみを発行可能な命令として特定する。
【００４０】
ステップＳ２において、命令発行判定回路１５は、後続命令のみ発行不可であるか否かを判定する。即ち、先頭の1つの命令のみが発行可能である場合であるのか否かを判定する。後続命令のみ発行不可である場合、ステップＳ３に進む。それ以外の場合にはステップＳ６に進む。
【００４１】
ステップＳ３において、命令発行判定回路１５は、これら２つの連続する命令がどちらもシフト命令であって、そのシフトされる値のレジスタ番号に依存関係があるために後続命令が発行不可となっているのか否かを判定する。例えば、先行命令でシフト演算結果をレジスタＲ１に格納し、後続命令で同一のレジスタＲ１の格納値に対して更にシフト演算を実行する場合が該当する。ステップＳ３の判定結果がＹＥＳであれば、ステップＳ４に進む。ステップＳ４において、命令発行判定回路１５は、シフト数生成回路３３を用いて後続命令も同時発行する。即ち、命令発行判定回路１５は、先行命令を第２の演算器２１に対して発行すると共に、後続命令を第３の演算器２２に対して発行し、更に第３の演算器２２に対してはシフト数生成回路３３を用いてシフト演算を実行するように制御する。
【００４２】
ステップＳ３の判定結果がＮＯであれば、ステップＳ５に進む。ステップＳ５において、命令発行判定回路１５は、後続命令は先行命令と同時並列には発行不可であると決定する。次のステップＳ６において、命令発行判定回路１５は、通常の発行判定に基づき命令を発行する。
【００４３】
このようにして、命令発行判定回路１５は、第２の演算器２１にデータ依存関係のある２つのシフト命令のうちの先行命令を発行すると共に、第３の演算器２２にデータ依存関係のある２つのシフト命令のうちの後続命令を発行する。更に、命令発行判定回路１５は、シフト数生成回路３３を用いたシフト演算を実行するように第３の演算器２２を制御する。これにより、第３の演算器２２は、データ依存関係のある２つのシフト命令を１回のシフト演算で実行する。従って、データ依存関係のある２つのシフト命令を同時並列に発行しながらも、遅延時間が長くなるのを避けることができる。
【００４４】
上記のようにデータ依存関係のある２つのシフト命令を１回のシフト演算で実行する構成は、インオーダ方式により同時並列に命令を発行する構成に限定されるものではなく、アウトオブオーダ方式により同時並列に命令を発行する構成に用いることができる。但し、前述のように、アウトオブオーダ方式では、データ依存関係により命令が発行できなくとも、それに後続する命令を先に発行できる可能性があるので、データ依存関係により命令が発行できないことによるペナルティーがそれ程大きくない。それに対してインオーダ方式では、データ依存関係により命令が発行できない場合、それに後続する命令を先に発行することはできないので、データ依存関係により命令が発行できないことによるペナルティーが大きい。従って、データ依存関係のある２つのシフト命令を１回のシフト演算で実行する構成は、インオーダ方式の場合に特に効果が大きい。
【００４５】
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
【００４６】
なお本願発明は以下の内容を含むものである。
（付記１）
複数の演算器と、
複数の命令を前記複数の演算器に対して同時並列に発行する命令発行部と
を含み、前記複数の演算器の少なくとも１つの演算器は、
シフト演算を実行するシフト回路と、
２つのシフト命令のシフト数を加減算するシフト数生成回路と、
を含み、前記シフト数生成回路により求めたシフト数に応じて前記シフト回路によるシフト演算を実行することにより、データ依存関係のある２つのシフト命令を１回のシフト演算で実行するよう構成されたことを特徴とする情報処理装置。
（付記２）
前記命令発行部は、前記複数の演算器の他の１つの演算器に前記データ依存関係のある２つのシフト命令のうちの先行命令を発行すると共に、前記少なくとも１つの演算器に前記データ依存関係のある２つのシフト命令のうちの後続命令を発行することを特徴とする付記１記載の情報処理装置。
（付記３）
前記少なくとも１つの演算器は、前記他の１つの演算器の第１のオペランドと前記少なくとも１つの演算器の第１のオペランドとを前記シフト数生成回路に入力する信号経路を含むことを特徴とする付記１又は２記載の情報処理装置。
（付記４）
前記少なくとも１つの演算器は、
前記シフト数生成回路の出力と前記少なくとも１つの演算器の前記第１のオペランドとの何れかを選択して前記シフト回路にシフト数として入力するマルチプレクサと、
前記他の１つの演算器の第２のオペランドと前記少なくとも１つの演算器の第２のオペランドとの何れかを選択して前記シフト数生成回路にシフト対象データとして入力するマルチプレクサと
を含むことを特徴とする付記３記載の情報処理装置。
（付記５）
前記シフト数生成回路は、
２つのシフト命令のシフト数の和を計算する加算器と、
２つのシフト命令のシフト数の差を計算する減算器と、
前記差とは正負が反転したシフト数の差を計算する減算器と、
を含み、前記シフト回路は、
左シフトを計算する左シフタと、
右シフトを計算する右シフタと、
を含むことを特徴とする付記１乃至４何れか一項記載の情報処理装置。
（付記６）
前記命令発行部は、インオーダ方式で命令を前記複数の演算器に対して発行することを特徴とする付記１乃至５記載何れか一項記載の情報処理装置。
【符号の説明】
【００４７】
１１  プログラムカウンタ（ＰＣ）
１２  分岐予測器
１３  命令キャッシュ
１４  命令レジスタ
１５  命令発行判定回路
１６  レジスタファイル
１７〜１９  パイプラインレジスタ
２０〜２２  演算器
２３，２４  パイプラインレジスタ
２５  データキャッシュ
２６，２７  パイプラインレジスタ
２８  マルチプレクサ（ＭＵＸ）
【図１】
0005505083.tif 000002
【図２】
0005505083.tif 000003
【図３】
0005505083.tif 000004
【図４】
0005505083.tif 000005
【図５】
0005505083.tif 000006
【図６】
0005505083.tif 000007
【図７】
0005505083.tif 000008
【図８】
0005505083.tif 000009