(57)【要約】【課題】プロセッサが備える高機能な専用命令を効率的に生成することができ、かつ、コンパイラ自身のバージョンアップを頻繁に繰り返すことなく、機能拡張等の改良を行っていくことが可能なコンパイラを提供する。【解決手段】ソースプログラム１０１にインクルードされる演算子定義ファイル１０２等と、ソースプログラム１０１を機械語プログラム１０５に翻訳するコンパイラとから構成され、演算子定義ファイル１０２にはクラス定義による各種固定小数点型の演算子の定義が含まれ、コンパイラ１００は、中間コードを生成する中間コード生成部１２１と、演算子定義ファイル１０２で定義されたクラスを参照している中間コードを機械語命令に置き換える機械語命令置換部１２２と、置き換えられた機械語命令を含む中間コードを対象として最適化を行う最適化部１３０等を備える。【選択図】　　　　図３７
2004070531.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムを機械語プログラムに翻訳するコンパイラ用のプログラムであって、
対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報を含み、
前記プログラムは、
前記ソースプログラムを解析するパーサーステップと、
解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、
変換された中間コードを最適化する最適化ステップと、
最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、
前記中間コード変換ステップは、
前記中間コードのうち、前記演算処理定義情報で定義された演算処理を参照しているものがあるか否かを検出する検出サブステップと、
あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、
前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行う
ことを特徴とするプログラム。
【請求項２】
前記演算処理定義情報は、前記ソースプログラムにインクルードされるヘッダファイルであり、
前記ヘッダファイルには、データとメソッドとからなるクラスによって前記演算処理が定義され、
前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義されたクラスを参照しているものがあるか否かを検出することによって、前記演算処理を参照するしているものがあるか否かを検出する
ことを特徴とする請求項１記載のプログラム。
【請求項３】
前記クラスは、固定小数点型を定義するクラスであり、
前記検出サブステップでは、前記固定小数点型のデータを使用している中間コードを検出する
ことを特徴とする請求項２記載のプログラム。
【請求項４】
前記クラスのメソッドは、前記固定小数点型のデータを対象とする演算子を定義するメソッドであり、
前記検出サブステップでは、演算子と演算の対象となるデータの型との組が前記メソッドでの定義と一致するか否かによって前記検出をし、
前記置換サブステップでは、前記演算子と前記データの型との組が一致する中間コードを、対応する機械語命令に置き換える
ことを特徴とする請求項３記載のプログラム。
【請求項５】
前記クラスは、ＳＩＭＤ型を定義するクラスであり、
前記検出サブステップでは、前記ＳＩＭＤ型のデータを使用している中間コードを検出する
ことを特徴とする請求項２記載のプログラム。
【請求項６】
前記クラスのメソッドは、前記ＳＩＭＤ型のデータを対象とする演算子を定義するメソッドであり、
前記検出サブステップでは、演算子と演算の対象となるデータの型との組が前記メソッドでの定義と一致するか否かによって前記検出をし、
前記置換サブステップでは、前記演算子と前記データの型との組が一致する中間コードを、対応する機械語命令に置き換える
ことを特徴とする請求項５記載のプログラム。
【請求項７】
前記クラスには、対応する処理を実現する１つの機械語命令が対応づけられ、
前記置換サブステップでは、前記中間コードを、前記クラスに対応づけられた１つの機械語命令に置き換える
ことを特徴とする請求項２〜６のいずれか１項に記載のプログラム。
【請求項８】
前記クラスには、対応する処理を実現する２以上の機械語命令が対応づけられ、
前記置換サブステップでは、前記中間コードを、前記クラスに対応づけられた２以上の機械語命令に置き換える
ことを特徴とする請求項２〜６のいずれか１項に記載のプログラム。
【請求項９】
前記演算処理定義情報は、前記ソースプログラムにインクルードされるヘッダファイルであり、
前記ヘッダファイルには、関数によって前記演算処理が定義され、
前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義された関数を参照しているものがあるか否かを検出することによって、前記演算処理を参照するしているものがあるか否かを検出する
ことを特徴とする請求項１記載のプログラム。
【請求項１０】
前記関数は、対応する処理を実現する１つの機械語命令が記述された関数であり、
前記置換サブステップでは、前記中間コードを前記関数に記述された１つの機械語命令に置き換える
ことを特徴とする請求項９記載のプログラム。
【請求項１１】
前記関数には、入力データの最上位ビットから０が連続するビット数を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値について、最上位ビットから０が連続するビット数を数え、その結果を第２レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１２】
前記関数には、入力データの最上位ビットから１が連続するビット数を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値について、最上位ビットから１が連続するビット数を数え、その結果を第２レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１３】
前記関数には、入力データの最上位ビットと同じ値が連続するビット数を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値について、最上位ビットと同じ値が連続するビット数を数え、その結果を第２レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１４】
前記関数は、入力データの最上位ビットと同じ値が最上位ビットの次から何ビット連続するかを返す関数であり、
前記関数に記述されている機械語命令は、第１レジスタに格納された値について、最上位ビットと同じ値が最上位ビットの次から何ビット連続するかを数え、その結果を第２レジスタに格納する機械語命令である
ことを特徴とする請求項１３記載のプログラム。
【請求項１５】
前記関数には、入力データ中に含まれる１のビット数を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値について、１のビット数を数え、その結果を第２レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１６】
前記関数には、入力データから、指定されたビット位置のビットを抽出し、符号拡張した値を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値から、第２レジスタで指定されたビット位置のビットを取り出し、符号拡張して第３レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１７】
前記関数には、入力データから、指定されたビット位置のビットを抽出し、ゼロ拡張した値を返す関数が含まれ、
前記関数に記述されている機械語命令は、第１レジスタに格納された値から、第２レジスタで指定されたビット位置のビットを取り出し、ゼロ拡張して第３レジスタに格納する機械語命令である
ことを特徴とする請求項１０記載のプログラム。
【請求項１８】
前記関数は、対応する処理を実現する２以上の機械語命令からなる機械語命令列が記述された関数であり、
前記置換サブステップでは、前記中間コードを前記関数に記述された機械語命令列に置き換える
ことを特徴とする請求項９記載のプログラム。
【請求項１９】
前記関数には、モジュロアドレッシングのアドレス更新をする関数が含まれる
ことを特徴とする請求項１８記載のプログラム。
【請求項２０】
前記関数に記述されている機械語命令列には、第１レジスタに格納された値の所定のビットフィールドを第２レジスタに格納された値で置き換えることによって得られる値を第３レジスタに格納する機械語命令が含まれる
ことを特徴とする請求項１９記載のプログラム。
【請求項２１】
前記関数には、ビットリバースアドレッシングのアドレス更新をする関数が含まれる
ことを特徴とする請求項１８記載のプログラム。
【請求項２２】
前記関数に記述されている機械語命令列には、第１レジスタに格納された値の所定のビットフィールドをビット単位で位置反転することによって得られる値を第３レジスタに格納する機械語命令が含まれる
ことを特徴とする請求項２１記載のプログラム。
【請求項２３】
前記関数には、最適化におけるレジスタ割り付けの対象となる汎用レジスタに加えて、レジスタ割り付けの対象とならないアキュムレータも更新する演算であって、アキュムレータを参照型として一時変数を指定することが可能な関数が含まれる
ことを特徴とする請求項９記載のプログラム。
【請求項２４】
前記関数は、乗算を行う関数であって、乗算結果を格納するアキュムレータを参照型として一時変数を指定することが可能な関数である
ことを特徴とする請求項２３記載のプログラム。
【請求項２５】
前記関数は、乗算を行う関数であって、乗算結果を格納するアキュムレータを参照型として一時変数を指定することが可能な関数である
ことを特徴とする請求項２３記載のプログラム。
【請求項２６】
前記置換サブステップでは、前記関数を参照している中間コードを、当該関数の引数の種類に対応した種類のオペランドを持つ機械語命令に置き換える
ことを特徴とする請求項９記載のプログラム。
【請求項２７】
前記置換サブステップでは、
前記関数関数の引数がすべて定数である場合には、それらの定数を畳み込んで得られる定数値をオペランドを持つ機械語命令に置き換え、
前記関数関数の引数の一部が定数である場合には、即値オペランドを持つ機械語命令に置き換え、
前記関数関数の引数がすべて変数である場合には、レジスタオペランドを持つ機械語命令に置き換える
ことを特徴とする請求項２６記載のプログラム。
【請求項２８】
前記最適化ステップは、異なる型間の演算を行う複数の中間コード又は複数の機械語命令を、当該演算を行う１つの機械語命令に置き換える型変換最適化サブステップを含む
ことを特徴とする請求項１記載のプログラム。
【請求項２９】
前記型変換サブステップでは、ｎビットの２つの変数を乗算し、結果を２ｎビットの変数に格納する演算を行う複数の中間コード又は複数の機械語命令を、当該演算を行う１つの機械語命令に置き換える
ことを特徴とする請求項２８記載のプログラム。
【請求項３０】
前記型変換サブステップでは、前記２つの変数に対して、ｎビットから２ｎビットに型変換する明示的な宣言がなされている場合に、前記演算を前記機械語命令に置き換える
ことを特徴とする請求項２９記載のプログラム。
【請求項３１】
前記コンパイラは、２以上の固定小数点型を対象として演算する２以上の固定小数点モードを備えるプロセッサを対象し、
前記パーサーステップでは、前記固定小数点モードを切り替える旨の記述を前記ソースプログラムにおいて検出し、
前記コンパイラは、さらに、
前記パーサーステップにおいて前記固定小数点モードを切り替える旨の記述が検出された場合に、その記述に従って、固定小数点モードを切り替えるための機械語命令を挿入する固定小数点モード切替ステップを含む
ことを特徴とする請求項１記載のプログラム。
【請求項３２】
前記固定小数点モードを切り替える旨の記述は、対象となる関数に対応づけられ、
前記固定小数点モード切替ステップでは、対応する関数の先頭及び末尾に、それぞれ、固定小数点モードの退避及び復帰に相当する機械語命令を挿入する
ことを特徴とする請求項３１記載のプログラム。
【請求項３３】
前記最適化ステップは、前記ソースプログラムにおいて、特定箇所での実行時間が所定サイクル数だけ確保されるようなレイテンシを指定する旨の記述を検出し、検出した指定に従って、前記レイテンシが確保されるように機械語命令のスケジューリングを行うレイテンシ最適化サブステップを含む
ことを特徴とする請求項１記載のプログラム。
【請求項３４】
前記レイテンシ最適化サブステップでは、第１ラベルが付された第１機械語命令と第２レベルが付された第２機械語命令間を対象とした一定サイクル数のレイテンシを指定する旨の記述を検出すると、前記第１機械語命令が実行されてから前記第２機械語命令が実行されるまでに前記サイクル数だけ実行時間がかかるように、前記スケジューリングを行う
ことを特徴とする請求項３３記載のプログラム。
【請求項３５】
前記レイテンシ最適化サブステップでは、所定のレジスタへのアクセスを対象とした一定サイクル数のレイテンシを指定する旨の記述を検出すると、前記レジスタにアクセスする機械語命令が実行されてから次に当該レジスタにアクセスする機械語命令が実行されるまでに前記サイクル数だけ実行時間がかかるように、前記スケジューリングを行う
ことを特徴とする請求項３３記載のプログラム。
【請求項３６】
前記コンパイラは、さらに、前記演算処理定義情報で使用されている機械語命令を当該コンパイラが対象としている第１プロセッサとは異なる第２プロセッサの機械語命令に置き換えるためのクラスライブラリを備える
ことを特徴とする請求項１記載のプログラム。
【請求項３７】
コンパイラの対象となるソースプログラムにインクルードされるヘッダファイルが記録されたコンピュータ読み取り可能な記録媒体であって、
請求項２〜３６のいずれか１項に記載されたヘッダファイルが記録された記録媒体。
【請求項３８】
コンパイラの対象となるソースプログラムにインクルードされるクラスライブラリが記録されたコンピュータ読み取り可能な記録媒体であって、
請求項３６に記載されたクラスライブラリが記録された記録媒体。
【請求項３９】
コンパイラの対象となるソースプログラムが記録されたコンピュータ読み取り可能な記録媒体であって、
請求項２〜３６のいずれか１項に記載されたヘッダファイル及びクラスライブラリの少なくとも１つをインクルードしているソースプログラムが記録された記録媒体。
【請求項４０】
ソースプログラムを機械語プログラムに翻訳するコンパイラ装置であって、
対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報を保持する手段と、
前記ソースプログラムを解析するパーサー手段と、
解析されたソースプログラムを中間コードに変換する中間コード変換手段と、
変換された中間コードを最適化する最適化手段と、
最適化された中間コードを機械語命令に変換するコード生成手段とを備え、
前記中間コード変換手段は、
前記中間コードのうち、前記演算処理定義情報で定義された演算処理を参照しているものがあるか否かを検出する検出部と、
あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換部とを含み、
前記最適化手段は、前記置換部で置き換えられた機械語命令を含む前記中間コードを対象として最適化を行う
ことを特徴とするコンパイラ装置。
【請求項４１】
ソースプログラムを機械語プログラムに翻訳するコンパイル方法であって、
前記プログラムは、
前記ソースプログラムを解析するパーサーステップと、
解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、
変換された中間コードを最適化する最適化ステップと、
最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、
前記中間コード変換ステップは、
前記中間コードのうち、対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報において定義された演算処理を参照しているものがあるか否かを検出する検出サブステップと、
あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、
前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行う
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、Ｃ＋＋言語等の高級言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラに関し、特に、コンパイラによる最適化に関する。
【０００２】
【従来の技術】
近年のプロセッサの高機能化に伴い、プロセッサが備える高い機能を有効に引き出すことが可能な性能の高いコンパイラが求められている。つまり、ターゲットプロセッサが備える高機能な専用命令を効率的に生成するコンパイラが求められている。
【０００３】
例えば、デジタル信号処理等のメディア処理に必要とされる各種固定小数点フォーマットでの演算命令を実行するプロセッサや、ＳＩＭＤ（Ｓｉｎｇｌｅ　Ｉｎｓｔｒｕｃｔｉｏｎ　Ｍｕｌｔｉｐｌｅ　Ｄａｔａ）型の命令を実行する高機能なプロセッサが開発されているが、そのようなプロセッサをターゲットとするコンパイラは、各種固定小数点フォーマットでの演算命令やＳＩＭＤ型命令を効率的に生成することによってコードサイズ及び実行速度の点で最適化を図ることが求められる。
【０００４】
【発明が解決しようとする課題】
しかしながら、従来のコンパイラは、Ｃ＋＋言語等の高級言語で記述されたソースプログラムに対しては、必ずしも、プロセッサが備える高機能な専用命令を効率的に生成しているとは言えない。そのために、コードサイズと実行速度の点で厳しい条件が求められるメディア処理等のアプリケーション開発においては、ユーザは、クリティカルな箇所については、アセンブラ命令で記述せざるを得ないのが現状である。ところが、アセンブラ命令でのプログラミングは、Ｃ＋＋言語等の高級言語を用いた開発に比べ、開発工数が大きくなるだけでなく、保守性や移植性についても著しく劣るという問題がある。
【０００５】
また、従来のコンパイラでは、プロセッサが備える高機能な専用命令を生成する等の最適化処理は、コンパイラ自身に組み込まれている。つまり、ターゲットプロセッサの特徴を有効に活用して最適化を図る処理モジュールは、コンパイラ自身に組み込まれ、一体化されている。そのために、コンパイラの機能拡張を図る場合や、ターゲットプロセッサの仕様が変更された場合等においては、コンパイラ全体の再構築が必要とされ、その度に、コンパイラのバージョンアップ等を繰り返さなければならないという問題がある。
【０００６】
そこで、本発明は、このような状況に鑑みてなされたものであり、プロセッサが備える高機能な専用命令を効率的に生成することができるコンパイラを提供することを目的とする。
また、コンパイラ自身のバージョンアップを頻繁に繰り返すことなく、機能拡張等の改良を行っていくことが可能なコンパイラ等を提供することをも目的とする。
【０００７】
【課題を解決するための手段】
上記目的を達成するために、本発明に係るコンパイラ用プログラムは、ソースプログラムを機械語プログラムに翻訳するコンパイラ用のプログラムであって、対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報を含み、前記プログラムは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記演算処理定義情報で定義された演算処理を参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うことを特徴とする。
【０００８】
例えば、本発明は、ソースプログラムにインクルードされるヘッダファイルと、そのソースプログラムを機械語プログラムに翻訳するコンパイラとから構成されるプログラムであって、前記ヘッダファイルには、データとメソッドとからなるクラスが定義され、前記コンパイラは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義されたクラスを参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うプログラムである。
【０００９】
ここで、前記クラスは、固定小数点型を定義するクラスであり、前記検出サブステップでは、前記固定小数点型のデータを使用している中間コードを検出してもよい。そして、前記クラスのメソッドは、前記固定小数点型のデータを対象とする演算子を定義するメソッドであり、前記検出サブステップでは、演算子と演算の対象となるデータの型との組が前記メソッドでの定義と一致するか否かによって前記検出をし、前記置換サブステップでは、前記演算子と前記データの型との組が一致する中間コードを、対応する機械語命令に置き換えてもよい。
【００１０】
また、本発明に係るコンパイラ用プログラムは、ソースプログラムにインクルードされるヘッダファイルと、そのソースプログラムを機械語プログラムに翻訳するコンパイラとから構成されるプログラムであって、前記ヘッダファイルには、関数が定義され、前記コンパイラは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義された関数を参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うことを特徴とする。
【００１１】
なお、本発明は、このようなコンパイラ用プログラムとして実現することができるだけでなく、このようなプログラムに含まれるステップを手段とするコンパイラ装置として実現したり、このような特徴的なコンパイラあるいはヘッダファイルが記録されたコンピュータ読み取り可能な記録媒体として実現することもできる。そして、そのようなプログラムやデータファイルは、ＣＤ−ＲＯＭ等の記録媒体やインターネット等の伝送媒体を介して広く流通させることができるのは言うまでもない。
【００１２】
【発明の実施の形態】
以下、本発明に係るコンパイラの実施の形態について図面を用いて詳細に説明する。
本実施の形態におけるコンパイラは、Ｃ／Ｃ＋＋言語等の高級言語で記述されたソースプログラムを特定のプロセッサ（ターゲット）が実行できる機械語プログラムに翻訳するクロスコンパイラであり、生成する機械語プログラムのコードサイズや実行時間に関する最適化の指示をきめ細かく指定することができるという特徴を有する。
【００１３】
［プロセッサ］
まず、本実施の形態におけるコンパイラの対象となるプロセッサの一例について、図１〜図３６を用いて説明する。
本実施の形態におけるコンパイラの対象となるプロセッサは、例えば、通常のマイコンに比べて実行可能な命令の並列性が高く、ＡＶメディア系信号処理技術分野をターゲットとして開発された汎用プロセッサである。
【００１４】
図１は、そのようなプロセッサの概略ブロック図の一例である。このプロセッサ１は、３２ビットを基本語長（ワード）とする演算装置であり、命令制御部１０、デコード部２０、レジスタファイル３０、演算部４０、Ｉ／Ｆ部５０、命令メモリ部６０、データメモリ部７０、拡張レジスタ部８０及びＩ／Ｏインターフェース部９０から構成される。演算部４０は、ＳＩＭＤ型命令の演算を実行する算術論理・比較演算器４１〜４３、乗算・積和演算器４４、バレルシフタ４５、除算器４６及び変換器４７からなる。乗算・積和演算器４４は、ビット精度を落とさないように、最長で６５ビットで累算する。また、乗算・積和演算器４４は、算術論理・比較演算器４１〜４３と同様、ＳＩＭＤ型命令の実行が可能である。更に、このプロセッサ１は、算術論理・比較演算命令が最大３並列実行可能である。
【００１５】
図２は、算術論理・比較演算器４１〜４３の概略図を示す。算術論理・比較演算器４１〜４３それぞれは、ＡＬＵ部４１ａ、飽和処理部４１ｂ及びフラグ部４１ｃから構成される。ＡＬＵ部４１ａは、算術演算器、論理演算器、比較器、ＴＳＴ器からなる。対応する演算データのビット幅は、８ビット（バイト。このときは、演算器を４並列で使用）、１６ビット（ハーフワード。このときは、演算器を２並列で使用）、３２ビットである（ワード。このときは、全演算器で３２ビットデータ処理）。更に算術演算結果に対しては、フラグ部４１ｃ等により、オーバーフローの検出とコンディションフラグの生成が行われる。各演算器、比較器、ＴＳＴ器の結果は、算術右シフト、飽和処理部４１ｂによる飽和、最大・最小値検出、絶対値生成処理が行われる。
【００１６】
図３は、バレルシフタ４５の構成を示すブロック図である。バレルシフタ４５は、セレクタ４５ａ、４５ｂ、上位バレルシフタ４５ｃ、下位バレルシフタ４５ｄ及び飽和処理部４５ｅから構成され、データの算術シフト（２の補数体系のシフト）または、論理シフト（符号なしシフト）を実行する。通常は、３２ビットもしくは、６４ビットのデータを入出力としている。レジスタ３０ａ、３０ｂに格納された被シフトデータに対して、別のレジスタまたは即値でシフト量が指定される。データは、左６３ビット〜右６３ビットの算術または論理シフトが行われ、入力ビット長で出力される。
【００１７】
また、バレルシフタ４５は、ＳＩＭＤ型命令に対して、８、１６、３２、６４ビットのデータをシフトすることができる。例えば、８ビットデータのシフトを４並列で処理することができる。
【００１８】
算術シフトは、２の補数体系のシフトであり、加算や減算時の小数点の位置合わせや、２のべき乗の乗算（２、２の２乗、２の（−１）乗、２の（−２）乗倍など）等のために行われる。
【００１９】
図４は、変換器４７の構成を示すブロック図である。変換器４７は、飽和ブロック（ＳＡＴ）４７ａ、ＢＳＥＱブロック４７ｂ、ＭＳＫＧＥＮブロック４７ｃ、ＶＳＵＭＢブロック４７、ＢＣＮＴブロック４７ｅ及びＩＬブロック４７ｆから構成される。
【００２０】
飽和ブロック（ＳＡＴ）４７ａは、入力データに対する飽和処理を行う。３２ビットデータを飽和処理するブロックを２つ持つことにより、２並列のＳＩＭＤ型命令をサポートする。
【００２１】
ＢＳＥＱブロック４７ｂは、ＭＳＢから連続する０か１をカウントする。
ＭＳＫＧＥＮブロック４７ｃは、指定されたビット区間を１、それ以外を０として出力する。
ＶＳＵＭＢブロック４７ｄは、入力データを指定されたビット幅に区切り、その総和を出力する。
ＢＣＮＴブロック４７ｅは、入力データで１となっているビットの数をカウントする。
ＩＬブロック４７ｆは、入力データを指定されたビット幅に区切り、各データブロックを入れ換えた値を出力する。
【００２２】
図５は、除算器４６の構成を示すブロック図である。除算器４６は、被除数を６４ビット、除数を３２ビットとし、商と剰余を３２ビットずつ出力する。商と剰余を求めるまでに３４サイクルを必要とする。符号付き、符号なし、両方のデータを扱うことが可能である。ただし、被除数と除数において符号の有無の設定は共通とする。その他、オーバーフローフラグ、０除算フラグを出力する機能を有する。
【００２３】
図６は、乗算・積和演算器４４の構成を示すブロック図である。乗算・積和演算器４４は、２つの３２ビット乗算器（ＭＵＬ）４４ａ、４４ｂ、３つの６４ビット加算器（Ａｄｄｅｒ）４４ｃ〜４４ｅ、セレクタ４４ｆ及び飽和処理部（Ｓａｔｕｒａｔｉｏｎ）４４ｇから構成され、以下の乗算、積和演算を行う。
・３２×３２ビットのｓｉｇｎｅｄの乗算、積和、積差演算
・３２×３２ビットのｕｎｓｉｇｎｅｄの乗算
・１６×１６ビットの２並列のｓｉｇｎｅｄの乗算、積和、積差演算
・３２×１６ビットの２並列のｓｉｇｎｅｄの乗算、積和、積差演算
これらの演算を整数、固定小数点フォーマット（ｈ１、ｈ２、ｗ１、ｗ２）のデータに対して行う。また、これらの演算に対し、丸め、飽和を行う。
【００２４】
図７は、命令制御部１０の構成を示すブロック図である。命令制御部１０は、命令キャッシュ１０ａ、アドレス管理部１０ｂ、命令バッファ１０ｃ〜１０ｅ、ジャンプバッファ１０ｆ及びローテーション部（ｒｏｔａｔｉｏｎ）１０ｇから構成され、通常時及び分岐時の命令供給を行う。１２８ビットの命令バッファを３つ（命令バッファ１０ｃ〜１０ｅ）持つことにより、最大並列実行数に対応している。分岐処理に関しては、分岐実行前に、ジャンプバッファ１０ｆ等を介して、後述するＴＡＲレジスタに予め分岐先アドレスを格納する（ｓｅｔｔａｒ命令）。ＴＡＲレジスタに格納された分岐先アドレスを使用して、分岐を行う。
【００２５】
なお、本実施の形態におけるコンパイラの対象となるプロセッサ１は、例えば、ＶＬＩＷアーキテクチャを持つプロセッサである。ここで、ＶＬＩＷアーキテクチャとは、１つの命令語中に複数の命令（ロード、ストア、演算、分岐など）を格納し、それらを全て同時に実行するアーキテクチャである。プログラマは、並列実行可能な命令を１つの発行グループとして記述することによって、その発行グループを並列処理させることができる。本明細書では、発行グループの区切りを”；；”で示す。以下に表記例を示す。
（例１）
ｍｏｖ　ｒ１，　０ｘ２３；；
この命令記述は、命令ｍｏｖのみを実行することを意味する。
（例２）
ｍｏｖ　ｒ１，　０ｘ３８
ａｄｄ　ｒ０，　ｒ１，　ｒ２
ｓｕｂ　ｒ３，　ｒ１，　ｒ２；；
これらの命令記述は、命令ｍｏｖ、ａｄｄ、ｓｕｂを３並列で実行することを意味する。
命令制御部１０は、発行グループを識別し、デコード部２０に送る。デコード部２０では、発行グループの命令を解析し、必要な資源を制御する。
【００２６】
次に、このようなプロセッサ１が備えるレジスタについて説明する。
プロセッサ１のレジスタセットは、以下の表１に示される通りである。
【表１】
2004070531.tif 000003
【００２７】
また、このようなプロセッサ１のフラグセット（後述する条件フラグレジスタ等で管理されるフラグ）は、以下の表２に示される通りである。
【表２】
2004070531.tif 000004
【００２８】
図８は、汎用レジスタ（Ｒ０〜Ｒ３１）３０ａの構造を示す図である。汎用レジスタ（Ｒ０〜Ｒ３１）３０ａは、実行対象となっているタスクのコンテキストの一部を構成し、データまたはアドレスを格納する３２ビットのレジスタ群である。なお、汎用レジスタＲ３０およびＲ３１は、それぞれグローバルポインタ、スタックポインタとして、ハードウェアが使用する。
【００２９】
図９は、リンクレジスタ（ＬＲ）３０ｃの構造を示す図である。なお、このリンクレジスタ（ＬＲ）３０ｃと関連して、このプロセッサ１は、図示されていない退避レジスタ（ＳＶＲ）も備える。リンクレジスタ（ＬＲ）３０ｃは、関数コール時のリターンアドレスを格納する３２ビットのレジスタである。なお、退避レジスタ（ＳＶＲ）は、関数コール時の条件フラグレジスタのコンディションフラグ（ＣＦＲ．ＣＦ）を退避する１６ビットのレジスタである。リンクレジスタ（ＬＲ）３０ｃは、後述する分岐レジスタ（ＴＡＲ）と同様に、ループ高速化にも使用される。下位１ビットは常に０が読み出されるが、書き込み時には０を書き込む必要がある。
【００３０】
例えば、ｃａｌｌ（ｂｒｌ，ｊｍｐｌ）命令を実行した場合には、このプロセッサ１は、リンクレジスタ（ＬＲ）３０ｃに戻りアドレスを退避し、退避レジスタ（ＳＶＲ）にコンディションフラグ（ＣＦＲ．ＣＦ）を退避する。また、ｊｍｐ命令を実行した場合には、リンクレジスタ（ＬＲ）３０ｃから戻りアドレス（分岐先アドレス）を取り出し、プログラムカウンタ（ＰＣ）を復帰させる。さらに、ｒｅｔ（ｊｍｐｒ）命令を実行した場合には、リンクレジスタ（ＬＲ）３０ｃから分岐先アドレス（戻りアドレス）を取り出し、プログラムカウンタ（ＰＣ）に格納（復帰）する。さらに、退避レジスタ（ＳＶＲ）からコンディションフラグを取り出し、条件フラグレジスタ（ＣＦＲ）３２のコンディションンフラグ領域ＣＦＲ．ＣＦに格納（復帰）する。
【００３１】
図１０は、分岐レジスタ（ＴＡＲ）３０ｄの構造を示す図である。分岐レジスタ（ＴＡＲ）３０ｄは、分岐ターゲットアドレスを格納する３２ビットのレジスタである。主に、ループの高速化に用いられる。下位１ビットは常に０が読み出されるが、書き込み時には０を書き込む必要がある。
【００３２】
例えば、ｊｍｐ，ｊｌｏｏｐ命令を実行した場合には、プロセッサ１は、分岐レジスタ（ＴＡＲ）３０ｄから分岐先アドレスを取り出し、プログラムカウンタ（ＰＣ）に格納する。分岐レジスタ（ＴＡＲ）３０ｄに格納されたアドレスの命令が分岐用命令バッファに格納されている場合は、分岐ペナルティが０になる。分岐レジスタ（ＴＡＲ）３０ｄにループの先頭アドレスを格納しておくことでループを高速化することができる。
【００３３】
図１１は、プログラム状態レジスタ（ＰＳＲ）３１の構造を示す図である。プログラム状態レジスタ（ＰＳＲ）３１は、実行対象となっているタスクのコンテキストの一部を構成し、以下に示されるプロセッサ状態情報を格納する３２ビットのレジスタである。
【００３４】
ビットＳＷＥ：ＶＭＰ（Ｖｉｒｔｕａｌ　Ｍｕｌｔｉ−Ｐｒｏｃｅｓｓｏｒ）のＬＰ（Ｌｏｇｉｃａｌ　Ｐｒｏｃｅｓｓｏｒ）切替えイネーブルを示す。「０」はＬＰ切替え不許可を示し、「１」はＬＰ切替え許可を示す。
【００３５】
ビットＦＸＰ：固定小数点モードを示す。「０」はモード０（ＭＳＢとＭＳＢから１ビット目との間に小数点があるものとして演算をするモード。以下、「＿１系」ともいう。）を示し、「１」はモード１（ＭＳＢから１ビット目ととＭＳＢから２ビット目との間に小数点があるものとして演算をするモード。＿２系」ともいう。）を示す。
【００３６】
ビットＩＨ：割込み処理フラグであり、マスカブル割込み処理中であることを示す。「１」は割込み処理中であることを示し、「０」は割込み処理中でないことを示す。割込みが発生すると自動的にセットされる。ｒｔｉ命令で割込みから復帰したところが、他の割込み処理中かプログラム処理中であるのかを見分けるために使用される。
【００３７】
ビットＥＨ：エラーまたはＮＭＩを処理中であることを示すフラグである。「０」はエラー／ＮＭＩ割込み処理中でないことを示し、「１」はエラー／ＮＭＩ割込み処理中であることを示す。ＥＨ＝１のとき、非同期エラーまたはＮＭＩが発生した場合は、マスクされる。また、ＶＭＰイネーブル時はＶＭＰのプレート切り替えがマスクされる。
【００３８】
ビットＰＬ［１：０］：特権レベルを示す。「００」は特権レベル０、つまり、プロセッサアブストラクションレベルを示し、「０１」は特権レベル１（設定できない）を示し、「１０」は特権レベル２、つまり、システムプログラムレベルを示し、「１１」は特権レベル３、つまり、ユーザプログラムレベルを示す。
【００３９】
ビットＬＰＩＥ３：ＬＰ固有割込み３イネーブルを示す。「１」は割込み許可を示し、「０」は割込み不許可を示す。
ビットＬＰＩＥ２：ＬＰ固有割込み２イネーブルを示す。「１」は割込み許可を示し、「０」は割込み不許可を示す。
ビットＬＰＩＥ１：ＬＰ固有割込み１イネーブルを示す。「１」は割込み許可を示し、「０」は割込み不許可を示す。
ビットＬＰＩＥ０：ＬＰ固有割込み０イネーブルを示す。「１」は割込み許可を示し、「０」は割込み不許可を示す。
ビットＡＥＥ：ミスアライメント例外イネーブルを示す。「１」はミスアライメント例外許可を示し、「０」はミスアライメント例外不許可を示す。
ビットＩＥ：レベル割込みイネーブルを示す。「１」はレベル割込み許可を示し、「０」はレベル割込み不許可を示す。
ビットＩＭ［７：０］：割込みマスクを示す。レベル０〜７まで定義され、個々のレベルでマスクすることができる。レベル０が最も高いレベルとなる。ＩＭによりマスクされていない割込み要求のうち最も高いレベルを持った割込み要求のみがプロセッサ１に受理される。割込み要求を受理すると受理したレベル以下のレベルはハードウェアで自動的にマスクされる。ＩＭ［０］はレベル０のマスクであり、ＩＭ［１］はレベル１のマスクであり、ＩＭ［２］はレベル２のマスクであり、ＩＭ［３］はレベル３のマスクであり、ＩＭ［４］はレベル４のマスクであり、ＩＭ［５］はレベル５のマスクであり、ＩＭ［６］はレベル６のマスクであり、ＩＭ［７］はレベル７のマスクである。ｒｅｓｅｒｖｅｄ：予約ビットを示す。常に０が読み出される。書き込む時は０を書き込む必要がある。
【００４０】
図１２は、条件フラグレジスタ（ＣＦＲ）３２の構造を示す図である。条件フラグレジスタ（ＣＦＲ）３２は、実行対象となっているタスクのコンテキストの一部を構成する３２ビットのレジスタであり、コンディションフラグ（条件フラグ）、オペレーションフラグ（演算フラグ）、ベクタコンディションフラグ（ベクタ条件フラグ）、演算命令用ビット位置指定フィールド、ＳＩＭＤデータアライン情報フィールドから構成される。
【００４１】
ビットＡＬＮ［１：０］：アラインモードを示す。ｖａｌｎｖｃ命令のアラインモードを設定する。
ビットＢＰＯ［４：０］：ビットポジションを示す。ビット位置指定の必要な命令で使用する。
ビットＶＣ０〜ＶＣ３：ベクタ条件フラグである。ＬＳＢ側のバイトあるいはハーフワードから順にＶＣ０に対応し、ＭＳＢ側がＶＣ３に対応する。
ビットＯＶＳ：オーバーフローフラグ（サマリー）である。飽和発生やオーバーフロー検出でセットされる。検出されなかった場合は、命令実行前の値を保持する。クリアはソフトで行う必要がある。
ビットＣＡＳ：キャリーフラグ（サマリー）である。ａｄｄｃ命令でキャリーまたはｓｕｂｃ命令でボローが発生した場合セットされる。ａｄｄｃ命令でキャリーもしくはｓｕｂｃ命令でボローが発生しなかった場合は、命令実行前の値を保持する。クリアはソフトで行う必要がある。
ビットＣ０〜Ｃ７：コンディションフラグである。条件付き実行命令における条件（ＴＲＵＥ／ＦＡＬＳＥ）を示す。条件付き命令の条件とビットＣ０〜Ｃ７との対応は、命令に含まれるプレディケート・ビットによって決定される。なお、フラグＣ７は常に値が１である。フラグＣ７へのＦＡＬＳＥ条件の反映（０書き込み）は無視される。
ｒｅｓｅｒｖｅｄ：予約ビットを示す。常に０が読み出される。書き込む時は０を書き込む必要がある。
【００４２】
図１３は、アキュムレータ（Ｍ０，Ｍ１）３０ｂの構造を示す図である。このアキュムレータ（Ｍ０，Ｍ１）３０ｂは、実行対象となっているタスクのコンテキストの一部を構成し、図１３（ａ）に示される３２ビットレジスタＭＨ０−ＭＨ１（乗除算・積和用レジスタ（上位３２ビット））と、図１３（ｂ）に示される３２ビットレジスタＭＬ０−ＭＬ１乗除算・積和用レジスタ（下位３２ビット）とからなる。
【００４３】
レジスタＭＨ０−ＭＨは、乗算命令では結果の上位３２ビットを格納するのに使用される。積和命令ではアキュムレータの上位３２ビットとして使用される。また、ビットストリームを取り扱う場合に汎用レジスタと組み合わせて使用することができる。レジスタＭＬ０−ＭＬ１は、乗算命令では結果の下位３２ビットを格納するのに使用される。積和命令ではアキュムレータの下位３２ビットとして使用される。
【００４４】
図１４は、プログラムカウンタ（ＰＣ）３３の構造を示す図である。このプログラムカウンタ（ＰＣ）３３は、実行対象となっているタスクのコンテキストの一部を構成し、実行中の命令のアドレスを保持する３２ビットのカウンタである。下位１ビットは常に０が格納される。
【００４５】
図１５は、ＰＣ退避用レジスタ（ＩＰＣ）３４の構造を示す図である。このＰＣ退避用レジスタ（ＩＰＣ）３４は、実行対象となっているタスクのコンテキストの一部を構成する３２ビットのレジスタであり、下位１ビットは常に０が読み出されるが、書き込み時には０を書き込む必要がある。
【００４６】
図１６は、ＰＳＲ退避用レジスタ（ＩＰＳＲ）３５の構造を示す図である。このＰＳＲ退避用レジスタ（ＩＰＳＲ）３５は、実行対象となっているタスクのコンテキストの一部を構成し、プログラム状態レジスタ（ＰＳＲ）３１を退避するための３２ビットのレジスタであり、プログラム状態レジスタ（ＰＳＲ）３１の予約ビットに対応する部分は常に０が読み出されるが、書き込み時には０を書き込む必要がある。
【００４７】
次に、本実施の形態におけるコンパイラの対象となるプロセッサ１のメモリ空間について説明する。例えば、プロセッサ１では、４ＧＢのリニアなメモリ空間を３２分割し、１２８ＭＢ単位の空間に命令ＳＲＡＭ（Ｓｔａｔｉｃ　ＲＡＭ）とデータＳＲＡＭが割り当てられる。この１２８ＭＢの空間を１ブロックとして、ＳＡＲ（ＳＲＡＭ　Ａｒｅａ　Ｒｅｇｉｓｔｅｒ）にアクセスしたいブロックを設定する。アクセスされたアドレスがＳＡＲで設定された空間である場合は、直接命令ＳＲＡＭ／データＳＲＡＭに対してアクセスを行うが、ＳＡＲで設定された空間でない場合は、バスコントローラ（ＢＣＵ）に対してアクセス要求を出する。ＢＣＵにはオン・チップ・メモリ（ＯＣＭ）、外部メモリ、外部デバイス、Ｉ／Ｏポート等が接続されており、それらのデバイスに対して読み書きを行うことができる。
【００４８】
図１７は、本実施の形態におけるコンパイラの対象となるプロセッサ１のパイプライン動作を示すタイミング図である。このプロセッサ１は、本図に示されるように、例えば、基本的に命令フェッチ、命令割り当て（ディスパッチ）、デコード、実行、書き込みの５段パイプラインで構成されている。
【００４９】
図１８は、このようなプロセッサ１による命令実行時の各パイプライン動作を示すタイミング図である。命令フェッチステージでは、プログラムカウンタ（ＰＣ）３３で指定されるアドレスの命令メモリをアクセスし、命令を命令バッファ１０ｃ〜１０ｅ等に転送する。命令割り当てステージでは、分岐系命令に対する分岐先アドレス情報の出力、入力レジスタ制御信号の出力、可変長命令の割り当てを行い、命令をインストラクションレジスタ（ＩＲ）に転送する。デコードステージでは、ＩＲをデコード部２０に入力し、演算器制御信号、メモリアクセス信号を出力する。実行ステージでは、演算を実行、演算結果をデータメモリか汎用レジスタ（Ｒ０〜Ｒ３１）３０ａに出力する。書き込みステージでは、データ転送、演算結果を汎用レジスタに格納する。
【００５０】
本実施の形態におけるコンパイラの対象となるプロセッサ１は、例えば、ＶＬＩＷアーキテクチャにより上記の処理を最高３並列で行うことができる。したがって、図１８に示された動作については、本プロセッサ１は、図１９に示されるタイミングで並列に実行する。
【００５１】
次に、以上のように構成されたプロセッサ１の命令セットの例について説明する。
以下の表３〜表５は、本実施の形態におけるコンパイラの対象となるプロセッサ１が実行する命令をカテゴリー別に分類した表である。
【表３】
2004070531.tif 000005
【表４】
2004070531.tif 000006
【表５】
2004070531.tif 000007
【００５２】
なお、表中の「演算器」は、その命令が使用する演算器を示す。演算器の略号の意味は次の通りである。つまり、「Ａ」はＡＬＵ命令、「Ｂ」は分岐命令、「Ｃ」は変換命令、「ＤＩＶ」は除算命令、「ＤＢＧＭ」はデバッグ命令、「Ｍ」はメモリアクセス命令、「Ｓ１」、「Ｓ２」はシフト命令、「Ｘ１」、「Ｘ２」は乗算命令を意味する。
【００５３】
図２０は、このようなプロセッサ１が実行する命令のフォーマットの例を示す図である。そのフォーマットには、図２０（ａ）に示される１６ビット命令フォーマットと、図２０（ｂ）に示される３２ビット命令フォーマットとがある。
【００５４】
なお、図中における略号の意味は次の通りである。つまり、「Ｅ」はエンドビット（並列実行の境界）、「Ｆ」はフォーマットビット（００、０１、１０：１６ビット命令フォーマット、１１：３２ビット命令フォーマット）、「Ｐ」はプレディケート（実行条件：８個の条件フラグＣ０〜Ｃ７のいずれかを指定）、「ＯＰ」はオペコードフィールド、「Ｒ」はレジスタフィールド、「Ｉ」は即値フィールド、「Ｄ」ディスプースメントフィールドを意味する。なお、「Ｅ」フィールドはＶＬＩＷに特有のもので、Ｅ＝０の命令は次の命令と並列に実行される。つまり、「Ｅ」フィールドによって並列度が可変のＶＬＩＷを実現している。
【００５５】
図２１〜図３６は、プロセッサ１が実行する命令の概略的な機能を説明する図である。つまり、図２１は、カテゴリー「ＡＬＵａｄｄ（加算）系」に属する命令を説明する図であり、図２２は、カテゴリー「ＡＬＵｓｕｂ（減算）系」に属する命令を説明する図であり、図２３は、カテゴリー「ＡＬＵｌｏｇｉｃ（論理演算）系ほか」に属する命令を説明する図であり、図２４は、カテゴリー「ＣＭＰ（比較演算）系」に属する命令を説明する図であり、図２５は、カテゴリー「ｍｕｌ（乗算）系」に属する命令を説明する図であり、図２６は、カテゴリー「ｍａｃ（積和演算）系」に属する命令を説明する図であり、図２７は、カテゴリー「ｍｓｕ（積差演算）系」に属する命令を説明する図であり、図２８は、カテゴリー「ＭＥＭｌｄ（メモリ読み出し）系」に属する命令を説明する図であり、図２９は、カテゴリー「ＭＥＭｓｔｏｒｅ（メモリ書き出し）系」に属する命令を説明する図であり、図３０は、カテゴリー「ＢＲＡ（分岐）系」に属する命令を説明する図であり、図３１は、カテゴリー「ＢＳａｓｌ（算術バレルシフト）系ほか」に属する命令を説明する図であり、図３２は、カテゴリー「ＢＳｌｓｒ（論理バレルシフト）系ほか」に属する命令を説明する図であり、図３３は、カテゴリー「ＣＮＶｖａｌｎ（算術変換）系」に属する命令を説明する図であり、図３４は、カテゴリー「ＣＮＶ（一般変換）系」に属する命令を説明する図であり、図３５は、カテゴリー「ＳＡＴｖｌｐｋ（飽和処理）系」に属する命令を説明する図であり、図３６は、カテゴリー「ＥＴＣ（その他）系」に属する命令を説明する図である。
【００５６】
これらの図において、項目「ＳＩＭＤ」は、その命令の型（ＳＩＳＤ（ＳＩＮＧＬＥ）かＳＩＭＤかの区別）を示し、項目「サイズ」は、演算の対象となる個々のオペランドのサイズを示し、項目「命令」は、その命令のオペコードを示し、項目「オペランド」は、その命令のオペランドを示し、項目「ＣＦＲ」は、条件フラグレジスタの変化を示し、項目「ＰＳＲ」は、プロセッサ状態レジスタの変化を示し、項目「代表的な動作」は、動作の概要を示し、項目「演算器」は、使用される演算器を示し、項目「３１１６」は、命令のサイズを示す。
【００５７】
以下に、後述する具体例で使用される主な命令に対するプロセッサ１の動作を説明する。
ａｎｄｎ　Ｒｃ，Ｒａ，Ｒｂ
ＲａとＲｂの反転の論理積をとり、Ｒｃに格納する。
ａｓｌ　Ｒｂ，Ｒａ，Ｉ５
Ｒａを即値（Ｉ５）ビット数だけ算術左シフトする。
ａｎｄ　Ｒｂ，Ｒａ，Ｉ８
Ｒａと値（Ｉ８）の論理積をとり、Ｒｂに格納する。
ｂｓｅｑ０　Ｒｂ，Ｒａ
ＲａのＭＳＢから連続する　０　の数を数えて、Ｒｂに格納する。
【００５８】
ｂｓｅｑ１　Ｒｂ，Ｒａ
ＲａのＭＳＢから連続する　１　の数を数えて、Ｒｂに格納する。
ｂｓｅｑ　Ｒｂ，Ｒａ
ＲａのＭＳＢの　１　ｂｉｔ下から連続する符号ビットの数を数えて、Ｒｂに格納する。Ｒａが　０　の場合は、０を出力する。
ｂｃｎｔ１　Ｒｂ，Ｒａ
Ｒａの　１　の数を数えて、Ｒｂに格納する。
ｅｘｔｒ　Ｒｃ，Ｒａ，Ｒｂ
Ｒｂでｂｉｔ位置を指定し、Ｒａの内容の一部を取り出し、符号拡張してＲｃに格納する。
【００５９】
ｅｘｔｒｕ　Ｒｃ，Ｒａ，Ｒｂ
Ｒｂでｂｉｔ位置を指定し、Ｒａの内容の一部を取り出し、符号拡張せずにＲｃに格納する。
ｆｍｕｌｈｈ　Ｍｍ，Ｒｃ，Ｒａ，Ｒｂ
Ｒａ，Ｒｂ，Ｒｃを　１６ｂｉｔ　値として扱い、Ｍｍ（乗算用アキュムレータ）を３２ｂｉｔ値として扱う。ＲａとＲｂを固定小数点乗算する。結果をＭｍとＲｃに格納する。結果が符号付き　３２　ｂｉｔで表せない場合飽和する。
ｆｍｕｌｈｗ　Ｍｍ，Ｒｃ，Ｒａ，Ｒｂ
ＲａとＲｂを　１６ｂｉｔ　値として扱い、Ｍｍ，Ｒｃを３２ｂｉｔ値として扱う。ＲａとＲｂを固定小数点乗算する。結果をＭｍとＲｃに格納する。結果が符号付き　３２　ｂｉｔで表せない場合飽和する。
ｍｕｌ　Ｍｍ，Ｒｃ，Ｒａ，Ｒｂ
ＲａとＲｂを整数乗算する。結果をＭｍとＲｃに格納する。
【００６０】
ｍａｃ　Ｍｍ，Ｒｃ，Ｒａ，Ｒｂ，Ｍｎ
ＲａとＲｂを整数乗算し、Ｍｎと加算する。結果をＭｍとＲｃに格納する。
ｍｏｖ　Ｒｂ，Ｒａ
ＲａをＲｂに転送する。
ｏｒ　Ｒｃ，Ｒａ，Ｒｂ
ＲａとＲｂの論理和をとり、Ｒｃに格納する。
ｒｄｅ　Ｃ０：Ｃ１，Ｒｂ，（Ｒａ）
Ｒａを外部レジスタ番号として、その外部レジスタの値をＲｂに読み込む。読み込みの成功・失敗をＣ０とＣ１（それぞれ、条件フラグ）に出力し、失敗時は拡張レジスタエラー例外が発生する。
ｗｔｅ　Ｃ０：Ｃ１，（Ｒａ），Ｒｂ
Ｒａを外部レジスタ番号として、Ｒｂの値をその外部レジスタに書き出する。書き出しの成功・失敗をＣ０とＣ１に出力し、失敗時は拡張レジスタエラー例外が発生する。
ｖａｄｄｈ　Ｒｃ，Ｒａ，Ｒｂ
各レジスタをハーフワードベクタ形式で扱う。ＲａとＲｂを加算（ＳＩＭＤ　ｓｔｒａｉｇｈｔ）する。
【００６１】
［コンパイラ］
次に、以上のプロセッサ１をターゲットとする本実施の形態におけるコンパイラについて説明する。
図３７は、本実施の形態におけるコンパイラ１００の構成を示す機能ブロック図である。このコンパイラ１００は、Ｃ／Ｃ＋＋言語等の高級言語で記述されたソースプログラム１０１を、上述のプロセッサ１をターゲットプロセッサとする機械語プログラム１０５に変換するクロスコンパイラであり、パーソナルコンピュータ等のコンピュータ上で実行されるプログラムによって実現され、大きく分けて、パーサー部１１０と、中間コード変換部１２０と、最適化部１３０と、コード生成部１４０とから構成される。
【００６２】
なお、本コンパイラ１００には、上記プロセッサ１に特有の専用命令を効率的に生成するためのヘッダファイル（演算子定義ファイル１０２及び組み込み関数定義ファイル１０３）が準備されている。ユーザは、ソースプログラム１０１において、これらのヘッダファイルをインクルードすることで、プロセッサ１に特化した（最適化された）機械語プログラム１０５を得ることができる。
【００６３】
演算子定義ファイル１０２は、図３８〜図６８のリスト例に示されるように、固定小数点及びＳＩＭＤ型のデータを対象とする演算子を定義したクラスを定義しているヘッダファイルである。図３８〜図４０は、ヘッダファイルのうち、主に、モード０（＿１系）の１６ビット固定小数点のデータを対象とする演算子（オペレータ）を定義している箇所のリストであり、図４１〜図４２は、ヘッダファイルのうち、主に、モード０（＿１系）の３２ビット固定小数点のデータを対象とする演算子（オペレータ）を定義している箇所のリストであり、図４３〜図４５は、ヘッダファイルのうち、主に、モード１（＿２系）の１６ビット固定小数点のデータを対象とする演算子（オペレータ）を定義している箇所のリストであり、図４５〜図４７は、ヘッダファイルのうち、主に、モード１（＿２系）の３２ビット固定小数点のデータを対象とする演算子（オペレータ）を定義している箇所のリストであり、図４８〜図６８は、その他の関数を定義している箇所のリストである。
【００６４】
組み込み関数定義ファイル１０３は、図６９〜図７２のリスト例に示されるように、プロセッサ１に特有の機械語命令に置き換えるための各種演算を行う関数を定義しているヘッダファイルである。図６９〜図７１は、ヘッダファイルのうち、１つの機械語命令に置き換える関数を定義している箇所のリストであり、図７２は、ヘッダファイルのうち、２以上の機械語命令（機械語命令列）に置き換える関数を定義している箇所のリストである。
【００６５】
なお、これらの定義ファイル１０２及び１０３において、ａｓｍ（…）｛…｝（…）は、最適化ａｓｍと呼ばれる組み込みアセンブラ命令であり、以下の通り、処理される。つまり、最適化ａｓｍ文の記述形式は、
【００６６】
ａｓｍ（＜＜ロード式並び＞＞）｛
＜＜最適化制御情報＞＞
＜＜命令指定部＞＞
｝（＜＜ストア式並び＞＞）；
【００６７】
である。ここで、「ロード式並び」は、ロード式を記述する箇所であり、「ロード式」は、レジスタに　Ｃ言語での変数や四則演算などの式の結果を格納するための式であり、「レジスタ指定識別子　＝　代入式」のように記述され、右辺に示される値を左辺に示される識別子に転送することを意味し、「ストア式並び」は、ストア式を記述する箇所であり、「ストア式」は、「単項式　＝　レジスタ指定識別子」のように記述され、単項式で表される左辺値にレジスタ指定識別子で表されるレジスタの値を代入することを意味する。
【００６８】
パーサー部１１０は、コンパイルの対象となるソースプログラム１０１（インクルードされるヘッダファイルを含む）に対して、予約語（キーワード）等を抽出して字句解析する前置処理部であり、通常のコンパイラが備える解析機能に加えて、固定小数点についてのモードの切り替えをサポートする固定小数点モード切替部１１１を有する。固定小数点モード切替部１１１は、ソースプログラム１０１中に、固定小数点モードを退避・復帰させるプラグマ指令（例えば、＃ｐｒａｇｍａ　＿ｓａｖｅ＿ｆｘｐｍｏｄｅ　ｆｕｎｃ等）を検出すると、プロセッサ１のＰＳＲ３１のビットＦＸＰの退避・復帰を行う機械語命令を生成する。これによって、ユーザは、固定小数点のモード０及びモード１での演算が混在したプログラミングが可能となる。
【００６９】
なお、「プラグマ（又は、プラグマ指令）」とは、ソースプログラム１０１中にユーザが任意に指定（配置）することができるコンパイラ１００への指示であり、「＃ｐｒａｇｍａ」で始まる文字列である。
【００７０】
中間コード変換部１２０は、パーサー部１１０から渡されたソースプログラム１０１の各ステートメントを中間コードに変換する処理部であり、中間コード生成部１２１と機械語命令置換部１２２とから構成される。中間コード生成部１２１は、ソースプログラム１０１の各ステートメントを一定規則に基づいて中間コードに変換する。ここで、中間コードは、典型的には、関数呼び出しの形式で表現されるコード（例えば、「＋（ｉｎｔ　ａ，　ｉｎｔ　ｂ）」を示すコード；「整数ａに整数ｂを加算する」ことを示す。）である。ただし、中間コードには、このような関数呼び出し形式のコードだけでなく、プロセッサ１の機械語命令も含まれる。
【００７１】
機械語命令置換部１２２は、中間コード生成部１２１で生成された中間コードのうち、関数呼び出し形式の中間コードに対して、演算子定義ファイル１０２及び組み込み関数定義ファイル１０３を参照することで、それらの定義ファイルで定義された演算子（演算対象のデータの型も含む）又は組み込み関数に一致した中間コードについては、内部に保持する置換テーブル１２２ａ又はこれらの定義ファイルで定義されたアセンブラ命令に従って、対応する機械語命令（又は機械語命令列）に置き換え、最適化部１３０に出力する。これによって、これらの中間コードについては、関数呼び出しの形式ではなく、機械語命令の形式で最適化部１３０に渡されるので、最適化部１３０での各種最適化が可能となる。
【００７２】
なお、置換テーブル１２２ａは、予め予約された演算子による演算及び関数に対応する機械語命令（又は機械語命令列）を格納したテーブルである。また、機械語命令置換部１２２は、中間コード生成部１２１から渡された中間コードのうち、機械語命令については、そのまま最適化部１３０に出力する。
【００７３】
最適化部１３０は、中間コード変換部１２０から出力された中間コードのうち、機械語命令について、命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の処理を行うことで、（１）実行速度の向上を優先した最適化、（２）コードサイズの削減を優先した最適化、（３）実行速度とコードサイズの両方の最適化、の中からユーザによって選択された種類の最適化を実行する処理部であり、一般的な最適化（「ループアンローリング」、「ｉｆ変換」、「ペアメモリアクセス命令の生成」など）に加えて、本コンパイラ１００に特有の最適化を行う処理部（引数最適化部１３１、型変換最適化部１３２及びレイテンシ最適化部１３３）を有する。
【００７４】
引数最適化部１３１は、組み込み関数（ｅｘｔｒ、ｅｘｔｒｕなど）の引数に応じて、適切な命令又はシーケンス（アルゴリズム）を生成する処理部である。例えば、引数がすべて定数の場合には、それら定数を畳み込んで得られる定数値をオペランドとする機械語命令を生成し、引数の一部が定数の場合には、即値オペランドの機械語命令を生成し、引数のすべてが変数の場合には、レジスタオペランドの命令列を生成する。
【００７５】
型変換最適化部１３２は、ソースプログラム１０１中での一定表記に基づいて、異なる型間の演算を効率化する処理部である。例えば、１６ビットのデータと１６ビットのデータとの乗算結果を３２ビットのデータとして保持しておきたい場合に、ソースプログラム１０１において一定表記がなされているときには、そのような型変換を伴った乗算を行う１つの機械語命令（「ｆｍｕｌｈｗ」など）を生成する。
【００７６】
レイテンシ最適化部１３３は、ソースプログラム１０１に組み込まれたアセンブラ命令中でのレイテンシに関する指示（サイクル数の指定）に基づいて、特定の区間あるいは特定の動作が指定されたサイクル数だけ実行時間がかかるように、機械語命令を並べる。これによって、従来であればプログラマが必要個数のｎｏｐ命令を挿入していた作業が不要になるとともに、ｎｏｐ命令以外の他の機械語命令を挿入することによる最適化が可能となる。
【００７７】
なお、「ループアンローリング」とは、ループのイタレーション（繰り返し）を展開し、複数のイタレーションを同時に実行させるために、ペアメモリアクセス命令（ｌｄｐ／ｓｔｐ／ｌｄｈｐ／ｓｔｈｐ等）を生成し、これによって、ループの並列実行可能性を向上させる最適化である。また、「ｉｆ変換」とは、条件付き実行機構の命令（命令に含まれる条件（プレディケート）がプロセッサ１の状態（コンディションフラグ）と一致している場合にだけ実行される命令）を生成することにより分岐構造を除去する最適化である。また、「ペアメモリアクセス命令の生成」とは、ペアレジスタ（２本の連続するレジスタ）を対象にメモリアクセスする命令（ｌｄｐ／ｓｔｐ／ｌｄｈｐ／ｓｔｈｐ等）を生成する最適化である。
【００７８】
また、最適化部１３０は、関数呼び出し形式の中間コードのうち、機械語命令に展開されないものについては、上述のような機械語命令レベルでの最適化処理を施すことができないので、そのままコード生成部１４０に出力する。
【００７９】
コード生成部１４０は、最適化部１３０から出力された中間コード（関数呼び出し形式のコード及び最適化された機械語命令を含む）に対して、内部に保持する変換テーブル等を参照することで、全てのコードを機械語命令に置き換えることで、機械語プログラム１０５を生成する。
【００８０】
次に、以上のように構成されたコンパイラ１００の特徴的な動作について、具体的な例を示しながら説明する。
図７３は、機械語命令置換部１２２の動作を示すフローチャートである。機械語命令置換部１２２は、中間コード生成部１２１で生成された中間コードのうち、関数呼び出し形式のコードについて、演算子定義ファイル１０２で定義された演算子（演算対象のデータ型を含む）及び組み込み関数定義ファイル１０３で定義された関数と一致するか否かを判断し（ステップＳ１０１）、一致する場合には（ステップＳ１０１でＹｅｓ）、内部に保持する置換テーブル１２２ａ又はこれらの定義ファイル１０２及び１０３で定義されたアセンブラ命令にしたがって、機械語命令に置き換える（ステップＳ１０２）という処理を繰り返す（ステップＳ１００〜Ｓ１０３）。
【００８１】
具体的には、演算子定義ファイル１０２での定義により、異なる型間の暗黙の型変換のルール等が規定され（コンストラクタの定義による）、４種類の固定小数点の型、つまり、
・「ＦＩＸ１６＿１」；第１４ビットと第１５ビット（ＭＳＢ）との間に小数点を持つ符号付き１６ビットと、
・「ＦＩＸ１６＿２」；第１３ビットと第１４ビットとの間に小数点を持つ符号付き１６ビットと、
・「ＦＩＸ３２＿１」；第３０ビットと第３１ビット（ＭＳＢ）との間に小数点を持つ符号付き３２ビットと、
・「ＦＩＸ３２＿２」；第２９ビットと第３０ビットとの間に小数点を持つ符号付き３２ビットと
が定義されているので、機械語命令置換部１２２は、例えば、
【００８２】
ＦＩＸ１６＿１　ａ，　ｂ，　ｃ；
ｃ　＝　ａ　＊　ｂ；
というソースプログラムを、
ｆｍｕｌｈｈ　ｍ０，Ｒｃ，Ｒａ，Ｒｂ　（固定小数点乗算命令）
という機械語命令に置き換える。
【００８３】
これによって、ユーザは、ＦＩＸ１６＿１、ＦＩＸ１６＿２、ＦＩＸ３２＿１、ＦＩＸ３２＿２という型について、通常のコンパイラにおける基本型と同様に宣言し、使用することができる。そして、生成された機械語命令は、周辺のコードと含めて、最適化部１３０における命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の最適化の対象となり、最適化が施され得る。
【００８４】
同様に、演算子定義ファイル１０２での定義により、異なる型間の暗黙の型変換のルール等が規定され（コンストラクタの定義による）、４種類のＳＩＭＤ型、つまり、
・「ＶＩＮＴ８ｘ４」；８ビット整数データの４並列と、
・「ＶＩＮＴ１６ｘ２」；１６ビット整数データの２並列と、
・「ＶＦＩＸ１６１ｘ２」；モード０（＿１系）の１６ビット固定小数点データの２並列と、
・「ＶＦＩＸ１６２ｘ２」；モード１（＿２系）の１６ビット固定小数点データの２並列と
が定義されているので、機械語命令置換部１２２は、例えば、
【００８５】
ＶＩＮＴ１６ｘ２　ａ，　ｂ，　ｃ；
ｃ　＝　ａ　＋　ｂ；
というソースプログラムを、
ｖａｄｄｈ　Ｒｃ，Ｒａ，Ｒｂ　　（ＳＩＭＤ型加算命令）
という機械語命令に置き換える。
【００８６】
これによって、ユーザは、ＶＩＮＴ８ｘ２、ＶＩＮＴ１６ｘ２、ＶＦＩＸ１６１ｘ２、ＶＦＩＸ１６２ｘ２という型について、通常のコンパイラにおける基本型と同様に宣言し、使用することができる。そして、生成された機械語命令は、周辺のコードと含めて、最適化部１３０における命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の最適化の対象となり、最適化が施され得る。
【００８７】
また、組み込み関数定義ファイル１０３においては、プロセッサ１が備える高機能命令を使用することが可能な関数（例えば、「＿ａｂｓ（ａ）」等）とそれに対応する高機能命令（例えば、１つの機械語命令「ａｂｓ　Ｒｂ，　Ｒａ」等）が定義されているので、機械語命令置換部１２２は、例えば、
【００８８】
ｂ　＝　＿ａｂｓ（ａ）；
というソースプログラムを、
ａｂｓ　Ｒｂ，Ｒａ
という機械語命令に置き換える。
【００８９】
これによって、ユーザは、複雑な処理を、Ｃ＋＋言語やアセンブラ命令で作成することなく、予め用意された組み込み関数を呼び出すだけで、実現することができる。そして、生成された機械語命令は、周辺のコードと含めて、最適化部１３０における命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の最適化の対象となり、最適化が施され得る。
【００９０】
同様に、また、組み込み関数定義ファイル１０３において、プロセッサ１が備える高機能命令を使用することが可能な関数（例えば、「＿ｄｉｖ（ａ，　ｂ）」等）とそれに対応する高機能命令（例えば、機械語命令列「ｅｘｔｗ，　ａｓｌｐ，　ｄｉｖ」等）が定義されているので、機械語命令置換部１２２は、例えば、
【００９１】
ｃ　＝　＿ｄｉｖ（ａ，　ｂ）；
というソースプログラムを、
ｅｘｔｗ　　　　Ｍｎ，Ｒｃ，Ｒａ
ａｓｌｐ　　　　Ｍｎ，Ｒｃ，Ｍｎ，Ｒｃ，１５
ｄｉｖ　　　　　ＭＨｍ，Ｒｃ，ＭＨｎ，Ｒｃ，Ｒｂ
という機械語命令列に置き換える。
【００９２】
これによって、ユーザは、複雑な処理を、Ｃ＋＋言語やアセンブラ命令で作成することなく、予め用意された組み込み関数を呼び出すだけで、実現することができる。そして、生成された機械語命令列は、周辺のコードと含めて、最適化部１３０における命令結合、冗長除去、命令並べ替え、レジスタ割り付け等の最適化の対象となり、最適化が施され得る。
【００９３】
なお、組み込み関数定義ファイル１０３に列挙されている組み込み関数のうち、（１）１つの機械語命令に変換される関数、（２）２以上の機械語命令（機械語命令列）に変換される関数、及び、（３）レジスタ割り付けの対象とならない資源（アキュムレータなど）を指定することが可能な関数の代表的なもの（特に、メディア処理に有効なもの）は、以下の通りである。
【００９４】
（１）１つの機械語命令に変換される組み込み関数
・「＿ｂｓｅｑ０（ｘ）」：
入力の最上位ビットから何ビット０が連続するかを検出する関数である。書式は、以下の通りである。
ｉｎｔ　＿ｂｓｅｑ０（ＦＩＸ１６＿１　ｖａｌ）　／／　０をカウント
ｉｎｔ　＿ｂｓｅｑ０（ＦＩＸ１６＿２　ｖａｌ）　／／　０をカウント
ｉｎｔ　＿ｂｓｅｑ０（ＦＩＸ３２＿１　ｖａｌ）　／／　０をカウント
ｉｎｔ　＿ｂｓｅｑ０（ＦＩＸ３２＿２　ｖａｌ）　／／　０をカウント
これらの関数は、「ｖａｌ」中の連続する０の個数（ビット数）をカウントした値を返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【００９５】
・「＿ｂｓｅｑ１（ｘ）」：
入力の最上位ビットから何ビット１が連続するかを検出する関数である。書式は、以下の通りである。
ｉｎｔ　＿ｂｓｅｑ１（ＦＩＸ１６＿１　ｖａｌ）　／／　１をカウント
ｉｎｔ　＿ｂｓｅｑ１（ＦＩＸ１６＿２　ｖａｌ）　／／　１をカウント
ｉｎｔ　＿ｂｓｅｑ１（ＦＩＸ３２＿１　ｖａｌ）　／／　１をカウント
ｉｎｔ　＿ｂｓｅｑ１（ＦＩＸ３２＿２　ｖａｌ）　／／　１をカウント
これらの関数は、「ｖａｌ」中の連続する１の個数（ビット数）をカウントした値が返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【００９６】
・「＿ｂｓｅｑ（ｘ）」：
入力の最上位ビットと同じ値が最上位ビットの次から何ビット連続するかを検出する関数である。書式は、以下の通りである。
ｉｎｔ　＿ｂｓｅｑ（ＦＩＸ１６＿１　ｖａｌ）
ｉｎｔ　＿ｂｓｅｑ（ＦＩＸ１６＿２　ｖａｌ）
ｉｎｔ　＿ｂｓｅｑ（ＦＩＸ３２＿１　ｖａｌ）
ｉｎｔ　＿ｂｓｅｑ（ＦＩＸ３２＿２　ｖａｌ）
これらの関数は、「ｖａｌ」の正規化ビット数を返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【００９７】
・「＿ｂｃｎｔ１（ｘ）」：
入力の全ビット中に何ビット１が含まれているかを検出する関数である。書式は、以下の通りである。
ｉｎｔ　＿ｂｃｎｔ１（ＦＩＸ１６＿１　ｖａｌ）
ｉｎｔ　＿ｂｃｎｔ１（ＦＩＸ１６＿２　ｖａｌ）
ｉｎｔ　＿ｂｃｎｔ１（ＦＩＸ３２＿１　ｖａｌ）
ｉｎｔ　＿ｂｃｎｔ１（ＦＩＸ３２＿２　ｖａｌ）
これらの関数は、「ｖａｌ」中の１の個数をカウントした値を返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【００９８】
・「＿ｅｘｔｒ（ａ，ｉ１，ｉ２）」：
入力の所定のビット位置を抽出して符号拡張する関数である。
関数である。書式は、以下の通りである。
ｉｎｔ　＿ｅｘｔｒ　（ＦＩＸ１６＿１　ｖａｌ１，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｉｎｔ　＿ｅｘｔｒ　（ＦＩＸ１６＿２　ｖａｌ１，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｉｎｔ　＿ｅｘｔｒ　（ＦＩＸ３２＿１　ｖａｌ１，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｉｎｔ　＿ｅｘｔｒ　（ＦＩＸ３２＿２　ｖａｌ１，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
これらの関数は、ビット位置ｖａｌ２からビット位置ｖａｌ３で示されたｖａｌ１のビットフィールドを抽出し、符号拡張を行った結果を返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【００９９】
・「＿ｅｘｔｒｕ（ａ，ｉ１，ｉ２）」：
入力の所定のビット位置を抽出してゼロ拡張する関数である。書式は、以下の通りである。
ｕｎｓｉｇｎｅｄ　ｉｎｔ　＿ｅｘｔｒｕ　（ＦＩＸ１６＿１　ｖａｌ，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｕｎｓｉｇｎｅｄ　ｉｎｔ　＿ｅｘｔｒｕ　（ＦＩＸ１６＿２　ｖａｌ，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｕｎｓｉｇｎｅｄ　ｉｎｔ　＿ｅｘｔｒｕ　（ＦＩＸ３２＿１　ｖａｌ，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
ｕｎｓｉｇｎｅｄ　ｉｎｔ　＿ｅｘｔｒｕ　（ＦＩＸ３２＿２　ｖａｌ，　ｉｎｔ　ｖａｌ２，　ｉｎｔ　ｖａｌ３）
これらの関数は、ビット位置ｖａｌ２からビット位置ｖａｌ３で示されたｖａｌ１のビットフィールドを抽出し、ゼロ拡張を行った結果を返す。これらの関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。
【０１００】
（２）２以上の機械語命令（機械語命令列）に変換される組み込み関数
・「＿ｍｏｄｕｌｏ＿ａｄｄ（）」：
モジュロアドレッシングのアドレス更新を行う関数である。書式は、以下の通りである。
＿ｍｏｄｕｌｏ＿ａｄｄ（ｖｏｉｄ　＊ａｄｄｒ，　ｉｎｔ　ｉｍｍ，　ｉｎｔ　ｍａｓｋ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ，　ｖｏｉｄ　＊ｂａｓｅ）
ここで、各引数の意味は以下の通りである。
ａｄｄｒ：　更新前のアドレス又はアドレス下位（モジュロ部分）
ｉｍｍ：　加算値　（データ数）
ｍａｓｋ：　マスク幅　（モジュロ幅）
ｓｉｚｅ：　データのサイズ（２のべき乗）
ｂａｓｅ：　ベースアドレス　（配列の先頭アドレス）
この関数は、モジュロアドレッシングにより、アドレスａｄｄｒから加算値ｉｍｍだけ加算した結果を返す。
【０１０１】
この関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。つまり、モジュロアドレッシング計算のため、第一の入力の所定のビットフィールドを第二の入力の所定のビットフィールドで置き換える命令（ａｄｄｍｓｋ）を活用している関数である。使用例は、以下の通りである。
2004070531.tif 000008
ここで、変数ＭＯＤＵＬＯは２のべき乗（２＾Ｎ）である。この使用例では、配列ａｒｒａｙの１００個の要素を　ＭＯＤＵＬＯ＊ＳＩＺＥバイトアライメントして配置している。
【０１０２】
・「＿ｂｒｅｖ＿ａｄｄ（）」：
ビットリバースアドレッシングのアドレス更新を行う関数である。書式は、以下の通りである。
＿ｂｒｅｖ＿ａｄｄ（ｖｏｉｄ　＊ａｄｄｒ，　ｉｎｔ　ｃｎｔ，　ｉｎｔ　ｉｍｍ，　ｉｎｔ　ｍａｓｋ，　ｓｉｚｅ＿ｔ　ｓｉｚｅ，　ｖｏｉｄ　＊ｂａｓｅ）
ここで、各引数の意味は以下の通りである。
ａｄｄｒ：　更新前のアドレス
ｃｎｔ：　　ビットリバースカウンタ
ｍｍ：　　加算値　（データ数）
ｍａｓｋ：　マスク幅　（リバース幅）
ｓｉｚｅ：　データのサイズ　　　　　　　　　　　　※　２のべき乗
ｂａｓｅ：　ベースアドレス　（配列の先頭アドレス）
この関数は、ビットリバースアドレッシングにより、ビットリバースカウンタｃｎｔに対応するアドレスａｄｄｒから加算値ｉｍｍだけ加算した結果を返す。
【０１０３】
この関数に対応する機械語命令は、組み込み関数定義ファイル１０３に定義されている通りである。つまり、ビットリバースアドレッシング計算のため、第一の入力の所定のビットフィールドに対してビット単位の位置反転を行なう命令（ｍｓｋｂｒｖｈ）を活用している関数である。使用例は、以下の通りである。
2004070531.tif 000009
ここで、変数ＢＲＥＶは２のべき乗（２＾Ｎ）である。この使用例では、配列ａｒｒａｙの１００個の要素を　ＢＲＥＶ＊ＳＩＺＥバイトアライメントして配置する。
【０１０４】
（３）レジスタ割り付けの対象とならない資源（アキュムレータなど）を指定することが可能な関数
組み込み関数定義ファイル１０３には、最適化のおけるレジスタ割り付けの対象となる資源である汎用レジスタに加えて、レジスタ割り付けの対象とならない資源である（暗黙の資源である）アキュムレータも更新する演算（乗算、積和）であって、アキュムレータを参照型として一時変数を指定することが可能な組み込み関数（乗算「＿ｍｕｌ」、積和「＿ｍａｃ」）が用意されている。具体的な書式は、それぞれ、以下の通りである。
【０１０５】
＿ｍｕｌ（ｌｏｎｇ　＆ｍｈ，　ｌｏｎｇ　＆ｍｌ，　ＦＩＸ１６＿１　＆ｃ，　ＦＩＸ１６＿１　ａ，　ＦＩＸ１６＿１　ｂ）；
この関数は、変数ａ変数ｂとを乗算し、結果の６４ｂｉｔデータの上位３２ビットを乗算用上位アキュムレータＭＨに、下位３２ビットを乗算用下位アキュムレータＭＬに設定し、さらに、アキュムレータＭＨの下位１６ビットとアキュムレータＭＬの上位１６ビットとを連結した３２ビットデータを変数ｃにも設定する。
＿ｍａｃ（ｌｏｎｇ　＆ｍｈ，　ｌｏｎｇ　＆ｍｌ，　ＦＩＸ１６＿１　＆ｃ，　ＦＩＸ１６＿１　ａ，　ＦＩＸ１６＿１　ｂ）；
この関数は、変数ａと変数ｂとを乗算した結果に、乗算用上位アキュムレータＭＨと乗算用下位アキュムレータＭＬとを連結した６４ビットデータを加算し、結果の６４ｂｉｔデータの上位３２ビットを乗算用上位アキュムレータＭＨに、下位３２ビットを乗算用下位アキュムレータＭＬに設定し、さらに、乗算用上位アキュムレータの下位１６ビットと乗算用下位アキュムレータＭＬの上位１６ビットとを連結した３２ビットデータを変数ｃにも設定する。
【０１０６】
使用例は、以下の通りである。
ｌｏｎｇ　ｍｈ，ｍｌ；
＿ｍｕｌ（ｍｈ，ｍｌ，ｄｕｍｍｙ，ａ，ｂ）；
＿ｍａｃ（ｍｈ，ｍｌ，ｅ，ｃ，ｄ）；
というソースプログラムに対して、機械語命令置換部１２２は、組み込み関数定義ファイル１０３での定義に従って、
ｍｕｌ　ｍ０，Ｒｘ，Ｒａ，Ｒｂ
ｍｏｖ　ｒ０，ｍｈ０
ｍｏｖ　ｒ１，ｍｈ１
ｍｏｖ　ｍｈ０，ｒ０
ｍｏｖ　ｍｈ１，ｒ１
ｍａｃ　ｍ０，Ｒｅ，Ｒｃ，Ｒｄ，ｍ０
という機械語命令列に置き換える。なお、上記機械語命令列のうち、第１〜第３行が関数＿ｍｕｌに対応するものであり、第４〜第６行が関数＿ｍａｃに対応するものである。このような機械語命令列は、最適化部１３０において、冗長除去により、第２〜第５行が削除され、
ｍｕｌ　ｍ０，Ｒｘ，Ｒａ，Ｒｂ
ｍａｃ　ｍ０，Ｒｅ，Ｒｃ，Ｒｄ，ｍ０
という機械語命令列に最適化される。このように、レジスタ割り付けの対象とならない資源（アキュムレータなど）を指定することが可能な組み込み関数が使用された場合には、その資源に対する定義（値の格納）と使用（値の参照）との組がコンパイラ内部の最適化（最適化部１３０）にて削除される可能性が高いので、このような組み込み関数は、最適化の点においても有効である。
【０１０７】
次に、本コンパイラ１００の特徴的な動作のうち、最適化部１３０による動作を説明する。
図７４は、最適化部１３０の引数最適化部１３１の動作を示すフローチャートである。引数最適化部１３１は、組み込み関数（ｅｘｔｒ、ｅｘｔｒｕなど）の引数に応じて、適切な命令又はシーケンス（アルゴリズム）を生成するために、その関数の引数がすべて定数の場合には（ステップＳ１１０で左）、それら定数を畳み込んで得られる定数値をオペランドとする機械語命令を生成し（ステップＳ１１１）、引数の一部が定数の場合には（ステップＳ１１０で中央）、即値オペランドの機械語命令を生成し（ステップＳ１１２）、引数のすべてが変数の場合には（ステップＳ１１０で右）、レジスタオペランドの命令列を生成する（ステップＳ１１３）。
【０１０８】
例えば、
ｄ　＝　＿ｅｘｔｒｕ（０ｘｆｆｆ，　７，　４）；
のように、引数のすべて定数の場合には、
ｍｏｖＲｄ，０ｘｆ
のように、畳み込んで定数値を設定した機械語命令を生成する。
一方、
ｄ　＝　＿ｅｘｔｒｕ（ａ，　７，　４）；
のように、一部の引数が定数の場合には、
ｅｘｔｒｕＲｄ，Ｒａ，７，４
のように、即値オペランドの命令を生成する。
さらに一方、
ｄ　＝　＿ｅｘｔｒｕ（ａ，　ｂ，　ｃ）；
のように、すべての引数が変数の場合には、
ａｓｌＲｅ，Ｒｂ，８
ａｎｄＲｆ，Ｒｃ，０ｘ１ｆ
ｏｒＲｇ，Ｒｅ，Ｒｆ
ｅｘｔｒｕＲｄ，Ｒａ，Ｒｇ
のように、レジスタオペランドの命令列を生成する。
【０１０９】
このように、引数最適化部１３１により、１つの組み込み関数は、常に同じ機械語命令が固定的に生成されるのではなく、その引数の性質に応じて最適化された機械語命令（又は機械語命令列）が生成されることになる。
【０１１０】
図７５は、最適化部１３０の型変換最適化部１３２の動作を説明するための演算木を示す図である。型変換最適化部１３２は、異なる型間の演算を効率化するために、ソースプログラム中の一定表記の演算に対して、型変換を伴う機械語命令（ｆｍｕｌｈｗなど）を生成する。
【０１１１】
通常のＣ言語では、１６ｂｉｔ　ｘ　１６ｂｉｔの結果の型は１６ｂｉｔである。１６ｂｉｔ　ｘ　１６ｂｉｔ　−−＞　３２ｂｉｔ　の命令は存在するが、次にように、２つの機械語命令が生成されてしまう。例えば、
ｆ３２　＝　ｆ１６　＊　ｆ１６；
の記述に対して、
ｆｍｕｌｈｈ　　　／／　１６ｂｉｔ　ｘ　１６ｂｉｔ　−＞　１６ｂｉｔ
ａｓｌ　　　　　　／／　１６ｂｉｔ　−＞　３２ｂｉｔの型変換
の２命令が生成されてしまう。
【０１１２】
そこで、型変換最適化部１３２は、ソースプログラムにおいて、　（ＦＩＸ３２）１６ｂｉｔ　＊　（ＦＩＸ３２）１６ｂｉｔ　と記述されている場合には、通常であれば、図７５（ａ）に示される演算木が生成されてしまう（型変換のコードが生成されてしまう）ところ、この演算木を図７５（ｂ）に示される演算木に変換することにより、１６ｂｉｔ　ｘ　１６ｂｉｔ　−−＞　３２ｂｉｔの１命令（ｆｍｕｌｈｗ）を生成する。
【０１１３】
図７６は、レイテンシ最適化部１３３の動作を説明するためのサンプルプログラムの例を示す図である。レイテンシ最適化部１３３は、ソースプログラム１０１に組み込まれたアセンブラ命令（最適化ａｓｍ文）でのレイテンシに関する指示（サイクル数の指定）に基づいて、特定の区間あるいは特定の動作において、指定されたサイクル数だけ実行時間がかかるように、機械語命令をスケジューリングする。
【０１１４】
ユーザは、２種類の指定方法によって、レイテンシを設定することができる。その１つの方法は、図７６（ａ）に示されるプログラムにおける指定（ＬＡＴＥＮＣＹ　Ｌ１，　Ｌ２，　２；）のように、特定の命令に付けられたラベル間のレイテンシを指定する方法である。図７６（ａ）の例では、レイテンシ最適化部１３３は、プロセッサ１によって命令ｗｔｅが実行されてから命令ｒｄｅが実行されるまでに２サイクルだけ経過するように、機械語命令列の配置をスケジューリングする。
【０１１５】
他の１つの方法は、図７６（ｂ）に示されるプログラムにおける指定（命令ｗｔｅ内におけるＬＡＴＥＮＣＹ（２））のように、拡張レジスタ部８０にアクセスする命令（ｒｄ，　ｗｔ，　ｒｄｅ，　ｗｔｅ）について、次に拡張レジスタ部８０にアクセスするまでのレイテンシを指定する方法である。図７６（ｂ）の例では、レイテンシ最適化部１３３は、プロセッサ１によって命令ｗｔｅが実行され、拡張レジスタ部８０にアクセスされてから再び拡張レジスタ部８０にアクセスされるまでに２サイクルだけ経過するように、機械語命令列の配置をスケジューリングする。
【０１１６】
このようなレイテンシの設定よって、ｉｎｌｉｎｅ展開先のコードとの間で最適化（命令結合、冗長除去、命令並べ替え、レジスタ割り付け）が可能になるとともに、指定した命令間又はアクセス間でのレイテンシが確保される。つまり、従来であれば、ユーザは、明示的にｎｏｐ命令を挿入しなければならないところ、このコンパイラ１００によれば、必要な命令又はアクセスについて必要なレイテンシを指定するだけで済む。
【０１１７】
図７７は、パーサー部１１０の固定小数点モード切替部１１１の動作を説明するための図である。
固定小数点モード切替部１１１は、ソースプログラム１０１中に、固定小数点モードを退避・復帰させるプラグマ指令（例えば、＃ｐｒａｇｍａ　＿ｓａｖｅ＿ｆｘｐｍｏｄｅ　ｆｕｎｃ等）を検出すると、プロセッサ１のＰＳＲ３１のビットＦＸＰの退避・復帰を行う機械語命令を生成する。
【０１１８】
なお、前提となる固定小数点に関する仕様として、＿１系（ＦＩＸ１６＿１，ＦＩＸ３２＿１）と＿２系（ＦＩＸ１６＿２，ＦＩＸ３２＿２）の型が存在し、ハードウェア（プロセッサ１）では、ＰＳＲ３１の１ビット（ＦＸＰ）でモード切り替えをしており、さらに、関数内には単一の系統しか使用できないという条件が存在する。
【０１１９】
そこで、これら２つの体系をプログラム上で切り替えて使用する方法として、他の体系からｃａｌｌされる可能性のある関数にプラグマ（＃ｐｒａｇｍａ　＿ｓａｖｅ＿ｆｘｐｍｏｄｅ
関数名）を指定することとしている。これによって、固定小数点モード切替部１１１は、当該関数の先頭と末尾にＦＩＸ型モードの退避・復帰に相当するコードを挿入する。また、各関数のＦＩＸ型宣言をサーチし、その関数をいずれのＦＩＸ型モードでコンパイルするかを決定し、モード設定のコードを挿入する。
【０１２０】
図７７（ａ）は、そのプラグマ指令を伴う関数の例を示している。図７７（ａ）の右側に記されたコメントが固定小数点モード切替部１１１による挿入処理であり、その具体的な処理は、図７７（ｂ）に示される通りである。
【０１２１】
このようなプラグラマ指令の適用例は、図７７（ｃ）に示される通りである。例えば、４つの関数、ｆ１１，　ｆ２１，　ｆ２２，　ｆ２３について、関数ｆ１１：　＿１系　は　関数ｆ２１：　＿２系をｃａｌｌし、関数ｆ２１：　＿２系　は　関数ｆ２２：　＿２系をｃａｌｌし、関数ｆ２２：　＿２系　は関数ｆ２３：　＿２系をｃａｌｌする場合、他のモードからｃａｌｌされる可能性がある関数はｆ２１のみなので、この関数についてのみプラグマ指定するだけで、正常なモード切り替えが可能となる。
【０１２２】
以上のように、本実施の形態におけるコンパイラ１００によれば、演算子定義ファイル１０２及び組み込み関数定義ファイル１０３と機械語命令置換部１２２との連携処理により、ユーザは、モード０及び１の固定小数点型を通常の型として宣言し、使用することができるとともに、高級言語のレベルで組み込み関数を呼び出すことで、プロセッサ１が備える高機能な機械語命令を効率的に生成させることができる。
【０１２３】
また、引数最適化部１３１による組み込み関数の引数についての最適化により、効率的なオペランドを持つ機械語命令が生成される。また、型変換最適化部１３２による型変換についての最適化により、型変換を伴う演算は、プロセッサ１が備える高機能な１つの機械語命令に変換される。さらに、レイテンシ最適化部１３３による機械語命令のスケジューリングにより、ユーザは、ｎｏｐ命令を挿入することなく、特定の命令間あるいは拡張レジスタへのアクセスにおけるレイテンシを確保することができる。
【０１２４】
以上、本発明に係るコンパイラについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
例えば、本実施の形態では、固定小数点の型は、１６ビット又は３２ビットで、かつ、小数点がＭＳＢ又はその下位桁に位置したが、このようなフォーマットだけに限られず、８ビットや６４ビットの固定小数点や、他の桁に小数点が位置する型を対象としてもよい。
【０１２５】
また、ユーザに対する開発支援ツールとして、クラスライブラリを活用した動作検証手法を提供してもよい。つまり、通常であれば、図７８（ａ）に示されるように、本実施の形態におけるターゲットマシン（プロセッサ１）用のクロスコンパイラ（コンパイラ１００）を用いてテストソースと定義ファイル１０２及び１０３等をコンパイルし、得られたプロセッサ１用の機械語プログラムを専用のシミュレータで実行させることによって動作検証を行うが、これに代えて、図７８（ｂ）に示されるように、開発用ホストマシン（例えば、米国インテル社製のプロセッサ）を対象としたクラスライブラリ（演算子定義ファイル１０２及び組み込み関数定義ファイル１０３それぞれをプロセッサ１ではなく、ホストマシンの機械語命令に対応させる定義ファイル）を用意し、テストソース、定義ファイル１０２及び１０３と共に、ネイティブコンパイラ（Ｖｉｓｕａｌ　Ｃ＋＋（Ｒ）等）でコンパイルし、得られた機械語プログラムをそのままホストマシンで実行させてもよい。これによって、慣れた環境で高速にシミュレーションし、動作検証を行うことが可能となる。
【０１２６】
さらに、本実施の形態では、ターゲットプロセッサに特有の機械語命令に対応する演算子や組み込み関数は、ヘッダファイル（定義ファイル１０２及び１０３）として供給されたが、本発明に係るコンパイラは、このような定義ファイルでの情報をコンパイラ自身の中に組み込んだ構成としてもよい。つまり、本発明に係るコンパイラは、上記定義ファイル１０２及び１０３が組み込まれた一体形式のプログラムであって、対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報を含み、ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、中間コード変換ステップは、前記中間コードのうち、前記演算処理定義情報で定義された演算処理を参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行う構成としてもよい。これによって、ユーザは、ソースプログラムにおいて定義ファイルをインクルードする必要がなくなる。
【０１２７】
【発明の効果】
以上の説明から明らかように、本発明に係るコンパイラ用プログラムは、ソースプログラムを機械語プログラムに翻訳するコンパイラ用のプログラムであって、対象とするプロセッサに特有の機械語命令に対応する演算処理が予め定義された演算処理定義情報を含み、前記プログラムは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記演算処理定義情報で定義された演算処理を参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うことを特徴とする。
【０１２８】
例えば、本発明に係るプログラムは、ソースプログラムにインクルードされるヘッダファイルと、そのソースプログラムを機械語プログラムに翻訳するコンパイラとから構成されるプログラムであって、前記ヘッダファイルには、データとメソッドとからなるクラスが定義され、前記コンパイラは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義されたクラスを参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うプログラムである。
【０１２９】
これによって、ソースプログラムにおいて、ヘッダファイルで定義されているクラスを参照しているステートメントがある場合には、そのステートメントに対応する中間コードは、機械語命令に変換された後に最適化処理の対象となるので、周辺の機械語命令と含めて最適化が施され得る。また、コンパイラは、コンパイラ自身の機能（最適化処理）だけでなく、ヘッダファイルでの定義との連携によって最適化を図っているので、ヘッダファイルの内容を更新するだけで、最適化の対象となるステートメントを増加させたり、最適化のレベルを向上させたりすることができる。
【０１３０】
ここで、前記クラスは、固定小数点型を定義するクラスであり、前記検出サブステップでは、前記固定小数点型のデータを使用している中間コードを検出してもよい。そして、前記クラスのメソッドは、前記固定小数点型のデータを対象とする演算子を定義するメソッドであり、前記検出サブステップでは、演算子と演算の対象となるデータの型との組が前記メソッドでの定義と一致するか否かによって前記検出をし、前記置換サブステップでは、前記演算子と前記データの型との組が一致する中間コードを、対応する機械語命令に置き換えてもよい。
【０１３１】
これによって、ヘッダファイルで定義されている固定小数点型及び演算子についても、通常の型と同様に、コンパイラによって対応する中間コードや機械語命令に変換されるので、ユーザは、ソースプログラムにおいてそのヘッダファイルをインクルードしておくだけで、通用の型と同様に、ターゲットプロセッサ特有の固定小数点モードに対応した型の宣言や使用をすることが可能となる。
【０１３２】
また、本発明に係るコンパイラ用プログラムは、ソースプログラムにインクルードされるヘッダファイルと、そのソースプログラムを機械語プログラムに翻訳するコンパイラとから構成されるプログラムであって、前記ヘッダファイルには、関数が定義され、前記コンパイラは、前記ソースプログラムを解析するパーサーステップと、解析されたソースプログラムを中間コードに変換する中間コード変換ステップと、変換された中間コードを最適化する最適化ステップと、最適化された中間コードを機械語命令に変換するコード生成ステップとを含み、前記中間コード変換ステップは、前記中間コードのうち、前記ヘッダファイルで定義された関数を参照しているものがあるか否かを検出する検出サブステップと、あると検出された場合に、その中間コードを、対応する機械語命令に置き換える置換サブステップとを含み、前記最適化ステップでは、前記置換サブステップで置き換えられた機械語命令を含む前記中間コードを対象として最適化を行うことを特徴とする。
【０１３３】
これによって、ソースプログラムにおいて、ヘッダファイルで定義されている関数（組み込み関数）を参照しているステートメントがある場合には、そのステートメントに対応する中間コードは、そのヘッダファイルで定義されている機械語命令に変換された後に最適化処理の対象となるので、周辺の機械語命令と含めて最適化が施され得る。また、ユーザは、プロセッサ専用の高機能命令を使用したい場合には、ソースプログラムにおいてそのヘッダファイルをインクルードしておくとともに、必要な組み込み関数を呼び出す旨の記述をしておくだけで済む。つまり、アセンブラ命令でコーディングすることから解放される。
【０１３４】
以上のように、本発明に係るコンパイラにより、ターゲットプロセッサが備える高機能な専用命令が効率的に生成され、高いレベルで最適化が施されるとともに、ヘッダファイルによる機能拡張等の柔軟な対応が可能となり、特に、コードサイズと実行速度の両面で厳しい仕様が求められるメディア処理アプリケーションの開発ツールとして、その実用的価値は極めて高い。
【図面の簡単な説明】
【図１】本発明に係るコンパイラの対象となるプロセッサの概略ブロック図である。
【図２】同プロセッサの算術論理・比較演算器の概略図を示す。
【図３】同プロセッサのバレルシタの構成を示すブロック図である。
【図４】同プロセッサの変換器の構成を示すブロック図である。
【図５】同プロセッサの除算器の構成を示すブロック図である。
【図６】同プロセッサの乗算・積和演算器の構成を示すブロック図である。
【図７】同プロセッサの命令制御部の構成を示すブロック図である。
【図８】同プロセッサの汎用レジスタ（Ｒ０〜Ｒ３１）の構造を示す図である。
【図９】同プロセッサのリンクレジスタ（ＬＲ）の構造を示す図である。
【図１０】同プロセッサの分岐レジスタ（ＴＡＲ）の構造を示す図である。
【図１１】同プロセッサのプログラム状態レジスタ（ＰＳＲ）の構造を示す図である。
【図１２】同プロセッサの条件フラグレジスタ（ＣＦＲ）の構造を示す図である。
【図１３】同プロセッサのアキュムレータ（Ｍ０，Ｍ１）の構造を示す図である。
【図１４】同プロセッサのプログラムカウンタ（ＰＣ）の構造を示す図である。
【図１５】同プロセッサのＰＣ退避用レジスタ（ＩＰＣ）の構造を示す図である。
【図１６】同プロセッサのＰＳＲ退避用レジスタ（ＩＰＳＲ）の構造を示す図である。
【図１７】同プロセッサのパイプライン動作を示すタイミング図である。
【図１８】同プロセッサによる命令実行時の各パイプライン動作を示すタイミング図である。
【図１９】同プロセッサの並列動作を示す図である。
【図２０】同プロセッサが実行する命令のフォーマットを示す図である。
【図２１】カテゴリー「ＡＬＵａｄｄ（加算）系」に属する命令を説明する図である。
【図２２】カテゴリー「ＡＬＵｓｕｂ（減算）系」に属する命令を説明する図である。
【図２３】カテゴリー「ＡＬＵｌｏｇｉｃ（論理演算）系ほか」に属する命令を説明する図である。
【図２４】カテゴリー「ＣＭＰ（比較演算）系」に属する命令を説明する図である。
【図２５】カテゴリー「ｍｕｌ（乗算）系」に属する命令を説明する図である。
【図２６】カテゴリー「ｍａｃ（積和演算）系」に属する命令を説明する図である。
【図２７】カテゴリー「ｍｓｕ（積差演算）系」に属する命令を説明する図である。
【図２８】カテゴリー「ＭＥＭｌｄ（メモリ読み出し）系」に属する命令を説明する図である。
【図２９】カテゴリー「ＭＥＭｓｔｏｒｅ（メモリ書き出し）系」に属する命令を説明する図である。
【図３０】カテゴリー「ＢＲＡ（分岐）系」に属する命令を説明する図である。
【図３１】カテゴリー「ＢＳａｓｌ（算術バレルシフト）系ほか」に属する命令を説明する図である。
【図３２】カテゴリー「ＢＳｌｓｒ（論理バレルシフト）系ほか」に属する命令を説明する図である。
【図３３】カテゴリー「ＣＮＶｖａｌｎ（算術変換）系」に属する命令を説明する図である。
【図３４】カテゴリー「ＣＮＶ（一般変換）系」に属する命令を説明する図である。
【図３５】カテゴリー「ＳＡＴｖｌｐｋ（飽和処理）系」に属する命令を説明する図である。
【図３６】カテゴリー「ＥＴＣ（その他）系」に属する命令を説明する図である。
【図３７】本発明に係るコンパイラの構成を示す機能ブロック図である。
【図３８】演算子定義ファイルのリストの一部を示す図である。
【図３９】演算子定義ファイルのリストの一部を示す図である。
【図４０】演算子定義ファイルのリストの一部を示す図である。
【図４１】演算子定義ファイルのリストの一部を示す図である。
【図４２】演算子定義ファイルのリストの一部を示す図である。
【図４３】演算子定義ファイルのリストの一部を示す図である。
【図４４】演算子定義ファイルのリストの一部を示す図である。
【図４５】演算子定義ファイルのリストの一部を示す図である。
【図４６】演算子定義ファイルのリストの一部を示す図である。
【図４７】演算子定義ファイルのリストの一部を示す図である。
【図４８】演算子定義ファイルのリストの一部を示す図である。
【図４９】演算子定義ファイルのリストの一部を示す図である。
【図５０】演算子定義ファイルのリストの一部を示す図である。
【図５１】演算子定義ファイルのリストの一部を示す図である。
【図５２】演算子定義ファイルのリストの一部を示す図である。
【図５３】演算子定義ファイルのリストの一部を示す図である。
【図５４】演算子定義ファイルのリストの一部を示す図である。
【図５５】演算子定義ファイルのリストの一部を示す図である。
【図５６】演算子定義ファイルのリストの一部を示す図である。
【図５７】演算子定義ファイルのリストの一部を示す図である。
【図５８】演算子定義ファイルのリストの一部を示す図である。
【図５９】演算子定義ファイルのリストの一部を示す図である。
【図６０】演算子定義ファイルのリストの一部を示す図である。
【図６１】演算子定義ファイルのリストの一部を示す図である。
【図６２】演算子定義ファイルのリストの一部を示す図である。
【図６３】演算子定義ファイルのリストの一部を示す図である。
【図６４】演算子定義ファイルのリストの一部を示す図である。
【図６５】演算子定義ファイルのリストの一部を示す図である。
【図６６】演算子定義ファイルのリストの一部を示す図である。
【図６７】演算子定義ファイルのリストの一部を示す図である。
【図６８】演算子定義ファイルのリストの一部を示す図である。
【図６９】組み込み関数定義ファイルのリストの一部を示す図である。
【図７０】組み込み関数定義ファイルのリストの一部を示す図である。
【図７１】組み込み関数定義ファイルのリストの一部を示す図である。
【図７２】組み込み関数定義ファイルのリストの一部を示す図である。
【図７３】機械語命令置換部の動作を示すフローチャートである。
【図７４】最適化部の引数最適化部の動作を示すフローチャートである。
【図７５】最適化部の型変換最適化部の動作を説明するための演算木を示す図である。
【図７６】レイテンシ最適化部の動作を説明するためのサンプルプログラムの例を示す図である。
【図７７】パーサー部の固定小数点モード切替部の動作を説明するための図である。
【図７８】クラスライブラリを活用した動作検証手法を説明するための図である。
【符号の説明】
１　　プロセッサ
１０　　命令制御部
２０　　デコード部
３０　　レジスタファイル
３１　　プログラム状態レジスタ（ＰＳＲ）
３２　　条件フラグレジスタ（ＣＦＲ）
３３　　プログラムカウンタ（ＰＣ）
３４　　ＰＣ退避用レジスタ（ＩＰＣ）
３５　　ＰＳＲ退避用レジスタ（ＩＰＳＲ）
４０　　演算部
４１〜４３　算術論理・比較演算器
４４　　積和演算器
４５　　バレルシフタ
４６　　除算器
４７　　変換器
５０　　Ｉ／Ｆ部
６０　　命令メモリ部
７０　　データメモリ部
８０　　拡張レジスタ部
９０　　Ｉ／Ｏインターフェース部
１００　　コンパイラ
１０１　　ソースプログラム
１０２　　演算子定義ファイル
１０３　　組み込み関数定義ファイル
１０５　　機械語プログラム
１１０　　パーサー部
１１１　　固定小数点モード切替部
１２０　　中間コード変換部
１２１　　中間コード生成部
１２２　　機械語命令置換部
１２２ａ　置換テーブル
１３０　　最適化部
１３１　　引数最適化部
１３２　　型変換最適化部
１３３　　レイテンシ最適化部
１４０　　コード生成部
【図１】
2004070531.tif 000010
【図２】
2004070531.tif 000011
【図３】
2004070531.tif 000012
【図４】
2004070531.tif 000013
【図５】
2004070531.tif 000014
【図６】
2004070531.tif 000015
【図７】
2004070531.tif 000016
【図８】
2004070531.tif 000017
【図９】
2004070531.tif 000018
【図１０】
2004070531.tif 000019
【図１１】
2004070531.tif 000020
【図１２】
2004070531.tif 000021
【図１３】
2004070531.tif 000022
【図１４】
2004070531.tif 000023
【図１５】
2004070531.tif 000024
【図１６】
2004070531.tif 000025
【図１７】
2004070531.tif 000026
【図１８】
2004070531.tif 000027
【図１９】
2004070531.tif 000028
【図２０】
2004070531.tif 000029
【図２１】
2004070531.tif 000030
【図２２】
2004070531.tif 000031
【図２３】
2004070531.tif 000032
【図２４】
2004070531.tif 000033
【図２５】
2004070531.tif 000034
【図２６】
2004070531.tif 000035
【図２７】
2004070531.tif 000036
【図２８】
2004070531.tif 000037
【図２９】
2004070531.tif 000038
【図３０】
2004070531.tif 000039
【図３１】
2004070531.tif 000040
【図３２】
2004070531.tif 000041
【図３３】
2004070531.tif 000042
【図３４】
2004070531.tif 000043
【図３５】
2004070531.tif 000044
【図３６】
2004070531.tif 000045
【図３７】
2004070531.tif 000046
【図３８】
2004070531.tif 000047
【図３９】
2004070531.tif 000048
【図４０】
2004070531.tif 000049
【図４１】
2004070531.tif 000050
【図４２】
2004070531.tif 000051
【図４３】
2004070531.tif 000052
【図４４】
2004070531.tif 000053
【図４５】
2004070531.tif 000054
【図４６】
2004070531.tif 000055
【図４７】
2004070531.tif 000056
【図４８】
2004070531.tif 000057
【図４９】
2004070531.tif 000058
【図５０】
2004070531.tif 000059
【図５１】
2004070531.tif 000060
【図５２】
2004070531.tif 000061
【図５３】
2004070531.tif 000062
【図５４】
2004070531.tif 000063
【図５５】
2004070531.tif 000064
【図５６】
2004070531.tif 000065
【図５７】
2004070531.tif 000066
【図５８】
2004070531.tif 000067
【図５９】
2004070531.tif 000068
【図６０】
2004070531.tif 000069
【図６１】
2004070531.tif 000070
【図６２】
2004070531.tif 000071
【図６３】
2004070531.tif 000072
【図６４】
2004070531.tif 000073
【図６５】
2004070531.tif 000074
【図６６】
2004070531.tif 000075
【図６７】
2004070531.tif 000076
【図６８】
2004070531.tif 000077
【図６９】
2004070531.tif 000078
【図７０】
2004070531.tif 000079
【図７１】
2004070531.tif 000080
【図７２】
2004070531.tif 000081
【図７３】
2004070531.tif 000082
【図７４】
2004070531.tif 000083
【図７５】
2004070531.tif 000084
【図７６】
2004070531.tif 000085
【図７７】
2004070531.tif 000086
【図７８】
2004070531.tif 000087