(57)【特許請求の範囲】
【請求項１】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応する第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２の機械命令を生成し、前記コードが検出された場合に、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置される場合には、前記第１の機械命令に突放し処理を行わせる第３の機械命令を生成する機械命令生成手段と
を備えることを特徴とするコンパイラ。
【請求項２】
前記機械命令生成手段は、
前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、
前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が小さいかまたは等しい場合に限って、前記第２の機械命令を生成することを特徴とする請求項１記載のコンパイラ。
【請求項３】
前記機械命令生成手段は、
前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合でも、
前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が大きいかまたは等しい場合は、
前記第３の機械命令と、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令とを生成することを特徴とする請求項１記載のコンパイラ。
【請求項４】
前記機械命令生成手段は、前記第２の機械命令または前記第３の機械命令を、前記第１の機械命令に先行して配置することを特徴とする請求項１から３のいずれか１項に記載のコンパイラ。
【請求項５】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、前記コードに対応する機械命令として、突放し処理を行わせないタイプとして定義された機械命令を生成し、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、前記コードに対応する機械命令として、突放し処理を行わせるタイプとして定義された機械命令を生成する機械命令生成手段とを備えることを特徴とするコンパイラ。
【請求項６】
並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、
入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応する第１のオペレーションと依存関係のない他のオペレーションが前記第１のオペレーションを含む第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２のオペレーションを生成し、
前記コードが検出された場合に、前記第１のオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、前記第１のオペレーションに突放し処理を行わせる第３のオペレーションを生成する機械命令生成手段とを備えることを特徴とするコンパイラ。
【請求項７】
前記機械命令生成手段は、並列実行させる有益なオペレーションが指定できない第１のオペレーションフィールドがある場合に、無動作のオペレーションを指定する代わりに前記第２のオペレーションまたは前記第３のオペレーションを前記第１のオペレーションフィールドに指定する機械命令を生成することを特徴とする請求項６記載のコンパイラ。
【請求項８】
前記機械命令生成手段は、前記第２のオペレーションを含む第２の機械命令または第３のオペレーションを含む第３の機械命令を、前記第１の機械命令に先行して配置することを特徴とする請求項７記載のコンパイラ。
【請求項９】
並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、
入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応する第１のオペレーションと依存関係のない他のオペレーションが前記第１のオペレーションを含む機械命令に後続して配置されない場合には、前記第１のオペレーションを含む機械命令として突放し処理を行わせないタイプとして定義された機械命令を生成し、
前記コードが検出された場合に、前記第１のオペレーションと依存関係のない他のオペレーションが前記第１のオペレーションを含む機械命令に後続して配置される場合には、前記第１のオペレーションを含む機械命令として突放し処理を行わせるタイプとして定義された機械命令を生成する機械命令生成手段とを備えることを特徴とするコンパイラ。
【請求項１０】
前記機械命令生成手段は、依存関係のないオペレーションが配置される場合には、
前記第１の機械命令に後続する機械命令の、前記第１のオペレーションを指定するオペレーションフィールドと異なるオペレーションフィールドに、前記依存関係のないオペレーションを指定することを特徴とする請求項７記載のコンパイラ。
【請求項１１】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、該コードに対応する機械命令であってかつ突放し処理を行わない第１の機械命令を生成し、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、該コードに対応する機械命令であってかつ突放し処理を行う第２の機械命令を生成する機械命令生成手段と
を備えることを特徴とするコンパイラ。
【請求項１２】
並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、
入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、
前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが該コードに対応するオペレーションを含む第１の機械命令に後続して配置されない場合には、該コードに対応するオペレーションであってかつ突放し処理を行わない第１のオペレーションを生成し、
前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、該コードに対応するオペレーションであってかつ突放し処理を行う第２のオペレーションを生成する機械命令生成手段とを備えることを特徴とするコンパイラ。
【請求項１３】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成する命令生成方法であって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出ステップと、
前記コードが検出された場合に、該コードに対応する第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２の機械命令を生成するステップと、
前記コードが検出された場合に、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置される場合には、前記第１の機械命令に突放し処理を行わせる第３の機械命令を生成するステップと
を備えることを特徴とする命令生成方法。
【請求項１４】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成する命令生成方法であって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出ステップと、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、該コードに対応する機械命令であってかつ突放し処理を行わない第１の機械命令を生成するステップと、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、該コードに対応する機械命令であってかつ突放し処理を行う第２の機械命令を生成するステップと
を備えることを特徴とする命令生成方法。
【請求項１５】
高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成する命令生成方法であって、
前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出ステップと、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、該コードに対応する機械命令であってかつ突放し処理を行わない第１の機械命令を生成するステップと、
前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、該コードに対応する機械命令であってかつ突放し処理を行う第２の機械命令を生成するステップと
を備えることを特徴とする命令生成方法。
【請求項１６】
並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とする命令生成方法であって、
入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出ステップと、
前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが該コードに対応するオペレーションを含む第１の機械命令に後続して配置されない場合には、該コードに対応するオペレーションであってかつ突放し処理を行わない第１のオペレーションを生成するステップと、
前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、該コードに対応するオペレーションであってかつ突放し処理を行う第２のオペレーションを生成するステップとを備えることを特徴とする命令生成方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラと命令生成方法とに関し、特にパイプライン処理を行うプロセッサを効率よく動作させる実行コードを生成するコンパイラと、命令生成方法に関する。
【０００２】
【従来の技術】
近年の電子技術の発展により、高性能なプロセッサが普及し、あらゆる分野で用いられている。そのようなプロセッサではパイプライン処理により高い性能を達成している。パイプライン処理とは命令の処理を複数に分割し、それらを時間的にずらして並列に処理するもので極めて効率が高い。しかし、そのパイプラインにおける処理の流れを阻害する要因が少なからず存在する。流れが阻害された状態をパイプラインのインタロックという。パイプラインの性能は分割された処理の内の処理時間が最長なもので決定される。命令によっては実行に長い時間を要するものがあるが、通常はこういった命令は低頻度なため、長い処理時間を要する場合だけ関係するパイプラインのステージを伸長させる方法をとる。このパイプライン伸長がパイプラインインタロックの要因となる。近年の特にマルチメディアといった応用分野においては、画像処理や音声処理を実現するために上記のような実行に長い時間を要する命令が多く使われるようになって来ている。そこで、インタロックを効率よく制御するプロセッサ及びコンパイラに関する技術が必要とされる。ここで、コンパイラとは、高級言語で記述されたプログラムを、プロセッサで実行可能な機械命令プログラムに翻訳するものである。
【０００３】
（第１の従来技術）
図１３は、第１の従来技術におけるプロセッサの動作タイミング図である。
【０００４】
第１の従来技術におけるプロセッサは、命令フェッチ（IF）ステージと解読（DEC）ステージと実行（EX）ステージとの３段パイプラインで構成されている。
【０００５】
図１３は命令１から３が処理される過程を示しているが、命令１だけが実行に２サイクルを要する。乗除算は加減算に比べて長い演算時間を必要とするので乗算命令や除算命令が命令１にあたる。タイミングt3までは命令１〜３が順調に処理され、３段のパイプラインは淀みなく流れる。しかし命令１の実行にはもう１サイクルかかるため、次のタイミングt4において他のステージの処理を全て止めて命令１の実行のみを引き続いて行わなければならない。ここで上記のパイプラインインタロックが生じ、性能を劣化させることになる。
【０００６】
この第１の従来技術におけるプロセッサに対応するコンパイラは、特別な処理を行わず命令１〜３を連続してコード生成するに過ぎない。
【０００７】
（第２の従来技術）
図１４は、第２の従来技術におけるプロセッサの動作タイミング図である。
【０００８】
第２の従来技術におけるプロセッサも３段パイプラインで構成されているが、いわゆる突放し処理を行う点で第１の従来技術におけるプロセッサと異なる。突放し処理とは、ある処理が継続して行われていてもその処理の終了を待たずに次の処理を開始することである。図１４は上と同様に命令１だけが実行に２サイクルを要する例を示しているが、タイミングt4において命令２が命令１の終了を待たずに実行され、命令３が解読される。インタロックは発生しない。
【０００９】
この第２の従来技術におけるプロセッサに対応するコンパイラは、後に述べる特別な処理を必要とする場合がある。
【００１０】
【発明が解決しようとする課題】
しかしながら、上記の第１の従来技術では、上記の通りパイプラインのインタロックが生じて性能が劣化する。
【００１１】
また、第２の従来技術では、図１４に例示した命令２は命令１の実行結果を用いる命令であってはいけない。命令１の実行が終了する前に命令２の実行を開始しているからである。従って次の２つのいずれかの対応が必要となる。
【００１２】
１つはコンパイラによる対応で、コンパイラが命令間の依存関係を調べ、パイプライン伸長を引き起こす可能性のある命令の後にはその命令の結果を使用しない命令を並べるといった命令スケジューリングの方法である。この方法では、依存関係のない命令を並び替えることができない場合は、パイプライン伸長を引き起こす可能性のある命令の後には無動作（NOP）命令をインタロックのサイクルに応じた数だけ挿入しなければならない。そのためコードサイズが増加しコストが上昇するという問題点がある。
【００１３】
もう１つはプロセッサによる対応で、プロセッサが突放し処理を行う際にその命令と後続の命令との依存関係を調べ、依存関係がない場合に限って突放し処理を行う方法である。この方法では上記のような無動作（NOP）命令の挿入によるコードサイズの増加はないが、プロセッサが命令間の依存関係を調べるためのハードウェアが必要となってハードウェアのコストが増大するという問題点を有している。
【００１４】
そこで、本発明はかかる点に鑑み、コードサイズの増加を低く抑え、効率よくインタロックを制御するコンパイラと記録媒体とを提供することを目的とする。
【００１５】
【課題を解決するための手段】
上記課題を解決するために本発明に係るコンパイラは、高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２の機械命令を生成し、前記コードが検出された場合に、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置される場合には、前記第１の機械命令に突放し処理を行わせる第３の機械命令を生成する機械命令生成手段とを備えることを特徴とする。
【００１６】
これによって、依存関係のない命令が配置されない場合はパイプラインをインタロックさせる。
【００１７】
ここで、前記機械命令生成手段は、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が小さいかまたは等しい場合に限って、前記第２の機械命令を生成するようにしてもよい。
【００１８】
または、前記機械命令生成手段は、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合でも、前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が大きいかまたは等しい場合は、前記第３の機械命令と、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令とを生成するとしてもよい。
【００１９】
上記の各コンパイラは、前記機械命令生成手段は、前記第２の機械命令または前記第３の機械命令を、前記第１の機械命令に先行して配置するようにしてもよい。
【００２０】
また本発明に係るコンパイラは、並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する第１のオペレーションと依存関係のない他のオペレーションが前記第１のオペレーションを含む第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２のオペレーションを生成し、
前記コードが検出された場合に、前記第１のオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、前記第１のオペレーションに突放し処理を行わせる第３のオペレーションを生成する機械命令生成手段とを備えることを特徴とする。
【００２１】
さらに、前記機械命令生成手段は、前記第２のオペレーションを含む第２の機械命令または第３のオペレーションを含む第３の機械命令を、前記第１の機械命令に先行して配置するとしてもよい。
【００２２】
または、前記機械命令生成手段は、依存関係のないオペレーションが配置される場合には、前記第１の機械命令に後続する機械命令の、前記第１のオペレーションを指定するオペレーションフィールドと異なるオペレーションフィールドに、前記依存関係のないオペレーションを指定するとしてもよい。
【００２３】
また、本発明に係るコンパイラは高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、該コードに対応する機械命令であってかつ突放し処理を行わない第１の機械命令を生成し、前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、該コードに対応する機械命令であってかつ突放し処理を行う第２の機械命令を生成する機械命令生成手段とを備えることを特徴とする。
【００２４】
また、本発明に係るコンパイラは、並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが該コードに対応するオペレーションを含む第１の機械命令に後続して配置されない場合には、該コードに対応するオペレーションであってかつ突放し処理を行わない第１のオペレーションを生成し、前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、該コードに対応するオペレーションであってかつ突放し処理を行う第２のオペレーションを生成する機械命令生成手段とを備えることを特徴とする。
【００２５】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を用いて詳細に説明する。
１．コンパイラ
図１は、コンパイラの構成を示すブロック図である。
【００２６】
コンパイラ１０２は、ユーザが記述したＣ言語プログラム１０１を翻訳し、機械命令プログラム１１０を出力する。
【００２７】
コンパイラ１０２は、Ｃ言語プログラム１０１を読込用バッファ１０４に読み込むファイル読込部１０３と、読込用バッファ１０４に読み込まれたＣ言語プログラムの構文や意味を解析して中間コードを生成し中間コード用バッファ１０６に書き込む構文解析部１０５と、中間コード用バッファ１０６に格納された中間コードを入力して機械命令プログラムを生成し出力用バッファ１０８に書き込む機械命令生成部１０７と、出力用バッファ１０８に格納された機械命令プログラムをファイルに出力するファイル出力部１０９とから構成される。
【００２８】
図２は、構文解析部１０５の処理フローを示したフローチャートである。
【００２９】
図３は、機械命令生成部１０７の処理フローを示したフローチャートである。
【００３０】
図４と図７とは、Ｃ言語プログラムの例を示すプログラムリストである。
【００３１】
図５と図８とは、それぞれ図４と図７とに示すＣ言語プログラムを入力として与えた場合に、コンパイラ１０２の中間コード用バッファ１０６に格納された中間コードプログラムを示したリストである。
【００３２】
図６と図９とは、それぞれ図４と図７とに示すＣ言語プログラムを入力として与えた場合に、コンパイラにより生成された機械命令プログラムを示したリストである。なお、機械命令プログラムは本来０と１のビット列であるが、意味を表すために図６と図９とではニモニック表記してある。
１．１  コンパイラの動作例１
以下に、図４のプログラムリストを入力とした場合における上記構成をもつコンパイラの動作について図１、図２、図３、図４、図５および図６を用いて説明する。
【００３３】
ファイル読込部１０３は、ユーザが記述したＣ言語プログラム１０１を読み込み、読込用バッファ１０４に格納する。
【００３４】
構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=10;」については、次行の「a=a*20;」とは並列に実行できないので（ステップ２０３）、op:nop型の中間コードでopを「a←10」にした中間コード１を中間コード用バッファ１０６に出力する（ステップ２０５）。
【００３５】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード１を取り出し（ステップ３０２）、op:nop型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成するとともに、これが最初のnopなのでnop部分には突放しスイッチをオンする命令を挿入し出力用バッファ１０８に出力する（ステップ３０５）。
【００３６】
次に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=a*20;」については、次行の「b=30;」とは並列に実行できるので（ステップ２０３）、op:op型の中間コードでopを「a←a*20」と「b←30」にした中間コード２を中間コード用バッファ１０６に出力する（ステップ２０６）。
【００３７】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード２を取り出し（ステップ３０２）、op:op型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成し出力用バッファ１０８に出力する（ステップ３０５）。
【００３８】
次に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出そうとする（ステップ２０２）。しかし先に取り出された図４に示すプログラムの「a=a*20;」が乗算の実行に２サイクル要し、さらに後続行の「a=a-40;」と「a=a*2;」はいずれも先の乗算結果を使用するためここでは何も実行できないので（ステップ２０３）、nop:nop型の中間コード３を中間コード用バッファ１０６に出力する（ステップ２０４）。
【００３９】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード３を取り出し（ステップ３０２）、nop:nop型の中間コードであると判断し（ステップ３０３）、出力用バッファ１０８を遡って検索して先に挿入された突放しスイッチをオンする命令を突放しスイッチをオフする命令に置き換える（ステップ３０４）。
【００４０】
次に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=a-40;」については、次行の「a=a*2;」とは並列に実行できないので（ステップ２０３）、op:nop型の中間コードでopを「a←a-40」にした中間コード４を中間コード用バッファ１０６に出力する（ステップ２０５）。
【００４１】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード４を取り出し（ステップ３０２）、op:nop型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成するとともに、以前に突放しスイッチをオフする命令を挿入しているのでnop部分には突放しスイッチをオンする命令を挿入し出力用バッファ１０８に出力する（ステップ３０５）。
【００４２】
最後に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=a*2;」については最終行なので（ステップ２０３）、op:nop型の中間コードでopを「a←a*2」にした中間コード５を中間コード用バッファ１０６に出力する（ステップ２０５）。
【００４３】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード５を取り出し（ステップ３０２）、op:nop型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成するとともに、突放しスイッチをオフする命令を挿入した後に突放しスイッチをオンする命令が挿入されているのでnop部分にはNOP命令を挿入し出力用バッファ１０８に出力する（ステップ３０５）。このとき、中間コードのop部は乗算を意味するが、「a←a*2」なので乗算命令を生成せずに代わりに加算命令を生成して実行に２サイクル以上必要な命令の生成を極力、阻止する。
【００４４】
ファイル出力部１０９は、出力用バッファ１０８に格納された機械命令を、ファイルに出力する。
【００４５】
このファイルに出力された機械命令プログラムは、図６のリストに示すようになる。以下、図６に示す命令１から４の意味を説明する。
【００４６】
命令１    MOV  ♯10, R0 : MOV  ♯0, CR
レジスタR0に10を格納することと、レジスタCRに0を格納すること。レジスタCRは突放しスイッチとして作用し、0はオフ、1はオンを意味する。
【００４７】
命令２    MUL  ♯20, R0 : MOV  ♯30, R1
レジスタR0の内容に20をかけて積をR0に格納することと、レジスタR1に30を格納すること。
【００４８】
命令３    SUB  ♯40, R0 : MOV  ♯1, CR
レジスタR0の内容から40を引いて結果をR0に格納することと、レジスタCRに1を格納すること。
【００４９】
命令４    ADD  R0, R0 : NOP
レジスタR0の内容を２倍して結果をR0に格納すること。
１．２  コンパイラの動作例２
以下に、図７のプログラムリストを入力とした場合における上記構成をもつコンパイラの動作について図１、図２、図３、図７、図８および図９を用いて説明する。
【００５０】
ファイル読込部１０３は、ユーザが記述したＣ言語プログラム１０１を読み込み、読込用バッファ１０４に格納する。
【００５１】
構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=10;」については、次行の「a=a*20;」とは並列に実行できないので（ステップ２０３）、op:nop型の中間コードでopを「a←10」にした中間コード１を中間コード用バッファ１０６に出力する（ステップ２０５）。
【００５２】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード１を取り出し（ステップ３０２）、op:nop型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成するとともに、これが最初のnopなのでnop部分には突放しスイッチをオンする命令を挿入し出力用バッファ１０８に出力する（ステップ３０５）。
【００５３】
次に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=a*20;」については、次行の「b=30;」とは並列に実行できるので（ステップ２０３）、op:op型の中間コードでopを「a←a*20」と「b←30」にした中間コード２を中間コード用バッファ１０６に出力する（ステップ２０６）。
【００５４】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード２を取り出し（ステップ３０２）、op:op型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成し出力用バッファ１０８に出力する（ステップ３０５）。
【００５５】
次に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。先に取り出された図７に示すプログラムの「a=a*20;」が乗算の実行に２サイクル要するが、後続行の「b=b-40;」は先の乗算結果を使用しないためこれは実行でき（ステップ２０３）、op:nop型の中間コード３を中間コード用バッファ１０６に出力する（ステップ２０５）。
【００５６】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード３を取り出し（ステップ３０２）、op:nop型の中間コードであると判断する（ステップ３０３）。このとき、１つ前のop部分が伸長することを判断し、op部分とnop部分とを入れ換える。そしてop部分に対応する機械命令を生成するとともに、これが最初のnopではなく以前に突放しスイッチをオフする命令を挿入していないのでnop部分にはNOP命令を挿入し出力用バッファ１０８に出力する（ステップ３０５）。
【００５７】
最後に、構文解析部１０５は、読込用バッファ１０４に格納されたＣ言語プログラムを取り出す（ステップ２０２）。図４に示すプログラムの「a=a*2;」については、次行の「c=50;」とは並列に実行できるので（ステップ２０３）、op:op型の中間コードでopを「a←a*2」と「c←50」にした中間コード４を中間コード用バッファ１０６に出力する（ステップ２０６）。
【００５８】
機械命令生成部１０７は、中間コード用バッファ１０６に格納された中間コード４を取り出し（ステップ３０２）、op:op型の中間コードであると判断し（ステップ３０３）、op部分に対応する機械命令を生成し出力用バッファ１０８に出力する（ステップ３０６）。このとき、中間コードのop部は乗算を意味するが、「a←a*2」なので乗算命令を生成せずに代わりに加算命令を生成して実行に２サイクル以上必要な命令の生成を極力、阻止する。
【００５９】
ファイル出力部１０９は、出力用バッファ１０８に格納された機械命令を、ファイルに出力する。
【００６０】
このファイルに出力された機械命令プログラムは、図９のリストに示すようになる。以下、図９に示す命令１から４の意味を説明する。
【００６１】
命令１    MOV  ♯10, R0 : MOV  ♯1, CR
レジスタR0に10を格納することと、レジスタCRに1を格納すること。レジスタCRは突放しスイッチとして作用し、0はオフ、1はオンを意味する。
【００６２】
命令２    MUL  ♯20, R0 : MOV  ♯30, R1
レジスタR0の内容に20をかけて積をR0に格納することと、レジスタR1に30を格納すること。
【００６３】
命令３    NOP : SUB  ♯40, R1
レジスタR1の内容から40を引いて結果をR1に格納すること。
【００６４】
命令４    ADD  R0, R0 : MOV  ♯50, R2
レジスタR0の内容を２倍して結果をR0に格納することと、レジスタR2に50を格納すること。
２．プロセッサ
図１０は、プロセッサの概略構成図である。
【００６５】
このプロセッサは、命令フェッチステージ（以下、IFステージ）、解読およびレジスタ読出しステージ（以下、DECステージ）、実行ステージ（以下、EXステージ）の３つのステージからなる３段パイプライン構造を成している。
【００６６】
図１０において、４０１は機械語プログラムを格納するROM、４０２と４０３はROM４０１から取り出した機械語命令（以下、命令と略す）を格納するそれぞれＩ１ラッチとＩ２ラッチ、４０４と４０５はそれぞれＩ１ラッチ４０２とＩ２ラッチ４０３に保持された命令の前半部分と後半部分を解読しプロセッサ各部を制御する第１命令解読器と第２命令解読器、４０６はオペランド格納するレジスタファイル、４０７と４０８はそれぞれＩ１ラッチ４０２とＩ２ラッチ４０３の内容の一部とレジスタファイル４０６の出力との２入力から１つを選択するＤ１セレクタとＤ２セレクタ、４０９と４１０はそれぞれＤ１セレクタ４０７とＤ２セレクタ４０８の出力を格納するＤ１１ラッチとＤ１２ラッチ、４１１と４１２はレジスタファイル４０６の出力を格納するＤ２１ラッチとＤ２２ラッチ、４１３はＤ１１ラッチ４０９およびＤ２１ラッチ４１１の内容を用いて算術論理演算を行う第１演算器、４１４はＤ１２ラッチ４１０およびＤ２２ラッチ４１２の内容を用いて算術論理演算を行う第２演算器で、第１演算器４１３と第２演算器４１４の出力はともにレジスタファイル４０６に接続される。
【００６７】
レジスタファイル４０６は、レジスタR0からR7の汎用レジスタ４０６１と突放しスイッチレジスタCR４０６２とを含み、読出し４ポート、書込み２ポートを有する。即ち、同時に４つのレジスタ（重複は可）の読出しと２つのレジスタ（重複は不可）の書込みを許す。突放しスイッチレジスタCR４０６２の内容はともに第１命令解読器４０４と第２命令解読器４０５とにフィードバックされ、それぞれ第１演算器４１３と第２演算器４１４との突放し処理を行うか否かを制御している。
【００６８】
このプロセッサはいわゆるVLIW（Very Long Instruction Word）形式の命令に基づいており、１つの命令で２つの演算などの操作が定義される。ニモニック表記された命令の左半分は、Ｉ１ラッチ４０２に格納され第１命令解読器４０４で解読され第１演算器４１３で実行される。また右半分は、Ｉ２ラッチ４０３に格納され第２命令解読器４０５で解読され第２演算器４１４で実行される。このようにして同時に２つの操作を実行するためVLIW形式のプロセッサは効率が高い。
２．１  プロセッサの動作例１
以下に、図６の機械命令プログラムがROM４０１に格納された場合における上記構成をもつプロセッサの動作について図１０および図１１を用いて説明する。
【００６９】
図１１は、図６の機械命令プログラムがROM４０１に格納された場合におけるプロセッサの動作タイミング図である。同図は、プロセッサの動作をパイプラインのIFステージ、DECステージ、EXステージで処理される命令をマシンサイクルと呼ばれるタイミング毎に示している。以下、時間が経過する順にタイミング毎にその動作を説明する。
（タイミングt1）・IFステージ：命令１（MOV  ♯10, R0 : MOV  ♯0, CR）
命令１がROM４０１から読出され、左半分（MOV  ♯10, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯0, CR）がＩ２ラッチ４０３に格納される。
（タイミングt2）・DECステージ：命令１
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令１がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ１ラッチ４０２およびＤ１セレクタ４０７を経由して値10がＤ１１ラッチ４０９に、Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値0がＤ１２ラッチ４１０に格納される。
・IFステージ：命令２（MUL  ♯20, R0 : MOV  ♯30, R1）
命令１がROM４０１から読出され、左半分（MUL  ♯20, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯30, R1）がＩ２ラッチ４０３に格納される。
（タイミングt3）・EXステージ：命令１
Ｄ１１ラッチ４０９に格納された値10が第１演算器４１３をそのまま通過し、汎用レジスタ４０６１のR0に格納されて命令１の左半分は終了する。一方、Ｄ１２ラッチ４１０に格納された値0が第２演算器４１４をそのまま通過し、突放しスイッチレジスタCR４０６２に格納されて命令１の右半分も終了する。
・DECステージ：命令２
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令２がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ１ラッチ４０２およびＤ１セレクタ４０７を経由して値20がＤ１１ラッチ４０９に、Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値30がＤ１２ラッチ４１０に格納される。汎用レジスタ４０６１のR0が読出されて、値10がＤ２１ラッチ４１１に格納される。
【００７０】
このとき、第１命令解読器４０４は、EXステージにおける命令２の処理が１サイクルのパイプライン伸長を伴うことを検出し、かつ突放しスイッチレジスタCR４０６２の値が0、即ち突放し処理を行わないことを示しているため、命令２のEXステージの２サイクル目であるタイミングt5ではパイプラインをインタロックさせる。
・IFステージ：命令３（SUB  ♯40, R0 : MOV  ♯1, CR）
命令１がROM４０１から読出され、左半分（SUB  ♯40, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯1, CR）がＩ２ラッチ４０３に格納される。
（タイミングt4）・EXステージ：命令２
Ｄ１１ラッチ４０９に格納された値20とＤ２１ラッチ４１１に格納された値10が第１演算器４１３において乗算されるが、乗算の実行には２サイクルを要するのでこのタイミングでは命令２の左半分は終了しない。一方、Ｄ１２ラッチ４１０に格納された値30が第２演算器４１４をそのまま通過し、汎用レジスタ４０６１のR1に格納されて命令２の右半分は終了する。
・DECステージ：命令３
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令３がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ１ラッチ４０２およびＤ１セレクタ４０７を経由して値40がＤ１１ラッチ４０９に、Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値1がＤ１２ラッチ４１０に格納される。汎用レジスタ４０６１のR0が読出されて、値10がＤ２１ラッチ４１１に格納される。
・IFステージ：命令４（ADD  R0, R0 : NOP）
命令１がROM４０１から読出され、左半分（ADD  R0, R0）がＩ１ラッチ４０２に、右半分（NOP）がＩ２ラッチ４０３に格納される。
（タイミングt5）・EXステージ：命令２
第１演算器４１３において乗算の２サイクル目が実行され、積の値200が汎用レジスタ４０６１のR0に格納されて命令２の右半分は終了する。
・DECステージ：インタロック
パイプラインがインタロックされているので新たな命令の解読は行わない。但し、汎用レジスタ４０６１のR0が再び読出されて、値200がＤ２１ラッチ４１１に上書きされる。
・IFステージ：インタロック
パイプラインがインタロックされているので新たな命令の読出しは行わない。
（タイミングt6）・EXステージ：命令３
Ｄ１１ラッチ４０９に格納された値40とＤ２１ラッチ４１１に格納された値200が第１演算器４１３において減算（200-40）され、結果の値160が汎用レジスタ４０６１のR0に格納されて命令３の右半分は終了する。一方、Ｄ１２ラッチ４１０に格納された値1が第２演算器４１４をそのまま通過し、突放しスイッチレジスタCR４０６２に格納されて命令３の右半分も終了する。
・DECステージ：命令４
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令４がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。汎用レジスタ４０６１のR0が読出されて、Ｄ１セレクタ４０７を経由して値160がＤ１１ラッチ４０９とＤ２１ラッチ４１１に格納される。
（タイミングt7）・EXステージ：命令４
Ｄ１１ラッチ４０９に格納された値160とＤ２１ラッチ４１１に格納された値160が第１演算器４１３において加算され、結果の値320が汎用レジスタ４０６１のR0に格納されて命令４の右半分は終了する。一方、第２演算器４１４は動作しないまま命令４の右半分も終了する。
２．２  プロセッサの動作例２
以下に、図９の機械命令プログラムがROM４０１に格納された場合における上記構成をもつプロセッサの動作について図１０および図１２を用いて説明する。
【００７１】
図１２は、図９の機械命令プログラムがROM４０１に格納された場合におけるプロセッサの動作タイミング図である。同図は、プロセッサの動作をパイプラインのIFステージ、DECステージ、EXステージで処理される命令をマシンサイクルと呼ばれるタイミング毎に示している。以下、時間が経過する順にタイミング毎にその動作を説明する。
（タイミングt1）・IFステージ：命令１（MOV  ♯10, R0 : MOV  ♯1, CR）
命令１がROM４０１から読出され、左半分（MOV  ♯10, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯1, CR）がＩ２ラッチ４０３に格納される。
（タイミングt2）・DECステージ：命令１
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令１がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ１ラッチ４０２およびＤ１セレクタ４０７を経由して値10がＤ１１ラッチ４０９に、Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値1がＤ１２ラッチ４１０に格納される。
・IFステージ：命令２（MUL  ♯20, R0 : MOV  ♯30, R1）
命令１がROM４０１から読出され、左半分（MUL  ♯20, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯30, R1）がＩ２ラッチ４０３に格納される。
（タイミングt3）・EXステージ：命令１
Ｄ１１ラッチ４０９に格納された値10が第１演算器４１３をそのまま通過し、汎用レジスタ４０６１のR0に格納されて命令１の左半分は終了する。一方、Ｄ１２ラッチ４１０に格納された値1が第２演算器４１４をそのまま通過し、突放しスイッチレジスタCR４０６２に格納されて命令１の右半分も終了する。
・DECステージ：命令２
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令２がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ１ラッチ４０２およびＤ１セレクタ４０７を経由して値20がＤ１１ラッチ４０９に、Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値30がＤ１２ラッチ４１０に格納される。汎用レジスタ４０６１のR0が読出されて、値10がＤ２１ラッチ４１１に格納される。
【００７２】
このとき、第１命令解読器４０４は、EXステージにおける命令２の処理が１サイクルのパイプライン伸長を伴うことを検出するが、突放しスイッチレジスタCR４０６２の値が1、即ち突放し処理を行うことを示しているため、命令２のEXステージの２サイクル目であるタイミングt5ではパイプラインをインタロックさせない。
・IFステージ：命令３（NOP : SUB  ♯40, R1）
命令３がROM４０１から読出され、左半分（NOP）がＩ１ラッチ４０２に、右半分（SUB  ♯40, R1）がＩ２ラッチ４０３に格納される。
（タイミングt4）・EXステージ：命令２
Ｄ１１ラッチ４０９に格納された値20とＤ２１ラッチ４１１に格納された値10が第１演算器４１３において乗算されるが、乗算の実行には２サイクルを要するのでこのタイミングでは命令２の左半分は終了しない。一方、Ｄ１２ラッチ４１０に格納された値30が第２演算器４１４をそのまま通過し、汎用レジスタ４０６１のR1に格納されて命令２の右半分は終了する。
・DECステージ：命令３
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令３がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値40がＤ１２ラッチ４１０に格納される。汎用レジスタ４０６１のR1が読出されて、値30がＤ２２ラッチ４１２に格納される。
・IFステージ：命令４（ADD  R0, R0 : MOV  ♯50, R2）
命令１がROM４０１から読出され、左半分（ADD  R0, R0）がＩ１ラッチ４０２に、右半分（MOV  ♯50, R2）がＩ２ラッチ４０３に格納される。
（タイミングt5）・EXステージ：命令２と命令３
第１演算器４１３において乗算の２サイクル目が実行され、積の値200が汎用レジスタ４０６１のR0に格納されて命令２の右半分は終了する。
【００７３】
Ｄ１２ラッチ４１０に格納された値40とＤ２２ラッチ４１２に格納された値30が第１演算器４１３において減算（30-40）され、結果の値-10が汎用レジスタ４０６１のR1に格納されて命令３の右半分は終了する。命令３の左半分は無動作なので何もせず終了する。
・DECステージ：命令４
Ｉ１ラッチ４０２とＩ２ラッチ４０３に格納された命令４がそれぞれ第１命令解読器４０４と第２命令解読器４０５で解読される。汎用レジスタ４０６１のR0が読出されて、Ｄ１セレクタ４０７を経由して値200がＤ１１ラッチ４０９とＤ２１ラッチ４１１に格納される。Ｉ２ラッチ４０３およびＤ２セレクタ４０８を経由して値50がＤ１２ラッチ４１０に格納される。
（タイミングt6）・EXステージ：命令４
Ｄ１１ラッチ４０９に格納された値160とＤ２１ラッチ４１１に格納された値200が第１演算器４１３において加算され、結果の値360が汎用レジスタ４０６１のR0に格納されて命令４の右半分は終了する。一方、Ｄ１２ラッチ４１０に格納された値50が第２演算器４１４をそのまま通過し、汎用レジスタ４０６１のR2に格納されて命令４の右半分も終了する。
３．記録媒体
本発明の記録媒体の実施の形態として、図１の機械命令プログラム１１０を記録した磁気ディスク（フロッピー（Ｒ）ディスクやハードディスクなど）、光ディスク（CD-ROMやPDなど）、光磁気ディスク、半導体メモリ（ROMやフラッシュメモリなど）がある。
【００７４】
以上のように本実施の形態によれば、コンパイラが、パイプライン伸長を引き起こす可能性のある命令の後に依存関係のない命令を並び替えることができない場合には予め突放し処理を禁止する命令を生成することで、無動作（NOP）命令をインタロックのサイクルに応じた数だけ挿入することによるコードサイズの増加が軽減される。また、パイプライン伸長を引き起こす可能性のある命令の後に依存関係のない命令を並び替えることができる場合には予め突放し処理を許可する命令を生成することで、プロセッサは突放し処理を行い性能が向上する。プロセッサには、上記の命令に従って突放し処理を行うか否かだけを判断する機構だけを備えればよく、命令間の依存関係を調べるためのハードウェアは必要ない。従ってハードウェアのコストの増大が極小に抑えられる。
【００７５】
また本実施の形態によれば、突放し処理を禁止する命令あるいは許可する命令をVLIW形式のプロセッサの本質的課題である無動作スロット（並列に実行できる命令を定義できない無効なNOP命令の領域）を利用して挿入しているため、これらの命令をコンパイラが生成することによるコードサイズの増加や、これらの命令をプロセッサが実行することによる実行時間の伸長は全くない。
【００７６】
以上、本発明に係るコンパイラ及びプロセッサについて、実施形態に基づいて説明したが、本発明はこれら実施形態に限られないことは勿論である。即ち、（１）実施形態では、VLIW形式のプロセッサとしているが、１つの命令で１つの操作を定義するVLIW形式でないプロセッサでもよい。その場合コンパイラは、突放し処理を禁止する命令あるいは許可する命令を挿入することで増加するコードと、インタロックのために必要とされる無動作（NOP）命令の挿入のコード増加とを比べ、増加が小さくなるようにすればより効率が高くなる。
（２）実施形態では、突放しスイッチレジスタCR４０６２を設け、この内容を第１命令解読器４０４と第２命令解読器４０５とにフィードバックして突放し処理を行うか否かを制御しているが、パイプライン伸長を引き起こす命令の全てあるいは一部の各々について、突放し処理を行うタイプと行わないタイプとを定義してもよい。例えば乗算について、突放し処理を行うMULA命令と突放し処理を行わないMULB命令を定義し、コンパイラは図６のような場合にはMULB命令を生成し、図９のような場合にはMULA命令を生成するようにする。プロセッサはこれらを解読して識別する。
【００７７】
こうすれば、利用できる無動作スロットがほとんどないといった極めて並列性の高いプログラムや、上記（１）に記載した元来、無動作スロットがないプロセッサにおいては、突放し処理を禁止する命令あるいは許可する命令を挿入する必要がないのでコードサイズの増加が抑止され有用である。
（３）実施形態では、突放しスイッチレジスタCR４０６２に0または1を書き込む命令をインタロックを引き起こす命令の直前、直後に配置しているが、それぞれインタロックを引き起こす命令から離れた位置に配置してもよい。こうすることにより無動作スロットはより一層効果的に利用できる。
（４）実施形態および上記（２）では、乗算におけるパイプライン伸長を対象としているが、その他の演算による伸長、ロードやストアによる伸長など何でもよい。
（５）実施形態では、コンパイラが、中間コードの１つ前のop部分が伸長することを判断し、機械命令生成部がop部分とnop部分とを入れ換えているが、構文解析部がop部分とnop部分とを入れ換えた中間コードを生成するようにしてもよいし、コンパイラにおいては全く入れ換えず、プロセッサにおいて伸長しているスロットと空きスロットとを識別して命令のNOPでない部分を空きスロットの方に入れ換えるようにしてもよい。
（６）実施形態では、突放しスイッチレジスタCR４０６２への書き込みをEXステージ、即ち、第１演算器４１３または第２演算器４１４を経由して行っているが、DECステージで書き込むようにしてもよい。つまり、第１命令解読器４０４または第２命令解読器４０５が突放しスイッチレジスタCR４０６２への書き込み命令を検出すると直接、突放しスイッチレジスタCR４０６２に値を書き込む。
（７）実施形態では、コンパイラはＣ言語プログラムの連続する２つの行を見て並列実行できるか否かを判断しているが、さらに広域的に行を見渡して並列実行できる行を抽出し並び替えるようにしてもよい。
（８）実施形態では、無動作スロットに突放し処理を禁止する命令あるいは許可する命令を挿入しているが、無動作スロットにプロセッサを制御する他の命令、例えばプロセッサの状態を変える命令やメモリアクセスの仕方を定義する命令などを挿入することも本発明の思想に含む。
【００７８】
【発明の効果】
以上の説明から明らかなように、本発明に係るコンパイラは、高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２の機械命令を生成し、前記コードが検出された場合に、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置される場合には、前記第１の機械命令に突放し処理を行わせる第３の機械命令を生成する機械命令生成手段とを備えることを特徴とする。
【００７９】
これによって、依存関係のない命令が配置されない場合はパイプラインをインタロックさせることで、第１の機械命令の実行の終了を待たせるための機械命令を挿入する必要がなくなり、コードサイズの増加が軽減される。
【００８０】
ここで、前記機械命令生成手段は、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が小さいかまたは等しい場合に限って、前記第２の機械命令を生成するようにしてもよい。
【００８１】
または、前記機械命令生成手段は、前記第１の機械命令と依存関係のない他の機械命令が前記第１の機械命令に後続して配置されない場合でも、前記第１の機械命令に突放し処理を行わせて該機械命令に後続する機械命令が実行されるとした場合に必要とする、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令の大きさと、前記第２の機械命令の大きさとを比較し、前記第２の機械命令の大きさの方が大きいかまたは等しい場合は、前記第３の機械命令と、前記第１の機械命令の実行の終了を待たせるための１つ以上の機械命令とを生成するとしてもよい。
【００８２】
これらによって、挿入される第１の機械命令の実行の終了を待たせるための機械命令の大きさと第２の機械命令の大きさとが精密に比較され、コードサイズの増加が抑止される。
【００８３】
上記の各コンパイラは、前記機械命令生成手段は、前記第２の機械命令または前記第３の機械命令を、前記第１の機械命令に先行して配置するようにしてもよい。
【００８４】
これによって、一層、コードサイズの増加が抑止される。
【００８５】
また本発明に係るコンパイラは、並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する第１のオペレーションと依存関係のない他のオペレーションが前記第１のオペレーションを含む第１の機械命令に後続して配置されない場合には、前記第１の機械命令に突放し処理を行わせない第２のオペレーションを生成し、前記コードが検出された場合に、前記第１のオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、前記第１のオペレーションに突放し処理を行わせる第３のオペレーションを生成する機械命令生成手段とを備えることを特徴とする。
【００８６】
ここで、前記機械命令生成手段は、並列実行させる有益なオペレーションが指定できない第１のオペレーションフィールドがある場合に、無動作のオペレーションを指定する代わりに前記第２のオペレーションまたは前記第３のオペレーションを前記第１のオペレーションフィールドに指定する機械命令を生成するとしてもよい。
【００８７】
これによって、無動作のオペレーションを指定するオペレーションフィールドが削減され、結果としてコードサイズが削減できる。
【００８８】
また、これによって、元来、無動作のオペレーションを指定せざるを得なかったオペレーションフィールドが有効に活用できるばかりでなく、第１の機械命令の実行の終了を待たせるための機械命令との大きさの比較を本質的には行うことなく、コードサイズの増加の抑止が達成される。
【００８９】
さらに、前記機械命令生成手段は、前記第２のオペレーションを含む第２の機械命令または第３のオペレーションを含む第３の機械命令を、前記第１の機械命令に先行して配置するとしてもよい。
【００９０】
または、前記機械命令生成手段は、依存関係のないオペレーションが配置される場合には、前記第１の機械命令に後続する機械命令の、前記第１のオペレーションを指定するオペレーションフィールドと異なるオペレーションフィールドに、前記依存関係のないオペレーションを指定するとしてもよい。
【００９１】
これによって、指定されたオペレーションと第１のオペレーションとが並列に実行され、性能が向上する。
【００９２】
また、本発明に係るコンパイラは高級言語プログラムから、パイプライン処理を行うプロセッサを対象とする機械命令プログラムを生成するコンパイラであって、前記高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置されない場合には、該コードに対応する機械命令であってかつ突放し処理を行わない第１の機械命令を生成し、前記コードが検出された場合に、該コードに対応する機械命令と依存関係のない他の機械命令が該コードに対応する機械命令に後続して配置される場合には、該コードに対応する機械命令であってかつ突放し処理を行う第２の機械命令を生成する機械命令生成手段とを備えることを特徴とする。
【００９３】
また、本発明に係るコンパイラは、並列実行させるオペレーションを指定する複数のオペレーションフィールドを含むＶＬＩＷ方式の機械命令を実行しパイプライン処理を行うプロセッサを対象とするコンパイラであって、入力された高級言語プログラム中から前記パイプラインの実行ステージを伸長させるコードを検出するインタロックコード検出手段と、前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが該コードに対応するオペレーションを含む第１の機械命令に後続して配置されない場合には、該コードに対応するオペレーションであってかつ突放し処理を行わない第１のオペレーションを生成し、前記コードが検出された場合に、該コードに対応するオペレーションと依存関係のない他のオペレーションが前記第１の機械命令に後続して配置される場合には、該コードに対応するオペレーションであってかつ突放し処理を行う第２のオペレーションを生成する機械命令生成手段とを備えることを特徴とする。
【００９４】
上述したように、本発明に係るコンパイラおよび命令生成方法は、コードサイズの増加を低く抑え、かつ、効率よくインタロックを制御する技術であるので、特にマルチメディア関連の製品開発において非常に有用であり、マルチメディア関連産業の進歩発展に多大な貢献をするものである。
【図面の簡単な説明】
【図１】実施形態に係るコンパイラの構成を示すブロック図
【図２】同実施形態に係るコンパイラの構文解析部の処理フローを示したフローチャート
【図３】同実施形態に係るコンパイラの機械命令生成部の処理フローを示したフローチャート
【図４】１つ目のＣ言語のプログラムを示した図
【図５】図４に示すＣ言語プログラムを入力として与えた場合に、同実施形態に係るコンパイラの中間コード用バッファに格納された中間コードプログラムを示したリストを示す図
【図６】図４に示すＣ言語プログラムを入力として与えた場合に、同実施形態に係るコンパイラにより生成された機械命令プログラムを示したリストを示す図
【図７】２つ目のＣ言語のプログラムを示した図
【図８】図７に示すＣ言語プログラムを入力として与えた場合に、同実施形態に係るコンパイラの中間コード用バッファに格納された中間コードプログラムを示したリストを示す図
【図９】図７に示すＣ言語プログラムを入力として与えた場合に、同実施形態に係るコンパイラにより生成された機械命令プログラムを示したリストを示す図
【図１０】同実施形態に係るプロセッサの概略構成図
【図１１】図６の機械命令プログラムに対応したプロセッサの動作タイミング図
【図１２】図９の機械命令プログラムに対応したプロセッサの動作タイミング図
【図１３】第１の従来技術におけるプロセッサの動作タイミング図
【図１４】第２の従来技術におけるプロセッサの動作タイミング図
【符号の説明】
１０１  Ｃ言語プログラム
１０２  コンパイラ
１０３  ファイル読込部
１０４  読込用バッファ
１０５  構文解析部
１０６  中間コード用バッファ
１０７  機械命令生成部
１０８  出力用バッファ
１０９  ファイル出力部
１１０  機械命令プログラム
４０１  ROM
４０２  Ｉ１ラッチ
４０３  Ｉ２ラッチ
４０４  第１命令解読器
４０５  第２命令解読器
４０６  レジスタファイル
４０７  Ｄ１セレクタ
４０８  Ｄ２セレクタ
４０９  Ｄ１１ラッチ
４１０  Ｄ１２ラッチ
４１１  Ｄ２１ラッチ
４１２  Ｄ２２ラッチ
４１３  第１演算器
４１４  第２演算器
４０６１  汎用レジスタ（R0〜R7）
４０６２  突放しスイッチレジスタ（CR）
【図１】
0003603895.tif 000002
【図２】
0003603895.tif 000003
【図３】
0003603895.tif 000004
【図４】
0003603895.tif 000005
【図５】
0003603895.tif 000006
【図６】
0003603895.tif 000007
【図７】
0003603895.tif 000008
【図８】
0003603895.tif 000009
【図９】
0003603895.tif 000010
【図１０】
0003603895.tif 000011
【図１１】
0003603895.tif 000012
【図１２】
0003603895.tif 000013
【図１３】
0003603895.tif 000014
【図１４】
0003603895.tif 000015