(57)【特許請求の範囲】
【請求項１】
複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、
前記複数の命令を解読する解読手段と、
前記命令内の並列実行の可否を示す並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、
夫々の命令中に指定されたオペレーションを並列して実行する複数の演算部を含む実行手段とを備え、
前記命令内に条件によりそのうちの１つが選択される前記並列実行情報を複数個備えることを特徴とするプロセッサ。
【請求項２】
前記命令内の前記並列実行情報は、前記命令と該命令に後続する命令とが並列に実行できるか否かを示す情報であることを特徴とする請求項１記載のプロセッサ。
【請求項３】
複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、
前記複数の命令を解読する解読手段と、
前記命令内の並列実行の可否を示す並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、
前記複数の命令中に各命令の動作が指定され、前記指定に基づいて複数のオペレーションを実行する実行手段とを備え、
前記命令内の並列実行情報は、
その命令が属する基本ブロックの命令が先行基本ブロックの命令から命令順に実行される場合に適用され、当該命令とその命令に後続する命令が並列に実行できるかどうかを示す第１の並列実行境界情報と、
当該命令が属する基本ブロックに分岐があった場合以降に適用され、当該分岐があった命令とその命令に後続する命令が並列に実行できるかどうかを示す第２の並列実行境界情報とを含むものであり、
前記命令発行制御手段は、
前記命令の実行の流れが変化したこともしくは変化しなかったことを検出する実行フロー検出手段と、
前記実行フロー検出手段の検出結果を参照して、前記命令内の複数種類の並列実行の可否を示す並列実行情報のうち、いずれの並列実行情報を有効とするかを選択する並列実行情報選択手段と、を備えることを特徴とするプロセッサ。
【請求項４】
前記命令内に該命令が分岐命令の飛び先対象となっているか否かを示す分岐ラベル情報を備え、
前記実行フロー検出手段は、前記命令内の前記分岐ラベル情報と、前記実行手段からの前サイクルで分岐が成立したか否かの情報とを基にして実行の流れの変化の検出を行うことを特徴とする請求項３記載のプロセッサ。
【請求項５】
前記実行フロー検出手段は、
前記実行手段からの前サイクルで分岐したか否かの情報を基にして実行の流れの変化の検出を行い、
前記並列実行情報選択手段は、
現在の実行フローの状態を記憶する実行フロー記憶手段を備え、前記実行フロー検出手段からの情報に応じて実行フロー記憶手段の内容を更新することを特徴とする請求項３記載のプロセッサ。
【請求項６】
前記実行フロー検出手段は、前記実行手段からの前サイクルの分岐命令の分岐先アドレスに関する情報と、現在の命令のアドレスとを比較することにより実行の流れの変化の検出を行うことを特徴とする請求項３記載のプロセッサ。
【請求項７】
複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、
前記複数の命令を解読する解読手段と、
前記各命令内の並列実行の可否を示す複数の並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、
前記複数の命令中に各命令の動作が指定され、前記指定に基づいて複数のオペレーションを実行する実行手段とを備え、
夫々の命令中に指定されたオペレーションを並列して実行する複数の演算部を含む実行手段とを備え、
前記命令内の並列実行情報は、
並列実行数に応じて夫々あらかじめ設定され、当該命令とその命令に後続する命令が並列に実行できるかどうかを示す並列実行境界情報であり、
前記命令発行制御手段は、
前記実行手段が備える演算器の種類や個数によって分類される複数の実行モードのうち、現在動作しているモードを記憶する実行モード記憶手段と、
前記実行モード記憶手段の内容を参照して、前記命令内の複数種類の並列実行の可否を示す並列実行情報のうち、いずれの並列実行情報を有効とするかを選択する並列実行情報選択手段と、を備えることを特徴とするプロセッサ。
【請求項８】
前記複数の実行モードのうちのあるモードでは、
前記命令発行制御手段は、
前記命令読み出し手段によって読み出された複数の命令のうち、演算資源の制約によりどれだけの命令を同時実行できるかを検出する演算資源制約検出部を備え、
前記並列実行情報選択手段の出力と前記演算資源制約検出部の出力とに基づいて命令の発行を制御することを特徴とする請求項７記載のプロセッサ。
【請求項９】
前記演算資源制約検出部は、
前記命令読み出し手段によって読み出された複数の命令に対して、順にそれまでに発行可能とした命令の集合に加えて該命令を発行可能であるか否かを判定していくことを特徴とする請求項８記載のプロセッサ。
【請求項１０】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置ステップと、
前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該基本ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化ステップと、
前記命令再配置ステップと前記命令再集合化ステップの結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするコンパイル方法。
【請求項１１】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加ステップを備えることを特徴とする請求項１０記載のコンパイル方法。
【請求項１２】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置ステップと、
前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするコンパイル方法。
【請求項１３】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置ステップと、
プログラムが実行されるハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするコンパイル方法。
【請求項１４】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置ステップと、
各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするコンパイル方法。
【請求項１５】
前記命令再配置ステップは、
並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とする請求項１２〜１４のいずれか１項記載のコンパイル方法。
【請求項１６】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置ステップを備え、
前記命令再配置ステップは、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするコンパイル方法。
【請求項１７】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、
前記命令スケジューリング手段は、
並列実行可能な命令の集合をグループとして区分する命令集合化手段とを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置手段と、
前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化手段と、
前記命令再配置手段と前記命令再集合化手段の結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするコンパイラ。
【請求項１８】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加手段を備えることを特徴とする請求項１７記載のコンパイラ。
【請求項１９】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコード中の命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、
前記命令スケジューリング手段は、
並列実行可能な命令の集合をグループとして区分する命令集合化手段とを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置手段と、
前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、
前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするコンパイラ。
【請求項２０】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、
前記命令スケジューリング手段は、
命令の集合をグループとして区分する命令集合化手段を含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置手段と、
プログラムが実行されるハードウェアの制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、
前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするコンパイラ。
【請求項２１】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、
前記命令スケジューリング手段は、
並列実行可能な命令の集合をグループとして区分する命令集合化手段を含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置手段と、
各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、
前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするコンパイラ。
【請求項２２】
前記命令再配置手段は、
並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化手段を備えることを特徴とする請求項１８〜２１のいずれか１項記載のコンパイラ。
【請求項２３】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、
前記命令スケジューリング手段は、
命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置手段を備え、
前記命令再配置手段は、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化手段を備えることを特徴とするコンパイラ。
【請求項２４】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置ステップと、
前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該基本ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化ステップと、
前記命令再配置ステップと前記命令再集合化ステップの結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするプログラムを記録した記録媒体。
【請求項２５】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加ステップを備えることを特徴とする請求項２４記載のプログラムを記録した記録媒体。
【請求項２６】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置ステップと、
前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするプログラムを記録した記録媒体。
【請求項２７】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置ステップと、
プログラムが実行されるハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするプログラムを記録した記録媒体。
【請求項２８】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置ステップと、
各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、
前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするプログラムを記録した記録媒体。
【請求項２９】
前記命令再配置ステップは、
並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とする請求項２６〜２８のいずれか１項記載の記録媒体。
【請求項３０】
高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、
前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、
前記命令スケジューリングステップは、
命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置ステップを備え、
前記命令再配置ステップは、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするプログラムを記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プロセッサ、コンパイラ、コンパイル方法及び記録媒体に関し、特に並列処理において性能の向上と拡張性及び互換性の確保を図る技術に関する。
【０００２】
【従来の技術】
近年のマイクロプロセッサ応用製品の高機能化及び高速化に伴い、高い処理性能を持つマイクロプロセッサ（以下、単に「プロセッサ」という。）が望まれている。一般に、各命令のスループットを高めるために、１つの命令をいくつかの処理単位（ここでは「ステージ」と呼ぶ）に分割し、各ステージを別々のハードウェアで実行することにより、複数の命令を並行して処理できるようにするパイプライン方式が採用されている。しかし、さらなる性能向上のためには、命令レベルでの並列処理を行うことが必須である。つまり、１サイクルに複数の命令を同時に実行することが必要となる。
【０００３】
命令レベルの並列処理を実現する方法として、動的なスケジューリングによるものと静的なスケジューリングによるものがある。動的なスケジューリングによるものの代表例としてスーパースカラ方式がある。この方式では、実行時に命令コードを解読後、ハードウェアの命令発行制御部にて動的に命令間の依存関係を解析して並列実行可能か否かを判定し、適切な組み合わせの命令を並列実行する。
【０００４】
静的なスケジューリングによるものの代表例としてＶＬＩＷ（Ｖｅｒｙ  Ｌｏｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｏｒｄ）方式がある。この方式は、実行コード生成時にコンパイラ等により静的に命令間の依存関係を解析し、命令コードの移動を行って実行効率の良い命令ストリームを生成する。一般のＶＬＩＷ方式では、同時実行可能な複数の命令を一つの固定長の命令供給単位（ここでは「パケット」と呼ぶ）に記述する。この方式を採ると、ハードウェアで命令間の依存解析を行う必要がないため、ハードウェアを単純化できるというメリットがある。
【０００５】
しかしながら、単純なＶＬＩＷ方式では、毎サイクル固定長のパケットを発行するため、並列実行可能なオペレーションが存在しない場合には、演算を行わないことを明示する無動作命令（ｎｏｐ命令）を配置する必要がある。この無動作命令により、コードサイズが非常に増大するという問題点がある。
【０００６】
そこで、この問題を解決する従来技術として、特許公報第２７９７８３３号にて開示されているように、各命令に並列実行の境界であるか否かの情報を持たせ、各サイクルで並列実行の境界までの命令を実行する、という方法がある。つまり、静的に並列実行イメージを求め、その情報を命令に付与しておき、実行時に命令内の情報を参照して適切な命令数だけ可変個数実行することになる。これにより、無動作命令の挿入が不要となり、コードサイズが増大するという問題点を解決している。
【０００７】
【発明が解決しようとする課題】
前述のスーパースカラ方式では、動的にハードウェアで命令間の依存関係を解析する必要があるため、ハードウェア量が増大するという問題点がある。又、ハードウェアが複雑になるため遅延が増大し、動作周波数を上げにくいという問題点もある。更に、同時実行可能な命令数が増えるにつれて、依存関係を解析すべき命令の組み合わせが急激に増加するため、上記の問題点は急激に悪化することになる。
【０００８】
そこで、さらなる並列化を目指す場合、ＶＬＩＷ方式などの静的スケジューリングを行う方式が主流となってくる。しかしながら、通常の固定長命令のＶＬＩＷ方式では、無動作命令（ｎｏｐ命令）の挿入によりコードサイズが非常に大きくなるという問題点がある。この問題も、並列度が増すにつれて更に悪化する。これは、並列度が大きくなればなるほどｎｏｐ命令を挿入せざるを得ない状況が増えてくるからである。
【０００９】
ＶＬＩＷ方式のコードサイズ増加の問題を解決する手段として、前述のように各命令に並列実行の境界であるか否かを示す情報を持たせる、という方法がある。この方法を採ることによって無動作命令によるコードサイズ増加の問題点は解決される。
【００１０】
しかしながら、上記方式では、静的に並列実行される命令の組み合わせが決定されるため、実行フローにかかわらず、並列実行の境界が固定されてしまい、動的なスケジューリングを行う方式に比べて性能面で劣るという問題点がある。
【００１１】
又、静的に並列実行の境界が決定しているため、並列度向上等のハードウェアの拡張があった場合、そのままの実行コードでは性能を向上させにくいという問題点がある。
【００１２】
そこで、本発明はかかる問題点に鑑みてなされたものであり、命令レベルの並列実行に際して、ハードウェアの簡単化を達成しつつ、性能の劣化を抑え、又拡張性や互換性を確保するようなプロセッサを提供することを目的とする。
【００１３】
【課題を解決するための手段】
本願の請求項１の発明は、複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、前記複数の命令を解読する解読手段と、前記命令内の並列実行の可否を示す並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、夫々の命令中に指定されたオペレーションを並列して実行する複数の演算部を含む実行手段とを備え、前記命令内に条件によりそのうちの１つが選択される前記並列実行情報を複数個備えることを特徴とするものである。
【００１４】
本願の請求項２の発明は、請求項１のプロセッサにおいて、前記命令内の前記並列実行情報は、前記命令と該命令に後続する命令とが並列に実行できるか否かを示す情報であることを特徴とするものである。
【００１５】
本願の請求項３の発明は、複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、前記複数の命令を解読する解読手段と、前記命令内の並列実行の可否を示す並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、前記複数の命令中に各命令の動作が指定され、前記指定に基づいて複数のオペレーションを実行する実行手段とを備え、前記命令内の並列実行情報は、その命令が属する基本ブロックの命令が先行基本ブロックの命令から命令順に実行される場合に適用され、当該命令とその命令に後続する命令が並列に実行できるかどうかを示す第１の並列実行境界情報と、当該命令が属する基本ブロックに分岐があった場合以降に適用され、当該分岐があった命令とその命令に後続する命令が並列に実行できるかどうかを示す第２の並列実行境界情報とを含むものであり、前記命令発行制御手段は、前記命令の実行の流れが変化したこともしくは変化しなかったことを検出する実行フロー検出手段と、前記実行フロー検出手段の検出結果を参照して、前記命令内の複数種類の並列実行の可否を示す並列実行情報のうち、いずれの並列実行情報を有効とするかを選択する並列実行情報選択手段と、を備えることを特徴とするものである。
【００１６】
本願の請求項４の発明は、請求項３のプロセッサにおいて、前記命令内に該命令が分岐命令の飛び先対象となっているか否かを示す分岐ラベル情報を備え、前記実行フロー検出手段は、前記命令内の前記分岐ラベル情報と、前記実行手段からの前サイクルで分岐が成立したか否かの情報とを基にして実行の流れの変化の検出を行うことを特徴とするものである。
【００１７】
本願の請求項５の発明は、請求項３のプロセッサにおいて、前記実行フロー検出手段は、前記実行手段からの前サイクルで分岐したか否かの情報を基にして実行の流れの変化の検出を行い、前記並列実行情報選択手段は、現在の実行フローの状態を記憶する実行フロー記憶手段を備え、前記実行フロー検出手段からの情報に応じて実行フロー記憶手段の内容を更新することを特徴とするものである。
【００１８】
本願の請求項６の発明は、請求項３のプロセッサにおいて、前記実行フロー検出手段は、前記実行手段からの前サイクルの分岐命令の分岐先アドレスに関する情報と、現在の命令のアドレスとを比較することにより実行の流れの変化の検出を行うことを特徴とするものである。
【００１９】
本願の請求項７の発明は、複数の命令からなる複合命令を記憶装置から読み出す命令読み出し手段と、前記複数の命令を解読する解読手段と、前記各命令内の並列実行の可否を示す複数の並列実行情報を参照して、同時実行する命令の集合を決定する命令発行制御手段と、前記複数の命令中に各命令の動作が指定され、前記指定に基づいて複数のオペレーションを実行する実行手段とを備え、夫々の命令中に指定されたオペレーションを並列して実行する複数の演算部を含む実行手段とを備え、前記命令内の並列実行情報は、並列実行数に応じて夫々あらかじめ設定され、当該命令とその命令に後続する命令が並列に実行できるかどうかを示す並列実行境界情報であり、前記命令発行制御手段は、前記実行手段が備える演算器の種類や個数によって分類される複数の実行モードのうち、現在動作しているモードを記憶する実行モード記憶手段と、前記実行モード記憶手段の内容を参照して、前記命令内の複数種類の並列実行の可否を示す並列実行情報のうち、いずれの並列実行情報を有効とするかを選択する並列実行情報選択手段と、を備えることを特徴とするものである。
【００２０】
本願の請求項８の発明は、請求項７のプロセッサにおいて、前記複数の実行モードのうちのあるモードでは、前記命令発行制御手段は、前記命令読み出し手段によって読み出された複数の命令のうち、演算資源の制約によりどれだけの命令を同時実行できるかを検出する演算資源制約検出部を備え、前記並列実行情報選択手段の出力と前記演算資源制約検出部の出力とに基づいて命令の発行を制御することを特徴とするものである。
【００２１】
本願の請求項９の発明は、請求項８のプロセッサにおいて、前記演算資源制約検出部は、前記命令読み出し手段によって読み出された複数の命令に対して、順にそれまでに発行可能とした命令の集合に加えて該命令を発行可能であるか否かを判定していくことを特徴とするものである。
【００２２】
本願の請求項１０の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置ステップと、前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該基本ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化ステップと、前記命令再配置ステップと前記命令再集合化ステップの結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００２３】
本願の請求項１１の発明は、請求項１０のコンパイル方法において、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加ステップを備えることを特徴とするものである。
【００２４】
本願の請求項１２の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置ステップと、前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００２５】
本願の請求項１３の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置ステップと、プログラムが実行されるハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００２６】
本願の請求項１４の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置ステップと、各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００２７】
本願の請求項１５の発明は、請求項１２〜１４のいずれか１項のコンパイル方法において、前記命令再配置ステップは、並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするものである。
【００２８】
本願の請求項１６の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイル方法であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置ステップを備え、前記命令再配置ステップは、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするものである。
【００２９】
本願の請求項１７の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、前記命令スケジューリング手段は、並列実行可能な命令の集合をグループとして区分する命令集合化手段とを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置手段と、前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化手段と、前記命令再配置手段と前記命令再集合化手段の結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするものである。
【００３０】
本願の請求項１８の発明は、請求項１７のコンパイラにおいて、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加手段を備えることを特徴とするものである。
【００３１】
本願の請求項１９の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコード中の命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、前記命令スケジューリング手段は、並列実行可能な命令の集合をグループとして区分する命令集合化手段とを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置手段と、前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするものである。
【００３２】
本願の請求項２０の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、前記命令スケジューリング手段は、命令の集合をグループとして区分する命令集合化手段を含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置手段と、プログラムが実行されるハードウェアの制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするものである。
【００３３】
本願の請求項２１の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、前記命令スケジューリング手段は、並列実行可能な命令の集合をグループとして区分する命令集合化手段を含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置手段と、各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化手段と、前記命令集合化手段と前記少なくとも１つの命令再集合化手段の結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加手段と、を備えることを特徴とするものである。
【００３４】
本願の請求項２２の発明は、請求項１８〜２１のいずれか１項のコンパイラにおいて、前記命令再配置手段は、並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化手段を備えることを特徴とするものである。
【００３５】
本願の請求項２３の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するコンパイラであって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリング手段を備え、前記命令スケジューリング手段は、命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置手段を備え、前記命令再配置手段は、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化手段を備えることを特徴とするものである。
【００３６】
本願の請求項２４の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、基本ブロックの分岐先対象となっている命令以降の命令群を処理対象として、並列実行すべき複数の命令が隣接するように命令の並べ替えを行う命令再配置ステップと、前記基本ブロックの先頭の命令に先行する他の基本ブロックの最終グループの命令を含む当該基本ブロックの命令群を処理対象として、並列実行可能な命令の集合を再びグループとして区分する命令再集合化ステップと、前記命令再配置ステップと前記命令再集合化ステップの結果に基づき、命令内にそれぞれの前記スケジューリングに対応した並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００３７】
本願の請求項２５の発明は、請求項２４のプログラムを記録した記録媒体において、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令のうち、前記プログラム内で分岐先の対象となっていることを示す命令について、該命令にそのことを明示する情報を付加する分岐ラベル情報付加ステップを備えることを特徴とするものである。
【００３８】
本願の請求項２６の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、第１のハードウェア制約に基づいて命令の並べ替えを行う命令再配置ステップと、前記第１のハードウェア制約と異なる少なくとも１つのハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするプログラムを記録したものである。
【００３９】
本願の請求項２７の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、各命令間の依存関係にのみ基づいて命令の並べ替えを行う命令再配置ステップと、プログラムが実行されるハードウェア制約に基づいて、夫々並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００４０】
本願の請求項２８の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、並列実行可能な命令の集合をグループとして区分する命令集合化ステップを含み、プログラムが実行されるハードウェアの制約に基づいて命令の並べ替えを行う命令再配置ステップと、各命令間の依存関係にのみ基づいて並列実行可能な命令の集合を再びグループとして区分する少なくとも１つの命令再集合化ステップと、前記命令集合化ステップと前記少なくとも１つの命令再集合化ステップの結果に基づき、命令内に複数の並列実行の可否を示す並列実行情報を付加する並列実行情報付加ステップと、を備えることを特徴とするものである。
【００４１】
本願の請求項２９の発明は、請求項２６〜２８のいずれか１項の記録媒体において、前記命令再配置ステップは、並列実行可能な各命令集合に含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするものである。
【００４２】
本願の請求項３０の発明は、高級言語で記述されたプログラムのソースコードを実行形式コードに変換するプログラムを記録した記録媒体であって、前記ソースコードから生成された命令を、並列実行すべき複数の命令が隣接するように並べ直す命令スケジューリングステップを備え、前記命令スケジューリングステップは、命令を並べ替え、並列実行可能な命令の集合をグループとして区分する命令再配置ステップを備え、前記命令再配置ステップは、並列実行可能な各命令グループに含まれる命令の数もしくはサイズが均一になるように再配置する命令均一化ステップを備えることを特徴とするものである。
【００４５】
【発明の実施の形態】
以下、本発明に係るプロセッサ、コンパイラ、コンパイル方法及び記録媒体の実施の形態について、図面を用いて詳細に説明する。
［実施の形態１］
（命令フォーマットとアーキテクチャの概要）
まず、本発明に係るプロセッサが解読実行する命令の構造について説明する。図１（ａ）〜（ｃ）は本プロセッサの命令フォーマットを示す図である。本プロセッサの各命令は、３２ビットの固定長であり、各命令は１ビットの並列実行境界情報を２つ保持している。夫々、並列実行境界情報Ａ１０と並列実行境界情報Ｂ１１とする。この情報は、当該命令とそれに後続する命令との間に並列実行の境界が存在するか否かを示すものである。具体的には、並列実行境界情報が“１”の時はその命令と後続命令の間に並列実行の境界が存在し、並列実行境界情報が“０”の時には並列実行の境界が存在しないことになる。この情報の利用方法については後で述べる。
【００４６】
又、各命令は１ビットの分岐ラベル情報１２を保持している。この情報は、この命令が分岐命令の分岐先となっているか否かを示すものである。この情報の利用方法については後で述べる。
【００４７】
各命令の命令長から並列実行境界情報と分岐ラベル情報を除いた２９ビットの部分にてオペレーションを指定する。具体的には、“Ｏｐ１”、“Ｏｐ２”及び“Ｏｐ３”のフィールドでは、オペレーションの種類を表すオペコードを、“Ｒｓ”のフィールドでは、ソースオペランドとなるレジスタのレジスタ番号を、“Ｒｄ”のフィールドでは、デスティネーションオペランドとなるレジスタのレジスタ番号を指定する。又、“ｉｍｍ”のフィールドでは、演算用定数オペランドを指定する。そして、“ｄｉｓｐ”のフィールドでは、変位（ディスプレースメント）を指定する。
【００４８】
次に、本プロセッサのアーキテクチャの概要について説明する。本プロセッサは、静的な並列スケジューリングを前提としたプロセッサであって、命令の供給と発行の概念は図２のようになる。命令の供給は、図２（ａ）に示すように毎サイクル１２８ビット固定長の命令供給単位（ここでは「パケット」と呼ぶ。）で４命令ずつ供給する。そして、命令の実行は、同図（ｂ）に示すように１サイクルで並列実行の境界までの命令（ここでは「実行単位」と呼ぶ）を同時実行する。つまり、各サイクルにおいて並列実行境界情報が“１”である命令までの命令を並列実行することになる。ここで、各命令には２つの並列実行境界情報が存在するが、そのいずれを選択するかについては後で述べる。供給されながら実行されずに残った命令は、命令バッファに蓄積され、次のサイクル以降で実行の対象となる。ここでは、問題を単純にするため命令供給不足が起きないように十分な命令供給バンド幅があることを想定している。
【００４９】
つまり、このアーキテクチャでは、固定長のパケット単位で命令を供給しておき、静的に求めた情報を元に、各サイクルにおいて並列度に応じた適切な数の命令を発行していく、ということになる。この手法をとることにより、通常の固定長命令のＶＬＩＷ方式で発生していた無動作命令（ｎｏｐ命令）が全く無くなり、コードサイズを削減することができる。
【００５０】
（プロセッサのハードウェア構成）
次に、本プロセッサのハードウェア構成を説明する。図３は、本実施の形態に係るプロセッサのハードウェア構成を示すブロック図である。本プロセッサは、１サイクルに最大２つの命令を並列実行するプロセッサであり、大きく分けて、命令供給発行部２０、解読部３０、実行部４０から構成される。
【００５１】
命令供給発行部２０は、図示されていない外部メモリより複数の命令から成る複合命令を読出して解読部３０に出力する命令読み出し手段であり、命令フェッチ部２１、命令バッファ２２及び命令レジスタ２３からなる。
【００５２】
命令フェッチ部２１は、３２ビットのＩＡ（インストラクションアドレス）バス及び１２８ビットのＩＤ（インストラクションデータ）バスを通じて図示されていない外部メモリから命令のブロックをフェッチし、内部の命令キャッシュに保持すると共に、ＰＣ部４２から出力されたアドレスに相当する命令群を命令バッファ２２に供給する。
【００５３】
命令バッファ２２は、１２８ビットのバッファを２個備えており、命令フェッチ部２１によって供給された命令を蓄積しておくために用いられる。命令バッファ２２へは、命令フェッチ部２１から１２８ビット単位でパケットが供給される。命令バッファ２２に蓄積された命令は、命令レジスタ２３の適切なレジスタに出力される。
【００５４】
命令レジスタ２３は、２個の３２ビットレジスタからなり、命令バッファ２２から送られてきた命令を保持するためのものである。命令レジスタ２３の周辺については、別の図面において更に詳細な構成を示している。
【００５５】
解読部３０は、命令レジスタ２３に保持された命令を解読し、その解読結果に応じた制御信号を実行部４０に出力するものであり、大きく分けて、命令発行制御部３１と命令デコーダ３２からなる。
【００５６】
命令発行制御部３１は、命令レジスタ２３の２個のレジスタに保持された命令に対して、命令内の並列実行境界情報を参照することによって、並列実行の境界を越えた命令について、その命令の発行を無効化するといった発行に関する制御を行う。尚、命令発行制御部３１については、別の図面において更に詳細な動作説明を行う。
【００５７】
命令デコーダ３２は、命令レジスタ２３に格納された命令群を解読する装置であり、第１命令デコーダ３３及び第２命令デコーダ３４からなる。これらのデコーダは、基本的に１サイクルに１つの命令を解読し、実行部４０に制御信号を与える。又、命令内に置かれた定数オペランドについては、各命令デコーダ３３又は３４から実行部４０のデータバス４８に転送される。
【００５８】
実行部４０は、解読部３０での解読結果に基づいて、最大２つの命令を並列実行する回路ユニットであり、実行制御部４１、ＰＣ部４２、レジスタファイル４３、第１演算部４４、第２演算部４５、オペランドアクセス部４７及びデータバス４８、４９からなる。
【００５９】
実行制御部４１は、解読部３０での解読結果に基づいて実行部４０の各構成要素４２〜４９を制御する制御回路や配線の総称であり、タイミング制御、動作許可禁止制御、ステータス管理、割り込み制御等の回路を有する。
【００６０】
ＰＣ（プログラムカウンタ）部４２は、次に解読実行すべき命令が置かれている図示されていない外部メモリ上のアドレスを命令供給発行部２０の命令フェッチ部２１に出力するものである。
【００６１】
レジスタファイル４３は、６４個の３２ビットレジスタＲ０〜Ｒ６３から構成される。これらのレジスタに格納された値は、第１命令デコーダ３３及び第２命令デコーダ３４での解読結果に基づいて、データバス４８を経由して第１演算部４４及び第２演算部４５に転送され、そこで演算が施され、又はそこを単に通過した後に、データバス４９を経由してレジスタファイル４３又はオペランドアクセス部４７に送られる。
【００６２】
第１演算部４４及び第２演算部４５は、夫々２個の３２ビットデータに対して算術論理演算を行うＡＬＵや乗算器と、シフト演算を行うバレルシフタを内部に有し、実行制御部４１による制御の下で演算を実行する。
【００６３】
オペランドアクセス部４７は、レジスタファイル４３と図示されていない外部メモリとの間でオペランドの転送を行う回路である。具体的には、例えば、命令内で、オペコードとして“ｌｄ”（ロード）が置かれていた場合には、外部メモリに置かれていた１ワード（３２ビット）のデータがオペランドアクセス部４７を経てレジスタファイル４３の指定されたレジスタにロードされ、又、オペコードとして“ｓｔ”（ストア）が置かれていた場合には、レジスタファイル４３の指定されたレジスタの格納値が外部メモリにストアされる。
【００６４】
上記ＰＣ部４２、レジスタファイル４３、第１演算部４４、第２演算部４５及びオペランドアクセス部４７は、図示されるように、データバス４８（Ｌ１バス、Ｒ１バス、Ｌ２バス、Ｒ２バス）及びデータバス４９（Ｄ１バス、Ｄ２バス）で接続されている。尚、Ｌ１バス及びＲ１バスは夫々第１演算部４４の２つの入力ポートに、Ｌ２バス及びＲ２バスは夫々第２演算部４５の２つの入力ポートに、Ｄ１バス及びＤ２バスは夫々第１演算部４４及び第２演算部４５の出力ポートに接続されている。
【００６５】
（命令レジスタ２３周辺の構成と命令発行制御部３１の動作）
次に、命令レジスタ２３周辺の構成を示し、命令発行制御部３１の動作を説明する。図４は、命令レジスタ２３周辺の構成を示すブロック図である。図中、破線の矢印は制御信号を表す。命令レジスタ２３は命令レジスタＡ２３１及び命令レジスタＢ２３２の２個の３２ビットレジスタからなる。命令レジスタ２３には、命令バッファ２２から命令が供給される。
【００６６】
図中第１，第２の各命令デコーダ３３と３４は、３２ビットの命令を入力とし、それを解読して、その命令の動作に関する制御信号を実行制御部４１に出力するとともに、命令内に配置された定数オペランドを出力する。図４の５０〜５１が各命令の定数オペランドである。
【００６７】
又、各命令デコーダ３３，３４には、制御信号として１ビットの無動作命令フラグが入力される。このフラグを“１”にセットすると、そのデコーダは出力として無動作命令を出力する。つまり、無動作命令フラグをセットすることにより、その命令デコーダの命令としてのデコードを無効化することができる。
【００６８】
ここで、命令レジスタ２３に格納された命令の発行の制御を行う命令発行制御部３１の構成及び動作について説明する。このプロセッサは基本ブロック単位で命令の処理が行われる。基本ブロックは分岐等で流れが変化することなく処理が進行する一連の命令である。従って基本ブロックの先頭にはラベルが記されており、他のブロックからの分岐命令等で分岐された状態から基本ブロックが開始する。図５は本プロセッサの命令発行制御部３１とその周辺回路の構成を示したものである。命令発行制御部３１は、論理和回路３１１、実行フロー検出部３１２を含む実行フロー検出手段３１３と、１ビットの実行フローフラグ３１４、マルチプレクサ（ＭＵＸ）３１５から成る並列実行情報選択手段３１６を備えており、並列実行境界情報Ａ１０と並列実行境界情報Ｂ１１のいずれの情報を並列実行の境界として使用するかを選択するものである。実行フローフラグ３１４は現在の実行フローの状態を記憶する実行フロー記憶手段である。
【００６９】
命令発行制御部３１には、前サイクルにおいて分岐が成立したか否かの１ビットの信号が実行部４０から毎サイクル入力される。実行フロー検出部３１２はこれに基づいてフローの変化を検出するものであって、変化が検出されたときに実行フローフラグ３１４に検出信号を出力する。又命令レジスタＡ２３１，命令レジスタＢ２３２の夫々の分岐ラベル情報の論理和を論理和回路３１１で検出し、その出力を実行フローフラグ３１４に出力する。実行フローフラグ３１４は、命令レジスタＡ２３１の命令もしくは命令レジスタＢ２３２の命令が分岐先となる命令である場合のみ、上記検出信号の値で更新される。これは、命令レジスタＡ２３１及び命令レジスタＢ２３２に格納された命令内の分岐ラベル情報１２を参照することにより制御される。ＭＵＸ（マルチプレクサ）３１５はこの実行フローフラグ３１４の内容により並列実行境界情報Ａ１０，Ｂ１１のいずれかを選択する。
【００７０】
命令発行制御部３１は、以上の方法で並列実行境界の情報を得て、しかるべき制御を行う。
【００７１】
まず、この情報から、命令レジスタ２３に格納された命令の内どこまでをこのサイクルで発行するのかを求める。そして、どれだけの命令が発行されずに残ったのかの情報を命令バッファ２２内の命令バッファ制御部２２３に伝達する。
【００７２】
次に命令デコーダ３２を制御し、このサイクルで発行される命令についてのみ解読を行うように制御する。これは、命令内のしかるべき並列実行境界情報を参照して、命令レジスタ２３内の命令の中で、発行されずに残るものに関しては、その命令のデコードを無効化する。
【００７３】
具体的な動作は以下の通りである。命令発行制御部３１に毎サイクル入力される分岐成立信号は、前サイクルで分岐が成立したときにのみ“１”となっている。まず、命令レジスタＡ２３１及び命令レジスタＢ２３２に格納された命令内の分岐ラベル情報１２を参照し、いずれかが“１”である場合には実行フローフラグ３１４の内容を分岐成立の検出信号の内容で更新する。つまり、命令レジスタ内の命令に分岐で制御が移った場合には、実行フローフラグ３１４が“１”になることになる。
【００７４】
そして、実行フローフラグ３１４を参照して、ＭＵＸ３１５は並列実行境界情報Ａ１０と並列実行境界情報Ｂ１１のいずれの情報を用いるかを選択する。実行フローフラグ３１４が“０”のときには並列実行境界情報Ａ１０が、“１”のときには並列実行境界情報Ｂ１１が選択されることになる。
【００７５】
こうして選択された並列実行境界情報が“１”のときには、命令レジスタＢ２３２の命令は発行されずに残るので、第２命令デコーダ３４のデコードを無効化する。すなわち、命令発行制御部３１が第２命令デコーダ３４に対して制御信号“１”を出力し、第２命令デコーダ３４の無動作命令フラグを“１”にセットする。図４において、命令発行制御部３１から第２命令デコーダ３４への破線がこの動作に相当する。
【００７６】
このように、並列実行境界情報と実行フローに関する情報を参照することにより、必要に応じて命令デコーダの無動作フラグを設定し、命令としてのデコードを無効化する。
【００７７】
このように、図１に示したような命令フォーマットをとり、図５に示したような単純な回路を用意するだけで、必要最低限の情報を参照して実行フローに対応した命令発行制御を高速に行うことができる。
【００７８】
（プロセッサの動作）
次に、具体的な命令を解読実行した場合の本実施の形態のプロセッサの動作について説明する。図６は、分岐先ラベルを含むプログラムの一部を示す図である。このプログラムは、４個の命令で構成されており、各命令の処理内容は、ニーモニックで表現されている。具体的には、ニーモニック“ｍｏｖ”は、定数及びレジスタの格納値のレジスタへの転送を表し、ニーモニック“ａｄｄ”は、定数及びレジスタの格納値とレジスタの格納値との加算を表し、ニーモニック“ｌｄ”は、メモリの内容のレジスタへの転送を表している。
【００７９】
又、“Ｒｎ（ｎ＝０〜６３）”はレジスタファイル４３の中の一つのレジスタを示す。そして、各命令の並列実行境界情報Ａ１０と並列実行境界情報Ｂ１１についても“０”又は“１”で示してある。分岐ラベル情報１２に関しては、ラベル“Ｌａｂｅｌ”の付いている命令２のみ“１”になっている。
【００８０】
このプログラムには、シーケンシャルに命令１から命令２に制御が移る場合と、ラベル“Ｌａｂｅｌ”への分岐によって命令２に制御が移る場合との２通りの場合がある。このプロセッサでは命令２は命令２〜４を含む基本ブロックの先頭部分であり、命令１はこれに先行する他の基本ブロックの最後の命令である。尚、基本ブロックとは、命令の処理が常に順に実行される一連の命令をいい、通常その先頭の部分にはラベルが付される。
【００８１】
図７に上記夫々の場合のプログラムの実行イメージを示す。図７（ａ）が命令１から命令２に制御が移る場合を、図７（ｂ）が命令２に分岐してくる場合を示している。
【００８２】
図６及び図７を用いて、夫々の場合における各実行単位ごとの本プロセッサの動作を説明する。
【００８３】
（命令１から命令２に制御が移る場合）
（実行単位１）
命令１、命令２、命令３及び命令４を含むパケットがメモリから供給され、命令１と命令２が順に命令レジスタ２３に転送される。次に命令発行制御部３１が各命令の分岐ラベル情報１２を参照する。命令２の分岐ラベル情報１２が“１”であるので、実行フローフラグ３１４を分岐成立信号で更新する。前サイクルで分岐が成立していないので、この場合は実行フローフラグ３１４に“０”が設定される。
【００８４】
次に、参照すべき並列実行境界情報を選択する。実行フローフラグ３１４の値が“０”であるので、並列実行境界情報Ａが選択される。命令レジスタＡ２３１に格納された命令１の並列実行境界情報Ａは“０”であるので、第２命令デコーダ３４の解読結果は無効化せず、命令１と命令２の２個の命令を発行することになる。発行されずに残った命令３と命令４は、命令バッファ２２に蓄積される。
【００８５】
実行部４０では、レジスタＲ０の格納値がレジスタＲ１に転送され、メモリ内のレジスタＲ２で示されるアドレスの格納値がレジスタＲ３に転送される。
【００８６】
（実行単位２）
命令バッファに蓄積されていた命令３と命令４とが、順に命令レジスタ２３に転送される。いずれの命令の分岐ラベル情報１２も“０”であるため、実行フローフラグ３１４は更新されない。
【００８７】
次に、参照すべき並列実行境界情報を選択する。実行フローフラグ３１４の値が“０”であるので、並列実行境界情報Ａが選択される。命令レジスタＡ２３１に格納された命令３の並列実行境界情報Ａは“０”であるので、第２命令デコーダ３４の解読結果は無効化せず、命令３と命令４の２個の命令を発行することになる。これで供給されたすべての命令が発行されたことになる。
【００８８】
実行部４０では、レジスタＲ１の格納値がレジスタＲ４に転送され、レジスタＲ３の格納値にレジスタＲ１の格納値が加えられてレジスタＲ３に格納される。
【００８９】
以上のように、命令１から命令２に制御が移る場合、即ちある基本ブロックからこれに引き続く基本ブロックに分岐せずに命令が実行される場合には、並列実行境界情報Ａのみが用いられる。これにより本プロセッサにおいて図６のプログラムは図７（ａ）に示す２つの実行単位で実行される。
【００９０】
（命令２に分岐してくる場合）
（実行単位１）
命令１、命令２、命令３及び命令４を含むパケットがメモリから供給される。ただし、分岐先のプログラムカウンタは命令２のアドレスを示しているので、命令２と命令３が順に命令レジスタ２３に転送される。次に命令発行制御部３１が各命令の分岐ラベル情報１２を参照する。命令２の分岐ラベル情報１２が“１”であるので、実行フローフラグ３１４を分岐成立信号で更新する。前サイクルで分岐が成立しているため、分岐成立信号は“１”であり、実行フローフラグ３１４に“１”が設定される。
【００９１】
次に、参照すべき並列実行境界情報を選択する。実行フローフラグ３１４の値が“１”であるので、並列実行境界情報Ｂが選択される。命令レジスタＡ２３１に格納された命令２の並列実行境界情報Ｂは“０”であるので、第２命令デコーダ３４の解読結果は無効化せず、命令２と命令３の２個の命令を発行することになる。発行されずに残った命令４は、命令バッファ２２に蓄積される。
【００９２】
実行部４０では、メモリ内のレジスタＲ２で示されるアドレスの格納値がレジスタＲ３に転送され、レジスタＲ１の格納値がレジスタＲ４に転送される。
【００９３】
（実行単位２）
命令バッファに蓄積されていた命令４が、命令レジスタ２３に転送される。命令４の分岐ラベル情報１２は“０”であるため、実行フローフラグ３１４は更新されず、“１”である。
【００９４】
次に、参照すべき並列実行境界情報を選択する。実行フローフラグ３１４の値が“１”であるので、並列実行境界情報Ｂが選択される。命令レジスタＡ２３１に格納された命令４の並列実行境界情報Ｂは“１”であるので、第２命令デコーダ３４の解読結果は無効化し、命令４のみを発行することになる。これで供給されたすべての命令が発行されたことになる。
【００９５】
実行部４０では、レジスタＲ３の格納値にレジスタＲ１の格納値が加えられてレジスタＲ３に格納される。
【００９６】
以上のように、命令２に分岐してくる場合、即ち命令２から始まる基本ブロックはその直前の基本ブロックと連続しない場合に、命令２からの基本ブロックでは並列実行境界情報Ｂが適用される。従って本プロセッサにおいて図６のプログラムは図７（ｂ）に示す２つの実行単位で実行される。
【００９７】
（従来の単一の並列実行境界情報を持つプロセッサとの比較）
次に、図６に示した処理を、従来技術として挙げた単一の並列実行境界情報を持つプロセッサに行わせた場合を仮定して、本発明に係るプロセッサの場合と比較する。
【００９８】
単一の並列境界情報を持つ従来のプロセッサの命令フォーマットは、図１の本発明のプロセッサの命令フォーマットの２つの並列実行境界情報を１つにし、分岐ラベル情報１２を取り除いたものになる。すなわち、命令内にはオペレーションに関する情報以外には１ビットの並列実行境界情報のみ保持することになる。
【００９９】
命令発行制御部では、命令レジスタＡに格納された命令の並列実行境界情報に応じて第２命令デコーダの解読結果を無効化する、という単純な制御を行う。
【０１００】
図８は図６に示したプログラムの処理を単一の並列実行境界情報を持つプロセッサで実行させるプログラムを示す図である。図８のプログラムは、並列実行境界情報、分岐ラベル以外の部分は図６のプログラムと同一となる。並列実行境界情報は、基本ブロック単位でスケジューリングされた境界情報を１つだけ持つことになる。この例では、命令２に分岐ラベルが付いているので、命令１と命令２との間に基本ブロックの境界があることになる。
【０１０１】
図９に図８のプログラムの従来のプロセッサにおける実行イメージを示す。図９（ａ）が命令１から命令２に制御が移る場合を、図９（ｂ）が命令２に分岐してくる場合を示している。
【０１０２】
図８及び図９を用いて、夫々の場合における各実行単位ごとの従来のプロセッサの動作を説明する。
【０１０３】
（命令１から命令２に制御が移る場合）
（実行単位１）
命令１、命令２、命令３及び命令４を含むパケットがメモリから供給され、命令１と命令２が順に命令レジスタに転送される。次に、命令発行制御部が命令レジスタＡに格納された命令１の並列実行境界情報を参照して、命令の発行を制御する。命令１の並列実行境界情報は“１”であるので、第２命令デコーダの解読結果を無効化し、命令１のみを発行することになる。発行されずに残った命令２、命令３及び命令４は、命令バッファに蓄積される。
【０１０４】
実行部では、レジスタＲ０の格納値がレジスタＲ１に転送される。
【０１０５】
（実行単位２）
命令バッファに蓄積されていた命令２と命令３とが、順に命令レジスタに転送される。次に、命令発行制御部が命令レジスタＡに格納された命令２の並列実行境界情報を参照して、命令の発行を制御する。命令２の並列実行境界情報は“０”であるので、第２命令デコーダの解読結果は無効化せず、命令２と命令３の２個の命令を発行することになる。発行されずに残った命令４は、命令バッファに蓄積される。
【０１０６】
実行部では、メモリ内のレジスタＲ２で示されるアドレスの格納値がレジスタＲ３に転送され、レジスタＲ１の格納値がレジスタＲ４に転送される。
【０１０７】
（実行単位３）
命令バッファに蓄積されていた命令４が、命令レジスタに転送される。命令レジスタＡに格納された命令４の並列実行境界情報が“１”であるので、第２命令デコーダの解読結果は無効化し、命令４のみを発行することになる。これで供給されたすべての命令が発行されたことになる。
【０１０８】
実行部では、レジスタＲ３の格納値にレジスタＲ１の格納値が加えられてレジスタＲ３に格納される。
【０１０９】
以上のように、命令１から命令２に制御が移る場合、単一の並列実行境界情報を持つ従来のプロセッサにおいて図８のプログラムは３つの実行単位で実行される。
【０１１０】
（命令２に分岐してくる場合）
（実行単位１）
命令１、命令２、命令３及び命令４を含むパケットがメモリから供給される。ただし、分岐先のプログラムカウンタは命令２のアドレスを示しているので、命令２と命令３が順に命令レジスタに転送される。次に、命令発行制御部が命令レジスタＡに格納された命令２の並列実行境界情報を参照して、命令の発行を制御する。命令２の並列実行境界情報は“０”であるので、第２命令デコーダの解読結果は無効化せず、命令２と命令３の２個の命令を発行することになる。発行されずに残った命令４は、命令バッファに蓄積される。
【０１１１】
実行部では、メモリ内のレジスタＲ２で示されるアドレスの格納値がレジスタＲ３に転送され、レジスタＲ１の格納値がレジスタＲ４に転送される。
【０１１２】
（実行単位２）
命令バッファに蓄積されていた命令４が、命令レジスタに転送される。命令レジスタＡに格納された命令４の並列実行境界情報が“１”であるので、第２命令デコーダの解読結果は無効化し、命令４のみを発行することになる。これで供給されたすべての命令が発行されたことになる。
【０１１３】
実行部では、レジスタＲ３の格納値にレジスタＲ１の格納値が加えられてレジスタＲ３に格納される。
【０１１４】
以上のように、命令２に分岐してくる場合、単一の並列実行境界情報を持つ従来のプロセッサにおいて、図８のプログラムは２つの実行単位で実行される。
【０１１５】
図７と図９の実行イメージを比較するとわかるように、単一の並列実行境界情報を持つ従来のプロセッサでは３つの実行単位で実行するのに対して、本実施の形態では命令１から命令２に制御が移る場合、２つの実行単位で実行される。その結果、本実施の形態のプロセッサでは実行サイクル数を減少させることができる。
【０１１６】
［実施の形態２］
次に上述の実施の形態１におけるプロセッサで実行するコードを生成するコンパイラ、及びそのコンパイル方法についての実施の形態について説明する。
【０１１７】
（用語説明）
まず本説明で用いる用語の説明を行なう。
・オブジェクトコード
再配置可能情報を含んだ対象プロセッサ向け機械語プログラム。連結編集を行ない未確定アドレスを決定することにより実行形式コードに変換することができる。
・プレデセッサ
ある命令を実行する為に、それ以前に実行しておく必要のある命令。
・実行グループ
コンパイラによって、同一サイクルに並列実行可能であるものをグループ化した命令群。
【０１１８】
（対象プロセッサ）
本コンパイラが対象とするプロセッサは、上記実施の形態１で説明したプロセッサである。このプロセッサは、コンパイラにて付与された並列実行境界情報Ａ１０と並列実行境界情報Ｂ１１を参照することにより実行グループを生成し、ハードウェアでは並列実行可能か否かの判定を行なわない。したがって、並列実行境界間すなわち実行グループ内に、同時実行可能な命令が正しく配置されていることは、コンパイラが保証することになる。並列実行境界間に配置できる命令に対する制限は以下の通り。命令は以下の２条件が満たされた場合のみ並列実行ができる。
（１）並列実行グループ中の命令の総数は２を越えない。
（２）並列実行グループ中の命令が使用する対象プロセッサ資源の総和は、２ＡＬＵユニット、１メモリアクセスユニット、１分岐ユニットを越えない。
【０１１９】
又、対象プロセッサは並列実行グループ中の命令を必ずしも同時に実行するわけではない。命令の供給が追い付かないなどの理由で並列実行グループを２回以上に分けて実行することもある。このためコンパイラは、並列実行グループが２回以上に分割されて実行される場合であっても、プログラムの意味動作が正しくなるように、命令群中の命令順を設定する必要がある。
【０１２０】
（コンパイラの構成）
図１０は、本発明の実施形態におけるコンパイラの構成及び関連するデータを示すブロック図である。本コンパイラは高級言語で書かれたソースコード１３０からオブジェクトコード１４０を生成するプログラム処理装置であり、コンパイラ上流部１００、アセンブラコード生成部１０１、命令スケジューリング部１０２、オブジェクトコード生成部１０３からなる。
【０１２１】
コンパイラ上流部１００は、ファイル形式で保存されている高級言語ソースコード１３０を読み込み、構文解析及び意味解析を行なって内部形式コードを生成する。更に必要に応じて、最終的に生成される実行形式コードのサイズやその実行時間が短くなるように内部形式コードを最適化する。
【０１２２】
アセンブラコード生成部１０１は、コンパイラ上流部１００により生成、最適化された内部形式コードからアセンブラコードを生成する。
【０１２３】
コンパイラ上流部１００及びアセンブラコード生成部１０１での処理は本発明の主眼ではなく、又、従来のコンパイラで行なわれてきた処理と同等であるので、詳細は省略する。
【０１２４】
（命令スケジューリング部１０２）
命令スケジューリング部１０２は、アセンブラコード生成部１０１で生成されたアセンブラコードに対し命令間の依存関係の解析、命令の再配置（命令順の並べ替え）及び並列実行境界の付加を行ない、アセンブラコードを対象プロセッサ向けに並列化する。命令スケジューリング部１０２は、依存関係解析部１１０、命令再配置部１１１、命令再集合化部１１２、実行境界付加部１１３から構成される。
【０１２５】
命令スケジューリング部１０２は基本的に基本ブロック単位で処理を行うが、当該基本ブロックの先頭の命令が分岐先になっている場合、すなわち分岐ラベル付き命令である場合、当該基本ブロックのみを処理単位とし、並列実行境界情報Ｂを設定するスケジューリングと、当該基本ブロックに先行する他の基本ブロックの最終実行グループの命令群を加えたものを処理単位とし、並列実行境界情報Ａを設定するスケジューリングとの２通りのスケジューリングを行う。そして夫々で得られた並列実行の境界に関する情報Ｂ及びＡを２つの並列実行境界情報に夫々設定する。
【０１２６】
図１１に命令スケジューリング部１０２のフローチャートを示す。まず、ステップＳ１において当該基本ブロックのみを処理単位とするスケジューリングを行う。依存関係解析部１１０と命令再配置部１１１が動作する。次に、ステップＳ２において当該基本ブロックの先頭命令が分岐ラベル付き命令である場合には、ステップＳ３で先行する基本ブロックの最終実行グループの命令を加えた処理単位でのスケジューリングを行う。この場合に命令再集合化部１１２が動作する。この際、当該基本ブロックの先頭の命令の分岐ラベル情報１２の設定も行う。最後に、ステップＳ４において並列実行境界付加部１１３にて２つの並列実行境界情報を設定する。
【０１２７】
各部の詳細な動作は以下の通りである。
依存関係解析部１１０は、処理対象に含まれる命令間の依存関係を解析し依存グラフとして表現する。命令間の依存関係には以下の３種類がある。
・データ依存関係
ある資源を定義する命令と、同じ資源を参照する命令間の依存関係。
・逆依存関係
ある資源を参照する命令と、同じ資源を定義する命令間の依存関係。
・出力依存関係
ある資源を定義する命令と、同じ資源を定義する命令間の依存関係。
いずれの依存関係にある命令も、元の命令順を変更するとプログラムの意味が異なってしまう為、命令並べ替え時においても依存関係は守る必要がある。
【０１２８】
依存関係解析部１１０では、処理対象に含まれる各命令毎に、これに対応するノード（節）を、又、各依存関係毎に、これに対応するエッジ（矢印）を生成し、依存グラフを生成する。例として図１２のアセンブラコードに対する依存グラフを図１３に示す。図１３中、実線はデータ依存関係を、破線は逆依存関係を示す。依存グラフの生成方法は例えば、論文  Ｉｎｓｔｒｕｃｔｉｏｎ  ｓｃｈｅｄｕｌｉｎｇ  ｉｎ  ｔｈｅ  ＴＯＢＥＹ  ｃｏｍｐｉｌｅｒ  （Ｒ．Ｊ．Ｂｌａｉｎｅｙ，  ＩＢＭＪ．ＲＥＳ．ＤＥＶＥＬＯＰ．  ＶＯＬ．３８  ＮＯ．５  ＳＥＰＴＥＭＢＥＲ  １９９４）  に開示されている。
【０１２９】
命令再配置部１１１は、依存関係解析部１１０で生成された依存グラフを用いて、処理対象の命令を並べ替え、対象プロセッサ向けの並列化されたアセンブラコードを生成する。命令再配置部１１１の処理の詳細は以下の通りである。
【０１３０】
図１４は、命令再配置部１１１での処理手順を示すフローチャートである。命令再配置部１１１は、依存関係解析部１１０が生成した依存グラフの全てのノードについて、以下の処理（ステップＳ１２〜Ｓ１９）を繰り返す（ループ１）（ステップＳ１１、Ｓ２０）。
【０１３１】
まず、命令再配置部１１１は、現時点で配置候補となり得るノードを依存グラフより抽出し配置候補集合とする（ステップＳ１２）。ここで配置候補となり得るノードとは、「プレデセッサが全て配置完了済み」であるノードである。
【０１３２】
次に、命令再配置部１１１は、配置候補ノード集合の全ての候補ノードについて、以下の処理（ステップＳ１４〜Ｓ１７）を繰り返す（ループ２）（ステップＳ１３、Ｓ１８）。
【０１３３】
次に、配置候補ノード集合から現時点で配置することが最良と思われるノード（以下、単に「最良ノード」と呼ぶ。）を取り出す（ステップＳ１４）。最良ノードの決定方法については後述する。
【０１３４】
続いて最良ノードが、実際に配置可能か否かを判断し、可能な場合は仮配置する（ステップＳ１５）。この判断は、最良ノードが前述の演算器の制約、命令数の制約及び命令デコーダの制約を満たすかどうかによって決定する。
【０１３５】
続いて、現時点で仮配置されているノード集合を調べ、更に命令を配置することができるか否かを判断する（ステップＳ１６）。配置不可と判断された場合はループ２を終了し処理をステップＳ１９へ移す。
【０１３６】
配置可能と判断された場合、最良ノードが配置されたことによって新たに配置候補となり得るノードが生じたか否かを判断し、新たな配置候補が生じた場合はこれを配置候補ノードに追加する（ステップＳ１７）。ステップＳ１７で新たに配置候補にできるのは、「（現在配置しようとしている）最良ノードのみをプレデセッサとして持ち、且つ、最良ノードとの依存関係が逆依存もしくは出力依存」のノードである。つまりここで新たな配置候補になることができるノードは、最良ノードと同じサイクルで実行することはできるが、最良ノードより前のサイクルでは実行できないノードである。
【０１３７】
ループ２が終了した後、仮配置ノード集合に含まれているノードを確定する（ステップＳ１９）。具体的には、仮配置ノード集合に含まれているノードに対応する命令を元の命令列から取り出し、実行境界付加部２２へ渡すための新たな命令列に再配置する。この段階で配置候補ノードの一部が、同時に実行する命令群としてまとめられ確定したことになる。ステップＳ１３〜ステップＳ１９の一連の処理が「命令集合化ステップ」に相当する。
【０１３８】
次に、ステップＳ１４における最良ノードの決定方法について述べる。最良ノードは、依存グラフ、仮配置領域を参照して、処理対象の命令全体を最も短時間で実行できるであろう命令をヒューリスティックに選び出す。ここでは現時点での依存グラフにおいて依存グラフの終端までの命令の実行時間総和が最も多いものを選ぶ。この条件に合致する命令が多数ある場合には、元の命令順が早い命令を最良ノードとする。
【０１３９】
命令再集合化部１１２は、まず当該基本ブロックの先頭の命令の分岐ラベル情報１２を設定する。
【０１４０】
次に、当該基本ブロックに加えてスケジューリングの処理対象とする命令群を求める。これは、先行基本ブロックを末尾の直前の命令からサーチし、並列実行境界情報Ａと並列実行境界情報Ｂが夫々“１”に設定されている命令を探す。そして両方の並列実行境界情報に“１”が発見される直前の命令までを処理対象に加える。
【０１４１】
求められた処理対象に対して、上記命令再配置部１１１のような命令の並べ替えは行わず、依存関係解析部１１０で解析した情報とハードウェア資源の制約の情報を元に、既に再配置されている命令の先頭から順にできるだけ多くの命令が同時に並列実行できるように集合化していく。
【０１４２】
並列実行境界付加部１１３は、命令再配置部１１１のステップＳ１９で配置が確定した命令群の末尾毎に並列実行境界情報Ｂを設定し、命令再集合化部１１２で決定された命令群の末尾毎に並列実行境界情報Ａを設定する。ただし、当該基本ブロックの先頭の命令が分岐ラベル付き命令でなく、命令再集合化部１１２が動作しなかった場合には、並列実行境界情報Ａは並列実行境界情報Ｂと同一とする。
【０１４３】
図１０に戻って、オブジェクトコード生成部１０３は、命令スケジューリング部１０２が出力したアセンブラコードをオブジェクトコード１４０に変換し、ファイルとして出力する。
【０１４４】
（コンパイラの動作）
次に、本コンパイラの特徴的な構成要素の動作について、具体的な命令を用いて説明する。図１５（ａ）は、ソースコードをコンパイラ上流部１００に入力し、アセンブラコード生成部１０１を経て生成されたアセンブラコード、図１５（ｂ）はその基本ブロックと処理ブロックを示す。命令スケジューリング部１０２は図１５（ａ）のコードを入力として受け取る。図１５（ａ）に含まれる各命令の意味は以下の通りである。
・命令１…メモリ内のレジスタＲ５で示されるアドレスの格納値をレジスタＲ０に転送する命令。
・命令２…レジスタＲ５の格納値に定数０ｘ２（１６進数の２）を加算してレジスタＲ５に格納する命令。
・命令３…レジスタＲ０の格納値をレジスタＲ１に転送する命令。
・命令４…メモリ内のレジスタＲ２で示されるアドレスの格納値をレジスタＲ３に転送する命令。
・命令５…レジスタＲ１の格納値をレジスタＲ４に転送する命令。
・命令６…レジスタＲ３の格納値にレジスタＲ１の格納値を加えてレジスタＲ３に格納する命令。
これらの命令列は、命令４に分岐ラベルが設定されているため、命令１〜命令３を含む基本ブロック１６１と命令４〜命令６を含む基本ブロック１６２から成る。命令スケジューリング部１０２は、基本ブロック単位で処理を行う。
【０１４５】
各基本ブロックに対する命令スケジューリング部１０２の動作について図１１を用いて説明する。まず最初の基本ブロック（命令１〜命令３）について基本ブロック１６１内の命令を対象としてスケジューリングを行う（ステップＳ１）。詳細は省略するが、依存関係解析部１１０と命令再配置部１１１が起動され、命令の配置は命令１、命令２、命令３の順序のままで、最初のサイクルで命令１と命令２を実行し、次のサイクルで命令３を実行するように集合化される。
【０１４６】
次に、先頭の命令（命令１）が分岐ラベル付き命令かどうかを判定する（ステップＳ２）。命令１は分岐ラベル付き命令でないので、ステップＳ４に進む。
【０１４７】
最後に、並列実行境界の設定を行う（ステップＳ４）。ここで並列実行境界付加部１１３が起動され、上記の集合化による命令群の末尾に並列実行境界Ｂを設定する。具体的には、命令２と命令３の並列実行境界情報Ｂに“１”を設定し、命令１に関しては“０”を設定する。又、この基本ブロックに関しては先頭がラベル分命令でなく、命令再集合化部１１２が起動されなかったので、並列実行境界情報Ａには、並列実行境界情報Ｂと同一のものを設定する。
【０１４８】
これで最初の基本ブロック１６１（命令１〜命令３）に関する処理は完了し、次の基本ブロック１６２（命令４〜命令６）に移る。最初の基本ブロック１６１と同様にこの基本ブロック１６２を処理単位とするスケジューリングを行う（ステップＳ１）。詳細は省略するが、依存関係解析部１１０と命令再配置部１１１が起動され、命令の配置は命令４、命令５、命令６の順序のままで、最初のサイクルで命令４と命令５を実行し、次のサイクルで命令６を実行するように集合化される。
【０１４９】
次に、先頭の命令（命令４）が分岐ラベル付き命令かどうかを判定する（ステップＳ２）。命令４は分岐ラベル付き命令なので、命令４の分岐ラベル情報１２に“１”を設定して、ステップＳ３に進む。
【０１５０】
次に、先行する基本ブロック１６１の最終実行グループを含む処理単位でのスケジューリングを行う（ステップＳ３）。ここでは、命令再集合化部１１２が起動される。先行する基本ブロック１６１を末尾の直前の命令（命令２）から逆順にサーチしていき、並列実行境界情報Ａと並列実行境界情報Ｂが“１”に設定されているかどうかをチェックする。この場合は、命令２の並列実行境界情報Ａと並列実行境界情報Ｂが共に“１”なので、その直前の命令３までが先行基本ブロックの最終実行グループということになる。したがって、命令４〜命令６に命令３を加えたものを処理単位としてスケジューリングを行う。
【０１５１】
このスケジューリングでは、命令の並べ替えは行わず、命令間の依存関係と演算資源の制約のみで命令の集合化を行う。結果的に、最初のサイクルで命令３と命令４とを実行し、次のサイクルで命令５と命令６とを実行するように集合化される。
【０１５２】
最後に、並列実行境界の設定を行う（ステップＳ４）。ここで並列実行境界付加部１１３が起動され、上記ステップＳ１の命令再配置部１１１での集合化による命令群の末尾に並列実行境界情報Ｂを設定する。具体的には、命令５と命令６の並列実行境界情報Ｂに“１”を設定し、命令４に関しては“０”を設定する。又、上記ステップＳ３の命令再集合化部１１２での集合化による命令群の末尾に並列実行境界Ａを設定する。具体的には、命令４と命令６の並列実行境界情報Ａに“１”を設定し、命令３と命令５に関しては“０”を設定する。以上で命令スケジューリング部１０２の処理が完了する。即ち命令３に関しては“０”に書換えることになる。
【０１５３】
続いてオブジェクトコード生成部１０３が起動され、オブジェクトコードが出力される。最終的な実行形式コードを図１６に示す。実際の実行形式コードは１２８ビット単位にまとめられたビット列である。
【０１５４】
図１５に示したプログラムには、シーケンシャルに命令１から順に命令４へ制御が移る場合と、ラベル“Ｌａｂｅｌ”への分岐によって命令４に制御が移る場合との２通りの場合がある。
【０１５５】
上記２つの場合夫々の、図１６の実行形式コードの実行イメージを図１７に示す。図１７を見てわかるように、図１６の実行形式コードは、命令１からシーケンシャルに制御が移る場合には３つの実行グループで実行され、命令４に分岐してくる場合には、２つの実行グループで実行される。
【０１５６】
（従来のコンパイラとの比較）
次に、図１５（ａ）に示したアセンブラコードを、本発明のコンパイラの構成をとらない従来のコンパイラにてコンパイルした場合を仮定して、本発明に係るコンパイラの場合と比較する。
【０１５７】
従来のコンパイラにおいても、基本ブロック単位でスケジューリングを行う。ただし、命令内には単一の並列実行境界情報しか保持しない。
【０１５８】
まず、最初の基本ブロック（命令１〜命令３）を処理単位とするスケジューリングを行う。詳細は省略するが、本発明のコンパイラのステップＳ１の場合と同様に、命令の配置は命令１、命令２、命令３の順序のままで、最初のサイクルで命令１と命令２を実行し、次のサイクルで命令３を実行するように集合化される。
【０１５９】
次に、上記の集合化の結果を元に並列実行境界を設定する。具体的には、命令２と命令３の並列実行境界情報に“１”を設定し、命令１に関しては“０”を設定する。
【０１６０】
これで最初の基本ブロック（命令１〜命令３）に関する処理は完了し、後続する基本ブロック（命令４〜命令６）に移る。
【０１６１】
最初の基本ブロックと同様に、この基本ブロックを処理単位とするスケジューリングを行う。詳細は省略するが、本発明のコンパイラのステップＳ１の場合と同様に、命令の配置は命令４、命令５、命令６の順序のままで、最初のサイクルで命令４と命令５を実行し、次のサイクルで命令６を実行するように集合化される。
【０１６２】
次に、上記の集合化の結果を元に並列実行境界を設定する。具体的には、命令５と命令６の並列実行境界情報に“１”を設定し、命令４に関しては“０”を設定する。以上で命令スケジューリング処理が完了する。
【０１６３】
結果として生成される実行形式コードを図１８に示す。図１７と同様に、シーケンシャルに命令１から順に命令４へ制御が移る場合と、ラベル“Ｌａｂｅｌ”への分岐によって命令４に制御が移る場合との２通りの場合夫々についての、図１８の実行形式コードの実行イメージを図１９に示す。
【０１６４】
図１９を見てわかるように、図１８の実行形式コードは、命令１からシーケンシャルに制御が移る場合には４つの実行グループで実行され、命令４に分岐してくる場合には、２つの実行グループで実行される。
【０１６５】
図１７と図１９を比較すると、命令１からシーケンシャルに制御が移る場合に、従来のコンパイラの生成コードでは、本発明のコンパイラの生成コードの場合に比べ、実行グループが１つ増えている。つまり、実行サイクル数が１サイクル増していることになる。このように実行グループ数が増加したのは、本実施の形態の命令スケジューリング部１０２のような構成をとらなかったために、複数の実行フローに対して固定された単一の並列実行境界を利用しなければならなかったことに起因する。
【０１６６】
本実施の形態で示されるコンパイラをフロッピーディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤなどの記録媒体に入れることにより本実施の形態で示されるコンパイラを、コンピュータで実現できる。
【０１６７】
又、本実施の形態で示されるコンパイラにより生成された実行形式コードをフロッピーディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤ、半導体メモリなどの記録媒体に入れることもできる。
【０１６８】
［実施の形態３］
次に、上記実施の形態１と同様に命令内に並列実行境界情報を複数個持つが、その情報の利用方法の異なるプロセッサの実施の形態について説明する。本プロセッサのハードウェア構成については、大部分は前述の第１の実施の形態のプロセッサと同一であるが、並列実行境界情報の扱いのみが異なる。複数の並列実行境界情報は、プロセッサの並列度に応じて選択的に使用される。具体的には、命令発行制御部の構成が異なることになる。
【０１６９】
（命令発行制御部の構成と動作）
図２０は、本実施の形態のプロセッサの命令発行制御部１５０とその周辺回路の構成を示すブロック図であり、図２１は命令デコーダとその周辺回路の構成を示すブロック図である。命令発行制御部１５０は、１ビットの並列度モードフラグ１５１を備えている。このフラグが“０”の場合は２並列のモードで動作していることを示し、“１”の場合には３並列以上のモードで動作していることを示す。
【０１７０】
又、命令発行制御部１５０は、演算資源制約検出部１５２を備えている。これは、３並列以上のモードで動作している場合、参照する並列実行境界情報はデータ依存に関する境界は示すが、並列度すなわち演算資源数による境界は示していない。したがって、このモードの場合にはハードウェアで動的に演算資源数による制約を検出する必要がある。２並列モードの場合には、演算資源制約検出部１５２は常に“０”を出力する。並列度モードフラグ１５１の出力は２つのマルチプレクサ（ＭＵＸ）１５２，１５３に出力される。ＭＵＸ１５３は命令レジスタＡ２３１の２つの並列実行境界情報Ａ１０，Ｂ１１を並列モードフラグの出力に応じて選択するものであり、ＭＵＸ１５４は命令レジスタＢ２３２の２つの並列実行境界情報Ａ１０，Ｂ１１のいずれかを選択するものである。
【０１７１】
命令発行制御部１５０は、各命令内の並列実行境界情報、並列度モードフラグ１５１及び演算資源制約検出部１５２から並列実行の境界の情報を得てしかるべき制御を行う。オア回路１５５はマルチプレクサ１５３と演算資源制約検出部１５２からの出力の論理和が成立すれば、第２命令デコーダ３４に無動作命令を出力するものであり、オア回路１５６はマルチプレクサ１５４の出力と演算資源制約検出部１５２の出力の論理和が成立すれば、第３命令デコーダ３５に無動作命令を出力するものである。
【０１７２】
まず、この情報から、命令レジスタに格納された命令の内どこまでをこのサイクルで発行するのかを求める。そして、どれだけの命令が発行されずに残ったのかの情報を命令バッファ内の命令バッファ制御部に伝達する。
【０１７３】
次に命令デコーダを制御し、このサイクルで発行される命令についてのみ解読を行うように制御する。これは、命令内のしかるべき並列実行境界情報を参照して、命令レジスタ内の命令の中で、発行されずに残るものに関しては、その命令のデコードを無効化する。
【０１７４】
具体的な動作は以下の通りである。命令発行制御部１５０の並列度モードフラグ１５１には、あらかじめ“０”もしくは“１”が設定されている。
【０１７５】
並列度モードフラグ１５１が“０”の場合、すなわち２並列モードで動作している場合、命令内の並列実行境界情報Ａに２並列動作を想定した並列実行境界情報が設定されているので、並列実行境界情報Ａを選択するようにセレクタを制御する。演算資源制約検出部１５２は常に“０”を出力するので、制御には影響を及ぼさない。
【０１７６】
具体的には、命令レジスタＡ２３１の命令の並列実行境界情報Ａが“１”の場合に第２命令デコーダ３４の無動作命令フラグを“１”に設定してデコードを無効化し、命令レジスタＢ２３２の命令の並列実行境界情報Ａが“１”の場合に第３命令デコーダ３５の無動作命令フラグを“１”に設定してデコードを無効化する。
【０１７７】
並列度モードフラグ１５１が“１”の場合、すなわち３並列以上のモードで動作している場合は、命令内の並列実行境界情報Ｂを参照する。ここでは、３並列で動作する場合を考える。３並列動作するプロセッサの構成は、図３の２並列のプロセッサの、命令に関連する部分をすべて２個から３個にしただけのものである。具体的には、命令レジスタ内のレジスタ数、命令デコーダ数、演算部が夫々１つずつ増えることになる。
【０１７８】
並列実行境界情報Ｂは、データ依存に関する境界情報しか示していないので、演算資源による制約は、演算資源制約検出部１５２で動的に検出することになる。
【０１７９】
演算資源制約検出部１５２は、当該サイクルで現在までに発行可能としている命令群に加えて、後続する命令レジスタの命令を発行することが可能であるか否かを出力する。具体的には、命令レジスタＡ２３１の命令に加えて命令レジスタＢ２３２の命令を発行することが不可能である場合、第２命令デコーダ３４の無動作命令フラグを設定するために“１”を出力し、同様に命令レジスタＡ２３１と命令レジスタＢ２３２の命令に加えて命令レジスタＣ２３３の命令を発行することが不可能である場合、第３命令デコーダ３５の無動作命令フラグを設定するために“１”を出力する。
【０１８０】
全体としては、命令内の並列実行境界情報Ｂと演算資源制約検出部１５２の出力のいずれかが“１”である場合に、該当する命令デコーダの無動作フラグを“１”に設定する。
【０１８１】
このように、必要に応じて適切な命令デコーダの無動作フラグを設定し、命令としてのデコードを無効化する。
【０１８２】
このように、図１に示したような命令フォーマットをとり、図２０，図２１に示したような単純な回路を用意するだけで、命令コードを変更することなく、複数の並列度のプロセッサに対応した命令発行制御を高速に行うことができる。
【０１８３】
（プロセッサの動作）
次に、本プロセッサの具体的な動作について説明する。図２２は、アセンブラコードによるプログラムの一例を示す図である。このプログラムは、７個の命令で構成されており、表記は図６のプログラムと同じである。ニーモニック“ｓｔ”は、レジスタの格納値のメモリへの転送を表している。
【０１８４】
図２３に、図２２のプログラムを２並列のプロセッサで実行した場合と３並列のプロセッサで実行した場合の実行イメージを示す。図２３（ａ）が２並列のプロセッサで実行した場合を、図２３（ｂ）が３並列のプロセッサで実行した場合を示している。図２２及び図２３を用いて、夫々の場合の本プロセッサの動作を説明する。
【０１８５】
（２並列プロセッサの場合）
２並列プロセッサで動作する場合、まず最初に命令発行制御部１５０の並列度モードフラグ１５１を“０”にセットしておく。これにより、各サイクルにおいて命令発行制御部１５０では、並列実行の境界として並列実行境界情報Ａを使用するように制御される。
【０１８６】
具体的には、命令２、命令４、命令６及び命令７の並列実行境界情報Ａが“１”に設定されているので、図２３（ａ）に示したように４つの実行単位で実行されることになる。
【０１８７】
（３並列プロセッサの場合）
３並列プロセッサで動作する場合、まず最初に命令発行制御部１５０の並列度モードフラグ１５１を“１”にセットしておく。これにより、各サイクルにおける命令発行制御には、並列実行境界情報Ｂの情報と演算資源制約検出部１５２の出力を使用することになる。
【０１８８】
具体的には、並列実行境界情報Ｂは命令４と命令７しか“１”に設定されていないが、３並列分の演算資源しか搭載していないことによる制約を演算資源制約検出部１５２が検出する。従って図２３（ｂ）に示すように、最初のサイクルでは命令１、命令２及び命令３の３つの命令が発行される。
【０１８９】
次のサイクルでは、命令４の並列実行境界情報Ｂの情報により命令４のみが発行される。
【０１９０】
その次のサイクルで残りの命令５、命令６及び命令７の３つの命令を発行することが可能であり、全体として図２３（ｂ）に示したように３つの実行単位で実行されることになる。これからわかるように、３並列のモードで実行することにより、２並列のプロセッサの場合に比べて実行単位の数を１つ減らすことができる。
【０１９１】
又、上記のプログラムを４並列のプロセッサで動作させた場合、２並列から３並列の場合と同様の構成の拡張を行ったと考えると、並列度モードフラグ“１”にセットして動作し、最初のサイクルで命令４の並列実行境界情報Ｂの情報により命令１〜命令４までの４つの命令が発行され、次のサイクルで残りの命令５〜命令７の命令を発行することが可能であり、全体として２つの実行単位で実行される。つまり、３並列から４並列に拡張することによっても、実行単位の数を更に１つ減らすことができる。
【０１９２】
３並列の場合に比べて最初のサイクルでの発行命令数を増やすことができたのは、演算資源制約検出部１５２の出力が変化したからである。
【０１９３】
従来の静的なスケジューリングを行うプロセッサでは、並列度向上等のハードウェアの拡張を行っても、並列実行の境界が固定されているため実行単位の数は変わらず、性能向上のためには動作周波数を向上させるか、プログラムを再コンパイルするしかなかった。
【０１９４】
それに対して、本実施の形態の構成をとることにより、ハードウェアの拡張に応じた並列実行境界情報を使用できるようになり、プログラムの再コンパイルなしで性能を向上させることができるようになる。
【０１９５】
［実施の形態４］
次に上述の実施の形態３におけるプロセッサで実行するコードを生成するコンパイラ、及びそのコンパイル方法についての実施の形態について説明する。本コンパイラの構成については、大部分は前述の実施の形態２のコンパイラと同一であるが、複数の並列実行境界情報の扱いのみが異なる。複数の並列実行境界情報は、プロセッサの並列度に応じて選択的に使用される。具体的には、命令スケジューリング部の構成が異なることになる。図２４は実施の形態２のおけるコンパイラの構成及び関連するデータを示すブロック図である。
【０１９６】
（命令スケジューリング部）
本実施の形態のコンパイラの命令スケジューリング部１０２Ａは、実施の形態２における命令スケジューリング部１０２と同様に、依存関係解析部１１０、命令再配置部１１１Ａ、命令再集合化部１１２、並列実行境界付加部１１３から構成されるが、異なる点は命令再配置部１１１Ａの再配置の方法と命令再配置部１１１Ａが命令均一化部１２１を備えるという点である。
【０１９７】
命令スケジューリング部１０２Ａは基本ブロック単位で処理を行う。ただし、ハードウェアの並列度に応じた複数の並列実行境界情報を設定する。
【０１９８】
図２５に、本実施の形態のコンパイラの命令スケジューリング部１０２Ａのフローチャートを示す。まず、依存関係解析部１１０と命令再配置部１１１Ａが起動され、当該基本ブロックに関して、依存関係のみを考慮したスケジューリングを行う（ステップＳ２１）。ここでは、搭載する演算器の数による制約は考慮しない。ここで、命令再配置の際、命令再配置部１１１Ａの命令均一化部１２１が起動され、依存関係が許す限り、各実行グループに含まれる命令数が均一になるように配置される。これによって、ハードウェアの拡張に応じて効率良く性能を向上させることができる。命令均一化部１２１については、後の例で説明している。
【０１９９】
次に、命令再集合化部１１２が起動され、命令の並べ替えは行わないが、依存関係解析部１１０による情報と、２並列のハードウェアの演算資源の制約の情報をもとに、先頭から順にできるだけ多くの命令が同時実行できるように集合化していく（ステップＳ２２）。
【０２００】
最後に、並列実行境界付加部１１３が起動され、命令再配置部１１１Ａで配置が確定した命令群の末尾に並列実行境界情報Ｂを設定し、命令再集合化部で決定した命令群の末尾毎に並列実行境界情報Ａを設定する（ステップＳ２３）。
【０２０１】
（コンパイラの動作）
次に、本コンパイラの特徴的な構成要素の動作について具体的な命令を用いて説明する。最初の例としては、図２２のアセンブラコードを用いる。命令スケジューリング部の動作について、図２５を用いて説明する。まず依存関係解析部１１１が起動される。図２２のアセンブラコードの依存グラフを図２６に示す。
【０２０２】
次に命令再配置部１１１Ａにて、図２６の依存グラフをもとにして、依存関係のみを考慮したスケジューリングを行う（ステップＳ２１）。この例では、命令の順序は変わらず、命令１及び命令２と、命令５との間にデータ依存関係が存在するので、命令５の直前の命令４までを１つの命令グループとし、残りの３命令をもう１つの命令グループとする。この例に関しては命令均一化部１２１の効果は現れない。
【０２０３】
次に、命令再集合化部１１２にて依存関係と演算資源制約を考慮したスケジューリングを行う（ステップＳ２２）。ここでは、並列度２を想定して最大２命令発行を演算資源の制約としてスケジューリングを行う。その結果、命令１と命令２、命令３と命令４、命令５と命令６、命令７が夫々実行グループをなす。
【０２０４】
最後に、並列実行境界付加部１１３にて、命令再配置部１１１Ａでの決定にしたがって並列実行境界情報Ｂを設定し、命令再集合化部１１２での決定にしたがって並列実行境界情報Ａを設定する（ステップＳ２３）。具体的には、命令４及び命令７の並列実行境界情報Ｂに“１”が設定され、命令２、命令４、命令６及び命令７の並列実行境界情報Ａに“１”が設定される。
【０２０５】
以上が命令スケジューリング部の動作である。このような構成をとることにより、実施の形態３のプロセッサの動作例で示した実行形式コードを生成することが可能となり、再コンパイルすることなくハードウェアの拡張に応じて性能を向上させることができるようになる。
【０２０６】
次に、命令再配置部１１１Ａに備えられた命令均一化部の動作について、例を用いて説明する。図２７はプログラムの一例を示す図である。このプログラムでは、命令１と命令６との間のデータ依存関係以外には依存関係は存在しない。このプログラムを２並列のプロセッサで実行した場合、一般的なスケジューリングを行って並列実行境界情報Ａを設定しておけば、３つの実行グループで実行することができ、又これ以上実行グループを減らすことはできない。
【０２０７】
図２７のプログラムを命令均一化部１２１を持つ本実施の形態の構成の命令再配置部１１１Ａでスケジューリングした場合の実行コードと３並列のプロセッサで実行した場合の実行イメージを図２８に示す。図２８では、命令再配置部１１１Ａの動作に着目するため並列実行境界情報Ｂのみを示している。
【０２０８】
命令再配置部１１１Ａでは、まず依存関係のみを考慮してスケジューリングを行う（ステップＳ２１）。この例では命令１と命令６との間にのみ依存関係が存在するので命令１と命令６とを別々にした２つの命令グループを生成することが決定される。この後、命令均一化部１２１が起動され、依存関係が存在しない命令の移動を行い、基本ブロック内の各命令グループの命令数をなるべく均一にすることを試みる。この例では、初期段階では命令１〜命令５までの５命令と命令６の１命令を夫々命令グループとするようにスケジューリングされるが、命令均一化部１２１によって命令４及び命令５が後ろの命令グループに移動される。具体的には、命令３の並列実行境界情報Ｂに“１”を設定する。これによって、各命令グループの命令数は共に３命令となる。
【０２０９】
図２８に示すように、生成された実行コードの３並列プロセッサでの実行イメージを見ると、図２７のプログラムが２つの実行グループで実行されていることがわかる。
【０２１０】
同様に、図２７のプログラムを命令均一化部を持たない構成の命令再配置部でスケジューリングした場合を仮定し、実行コードと３並列のプロセッサで実行した場合の実行イメージを図２９に示す。
【０２１１】
図２７のプログラムでは、命令１と命令６の間にしか依存関係が存在しないため、命令均一化部を持たない構成の命令再配置部では、命令１〜命令５までの５命令と命令６の１命令を夫々命令グループとするようにスケジューリングされてしまう。具体的には、命令５の並列実行境界情報Ｂに“１”を設定してしまう。
【０２１２】
その結果、実行イメージを見るとわかるように、３並列のプロセッサで実行しても３つの実行グループで実行されてしまい、本発明のコンパイラによる生成コードの場合に比べて実行サイクル数が１サイクル増加する。又、このコードをたとえ４並列のプロセッサで実行しても３つの実行グループで実行されてしまうことが容易に類推できる。
【０２１３】
このように、命令再配置部内に命令均一化部１２１を備えることにより、並列度の向上に応じて効率的に性能を向上させることが可能となる。
【０２１４】
本実施の形態で示されるコンパイラをフロッピーディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤなどの記録媒体に入れることにより本実施の形態で示されるコンパイラを、コンピュータで実現できる。
【０２１５】
又、本実施の形態で示されるコンパイラにより生成された実行形式コードをフロッピーディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤ、半導体メモリなどの記録媒体に入れることもできる。
【０２１６】
以上、本発明に係るプロセッサ及びコンパイラについて、実施の形態に基づいて説明したが、本発明はこれらの実施の形態に限られないことは勿論である。即ち、以下のような形態が考えられる。
【０２１７】
（１）上記実施の形態のプロセッサ及びコンパイラでは、命令フォーマット内に２個の並列実行境界情報を持たせることを想定していたが、本発明はこの並列実行境界の個数に限定されるものではない。並列実行境界情報を３個以上持たせることも可能である。
【０２１８】
（２）上記実施の形態のプロセッサ及びコンパイラでは、固定長の命令を実行することを想定していたが、本発明はこの命令フォーマットに限定されるものではない。可変長の命令フォーマットを採用しても本発明の有意性は保たれる。
【０２１９】
（３）上記実施の形態１のプロセッサ及び上記実施の形態２のコンパイラでは、命令フォーマット内に分岐ラベル情報を持たせていたが、この情報は必ずしも必要ではない。分岐ラベル情報を持たなくても、実行部からの分岐成立もしくは不成立を示す信号に応じて命令発行制御部内に備えた実行フロー状態を示すフラグを切り替え、そのフラグに応じていずれの並列実行境界情報を選択するかを選択することにより、実行フローに対応する効果を得ることが可能である。これによって、命令コードサイズの増加を抑えることができる。
【０２２０】
（４）上記実施の形態１のプロセッサでは、実行フローの検出のために、実行部から分岐が成立したか否かの信号を入力していたが、この信号は必ずしも必要ではない。実行部からは分岐命令であることと、分岐先のアドレスの情報を受け取り、現在の命令のアドレスと比較することによって実行フローを検出するような構成にしてもよい。この場合の命令発行制御部３１Ａの構成を図３０に示す。ここでは比較器３１７を用いてプログラムカウンタからの現在実行される命令のアドレスと実行部より出力される分岐先のアドレス情報とが比較され、この出力によって実行フローの流れを検出する。従って比較器３１７が実行フロー検出手段の機能を達成している。
【０２２１】
（５）実施の形態３のプロセッサ及び実施の形態４のコンパイラでは、複数の並列実行境界情報として、ある特定の並列度に特化した情報と依存関係のみの情報とを持たせることを想定していたが、依存関係のみの情報は必ずしも必要ではない。複数の並列実行境界情報として、各並列度に夫々特化した情報を複数個もたせてもよい。
【０２２２】
（６）上記実施の形態３のプロセッサでは、依存関係のみによる並列実行境界情報を選択した場合、ハードウェアで演算資源制約検出部にて動的に演算資源の制約を検出していたが、この演算資源制約検出部は必ずしも必要ではない。並列度すなわち同時発行数のみの制約であれば、命令レジスタに投入する命令の個数もしくは命令デコーダの個数を制限しておくことにより、制約を満たすことが可能である。
【０２２３】
（７）又実施の形態４のコンパイラでは、命令再配置部中に命令均一化部１２１を設けている。命令均一化部１２１は実行グループの命令数が均一になるように並列化するものであるが、命令数だけでなく命令サイズを均一化するように構成することもできる。又従来の１つだけの並列実行境界情報を有する命令をグループ化する際に命令均一化部を用いて均一化することによっても、実行速度を向上させることができる。
【０２２４】
（８）又第４の実施の形態では、命令再配置ステップを命令間の依存関係にのみ基づいて並べ替えて行うようにしたが、ハードウェア制約に基づいて並べ替えを行うようにしてもよい。又命令再集合化ステップではハードウェア制約に基づいて命令の集合を再びグループ分けすることとしたが、命令再配置ステップと異なるハードウェア制約に基づいて、又は命令間の依存関係のみに基づいて、並列実行可能な命令の集合を再びグループ化するようにしてもよい。
【０２２５】
【発明の効果】
以上の説明から明らかなように、本願の請求項１，２のプロセッサ及び請求項３１，３２の記録媒体のプログラムを実行することで、静的なスケジューリングを採用しながらも、並列実行の境界が固定されることなく、柔軟な並列実行が可能となる。
【０２２６】
又本願の請求項３〜６のプロセッサによれば、静的なスケジューリングを採用しながらも、並列実行の境界が固定されることなく、実行フローに応じた並列実行が可能となる。又動的な並列依存解析を行うハードウェアを不要としてハードウェア簡単化を図りながらも、性能の劣化を抑えることが可能となる。
【０２２７】
更に本願の請求項４のプロセッサ及び請求項２５の記録媒体のプログラムを実行することにより、前記命令内に該命令が分岐命令の飛び先対象となっているか否かを示す分岐ラベル情報を備え、前記実行フロー検出部は、前記命令内の前記分岐ラベル情報と、前記実行手段からの前サイクルで分岐が成立したか否かの情報とを基にして実行の流れの変化の検出を行うことにより、単純な回路を用意するだけで、上記発明の効果を得るための実行フローの変化の検出を容易に行うことが可能となる。又請求項１１，１８のコンパイラ及びコイパイル方法によれば、このようなプログラムを作成することができる。
【０２２８】
又本願の請求項７〜９ののプロセッサによれば、静的なスケジューリングを採用しながらも、プログラムを再コンパイルすることなく、複数の並列度のハードウェアに対応した並列実行が可能となり、互換性を確保することができる。
【０２２９】
更に本願の請求項８，９のプロセッサは、演算資源の制約によりどれだけの命令を同時実行できるかを検出する演算資源制約検出部を備え、前記並列実行情報選択手段の出力と前記演算資源制約検出部の出力とに基づいて命令の発行を制御することにより、静的なスケジューリングを採用しながらも、ハードウェアの並列度を拡張した際に、以前の並列実行境界に制約されることなく、ハードウェアの拡張に応じた性能向上を図ることが可能となる。
【０２３０】
又本願の請求項１０，１１，１７，１８のコンパイラ及びコンパイル方法、請求項２４，２５の記録媒体によれば、静的なスケジューリングを採用しながらも、並列実行の境界が固定されることなく、実行フローに応じた並列実行を可能とする実行形式コードが生成され、動的な並列依存解析を行うハードウェアを不要としてハードウェア簡単化を図りながら、性能の劣化を抑えることが可能となる。
【０２３１】
又本願の請求項１２〜１５，１９〜２２のコンパイラ及びコンパイル方法、請求項２６〜２９の記録媒体によれば、静的なスケジューリングを採用しながらも、プログラムを再コンパイルすることなく、複数の並列度のハードウェアに対応した並列実行を可能とする実行形式コードが生成され、互換性を確保することができる。
【０２３２】
更に本願の請求項１３，１４，２０，２１のコンパイラ及びコンパイル方法、請求項２７，２８の記録媒体によれば、前記命令再配置ステップ及び前記命令集合化ステップ、もしくは命令再集合化ステップのうちの１つは、ハードウェア演算資源を全く考慮せず、各命令間の依存関係にのみ基づいて命令をグループ化するため、静的なスケジューリングを採用しながらも、ハードウェアの並列度を拡張した際に、以前の並列実行境界に制約されることなく、ハードウェアの拡張に応じた性能向上を図ることのできる実行形式コードの生成が可能となる。
【０２３３】
又本願の請求項１６，２３のコンパイラ及びコンパイル方法、請求項３０の記録媒体によれば、ハードウェアの並列度を拡張した際に、どのような並列度にも対応して効率良く性能向上を図ることのできる実行形式コードの生成が可能となる。
【図面の簡単な説明】
【図１】本発明の実施の形態に係るプロセッサが実行する命令の構造を示す図である。
【図２】同プロセッサにおける命令の供給と発行の概念を示す図である。
【図３】同プロセッサのハードウェア構成を示すブロック図である。
【図４】同プロセッサの命令レジスタ２３周辺の構成を示すブロック図である。
【図５】同プロセッサの命令発行制御部３１とその周辺の回路構成を示す図である。
【図６】分岐先ラベルを含むプログラムの一部を示す図である。
【図７】図６のプログラムの実行イメージを示す図である。
【図８】図６のプログラムの処理を従来の単一の並列実行境界情報を持つプロセッサに行わせるプログラムを示す図である。
【図９】図８のプログラムの実行イメージを示す図である。
【図１０】本発明の実施の形態２のおけるコンパイラの構成及び関連するデータを示すブロック図である。
【図１１】同コンパイラにおける命令スケジューリング部１０２の処理手順を示すフローチャートである。
【図１２】アセンブラコードの一例を示す図である。
【図１３】図１１に対応する依存グラフである。
【図１４】同コンパイラにおける命令再配置部１１１の処理手順を示すフローチャートである。
【図１５】アセンブラコードとその基本ブロックの一例を示す図である。
【図１６】図１５に対応する実行形式コードを示す図である。
【図１７】図１６の実行形式コードの実行イメージを示す図である。
【図１８】図１５のコードを従来のコンパイラでスケジューリングした場合の実行形式コードの一例を示す図である。
【図１９】図１８の実行形式コードの実行イメージを示す図である。
【図２０】本発明の実施の形態３に係るプロセッサの命令発行制御部１５０とその周辺の回路構成を示す図である。
【図２１】命令デコーダとその周辺回路の構成を示す図である。
【図２２】プログラムの一例を示す図である。
【図２３】図２２のプログラムの実行イメージを示す図である。
【図２４】実施の形態２のおけるコンパイラの構成及び関連するデータを示すブロック図である。
【図２５】本発明の実施の形態に係るコンパイラの命令スケジューリング部のフローチャートを示す図である。
【図２６】図２２のプログラムの依存グラフを示す図である。
【図２７】プログラムの一例を示す図である。
【図２８】図２７のプログラムに対応する実行形式コードとその実行イメージを示す図である。
【図２９】図２７のプログラムを命令再配置部内に命令均一化部を持たないコンパイラでスケジューリングした場合の実行形式コードとその実行イメージを示す図である。
【図３０】本発明に係るプロセッサの命令発行制御部とその周辺の回路構成を示す図である。
【符号の説明】
１０    並列実行境界情報Ａ
１１    並列実行境界情報Ｂ
２０    命令供給発行部
２１    命令フェッチ部
２２    命令バッファ
２３    命令レジスタ
２３１命令レジスタＡ
２３２命令レジスタＢ
３０    解読部
３１    命令発行制御部
３２    命令デコーダ
３３    第１命令デコーダ
３４    第２命令デコーダ
３５  第３命令デコーダ
４０    実行部
４１    実行制御部
４２    ＰＣ部
４３    レジスタファイル
４４    第１演算部
４５    第２演算部
４７    オペランドアクセス部
４８，４９    データバス
１００    コンパイラ上流部
１０１    アセンブラコード生成部
１０２，１０２Ａ    命令スケジューリング部
１０３    オブジェクトコード生成部
１１０    依存関係解析部
１１１，１１１Ａ    命令再配置部
１１２    命令再集合化部
１１３    並列実行境界付加部
１２０    命令集合化部
１２１  命令均一化部
１３０    ソースコード
１４０    オブジェクトコード
１５０    命令発行制御部
１５１    並列モードフラグ
１５２  演算資源制約検出部
１５３，１５４  マルチプレクサ
３１２  実行フロー検出部
３１３  実行フロー検出手段
３１４  実行フローフラグ
３１５  マルチプレクサ
３１６  並列実行情報選択手段
【図１】
0003553845.tif 000002
【図２】
0003553845.tif 000003
【図３】
0003553845.tif 000004
【図４】
0003553845.tif 000005
【図５】
0003553845.tif 000006
【図６】
0003553845.tif 000007
【図７】
0003553845.tif 000008
【図８】
0003553845.tif 000009
【図９】
0003553845.tif 000010
【図１０】
0003553845.tif 000011
【図１１】
0003553845.tif 000012
【図１２】
0003553845.tif 000013
【図１３】
0003553845.tif 000014
【図１４】
0003553845.tif 000015
【図１５】
0003553845.tif 000016
【図１６】
0003553845.tif 000017
【図１７】
0003553845.tif 000018
【図１８】
0003553845.tif 000019
【図１９】
0003553845.tif 000020
【図２０】
0003553845.tif 000021
【図２１】
0003553845.tif 000022
【図２２】
0003553845.tif 000023
【図２３】
0003553845.tif 000024
【図２４】
0003553845.tif 000025
【図２５】
0003553845.tif 000026
【図２６】
0003553845.tif 000027
【図２７】
0003553845.tif 000028
【図２８】
0003553845.tif 000029
【図２９】
0003553845.tif 000030
【図３０】
0003553845.tif 000031