(57)【要約】  部分ビット列に対する判定処理を効率化する。  コード変換装置（１０）は、第１のコード（１３）を、シフト演算と論理演算とを１つの命令で指示する複合命令（ＭＣ）を使用可能な第２のコード（１４）に変換する。変換部（１２）は、データの中の一部のビット列が０の列であるか判定する命令（Ｍ１）と、当該一部のビット列が１の列であるか判定する命令（Ｍ２）と、命令（Ｍ１，Ｍ２）の結果を合成する命令（Ｍ３）とを含む判定コード（１３ａ）を検出する。変換部（１２）は、シフト演算によって少なくとも上記一部のビット列がシフトされ、論理演算によってシフト後の上記一部のビット列とデータの中の他のビット列とが合成されるように引数を設定した複合命令（ＭＣ）と、複合命令（ＭＣ）の結果とデータとを比較する命令（Ｍ４）とを含む判定コード（１４ａ）を生成する。
2016056081.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
第１のコードを、シフト演算と前記シフト演算の結果に対する論理演算とを１つの命令で指示する複合命令を使用可能な第２のコードに変換する場合に、
前記第１のコードから、データの中の一部のビット列が０の列であるか判定する第１の命令と、前記一部のビット列が１の列であるか判定する第２の命令と、前記第１の命令および前記第２の命令の結果を合成する第３の命令とを含む判定コードを検出し、
前記判定コードに基づいて、前記シフト演算によって少なくとも前記一部のビット列がシフトされ、前記論理演算によってシフト後の前記一部のビット列と前記データの中の他のビット列とが合成されるように引数を設定した前記複合命令と、前記複合命令の結果と前記データとを比較する第４の命令とを含む他の判定コードを生成し、
前記第２のコードに前記他の判定コードを含める、
処理を実行させるコード変換プログラム。
【請求項２】
前記論理演算は、前記シフト演算の結果に対する第１の論理演算と、前記第１の論理演算の結果に対する第２の論理演算とを含み、
前記他の判定コードの生成では、前記シフト演算によって前記データがシフトされ、前記第１の論理演算によって前記シフト演算の結果からシフト後の前記一部のビット列が抽出され、前記第２の論理演算によってシフト後の前記一部のビット列と前記他のビット列とが合成されるように、前記引数を設定する、
請求項１記載のコード変換プログラム。
【請求項３】
前記第１の命令は、前記一部のビット列が０の列であり、かつ、前記他のビット列のうちの少なくとも一部のビットが所定のビット条件を満たすか判定することを示し、
前記第２の命令は、前記一部のビット列が１の列であり、かつ、前記少なくとも一部ビットが前記所定のビット条件を満たすか判定することを示し、
前記他の判定コードの生成では、前記論理演算によって前記少なくとも一部のビットが前記所定のビット条件に応じた値に置換されるように、前記引数を設定する、
請求項１または２記載のコード変換プログラム。
【請求項４】
第１のコードを記憶する記憶部と、
前記第１のコードを、シフト演算と前記シフト演算の結果に対する論理演算とを１つの命令で指示する複合命令を使用可能な第２のコードに変換する変換部と、
を有し、前記変換部は、
前記第１のコードから、データの中の一部のビット列が０の列であるか判定する第１の命令と、前記一部のビット列が１の列であるか判定する第２の命令と、前記第１の命令および前記第２の命令の結果を合成する第３の命令とを含む判定コードを検出し、
前記判定コードに基づいて、前記シフト演算によって少なくとも前記一部のビット列がシフトされ、前記論理演算によってシフト後の前記一部のビット列と前記データの中の他のビット列とが合成されるように引数を設定した前記複合命令と、前記複合命令の結果と前記データとを比較する第４の命令とを含む他の判定コードを生成し、
前記第２のコードに前記他の判定コードを含める、
コード変換装置。
【請求項５】
コンピュータが実行するコード変換方法であって、
第１のコードを、シフト演算と前記シフト演算の結果に対する論理演算とを１つの命令で指示する複合命令を使用可能な第２のコードに変換する場合に、
前記第１のコードから、データの中の一部のビット列が０の列であるか判定する第１の命令と、前記一部のビット列が１の列であるか判定する第２の命令と、前記第１の命令および前記第２の命令の結果を合成する第３の命令とを含む判定コードを検出し、
前記判定コードに基づいて、前記シフト演算によって少なくとも前記一部のビット列がシフトされ、前記論理演算によってシフト後の前記一部のビット列と前記データの中の他のビット列とが合成されるように引数を設定した前記複合命令と、前記複合命令の結果と前記データとを比較する第４の命令とを含む他の判定コードを生成し、
前記第２のコードに前記他の判定コードを含める、
コード変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコード変換プログラム、コード変換装置およびコード変換方法に関する。
【背景技術】
【０００２】
ＣＰＵ（Central Processing Unit）などのプロセッサの多くは、２進数で表現されたデータをビット列とみなしてビット演算を行う基本的な命令を実行することができる。ビット演算に関する基本的な命令には、ビット反転（ＮＯＴ）・論理和（ＯＲ）・論理積（ＡＮＤ）・排他的論理和（ＸＯＲ）などの論理演算の命令や、算術シフト・論理シフト・回転シフトなどのシフト演算の命令が含まれ得る。ビット列に対する複雑な処理についても、このような基本的な命令を組み合わせることで実現可能である。【０００３】
ただし、論理演算命令やシフト命令などの基本的な命令のみを用いて、ビット列に対する複雑な処理を実現しようとすると、発行する命令が多くなってしまう場合がある。例えば、１つのレジスタに格納されたデータの中から、不連続な２つのビット列を抽出して結合する処理を考える。この処理を実現するプログラムの一例として、抽出するビット列毎にＡＮＤ命令を用いて当該ビット列以外の部分をマスクし、ビット列毎にシフト命令を用いて位置調整を行い、ＯＲ命令を用いて２つのビット列を結合するものが考えられる。この場合、少なくとも５つの基本的な命令が発行されることになる。【０００４】
これに対し、頻繁に実行され得る処理については、基本的な命令の他に専用の命令を用意し、ハードウェアによって高速に実行できるようにすることが提案されている。
例えば、データの中の一部分のビットのみシフトすることができる計算機が提案されている。この計算機は、シフト量を指定する第１のフィールドとシフトを禁止するビット領域を指定する第２のフィールドとを含むシフト命令を受け付ける。計算機は、シフト回路とセレクタ回路とを有する。シフト回路は、第１のフィールドで指定されたシフト量に応じてデータをシフトする。セレクタ回路は、第２のフィールドで指定されたビット領域に属するビット位置については、元のデータのビットを選択してレジスタに出力する。一方、セレクタ回路は、第２のフィールドで指定されたビット領域に属さないビット位置については、シフト回路が出力するシフトデータのビットを選択してレジスタに出力する。【０００５】
また、複数の浮動小数点数の指数部をブロック単位で共通化する（正規化する）半導体集積回路が提案されている。正規化では、ブロック内の浮動小数点数の中で指数の最大値を特定し、当該最大値に応じて各浮動小数点数の仮数部をシフトする。この半導体集積回路は、ビット列生成回路と指数算出回路とを有する。ビット列生成回路は、各浮動小数点数を示すビット列について、隣接するビットが同じか異なるかを示す他のビット列を生成する。指数算出回路は、ビット列生成回路が生成した複数の浮動小数点数に対応する他のビット列の論理和を算出し、論理和のビット列に基づいて共通の指数を決定する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−９９３２７号公報
【特許文献２】国際公開第２０１１／１６１８５９号
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、プロセッサに実行させたい処理として、データ中の一部のビット列がオール０（０の列）またはオール１（１の列）であるか否か、すなわち、ビット列に含まれる全てのビットの値が一致しているか否かを判定することが挙げられる。例えば、ＩＥＥＥ（Institute of Electrical and Electronics Engineers）７５４に規定された浮動小数点数の規格では、データが特殊な数値を表しているとき、指数部を示すビット列がオール０またはオール１になる場合がある。このため、数値計算ライブラリなど、浮動小数点数を扱うプログラムの中には、データの一部分である指数部のビット列がオール１またはオール０であるか否かを頻繁にチェックするものがある。【０００８】
しかし、多くのプロセッサには、データ中の一部のビット列がオール０またはオール１であるか否か判定する専用の命令は用意されていない。そのため、前述のように論理演算命令やシフト命令などの基本的な命令を用いて、オール０またはオール１を判定するプログラムが作成されることになり、判定処理の効率が良くないという問題がある。一方で、プロセッサの中には、１つの命令でシフト演算と論理演算とを指示する複合命令を実行することができるものがある。このような複合命令を活用することができれば、部分ビット列に対する判定処理を効率化できる余地がある。【０００９】
１つの側面では、本発明は、部分ビット列に対する判定処理を効率化できるコード変換プログラム、コード変換装置およびコード変換方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、コンピュータに以下の処理を実行させるコード変換プログラムが提供される。第１のコードを、シフト演算とシフト演算の結果に対する論理演算とを１つの命令で指示する複合命令を使用可能な第２のコードに変換する場合に、第１のコードから、データの中の一部のビット列が０の列であるか判定する第１の命令と、一部のビット列が１の列であるか判定する第２の命令と、第１の命令および第２の命令の結果を合成する第３の命令とを含む判定コードを検出する。判定コードに基づいて、シフト演算によって少なくとも一部のビット列がシフトされ、論理演算によってシフト後の一部のビット列とデータの中の他のビット列とが合成されるように引数を設定した複合命令と、複合命令の結果とデータとを比較する第４の命令とを含む他の判定コードを生成する。第２のコードに他の判定コードを含める。【００１１】
また、１つの態様では、第１のコードを記憶する記憶部と、第１のコードを、シフト演算とシフト演算の結果に対する論理演算とを１つの命令で指示する複合命令を使用可能な第２のコードに変換する変換部と、を有するコード変換装置が提供される。また、１つの態様では、コンピュータが実行するコード変換方法が提供される。
【発明の効果】
【００１２】
１つの側面では、部分ビット列に対する判定処理を効率化できる。
本発明の上記および他の目的、特徴および利点は本発明の例として好ましい実施の形態を表す添付の図面と関連した以下の説明により明らかになるであろう。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態のコード変換装置を示す図である。
【図２】コンパイル装置のハードウェア例を示すブロック図である。
【図３】コンパイル装置の機能例を示すブロック図である。
【図４】プロセッサのハードウェア例を示すブロック図である。
【図５】シフト論理複合命令のフォーマット例を示す図である。
【図６】浮動小数点データのフォーマット例を示す図である。
【図７】部分ビット列一致判定の第１の演算例を示す図である。
【図８】部分ビット列一致判定の第２の演算例を示す図である。
【図９】部分ビット列一致判定の第３の演算例を示す図である。
【図１０】部分ビット列一致判定の第４の演算例を示す図である。
【図１１】ＳＬ複合命令を用いた最適化の例を示す図である。
【図１２】コンパイルの手順例を示すフローチャートである。
【図１３】命令データと依存性データの構造例を示す図である。
【図１４】対象処理データの構造例を示す図である。
【図１５】最適化対象検出の手順例を示すフローチャートである。
【図１６】最適化対象検出の手順例を示すフローチャート（続き）である。
【図１７】最適化実行の手順例を示すフローチャートである。
【図１８】最適化実行の手順例を示すフローチャート（続き）である。
【発明を実施するための形態】
【００１４】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態のコード変換装置を示す図である。
【００１５】
第１の実施の形態のコード変換装置１０は、第１のコード１３を第２のコード１４に変換する。第１のコード１３および第２のコード１４は、命令を用いてプロセッサに実行させる処理を記述したものであり、プログラムと呼ばれてもよい。
【００１６】
コード変換装置１０としては、様々な種類の変換装置が考えられる。例えば、コード変換装置１０は、コンパイラでもよい。その場合、第１のコード１３はソースコードまたは中間コードであり、第２のコード１４は中間コード、アセンブリコードまたはオブジェクトコード（機械語コード）である。また、コード変換装置１０は、アセンブラでもよい。その場合、第１のコード１３はアセンブリコードであり、第２のコード１４はオブジェクトコードである。また、コード変換装置１０は、バイナリオプティマイザでもよい。その場合、第１のコード１３および第２のコード１４は、オブジェクトコードである。
【００１７】
コード変換装置１０は、コンパイルプログラム、アセンブリプログラム、バイナリ最適化プログラムなどの変換プログラムを実行するコンピュータであってもよい。コンピュータは、ユーザが操作するクライアントコンピュータ（端末装置と言うこともできる）でもよいし、クライアントコンピュータからアクセスされるサーバコンピュータでもよい。なお、第２のコード１４または第２のコード１４に基づいて生成されるオブジェクトコードは、コード変換装置１０が備えるプロセッサに実行させてもよいし、他のコンピュータが備えるプロセッサに実行させてもよい。
【００１８】
コード変換装置１０は、記憶部１１および変換部１２を有する。記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性の記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性の記憶装置でもよい。変換部１２は、プロセッサを用いて実現できる。プロセッサは、ＣＰＵやＤＳＰ（Digital Signal Processor）であってもよい。また、プロセッサは、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路を含んでもよい。プロセッサは、例えば、ＲＡＭなどのメモリに記憶されたプログラムを実行する。複数のプロセッサの集合（マルチプロセッサ）を「プロセッサ」と呼ぶこともある。
【００１９】
記憶部１１は、第１のコード１３を記憶する。第１のコード１３は、判定コード１３ａを含む。判定コード１３ａは、データの中の一部のビット列がオール０（０の列）またはオール１（１の列）であるか、すなわち、当該一部のビット列に含まれる全てのビットの値が同一であるか判定するコードである。判定コード１３ａは、データの中の一部のビット列が０の列であるか判定する命令Ｍ１と、当該一部のビット列が１の列であるか判定する命令Ｍ２と、命令Ｍ１，Ｍ２の結果を合成する命令Ｍ３とを含む。
【００２０】
判定コード１３ａは、命令Ｍ１の前に、データに含まれる判定対象のビット列以外の他のビット列を０にマスクする他の命令を含んでもよい。当該他の命令は、例えば、ＡＮＤ命令を用いて実現できる。命令Ｍ１は、マスクされたデータと判定対象のビット列がオール０であるサンプルデータとを比較する命令であってもよく、例えば、比較命令を用いて実現できる。命令Ｍ２は、マスクされたデータと判定対象のビット列がオール１であるサンプルデータとを比較する命令であってもよく、例えば、比較命令を用いて実現できる。命令Ｍ３は、例えば、命令Ｍ１，Ｍ２の結果の論理和を算出するＯＲ命令である。
【００２１】
変換部１２は、記憶部１１に記憶された第１のコード１３を第２のコード１４に変換する。このとき、第２のコード１４は、処理効率が向上するように（例えば、処理速度の向上およびメモリ使用量の削減の少なくとも一方が実現されるように）最適化される。最適化においては、第２のコード１４または第２のコード１４から生成されるオブジェクトコードを実行するプロセッサのアーキテクチャに依存した命令を使用してもよい。
【００２２】
第１の実施の形態では、アーキテクチャ依存の命令として、以下に説明する複合命令を第２のコード１４において使用可能であるものとする。この複合命令は、シフト演算と当該シフト演算の結果に基づく１以上の論理演算とを、１つの命令で指示するものである。例えば、データに対してシフトを行い、シフト結果に対してＡＮＤ演算を行い、ＡＮＤ演算の結果に対して更にＯＲ演算を行うことを、１つの複合命令によってプロセッサに指示することができる。複合命令を解釈可能なプロセッサは、シフト演算と１以上の論理演算とを連続的に実行することができる演算回路を有している。
【００２３】
変換部１２は、第１のコード１３の中から、最適化対象として判定コード１３ａを検出する。すると、変換部１２は、判定コード１３ａに基づいて、判定コード１３ａと同じ処理結果が得られる判定コード１４ａを生成する。判定コード１４ａは、複合命令を用いて判定コード１３ａを最適化したものであり、複合命令ＭＣと命令Ｍ４を含む。
【００２４】
複合命令ＭＣに対しては、シフト演算によってデータのうち少なくとも判定対象のビット列がシフトされ、論理演算によってシフト後のビット列とデータ中の他のビット列とが合成されるように、引数が設定される。例えば、シフト演算によってデータ全体がシフトされ、ＡＮＤ演算によってシフト後のデータから所望の範囲のビット列が抽出され、ＯＲ演算によって所望の範囲のビット列とデータ中の他のビット列とが合成される。複合命令ＭＣを実行することで、データの中の判定対象となる一部のビット列のみシフトすることができる。シフトは、例えば、右方向への１ビットの算術シフトとする。命令Ｍ４は、複合命令ＭＣの結果と元のデータとを比較する比較命令である。変換部１２は、生成した判定コード１４ａを第２のコード１４に含めるようにする。
【００２５】
ここで、判定コード１４ａによって判定コード１３ａと同じ処理結果が得られることを説明する。一例として、データはｘ１，ｘ２，ｘ３，ｘ４，ｘ５，ｘ６，ｘ７，ｘ８の８ビットデータであり、ｘ３，ｘ４，ｘ５，ｘ６の４ビットの値が同一か判定するとする。
【００２６】
判定コード１３ａでは、ビット列ｘ３，ｘ４，ｘ５，ｘ６が抽出され、命令Ｍ１によってこのビット列が００００であるか判定され、命令Ｍ２によってこのビット列が１１１１であるか判定される。そして、命令Ｍ３によって、命令Ｍ１，Ｍ２の結果の何れか一方が真であるか判定される。これにより、ビット列ｘ３，ｘ４，ｘ５，ｘ６がオール０またはオール１か、すなわち、全てのビットの値が同じであるか否か判定できる。
【００２７】
一方、判定コード１４ａでは、複合命令ＭＣによって、データｘ１，ｘ２，ｘ３，ｘ４，ｘ５，ｘ６，ｘ７，ｘ８のうち判定対象のビット列のみシフトされる。ここでは、判定対象のビット列が右方向に１ビットだけ算術シフトされるとする。これにより、元のデータがｘ１，ｘ２，ｘ３，ｘ３，ｘ４，ｘ５，ｘ７，ｘ８に変換される。そして、命令Ｍ４によって、複合命令ＭＣで変換されたデータと元のデータが同一か否か判定される。
【００２８】
命令Ｍ４の結果が真となる条件は、比較するビット列の間で同じ位置にあるビットの値が同じであること、すなわち、ｘ３＝ｘ３かつｘ３＝ｘ４かつｘ４＝ｘ５かつｘ５＝ｘ６が成立していることである。この等式をまとめると、命令Ｍ４の結果が真となる条件は、ｘ３＝ｘ４＝ｘ５＝ｘ６となる。これは、判定対象のビット列ｘ３，ｘ４，ｘ５，ｘ６がオール０またはオール１であることを意味する。よって、判定コード１４ａにおける命令Ｍ４の結果は、判定コード１３ａにおける命令Ｍ３の結果と一致する。
【００２９】
第１の実施の形態のコード変換装置１０によれば、第１のコード１３から、データ中の一部のビット列が０の列または１の列であるか判定する判定コード１３ａが検出される。そして、判定コード１３ａに基づいて、複合命令を用いて上記の一部のビット列のみをシフトし、シフトしたデータと元のデータとを比較する判定コード１４ａが生成される。判定コード１４ａは、シフト演算と論理演算とを１つの命令で指示する複合命令を利用して、判定コード１３ａと同じ処理結果を得ることができるものである。
【００３０】
これにより、第２のコード１４の命令数を第１のコード１３よりも削減することができる。特に、クリティカルパス上に並ぶ命令の数を削減することができる。よって、あるビット範囲に属する全てのビットが同じ値か否かの判定を効率的に行うことができる。
【００３１】
［第２の実施の形態］
次に、第２の実施の形態を説明する。第２の実施の形態のコンパイル装置は、高級言語で記述されたソースコードを、中間言語で記述された中間コードを経由して、機械可読なオブジェクトコードに変換する。このとき、コンパイル装置は、オブジェクトコードの実行効率が向上するように、中間コードに対して各種の最適化を行う。
【００３２】
図２は、コンパイル装置のハードウェア例を示すブロック図である。
コンパイル装置１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。上記のユニットは、それぞれバス１０８に接続されている。
【００３３】
ＣＰＵ１０１は、プログラムの命令を実行する演算回路を含むプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを備えてもよく、コンパイル装置１００は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合（マルチプロセッサ）を「プロセッサ」と呼んでもよい。
【００３４】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、コンパイル装置１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【００３５】
ＨＤＤ１０３は、ＯＳ（Operating System）やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、コンパイルプログラムが含まれる。なお、コンパイル装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００３６】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、コンパイル装置１００に接続されたディスプレイ３１に画像を出力する。ディスプレイ３１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ（ＰＤＰ：Plasma Display Panel）、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなどを用いることができる。
【００３７】
入力信号処理部１０５は、コンパイル装置１００に接続された入力デバイス３２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス３２としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、コンパイル装置１００に、複数の種類の入力デバイスが接続されていてもよい。
【００３８】
媒体リーダ１０６は、記録媒体３３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体３３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１０６は、例えば、記録媒体３３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３９】
通信インタフェース１０７は、ネットワーク３０に接続され、ネットワーク３０を介して他のコンピュータと通信を行う。通信インタフェース１０７は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局またはアクセスポイントと無線リンクで接続される無線通信インタフェースでもよい。
【００４０】
なお、コンパイル装置１００は、媒体リーダ１０６を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合は画像信号処理部１０４や入力信号処理部１０５を備えていなくてもよい。また、ディスプレイ３１や入力デバイス３２が、コンパイル装置１００の筐体と一体に形成されていてもよい。コンパイル装置１００は、第１の実施の形態のコード変換装置１０の一例である。ＣＰＵ１０１は、変換部１２の一例である。ＲＡＭ１０２またはＨＤＤ１０３は、記憶部１１の一例である。
【００４１】
図３は、コンパイル装置の機能例を示すブロック図である。
コンパイル装置１００は、ファイル記憶部１１０、コンパイラ１２１およびリンカ１２２を有する。ファイル記憶部１１０は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域として実現される。コンパイラ１２１およびリンカ１２２は、例えば、それぞれＣＰＵ１０１が実行するプログラムとして実現される。コンパイラ１２１を実装したプログラムは、コンパイルプログラムと呼ぶことがある。リンカ１２２を実装したプログラムは、リンクプログラムと呼ぶことがある。
【００４２】
ファイル記憶部１１０は、ソースファイル１１１、中間ファイル１１２、オブジェクトファイル１１３および実行可能ファイル１１４を記憶する。ソースファイル１１１は、高級言語で記述されたソースコードを格納する。ソースファイル１１１は、ユーザによって作成される。中間ファイル１１２は、コンパイラ１２１の内部で使用される中間言語で記述された中間コードを格納する。オブジェクトファイル１１３は、機械語で記述されたオブジェクトコードを格納する。中間ファイル１１２およびオブジェクトファイル１１３は、コンパイラ１２１によって生成される。実行可能ファイル１１４は、断片的なオブジェクトコードを結合して得られる、プロセッサによって実行可能な形式のファイルである。実行可能ファイル１１４は、リンカ１２２によって生成される。
【００４３】
コンパイラ１２１は、ユーザから入力されるコンパイルコマンドに応じて、ソースファイル１１１からソースコードを読み込み、コンパイルする。コンパイルの過程で、コンパイラ１２１は、中間ファイル１１２に中間コードを書き込む。コンパイラ１２１は、ソースコードに対応するオブジェクトコードを生成し、オブジェクトファイル１１３に書き込む。リンカ１２２は、オブジェクトファイル１１３が生成されると、オブジェクトコードで参照されているライブラリや他のオブジェクトファイルを検出する。リンカ１２２は、検出したライブラリや他のオブジェクトファイルとオブジェクトファイル１１３とを結合して、実行可能ファイル１１４を生成する。
【００４４】
コンパイラ１２１は、入力部１３０、最適化部１４０および出力部１５０を有する。入力部１３０は、ソースコード入力部１３１、字句解析部１３２、意味解析部１３３および中間コード生成部１３４を有する。最適化部１４０は、中間コード入力部１４１、解析部１４２、最適化実行部１４３および中間コード出力部１４４を有する。出力部１５０は、中間コード入力部１５１およびオブジェクトコード生成部１５２を有する。
【００４５】
ソースコード入力部１３１は、コンパイルコマンドで指定されたソースファイル１１１からソースコードを読み込む。字句解析部１３２は、ソースコード入力部１３１が読み込んだソースコードに対して、字句解析を行う。字句解析では、ソースコードに含まれる文字列が、「トークン」と呼ばれる最小単位の語に分割される。意味解析部１３３は、字句解析部１３２が生成したトークンの列に対して、構文解析および意味解析を行う。構文解析では、プログラミング言語の文法に基づいて、トークンの列が解析されて構文木が生成される。意味解析では、構文木に対して意味論的情報が付加され、変数の定義と参照の関係などが解析される。中間コード生成部１３４は、意味解析部１３３が生成した構文木に基づいて中間コードを生成し、中間ファイル１１２に書き出す。
【００４６】
中間コード入力部１４１は、中間ファイル１１２から中間コードを読み込む。解析部１４２は、中間コード入力部１４１が読み込んだ中間コードの中から最適化可能な命令を検索し、最適化方法を選択する。最適化には、不要な変数および途中計算の削除、ループや条件分岐の削減、自動並列化などが含まれる。また、最適化には、それぞれ１つの演算を指示する単純命令をまとめて、複数の演算を指示する複合命令に変換することが含まれる。複合命令の中には、プロセッサアーキテクチャ依存の命令が存在する。解析部１４２は、ターゲットのプロセッサアーキテクチャを考慮して最適化方法を選択する。
【００４７】
最適化実行部１４３は、解析部１４２が選択した最適化方法に従って、中間コード入力部１４１が読み出した中間コードを変換する。解析部１４２による中間コードの解析と最適化実行部１４３による中間コードの変換とは、繰り返し実行されることもある。すなわち、解析部１４２は、最適化実行部１４３によって変換された中間コードから、更に最適化可能な命令を検索するようにしてもよい。中間コード出力部１４４は、最適化実行部１４３が変換した中間コードを中間ファイル１１２に書き出す。
【００４８】
中間コード入力部１５１は、中間ファイル１１２から最適化済みの中間コードを読み込む。オブジェクトコード生成部１５２は、中間コード入力部１５１が読み出した中間コードを、機械語で記述されたオブジェクトコードに変換する。オブジェクトコード生成部１５２は、中間コードをアセンブリコードに一旦変換し、アセンブリコードをオブジェクトコードに変換するようにしてもよい。そして、オブジェクトコード生成部１５２は、オブジェクトコードをオブジェクトファイル１１３に書き出す。
【００４９】
次に、実行可能ファイル１１４を実行するプロセッサについて説明する。
図４は、プロセッサのハードウェア例を示すブロック図である。
第２の実施の形態では、図４に示すようなハードウェアを有するプロセッサ２００を、ターゲットのプロセッサアーキテクチャとして想定する。プロセッサ２００は、レジスタＲ０，Ｒ１，…，Ｒ６３（６４個のレジスタ）を有する。レジスタＲ０，Ｒ１，…，Ｒ６３は、それぞれプログラムの命令から使用できる６４ビットの汎用レジスタである。６４個のレジスタは、６ビットのレジスタ番号で識別することができる。
【００５０】
また、プロセッサ２００は、シフト論理複合命令（ＳＬ複合命令）に応じてシフト論理複合演算（ＳＬ複合演算）を行う演算回路を有している。１つのＳＬ複合命令を受けて、シフト演算および論理演算を含むＳＬ複合演算が実行される。第２の実施の形態では、広義のＳＬ複合演算は以下のような演算を含むものとする。
【００５１】
広義のＳＬ複合演算は、演算ステップ１，２，３を含む。演算ステップ１では、複数の参照オペランド（ｒｓ１，ｒｓ２，…）それぞれに対して、指定された方向（ｄ１，ｄ２，…）に指定されたシフト量（ｓ１，ｓ２，…）だけ、指定された種類（ｋ１，ｋ２，…）のシフト演算を行う。シフト方向は、右または左である。シフト演算の種類は、論理シフト、算術シフトおよび回転シフトの何れかである。
【００５２】
演算ステップ２では、演算ステップ１の結果それぞれと指定されたビット列（ｍ１，ｍ２，…）との間で、指定された種類（ｌａ１，ｌａ２，…）の論理演算を行う。論理演算の種類には、論理積（ＡＮＤ）、論理和（ＯＲ）、排他的論理和（ＸＯＲ）、否定論理積（ＮＡＮＤ）、否定論理和（ＮＯＲ）、否定排他的論理和（ＸＮＯＲ）が含まれる。演算ステップ３では、演算ステップ２の結果を、指定された順序で指定された論理演算（ｌｂ１，ｌｂ２，…）を用いて合成し、１つの定義オペランド（ｒｄ）を算出する。
【００５３】
ただし、広義のＳＬ複合演算をプロセッサ上で完全に実装することは容易でない。そこで、プロセッサ２００には、以下に説明するように、広義のＳＬ複合演算のサブセット（第２の実施の形態における狭義のＳＬ複合演算）が実装されている。
【００５４】
具体的には、プロセッサ２００は、ＳＬ複合命令の実行に用いられる演算回路として、シフト回路２０１，２０２、ＡＮＤ回路２０３，２０４およびＯＲ回路２０５，２０６を有する。シフト回路２０１は、パラメータｄ１，ｋ１，ｓ１に基づいて、レジスタ番号ｒｓ１のレジスタ（以下では、Ｒ（ｒｓ１）のように記載することがある）に格納されたデータをシフトする。シフト回路２０１に関して、パラメータｄ１はシフト方向を示し、パラメータｋ１はシフト演算の種類を示し、パラメータｓ１はシフト量を示す。シフト回路２０２は、パラメータｄ２，ｋ２，ｓ２に基づいて、レジスタＲ（ｒｓ２）のデータをシフトする。シフト回路２０２に関して、パラメータｄ２はシフト方向を示し、パラメータｋ２はシフト演算の種類を示し、パラメータｓ２はシフト量を示す。
【００５５】
ＡＮＤ回路２０３は、シフト回路２０１の結果とレジスタＲ（ｍ１）のデータとの間で論理積を算出する。ＡＮＤ回路２０４は、シフト回路２０２の結果とレジスタＲ（ｍ２）のデータとの間で論理積を算出する。ＯＲ回路２０５は、ＡＮＤ回路２０３の結果とＡＮＤ回路２０４の結果との間で論理和を算出する。ＯＲ回路２０６は、ＯＲ回路２０５の結果とレジスタＲ（ｒｓ３）のデータとの間で論理和を算出する。ＯＲ回路２０６が算出したＳＬ複合演算の結果は、レジスタＲ（ｒｄ）に格納される。
【００５６】
図５は、シフト論理複合命令のフォーマット例を示す図である。
命令フォーマット４１の形式のＳＬ複合命令が、プロセッサ２００に入力される。命令フォーマット４１は、２２ビットの命令コードと、それぞれ６ビットのレジスタ番号ｒｄ，ｒｓ１，ｒｓ２，ｒｓ３，ｓｈｉｆｔ＿ｃｔｒｌ，ｍ１，ｍ２を含む。レジスタＲ（ｒｄ）は、ＳＬ複合命令の定義オペランドと言うことができる。レジスタＲ（ｒｓ１），Ｒ（ｒｓ２），Ｒ（ｒｓ３），Ｒ（ｓｈｉｆｔ＿ｃｔｒｌ），Ｒ（ｍ１），Ｒ（ｍ２）は、ＳＬ複合命令の参照オペランドと言うことができる。
【００５７】
命令コードは、命令の種類がＳＬ複合命令（ＳＬ＿ＣＯＭＰＯＵＮＤ）であることを示す。レジスタ番号ｒｄは、ＳＬ複合演算の結果を格納するレジスタを示す。レジスタ番号ｒｓ１は、シフト回路２０１に入力するデータが格納されたレジスタを示す。レジスタ番号ｒｓ２は、シフト回路２０２に入力するデータが格納されたレジスタを示す。レジスタ番号ｒｓ３は、ＯＲ回路２０６に入力するデータが格納されたレジスタを示す。レジスタ番号ｓｈｉｆｔ＿ｃｔｒｌは、パラメータの値が格納されたレジスタを示す。レジスタ番号ｍ１は、ＡＮＤ回路２０３のマスク用ビット列が格納されたレジスタを示す。レジスタ番号ｍ２は、ＡＮＤ回路２０４のマスク用ビット列が格納されたレジスタを示す。
【００５８】
レジスタＲ（ｓｈｉｆｔ＿ｃｔｒｌ）には、パラメータフォーマット４２の形式のビット列が格納される。パラメータフォーマット４２は、１ビットのパラメータｄ１，ｄ２と、２ビットのパラメータｋ１，ｋ２と、７ビットのパラメータｓ１，ｓ２を含む。残りの４４ビットは、使用されないビットである（ｄｏｎ’ｔ  ｃａｒｅ１，２）。
【００５９】
パラメータｄ１は、シフト回路２０１のシフト方向を示す。パラメータｄ２は、シフト回路２０２のシフト方向を示す。パラメータｄ１，ｄ２について、「０」は右シフトを示し、「１」は左シフトを示す。パラメータｋ１は、シフト回路２０１のシフト演算の種類を示す。パラメータｋ２は、シフト回路２０２のシフト演算の種類を示す。パラメータｋ１，ｋ２について、「００」は論理シフトを示し、「０１」は算術シフトを示し、「１０」は回転シフトを示す。パラメータｋ１，ｋ２の値として「１１」は使用されない。パラメータｓ１は、シフト回路２０１のシフト量としてのビット数を示す。パラメータｓ２は、シフト回路２０２のシフト量としてのビット数を示す。
【００６０】
ところで、コンパイル装置１００が生成するプログラム（実行可能ファイル１１４）は、浮動小数点データをプロセッサ２００に処理させることがある。第２の実施の形態では、ＩＥＥＥ７５４形式の浮動小数点データを扱うこととする。
【００６１】
図６は、浮動小数点データのフォーマット例を示す図である。
浮動小数点数を６４ビットで表現する場合、浮動小数点フォーマット４３は、１ビットの符号部Ｓと、１１ビットの指数部Ｅと、５２ビットの仮数部Ｆとを含む。符号部Ｓと指数部Ｅと仮数部Ｆの組み合わせに応じて、浮動小数点データは以下のような意味をもつ。
【００６２】
符号部Ｓが０、指数部Ｅが全ビット０（ａｌｌ−ｂｉｔｓ−ｏｆｆ）、仮数部Ｆが全ビット０の場合、その浮動小数点データは正のゼロを意味する。符号部Ｓが０、指数部Ｅが全ビット０、仮数部Ｆが１以上の値の場合、その浮動小数点データは正のアンダーフロー状態（正の非正規化数）を意味する。符号部Ｓが０、指数部Ｅが全ビット１（ａｌｌ−ｂｉｔｓ−ｏｎ）、仮数部Ｆが全ビット０の場合、その浮動小数点データは正の無限大を意味する。符号部Ｓが０、指数部Ｅが全ビット１、仮数部Ｆが１以上の値の場合、その浮動小数点データは正の非数値（ＮａＮ：Not a Number）を意味する。符号部Ｓが０、指数部Ｅが０より大きく最大値（ａｌｌ−ｂｉｔｓ−ｏｎ）より小さい場合、その浮動小数点データは正の正規化数（正常な浮動小数点数）を意味する。
【００６３】
符号部Ｓが１、指数部Ｅが全ビット０、仮数部Ｆが全ビット０の場合、その浮動小数点データは負のゼロを意味する。符号部Ｓが１、指数部Ｅが全ビット０、仮数部Ｆが１以上の値の場合、その浮動小数点データは負のアンダーフロー状態（負の非正規化数）を意味する。符号部Ｓが１、指数部Ｅが全ビット１、仮数部Ｆが全ビット０の場合、その浮動小数点データは負の無限大を意味する。符号部Ｓが１、指数部Ｅが全ビット１、仮数部Ｆが１以上の値の場合、その浮動小数点データは負の非数値（ＮａＮ）を意味する。符号部Ｓが１、指数部Ｅが０より大きく最大値（ａｌｌ−ｂｉｔｓ−ｏｎ）より小さい場合、その浮動小数点データは負の正規化数を意味する。
【００６４】
このように、ＩＥＥＥ７５４形式の浮動小数点データでは、指数部Ｅが全ビット０であるか、指数部Ｅが全ビット１であるか、仮数部Ｆが全ビット０であるかに応じて、その意味が異なる。浮動小数点データを扱うプログラムでは、入力された浮動小数点データをチェックするときに、全ビット０や全ビット１を判定することになる。
【００６５】
例えば、浮動小数点データが正の正規化数および負の正規化数以外を示しているかチェックするとき、指数部Ｅが全ビット０または全ビット１であるか否か判定することになる。また、例えば、浮動小数点データが正のゼロ、正の無限大、負のゼロ、負の無限大の何れかを示しているかチェックするとき、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか否か判定することになる。
【００６６】
次に、浮動小数点データに対する次の４つの演算の例を説明する。（１）ＳＬ複合命令を用いずに、指数部Ｅが全ビット０または全ビット１であるか判定する。（２）ＳＬ複合命令を用いずに、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか判定する。（３）ＳＬ複合命令を用いて、指数部Ｅが全ビット０または全ビット１であるか判定する。（４）ＳＬ複合命令を用いて、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか判定する。
【００６７】
図７は、部分ビット列一致判定の第１の演算例を示す図である。
ＳＬ複合命令を用いずに、指数部Ｅが全ビット０または全ビット１であるか判定する場合、例えば、１つのＡＮＤ命令と２つの比較命令と１つのＯＲ命令が発行される。
【００６８】
ＡＮＤ命令に応じて実行されるＡＮＤ演算２１１では、レジスタＲ（ｒｓ１）のデータとレジスタＲ（ｒｓ２）のビット列との間で論理積が算出される。レジスタＲ（ｒｓ１）には、浮動小数点データが格納されている。レジスタＲ（ｒｓ２）には、マスク用ビット列が格納されている。このマスク用ビット列は、指数部Ｅに対応するビットが１に設定され、それ以外のビットが０に設定されたビット列である。ＡＮＤ演算２１１によって、指数部Ｅに含まれるＥ１，Ｅ２，…，Ｅ１１が抽出される。
【００６９】
一方の比較命令に応じて実行される比較演算（ＥＱ演算）２１２では、ＡＮＤ演算２１１の結果とレジスタＲ（ｍ１）のビット列とが比較される。両者が一致する場合は「１」が出力され、一致しない場合は「０」が出力される。レジスタＲ（ｍ１）には、比較用ビット列が格納されている。この比較用ビット列は、全ビットが０に設定されたビット列である。他方の比較命令に応じて実行される比較演算２１３では、ＡＮＤ演算２１１の結果とレジスタＲ（ｒｓ２）のビット列とが比較される。両者が一致する場合は「１」が出力され、一致しない場合は「０」が出力される。レジスタＲ（ｒｓ２）のビット列は、比較演算２１３では比較用ビット列として再利用されることになる。
【００７０】
すなわち、比較演算２１２において指数部Ｅが全ビット０であるか否か判定され、比較演算２１３において指数部Ｅが全ビット１であるか否か判定される。ＯＲ命令に応じて実行されるＯＲ演算２１４では、比較演算２１２の結果と比較演算２１３の結果との間で論理和が算出される。比較演算２１２，２１３の何れか一方が「１」を出力するとき、ＯＲ演算２１４は１を出力する。すなわち、指数部Ｅが全ビット０または全ビット１である場合、最終的な結果は「１」になり、それ以外の場合、最終的な結果は「０」になる。
【００７１】
図８は、部分ビット列一致判定の第２の演算例を示す図である。
ＳＬ複合命令を用いずに、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか判定する場合、例えば、１つのＡＮＤ命令と２つの比較命令と１つのＯＲ命令が発行される。これにより、図７の場合と同様に、ＡＮＤ演算２１１と比較演算２１２，２１３とＯＲ演算２１４が実行される。ただし、ＡＮＤ演算２１１および比較演算２１２，２１３に入力されるビット列が、図７の場合と異なる。
【００７２】
ＡＮＤ演算２１１では、レジスタＲ（ｒｓ１）のデータとレジスタＲ（ｒｓ２）のビット列との間で論理積が算出される。レジスタＲ（ｒｓ１）には、浮動小数点データが格納されている。レジスタＲ（ｒｓ２）には、マスク用ビット列が格納されている。このマスク用ビット列は、指数部Ｅと仮数部Ｆに対応するビットが１に設定され、それ以外のビットが０に設定されたビット列である。仮数部Ｆに対してビット判定を行うため、仮数部Ｆに対応するビットも１に設定されている。ＡＮＤ演算２１１によって、指数部Ｅに含まれるＥ１，Ｅ２，…，Ｅ１１と仮数部Ｆに含まれるＦ１，Ｆ２，…，Ｆ５２が抽出される。
【００７３】
比較演算２１２では、ＡＮＤ演算２１１の結果とレジスタＲ（ｍ１）のビット列とが比較される。レジスタＲ（ｍ１）には、比較用ビット列が格納されている。この比較用ビット列は、全ビットが０に設定されたビット列である。仮数部Ｆの判定条件が全ビット０であるため、この比較用ビット列の仮数部Ｆに対応するビットが全ビット０に設定されている。仮数部Ｆの判定条件が全ビット０以外の場合は、この比較用ビット列の仮数部Ｆに対応するビットを判定条件に合わせて変更すればよい。
【００７４】
比較演算２１３では、ＡＮＤ演算２１１の結果とレジスタＲ（ｍ２）のビット列とが比較される。レジスタＲ（ｍ２）には、他の比較用ビット列が格納されている。当該他の比較用ビット列は、指数部Ｅに対応するビットが１に設定され、それ以外のビットが０に設定されたビット列である。仮数部Ｆの判定条件が全ビット０であるため、当該他の比較用ビット列の仮数部Ｆに対応するビットが全ビット０に設定されている。仮数部Ｆの判定条件が全ビット０以外の場合は、レジスタＲ（ｍ１）のビット列と同様に、当該他の比較用ビット列の仮数部Ｆに対応するビットを判定条件に合わせて変更すればよい。
【００７５】
すなわち、比較演算２１２において、指数部Ｅが全ビット０かつ仮数部Ｆが全ビット０であるか判定される。また、比較演算２１３において、指数部Ｅが全ビット１かつ仮数部Ｆが全ビット０であるか判定される。ＯＲ演算２１４では、比較演算２１２の結果と比較演算２１３の結果との間で論理和が算出される。指数部Ｅが全ビット０または全ビット１であり仮数部Ｆが全ビット０である場合、ＯＲ演算２１４から出力される最終的な結果は「１」になり、それ以外の場合、最終的な結果は「０」になる。
【００７６】
図９は、部分ビット列一致判定の第３の演算例を示す図である。
ＳＬ複合命令を用いて、指数部Ｅが全ビット０または全ビット１であるか判定する場合、例えば、１つのＳＬ複合命令と１つの比較命令が発行される。プロセッサ２００では、ＳＬ複合命令に応じて、シフト回路２０１でシフト演算２２１が実行され、シフト回路２０２でシフト演算２２２が実行される。更に、ＡＮＤ回路２０３でＡＮＤ演算２２３が実行され、ＡＮＤ回路２０４でＡＮＤ演算２２４が実行され、ＯＲ回路２０５でＯＲ演算２２５が実行され、ＯＲ回路２０６でＯＲ演算２２６が実行される。また、プロセッサ２００では、比較命令に応じて、比較演算２２７が実行される。
【００７７】
シフト演算２２１では、レジスタＲ（ｒｓ１）に格納された浮動小数点データに対して、右方向に１ビットの論理シフトが行われる。シフト演算２２１を実現するため、パラメータｄ１＝０、パラメータｋ１＝００、パラメータｓ１＝１に設定される。これにより、指数部ＥはＳ，Ｅ１，…，Ｅ１０となり、仮数部ＦはＥ１１，Ｆ１，…，Ｆ５１となる。シフト演算２２２では、レジスタＲ（ｒｓ１）に格納された浮動小数点データを変更しない。シフト演算２２２を実現するため、パラメータｄ２＝０、パラメータｋ２＝００、パラメータｓ２＝０に設定される。ただし、パラメータｄ２，ｋ２の値は任意の値でよい。
【００７８】
ＡＮＤ演算２２３では、シフト演算２２１の結果とレジスタＲ（ｍ１）に格納されたマスク用ビット列との間で、論理積が算出される。このマスク用ビット列は、指数部Ｅに対応するビットのうち最上位ビット（ＭＳＢ：Most Significant Bit）以外のビットが１に設定され、それ以外のビットが０に設定されたビット列である。これにより、指数部Ｅが０，Ｅ１，Ｅ２，…，Ｅ１０、仮数部Ｆが全ビット０のビット列が生成される。ＡＮＤ演算２２４では、シフト演算２２２の結果とレジスタＲ（ｍ２）に格納された他のマスク用ビット列との間で、論理積が算出される。当該他のマスク用ビット列は、レジスタＲ（ｍ１）のマスク用ビット列をビット反転したものである。これにより、指数部ＥがＥ１，０，０，…，０、その他のビットが元の浮動小数点データと同じビット列が生成される。
【００７９】
ＯＲ演算２２５では、ＡＮＤ演算２２３の結果とＡＮＤ演算２２４の結果の間で論理和が算出される。これにより、指数部ＥがＥ１，Ｅ１，Ｅ２，…，Ｅ１０、その他のビットが元の浮動小数点データと同じビット列が生成される。このビット列は、浮動小数点データのうち指数部Ｅのみ、右方向に１ビットだけ算術シフトしたものに相当する。ＯＲ演算２２６では、ＯＲ演算２２５の結果とレジスタＲ（ｒｓ３）に格納されたビット列との間で論理和が算出される。ただし、レジスタＲ（ｒｓ３）には、全ビット０のビット列が格納される。そのため、ＯＲ演算２２６では、ＯＲ演算２２５の結果が変更されない。
【００８０】
このように、ＳＬ複合命令を用いることで、１つの命令で、浮動小数点データのうち指数部Ｅのみをシフトしたビット列を生成することができる。比較演算２２７では、ＯＲ演算２２６の結果とレジスタＲ（ｒｓ１）に格納された元の浮動小数点データとが比較される。両者が一致する場合は「１」が出力され、一致しない場合は「０」が出力される。
【００８１】
ＯＲ演算２２６の結果と元の浮動小数点データとが一致する条件は、指数部Ｅに含まれる各ビットの値が一致すること、すなわち、Ｅ１＝Ｅ１，Ｅ１＝Ｅ２，Ｅ２＝Ｅ３，…，Ｅ１０＝Ｅ１１が成立することである。これは、Ｅ１＝Ｅ２＝Ｅ３＝…＝Ｅ１０＝Ｅ１１と言い換えることができる。よって、比較演算２２７は、指数部Ｅの全ビットの値が同一であるか、すなわち、全ビット０または全ビット１であるか判定していることになる。
【００８２】
図１０は、部分ビット列一致判定の第４の演算例を示す図である。
ＳＬ複合命令を用いて、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか判定する場合、例えば、１つのＳＬ複合命令と１つの比較命令が発行される。これにより、図９の場合と同様に、シフト演算２２１，２２２、ＡＮＤ演算２２３，２２４、ＯＲ演算２２５，２２６および比較演算２２７が実行される。ただし、ＡＮＤ演算２２４に入力されるレジスタＲ（ｍ２）のビット列と、ＯＲ演算２２６に入力されるレジスタＲ（ｒｓ３）のビット列とが、図９の場合と異なる。
【００８３】
レジスタＲ（ｍ２）には、マスク用ビット列が格納されている。このマスク用ビット列は、符号部Ｓに対応するビットと指数部Ｅに対応するビットのＭＳＢが１に設定され、それ以外のビットが０に設定されたビット列である。仮数部Ｆの判定条件が全ビット０であるため、このマスク用ビット列の仮数部Ｆに対応するビットが全ビット０に設定されている。仮数部Ｆの一部のビットが０であるという条件（ＯＦＦ制約）が与えられている場合、仮数部Ｆに対応するビットのうちＯＦＦ制約のあるビットを０に設定し、仮数部Ｆに対応するビットのうち他のビットを１に設定すればよい。
【００８４】
レジスタＲ（ｒｓ３）に格納されたビット列は、全ビット０のビット列である。仮数部Ｆの判定条件が全ビット０であるため、このビット列の仮数部Ｆに対応するビットが全ビット０に設定されている。仮数部Ｆの一部のビットが１であるという条件（ＯＮ制約）が与えられている場合、仮数部Ｆに対応するビットのうちＯＮ制約のあるビットを１に設定し、仮数部Ｆに対応するビットのうち他のビットを０に設定すればよい。
【００８５】
これにより、ＯＲ演算２２６の結果に含まれる仮数部Ｆにおいて、ＯＦＦ制約があるビットが０に設定され、ＯＮ制約があるビットが１に設定され、ＯＦＦ制約もＯＮ制約もないビットは元の浮動小数点データと同じ値が設定される。図１０の例では、仮数部Ｆの全ビットにＯＦＦ制約が与えられているため、ＯＲ演算２２６が出力するビット列の仮数部Ｆは全ビット０になっている。このようなビット列と元の浮動小数点データとを比較することで、仮数部Ｆに対するＯＦＦ制約やＯＮ制約を考慮できる。
【００８６】
以上説明したように、ＳＬ複合命令を用いない場合は４つの演算によって上記の判定処理を実現でき、ＳＬ複合命令を用いた場合は７つの演算によって同じ判定処理を実現できる。ただし、後者の場合、２つのシフト演算と２つのＡＮＤ演算と２つのＯＲ演算は、１つのＳＬ複合命令を受けてプロセッサ２００の内部で連続的に実行されるものである。命令数の観点からは、ＳＬ複合命令を用いない場合は４つの命令が発行され、ＳＬ複合命令を用いた場合は２つの命令が発行される。よって、多くの場合、ＳＬ複合命令を用いた方が上記の判定処理を高速に実行することができる。
【００８７】
そこで、コンパイル装置１００は、中間コードに対する最適化処理の中で、ＳＬ複合命令を使用しない判定処理をＳＬ複合命令を使用するように最適化する。以下では、図８に示した演算を図１０に示した演算に変換する場合を想定して、最適化について説明する。すなわち、判定処理として、指数部Ｅが全ビット０または全ビット１であり、かつ、仮数部Ｆが全ビット０であるか判定するものを想定する。
【００８８】
図１１は、ＳＬ複合命令を用いた最適化の例を示す図である。
中間コード１１５は、ソースコードに基づいて入力部１３０の中間コード生成部１３４が生成したものである。中間コード１１５は、命令＃１〜＃７の７つの命令を含む。
【００８９】
命令＃１は、定数０ｘ７ＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦをレジスタＲ１に格納する命令である。レジスタＲ１は、図８のレジスタＲ（ｒｓ２）に相当する。命令＃２は、定数０ｘ００００００００００００００００をレジスタＲ２に格納する命令である。レジスタＲ２は、図８のレジスタＲ（ｍ１）に相当する。命令＃３は、定数０ｘ７ＦＦ０００００００００００００をレジスタＲ３に格納する命令である。レジスタＲ３は、図８のレジスタＲ（ｍ２）に相当する。なお、浮動小数点データは、レジスタＲ０に格納されるものとする。レジスタＲ０は、図８のレジスタＲ（ｒｓ１）に相当する。
【００９０】
命令＃４は、レジスタＲ０，Ｒ１を参照オペランドとし、レジスタＲ４を定義オペランドとするＡＮＤ命令である。レジスタＲ４には、浮動小数点データとレジスタＲ１の定数との間の論理積が格納される。命令＃４は、図８のＡＮＤ演算２１１に対応する。命令＃５は、レジスタＲ４，Ｒ２を参照オペランドとし、レジスタＲ５を定義オペランドとする比較命令である。レジスタＲ５には、命令＃４の演算結果とレジスタＲ２の定数との間の比較結果が格納される。命令＃５は、図８の比較演算２１２に対応する。
【００９１】
命令＃６は、レジスタＲ４，Ｒ３を参照オペランドとし、レジスタＲ６を定義オペランドとする比較命令である。レジスタＲ６には、命令＃４の演算結果とレジスタＲ３の定数との間の比較結果が格納される。命令＃６は、図８の比較演算２１３に対応する。命令＃７は、レジスタＲ５，Ｒ６を参照オペランドとし、レジスタＲ７を定義オペランドとするＯＲ命令である。レジスタＲ７には、命令＃５の比較結果と命令＃６の比較結果の論理和が格納される。命令＃７は、図８のＯＲ演算２１４に対応する。
【００９２】
なお、中間コード１１５において、１つのレジスタ（定義オペランド）は１つの命令によって定義され、１または２以上の命令によって参照されるものとする。
中間コード１１６は、最適化部１４０の最適化実行部１４３が中間コード１１５から変換したものである。中間コード１１６は、命令＃１１〜＃１６の６つの命令を含む。
【００９３】
命令＃１１は、定数０ｘ００００００００００００００００をレジスタＲ８に格納する命令である。レジスタＲ８は、図１０のレジスタＲ（ｒｓ３）に相当する。命令＃１２は、定数０ｘ０００００００１００００００００をレジスタＲ９に格納する命令である。レジスタＲ９の定数は、図５のパラメータフォーマット４２の形式をもつ。命令＃１３は、定数０ｘ３ＦＦ０００００００００００００をレジスタＲ１０に格納する命令である。レジスタＲ１０は、図１０のレジスタＲ（ｍ１）に相当する。命令＃１４は、定数０ｘＣ０００００００００００００００をレジスタＲ１１に格納する命令である。レジスタＲ１１は、図１０のレジスタＲ（ｍ２）に相当する。
【００９４】
命令＃１５は、レジスタＲ０，Ｒ８，Ｒ９，Ｒ１０，Ｒ１１を参照オペランドとし、レジスタＲ１２を定義オペランドとするＳＬ複合命令（ＳＬ＿ＣＯＭＰＯＵＮＤ）である。レジスタＲ１２は、図１０のレジスタＲ（ｒｄ）に相当する。レジスタＲ１２には、浮動小数点データのうち指数部Ｅのみが右方向に１ビットだけ算術シフトされ、仮数部Ｆがオール０に置換されたビット列が格納される。命令＃１６は、レジスタＲ０，Ｒ１２を参照オペランドとし、レジスタＲ７を定義オペランドとする比較命令である。命令＃１６は、図１０の比較演算２２７に対応する。レジスタＲ７には、命令＃１５の演算結果と元の浮動小数点データとの間の比較結果が格納される。
【００９５】
次に、コンパイル装置１００によるコンパイル処理について説明する。
図１２は、コンパイルの手順例を示すフローチャートである。
（Ｓ１）ソースコード入力部１３１は、ユーザからコンパイルコマンドが入力されると、コンパイルコマンドで指定されたソースファイル１１１からソースコードを読み出す。字句解析部１３２は、ソースコードに対して字句解析を行い、トークンの列に分割する。
【００９６】
（Ｓ２）意味解析部１３３は、字句解析によって得られたトークンの列に対して構文解析および意味解析を行い、構文木を生成する。中間コード生成部１３４は、構文木に基づいて、ソースコードに対応する中間コードを生成し、中間ファイル１１２に書き出す。
【００９７】
（Ｓ３）中間コード入力部１４１は、中間ファイル１１２から中間コードを読み出す。解析部１４２は、中間コードの中から最適化可能なコードを検出する。最適化可能なコードには、データの中の一部のビット列がオール０またはオール１であるか否か判定する処理（部分ビット列一致判定）を実装したコードが含まれる。部分ビット列一致判定には、データの中の他のビットに対してＯＦＦ制約またはＯＮ制約が与えられている場合も含まれる。部分ビット列一致判定のコードを検出する方法の詳細は後述する。
【００９８】
（Ｓ４）解析部１４２は、検出した最適化可能なコードに対して、最適化方法を選択する。部分ビット列一致判定のコードに対しては、ＳＬ複合命令を利用した最適化が選択される。最適化実行部１４３は、解析部１４２が選択した方法で中間コードを最適化する（中間コードを更新する）。ＳＬ複合命令を用いた最適化の詳細は後述する。
【００９９】
（Ｓ５）中間コード出力部１４４は、最適化実行部１４３で最適化された中間コードを、中間ファイル１１２に書き込む（上書きする）。
ここで、ステップＳ３，Ｓ４で使用される一時データについて説明する。
【０１００】
図１３は、命令データと依存性データの構造例を示す図である。
中間コードを解析するとき、解析部１４２は、中間コードに含まれる命令毎に命令データを生成する。また、解析部１４２は、命令間の依存関係毎に依存性データを生成する。生成された命令データおよび依存性データは、ＲＡＭ１０２に記憶される。
【０１０１】
命令データ１６１は、命令番号、命令コード、定義オペランド、参照オペランド、直前命令および直後命令の項目を有する。命令番号は、中間コードの中で命令を識別する識別情報であり、例えば、行番号を用いることができる。命令コードは、代入命令（ＳＥＴ命令）、ＡＮＤ命令、ＯＲ命令、比較命令などの命令の種類を示す。定義オペランドは、命令の結果が書き込まれるレジスタを示す。１つの命令につき、１つの定義オペランドが指定される。参照オペランドは、命令で参照されるデータを格納したレジスタまたは命令で参照される定数を示す。１つの命令につき、１または２以上の参照オペランドが指定される。直前命令は、中間コードにおいて当該命令の１つ前に記載された命令を示す。直後命令は、中間コードにおいて当該命令の１つ後に記載された命令を示す。
【０１０２】
なお、図１３に示した命令データ１６１は、図１１の命令＃１に対応する。命令＃１について、命令番号＝１、命令コード＝ＳＥＴ、定義オペランド＝Ｒ１、参照オペランド＝Ｃ（０ｘ７ＦＦＦＦＦＦＦＦＦＦＦＦＦＦＦ）、直前命令＝０、直後命令＝２である。
【０１０３】
依存性データ１６２は、エッジ番号、定義オペランド、定義命令および参照命令の項目を有する。エッジ番号は、一の命令によってデータが書き込まれたレジスタ（定義オペランド）を他の命令が参照するという、定義参照関係を識別する識別情報である。定義オペランドは、一の命令によってデータが書き込まれ他の命令によって参照されるレジスタを示す。定義命令は、レジスタにデータを書き込む命令、すなわち、当該レジスタを定義オペランドとしてもつ命令を示す。参照命令は、レジスタを参照する命令、すなわち、当該レジスタを参照オペランドとしてもつ命令を示す。
【０１０４】
なお、図１３に示した依存性データ１６２は、図１１の命令＃１と命令＃４の間の依存関係に対応する。命令＃１と命令＃４の間の依存関係について、エッジ番号＝１、定義オペランド＝Ｒ１、定義命令＝１、参照命令＝４である。
【０１０５】
図１４は、対象処理データの構造例を示す図である。
解析部１４２は、中間コードから部分ビット列一致判定のコードを検出する毎に、対象処理データを生成する。生成された対象処理データは、ＲＡＭ１０２に記憶される。
【０１０６】
対象処理データ１６３は、処理ＩＤ、置換対象命令、定義オペランド、参照オペランド、判定ビット、ＯＦＦ制約ビット、ＯＮ制約ビットおよび無視ビットの項目を有する。処理ＩＤは、検出された部分ビット列一致判定のコードを識別する識別情報である。置換対象命令は、部分ビット列一致判定のコードに含まれる末尾の命令を示す。
【０１０７】
定義オペランドは、部分ビット列一致判定の結果を格納するレジスタを示す。参照オペランドは、部分ビット列一致判定の対象となる入力データ（例えば、浮動小数点データ）を格納するレジスタを示す。判定ビットは、オール０またはオール１であるか否か判定するビット列の範囲を示す。ＯＦＦ制約ビットは、値が０であるか否か判定するビットを示す。ＯＮ制約ビットは、値が１であるか否か判定するビットを示す。無視ビットは、判定ビット、ＯＦＦ制約ビットおよびＯＮ制約ビット以外のビットを示す。
【０１０８】
なお、図１４に示した対象処理データ１６３は、図８の演算および図１１の中間コード１１５に対応する。中間コード１１５について、処理ＩＤ＝１、置換対象命令＝７、定義オペランド＝Ｒ７、参照オペランド＝Ｒ０である。また、指数部Ｅがオール０またはオール１の判定対象であるため、判定ビット＝０ｘ７ＦＦ０００００００００００００である。仮数部Ｆ全体に対してＯＦＦ制約が与えられているため、ＯＦＦ制約ビット＝０ｘ０００ＦＦＦＦＦＦＦＦＦＦＦＦＦである。ＯＮ制約は存在しないため、ＯＮ制約ビット＝０ｘ００００００００００００００００である。符号部Ｓについては条件が与えられていないため、無視ビット＝０ｘ８０００００００００００００００である。
【０１０９】
次に、上記のステップＳ３，Ｓ４の詳細を説明する。
図１５は、最適化対象検出の手順例を示すフローチャートである。
この最適化対象検出は、上記のステップＳ３で実行される。
【０１１０】
（Ｓ１０）解析部１４２は、命令データの集合の中に残りの命令があるか判断する。残りの命令がある場合はステップＳ１１に処理が進み、ない場合は処理が終了する。
（Ｓ１１）解析部１４２は、命令データの集合の中から命令を１つ選択する（ｉｎｓｔｒ）。通常は、命令番号の小さい順に命令を選択していく。
【０１１１】
（Ｓ１２）解析部１４２は、ステップＳ１１で選択した命令ｉｎｓｔｒの命令コードがＯＲ（論理和）であるか判断する。命令コードがＯＲである場合はステップＳ１３に処理が進み、ＯＲでない場合はステップＳ１０に処理が進む。
【０１１２】
（Ｓ１３）解析部１４２は、命令ｉｎｓｔｒの２つの参照オペランドを特定する。解析部１４２は、依存性データの集合から、第１参照オペランドを定義している定義命令（ｃｍｐ＿ｉｎｓｔｒ［１］）を検索する。同様に、解析部１４２は、第２参照オペランドを定義している定義命令（ｃｍｐ＿ｉｎｓｔｒ［２］）を検索する。
【０１１３】
（Ｓ１４）解析部１４２は、命令ｃｍｐ＿ｉｎｓｔｒ［１］と命令ｃｍｐ＿ｉｎｓｔｒ［２］の両方の命令コードがＥＱ（比較）であるか判断する。命令コードがＥＱである場合はステップＳ１５に処理が進み、ＥＱでない場合はステップＳ１０に処理が進む。
【０１１４】
（Ｓ１５）解析部１４２は、命令ｃｍｐ＿ｉｎｓｔｒ［１］の２つの参照オペランドを特定する。解析部１４２は、依存性データの集合から、第１参照オペランドを定義している定義命令（ａｎｄ＿ｉｎｓｔｒ［１］）を検索する。同様に、解析部１４２は、第２参照オペランドを定義している定義命令（ｓｅｔ＿ｉｎｓｔｒ［１］）を検索する。
【０１１５】
（Ｓ１６）解析部１４２は、命令ｃｍｐ＿ｉｎｓｔｒ［２］の２つの参照オペランドを特定する。解析部１４２は、依存性データの集合から、第１参照オペランドを定義している定義命令（ａｎｄ＿ｉｎｓｔｒ［２］）を検索する。同様に、解析部１４２は、第２参照オペランドを定義している定義命令（ｓｅｔ＿ｉｎｓｔｒ［２］）を検索する。
【０１１６】
（Ｓ１７）解析部１４２は、ステップＳ１５で検索した命令ａｎｄ＿ｉｎｓｔｒ［１］とステップＳ１６で検索した命令ａｎｄ＿ｉｎｓｔｒ［２］が同じ命令か判断する。同じ場合はステップＳ１８に処理が進み、異なる場合はステップＳ１０に処理が進む。
【０１１７】
（Ｓ１８）解析部１４２は、命令ａｎｄ＿ｉｎｓｔｒ［１］の命令コードがＡＮＤ（論理積）であり、かつ、命令ｓｅｔ＿ｉｎｓｔｒ［１］と命令ｓｅｔ＿ｉｎｓｔｒ［２］の両方の命令コードがＳＥＴ（代入）であるか判断する。条件を満たす場合はステップＳ１９に処理が進み、条件を満たさない場合はステップＳ１０に処理が進む。
【０１１８】
（Ｓ１９）解析部１４２は、命令ａｎｄ＿ｉｎｓｔｒ［１］の第２参照オペランドを特定する。解析部１４２は、依存性データの集合から、第２参照オペランドを定義している定義命令（ｓｅｔ＿ｉｎｓｔｒ［０］）を検索する。
【０１１９】
（Ｓ２０）解析部１４２は、ステップＳ１９で検索した命令ｓｅｔ＿ｉｎｓｔｒ［０］の命令コードがＳＥＴ（代入）であるか判断する。命令コードがＳＥＴである場合はステップＳ２１に処理が進み、ＳＥＴでない場合はステップＳ１０に処理が進む。
【０１２０】
図１６は、最適化対象検出の手順例を示すフローチャート（続き）である。
（Ｓ２１）解析部１４２は、対象処理データ１６３を生成する。解析部１４２は、対象処理データ１６３の置換対象命令を命令ｉｎｓｔｒに設定する。また、解析部１４２は、対象処理データ１６３の定義オペランドを命令ｉｎｓｔｒの定義オペランドに設定し、参照オペランドを命令ａｎｄ＿ｉｎｓｔｒ［１］の第１参照オペランドに設定する。
【０１２１】
（Ｓ２２）解析部１４２は、変数ｍａｓｋ＿ｂｉｔ，ｃｍｐ＿ｂｉｔ［１］，ｃｍｐ＿ｂｉｔ［２］を定義する。解析部１４２は、変数ｍａｓｋ＿ｂｉｔに命令ｓｅｔ＿ｉｎｓｔｒ［０］の参照オペランド（定数）を設定する。解析部１４２は、変数ｃｍｐ＿ｂｉｔ［１］に命令ｓｅｔ＿ｉｎｓｔｒ［１］の参照オペランド（定数）を設定し、変数ｃｍｐ＿ｂｉｔ［２］に命令ｓｅｔ＿ｉｎｓｔｒ［２］の参照オペランド（定数）を設定する。
【０１２２】
（Ｓ２３）解析部１４２は、対象処理データ１６３の判定ビットを、ＡＮＤ（ＸＯＲ（ｃｍｐ＿ｂｉｔ［１］，ｃｍｐ＿ｂｉｔ［２］），ｍａｓｋ＿ｂｉｔ）と算出する。解析部１４２は、対象処理データ１６３のＯＦＦ制約ビットを、ＡＮＤ（ＮＯＲ（ｃｍｐ＿ｂｉｔ［１］，ｃｍｐ＿ｂｉｔ［２］），ｍａｓｋ＿ｂｉｔ）と算出する。解析部１４２は、対象処理データ１６３のＯＮ制約ビットを、ＡＮＤ（ＡＮＤ（ｃｍｐ＿ｂｉｔ［１］，ｃｍｐ＿ｂｉｔ［２］），ｍａｓｋ＿ｂｉｔ）と算出する。解析部１４２は、対象処理データ１６３の無視ビットを、ＮＯＴ（ｍａｓｋ＿ｂｉｔ）と算出する。
【０１２３】
（Ｓ２４）解析部１４２は、ステップＳ２３で算出した判定ビットがオール０（０の列）であるか判断する。判定ビットがオール０の場合、部分ビット列一致判定が実質的に行われないため、対象処理データ１６３が破棄されてステップＳ１０に処理が進む。判定ビットがオール０でない場合、ステップＳ２５に処理が進む。
【０１２４】
（Ｓ２５）解析部１４２は、ステップＳ２３で算出した判定ビットに含まれる「１」は連続しているか判断する。判定ビットの「１」が連続している場合、ステップＳ２６に処理が進む。判定ビットの「１」が不連続である場合、最適化の対象にならないため、対象処理データ１６３が破棄されてステップＳ１０に処理が進む。
【０１２５】
（Ｓ２６）解析部１４２は、ＡＮＤ（ｃｍｐ＿ｂｉｔ［１］，判定ビット）＝０またはＡＮＤ（ｃｍｐ＿ｂｉｔ［１］，判定ビット）＝判定ビットか判断する。条件を満たす場合はステップＳ２７に処理が進み、満たさない場合はステップＳ１０に処理が進む。
【０１２６】
（Ｓ２７）解析部１４２は、ステップＳ１０〜Ｓ２０で検出した命令を最適化対象として採用し、対象処理データ１６３を保存する。そして、ステップＳ１０に処理が進む。
図１７は、最適化実行の手順例を示すフローチャートである。
【０１２７】
この最適化実行は、上記のステップＳ４で実行される。
（Ｓ３０）解析部１４２は、図１５，１６の最適化対象検出で生成された対象処理データのうち、未選択の対象処理データがあるか判断する。未選択のものがある場合はステップＳ３１に処理が進み、全て選択された場合はステップＳ４１に処理が進む。
【０１２８】
（Ｓ３１）解析部１４２は、対象処理データを１つ選択する。
（Ｓ３２）解析部１４２は、変数Ｄ＿ｒｓ３，Ｄ＿ｓｈｉｆｔ＿ｃｔｒｌ，Ｄ＿ｍ１を定義する。解析部１４２は、ステップＳ３１で選択した対象処理データに記載されたＯＮ制約ビットを、変数Ｄ＿ｒｓ３に代入する。解析部１４２は、定数０ｘ０００００００１００００００００を変数Ｄ＿ｓｈｉｆｔ＿ｃｔｒｌに代入する。解析部１４２は、対象処理データに記載された判定ビットを変数Ｄ＿ｍ１に代入する。
【０１２９】
（Ｓ３３）解析部１４２は、変数Ｄ＿ｍ１の最上位の「１」を「０」に反転する。
（Ｓ３４）解析部１４２は、変数Ｄ＿ｍ２を定義する。また、解析部１４２は、対象処理データからＯＦＦ制約ビットを抽出する。そして、解析部１４２は、変数Ｄ＿ｍ２に、ＡＮＤ（ＮＯＴ（Ｄ＿ｍ１），ＮＯＴ（ＯＦＦ制約ビット））を代入する。
【０１３０】
（Ｓ３５）解析部１４２は、変数ｒｅｆ，ｄｅｆを定義する。解析部１４２は、変数ｒｅｆに、処理対象データに記載された参照オペランドを代入し、変数ｄｅｆに、処理対象データに記載された定義オペランドを代入する。
【０１３１】
（Ｓ３６）解析部１４２は、レジスタＲ（ｒｓ３）にＤ＿ｒｓ３の値を代入するＳＥＴ命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［１］）。解析部１４２は、レジスタＲ（ｓｈｉｆｔ＿ｃｔｒｌ）にＤ＿ｓｈｉｆｔ＿ｃｔｒｌの値を代入するＳＥＴ命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［２］）。解析部１４２は、レジスタＲ（ｍ１）にＤ＿ｍ１の値を代入するＳＥＴ命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［３］）。解析部１４２は、レジスタＲ（ｍ２）にＤ＿ｍ２の値を代入するＳＥＴ命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［４］）。なお、解析部１４２は、レジスタＲ（ｒｓ３），Ｒ（ｓｈｉｆｔ＿ｃｔｒｌ），Ｒ（ｍ１），Ｒ（ｍ２）として、空いているレジスタを任意に選択してよい。
【０１３２】
（Ｓ３７）解析部１４２は、レジスタＲ（ｒｅｆ），Ｒ（ｒｓ３），Ｒ（ｓｈｉｆｔ＿ｃｔｒｌ），Ｒ（ｍ１），Ｒ（ｍ２）を参照オペランドとし、レジスタＲ（ｒｄ）を定義オペランドとするＳＬ複合命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［５］）。なお、解析部１４２は、レジスタＲ（ｒｄ）として、空いているレジスタを任意に選択してよい。
【０１３３】
（Ｓ３８）解析部１４２は、レジスタＲ（ｒｅｆ），Ｒ（ｒｄ）を参照オペランドとし、レジスタＲ（ｄｅｆ）を定義オペランドとする比較命令を生成する（ｎｅｗ＿ｉｎｓｔｒ［６］）。入力データ（例えば、浮動小数点データ）が格納されるレジスタと、最終的な判定結果が格納されるレジスタは、最適化の前後で同じである。
【０１３４】
（Ｓ３９）解析部１４２は、命令ｎｅｗ＿ｉｎｓｔｒ［１］，ｎｅｗ＿ｉｎｓｔｒ［２］，ｎｅｗ＿ｉｎｓｔｒ［３］，ｎｅｗ＿ｉｎｓｔｒ［４］，ｎｅｗ＿ｉｎｓｔｒ［５］，ｎｅｗ＿ｉｎｓｔｒ［６］が全て空（ＮＵＬＬ）でないか判断する。条件を満たす場合、ステップＳ４０に処理が進む。条件を満たさない場合、ステップＳ３６〜Ｓ３８で生成された命令が破棄され、ステップＳ３０に処理が進む。
【０１３５】
（Ｓ４０）最適化実行部１４３は、命令ｎｅｗ＿ｉｎｓｔｒ［１］，ｎｅｗ＿ｉｎｓｔｒ［２］，ｎｅｗ＿ｉｎｓｔｒ［３］，ｎｅｗ＿ｉｎｓｔｒ［４］，ｎｅｗ＿ｉｎｓｔｒ［５］，ｎｅｗ＿ｉｎｓｔｒ［６］を、中間コードに対して上記の順に挿入する。挿入位置は、ステップＳ３１で選択された処理対象データに記載された置換対象命令の次である。そして、ステップＳ３０に処理が進む。
【０１３６】
図１８は、最適化実行の手順例を示すフローチャート（続き）である。
（Ｓ４１）最適化実行部１４３は、最適化に伴って不要となった命令を中間コードから削除する。不要となった命令には、前述のステップＳ１０〜Ｓ２０で検出された最適化前の命令が含まれる。この処理は、Dead Code Eliminationと呼ぶことがある。
【０１３７】
（Ｓ４２）最適化実行部１４３は、上記のステップＳ３６〜３８で生成した命令がループ内部に存在するか判断する。ループ内部に存在する場合、最適化実行部１４３は、ＳＥＴ命令である命令ｎｅｗ＿ｉｎｓｔｒ［１］，ｎｅｗ＿ｉｎｓｔｒ［２］，ｎｅｗ＿ｉｎｓｔｒ［３］，ｎｅｗ＿ｉｎｓｔｒ［４］を、ループの前に移動する。これにより、レジスタＲ（ｒｓ３），Ｒ（ｓｈｉｆｔ＿ｃｔｒｌ），Ｒ（ｍ１），Ｒ（ｍ２）への定数の代入を繰り返さなくて済む。この処理は、Invariant Code Motionと呼ぶことがある。
【０１３８】
第２の実施の形態のコンパイル装置１００によれば、最適化前の中間コードから、入力データの中の一部のビット列（例えば、浮動小数点データの指数部Ｅ）がオール０またはオール１であるか判定するコードが検出される。そして、検出されたコードが、ＳＬ複合命令を用いたコードに最適化される。ＳＬ複合命令を用いることで、入力データの中の一部のビット列のみシフトしたデータを１命令で生成することができる。これにより、プログラム中の命令数を削減することができ、プロセッサ２００による処理を高速化できる。また、クリティカルパス上に並ぶ命令（依存関係があり直列的に実行することを要する命令）が少なくなるため、自動並列化が容易となる。
【０１３９】
更に、ＳＬ複合命令に与える参照オペランドの値を適切に設定することで、オール０またはオール１の判定に加えて、他の特定のビットが０であるか否かの判定や、他の特定のビットが１であるか否かの判定を併せて行うことができる。このとき、命令数は増加しない。よって、特に、浮動小数点データのチェックを効率的に行うことができる。
【０１４０】
なお、第２の実施の形態では、コンパイラ１２１の中でＳＬ複合命令を利用したコードへの変換を実現したが、他の装置または他のソフトウェアの中で当該変換を行ってもよい。例えば、アセンブリコードをオブジェクトコードに変換するアセンブラや、オブジェクトコードを解析して最適化するバイナリオプティマイザの中で当該変換を行ってもよい。
【０１４１】
前述のように、第１の実施の形態の情報処理は、コード変換装置１０にプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、コンパイル装置１００にプログラムを実行させることで実現できる。
【０１４２】
プログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体３３）に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からＨＤＤなどの他の記録媒体（例えば、ＨＤＤ１０３）にプログラムをコピーして実行してもよい。
【０１４３】
上記については単に本発明の原理を示すものである。更に、多数の変形や変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応する全ての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。
【符号の説明】
【０１４４】
１０  コード変換装置
１１  記憶部
１２  変換部
１３  第１のコード
１３ａ，１４ａ  判定コード
１４  第２のコード
Ｍ１，Ｍ２，Ｍ３，Ｍ４  命令
ＭＣ  複合命令
【図１】
2016056081.tif 000003
【図２】
2016056081.tif 000004
【図３】
2016056081.tif 000005
【図４】
2016056081.tif 000006
【図５】
2016056081.tif 000007
【図６】
2016056081.tif 000008
【図７】
2016056081.tif 000009
【図８】
2016056081.tif 000010
【図９】
2016056081.tif 000011
【図１０】
2016056081.tif 000012
【図１１】
2016056081.tif 000013
【図１２】
2016056081.tif 000014
【図１３】
2016056081.tif 000015
【図１４】
2016056081.tif 000016
【図１５】
2016056081.tif 000017
【図１６】
2016056081.tif 000018
【図１７】
2016056081.tif 000019
【図１８】
2016056081.tif 000020
【国際調査報告】
2016056081.tif 000021
2016056081.tif 000022
2016056081.tif 000023
2016056081.tif 000024