(57)【特許請求の範囲】
【請求項１】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値とが一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、
動作モードを設定する命令を割り当てるステップと、
命令コードのフィールドの値が一致する一連の命令列の最後の命令同士の実行されるサイクルを比較するステップと、
命令コードのフィールドの値が一致する一連の命令列の最後の命令の実行サイクルが他よりも早い場合に、該命令コードと同じフィールド値を持つ分岐命令を該命令と同じサイクルまたは後のサイクルで実行するように割り当てるステップとを有することを特徴とする命令割り当て方法。
【請求項２】
動作モードのうち実行頻度の高い値を判別するステップをさらに有し、
実行頻度が高いと判別された動作モードに対応する命令を早いサイクルに優先的に割当てることを特徴とする請求項１に記載の命令割り当て方法。
【請求項３】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、
動作モードを設定する命令を割り当てるステップと、
ある動作モードのときのみ実行される命令が動作モード設定命令よりも前で実行されるように割り当て可能かを判別するステップと、
割り当て可能と判別された前記命令を動作モードに依らず実行される命令として割り当てるステップとを有することを特徴とする命令割り当て方法。
【請求項４】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、
動作モードを設定する命令を割り当てるステップと、
命令コードのフィールドの値が一致する一連の命令列同士を比較するステップと、
前記比較の結果、同等の命令がある場合には該命令を動作モードにかかわらず実行される命令に変換するステップとを有することを特徴とする命令割り当て方法。
【請求項５】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て行方法であって、
特定の動作モードでのみ実行される命令を生成するよりも、動作モードによらずに動作する命令を生成した方が実行速度が大きい場合には、動作モードによらずに動作する命令を生成することを特徴とする命令割り当て方法。
【請求項６】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、
動作モードを設定する命令を割り当てるステップと、
動作モードのうち実行頻度の高い値を判別するステップとを有し、
実行頻度が高いと判別された動作モードに対応する命令は分岐なしに実行されるように割り当てるとともに、
他の動作モードに対応する命令は、前記実行頻度が高いと判別された動作モードに対応する命令とは別のサイクルで実行されるように割り当てることを特徴とする命令割り当て方法。
【請求項７】
動作モードに依存する実行をする必要がなくなっても、動作モードを戻す命令を割り当てないことを特徴とする請求項１ないし６のいずれか１項に記載の命令割り当て方法。
【請求項８】
前記ＣＰＵは、並行に実行できる演算器を複数持つものであることを特徴とする請求項１ないし７のいずれか１項に記載の命令割り当て方法。
【請求項９】
命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値とが一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て装置であって、
動作モードを設定する命令を割り当てる手段と、
命令コードのフィールドの値が一致する一連の命令列の最後の命令同士の実行されるサイクルを比較する手段と、
命令コードのフィールドの値が一致する一連の命令列の最後の命令の実行サイクルが他よりも早い場合に、該命令コードと同じフィールド値を持つ分岐命令を該命令と同じサイクルまたは後のサイクルで実行するように割り当てる手段とを備えたことを特徴とする命令割り当て装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プレディケート実行をサポートするＣＰＵに対する命令スケジューリングを行う命令割り当て方法及び命令割り当て装置に関する。
【０００２】
【従来の技術】
電子計算機において実行されるプログラムは条件分岐命令を含んでいる。条件分岐命令とは、ある条件が成立するか否かで次に実行する命令番地が異なる命令である。通常、条件分岐命令においては、条件が成立した状態を、「分岐が起こる（ｔａｋｅｎ）」と呼ぶ。このとき、条件分岐命令の次に実行される命令は該条件分岐命令に相続く番地にある命令ではなく、該条件分岐命令のオペランドにより指定された番地の命令である。一方、条件が成立しない状態を、「分岐が起こらない」と呼ぶ。このとき、条件分岐命令の次に実行される命令は該条件分岐命令に相続く番地にある命令である。
【０００３】
パイプライン処理を行なうＣＰＵにおいては、命令は実行される数クロック前にメモリまたはキャッシュからＣＰＵにフェッチされる。このため、条件分岐命令の条件が成立するか否かを判別してから条件分岐命令の次に実行される命令をフェッチするのでは、条件分岐命令の次のサイクルで次の命令を実行することができず、何も実行できないサイクルが入ることになる。これはパイプライン・ハザードと呼ばれるが、高速実行を損なう一因となる。
【０００４】
これを回避する方法の一つとして、プレディケート実行が提案されている（参考文献１；Ｓｃｏｔｔ  Ｍａｈｌｋｅ，  Ａ  Ｃｏｍｐａｒｉｓｏｎ  ｏｆ  Ｆｕｌｌ  ａｎｄ  Ｐａｒｔｉａｌ  Ｐｒｅｄｉｃａｔｅｄ  ＥｘｅｃｕｔｉｏｎＳｕｐｐｏｒｔ  ｆｏｒ  ＩＬＰ  Ｐｒｏｃｅｓｓｏｒｓ，Ｐｒｏｃ．  ｏｆＩＳＣＡ´９５，ｐｐ．１３８−１４９．）。
【０００５】
プレディケート実行をサポートするＣＰＵは、次の二点で通常のＣＰＵと異なる。
・ＣＰＵが管理するプレディケート・モードがあり、このモードを設定する命令がサポートされている。
・命令コードの中にはプレディケート・フィールドがある。このフィールドの値とＣＰＵが管理するプレディケート・モードが一致するときのみ該命令は実行される。
【０００６】
これを利用すると、通常のＣＰＵでの条件分岐命令および条件の成立の如何により実行される命令は次のように変更することができる。
・条件分岐命令を動作モード設定命令に変更する。この命令は、条件が成立するならＣＰＵのモードをａに、条件が不成立ならＣＰＵのモードをｂに設定する。
・分岐が起こったときに実行される一連の命令Ａはプレディケート・フィールドの値をａに、分岐が起こらないときに実行される一連の命令Ｂはプレディケート・フィールドの値をｂに指定しておき、動作モード設定命令の後に配置する。プレディケート・フィールドがａの命令とｂの命令は混在して良い。
ここで、ａ、ｂは何らかの数値として実現される。このようにすると条件分岐命令がなくなるので、パイプライン・ハザードをなくすことができる。
【０００７】
プレディケート実行は、特にＶＬＩＷ構成のＣＰＵにおいてより大きな効果が期待できる。ＶＬＩＷはＣＰＵ内に複数の並行に動作する演算器を持つアーキテクチャである（参考文献２；Ｅｌｌｉｓ，Ｊ．Ｒ．，Ｂｕｌｌｄｏｇ：  Ａ  Ｃｏｍｐｉｌｅｒ  ｆｏｒ  ＶＬＩＷ  Ａｒｃｈｉｔｅｃｔｕｒｅｓ，Ｔｈｅ  ＭＩＴ  Ｐｒｅｓｓ．）。ＶＬＩＷにおいては同時に複数の命令を実行する能力を持つため、多くの演算器に命令を割り当てることができれば、プログラムを高速に実行できる。プレディケート実行では、先に述べたＡとＢの双方から命令を配置することができるため、演算器が命令で埋まり易い。従って、特にＶＬＩＷにおいてプレディケート実行は有望な高速化の手段である。
【０００８】
しかしどの程度の効果が上がるかは、ＡとＢを構成する命令をどのように演算器に割り当てるかに依存する。より高速性を発揮するための命令割り当て方法の確立が課題である。
【０００９】
【発明が解決しようとする課題】
以上述べたように、プレディケート実行においては条件分岐を行なわないためパイプライン・ハザードがおこらず、プログラムをより高速に実行する可能性がある。しかしながら、より高速性を発揮させることのできる命令割り当て方法がなかった。
【００１０】
本発明は、上記事情を考慮してなされたもので、プレディケート実行を行なうＣＰＵでプログラムを高速に実行するための命令割り当て方法及び命令割り当て装置を提供することを目的とする。
【００１１】
【課題を解決するための手段】
本発明（請求項１）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値とが一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、動作モードを設定する命令を割り当てるステップと、命令コードのフィールドの値が一致する一連の命令列の最後の命令同士の実行されるサイクルを比較するステップと、命令コードのフィールドの値が一致する一連の命令列の最後の命令の実行サイクルが他よりも早い場合に、該命令コードと同じフィールド値を持つ分岐命令を該命令と同じサイクルまたは後のサイクルで実行するように割り当てるステップとを有することを特徴とする。
【００１２】
好ましくは、動作モードのうち実行頻度の高い値を判別するステップをさらに有し、実行頻度が高いと判別された動作モードに対応する命令を早いサイクルに優先的に割当てるようにしてもよい。
【００１３】
本発明（請求項３）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、動作モードを設定する命令を割り当てるステップと、ある動作モードのときのみ実行される命令が動作モード設定命令よりも前で実行されるように割り当て可能かを判別するステップと、割り当て可能と判別された前記命令を動作モードに依らず実行される命令として割り当てるステップとを有することを特徴とする。
【００１４】
本発明（請求項４）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、動作モードを設定する命令を割り当てるステップと、命令コードのフィールドの値が一致する一連の命令列同士を比較するステップと、前記比較の結果、同等の命令がある場合には該命令を動作モードにかかわらず実行される命令に変換するステップとを有することを特徴とする。
【００１５】
本発明（請求項５）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て行方法であって、特定の動作モードでのみ実行される命令を生成するよりも、動作モードによらずに動作する命令を生成した方が実行速度が大きい場合には、動作モードによらずに動作する命令を生成することを特徴とする。
【００１６】
本発明（請求項６）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値が一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て方法であって、動作モードを設定する命令を割り当てるステップと、動作モードのうち実行頻度の高い値を判別するステップとを有し、実行頻度が高いと判別された動作モードに対応する命令は分岐なしに実行されるように割り当てるとともに、必要に応じて他の動作モードに対応する命令は、前記実行頻度が高いと判別された動作モードに対応する命令とは別のサイクルで実行されるように割り当てることを特徴とする。
【００１７】
好ましくは、動作モードに依存する実行をする必要がなくなっても、動作モードを戻す命令を割り当てないようにしてもよい。
【００１８】
好ましくは、前記ＣＰＵは、並行に実行できる演算器を複数持つものである。
【００１９】
本発明（請求項９）は、命令コードに動作モードを示すフィールドを持ち、該命令コードの該フィールドの値とＣＰＵが管理するレジスタの特定フィールドの値とが一定の関係にあるときのみ該命令を実行する機能を持つＣＰＵに対し、各サイクルで実行される命令の割り当てを行なう命令割り当て装置であって、動作モードを設定する命令を割り当てる手段と、命令コードのフィールドの値が一致する一連の命令列の最後の命令同士の実行されるサイクルを比較する手段と、命令コードのフィールドの値が一致する一連の命令列の最後の命令の実行サイクルが他よりも早い場合に、該命令コードと同じフィールド値を持つ分岐命令を該命令と同じサイクルまたは後のサイクルで実行するように割り当てる手段とを備えたことを特徴とする。
【００２０】
なお、装置に係る本発明は方法に係る発明としても成立し、方法に係る本発明は装置に係る発明としても成立する。
【００２１】
また、装置または方法に係る本発明は、コンピュータに当該発明に相当する手順を実行させるための（あるいはコンピュータを当該発明に相当する手段として機能させるための、あるいはコンピュータに当該発明に相当する機能を実現させるための）プログラムを記録したコンピュータ読取り可能な記録媒体としても成立する。
【００２２】
本発明によれば、プレディケート実行を行なうＣＰＵでプログラムを高速に実行させることができる。すなわち、高速実行可能なプログラムを生成することができる。
【００２３】
【発明の実施の形態】
以下、図面を参照しながら発明の実施の形態を説明する。
【００２４】
図１に、本発明の第１の実施形態に係るコンパイラの構成例を示す。
【００２５】
図１に示すように、本コンパイラ３０は、高級言語で記述されたソースプログラム（１０）を入力し、命令割り当てを行い、対象とするＣＰＵもしくは計算機で実行可能なオブジェクト・プログラム（２０）に変換する。
【００２６】
本コンパイラ３０は、字句解析部３１、構文解析部３２、フロー解析部３４、データ依存解析部３５、命令割り当て部３６、レジスタ割り当て部３７を有する。
【００２７】
本コンパイラ３０は、ソフトウェアで実現可能であり、この場合、上記の各ブロックは、ソフトウェアの各モジュールに相当する。
【００２８】
字句解析部３１は、入力されたソースプログラムを形成する文字列を解析し、語句に分割する。
【００２９】
構文解析部３２は、上記解析により得た語句を文法に照合して正しいか否かを判別し、誤りがあればこれを通知し実行を止める。正しければ、その解析結果を中間コード（３３）として生成する。生成された中間コードは、主記憶やディスク等の記憶装置に格納される。
【００３０】
中間コード（３３）は、通常はコンパイラ内部で管理され、外部からは見えない。
【００３１】
フロー解析部３４は、中間コードが生成されると、これをもとにプログラムの流れの解析を行なう。
【００３２】
データ依存解析部３５は、プログラムの流れの解析が行われると、さらに、中間コードを構成する各単位のデータ依存解析を行ない、どの順番に割当を行なわなければならないかの制約を明らかにする。
【００３３】
命令割り当て部３６は、詳しくは後述するが、動作モード設定命令を生成する動作モード設定命令生成部３６１と、実行される動作モード毎の命令列を作りその最後の命令のサイクルを比較する命令比較部３６２と、この比較結果をもとに分岐命令を生成する分岐命令生成部３６３から構成される。
【００３４】
レジスタ割り当て部３７は、仮に割り当てられていたレジスタを、対象となるＣＰＵの持つ真のレジスタに割り当て直す、レジスタ割り当てを行う。
【００３５】
図２に、割り当てを行なう命令のフォーマットの一例を示す。
【００３６】
図２に示されるように、この命令は、「ｏｐｃｏｄｅ」、「ｏｐｅｒａｎｄ１」、「ｏｐｅｒａｎｄ２」、「ｏｐｅｒａｎｄ３」、「プレディケート・フィールド」からなる。
【００３７】
ｏｐｃｏｄｅは、命令の種類を表すコードである。数ビットが割り当てられ、その値により命令の種類が定まる。
【００３８】
ｏｐｅｒａｎｄ１、ｏｐｅｒａｎｄ２、ｏｐｅｒａｎｄ３は、それぞれ第１のオペランド、第２のオペランド、第３のオペランドである。これらはレジスタの番号や即値を示す。オペランドは全てのｏｐｃｏｄｅに対して第１〜第３まであるとは限らず、ｏｐｃｏｄｅの値によりオペランドの個数が定まる。また、それぞれのオペランドがレジスタであるか即値であるかもｏｐｃｏｄｅの値により定まる。また、それぞれのオペランドの占めるビット数もｏｐｃｏｄｅの値により定まる。
【００３９】
プレディケート・フィールドは、該命令が実行されるべき動作モードを示すフィールドである。数ビットからなり、全てが０のときは動作モードに関わらず実行される。０でないビットがあるときは、そのフィールドの値とＣＰＵが管理する動作モードレジスタの値とが一致するときのみ該命令は実行される。
【００４０】
図３に、命令割り当ての対象とするＣＰＵの構成例を示す。このＣＰＵは、プレディケート実行を行なうものである。
【００４１】
図３中、２００はＣＰＵ、２０１は命令解析器、２０２は分岐器（Ｂｒａｎｃｈ）、２０３は第１の整数演算器（ＡＬＵ１）、２０４は第２の整数演算器（ＡＬＵ２）、２０５は第１のメモリアクセス器（ＭＥＭ１）、２０６は第２のメモリアクセス器（ＭＥＭ２）、２０７はレジスタ（群）、２０８は動作モードレジスタ、２０９はプログラムカウンタ（ＰＣ）、２１０は命令キャッシュ、２１１はデータキャッシュである。また、３００は主記憶である。
【００４２】
オブジェクト・プログラムは主記憶３００にロードされ、ＣＰＵ２００がこのオブジェクト・プログラムを実行する。
【００４３】
さて、このＣＰＵ２００は、ＶＬＩＷ構成である。すなわち、１つの分岐器２０２と２つの整数演算器２０３，２０４と２つのメモリアクセス器２０５，２０６を持ち、これらは同時に動作可能である。
【００４４】
ＣＰＵ２００は、プログラムカウンタ２０９が示す番地の命令をキャッシュ２１０からフェッチする。キャッシュ２１０になければ主記憶３００からキャッシュ２１０に転送される。キャッシュ２１０から命令解析器２０１に各サイクルで同時に４命令が発行される。つまり、５つの演算器（２０２〜２０６）を持つが同時に発行できる命令は４命令である。命令解析器２０１は、４命令の各々をデコードし、ｏｐｃｏｄｅを知ることにより各々をどの演算器（２０２〜２０６）で実行するかを決定する。命令のプレディケート・フィールドが０でない場合は、動作モードレジスタ２０８を読みこの値と一致した命令のみ実行する。
【００４５】
次に、図４〜図６を参照しながら、図３に例示したようなプレディケート実行をサポートするＣＰＵに対する命令割り当てを、プレディケート実行をサポートしないＣＰＵに対する命令割り当てとの比較を通じて説明する。
【００４６】
図４に、条件分岐を含む簡単なソースプログラムの例を示す。このプログラムは、Ｂ１で示される条件が成立しているか否かを調べ、条件が成立していればＢ２を、不成立ならＢ３を実行する、というものである。
【００４７】
図５に、従来の命令割り当て方法を適用して命令を生成した例を示す。まず、Ｂ１に対応する命令列が、次にＢ２に対応する命令列が、次にＢ３に対応する命令列が生成される。また、Ｂ１の最後で条件分岐命令が生成されるが、ソースプログラムでの条件と、生成した命令レベルでの条件とは判定が逆となる。条件が成立すればＬ２に飛びＢ３に対応する命令列が実行され、不成立なら分岐は起こらずＢ２に対応する命令列が実行される。なお、Ｂ２の最後に、Ｂ３をスキップするための無条件分岐命令が生成される。
【００４８】
図６に、本実施形態に係る命令割り当て方法を適用して命令を生成した例を示す。
【００４９】
まず、Ｂ１に対応する命令列が生成されるが、図５の例とは異なりＢ１の最後で条件分岐命令を生成せず、その代わりに動作モード設定命令を生成する。これは条件の判定結果に応じた動作モードを動作モードレジスタ（図３の２０８）に設定するための命令である。ソースプログラムのＢ１に対応する条件が成立するなら動作モードｂ２を、不成立なら動作モードｂ３を設定する。ｂ２、ｂ３はそれぞれ命令のプレディケート・フィールドに等しいビット数を持つ０でない値であり、ｂ２とｂ３の値は相異なる。
【００５０】
次に、Ｂ２、Ｂ３に対応する命令列を生成する。図５の例とは異なり、Ｂ２、Ｂ３に対応する命令は混在して構わない。Ｂ２に対応する命令はプレディケート・フィールドの欄にｂ２を、Ｂ３に対応する命令はプレディケート・フィールドの欄にｂ３を記載する。
【００５１】
前述したように、ＣＰＵでは、命令のプレディケート・フィールドが０でない場合は、動作モードレジスタを読みこの値と一致した命令のみ実行するので、条件が成立したら動作モードレジスタがｂ２に設定され、プレディケート・フィールドにｂ２を持つＢ２に対応する命令が実行され、一方、不成立なら動作モードレジスタがｂ３に設定され、プレディケート・フィールドにｂ３を持つＢ３に対応する命令が実行されることになる。
【００５２】
以下では、本実施形態についてさらに詳しく説明する。
【００５３】
図７に、より詳しいソースプログラムの例を示す。このプログラムは、条件ｉ＜ｊが成立すればｋに配列ａ［ｉ］の値を代入し、不成立ならｋに−１を代入する、というものである。なお、図４のＢ１が図７の（５−４）行目に、Ｂ２が（５−６）行目に、Ｂ３が（５−８）行目に相当する。
【００５４】
ソースプログラムが入力されると、字句解析部３１および構文解析部３２の働きにより、中間コードが生成される。
【００５５】
図８に、図７のソースプログラムをもとに本実施形態に係るコンパイラにおいて生成される中間コードの例を示す。
【００５６】
中間コードを形成する各々をノードと呼ぶ。図７のソースプログラムの行番号（５−ｘ）と中間コードのノード（６−ｙ）との対応は次のようになる（矢印の左側のものが矢印の右側のものに対応する）。
（５−１）  →  （６−２）
（５−２）  →  （６−３）  （６−４）  （６−５）
（５−４）  →  （６−７）  （６−８）  （６−９）  （６−１０）
（５−５）  →  （６−１１）
（５−６）  →  （６−１２）  （６−１３）  （６−１４）  （６−１５）  （６−１６）
（５−７）  →  （６−１７）
（５−８）  →  （６−１８）  （６−１９）
図８のノードのうち、図７の行番号と対応のとれないノードについて説明する。図８のノード（６−１）はブロック０（Ｂ０）が開始されることを示すノードである。ブロックは後続のフロー解析で使用される。（６−６）はブロック０（Ｂ０）が終了することを示すノードである。（６−２０）は図７の行番号（５−８）までが終了した後に続くブロックである。
【００５７】
次に、中間コードが生成されると、フロー解析部３４は中間コードを基にブロックの流れを解析する。
【００５８】
図９に、図８の中間コードに対するフロー解析部３４による解析結果例を示す。図９に示すように、この中間コードのフローは、Ｂ０から始まりＢ１が続き、Ｂ２とＢ３に分岐し、Ｂ４に併合されることがわかる。
【００５９】
続いて、データ依存解析部３５は、データの依存関係を解析して、中間コードのノード間の前後関係を明らかにする。このデータ依存解析では実際に命令生成に対応するノードのみが対象となる。
【００６０】
本実施形態では、命令割り当て部３６は同一ブロック内の命令は同一ブロック内に配置するとの方針で割り当てる。従って、データ依存関係部３５は各ブロック内でのみ依存関係の解析を行なう。
【００６１】
図１０に、図８の中間コードに対するデータ依存解析部３５による解析結果例を示す。解析結果におけるＡ→ＢはＡがＢよりも先に実行されなければならないことを示す。例えば、図１０の場合、（６−８）が（６−９）よりも先に実行されなければならないことが示される。
【００６２】
次に、命令割り当て部３６による命令割り当て処理の手順について説明する。
【００６３】
図１１に、本実施形態に係る命令割り当て処理のアルゴリズムの一例を示す。
【００６４】
また、図１２に、図８に例示した中間コードに対して図１１に示すアルゴリズムを適用して生成されたコードの例を示す。図１２の例では、横に並んだ４命令（例えば先頭行のｃｍｐと３つのｎｏｐ）が同時に命令キャッシュ２１０からフェッチされ命令解析器２０１により５つの演算器（２０２〜２０６）のいずれかに割り当てられる。その各々のサイクルを（１０−１）〜（１０−５）がそれぞれ表している。
【００６５】
さて、図１１の手順では、まず、未解析の中間ノードが残っている限り次の中間ノードを読み、読み込んだ中間ノードが条件分岐ノードであるかどうかを確かめる（ステップＳ９−１，Ｓ９−２）。
【００６６】
条件分岐でない部分については従来と同様の方法で命令生成をすればよい（ステップＳ９−３，Ｓ９−４）。例えば先に挙げた参考文献２で示される方法により命令を生成すれば良い。
【００６７】
読み込んだ中間ノードが条件分岐（図８では（６−９））である場合、動作モード設定命令を生成する（ステップＳ９−５）。
【００６８】
図１２では、（１０−２）の「ｓｅｔ  ｇｔ，１，２」がこの動作モード設定命令に相当する。ｓｅｔは、ｏｐｃｏｄｅを示すニーモニックで、動作モードレジスタに値を設定する命令である。ｇｔとは、ｇｒｅａｔｅｒ  ｔｈａｎの略である。本命令は、実行時点での条件として、ｇｒｅａｔｅｒ  ｔｈａｎが成立していれば動作モードレジスタに１を、不成立なら動作モードレジスタに２を設定する。
【００６９】
動作モードレジスタに１が設定された場合、その値が変更されない限りプレディケート・フィールドが１である命令か０である命令しか実行されない。一方、動作モードレジスタに２が設定された場合、その値が変更されない限りプレディケート・フィールドが２である命令か０である命令しか実行されない。なお、プレディケート・フィールドが０である命令は、動作モードレジスタの値によらず常に実行されるものとする。
【００７０】
次に、ステップＳ９−６にて、フロー解析の結果に基づき条件分岐により到達し得るブロックＢを求める。それらの集合をＢＩ＝｛Ｂｉ１，Ｂｉ２，…｝とする。
【００７１】
図９の例を参照すると、この場合、ＢＩ＝｛Ｂ２，Ｂ３｝と判明する。
【００７２】
次に、ステップＳ９−７にて、図１０に例示するようなデータ依存関係を保つように各サイクル毎の各演算器（図３では２０２〜２０６）への命令の割り当てを行なう。なお、ＢＩに属する各ブロック毎の実行頻度等のデータがあれば、これに基づき、頻度の多いブロックのノードに対する命令を早いサイクルに優先的に割り当てるようにすると好ましい。
【００７３】
ＢＩに含まれるブロックの全ての中間コードが無くなるまで順次割り当てを繰り返す。
【００７４】
図１２ではＢ３の命令を優先的に割り当てた例を示している。すなわち、最初のサイクルである（１０−３）で「ｌｄｉ（２） Ｒｔ３，−１」を割り当てている。このｌｄｉに続く（２）はプレディケート・フィールドの値が２であることを示している。
【００７５】
なお、ここでは、Ｂ２に含まれる命令はプレディケート・フィールドを１に、Ｂ３に含まれる命令はプレディケート・フィールドを２にして生成するものとしている。
【００７６】
次に、ステップＳ９−８にて、ＢＩに属する各ブロックの最後の命令が割り当てられたサイクルを求める。これらを比較し最終サイクルでないものを求める。
【００７７】
図１２の場合、各ブロックの最後の命令が割り当てられたサイクルは（１０−３）と（１０−５）であり、したがって最終サイクルでないもの（１０−３）となる。
【００７８】
次に、ステップＳ９−９にて、最終サイクルでないものについてはその動作モードで実行される無条件分岐命令を生成して割り当てる。これは、ＢＩの全て命令が動作を終了するまで空のサイクルを回すのでは高速化できないからである。
【００７９】
図１２では、プレディケート・フィールドが２である命令は（１０−３）で終了するが、１である命令は（１０−５）で終了する。動作モードが２のときに（１０−４）、（１０−５）を実行すると２サイクル無駄となる。このため（１０−３）でｂ（２）Ｌ３を実行する。これは動作モードが２のときだけ実行される無条件分岐命令である。これにより動作モードが２のときに１サイクル高速化される。
【００８０】
本実施形態では、同サイクルでは分岐命令は１つしか実行できないため、もし（１０−３）に分岐命令があればそれより後で分岐命令のないできるだけ早いサイクルを探す。見つかったサイクルがＢＩに属する最後の命令よりも前のサイクルであれば、そこに動作モード２で実行される無条件分岐命令を生成して割り当てればよい。
【００８１】
以上によって、図１２に例示したようなコードが生成される。なお、この時点では、仮のレジスタが割り当てられた状態になっている。
【００８２】
さて、命令割り当て部３６による命令割り当てが終わると、続いてレジスタ割り当て部３７によるレジスタ割り当てを行う。
【００８３】
図１３に、図１２に示すプログラムに対して、レジスタ割り当て部３７によるレジスタ割り当てを適用した結果得られるプログラムの例を示す。
【００８４】
図１２では仮のレジスタとして割り当てられていたＲｐ１，Ｒｐ２，Ｒｔ１，Ｒｔ２，Ｒｔ３が、図１３ではＣＰＵが所有する真のレジスタＲｉ，Ｒｊ，Ｒ１，Ｒ２，Ｒ３に割り当て直されている。
【００８５】
なお、このレジスタ割り当てにおいて、レジスタが不足する場合には、再度命令割り当て部３６に制御を戻し、命令の一部をレジスタを使用しないように変更して命令割り当てをし直し、そして再度レジスタ割り当てを行う。
【００８６】
以上のようにして、プレディケート実行をサポートするＣＰＵに対するオブジェクト・プログラムが生成される。
【００８７】
ここで、生成されたプログラムで実行に必要なサイクル数を計算すると次のようになる。通常、パイプライン制御を行なうＣＰＵでは無条件分岐や条件分岐で分岐が起こると１サイクル実行が遅延され、条件分岐で分岐が起こらないときは遅延されない。図１３に例示するプログラムについてみてみると、Ｂ２が実行される場合は、（１１−１）（１１−２）（１１−３）（１１−４）（１１−５）の各サイクルがそれぞれ１クロックで実行され、計５クロックで実行可能となる。一方、Ｂ３が実行される場合は、（１１−１）（１１−２）（１１−３）の各サイクルがそれぞれ１クロックで実行され、（１１−３）の分岐の遅延１クロックと併せて、計４クロックで実行可能となる。
【００８８】
次に、本発明の第２の実施形態について説明する。
【００８９】
本実施形態は、第１の実施形態の処理手順に後述する手順を追加したもので、この追加部分以外は第１の実施形態と同様である。以下では、第１の実施形態と相違する点を中心に、また、第１の実施形態との比較を交えながら、本実施形態について説明する。
【００９０】
本実施形態は、第１の実施形態において、ある動作モードのときのみ実行される命令が動作モード設定命令よりも前で実行されるように割り当て可能かを判別し、割り当て可能と判別されたときに該命令を動作モードに依らず実行される命令として割り当てるようにしたものである。
【００９１】
本実施形態では、この処理は、命令割り当て部３６またはレジスタ割り当て部３７にて実行される。
【００９２】
図１４に、図７に例示するソースプログラムに対して命令割り当てを行って得られたコード（図１２）をもとにレジスタ割り当て部３７が生成したプログラムの例を示す。第１の実施形態におけるレジスタ割り当て部３７が生成したプログラムを例示した図１３との差異は、図１４ではｌｄｉ，ｌｄｕｉの２命令がＬ１の後からＬ１の前に移動し、プレディケート・フィールドが０になっていることである。
【００９３】
すなわち、Ｒ１は一時レジスタであり、もしＢ２が実行されずＢ３が実行されるとしても先行実行して構わないため、ｌｄｉ，ｌｄｕｉの２命令をＬ１の前に移動する。また、先行実行される命令は動作モードが設定される前であるので、プレディケート・フィールドを０する。
【００９４】
これにより、Ｂ２が実行される場合は４クロックと、第１の実施形態に比較して１クロック高速化される。ただし、Ｂ３が実行される場合はクロック数に増減はない。
【００９５】
次に、本発明の第３の実施形態について説明する。
【００９６】
本実施形態は、第１の実施形態の処理手順に後述する手順を追加したもので、この追加部分以外は第１の実施形態と同様である。以下では、第１の実施形態と相違する点を中心に、また、第１の実施形態との比較を交えながら、本実施形態について説明する。
【００９７】
本実施形態は、第１の実施形態において、命令コードのフィールドの値が一致する一連の命令列同士を比較し、比較の結果、同等の命令がある場合に該命令を動作モードにかかわらず実行される命令に変換するようにしたものである。
【００９８】
本実施形態では、この処理は、命令割り当て部３６またはレジスタ割り当て部３７にて実行される。
【００９９】
図１５に、ソースプログラムの例を示す。図７のソースプログラムと比べて（５−８）と（１３−８）が異なる。すなわち、このプログラムは、条件ｉ＜ｊが成立すればｋに正数配列ａ［ｉ］の値を代入し、不成立なら正数配列ａ［ｊ］の値を代入する、というものである。
【０１００】
図１６に、第１の実施形態の処理手順を適用し、Ｂ３優先による命令割り当てとレジスタ割り当てを行なって得られたオブジェクト・プログラムの例を示す。Ｂ２が実行される場合、（１４−１）から（１４−７）まで７クロックかかり、Ｂ３が実行される場合、（１４−１）から（１４−５）までと分岐の遅延１クロックで６クロックかかる。
【０１０１】
図１７に、本実施形態に係る処理手順を適用し、Ｂ３優先による命令割り当てとレジスタ割り当てを行なって得られたオブジェクト・プログラムの例を示す。本例では、ｌｄｉ，ｌｄｕｉ，ｌｄの３つの命令はいずれもＢ２とＢ３において共通する命令であるので、このような命令を動作モード０で実行する命令とすることにより共通化して命令数を減らす。これにより、Ｂ２とＢ３のいずれが実行される場合でも、（１５−１）から（１５−５）まで５クロックで実行が完了する。
【０１０２】
次に、本発明の第４の実施形態について説明する。
【０１０３】
本実施形態は、第１の実施形態の処理手順に後述する手順を追加したもので、この追加部分以外は第１の実施形態と同様である。以下では、第１の実施形態と相違する点を中心に、また、第１の実施形態との比較を交えながら、本実施形態について説明する。
【０１０４】
本実施形態は、第１の実施形態において、特定の動作モードでのみ実行される命令を生成するよりも、動作モードによらずに動作する命令を生成した方が実行速度が大きい場合には、動作モードによらずに動作する命令を生成するようにしたものである。
【０１０５】
本実施形態では、この処理は、命令割り当て部３６にて実行される。
【０１０６】
図１８に、ソースプログラムの例を示す。図７と比べて（５−８）と（１６−８）が異なる。すなわち、このプログラムは、条件ｉ＜ｊが成立すればｋに配列ａ［ｉ］の値を代入し、不成立なら配列ｂ［ｊ］の値を代入する、というものである。
【０１０７】
図１９に、第１の実施形態の処理手順を適用し、Ｂ３優先による命令割り当てとレジスタ割り当てを行なって得られたオブジェクト・プログラムの例を示す。Ｂ２が実行される場合、（１７−１）から（１７−７）まで７クロックかかり、Ｂ３が実行される場合、（１７−１）から（１７−５）までと分岐の遅延１クロックで６クロックかかる。
【０１０８】
図２０に、プレディケート実行を行なわない命令割り当てとレジスタ割り当てを行なって得られたオブジェクト・プログラムの例を示す。Ｂ２が実行される場合、（１８−１）から（１８−５）までと（１８−５）の分岐の遅延で６クロックかかり、Ｂ３が実行される場合、（１８−１）、（１８−２）と（１８−６）から（１８−８）までと（１８−２）の分岐の遅延１クロックで計６クロックかかる。つまり、第１の実施形態の処理手順を適用するとＢ３では同じクロック数がかかり、Ｂ２では１クロック余計にかかる。
【０１０９】
このように、演算器数や共に実行できる命令数の制限等により、プレディケート実行を行なわない方が高速になることがある。そこで、命令割り当ての際に、プレディケート実行を行なわない方が高速になると判断されたならば、プレディケート実行しないようにすると好ましい。
【０１１０】
次に、本発明の第５の実施形態について説明する。
【０１１１】
本実施形態は、第１の実施形態の命令割り当て処理を一部修正したもので、この修正部分以外は第１の実施形態と同様である。以下では、第１の実施形態と相違する点を中心に、また、第１の実施形態との比較を交えながら、本実施形態について説明する。
【０１１２】
本実施形態は、概略的には、第１の実施形態において、動作モードのうち実行頻度の高い値を判別し、実行頻度が高いと判別された動作モードに対応する命令は分岐なしに実行されるように割り当て、必要なら他の動作モードに対応する命令は上記の命令とは別のサイクルで実行されるように割り当てるようにしたものである。
【０１１３】
以下、本実施形態において、命令割り当て部３６による実行される命令割り当て処理の手順について説明する。
【０１１４】
図２１に、本実施形態に係る命令割り当て処理のアルゴリズムの一例を示す。
【０１１５】
なお、ここでは、図７に例示するソースプログラムが入力として与えられ、Ｂ３＝｛（５−７），（５−８）｝のブロックがＢ２＝｛（５−５），（５−６）｝のブロックよりも実行頻度が高いものとする。
【０１１６】
図２１のステップＳ１９−１〜ステップＳ１９−６までの手順は、図１１のステップＳ９−１〜ステップＳ９−６までの手順と同様である。
【０１１７】
すなわち、ステップＳ９−１〜Ｓ９−６までの実行により、読み込んだ中間ノードが条件分岐である場合に動作モード設定命令が生成し、そしてフロー解析の結果に基づき条件分岐により到達し得るブロックの集合としてＢＩが求められる。
【０１１８】
本例の場合、ＢＩ＝｛Ｂ２，Ｂ３｝が得られる。
【０１１９】
次に、本実施形態では、ステップＳ１９−７にて、ＢＩに属する各ブロックのうち、実行頻度の最も多いブロックＢｊ  を選択し、このＢｊ  の命令を割り当てる。
【０１２０】
本例の場合、ＢＩに属するブロック毎の実行頻度を基に頻度の多いブロックＢ３が選択され、Ｂ３の命令がプレディケート・フィールドを２にして割り当てられる。
【０１２１】
次に、本実施形態では、ステップＳ１９−８にて、Ｂｊ  の命令を割り当てたのと同じサイクルで、プレディケート実行をする分岐命令を割り当てるとともに、分岐した先でＢｊ  以外のブロックの命令を割り当て、終了したら、Ｂｊ  の命令が終了した後のブロックへと分岐する。
【０１２２】
すなわち、第１の実施形態とは異なり、最後に分岐命令を割り当てずに終了することとし、Ｂ３の命令を割り当てたのと同じサイクルでプレディケート・フィールドが１である無条件分岐命令を割り当てる。分岐先でＢ２の命令を割り当て、最後にＢ３の命令の後のブロックへと分岐する。
【０１２３】
これにより、頻度の高いブロックが実行されるときは全く分岐が起こらず高速に実行可能となる。頻度の小さいブロックが実行される場合は、分岐で飛び出し、最後に分岐で合流する。
【０１２４】
図２２に、図７に例示するソースプログラムに対し図２１のアルゴリズムを適用したときにレジスタ割り当て部３７が生成するプログラムの例を示す。
【０１２５】
本例では、Ｂ３の方が実行頻度が大きいため、（２０−１）（２０−２）に引き続いて（２０−３）ではＢ３の命令が割り当てられる。
【０１２６】
「ｌｄｉ（２）  Ｒｋ，−１」が該当命令である。この後分岐命令なしに後のブロックＬ３へと続く。一方、Ｂ２が実行される場合には、（２０−３）の「ｂ（１）  Ｌ４」によってＬ４に無条件分岐する。ここでＢ２が実行された後、Ｌ３に飛ぶ。
【０１２７】
Ｂ２が実行される場合、（２０−１）から（２０−３）で３クロックかかる。一方、Ｂ３が実行される場合、（２０−１）から（２０−３）と、（２０−４）から（２０−６）と、（２０−３）の分岐の遅延と、（２０−６）の分岐の遅延で、計８クロックかかる。つまり、実行頻度の大きいブロックが判別可能なときに本実施形態の命令割り当てを適用すると極めて高速に実行することができる。
【０１２８】
なお、以上の各実施形態では、高級言語で記述されたプログラムを計算機で実行するオブジェクトコードに変換するソフトウェアであるコンパイラの中で命令割り当てをする場合を想定して記述したが、本発明はターゲットＣＰＵのアーキテクチャを意識しながらアセンプリ言語などを用いて直接プログラミングする場合にも適用することができる。
【０１２９】
また、以上の各実施形態では、ＢＩに相当する命令を終了した後で動作モードレジスタを初期値０に戻す命令を生成していない。これはＢＩに相当する命令を終了した後は、動作モードに依らない命令（プレディケート・フィールドの値が０の命令）を生成するため、動作モードを初期値に戻さなくても全ての命令が実行されるからである。再びプレディケート実行する場合は、その直前で動作モード設定命令を実行すれば良い。動作モードを初期値に戻すためには１命令実行が必要であり、実行しないほうが同等かあるいは１サイクル高速化が可能である。
【０１３０】
なお、以上の各機能は、ソフトウェアとしても実現可能である。すなわち、本実施形態は、コンピュータに所定の手順を実行させるための（あるいはコンピュータを所定の手段として機能させるための、あるいはコンピュータに所定の機能を実現させるための）プログラムを記録したコンピュータ読取り可能な記録媒体として実施することもできる。
【０１３１】
本発明は、上述した実施の形態に限定されるものではなく、その技術的範囲において種々変形して実施することができる。
【０１３２】
【発明の効果】
本発明によれば、プレディケート実行を行なうＣＰＵでプログラムを高速に実行することができる。
【図面の簡単な説明】
【図１】本発明の一実施形態に係るコンパイラの構成例を示す図
【図２】命令フォーマットの一例を示す図
【図３】ＣＰＵの一構成例を示す図
【図４】ソースプログラムの例を示す図
【図５】プレディケート実行をサポートしないＣＰＵに対する命令割り当ての一例を示す図
【図６】プレディケート実行をサポートするＣＰＵに対する命令割り当ての一例を示す図
【図７】ソースプログラムの例を示す図
【図８】中間コードの一例を示す図
【図９】フロー解析部による解析結果の例を示す図
【図１０】データ依存解析部による解析結果の例を示す図
【図１１】命令割り当て手順の一例を示すフローチャート
【図１２】命令割り当て部により生成されるプログラムの例を示す図
【図１３】レジスタ割り当て部により生成されるプログラムの例を示す図
【図１４】レジスタ割り当て部により生成されるプログラムの例を示す図
【図１５】ソースプログラムの例を示す図
【図１６】レジスタ割り当て部により生成されるプログラムの例を示す図
【図１７】レジスタ割り当て部により生成されプログラムの例を示す図
【図１８】ソースプログラムの例を示す図
【図１９】レジスタ割り当て部により生成されるプログラムの例を示す図
【図２０】レジスタ割り当て部により生成されるプログラムの例を示す図
【図２１】命令割り当て手順の他の例を示すフローチャート
【図２２】レジスタ割り当て部により生成されるプログラムの一例を示す図
【符号の説明】
１０…ソースプログラム
２０…オブジェクトプログラム
３０…コンパイラ
３１…字句解析部
３２…構文解析部
３４…フロー解析部
３５…データ依存解析部
３６…命令割り当て部
３６１…動作モード設定命令生成部
３６２…命令比較部
３６３…分岐命令生成部
３７…レジスタ割り当て部
２００…ＣＰＵ
２０１…命令解析器
２０２…分岐器
２０３，２０４…整数演算器
２０５，２０６…メモリアクセス器
２０７…レジスタ
２０８…動作モードレジスタ
２０９…プログラムカウンタ
２１０…命令キャッシュ
２１１…データキャッシュ
３００…主記憶
【図１】
0003595158.tif 000002
【図２】
0003595158.tif 000003
【図３】
0003595158.tif 000004
【図４】
0003595158.tif 000005
【図５】
0003595158.tif 000006
【図６】
0003595158.tif 000007
【図７】
0003595158.tif 000008
【図８】
0003595158.tif 000009
【図９】
0003595158.tif 000010
【図１０】
0003595158.tif 000011
【図１１】
0003595158.tif 000012
【図１２】
0003595158.tif 000013
【図１３】
0003595158.tif 000014
【図１４】
0003595158.tif 000015
【図１５】
0003595158.tif 000016
【図１６】
0003595158.tif 000017
【図１７】
0003595158.tif 000018
【図１８】
0003595158.tif 000019
【図１９】
0003595158.tif 000020
【図２０】
0003595158.tif 000021
【図２１】
0003595158.tif 000022
【図２２】
0003595158.tif 000023