(57)【要約】【課題】オペランド制約が厳しい命令セット向けのコンパイラであっても、アセンブルプログラムに近い性能とコードサイズを実現する。【解決手段】ＣプログラムＳＣ１から、あるＣ変数にあるレジスタを割り付けることを推奨するプラグマを識別し、該プラグマに基づいたＣ変数名とレジスタ名との対応表であるレジスタ割付表（１）Ｒｇ１を生成する。その後、ＣプログラムＳＣ１から中間語を生成し、レジスタが割り付けられていないオペランドと入力ＣプログラムＳＣ１内での対応するＣ変数名との対応を示すレジスタ割付表（２）Ｒｇ２を生成する。これら表（１）Ｒｇ１、表（２）Ｒｇ２に基づいて、中間語表現ＩＬのオペランドにレジスタを割り付ける。オペランド制約違反がある場合、表（１）Ｒｇ１を更新し、再度レジスタ割り付けを行う。オペランド制約違反がなくなるまでこれらの処理を繰り返し、機械語列Ｍａの機械語を生成する。【選択図】　　　図４
2004126666.tif 000002
【特許請求の範囲】
【請求項１】
プログラムからオブジェクトコードを生成するコンパイル方法であって、前記プログラムに記述されたレジスタ割り付け情報に基づいて、前記プログラムの変数をあるレジスタに割り付けることを推奨することを特徴とするコンパイル方法。
【請求項２】
請求項１記載のコンパイル方法において、
前記レジスタ割り付け情報に基づくレジスタの割付は、
前記プログラムに記述されたレジスタ割り付け情報を解釈するステップと、
前記入力されたプログラムを構文解析し、中間語表現を生成するステップと、前記解釈したレジスタ割り付け情報に推奨された情報に従って、前記中間語のオペランドにレジスタを割り付けるステップとを有することを特徴とするコンパイル方法。
【請求項３】
請求項１または２記載のコンパイル方法において、前記レジスタ割り付け情報は、Ｃ言語のプラグマ指示文によって変数名、およびレジスタ名の対応が指示された情報であることを特徴とするコンパイル方法。
【請求項４】
請求項１〜３のいずれか１項に記載のコンパイル方法において、前記レジスタ割り付け情報は、Ｃ言語のプラグマ指示文によって変数名、レジスタ名の対応、および関数名を指定し、前記レジスタ割り付け情報の有効範囲を、前記関数名に対応する関数本体とすることを特徴とするコンパイル方法。
【請求項５】
請求項３または４記載のコンパイル方法において、前記プラグマ指示文によるレジスタ割り付け情報は、同じ前記プログラムにおいて、前記プラグマ指示文が記述されてから、新たな前記プラグマ指示文が記述されるまでの範囲で有効であることを特徴とするコンパイル方法。
【請求項６】
プログラムからオブジェクトプログラムを生成するコンパイル方法であって、前記プログラムに記述されたレジスタ割り付け情報に基づいて、前記プログラムに含まれるある変数をあるレジスタに割り付けること推奨し、前記割り付けられたレジスタがある所定の条件を満たさない場合は、その条件を満たすために割り付けられたレジスタを書き換えることが可能であることを特徴とするコンパイル方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機システムなどにおいて、Ｃプログラムを入力とするオブジェクトコード（機械後）を生成するコンパイラ技術に関し、特に、コンパイラによるレジスタ割り付け支援に適用して有効な技術に関するものである。
【０００２】
【従来の技術】
高級プログラミング言語のひとつであるＣ言語でのプログラミング手法のメリットの一つに、プログラマがＣプログラム（ソースプログラムまたはプログラム）においてターゲットとなる機械命令セットを意識せず、Ｃ変数を自由に定義して目的の処理を記述できることがあげられる。
【０００３】
プログラマが記述した各Ｃ変数をレジスタやメモリ領域に割り付ける処理を含むコード生成処理はコンパイラが自動的に行う。このため、プログラマは個々のＣ変数がどのようなレジスタに割り付けられるかを意識する必要がないため、一般的なアセンブラプログラミングに比較して、デバッグおよび検証コストを低減でき、また将来にわたるプログラムの保守や拡張コストが低減できるメリットがある。
【０００４】
レジスタ割り付けに関する基本的な技術は、１９８６年発行、Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ発行、ＡＨＯ，ＳＥＴＨＩ，ＵＬＬＭＡＮ（著）「Ｃｏｍｐｉｌｅｒｓ−Ｐｒｉｎｃｅｐｌｅｓ，Ｔｅｃｈｎｉｑｕｅｓ，ａｎｄ　Ｔｏｏｌｓ」第９章（コード生成：Ｃｏｄｅ　ｇｅｎｅｒａｔｉｏｎ）に述べられている。
【０００５】
以下、ターゲットとする命令セットのオペランド制約条件によるレジスタ割り付けの難易度を説明する。
【０００６】
ここでは、コード生成のターゲットとなるアーキテクチャの機械命令として、３２ビットのレジスタｒ０〜ｒ３をオペランドに指定できるとする。
【０００７】
いま、Ｃプログラム「ｉｎｔ　ａ，ｂ，ｃ，ｄ；　…，ｃ＝ａ＋ｂ；」の中間語表現が、たとえば、”「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」”であり、これらｏｐ１〜ｏｐ３はオペランドを示している。この時点でのレジスタへのＣ変数の割り付け状態はたとえば、レジスタｒ０はＣ変数ａを保持し、レジスタｒ１はＣ変数ｂを保持し、レジスタｒ２はＣ変数ｄを保持しており、レジスタｒ３はＣ変数を保持していない状態とする。
【０００８】
また、中間語表現でのレジスタ割付では、オペランドｏｐ１はＣ変数ａに対応し、オペランドｏｐ２はＣ変数ｂに対応し、オペランドｏｐ３はＣ変数ｃに対応するものとする。
【０００９】
中間語表現「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のオペランドｏｐ１〜ｏｐ３の制約条件、すなわち、各ｏｐ１〜ｏｐ３に使用できるレジスタの選択制約の一例を以下に示す。
【００１０】
〜オペランド制約１〜
レジスタ＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ１＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ２＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ３＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
この制約では、どのオペランドｏｐ１，ｏｐ２，ｏｐ３に対してもレジスタ｛ｒ０，ｒ１，ｒ２，ｒ３｝のいずれも使用できるので、オペランドにレジスタを割り付ける際の制約が少ない。このようにオペランド制約が少ない命令はオペランドの直交性が高いと呼ばれる。
【００１１】
前述したようにレジスタ割り付けでは、ｏｐ１がＣ変数ａに、ｏｐ２がＣ変数ｂに対応している。現在のレジスタ割り付け状態では、レジスタｒ０がＣ変数ａを、レジスタｒ１がＣ変数ｂを保持している。
【００１２】
上記したオペランド制約１によれば中間語表現「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のｏｐ１として、レジスタｒ０が許される。また、ｏｐ２はレジスタｒ１が許される。さらに、ｏｐ３はＣ変数ｃに対応している。現在のレジスタ割付状態によれば、Ｃ変数ｃを保持しているレジスタはないが、レジスタｒ３が空いているので、Ｃ変数ｃをレジスタｒ３に割り付ける。
【００１３】
このとき、オペランド制約１によりｏｐ１はレジスタｒ３が許されるので、「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のすべてのオペランドへのレジスタ選択が完了し、生成された機械語’「ａｄｄ　ｒ０　ｒ０−＞ａ，ｒ２−＞ｂ，ｒ３−＞ｃ」’を得る。
【００１４】
次に、オペランド制約条件がより厳しい場合を想定したレジスタ割り付けを考えてみる。以下に示すオペランド制約２は、オペランド制約条件がオペランド制約１よりも、ｏｐ３に許されるレジスタが少なくなっている点で制約が厳しい。
【００１５】
〜オペランド制約２〜
実レジスタ＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ１＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ２＝｛ｒ０，ｒ１，ｒ２，ｒ３｝
ｏｐ３＝｛ｒ０，ｒ１｝
いま、この制約条件のもとで中間語表現「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のレジスタ割り付けを考える。オペランドｏｐ１，ｏｐ２は前述と同様にできる。現在のレジスタ割付状態おいてはＣ変数ｃがどのレジスタにも割り付けられていないため、割り付けられたＣ変数がないレジスタｒ３が割り付け候補となる。
【００１６】
しかし、「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のｏｐ３では、レジスタｒ３が許されないため、レジスタｒ０，ｒ１のいずれかにＣ変数ｃを割り付ける必要がある。しかし、すでにレジスタｒ０，ｒ１にはＣ変数ａ，ｂがそれぞれ割り付けられているため、別レジスタに退避する必要がある。
【００１７】
ここでは、レジスタｒ０に割り付けられたＣ変数ａを、割り付けられたＣ変数がなく且つ「ａｄｄ　ｏｐ１，ｏｐ２，ｏｐ３」のｏｐ１として許されているレジスタｒ３に割り付けることにして、レジスタｒ０をｒ３に代入するレジスタコピー命令「ｍｏｖ　ｒ０，ｒ３」を生成する。
【００１８】
以上により、オペランド制約２のもとで、生成された機械語を得る。
【００１９】
ここで、オペランド制約２のもとで生成された機械語は、
ｍｏｖ　ｒ０，ｒ３　　　　　　　ｒ３−＞ａ
ａｄｄ　ｒ３，ｒ１，ｒ０　　　　　　　　ｒ０−＞ｃ，ｒ１−＞ｂ，ｒ３−＞ａ
となる。
【００２０】
この場合、生成されたオペランド制約１に基づいて生成された機械語よりオペランド制約２に基づいて生成された機械語の方が命令数が増えている。このようにオペランドの制約条件が厳しい命令セットはオペランドの直交性が乏しいと呼ばれる。
【００２１】
オペランドの直交性が乏しい命令セットでは、単純な割り付けアルゴリズムに基づいて生成されるコードでは命令数が増える可能性、すなわち性能劣化の可能性がある。
【００２２】
このため、オペランド制約が厳しい命令セット向けのコンパイラのレジスタ割り付けにおいては、性能劣化を防ぐための計算量が増える可能性があり、また、生成されたコードも人手でアセンブルしたコードの性能にかなわない可能性がある。
【００２３】
近年、組み込み機器分野において、さまざまなマイクロプロセッサが活用されている。音声、音楽処理機能や画像データ処理をソフトウエアで実現する携帯電話などの携帯機器分野では、デジタルシグナルプロセッサ（ＤＳＰ：Ｄｉｇｉｔａｌ　Ｓｉｇｎａｌ　Ｐｒｏｃｅｓｓｏｒ）と呼ばれる固定小数データ型を扱えるプロセッサ（以下、ＤＳＰという）も活用されている。
【００２４】
これらＤＳＰ向けプログラム開発は性能重視で、アセンブリ言語によるプログラム開発が主流であった。これは、ＤＳＰ命令が一般に１命令に複数オペレーションをもつ一種の並列アーキテクチャであるため、高級プログラム言語のコンパイラでは、このような並列命令をコンパイラがＣプログラムから自動生成するのが難しいことがアセンブリ言語によるプログラム開発の主流となる原因の一つであった。
【００２５】
また、このような分野ではコードサイズ低減も重要であり、命令長のビットサイズを１６ビット、３２ビットに制限するようなＤＳＰでは、命令のエンコードの自由度が少なく、上に述べたオペランド制約が厳しくなるため、コンパイラによるレジスタ割り付けが難しいというのもアセンブリ言語によるプログラミングが主流となっている原因の１つである。
【００２６】
しかし、プログラム生産性の観点からすると、Ｃ言語のような高級プログラミング言語でプログラム開発する方が、検証・デバッグコストおよび将来にわたる保守コスト、機能拡張コストを低減でき、アセンブル言語を用いたプログラミングより優れている。
【００２７】
なお、この種の高級プログラミング言語におけるコンパイラ技術について詳しく述べてある例としては、特開平６−２１４８０２号公報、および特開平５−２０４６６０号公報などがあり、これらの文献には、プログラムで記述された変数の出現頻度やアクセス頻度の高い変数を優先的にレジスタに割り付ける技術について記載されている。
【００２８】
【発明が解決しようとする課題】
ところが、上記のような高級プログラミング言語におけるコンパイラ技術では、次のような問題点があることが本発明者により見い出された。
【００２９】
すなわち、ＤＳＰなどのプロセッサに高級プログラミング言語を活用した場合、ターゲットとするプロセッサの性能を十分に引き出すのが難しく、たとえば、オペレーションの並列度の活用、効率的なレジスタ割り付けによる、冗長なレジスタコピーの低減などが困難になるという問題がある。
【００３０】
したがって、ＤＳＰなどのプロセッサを活用するような分野でのソフトウエア生産性の向上と性能の両立が重要な課題となっている。
【００３１】
本発明の目的は、オペランド制約が厳しい命令セット向けのコンパイラであっても、アセンブル言語を用いたプログラムに近い性能とコードサイズを実現することのできるコンパイル方法を提供することにある。
【００３２】
本発明の前記ならびにその他の目的と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【００３３】
【課題を解決するための手段】
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、以下のとおりである。
（１）本発明は、Ｃプログラム（たとえば、Ｃ言語で表記されたプログラム）からオブジェクトコードを生成するコンパイル方法であって、該Ｃプログラムに記述されたレジスタ割り付け情報に基づいて、ＣプログラムのＣ変数を、あるレジスタに割り付けるものである。
【００３４】
また、本願のその他の発明の概要を簡単に示す。
（２）レジスタ割り付け情報に基づくレジスタの割付は、Ｃプログラムに記述されたレジスタ割り付け情報を解釈するステップと、該Ｃプログラムを構文解析し、中間語表現を生成するステップと、前記解釈したレジスタ割り付け情報に推奨された情報に従って、中間語のオペランドにレジスタを割り付けるステップとを有するものである。
（３）レジスタ割り付け情報は、Ｃプログラムに含まれるプラグマ指示文によってＣ変数名、およびレジスタ名の対応が指定された情報よりなるものである。
（４）レジスタ割り付け情報は、Ｃプログラムに含まれるプラグマ指示文によってＣ変数名、レジスタ名の対応、および関数名を指定し、レジスタ割り付け情報の有効範囲を、関数名に対応する関数本体とするものである。
（５）プラグマ指示文によるレジスタ割り付け情報は、たとえば、同じＣプログラムにおいて、プラグマ指示文が記述されてから、新たなプラグマ指示文が記述されるまでの範囲で有効となるものである。
（６）レジスタ割り付け情報に基づいてレジスタ割り付けを試行した際に、オペランド制約違反、または命令数増加がある場合、レジスタ割り付け情報を部分的に削除してレジスタ割り付けを行うものである。
【００３５】
【発明の実施の形態】
以下、本発明の実施の形態を図面に基づいて詳細に説明する。
【００３６】
図１は、本発明の実施の形態によるプロセッサのブロック図、図２は、図１のプロセッサに設けられたＣＰＵにおけるプログラムコンパイルのイメージ構成図、図３は、図２のコンパイルプログラムにおける命令セットの説明図、図４は、本発明の実施の形態によるコンパイラの構成図、図５は、図４におけるコンパイラ処理のフローチャート、図６は、図４のコンパイラ処理における具体例を示す説明図、図７は、図４のコンパイラ処理における他の例を示す説明図、図８は、図４のコンパイラ処理における他の例を示す説明図、図９は、比較例としてレジスタ割り付けヒント指示プラグマが指定されていない場合のレジスタ割り付け処理の一例を示す説明図、図１０は、比較例として本発明者が検討したオペランド制約が厳しい命令セットのコンパイラによる通常のレジスタ割り付け例の説明図である。
【００３７】
本実施の形態において、プロセッサ１は、たとえば、音声、音楽処理機能画像データ演算処理機能などを有するＤＳＰである。このプロセッサ１は、外部バスＢを介して、たとえば外部メモリＭに接続されている。
【００３８】
プロセッサ１は、図１に示すように、Ｘメモリ（第１メモリ）２、Ｙメモリ（第２のメモリ）３、ＣＰＵ４、ＤＳＰレジスタファイル（ＤＳＰレジスタ部）５、および汎用レジスタファイル（汎用レジスタ部）６などから構成されている。
【００３９】
これらＸメモリ２、Ｙメモリ３、ＣＰＵ４、ＤＳＰレジスタファイル５、ならびに汎用レジスタファイル６は、内部バス７によって相互に接続されている。
【００４０】
Ｘ、Ｙメモリ２，３は、ＣＰＵ４などが用いる内部の高速アクセスメモリである。ＣＰＵ４は制御演算ユニットであり、プログラムの実行制御、演算、およびメモリアクセスなどを行う。
【００４１】
ＤＳＰレジスタファイル５は、固定小数型データ型の演算に命令がアクセスするレジスタファイルである。汎用レジスタファイル６は、整数型データなどの汎用的演算命令がアクセスするレジスタファイルである。また、ＤＳＰレジスタファイル５および汎用レジスタファイル６には複数のレジスタが含まれる。
【００４２】
ここで、ＣＰＵ４におけるプログラムコンパイルのイメージ構成について、図２を用いて説明する。
【００４３】
ＣコンパイラＣＭは、たとえばＣ言語で記載されたＣプログラムＳＣを入力とし、オブジェクトモジュール（たとえば、機械語で記述されたオブジェクトプログラム）ＯＭを生成する。ＣコンパイラＣＭは、プログラマにより記述されたプラグマを含むＣプログラムをコンパイルできる。
【００４４】
プラグマは、ＣコンパイラＣＭにコンパイルに関する情報を与える指示文であり、本実施の形態ではＣコンパイラＣＭにプラグマで指示を与える際、レジスタ割り付けヒント指示プラグマを使用する。
【００４５】
プラグマによるレジスタ割り付けヒントとは、ＣコンパイラＣＭに対して、この割り付けを強制するものではなく、あくまで、このヒントを手がかりにレジスタ割り付けを行えば、効率よくアセンブル言語プログラムに近い性能とコードサイズの実現ができるという位置づけである。
【００４６】
また、プラグマはコンパイラ処理系依存であり、そのコンパイラ処理系で定義されていないプラグマは無視されるため、本実施の形態におけるレジスタ割り付けヒント指示プラグマを認識しない別のコンパイラ処理系においても、Ｃプログラムとしての移植性を損なわない。
【００４７】
このように、レジスタ割り付けヒント指示プラグマにより、既存のＣプログラムそのものの移植性を損なわず、オペランド制約の厳しいアーキテクチャでも、プログラムのコードサイズ低減と実行性能向上を実現できる。
【００４８】
また、リンケージエディタＬＥは、オブジェクトモジュールＯＭとライブラリＬｂをリンクし、ターゲットとなるプロセッサで実行可能なロードモジュールＬＭを生成する。
【００４９】
また、図３は、図２に示したコンパイルされるＣプログラムにおける命令セットの概略である。
【００５０】
図示するように、命令は、１６ビット長命令フォーマット４１、および３２ビット長命令フォーマット４２に分類されている。命令フォーマット４１は、Ｘメモリ２、およびＹメモリ３へのアクセスをエンコードするフィールドをもつ。
【００５１】
命令フォーマット４２は、Ｘメモリ２、およびＹメモリ３へのアクセスをエンコードするＸ，ＹメモリフィールドとＤＳＰ演算をエンコードするＤＳＰ演算指定フィールドをそれぞれもつ。
【００５２】
命令セットＸ４３はＸメモリ２アクセス用命令のテンプレートを示している。動作Ｘ４４はＸメモリ２アクセス用命令の動作をＣ言語で記述したものである。オペランド制約条件４５は、命令セットＸ４３のオペランド「Ａｘ，Ｄｘ，Ｄａ」がどの実レジスタをとることができるかを示す。ここで、たとえば、オペランドＡｘとして許されるレジスタは、「Ｒ４，Ｒ５」のいずれかであることを示している。
【００５３】
同様に、命令セットＹ４６はＹメモリ３アクセス用命令のテンプレートを示す。動作Ｙ４７はＹメモリ３アクセス用命令の動作をＣ言語で記述したものである。オペランド制約条件４８は、命令セットＹ４６のオペランド「Ａｙ，Ｄｙ，Ｄａ」がどのレジスタをとることができるかを示す。
【００５４】
命令セットＤ４９はＤＳＰ演算命令のテンプレートを示す。動作Ｄ４００はＤＳＰ演算命令の動作をＣ言語で記述したものである。オペランド制約条件４０１は、命令セットＤ４９のオペランド「Ｓｘ，Ｓｙ，Ｄｚ，Ｓｅ，Ｓｆ，Ｄｇ，Ｄｕ」がどのレジスタをとることができるかをそれぞれ示す。
【００５５】
次に、本実施の形態の作用について説明する。
【００５６】
始めに、図４のコンパイラ構成図、ならびに図５のコンパイラ処理のフローチャートを用いて説明する。
【００５７】
図４においては、上方から下方にかけて、入力されたＣプログラムＳＣ１、該ＣプログラムＳＣ１から解析した中間語表現ＩＬ、コンパイラ内部におけるレジスタ割付表（１）Ｒｇ１（図４の左側）、コンパイラ内部のレジスタ割付表（２）Ｒｇ２（図４右側）、および機械語列Ｍａをそれぞれ示している。
【００５８】
レジスタ割付表（１）Ｒｇ１はレジスタ割付ヒント指示プラグマから生成される表で、当該プラグマの指示「ｘｐ＝Ｒ４」からＣ変数ｘｐに対して、レジスタＲ４を割り付けることを保持している。同様に、Ｃ変数ｙｐ，ａｃｃ，ｍ０，ｘ０，ｙ０に対しても夫々指示されたレジスタを保持する。レジスタ割付表（２）Ｒｇ２は中間語表現ＩＬにおけるオペランドとＣ変数との対応を保持する。これらの表は中間語表生成時（図５、ステップＳ１０３）、もしくはそれ以前に作成される。
【００５９】
中間語表現ＩＬにおいて、「ｐａｄｄ　ｏｐ１，ｏｐ２，ｏｐ１」は命令セットＤ４９と制約条件４０１との制約を受ける。例えば、ｏｐ１は、命令セットＤ４９の制約から、ＳｘとＤｚの条件を満たす必要があり、このＳｘとＤｚとして許されるのは制約条件４０１で規定されるレジスタ（Ａ０，Ａ１，Ｘ０，Ｘ１）である。ｏｐ２も同様にして、Ｓｙの条件を受け、許されるレジスタは制約条件４０１に規定される。以下、中間語表現ＩＬで現れるｏｐ２，ｏｐ３，ｏｐ４などの制約も同様にして規定される。同様に、命令セットＸ４３に該当する命令の制約も命令セットＸ４３と制約条件４５から規定される。また同様に命令セットＹ４６に該当する命令の制約も、命令セットＹ４６と制約条件４８から規定される。
【００６０】
まず、ＣプログラムＳＣを入力する（ステップＳ１０１）。本実施の形態におけるＣプログラムＳＣは、Ｃ言語に「＃ｐｒａｇｍａ　ｄｉｓｉｒａｂｌｅ＿ｒｅｇｉｓｔｅｒ（．．．）」というプラグマ指示文を記述したものである。
【００６１】
ここで、「＃ｐｒａｇｍａ　ｄｉｓｉｒａｂｌｅ＿ｒｅｇｉｓｔｅｒ（ｘｐ＝Ｒ４，ｙｐ＝Ｒ６，ａｃｃ＝Ａ０，ｍ０＝Ｍ０，ｘ０＝Ｘ０，ｙ０＝Ｙ０）」の意味は、Ｃ変数ｘｐにレジスタＲ４を割り付けることを推奨する、というものである。
【００６２】
同様に、他のＣ変数ｙｐ，ａｃｃ，ｍ０，ｘ０，ｙ０に対して、それぞれレジスタＲ６，Ａ０，Ｍ０，Ｘ０，Ｙ０を割り付けることを推奨する、というレジスタ割り付けヒントをコンパイラに与えている。
【００６３】
この割り付けヒントは、コンパイラに対して、この割り付けを強制するものではなく、あくまで、このヒントを手がかりにレジスタ割り付けを行えば、効率よくアセンブル言語プログラムに近い性能とコードサイズの実現ができるという位置づけである。
【００６４】
推奨ではなく、割り付けを強制した場合、局所的には効率よいレジスタ割り付けが可能となっても、大域的には与えられた指示が足かせとなり、コード全体のサイズおよび性能が低下する懸念もあるからである。
【００６５】
そして、コンパイラは、ＣプログラムＳＣ１におけるプラグマ「＃ｐｒａｇｍａ　ｄｉｓｉｒａｂｌｅ＿ｒｅｇｉｓｔｅｒ（．．．）」を識別し（ステップＳ１０２）、内部的に、レジスタ割付表（１）Ｒｇ１を生成する。このレジスタ割付表（１）Ｒｇ１は、レジスタ割付ヒント指示プラグマに基づいたＣ変数名とレジスタ名との対応表である。
【００６６】
その後、入力されたＣプログラムを構文解析し、中間語表現を生成する（ステップＳ１０３）。たとえば、Ｃプログラム「ａｃｃ＋＝ｍ０；ｍ０＝ｘ０＊ｙ０；ｘ０＝＊ｘｐ＋＋；ｙ０＝＊ｙｐ＋＋；」に対して、中間語表現ＩＬを得る。
【００６７】
中間語表現ＩＬ中のｏｐ１，ｏｐ２，…，ｏｐ６はレジスタが割り付けられていない状態のオペランドを示している。この段階で、コンパイラは、レジスタ割付表（２）Ｒｇ２を生成している。これは、レジスタが割り付けられていない状態のオペランド（仮レジスタ名）と、入力されたＣプログラム内での対応するＣ変数名との対応表である。
【００６８】
また、レジスタ割り付けヒントに従うレジスタ割り付け試行において、レジスタ割付表（１）Ｒｇ１、ならびにレジスタ割付表（２）Ｒｇ２に基づいて、中間語表現ＩＬのオペランドにレジスタを割り付ける（ステップＳ１０４）。
【００６９】
次に、整合性チェックにより（ステップＳ１０５）、試行されたレジスタ割り付けがオペランド制約に違反していないかを判定する（ステップＳ１０６）。ここでオペランド制約とは、図３に示したオペランド制約条件４５，４８，４０１などの制約である。
【００７０】
もし、ステップＳ１０６の処理において、違反が検出された場合は、レジスタ割付表（１）Ｒｇ１を更新（割付情報更新）して（ステップＳ１０７）、ステップＳ１０４の処理を行い、再度レジスタ割り付け処理を行う。
【００７１】
オペランド制約違反が検出されなくなるまで、これらステップＳ１０４〜Ｓ１０７の処理を繰り返し、機械語Ｍａに示す機械語（オブジェクトコード）を生成し、オブジェクトコード生成が終了となる（ステップＳ１０８）。
【００７２】
ここでは、レジスタ割り付けヒント指示プラグマの有効範囲を、そのプラグマがソースコード内に記述された箇所以降とする。それ以降で、再びレジスタ割り付けヒント指示プラグマが記述された場合、それまでの割り付けヒント指示プラグマの有効範囲を隠すこととする。つまり、再びレジスタ割り付けヒントプラグマが記述された箇所までが、既出のレジスタ割り付けヒントプラグマの有効範囲となる。
【００７３】
また、本発明におけるレジスタ割り付け指示プラグマはそのレジスタ割り付けを推奨するものであるため、オペランド制約に違反する場合には前記レジスタ割付表（１）を更新する（ステップＳ１０７）ことで、最適なレジスタ割り付けを行うことが可能となる。
【００７４】
また、図５におけるレジスタ割り付け試行、整合性チェック、割り付け情報更新および試行繰り返しでの処理の具体例について、図４および図６を用いて説明する。
【００７５】
図４においては、上方から下方にかけて、ＣプログラムＳＣ１に基づいた中間語生成で生成された中間語表現ＩＬ、コンパイラ内部のレジスタ割付表（１）Ｒｇ１（図４左）、同じくコンパイラ内部のレジスタ割付表（２）Ｒｇ２（図４右）、および機械語列Ｍａをそれぞれ示している。さらに、図６においては、ＣプログラムＳＣ１（図４）に基づいた中間語表現ＩＬ、およびレジスタ割付け状態表ＲＷ１が夫々示されている。
【００７６】
レジスタ割り付け試行においては、中間語生成で生成された中間語表現ＩＬ１（図６）を入力とする。ここで、ＣプログラムＳＣ１（図４）に対応する中間語表現は、中間語表現ＩＬ１に示した４つの命令テンプレート（ａ）〜（ｄ）で表現されている。
【００７７】
各命令テンプレートに対する割り付け処理を行うため、まず、テンプレート（ａ）に対するレジスタ割り付けを試行する。テンプレート（ａ）「ｐａｄｄ　ｏｐ１，ｏｐ２，ｏｐ１」でのオペランドｏｐ１，ｏｐ２にＣ対応する変数名はそれぞれ、ａｃｃ，ｍ０であることがレジスタ割付表（２）Ｒｇ２（図４）よりわかる。
【００７８】
さらに、レジスタ割付表（１）Ｒｇ１（図４）により、各Ｃ変数ａｃｃ，ｍ０に割り付けが推奨されているレジスタ名がそれぞれ、Ａ０，Ｍ０であることにより、機械語「ｐａｄｄ　Ａ０，Ｍ０，Ａ０」が候補となる。
【００７９】
整合性チェックでは２つの制約をチェックする。一つはオペランド制約が満たされているかであり、もう一つは、現時点でのレジスタ割り付け状態と整合性が満たされているか、である。
【００８０】
試行された機械語「ｐａｄｄ　Ａ０，Ｍ０，Ａ０」はオペランド制約４０１（図３）を満たしている。次に、現時点でのレジスタ割付け状態表ＲＷ１で整合性チェックを行う。
【００８１】
レジスタ割付け状態表ＲＷ１（図６）は、現時点でのレジスタとそれが保持しているＣ変数名との対応表であり、ここではテンプレート（ａ）処理時点でのレジスタ割り付け状態を示している。レジスタとＣ変数名とが夫々対応して記されているレジスタ割付け状態表ＲＷ１では、Ａ０がＣ変数ａｃｃを、Ｍ０がＣ変数ｍ０を保持していることが示されており、レジスタ割付表（１）Ｒｇ１と整合性が保たれている。
【００８２】
以上により、試行された機械語「ｐａｄｄ　Ａ０，Ｍ０，Ａ０」が制約条件を満たしていることがチェックされたので、再び各命令テンプレートに対するレジスタ割り付け処理を、次のテンプレート（ｂ）に対して行う。この例の場合、テンプレート（ａ）〜（ｄ）に対してはすべての制約条件（４５，４８，４０１）が満たされているため、レジスタ割り付け後に機械語列Ｍａ（図４）に示される機械語を得る。
【００８３】
また、図７は、図４のレジスタ割り付け試行、整合性チェック、割り付け情報更新および試行繰り返しでの処理における他の具体例を示したものである。
【００８４】
この図７においては、上方から下方にかけて、レジスタ割り付けヒント指示プラグマを含むＣプログラムＳＣ２、コンパイラ内部のレジスタ割付表（１）Ｒｇ３（図７左）、同じくコンパイラ内部のレジスタ割付表（２）Ｒｇ４（図７右）、レジスタ割付け状態表ＲＷ２（図７左）、レジスタ割付け状態表ＲＷ３（図７右）、ならびに機械語列Ｍａ２をそれぞれ示している。
【００８５】
図７におけるＣプログラムＳＣ２では、Ｃ変数ａｃｃに対応するレジスタ割り付けヒントがない場合を示している。
【００８６】
ヒントに従うレジスタ割り付け試行は、中間語生成で生成された中間語表現ＩＬ１（図６）を入力とする。
【００８７】
ここで、ＣプログラムＳＣ２に対応する中間語表現ＩＬ１（図６）は、４つの命令テンプレート（ａ）〜（ｄ）で表現されている。各命令テンプレートに対する割り付け処理を行うため、まず、テンプレート（ａ）に対するレジスタ割り付けを試行する。
【００８８】
テンプレート（ａ）「ｐａｄｄ　ｏｐ１，ｏｐ２，ｏｐ１」でのオペランドｏｐ１，ｏｐ２に対応するＣ変数名はそれぞれ、ａｃｃ，ｍ０であることがレジスタ割付表（２）Ｒｇ４によりわかる。
【００８９】
さらに、レジスタ割付表（１）Ｒｇ３により、Ｃ変数ｍ０に割り付けが推奨されているレジスタ名がＭ０であることがわかるが、Ｃ変数ａｃｃに対応するレジスタ割り付けヒントがない。
【００９０】
命令セットＤ４９、およびオペランド制約４０１（図３）により、ｏｐ１のレジスタ候補は、Ａ０，Ａ１，Ｘ０，Ｘ１であることがわかる。レジスタの現時点でのレジスタ割付け状態表ＲＷ２により、Ｘ０，Ｘ１はすでにＣ変数を保持しているので、Ｃ変数を保持していないレジスタとしては、Ａ０，Ａ１が可能である。
【００９１】
そこで、ｏｐ１としてレジスタＡ１を選択できる。整合性チェックは上記の処理で済んだことになるので、機械語「ｐａｄｄ　Ａ１，Ｍ０，Ａ１」を得る。レジスタ割付け状態表ＲＷ２を更新して、レジスタＡ１がＣ変数ａｃｃを保持する、という情報をくわえて更新されたレジスタ割付け状態表ＲＷ３を得る。
【００９２】
再び各命令テンプレートに対するレジスタ割り付け処理を、次のテンプレート（ｂ）に対して行う。この例の場合、テンプレート（ａ）〜（ｄ）に対してはすべての制約条件が満たされているため、レジスタ割り付け後に機械語列Ｍａ２に示した機械語を得る。
【００９３】
さらに、図８は、図４のレジスタ割り付け試行、整合性チェック、割り付け情報更新および試行繰り返しの処理での別の具体例を示したものである。
【００９４】
図８においては、上方から下方にかけて、レジスタ割り付けヒント指示プラグマのＣプログラムＳＣ３、コンパイラ内部のレジスタ割付表（１）Ｒｇ５（図８左）、同じくコンパイラ内部のレジスタ割付表（２）Ｒｇ６（図８右）、レジスタ割付け状態表ＲＷ４（図８左）、レジスタ割付け状態表ＲＷ５（図８右）、ならびにコンパイラ内部におけるレジスタ割付表（１）Ｒｇ７をそれぞれ示している。
【００９５】
ＣプログラムＳＣ３におけるレジスタ割り付けヒント指示プラグマでは、Ｃ変数ｙｐに対応するレジスタ割り付けヒントがレジスタＲ５の場合である。レジスタ割り付け試行は、生成された中間語表現ＩＬ１（図６）を入力とする。
【００９６】
ここで、ＣプログラムＳＣ３に対応する中間語表現ＩＬ１（図６）は４つの命令テンプレート（ａ）〜（ｄ）で表現されている。各命令テンプレートに対する割り付け処理を行うため、まず、テンプレート（ａ）に対するレジスタ割り付けを試行する。テンプレート（ａ）〜（ｃ）に対しては、図７と同様にレジスタ割り付けが可能である。
【００９７】
テンプレート（ｄ）に対して、オペランドｏｐ６，ｏｐ４に対応する変数名はそれぞれ、ｙｐ，ｙ０であることがレジスタ割付表（２）Ｒｇ６によりわかる。
【００９８】
さらに、レジスタ割付表（１）Ｒｇ５により、Ｃ変数ｙｐ，ｙ０に割り付けが推奨されているレジスタ名がそれぞれ、Ｒ６，Ｙ０であることがわかる。これにより試行された機械語は「ｍｏｖｙ．ｖ　＠Ｒ６＋，Ｙ０」となる。
【００９９】
整合性チェックにより、このレジスタ割り付けの整合性をチェックする。命令セットＹ４６およびオペランド制約４８（図３）により、ｏｐ６としてとりうるレジスタは、「Ｒ６，Ｒ７」のいずれかであるため、試行された機械語のレジスタＲ５はこの制約に違反している。
【０１００】
レジスタ割付け状態表ＲＷ４により、オペランドｏｐ６としてとりうるレジスタ「Ｒ６，Ｒ７」が保持しているＣ変数をチェックすると、レジスタＲ６が空いている。また、Ｃ変数ｙｐを保持しているレジスタがＲ５であることから、このまま機械語を生成する場合は、機械語「ｍｏｖ　Ｒ５，Ｒ６」「ｍｏｖｙ．ｗ　＠Ｒ６＋，Ｙ０」で整合性のとれた機械語が生成されるが、レジスタコピー命令「ｍｏｖ　Ｒ５，Ｒ６」によりサイズ増加および性能劣化の可能性がある。
【０１０１】
ここでは、レジスタ割付表（１）Ｒｇ５からＣ変数ｙｐに対応するレジスタ割り付けヒントを削除してレジスタ割付表Ｒｇ７に更新し、さらにレジスタ割り付け状態を更新し、レジスタ割付け状態表ＲＷ５を得る。
【０１０２】
再びヒントに従うレジスタ割り付け処理で、更新されたレジスタ割付表（１）Ｒｇ７、およびレジスタ割付け状態表ＲＷ５に基づいて、テンプレート（ａ）〜（ｄ）に対するレジスタ割り付けを再び再試行する。この再試行により、最終的な機械語を得る。
【０１０３】
また、本発明における第１の比較例として、レジスタ割り付けヒント指示プラグマが指定されていない場合のレジスタ割り付け処理の一例について、図９を用いて模式的に説明する。
【０１０４】
図９の上方から下方にかけては、レジスタ割り付けヒント指示プラグマのＣプログラムＳＣ４、コンパイラ内部のレジスタ割付表（１）Ｒｇ８（図９左）、コンパイラ内部のレジスタ割付表（２）Ｒｇ９（図９右）、レジスタ割付け状態表ＲＷ６（図９左）、およびレジスタ割付け状態表ＲＷ７（図９右）をそれぞれ示している。
【０１０５】
レジスタ割り付け試行において、中間語生成で生成された中間語表現ＩＬ１（図６）を入力とする。ここで、ＣプログラムＳＣ４に対応する中間語表現は４つの命令テンプレート（ａ）〜（ｄ）で表現されている。
【０１０６】
各命令テンプレートに対する割り付け処理を行うため、まず、テンプレート（ａ）に対するレジスタ割り付けを試行する。レジスタ割付表（１）Ｒｇ８では、レジスタ割り付けヒントプラグマに基づくレジスタ推奨がないため、コンパイラは、オペランド制約、レジスタ割付表（２）Ｒｇ９およびレジスタ割付け状態表ＲＷ６からレジスタ割り付けを試行する。
【０１０７】
まず、オペランドｏｐ１，ｏｐ２に対応するＣ変数名をレジスタ割付表（２）Ｒｇ９から探す。いまの場合、オペランドｏｐ１，ｏｐ２にはそれぞれＣ変数ａｃｃ，ｍ０が対応している。
【０１０８】
次に、レジスタ割付け状態表ＲＷ６からＣ変数ａｃｃ，ｍ０を保持するレジスタを探す。いまの場合、Ｃ変数ａｃｃ，ｍ０を保持するレジスタはないので、コンパイラは、図３の命令セット（４３，４６，４９）およびオペランド制約（４５，４８，４０１）を満たすレジスタをｏｐ１，ｏｐ２に割り付ける。テンプレート（ａ）「ｐａｄｄ　ｏｐ１，ｏｐ２，ｏｐ１」に対しては命令セットＤ４９およびオペランド制約４０１から、ｏｐ１，ｏｐ２への割り付けレジスタ候補として、Ａ０，Ｍ０が得られる。
【０１０９】
これはレジスタ割付け状態表ＲＷ６と整合するので、レジスタ割付け状態表ＲＷ６を更新したレジスタ割付け状態表ＲＷ７を得る。これによりテンプレート（ａ）に対応する機械語は「ｐａｄｄ　Ａ０，Ｍ０，Ａ０」となる。
【０１１０】
同様に、テンプレート（ｂ）〜（ｄ）に対しても、レジスタ割付け状態表ＲＷ６を更新しながら機械語を生成して、機械語列Ｍａ（図４）に示すような機械語を得る。ただし、この比較例では割り付けヒント指示プラグマがない場合での最善の例を示したものであり、一般的には、オペランド制約により、機械語列Ｍａ（図４）に示すよりも命令数が増加し、実行時性能も劣化した機械語が生成される場合が多い。このため、レジスタ割り付けヒント指示プラグマによりレジスタ割り付けを指示した場合、命令数が少なく実行時性能も優れた機械語が得られる可能性が高い。
【０１１１】
次に、第２の比較例として、本発明者が検討したオペランド制約が厳しい命令セットのコンパイラによる通常のレジスタ割り付け例（レジスタ割り付けヒント指示プラグマが指定されいない場合）について模式的に説明する。
【０１１２】
以下、図１０のＣプログラムＳＣ５に示す４つの文「ａｃｃ＋＝ｍｕｌ；　ｍｕｌ＝ｘ＊ｙ；　ｘ＝＊ｘｐ＋＋；　ｙ＝＊ｙｐ＋＋；」を、図３に示した命令体系をターゲットとするレジスタ割り付け例について述べる。
【０１１３】
図１０の上方から下方にかけては、ＣプログラムＳＣ５、中間語表現ＩＬ２、レジスタ割付表（１）Ｒｇ１０、レジスタ割付表（１）Ｒｇ１１、レジスタ割付け状態表ＲＷ８、実際に生成された機械語列Ｍａ３、および期待される機械語列Ｍａ４をそれぞれ示している。本比較例では、レジスタ割り付け指示プラグマがない場合を示しているため、レジスタ割付け表（１）には推奨されるレジスタが記載されていない。
【０１１４】
図１０において、ＣプログラムＳＣ５に対応するコンパイラの中間語表現を中間語表現ＩＬ２に示す。この直前の段階で、Ｃ変数名と中間語のオペランドとの対応がレジスタ割付表（２）Ｒｇ１１のようになっているとする。
【０１１５】
さらに、レジスタに割り付けられているＣ変数をレジスタ割付け状態表ＲＷ８に示す。いま、中間語表現ＩＬ２のテンプレート（ａ）〜（ｃ）でのレジスタ割り付けが、図３の命令セット（４３，４６，４９）およびオペランド制約（４５，４８，４０１）に整合するかを確認すると、レジスタ割付表（２）Ｒｇ１１、およびレジスタ割付け状態表ＲＷ８に基づくレジスタ割り付けはオペランド制約（４５，４８，４０１）を満足している。
【０１１６】
しかし、テンプレート（ｄ）は命令セットＹ４６およびオペランド制約４８を満たしていない。これは、レジスタ割付け状態表ＲＷ８によれば現在、Ｃ変数「ｙｐ」はレジスタ「Ｒ５」に割り付けられているが、Ｃ変数「ｙｐ」を保持するオペランド「ｏｐ６」はレジスタ「Ｒ６，Ｒ７」のいずれかしか許さないためである。
【０１１７】
このオペランド制約を守るために、コンパイラは、レジスタ「Ｒ５」をレジスタ「Ｒ６」にコピーする命令を生成する必要がある。こうして得られた機械語は、生成された機械語列Ｍａ３のようになる。
【０１１８】
レジスタ割り付けを理想的に行えば、ＣプログラムＳＣ５に対応する機械語は期待される機械語列Ｍａ４となる。生成された機械語列Ｍａ３のバイトサイズは８バイトであり、機械語５６のバイトサイズは４バイトである。
【０１１９】
また、生成された機械語列Ｍａ３の実行サイクルは１サイクルであるのに対し、期待される機械語列Ｍａ４の実行サイクルは３サイクルとなる。このようにオペランド制約が厳しい場合、コンパイラが生成する機械語はコードサイズが増え、さらに実行サイクル数が増える恐れがある。
【０１２０】
一方、本実施の形態に示したコンパイラでは、レジスタ割り付け指示プラグマによりレジスタを割り付けることにより、命令数が少なく実効性能の優れた機械語を生成することが可能となる。
【０１２１】
それにより、本実施の形態においては、プラグマによるレジスタ割り付けヒント指示によって、Ｃ言語によるＣプログラムＳＣの移植性を損なわず、オペランド制約の厳しいアーキテクチャであってもプログラムのコードサイズの低減、ならびに実行性能向上を実現することができる。
【０１２２】
以上、本発明者によってなされた発明を発明の実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【０１２３】
たとえば、レジスタ割り付け処理においては、引数に関数を含むプラグマによってレジスタ割り付けを行うようにしてもよい。
【０１２４】
また、本発明において、プログラムとは複数のプログラムファイル（プログラムモジュール）を組み合わせて構成されるものであってもよい。
【０１２５】
さらに、本発明におけるレジスタ割り付け指示プラグマは作成されたプログラムファイル単位について有効であり、複数のプログラムファイルで構成されるプログラムにおいては、全てのファイルにレジスタ割り付け指示プラグマが含まれても良いし、レジスタ割り付け指示プラグマを有するファイル、および図１０のようにレジスタ割り付け指示プラグマを含まないファイルの組み合わせによって構成されていてもよい。
【０１２６】
表１は、引数に関数名を含んだＣ言語によるプラグマ指示文の一例を示したものである。
【０１２７】
【表１】
2004126666.tif 000003
【０１２８】
表に示すように、プラグマ「＃ｐｒａｇｍａ　ｄｉｓｉｒａｂｌｅ＿ｒｅｇｉｓｔｅｒ（ｆｕｎｃ０，ｘｐ＝Ｒ４，ｙｐ＝Ｒ６，ａｃｃ＝Ａ０，ｍ０＝Ｍ０，ｘ０＝Ｘ０，ｙ０＝Ｙ０）」は、引数に関数名を含んでいる。
【０１２９】
この意味は、このレジスタ割り付けヒント指示プラグマが有効となる範囲を関数ｆｕｎｃ０内に限定するものである。
【０１３０】
それにより、関数内部でのレジスタ割り付けを前記実施の形態１と同様にレジスタ割り付けヒントに基づいて実現することができる。
【０１３１】
【発明の効果】
本願によって開示される発明のうち、代表的なものによって得られる効果を簡単に説明すれば、以下のとおりである。
【０１３２】
（１）Ｃ言語によるＣプログラムそのものの移植性を損なうことなく、オペランド制約の厳しいアーキテクチャであってもプログラムにおけるコードサイズを低減することができる。
【０１３３】
（２）上記（１）により、命令数の少ない、実行性能の優れた機械語を生成することができる。
【図面の簡単な説明】
【図１】本発明の実施の形態によるプロセッサのブロック図である。
【図２】図１のプロセッサに設けられたＣＰＵにおけるプログラムコンパイルのイメージ構成図である。
【図３】図２のコンパイルプログラムにおける命令セットの説明図である。
【図４】本発明の実施の形態によるコンパイラの構成図である。
【図５】図４におけるコンパイラ処理のフローチャートである。
【図６】図４のコンパイラ処理における具体例を示す説明図である。
【図７】図４のコンパイラ処理における他の例を示す説明図である。
【図８】図４のコンパイラ処理における他の例を示す説明図である。
【図９】比較として本発明の実施の形態によるレジスタ割り付けヒント指示プラグマが指定されていない場合のレジスタ割り付け処理の一例を示す説明図である。
【図１０】比較として本発明者が検討したオペランド制約が厳しい命令セットのコンパイラによる通常のレジスタ割り付け例の説明図である。
【符号の説明】
１　プロセッサ
２　Ｘメモリ
３　Ｙメモリ
４　ＣＰＵ
５　ＤＳＰレジスタファイル
６　汎用レジスタファイル
７　内部バス
Ｂ　外部バス
Ｍ　外部メモリ
【図１】
2004126666.tif 000004
【図２】
2004126666.tif 000005
【図３】
2004126666.tif 000006
【図４】
2004126666.tif 000007
【図５】
2004126666.tif 000008
【図６】
2004126666.tif 000009
【図７】
2004126666.tif 000010
【図８】
2004126666.tif 000011
【図９】
2004126666.tif 000012
【図１０】
2004126666.tif 000013