(57)【要約】【課題】命令分解用の予備のレジスタの有効活用を実現すると共に、予備のレジスタの複数用途での共用の際のエラー検出性を確保できるようなコンパイラシステムを提供する。【解決手段】命令定義資源設定部３１は、レジスタ割り付け部３２による処理の前処理として、命令毎にその命令で定義および参照するレジスタなどの資源を中間コードに設定していく。命令定義資源設定部３１は、各命令が複数命令に分解される可能性について検出し、分解される可能性がある命令については、分解に使用するレジスタＲ２９の定義および参照があるものとして、レジスタＲ２９を中間コードに設定する。レジスタ割り付け部３２は、分解に使用するレジスタＲ２９の生存区間を跨がない範囲で、レジスタＲ２９を汎用用途に使用する。【選択図】図２
2008269569.tif 000002
【特許請求の範囲】
【請求項１】
高級言語またはアセンブリ言語で記述されたプログラムを対象プロセッサで動作する機械語コードに変換するコード変換装置であって、
前記プログラム中の各命令について、前記対象プロセッサの資源を第１の用途に使用するか否かを判断する第１用途命令判断手段と、
前記第１用途命令判断手段により前記資源を前記第１の用途に使用しないと判断される命令については、前記資源を前記第１の用途と異なる第２の用途に使用する機械語コードを生成する第２用途命令生成手段と
を備えるコード変換装置。
【請求項２】
前記資源は、前記対象プロセッサが備えるレジスタである
請求項１に記載のコード変換装置。
【請求項３】
前記第１の用途または前記第２の用途は、前記プログラム中の命令を機械語コードに変換した際に数値オペランドが命令のオペランド幅をあふれる命令の補完の用途である
請求項１または２に記載のコード変換装置。
【請求項４】
前記補完は、数値オペランドが命令のオペランド幅をあふれる前記命令を、前記資源を用いて複数の命令に分割することである
請求項３に記載のコード変換装置。
【請求項５】
前記第１の用途または前記第２の用途は、１つまたは複数の命令を、当該命令と異なりかつ当該命令と等価な１つまたは複数の命令に変換する用途である
請求項１または２に記載のコード変換装置。
【請求項６】
前記第１の用途または前記第２の用途は、前記対象プロセッサの特定の機能を制御する用途である
請求項１または２に記載のコード変換装置。
【請求項７】
前記コード変換装置は、
高級言語で記述されたプログラムをアセンブリプログラムに変換するコンパイラと、
アセンブリプログラムを、機械語コードを含むオブジェクトファイルに変換するアセンブラと、
１つまたは複数のオブジェクトファイルを連結することにより、前記１つまたは複数のオブジェクトファイルを実行形式ファイルに変換するリンカとを備え、
前記コンパイラは、前記第１用途命令判断手段および前記第２用途命令生成手段を含み、
前記第１用途命令判断手段は、前記コンパイラに後続して処理される前記アセンブラおよび前記リンカの処理にて、前記資源を前記第１の用途に使用する可能性がある命令を、前記資源を前記第１の用途に使用する命令として分析する
請求項１〜６のいずれか１項に記載のコード変換装置。
【請求項８】
前記第１用途命令判断手段は、前記資源を前記第１の用途に使用する可能性があるか否かを、命令の種類によって判定する
請求項７に記載のコード変換装置。
【請求項９】
前記第１用途命令判断手段は、前記資源を前記第１の用途に使用する可能性があるか否かを、オペランドが取り得る値の範囲によって判定する
請求項７に記載のコード変換装置。
【請求項１０】
前記コンパイラは、前記対象プロセッサが備える複数のレジスタについて、前記プログラム中の各命令における前記第２の用途へのレジスタの使用状況の情報を前記アセンブラおよび前記リンカに伝達し、
前記アセンブラおよび前記リンカは、入力される各命令について前記第１の用途に使用するレジスタを前記コンパイラから伝達された情報に基づいて選択する
請求項７〜９のいずれか１項に記載のコード変換装置。
【請求項１１】
高級言語またはアセンブリ言語で記述されたプログラムを対象プロセッサで動作する機械語コードに変換するコード変換装置であって、
前記対象プロセッサの資源の用途に関するプログラマの指示を受理する指示受理手段と、
前記指示で指定される用途に前記資源を用いる機械語コードを生成するコード生成手段と
を備えるコード変換装置。
【請求項１２】
前記資源は、前記対象プロセッサが備えるレジスタである
請求項１１に記載のコード変換装置。
【請求項１３】
前記プログラマの指示は、前記資源の複数の用途である第１の用途および第２の用途のうち、前記プログラム中で第１の用途に使用する命令の指示である
請求項１１または１２に記載のコード変換装置。
【請求項１４】
前記第１の用途または前記第２の用途は、前記プログラム中の命令を機械語コードに変換した際に数値オペランドが命令のオペランド幅をあふれる命令の補完の用途である
請求項１３に記載のコード変換装置。
【請求項１５】
前記補完は、数値オペランドが命令のオペランド幅をあふれる命令を、前記資源を用いて複数の命令に分割することである
請求項１４に記載のコード変換装置。
【請求項１６】
前記第１の用途または前記第２の用途は、１つまたは複数の命令を、当該命令と異なりかつ当該命令と等価な１つまたは複数の命令に変換する用途である
請求項１３に記載のコード変換装置。
【請求項１７】
前記第１の用途または前記第２の用途は、前記対象プロセッサの特定の機能を制御する用途である
請求項１３に記載のコード変換装置。
【請求項１８】
前記プログラマの指示は、前記コード変換装置に対する疑似命令による指示である
請求項１１〜１７のいずれか１項に記載のコード変換装置。
【請求項１９】
前記プログラマの指示は、前記コード変換装置の動作オプションによる指示である
請求項１１〜１７のいずれか１項に記載のコード変換装置。
【請求項２０】
前記プログラマの指示は、前記コード変換装置に対するプラグマによる指示である
請求項１１〜１７のいずれか１項に記載のコード変換装置。
【請求項２１】
前記プログラマの指示は、前記資源を前記第１の用途または前記第２の用途として使用する区間の始点と終点を示す指示である
請求項１３〜１７のいずれか１項に記載のコード変換装置。
【請求項２２】
前記プログラマの指示は、前記資源を前記第１の用途または前記第２の用途として使用する区間の情報を前記プログラムの一部にまとめて記述した指示である
請求項１３〜１７のいずれか１項に記載のコード変換装置。
【請求項２３】
前記プログラマの指示は、前記資源を前記第１の用途および前記第２の用途のいずれの用途で使用するかを前記プログラムのファイル単位で示した指示である
請求項１３〜１７のいずれか１項に記載のコード変換装置。
【請求項２４】
前記プログラマの指示は、前記資源を前記第１の用途および前記第２の用途のいずれの用途で使用するかを前記プログラム中の命令単位で示した指示である
請求項１３〜１７のいずれか１項に記載のコード変換装置。
【請求項２５】
前記プログラマの指示は、前記プログラム中の前記資源の表記を前記第１の用途と前記第２の用途とで異なる表記を用いることによってなされる
請求項１３〜１７のいずれか１項に記載のコード変換装置。
【請求項２６】
さらに、前記資源の用途に関する前記プログラマの指示に基づいて、プログラマの記述の誤りを検出するエラー検出手段を備える
請求項１１〜２５のいずれか１項に記載のコード変換装置。
【請求項２７】
さらに、前記プログラムがプログラマの記述によるものか否かを判定するプログラム種別判定手段を備え、
前記エラー検出手段は、前記プログラム種別判定手段が前記プログラムがプログラマの記述によるプログラムであると判定した場合に限りエラーの検出を行う
請求項２６に記載のコード変換装置。
【請求項２８】
前記プログラム種別判定手段は、前記コード変換装置に対する疑似命令によってプログラムの種別の判定を行う
請求項２７に記載のコード変換装置。
【請求項２９】
前記プログラム種別判定手段は、前記コード変換装置の動作オプションによってプログラムの種別の判定を行う
請求項２７に記載のコード変換装置。
【請求項３０】
前記プログラム種別判定手段は、前記コード変換装置に対するプラグマ指令によって種別の判定を行う
請求項２７に記載のコード変換装置。
【請求項３１】
前記コード変換装置は、
アセンブリプログラムを機械語コードを含むオブジェクトファイルに変換するアセンブラと、
１つまたは複数のオブジェクトファイルを連結することにより、前記１つまたは複数のオブジェクトファイルを実行形式ファイルに変換するリンカとを備え、
前記アセンブラは、前記指示受理手段と、前記コード生成手段とを備え、
前記コード生成手段は、
前記指示受理手段で受理した指示に基づいて、前記アセンブリプログラムの各命令記述における前記資源の用途を判定する用途判定手段と、
前記アセンブリプログラムの命令記述を、判定された前記用途に前記資源を用いる機械語コードに変換する変換手段とを有する
請求項１１〜３０のいずれか１項に記載のコード変換装置。
【請求項３２】
前記用途判定手段は、前記指示受理手段で受信した指示に基づいて、前記資源に相当する対象プロセッサのレジスタが、汎用レジスタ用途に使用される区間と数値オペランドがあふれた際の補完用途に使用される区間とを判定し、
前記変換手段は、前記用途判定手段により前記レジスタが前記汎用レジスタ用途と判定された区間に含まれる命令記述については、当該命令記述を当該命令記述通りの機械語コードに変換し、前記用途判定手段により前記レジスタが前記補完用途と判定された区間に含まれる命令記述については、当該命令記述を当該命令記述に対して数値オペランドのあふれを補完した状態の機械語コードに変換し、
前記リンカは、入力される複数のオブジェクトファイルを連結してメモリ上の配置アドレスを確定するアドレス解決手段を備え、
前記アドレス解決手段は、解決された数値オペランドの値が命令のオペランド幅をあふれた場合にはエラーを検出する
請求項３１に記載のコード変換装置。
【請求項３３】
前記アセンブラは、入力されたアセンブリプログラム中での前記資源が使用されている範囲を前記資源を第１の用途に使用する区間と判定し、残りの部分を前記資源を第２の用途に使用する区間と判定する
請求項７〜１０、３１および３２のいずれか１項に記載のコード変換装置。
【請求項３４】
前記第２の用途は、前記アセンブリプログラムを機械語コードに変換した際に数値オペランドが命令のオペランド幅をあふれる命令の前記アセンブラまたは前記リンカによる補完の用途である
請求項３３に記載のコード変換装置。
【請求項３５】
さらに、前記資源の用途に関するプログラマの指示に基づいて、前記資源を前記第１の用途または前記第２の用途に使用したプログラム中の部分に対する警告メッセージを表示する警告メッセージ表示手段を備える
請求項１１〜３４に記載のコード変換装置。
【請求項３６】
前記警告メッセージ表示手段は、前記資源の用途に関する前記プログラマの指示によって、警告メッセージの表示または非表示を選択する
請求項３５に記載のコード変換装置。
【請求項３７】
前記プログラマの指示は、前記コード変換装置に対する疑似命令による指示である
請求項３６に記載のコード変換装置。
【請求項３８】
前記プログラマの指示は、前記コード変換装置の動作オプションによる指示である
請求項３６に記載のコード変換装置。
【請求項３９】
前記プログラマの指示は、前記コード変換装置に対するプラグマ指令による指示である
請求項３６に記載のコード変換装置。
【請求項４０】
さらに、前記プログラムがプログラマの記述によるか否かを判定するプログラム種別判定手段を備え、
前記警告メッセージ表示手段は、前記プログラムがプログラマの記述によるプログラムである場合に限り警告メッセージを表示する
請求項３５に記載のコード変換装置。
【請求項４１】
前記プログラム種別判定手段は、前記コード変換装置に対する疑似命令に基づいて、前記プログラムがプログラマの記述によるか否かを判定する
請求項４０に記載のコード変換装置。
【請求項４２】
前記プログラム種別判定手段は、前記コード変換装置の動作オプションに基づいて、前記プログラムがプログラマの記述によるか否かを判定する
請求項４０に記載のコード変換装置。
【請求項４３】
前記プログラム種別判定手段は、前記コード変換装置に対するプラグマ指令に基づいて、前記プログラムがプログラマの記述によるか否かを判定する
請求項４０に記載のコード変換装置。
【請求項４４】
前記コード変換装置は、
高級言語で記述されたプログラムをアセンブリプログラムに変換するコンパイラと、
アセンブリプログラムを、機械語コードを含むオブジェクトファイルに変換するアセンブラと、
１つまたは複数のオブジェクトファイルを連結することにより、前記１つまたは複数のオブジェクトファイルを実行形式ファイルに変換するリンカとを備え、
前記アセンブラは、前記プログラム種別判定手段または前記プログラマの指示を受理する手段を備え、
前記リンカは、前記警告メッセージ表示手段を備える
請求項４０〜４３のいずれか１項に記載のコード変換装置。
【請求項４５】
前記コンパイラは、前記警告メッセージの表示を抑制する指示を前記アセンブリプログラムに出力し、
前記警告メッセージ表示手段は、前記警告メッセージの表示を抑制する指示に応答して、警告メッセージの表示を抑制する
請求項４４に記載のコード変換装置。
【請求項４６】
前記資源はレジスタであり、
レジスタの用途に関する前記プログラマによる指示は、数値オペランドがあふれた際の補完時に警告メッセージを表示すべきか否かの指示である
請求項３６〜４５のいずれか１項に記載のコード変換装置。
【請求項４７】
請求項１〜４６のいずれか１項に記載のコード変換装置の手段としてコンピュータを機能させるためのプログラム。
【請求項４８】
請求項４７に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４９】
プロセッサ上で動作するプログラムであって、
前記プロセッサの資源を第１の用途に使用するコードと第２の用途に使用するコードとの両方のコードを含むプログラム。
【請求項５０】
前記第１の用途または第２の用途は、数値オペランドが命令のオペランド幅をあふれる命令の補完の用途である
請求項４９に記載のプログラム。
【請求項５１】
前記補完は、数値オペランドが命令のオペランド幅をあふれる場合に、前記命令を前記資源を用いて複数の命令に分割することである
請求項５０に記載のプログラム。
【請求項５２】
前記第１の用途または前記第２の用途は、前記対象プロセッサの特定の機能を制御する用途である
請求項４９に記載のプログラム。
【請求項５３】
請求項４９〜５２のいずれか１項に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項５４】
プロセッサで動作する機械語コードに変換される高級言語またはアセンブリ言語で記述されたプログラムであって、
前記プロセッサの資源についての用途と、前記資源を当該用途に使用する区間とを示す情報を含むプログラム。
【請求項５５】
前記情報は、アセンブラに対する疑似命令である
請求項５４に記載のプログラム。
【請求項５６】
前記情報は、前記資源を所定の用途として使用する区間の始点と終点を示す指示である
請求項５４に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語やアセンブリ言語で記述されたソースプログラムを機械語プログラムに変換するコード変換装置に関し、特にプロセッサに備えられたレジスタを有効活用しつつソースプログラムのエラー検出性を確保するコード変換装置に関する。
【背景技術】
【０００２】
プロセッサで実行される即値やアドレスなどの定数を扱う命令において、定数のビット幅が命令フォーマットの所定の幅よりもあふれる場合には、単一の命令でその機能を実現することができない。このため、１つの命令を、定数を設定する命令と演算する命令とに分けるなどして、複数の命令に分解する必要がある。
【０００３】
これに対して、従来は、例えば特許文献１に記載の発明のように、ソースプログラムのコンパイルの段階で単一の命令を複数の命令に分解しつつ、定数の参照の効率化を図る方法がある。
【０００４】
また、別のアプローチとして、アドレスなどの値があふれるかどうかはリンク時までわからないため、コンパイル時には単一の命令で機械語コードを生成しておき、リンクの段階で必要な命令に対してのみ適宜予備のレジスタ等を活用して複数の命令への分解を行うという手法がある。
【特許文献１】特開平８−６７９７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
アドレスやディスプレースメント等の多くの値はリンク時まで確定しないのにもかかわらず、コンパイル時に複数の命令に分解してしまうと、必要でない命令に対しても命令の分解が起こる。このため、実行性能やコードサイズの面で効率が悪い。
【０００６】
また、リンクの段階で必要な命令に対してのみ予備のレジスタを活用して命令の分解を行うというアプローチでは、予備のレジスタをリザーブしておく必要がある。このため、予備のレジスタを汎用レジスタとして使用できないことに起因するレジスタ圧迫による性能劣化、ハードウェア資源の増加およびハードウェア利用効率の低下の問題がある。
【０００７】
これに対しては、プログラマの責任で予備のレジスタを汎用レジスタ用途にも共用することも考えられるが、誤った使用に対するエラー検出を行なうことができるツールがない。このため、デバッグ性が低下し、開発効率の低下を招く。
【０００８】
本発明は、上述の課題を解決するためになされたもので、上記命令分解用の予備のレジスタの有効活用を実現すると共に、予備のレジスタを複数用途で共用する際のエラー検出性を確保できるようなコンパイラシステムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明のある局面に係るコード変換装置は、高級言語またはアセンブリ言語で記述されたプログラムを対象プロセッサで動作する機械語コードに変換するコード変換装置であって、前記プログラム中の各命令について、前記対象プロセッサの資源を第１の用途に使用するか否かを判断する第１用途命令判断手段と、前記第１用途命令判断手段により前記資源を前記第１の用途に使用しないと判断される命令については、前記資源を前記第１の用途と異なる第２の用途に使用する機械語コードを生成する第２用途命令生成手段とを備える。
【００１０】
この構成によると、プロセッサが備えるレジスタ資源を自動的に複数の用途に共用することができる。このため、実行性能を向上させ、コードサイズを低下させることができる。また、命令分解用の予備のレジスタ等のハードウェア資源の利用効率も向上する。
【００１１】
好ましくは、前記第１の用途または前記第２の用途は、前記プログラム中の命令を機械語コードに変換した際に数値オペランドが命令のオペランド幅をあふれる命令の補完の用途である。
【００１２】
また、前記補完は、数値オペランドが命令のオペランド幅をあふれる前記命令を、前記資源を用いて複数の命令に分割することである。
【００１３】
この構成によると、命令分解用の予備のレジスタを命令の補完の用途としても使用することができる。その一方、予備のレジスタを汎用用途としても使用することができる。このため、予備のレジスタの有効活用を図ることができる。
【００１４】
好ましくは、前記第１の用途または前記第２の用途は、前記対象プロセッサの特定の機能を制御する用途である。
【００１５】
この構成によると、対象プロセッサの資源をプロセッサの制御用途として使用することができる。その一方、当該資源を汎用用途としても使用することができる。このため、プロセッサの資源の有効活用を図ることができる。
【００１６】
本発明の他の局面に係るコード変換装置は、高級言語またはアセンブリ言語で記述されたプログラムを対象プロセッサで動作する機械語コードに変換するコード変換装置であって、前記対象プロセッサの資源の用途に関するプログラマの指示を受理する指示受理手段と、前記指示で指定される用途に前記資源を用いる機械語コードを生成するコード生成手段とを備える。
【００１７】
この構成によると、プログラマの意図に沿って、プロセッサの資源を複数の用途に使い分けることができる。このため、実行性能を向上させ、コードサイズを低下させることができる。また、プロセッサの資源の利用効率も向上する。
【００１８】
好ましくは、前記コード変換装置は、アセンブリプログラムを機械語コードを含むオブジェクトファイルに変換するアセンブラと、１つまたは複数のオブジェクトファイルを連結することにより、前記１つまたは複数のオブジェクトファイルを実行形式ファイルに変換するリンカとを備え、前記アセンブラは、前記指示受理手段と、前記コード生成手段とを備え、前記コード生成手段は、前記指示受理手段で受理した指示に基づいて、前記アセンブリプログラムの各命令記述における前記資源の用途を判定する用途判定手段と、前記アセンブリプログラムの命令記述を、判定された前記用途に前記資源を用いる機械語コードに変換する変換手段とを有する。
【００１９】
また、前記用途判定手段は、前記指示受理手段で受信した指示に基づいて、前記資源に相当する対象プロセッサのレジスタが、汎用レジスタ用途に使用される区間と数値オペランドがあふれた際の補完用途に使用される区間とを判定し、前記変換手段は、前記用途判定手段により前記レジスタが前記汎用レジスタ用途と判定された区間に含まれる命令記述については、当該命令記述を当該命令記述通りの機械語コードに変換し、前記用途判定手段により前記レジスタが前記補完用途と判定された区間に含まれる命令記述については、当該命令記述を当該命令記述に対して数値オペランドのあふれを補完した状態の機械語コードに変換し、前記リンカは、入力される複数のオブジェクトファイルを連結してメモリ上の配置アドレスを確定するアドレス解決手段を備え、前記アドレス解決手段は、解決された数値オペランドの値が命令のオペランド幅をあふれた場合にはエラーを検出する。
【００２０】
これによって、数値オペランドのあふれの補完用途のレジスタを、汎用レジスタ用途としての活用することができる。それとともに、プログラムミスによるエラー検出性も確保され、ソフトウェアの開発効率を向上させることができる。
【００２１】
なお、本発明は、このような特徴的な手段を備えるコード変換装置として実現することができるだけでなく、コード変換装置に含まれる特徴的な手段をステップとするコード変換方法として実現したり、コード変換装置に含まれる特徴的な手段としてコンピュータを機能させるためのプログラムとして実現したりすることもできる。そして、そのようなプログラムは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
【発明の効果】
【００２２】
従来特定用途に使われていたレジスタを複数の用途に活用することにより、実行性能を向上させ、コードサイズを低減させることができる。また、レジスタを複数用途に活用する際のエラー検出性が確保される。このため、ソフトウェア開発効率が向上する。
【発明を実施するための最良の形態】
【００２３】
（実施の形態１）
以下、図面を参照しながら本発明の実施の形態１に係るコンパイラシステムについて説明する。なお、このコンパイラシステムは、図１に示すようなコンピュータ上でプログラムが実行されることにより実現される。
【００２４】
図２は、本発明の実施の形態１に係るコンパイラシステム１の構成を示すブロック図である。
【００２５】
コンパイラシステム１は、ドライバ２とコンパイラ３とアセンブラ４とリンカ５とからなる。
【００２６】
ドライバ２は、ユーザが指定したオプションに従って、コンパイラシステム１の他の構成要素であるコンパイラ３やアセンブラ４やリンカ５を必要に応じて適切なオプションで起動する機能を有する。例えば、ドライバ２は、アセンブラ４のみを起動することも可能であり、ドライバ２は、アセンブラ４とリンカ５だけを起動することも可能である。
【００２７】
コンパイラ３は、プログラマが記述したＣ言語プログラム１０１を入力として受け、Ｃ言語プログラム１０１を内部中間表現に変換して最適化や資源の割り付けを実施した後、ターゲットプロセッサ向けのコンパイラ生成アセンブリプログラム１０２を生成する。
【００２８】
アセンブラ４は、コンパイラ３が生成したコンパイラ生成アセンブリプログラム１０２またはプログラマが記述したプログラマ記述アセンブリプログラム１０３を入力として受け、コンパイラ生成アセンブリプログラム１０２またはプログラマ記述アセンブリプログラム１０３を機械語コードに変換し、機械語コードからなるオブジェクトファイル１０４を生成する。オブジェクトファイル１０４にはリンカ５での最適化に使用される最適化情報１０６が含まれている。
【００２９】
リンカ５は、１つまたは複数のオブジェクトファイルを入力として受け、オブジェクトファイルに含まれる未解決の外部シンボルのアドレスやディスプレースメント値の解決およびコード最適化を実施し、実行形式ファイル１０５を生成する。
【００３０】
ここで、本発明の実施の形態１に係るコンパイラシステム１がターゲットとするプロセッサの命令仕様について説明する。
【００３１】
本プロセッサの命令は３２ビット固定長であり、一つの命令で表現できる数値の幅を超える数値を扱う場合には、複数の命令の組み合わせで機能を実現することができる。
【００３２】
本発明の実施の形態１に係るコンパイラシステム１では、後述のとおり、アセンブリプログラム中の命令のオペランドとなる数値が命令で表現できる数値の幅を超えていることがリンク時にわかった場合に、当該命令を複数の命令の組み合わせに置き換えてコード生成することができる。この置き換えの際に、特定の汎用レジスタである「Ｒ２９」を使用する。
【００３３】
図３は、単一命令のオペランドの数値があふれた場合の複数命令への置き換えパターンの一例を示したものである。
【００３４】
図中の「ａｄｄ」、「ｌｄ」、「ｂｒ」、「ｓｅｔｌｏ」、「ｓｅｔｈｉ」、「ｍｏｖ」、「ｊｍｐ」は命令ニモニックを表し、「Ｒ０」、「Ｒ１」、「Ｒ２９」は汎用レジスタを表し、「ＴＡＲ」はターゲットアドレス設定用レジスタを表す。また、「ｉｍｍ１６」は１６ビットの定数を示し、「ｉｍｍ３２」は３２ビットの定数を示し、「ｄｉｓｐ１０」はディスプレースメント（変位）を表す１０ビットの定数を示し、「ｄｉｓｐ２０」はディスプレースメントを表す２０ビットの定数を示し、「ｄｉｓｐ３２」はディスプレースメントを表す３２ビットの定数を示し、「ａｄｄｒ３２」はアドレスを表す３２ビットの定数を示す。さらに、「ＬＯ（）」はアセンブラマクロであり、括弧内の定数の下位１６ビットを戻り値として返す。同様に、「ＨＩ（）」は括弧内の定数の上位１６ビットを戻り値として返す。
【００３５】
最初の単一のａｄｄ命令は加算命令であり、ｉｍｍ１６とレジスタＲ１の格納値とを加算して加算結果をレジスタＲ１に格納する命令である。オペランドの数値が１６ビットを超える場合には、右側に記述されている複数命令によって機能を実現することができる。具体的には、まずｓｅｔｌｏ命令でレジスタＲ２９の下位１６ビットに数値の下位１６ビットを格納し、次にｓｅｔｈｉ命令でレジスタＲ２９の上位１６ビットに数値の上位１６ビットを格納することで、レジスタＲ２９に最大３２ビットの数値を設定する。最後にａｄｄ命令でＲ１の格納値とＲ２９の格納値とを加算して、加算結果をレジスタＲ１に格納する。
【００３６】
２番目の単一のｌｄ命令はメモリアクセス命令であり、レジスタＲ１の格納値とｄｉｓｐ１０とを加算して得られたメモリアドレスからデータをロードし、ロードしたデータをレジスタＲ０に格納する命令である。ディスプレースメントの値が１０ビットを超える場合には、右側に記述されている複数命令によって機能を実現することができる。具体的には、まず一番目のａｄｄ命令と同様にｓｅｔｌｏ命令とｓｅｔｈｉ命令とで最大３２ビットのディスプレースメント値をレジスタＲ２９に格納する。次にａｄｄ命令でレジスタＲ２９の格納値とレジスタＲ１の格納値とを加算して、加算結果をレジスタＲ２９に格納する。最後にｌｄ命令でレジスタＲ２９の格納値のメモリアドレスからデータをロードして、ロードしたデータをレジスタＲ０に格納する。
【００３７】
３番目の単一のｂｒ命令は分岐命令であり、現在のプログラムカウンタの値にｄｉｓｐ２０の値を加算して得られた命令アドレスに分岐する命令である。ディスプレースメント値が２０ビットを超える場合には、右側に記述されている複数命令によって機能を実現することができる。具体的には、まず一番目のａｄｄ命令と同様にｓｅｔｌｏ命令とｓｅｔｈｉ命令とで３２ビットの分岐先アドレスａｄｄｒ３２をレジスタＲ２９に格納する。次に、ｍｏｖ命令でレジスタＲ２９の格納値をターゲットアドレス設定レジスタＴＡＲに格納する。最後にｊｍｐ命令でＴＡＲに格納された命令アドレスに分岐する。
【００３８】
以下、本発明の実施の形態１に係るコンパイラシステム１の各構成要素の詳細な構成とその動作について説明する。
【００３９】
コンパイラ３は、命令定義資源設定部３１とレジスタ割り付け部３２とを備える。
命令定義資源設定部３１は、レジスタ割り付け部３２による処理の前処理として、命令毎にその命令で定義および参照するレジスタなどの資源を中間コードに設定していく。特徴的な部分としては、各命令が複数命令に分解される可能性について検出し、分解される可能性がある命令については、分解に使用するレジスタＲ２９の定義および参照があるものとして、レジスタＲ２９を中間コードに設定する。具体的には、命令定義資源設定部３１は図３の命令変換パターンに相当するテーブルを保持しており、変換パターンの単一命令に該当する命令であるかを検出する。さらに、その命令のｉｍｍ１６やｄｉｓｐ２０などのオペランドがラベルやラベル間演算の結果値などのように静的に値が確定しない数値であった場合に、当該命令はレジスタＲ２９を定義および参照するものとして、レジスタＲ２９を中間コードに設定する。
【００４０】
図４は、命令定義資源設定部３１の処理内容を示すフローチャートである。
命令定義資源設定部３１が処理を実行する前に、コンパイラ３によりＣ言語プログラム１０１は中間コードに変換されているものとする。
【００４１】
命令定義資源設定部３１は、入力されたソースプログラム（Ｃ言語プログラム１０１）から中間コードに変換された命令毎に以下の処理を繰り返す。まず、命令定義資源設定部３１は、当該命令で定義するレジスタおよび参照するレジスタを当該中間コードに設定する（ステップＳ１）。次に、命令定義資源設定部３１は、当該命令が図３の変換パターンの単一命令に該当するかどうかを判定する（ステップＳ２）。命令定義資源設定部３１は、単一命令に該当する場合にのみ（ステップＳ２でＹｅｓ）、当該命令のオペランドの数値が静的に確定するか否かを判定する（ステップＳ３）。静的に確定しないと判定された場合には（ステップＳ３でＮｏ）、命令定義資源設定部３１は、当該命令がレジスタＲ２９を定義かつ参照するものとして、レジスタＲ２９を当該中間コードに設定する（ステップＳ４）。命令定義資源設定部３１は、未処理の命令がなくなるまで上述の処理を繰り返し実行する。
【００４２】
レジスタ割り付け部３２は、一般的なコンパイラのレジスタ割り付け部と同様に、命令定義資源設定部３１で設定された情報に基づいて各変数の生存区間を求め、同一レジスタを割り付けた変数の生存区間が重ならないように各生存区間にレジスタＲ２９を含む実レジスタ群を割り付けていく。
【００４３】
以上のようなコンパイラ３の構成をとることにより、複数の命令への分解が起こりうる命令におけるレジスタＲ２９の生存区間が跨がない範囲で、レジスタＲ２９を汎用レジスタとしても活用できるようになる。このため、レジスタＲ２９を命令分解用途と汎用レジスタ用途との両方の用途に共用できるようになる。
【００４４】
アセンブラ４のプログラム種別設定部４１とレジスタ用途疑似命令受理部４２と命令コード変換部４３とが、入力されたコンパイラ生成アセンブリプログラム１０２およびプログラマ記述アセンブリプログラム１０３の各行に対して、順に動作する。
【００４５】
プログラム種別設定部４１は、当該行の疑似命令の記述を解釈することにより、入力されたアセンブリプログラムがコンパイラ３によって生成されたコンパイラ生成アセンブリプログラム１０２であるか、プログラマが記述したプログラマ記述アセンブリプログラム１０３であるかを判別する。プログラム種別設定部４１は、入力されたアセンブリプログラムがコンパイラ生成アセンブリプログラム１０２である場合には、内部のプログラム種別モードを“１”に設定し、プログラマ記述アセンブリプログラム１０３である場合には“０”を設定する。具体的には、プログラム種別設定部４１は、アセンブリプログラムファイル内の命令コードよりも前に、コンパイラ３のみがヘッダとして出力する“ＦＩＬＥ”疑似命令が現れた場合には、入力されたアセンブリプログラムはコンパイラ生成アセンブリプログラム１０２であると判定する。
【００４６】
レジスタ用途疑似命令受理部４２は、当該行にレジスタの用途を示す疑似命令が記述されている場合には、当該疑似命令に対応して内部のレジスタ使用モードを切り替える。具体的には、レジスタ用途疑似命令受理部４２は、レジスタＲ２９を汎用レジスタとして使う区間の始まりを示す疑似命令“ＥＮＡＢＬＥ＿Ｒ２９  ＯＮ”が現れた場合には、レジスタ使用モードをＲ２９の使用可を示す“１”に変更し、レジスタＲ２９を汎用レジスタとして使う区間の終わりを示す“ＥＮＡＢＬＥ＿Ｒ２９  ＯＦＦ”が現れた場合には、レジスタ使用モードをＲ２９の使用不可を示す“０”に変更する。このようにして、レジスタ用途疑似命令受理部４２は、疑似命令の記述の解釈によってレジスタＲ２９を汎用レジスタとして使用する区間を認識する。
【００４７】
命令コード変換部４３は、当該行の命令記述に対応した機械語コードへの変換を行う。変換に際して、命令コード変換部４３は、上述のプログラム種別モードとレジスタ使用モードとを参照する。命令コード変換部４３は、プログラム種別モードがプログラマ記述を示す“０”であり、かつレジスタ使用モードがＲ２９の使用不可を示す“０”となっている状態で、当該行の命令記述にレジスタＲ２９が現れた場合には、レジスタＲ２９が使用できない旨のエラーメッセージを出力し、アセンブラ４の処理を終了する。
【００４８】
また、命令コード変換部４３は、図３の命令変換パターンに相当するテーブルを保持しており、当該行の命令記述が変換パターンの左側に記述されている単一命令に該当する命令であるかを検出する。さらに、その命令の数値オペランドがラベルやラベル間演算の結果値などのように静的に値が確定しない数値であった場合には、命令コード変換部４３は、変換パターンの右側に記述されている複数命令に対応する機械語コードを生成する。ただし、レジスタ使用モードがＲ２９の使用可能を示す“１”であった場合にはこの処理は行わない。これによって、レジスタ使用モードが“１”の区間を除いては、変換パターンに該当する命令はすべて複数命令に分解された形で生成されることになるが、後述のリンカ５での最適化で分解が不要であった命令については元に戻すことを想定している。この最適化のため、命令コード変換部４３は、複数命令に分解して生成した部分を識別するための最適化情報１０６をオブジェクトファイル１０４に付加しておく。
【００４９】
図５は、最適化情報１０６の一例を示す図である。
最適化情報１０６は、アセンブラ４にて変換された機械語コード列の先頭から当該部分までの命令アドレスのオフセット値と、図３中の当該変換パターンのパターンＩＤとの対を並べた構造になっている。それぞれの対がそれぞれの変換箇所に対応している。
【００５０】
図６は、コンパイラ生成アセンブリプログラム１０２の一例を示す図である。
図６中で、（ａ）の行は、コンパイラ３がＣ言語プログラム１０１のファイル名を伝達するために出力する“ＦＩＬＥ”疑似命令である。アセンブラ４はこの疑似命令によって入力されたアセンブリプログラムがコンパイラによって生成されたコンパイラ生成アセンブリプログラム１０２であることを認識することができる。また、（ｂ）の行および（ｄ）の行ではレジスタＲ２９が使われているが、これは上述のとおり、コンパイラ３の処理にてリンク時の複数命令への分解が不要とわかる部分についてレジスタＲ２９を汎用レジスタ用途に使用している。具体的には、レジスタＲ２９の生存区間は（ｂ）の行で始まって（ｄ）の行で終わっている。（ｂ）の行ではレジスタＲ０とレジスタＲ１との内容を加算した結果をレジスタＲ２９に格納している。（ｃ）の行ではレジスタＲ２の内容に定数４を加えた値のメモリアドレスからロードした値をレジスタＲ０に格納している。（ｄ）の行ではレジスタＲ０の内容からレジスタＲ２９の内容を減算している。この間、リンク時に複数命令への分解が必要となる可能性のある命令は存在しない。このため、コンパイラ３がこれを解析してレジスタＲ２９を汎用レジスタとして使用している。特に（ｃ）の行については、命令の種類自体は図３の変換パターンの単一命令に合致しているが、定数オペランドが値４で確定しており、リンク時の複数命令への分解が不要であることが静的にわかる。このため、複数命令への分解によりレジスタＲ２９を使用する可能性がないとコンパイラ３が判定している。
【００５１】
図７は、“ＥＮＡＢＬＥ＿Ｒ２９”を含むプログラマ記述アセンブリプログラム１０３の一例を示す図である。
【００５２】
図７中で、（ｅ）の行は、レジスタＲ２９を汎用レジスタ用途として使用する区間の開始をプログラマが指示する疑似命令である。また、（ｈ）の行は、レジスタＲ２９を汎用レジスタ用途として使用する区間の終了をプログラマが指示する疑似命令である。結果として、（ｅ）の行から（ｈ）の行までの間の（Ｘ）の区間がレジスタＲ２９を汎用レジスタとして使用する区間となる。この区間ではコンパイラシステム１による定数オペランドがあふれた場合の拡張処理、すなわち複数命令への変換処理は実施されない。そして、これ以外の区間は、コンパイラシステム１によるレジスタＲ２９を使用したオペランド拡張処理が実施される区間となる。
【００５３】
図８は、アセンブラ４の処理の流れを示すフローチャートである。
アセンブラ４は、まず内部の変数であるプログラム種別モードとレジスタ使用モードとを共に“０”に初期化する（ステップＳ１１）。そして、アセンブラ４は、入力されたアセンブリプログラムの各行毎に以下の処理を繰り返す。
【００５４】
プログラム種別設定部４１は、“ＦＩＬＥ”疑似命令が現れたかどうかを判定し（ステップＳ１２）、現れた場合には（ステップＳ１２でＹｅｓ）、プログラム種別モードにコンパイラが生成したプログラムであることを示す“１”を設定する（ステップＳ１３）。
【００５５】
次に、レジスタ用途疑似命令受理部４２は、疑似命令“ＥＮＡＢＬＥ＿Ｒ２９  ＯＮ”が現れたかどうかを判定し（ステップＳ１４）、現れた場合には（ステップＳ１４でＹｅｓ）、レジスタ使用モードにレジスタＲ２９を汎用レジスタとして使用することを示す“１”を設定する（ステップＳ１５）。また、疑似命令“ＥＮＡＢＬＥ＿Ｒ２９  ＯＦＦ”が現れたかどうかを判定し（ステップＳ１６）、現れた場合には（ステップＳ１６でＹｅｓ）、レジスタ使用モードにレジスタＲ２９を定数オペランドがあふれた場合の拡張用に使用することを示す“０”を設定する（ステップＳ１７）。
【００５６】
命令コード変換部４３は、プログラム種別モードがプログラマ記述アセンブリプログラム１０３を示す“０”であり、かつレジスタ使用モードがレジスタＲ２９を定数オペランドがあふれた場合の拡張用に使用することを示す“０”であり、かつレジスタＲ２９の記述が出現しているかどうかを判定する（ステップＳ１８）。判定が真であった場合には（ステップＳ１８でＹｅｓ）、プログラマの記述誤りであることがわかるので、命令コード変換部４３は、エラーメッセージを出力してアセンブラ４の処理を終了する（ステップＳ１９）。
【００５７】
また、命令コード変換部４３は、（ａ）レジスタ使用モードがレジスタＲ２９を定数オペランドがあふれた場合の拡張用に使用することを示す“０”であり、（ｂ）命令が図３の変換パターンのいずれかの単一命令にマッチしており、（ｃ）当該命令のオペランドの数値が静的には確定しない、という３つの条件（ａ）〜（ｃ）を全て満たすか否かを判定する（ステップＳ２０）。条件（ａ）〜（ｃ）を全て満たす場合には（ステップＳ２０でＹｅｓ）、命令コード変換部４３は、当該行の命令を変換パターンの右側に記述されている複数命令に変換する。それと共に、命令コード変換部４３は、変換に関する最適化情報１０６として、命令列の先頭から当該命令までの命令アドレスオフセット値と図３の変換パターンのパターンＩＤとの対を、生成コード（オブジェクトファイル１０４）に付加する（ステップＳ２１）。そして、命令コード変換部４３は、命令を機械語コードに変換し、オブジェクトファイル１０４を出力する（ステップＳ２２）。
【００５８】
アセンブラ４は、未処理の行がなくなるまで、上述の処理を実行する。
リンカ５は、アドレス解決部５１とコード最適化部５２とを備える。コード最適化部５２での処理によるコードの変化がなくなるまで、アドレス解決部５１とコード最適化部５２とが動作を繰り返す。
【００５９】
アドレス解決部５１は、一般のリンカと同様に、リンカ５に入力された複数のオブジェクトファイル１０４を連結してメモリ上の配置アドレスを確定し、各オブジェクトファイル１０４に含まれる未解決のシンボルのアドレスやディスプレースメント値を確定させていく。その際、確定したアドレスやディスプレースメント値が当該命令で表現可能な数値幅を超えていた場合には、値があふれた旨のメッセージを出力し、リンカ５の処理を終了する。
【００６０】
コード最適化部５２は、図３の変換パターンに相当するテーブルを保持している。コード最適化部５２は、上記アセンブラ４の命令コード変換部４３によって付加された、複数命令に分解された部分と変換パターンとを示す最適化情報１０６を参照し、アドレス解決部５１で確定されたアドレス値やディスプレースメント値を踏まえて、当該部分が変換パターンの左側に記述されている単一命令で表現できるか否かを判断する。単一命令で表現できる場合、すなわち確定されたオペランド数値の幅が単一命令に収まる場合には、コード最適化部５２は、当該部分を変換パターン左側に記述されている単一命令に置き換える処理を行う。
【００６１】
図９は、リンカ５の処理の流れを示すフローチャートである。
リンカ５は、まずコードの変化を示す変化フラグを“０”に初期化する（ステップＳ３１）。
【００６２】
アドレス解決部５１は、一般のリンカと同様に、入力された複数のオブジェクトファイルを連結してメモリ上の配置を確定し、各オブジェクトファイルの未解決のシンボルのアドレスやディスプレースメント値を確定させる（ステップＳ３２）。アドレス解決部５１は、確定したアドレスやディスプレースメント値の命令において、表現可能な数値幅に対するあふれが発生したかどうかを判定する（ステップＳ３３）。あふれが発生した場合には（ステップＳ３３でＹｅｓ）、アドレス解決部５１は、その旨のメッセージを出力して、リンカ５は処理を終了する（ステップＳ３４）。
【００６３】
コード最適化部５２は、入力された各オブジェクトファイル１０４に対応するコードブロックに対して以下の処理を繰り返す。コード最適化部５２は、各コードブロックに対しては、当該オブジェクトファイル１０４の最適化情報１０６の各エントリ、つまり図５の各行について以下の処理を繰り返す。
【００６４】
まず、コード最適化部５２は、最適化情報１０６の命令アドレスオフセットによって、アセンブラ４にて複数命令に展開された箇所を特定する。コード最適化部５２は、変換パターンのパターンＩＤによって変換パターンも特定する。その上で、コード最適化部５２は、アドレス解決部５１で確定されたオペランドの値が、図３に示される変換パターンの左側に記述されている形式の数値オペランド幅におさまるかどうかを判定する（ステップＳ３５）。すなわち、コード最適化部５２は、複数命令を単一命令で表現可能かどうかを判定する。
【００６５】
数値オペランド幅におさまると判定された場合には（ステップＳ３５でＹｅｓ）、コード最適化部５２は、該当する複数命令コードを変換パターンの左側に記述されている単一命令に対応するコードに置き換え、コードが変化したことを示す変化フラグに“１”を設定する（ステップＳ３６）。
【００６６】
コード最適化部５２は、最適化情報１０６のすべてのエントリに対して以上の処理を繰り返す。そして、コード最適化部５２は、入力された各オブジェクトファイルに対応するコードブロックに対して以上の処理を繰り返す。
【００６７】
以上の処理が終了した後、リンカ５は、変化フラグがコードが変化したことを示す“１”であるかどうかを判定する（ステップＳ３７）。“１”であった場合には（ステップＳ３７でＹｅｓ）、リンカ５は、ステップＳ３１に戻って再びこれまでの処理を繰り返し、“１”でなかった場合には（ステップＳ３７でＮｏ）、リンカ５は、処理を終了する。
【００６８】
このようなアセンブラ４の命令コード変換部４３とリンカ５のコード最適化部５２との連携により、最終的に生成される実行形式ファイル１０５では、複数の命令への展開が必要な部分についてのみレジスタＲ２９を使用した複数命令のパターンのコードが生成されることになる。
【００６９】
以上のようなアセンブラ４およびリンカ５の構成をとることによって、オペランドの数値があふれた際の複数命令への展開用のレジスタＲ２９を、プログラマが汎用レジスタ用途に使用することが可能となり、プログラムの性能が向上する。
【００７０】
また、プログラマがレジスタＲ２９を汎用レジスタ用途に使用する際のエラー検出性も確保され、開発効率が向上する。具体的には、アセンブリプログラムにて疑似命令ＥＮＡＢＬＥ＿Ｒ２９を記述することによって、命令分解用の予備のレジスタＲ２９を汎用レジスタ用途に活用することが可能になり、また意図しない場所でのレジスタＲ２９の記述をアセンブラにてエラー検出することができる。
【００７１】
また、プログラマがレジスタＲ２９を汎用レジスタ用途に活用する領域ではアセンブラおよびリンカでの連携によるレジスタＲ２９を利用した複数命令への展開を抑制する。このことにより、プログラマが汎用レジスタ用途で使用したレジスタＲ２９が意図せず破壊されることによって実行結果が不正になってしまう問題を防ぐことができる。具体的には、汎用レジスタとして活用する領域にてオペランド数値があふれた場合には、リンク時にエラーとして検出することができる。
【００７２】
（実施の形態２）
以下、本発明の実施の形態２に係るコンパイラシステムについて説明する。実施の形態２に係るコンパイラシステムの構成の大部分は実施の形態１に係るコンパイラシステム１と同様であるが、アセンブラ４に対する疑似命令の仕様が異なる。以下、異なる点を中心に説明を行なう。
【００７３】
図１０は、コンパイラ生成アセンブリプログラム１０２の一例を示す図である。
図１０中で、（ａ）の行は、本実施の形態特有の疑似命令“ｅｘｐａｎｄｉｎｓｔ＿ｗｉｔｈｏｕｔ＿ｗａｒｎｉｎｇ”である。この疑似命令は、「リンク時の警告表示なしに数値オペランドの拡張処理を実施する」ための指示である。コンパイラ３はアセンブリプログラム生成時にアセンブリプログラムの先頭に本疑似命令を出力する。
【００７４】
図１１は、プログラマ記述アセンブリプログラム１０３の一例を示す図である。
図１１中で、（ｂ）の行は、本実施の形態特有の疑似命令“ｎｏｅｘｐａｎｄｉｎｓｔ”である。この疑似命令は、「数値オペランドの拡張処理を抑制する」ための指示である。また、（ｅ）の行は、本実施の形態特有の疑似命令“ｅｘｐａｎｄｉｎｓｔ”である。この疑似命令は、「リンク時の警告表示付きでの数値オペランドの拡張処理を有効にする」ための指示である。（ｂ）の行から（ｅ）の行までの間の（Ｘ）の区間がレジスタＲ２９を汎用レジスタとして使用する区間となり、この区間ではコンパイラシステム１による数値オペランドがあふれた場合の拡張処理は実施されない。そして、これ以外の区間は、コンパイラシステム１によるレジスタＲ２９を使用した数値オペランド拡張処理が実施される区間となる。
【００７５】
本実施の形態のコンパイラシステム１は、実施の形態１に係るコンパイラシステム１と同様にコンパイラ３、アセンブラ４およびリンカ５を構成要素と備えている。
【００７６】
コンパイラ３は、コード生成の際にファイル（コンパイラ生成アセンブリプログラム１０２）の先頭に、常に図１０で示したような疑似命令“ｅｘｐａｎｄｉｎｓｔ＿ｗｉｔｈｏｕｔ＿ｗａｒｎｉｎｇ”を出力する。これによって、コンパイラ３が自動生成したコード部分については数値オペランドの拡張処理が実施され、かつリンク時に警告表示がされない。
【００７７】
図１２は、アセンブラ４の処理の流れを示すフローチャートである。
アセンブラ４は、まず内部の変数であるレジスタ使用モードを“０”に初期化する（ステップＳ４１）。そして、アセンブラ４は、入力されたアセンブリプログラムの各行毎に以下の処理を繰り返す。
【００７８】
レジスタ用途疑似命令受理部４２は、疑似命令“ｅｘｐａｎｄｉｎｓｔ＿ｗｉｔｈｏｕｔ＿ｗａｒｎｉｎｇ”が現れたかどうかを判定する（ステップＳ４２）。現れた場合には（ステップＳ４２でＹｅｓ）、レジスタ用途疑似命令受理部４２は、レジスタＲ２９を定数オペランドがあふれた場合の拡張用に使用しつつ警告表示しないことを示す“２”を、レジスタ使用モードに設定する（ステップＳ４３）。また、レジスタ用途疑似命令受理部４２は、疑似命令“ｎｏｅｘｐａｎｄｉｎｓｔ”が現れたかどうかを判定する（ステップＳ４４）。現れた場合には（ステップＳ４４でＹｅｓ）、レジスタ用途疑似命令受理部４２は、レジスタＲ２９を汎用レジスタとして使用することを示す“０”を、レジスタ使用モードに設定する（ステップＳ４５）。また、レジスタ用途疑似命令受理部４２は、疑似命令“ｅｘｐａｎｄｉｎｓｔ”が現れたかどうかを判定する（ステップＳ４６）。現れた場合には（ステップＳ４６でＹｅｓ）、レジスタ用途疑似命令受理部４２は、レジスタＲ２９を定数オペランドがあふれた場合の警告付きでの拡張用に使用することを示す“１”を、レジスタ使用モードに設定する（ステップＳ４７）。
【００７９】
命令コード変換部４３は、レジスタ使用モードが“０”以外であり（レジスタＲ２９は定数オペランドがあふれた場合の拡張用）、かつレジスタＲ２９の記述が出現しているかどうかを判定する（ステップＳ４８）。判定が真であった場合には（ステップＳ４８でＹｅｓ）、プログラマの記述誤りであることがわかるので、命令コード変換部４３は、エラーメッセージを出力して、アセンブラ４は処理を終了する（ステップＳ４９）。
【００８０】
また、命令コード変換部４３は、（ａ）レジスタ使用モードが“０”以外であり（レジスタＲ２９は定数オペランドがあふれた場合の拡張用）、（ｂ）命令が図３の変換パターンのいずれかの単一命令にマッチしており、（ｃ）当該命令のオペランドの数値が静的には確定しない、という３つの条件（ａ）〜（ｃ）を全て満たすか否かを判定する（ステップＳ５０）。条件（ａ）〜（ｃ）を全て満たす場合には（ステップＳ５０でＹｅｓ）、命令コード変換部４３は、当該行の命令を変換パターンの右側に記述されている複数命令に変換する。それと共に、命令コード変換部４３は、変換に関する最適化情報１０６として、命令列の先頭から当該命令までの命令アドレスオフセット値と図３の変換パターンのパターンＩＤとレジスタ使用モードとを生成コード（オブジェクトファイル１０４）に付加する（ステップＳ５１）。そして、命令コード変換部４３は、命令を機械語コードに変換し、オブジェクトファイル１０４を出力する（ステップＳ５２）。
【００８１】
アセンブラ４は、未処理の行がなくなるまで、上述の処理を実行する。
図１３は、上記最適化情報１０６の一例を示す図である。実施の形態１における最適化情報１０６に対して、レジスタ使用モードが追加されており、アセンブラ４にて変換された機械語コード列の先頭から当該部分までの命令アドレスのオフセット値と、図３中の当該変換パターンのパターンＩＤと、レジスタ使用モードとの組み合わせを並べた構造になっている。それぞれの組み合わせがそれぞれの変換箇所に対応している。
【００８２】
図１４は、リンカの処理の流れを示すフローチャートである。図９に示した実施の形態１におけるリンカ５の処理の流れに対して、ステップＳ３８とステップＳ３９が追加されている。それ以外の各ステップの動作については実施の形態１におけるリンカ５の各ステップの動作と同じである。以下、コード最適化部５２の処理について説明する。
【００８３】
コード最適化部５２は、入力された各オブジェクトファイル１０４に対応するコードブロックに対して以下の処理を繰り返す。コード最適化部５２は、各コードブロックに対しては、当該オブジェクトファイル１０４の最適化情報１０６の各エントリ、つまり図１３の各行について以下の処理を繰り返す。
【００８４】
まず、コード最適化部５２は、最適化情報１０６の命令アドレスオフセットによって、アセンブラ４にて複数命令に展開された箇所を特定する。コード最適化部５２は、変換パターンのパターンＩＤによって変換パターンも特定する。その上で、コード最適化部５２は、アドレス解決部５１で確定されたオペランドの値が、図３に示される変換パターンの左側に記述されている形式の数値オペランド幅におさまるかどうかを判定する（ステップＳ３５）。すなわち、コード最適化部５２は、複数命令を単一命令で表現可能かどうかを判定する。
【００８５】
オペランドの値が数値オペランド幅におさまると判定された場合には（ステップＳ３５でＹｅｓ）、コード最適化部５２は、該当する複数命令コードを変換パターンの左側に記述されている単一命令に対応するコードに置き換え、コードが変化したことを示す変化フラグに“１”を設定する（ステップＳ３６）。
【００８６】
オペランドの値が数値オペランド幅におさまらないと判定された場合には（ステップＳ３５でＮｏ）、コード最適化部５２は、最適化情報のレジスタ使用モードが“１”であるかどうかを判定する（ステップＳ３８）。レジスタ使用モードが、警告付きで定数オペランドあふれ時の拡張を行うことを示す“１”であった場合には（ステップＳ３８でＹｅｓ）、コード最適化部５２は、当該箇所が複数命令に展開されたまま残った旨を示す警告メッセージを表示する（ステップＳ３９）。レジスタ使用モードが“２”の場合には（ステップＳ３８でＮｏ）、当該箇所が複数命令に展開されたまま残っても警告メッセージが表示されないことになる。
【００８７】
コード最適化部５２は、最適化情報１０６のすべてのエントリに対して以上の処理を繰り返す。そして、コード最適化部５２は、入力された各オブジェクトファイルに対応するコードブロックに対して以上の処理を繰り返す。
【００８８】
以上の処理が終了した後、リンカ５は、変化フラグがコードが変化したことを示す“１”であるかどうかを判定する（ステップＳ３７）。“１”であった場合には（ステップＳ３７でＹｅｓ）、リンカ５は、ステップＳ３１に戻って再びこれまでの処理を繰り返し、“１”でなかった場合には（ステップＳ３７でＮｏ）、リンカ５は、処理を終了する。
【００８９】
以上のようなアセンブラ４およびリンカ５の構成をとることによって、コンパイラ３が生成したコンパイラ生成アセンブリプログラムに対しては、オペランドの数値があふれた際の複数命令への展開時に警告メッセージの表示を抑制し、プログラマ記述アセンブリプログラム１０３に対してはオペランドあふれ時の警告メッセージの表示を疑似命令によって制御することが可能となる。これによって、プログラマ記述部分に起因する複数命令の展開部分の特定が容易になり、性能およびコードサイズチューニング等の開発の効率が向上する。
【００９０】
以上、本発明に係るコンパイラシステムおよびその構成要素について、実施の形態に基づいて説明したが、本発明は上記実施の形態に限られるものではない。たとえば、
【００９１】
（１）上記実施の形態では、Ｃ言語向けのコンパイラシステムを想定していたが、本発明はＣ言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
【００９２】
（２）上記実施の形態では、ターゲットプロセッサとして固定長命令のプロセッサを想定していたが、本発明はこれに限定されるものではない。一命令で扱えるオペランド数値の幅に制限がある多くの可変長命令のプロセッサにも本発明を適用することができる。
【００９３】
（３）上記実施の形態では、コンパイラシステムは、ドライバ、コンパイラ、アセンブラおよびリンカで構成されていたが、本発明はこの構成に限定されるものではない。例えば、より多くの構成要素またはサブツールに分解されていてもよいし、すべての機能を一つの構成要素で実現してもよい。
【００９４】
（４）上記実施の形態では、命令の変換パターンとして単一命令と複数命令との間の変換を採用したが、本発明はこの変換パターンに限定されるものではない。すなわち、複数命令と複数命令との間の変換であってもよいし、単一命令と当該単一命令とニモニックの異なる他の単一命令との間の変換、または、単一命令と当該単一命令とオペランド幅の異なる他の単一命令との間の変換であってもよい。このような変換を実現するには図３の変換パターンを適宜修正すればよい。これによって、数値オペランドの拡張のみでなく、性能、コスト、または消費電力に応じたコードの選択といった用途にも本発明を活用できるようになる。
【００９５】
（５）上記実施の形態では、命令の変換パターンとして単一命令と複数命令との間の２通りのパターン間の変換を採用したが、本発明はこの変換パターンに限定されるものではない。３通り以上のパターンによる多段階の変換であってもよい。例えば、単一命令の短い命令と単一命令の長い命令と複数命令との３段階や、単一命令と少ない複数命令と多い複数命令との３段階などである。これを実現するには図３の変換パターンを３段階以上になるように修正すればよい。これによってよりきめ細かな命令パターンの選択が可能となる。
【００９６】
（６）上記実施の形態では、アセンブラに入力されたアセンブリプログラムが、コンパイラによって生成されたものであるか、プログラマが記述したものであるかの判定手段としてアセンブラ疑似命令を採用していたが、本発明はこのインタフェースに限定されるものではない。例えば、オプション指定によってアセンブラプログラムの種類を伝達してもよいし、プラグマ指令（＃ｐｒａｇｍａ指令）によってアセンブラプログラムの種類を伝達してもよい。ソースプログラムの編集が困難な場合や、きめ細かく指定したい場合など、ニーズに合わせて手段を選択すればよい。
【００９７】
（７）上記実施の形態では、プログラマがレジスタの用途とその区間を指定するユーザインタフェースとしてアセンブラに対する疑似命令を採用していたが、本発明での伝達手段はこのインタフェースに限定されるものではない。例えば、オプション指定によって伝達してもよいし、＃ｐｒａｇｍａ指令によって伝達してもよい。また伝達方法としても上記実施の形態のような区間の入口と出口とに、疑似命令を記述する方法に限らず、ファイルヘッダに区間の情報を記述する形式にしてもよい。さらに、指定範囲の粒度として、より細かい粒度であるオペランドレジスタ単位での指定を行なうようにしてもよい。例えば、オペランドレジスタの表記を用途によって異なるものにして（Ｒ２９とＲｘ２９など）レジスタ毎に指定するようにしてもよい。たとえば、Ｒ２９とはレジスタＲ２９を使用するという指定であり、Ｒｘ２９とはレジスタＲ２９以外のレジスタを使用するという指定である。または、命令毎にレジスタ用途を指定するようにしてもよいし、大きな粒度として、例えばファイル単位で用途を指定するようにしてもよい。
【００９８】
（８）上記実施の形態では、プログラマがレジスタの用途とその区間を指定するユーザインタフェースとしてアセンブラに対する疑似命令を採用していたが、本発明での用途及び区間の指定方法はこのインタフェースの有無に限定されるものではない。例えば、疑似命令なしでアセンブラにてアセンブリプログラムを解析し、レジスタＲ２９が使用されている区間を汎用レジスタ用途区間と判定するような構成にしてもよい。これによって、プログラマが明示的な指示を与える必要がなくなり、プログラム作成効率が向上する。
【００９９】
（９）上記実施の形態では、レジスタＲ２９を汎用レジスタ用途と数値オペランドがあふれた際の命令展開用途との両方の用途に共用していたが、本発明はこのレジスタの用途に限定されるものではない。例えば、レジスタＲ２９を、汎用レジスタ用途と、ＤＭＡ（Direct Memory Access）転送に用いられるＤＭＡコントローラまたは専用演算器などのハードウェア制御レジスタ用途との両方の用途に共用するようにしてもよい。これによって、ハードウェア専用に用意されていた資源をソフトウェアで使用することが可能になり、生成されるコードにおけるレジスタ使用効率が向上する。
【０１００】
（１０）上記実施の形態では、数値オペランドがあふれた際の命令分解用にレジスタＲ２９を固定的に使用しているが、本発明はこれに限定されるものではない。たとえば、各部分で命令分解用途に使用可能なレジスタの集合を最適化情報としてコンパイラからアセンブラおよびリンカに伝達し、アセンブラおよびリンカは、最適化情報で示された集合から選択したレジスタを命令分解用途に活用するような構成にしてもよい。これによって、レジスタの使用の柔軟性が高まり、生成されるコードにおけるレジスタ使用効率が向上する。
【０１０１】
（１１）なお、コンパイラは、ターゲットプロセッサが備える複数のレジスタについて、Ｃ言語プログラム中において、レジスタが命令展開用途に使用されている命令を特定し、当該命令に関する情報をアセンブラおよびリンカに伝達するようにしてもよい。当該情報を受けたアセンブラおよびリンカは、当該情報に基づいて、汎用レジスタ用途に使用されるレジスタを選択するようにしてもよい。
【０１０２】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【産業上の利用可能性】
【０１０３】
本発明は、Ｃ言語やアセンブリ言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラシステムに適用できる。
【図面の簡単な説明】
【０１０４】
【図１】本発明の実施の形態１に係るコンパイラシステムを実現するためのコンピュータの外観図である。
【図２】本発明の実施の形態１に係るコンパイラシステムの構成を示すブロック図である。
【図３】単一命令のオペランドの数値があふれた場合の複数命令への置き換えパターンの一例を示す図である。
【図４】命令定義資源設定部の処理内容を示すフローチャートである。
【図５】最適化情報の一例を示す図である。
【図６】コンパイラ生成アセンブリプログラムの一例を示す図である。
【図７】疑似命令“ＥＮＡＢＬＥ＿Ｒ２９”を含むプログラマ記述アセンブリプログラムの一例を示す図である。
【図８】アセンブラの処理の流れを示すフローチャートである。
【図９】リンカの処理の流れを示すフローチャートである。
【図１０】コンパイラ生成アセンブリプログラムの一例を示す図である。
【図１１】疑似命令“ｎｏｅｘｐａｎｄｉｎｓｔ”等を含むプログラマ記述アセンブリプログラムの一例を示す図である。
【図１２】アセンブラの処理の流れを示すフローチャートである。
【図１３】最適化情報の一例を示す図である。
【図１４】リンカの処理の流れを示すフローチャートである。
【符号の説明】
【０１０５】
１  コンパイラシステム
２  ドライバ
３  コンパイラ
４  アセンブラ
５  リンカ
３１  命令定義資源設定部
３２  レジスタ割り付け部
４１  プログラム種別設定部
４２  レジスタ用途疑似命令受理部
４３  命令コード変換部
５１  アドレス解決部
５２  コード最適化部
１０１  Ｃ言語プログラム
１０２  コンパイラ生成アセンブリプログラム
１０３  プログラマ記述アセンブリプログラム
１０４  オブジェクトファイル
１０５  実行形式ファイル
１０６  最適化情報
【図１】
2008269569.tif 000003
【図２】
2008269569.tif 000004
【図３】
2008269569.tif 000005
【図４】
2008269569.tif 000006
【図５】
2008269569.tif 000007
【図６】
2008269569.tif 000008
【図７】
2008269569.tif 000009
【図８】
2008269569.tif 000010
【図９】
2008269569.tif 000011
【図１０】
2008269569.tif 000012
【図１１】
2008269569.tif 000013
【図１２】
2008269569.tif 000014
【図１３】
2008269569.tif 000015
【図１４】
2008269569.tif 000016