(57)【要約】【課題】  異なる複数の種類の命令を含むプログラムの実行効率を向上する。【解決手段】  コード生成装置は、コンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令を、その演算命令の種類と、演算命令の間の依存関係とに基づいて、融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定するコード解析部と、コード解析部により、並列実行命令に変換可能であると判定された演算命令を融合演算命令に変換してから、その融合演算命令のオペランドが、並列実行命令として実行可能な形式に配置されたデータを生成することで、融合演算命令を並列に実行する並列実行命令を生成する命令生成部とを備える。【選択図】  図１３
2018163381.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令のうち、命令の種類が異なる前記演算命令の間の依存関係に基づいて、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定するコード解析手段と、
前記コード解析手段により、前記並列実行命令に変換可能であると判定された前記演算命令を前記融合演算命令に変換してから、その融合演算命令のオペランドが、前記並列実行命令として実行可能な形式に配置されたデータを生成することで、前記融合演算命令を並列に実行する前記並列実行命令を生成する命令生成手段と、を備える
コード生成装置。
【請求項２】
前記コード解析手段は、前記解析対象コードに含まれる前記演算命令の内、演算の種類が異なる前記演算命令である加算命令と乗算命令との間に依存関係があるか否か、及び、減算命令と乗算命令との間に依存関係があるか否か、を判定し、
前記命令生成手段は、前記コード解析手段により依存関係がないと判定された、種類が異なる前記演算命令を、前記融合演算命令に変換する
請求項１に記載のコード生成装置。
【請求項３】
前記命令生成手段は、前記コード解析手段により依存関係がないと判定された種類が異なる前記演算命令の全てを前記融合演算命令に変換し、変換された前記融合演算命令を組合せることで、前記融合演算命令を並列に実行する前記並列実行命令を生成する
請求項２に記載のコード生成装置。
【請求項４】
前記融合演算命令は、１つの命令で積和演算を実行するＦＭＡ（Ｆｕｓｅｄ  Ｍｕｌｔｉｐｌｙ  ａｎｄ  ａｄｄ）演算命令であり、
前記並列実行命令は、ＦＭＡ演算命令を複数のデータに対して並列に実行可能なＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）−ＦＭＡ命令であり、
前記命令生成手段は、前記コード解析手段における判定の結果に応じて、依存関係がないと判定された前記演算命令をＦＭＡ演算命令に変換し、変換されたそのＦＭＡ演算命令を組合せることで、前記ＳＩＭＤ−ＦＭＡ命令を生成する
請求項２又は３に記載のコード生成装置。
【請求項５】
前記命令生成手段は、
前記演算命令が加算命令である場合、当該加算命令の一方のオペランドに、加算の結果に影響しない値を有する第１のダミーオペランドを即値として乗算する命令を追加することで、当該加算命令をＦＭＡ演算命令に変換し、
前記演算命令が減算命令である場合、当該減算命令の一方のオペランドに減算の結果に影響しない値を有する第２のダミーオペランドを即値として乗算する命令を追加するとともに、当該減算命令の他方のオペランドの符号を反転することで、当該減算命令をＦＭＡ演算命令に変換し、
前記演算命令が乗算命令である場合、乗算の結果に影響しない値を有する第３のダミーオペランドを即値として加算する命令を追加することで、当該減算命令をＦＭＡ演算命令に変換する、
請求項４に記載のコード生成装置。
【請求項６】
前記ＳＩＭＤ−ＦＭＡ命令が、２つのＦＭＡ演算命令を並列に実行可能である場合、
前記命令生成手段は、
前記ＳＩＭＤ−ＦＭＡ命令に関するオペランドを記憶するレジスタを２つに分割した領域の内、一方の領域には、ＦＭＡ演算命令に変換される前の前記演算命令のうち、加算命令又は減算命令に関するオペランドを配置し、
他方の領域には、ＦＭＡ演算命令に変換される前の前記演算命令のうち、乗算命令に関するオペランドを配置するよう、前記ＳＩＭＤ−ＦＭＡ命令のオペランドを表すデータを生成する
請求項５に記載のコード生成装置。
【請求項７】
コンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令のうち、命令の種類が異なる前記演算命令の間の依存関係に基づいて、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定し、
前記並列実行命令に変換可能であると判定された前記演算命令を前記融合演算命令に変換してから、その融合演算命令のオペランドが、前記並列実行命令として実行可能な形式に配置されたデータを生成することで、前記融合演算命令を並列に実行する前記並列実行命令を生成する 
コード生成方法。
【請求項８】
１以上の前記演算命令の内、種類が異なる前記演算命令の間に依存関係があるか否かを判定し、依存関係がないと判定された種類が異なる前記演算命令を、前記融合演算命令に変換する、ことを更に含む
請求項７に記載のコード生成方法。
【請求項９】
コンピュータに、
コンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令のうち、命令の種類が異なる前記演算命令の間の依存関係に基づいて、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定する判定処理と、
前記並列実行命令に変換可能であると判定された前記演算命令を前記融合演算命令に変換してから、その融合演算命令のオペランドが、前記並列実行命令として実行可能な形式に配置されたデータを生成することで、前記融合演算命令を並列に実行する前記並列実行命令を生成する命令生成処理と、を実行させる
コード生成プログラム。
【請求項１０】
前記判定処理は、１以上の前記演算命令の内、種類が異なる前記演算命令の間に依存関係があるか否かを判定する処理を含み、
前記命令生成処理は、依存関係がないと判定された種類が異なる前記演算命令を、前記融合演算命令に変換する処理、更に含む
請求項９に記載のコード生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、プロセッサにおいて実行可能なコードを生成する技術に関する。
【背景技術】
【０００２】
近年の情報処理装置（コンピュータ等）においては、ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）命令を実行可能なプロセッサが用いられることがある。ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）命令は、複数のデータに対して、同じ演算処理を並列に実行可能な命令（並列実行命令）である。ＳＩＭＤ命令の使用は、少ない数の命令を用いて複数のデータに関する演算を実行することを可能とする。
【０００３】
ＳＩＭＤ演算命令を用いる技術として、以下の技術が知られている。
【０００４】
特許文献１には、高級言語を用いて記述されたソースコードを中間表現に変換する過程において、異なるデータに対して同じ演算を適用している箇所をみつけ、ＳＩＭＤ命令に置き換える技術が記載されている。
【０００５】
特許文献２には、ソースコードの依存関係を示す演算木を生成し、各演算木に含まれる演算命令を並べた演算列から共通するサブ演算列を抽出し、サブ演算列に含まれる命令を組合せてＳＩＭＤ命令を生成する技術が記載されている。
【０００６】
特許文献３には、ソースコードをコンパイルする際に命令間の依存関係を示すツリーを生成し、そのツリーの一部を、複合演算命令に置き換える技術が記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００３−２０２９９１号公報
【特許文献２】特開２０１３−２０６２８９号公報
【特許文献３】特開２０１５−１４３９３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
あるプログラムにおいて、同じ種類の複数の演算命令に依存関係（例えば、ある演算命令の結果を、他の演算命令が参照する関係、等）がなく、並列に実行可能な場合を想定する。この場合、これらの命令を組合せて、ＳＩＭＤ命令を生成することができる。例えば、上記特許文献１は、複数のデータに対して同じ演算命令が実行される場合、当該命令をＳＩＭＤ命令に置き換える。
【０００９】
一方、例えば、あるプログラムにおいて、同じ種類の演算命令の間に依存関係がある場合や、異なる演算命令（例えば、加減算と乗算）が連続して実行されるような場合、これらの演算命令は、必ずしも単純にＳＩＭＤ命令に置き換え可能とは限らない。
【００１０】
又、上記特許文献２、特許文献３に記載された方法は、プログラムの中に含まれる、ある特定の命令の組合せ（乗算命令とその乗算結果を参照する加算命令との組合せ）を積和命令（ＦＭＡ（Ｆｕｓｅｄ  Ｍｕｌｔｉｐｌｙ  ａｎｄ  ａｄｄ）命令）に置き換え可能な場合に限り、係るＦＭＡ命令をＳＩＭＤ命令として並列に実行可能である。即ち、これらの技術を採用した場合、ＳＩＭＤ命令に変換可能な命令が限定される。以上より、プログラムにおいて異なる命令を含む部分については、例えばＳＩＭＤ命令を用いた実行効率の向上が困難な場合がある、という問題があった。
【００１１】
本開示に係る技術は、上記のような状況を鑑みて着想されたものである。本開示に係る技術は、異なる複数の種類の命令を含むプログラムの実行効率を向上する技術を提供することを、主たる目的の１つとする。
【課題を解決するための手段】
【００１２】
本開示に係る技術の１つの態様であるコード生成装置は、コンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令のうち、命令の種類が異なる上記演算命令の間の依存関係に基づいて、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定するコード解析部と、上記コード解析部により、上記並列実行命令に変換可能であると判定された上記演算命令を上記融合演算命令に変換してから、その上記融合演算命令のオペランドが、上記並列実行命令として実行可能な形式に配置されたデータを生成することで、上記融合演算命令を並列に実行する上記並列実行命令を生成する命令生成部と、を備える。
【００１３】
本開示に係る技術の１つの態様であるコード生成方法は、複数の演算命令により構成されるコンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令を、上記演算命令の種類と、上記演算命令の間の依存関係とに基づいて、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な融合演算命令を並列に実行可能な並列実行命令に変換可能か否かを判定し、
上記並列実行命令に変換可能であると判定された上記演算命令を上記融合演算命令に変換してから、その上記融合演算命令のオペランドが、上記並列実行命令として実行可能な形式に配置されたデータを生成することで、上記融合演算命令を並列に実行する上記並列実行命令を生成することを含む。
【００１４】
また、上記目的は、上記構成を有するコード生成装置、及び、対応するコード生成方法をコンピュータによって実現するコンピュータ・プログラム、及び、そのコンピュータ・プログラムが格納されているコンピュータ読み取り可能な記憶媒体によっても達成される。
【発明の効果】
【００１５】
本開示に係る技術によれば、異なる複数の種類の命令を含むプログラムの実行効率を向上することが可能である。
【図面の簡単な説明】
【００１６】
【図１】図１は、ＳＩＭＤ命令による処理の一例を示す説明図である。
【図２】図２は、複数の命令を１つのＳＩＭＤ命令に変換する１つの具体例を示す説明図である。
【図３】図３は、異なる複数の命令の具体例を示す説明図である。
【図４】図４は、本開示の第１の実施形態に係るコード生成装置の機能的な構成を例示するブロック図である。
【図５Ａ】図５Ａは、コード生成装置の動作の具体例を示すフローチャート（１／２）である。
【図５Ｂ】図５Ｂは、コード生成装置の動作の具体例を示すフローチャート（２／２）である。
【図６】図６は、単純な算術演算を、ＦＭＡ演算に変換する方法を例示する説明図である。
【図７】図７は、解析対象コードに含まれる単純な算術演算の命令から、複数のＦＭＡ演算を並列に実行するＳＩＭＤ命令を生成する過程の概要を示す説明図である。
【図８】図８は、解析対象コードの具体例を示す説明図である。
【図９】図９は、図８に例示する解析対象コードの具体例に含まれる命令の依存関係を例示する説明図である。
【図１０】図１０は、図８に例示する解析対象コードに含まれる命令から変換されたＳＩＭＤ命令を例示する説明図である。
【図１１】図１１は、２つの方法を用いて、ある算術演算から変換されたＦＭＡ演算の具体例を示す説明図である。
【図１２】本開示の各実施形態において、解析対象コードから生成されたオブジェクトコードを実行可能な情報処理装置の構成を例示するブロック図である。
【図１３】本開示の第２の実施形態におけるコード生成装置の機能的な構成を例示するブロック図である。
【図１４】図１４は、各実施形態を実現可能なハードウェアの構成を例示する説明図である。
【発明を実施するための形態】
【００１７】
まず、本開示に関する技術的な検討事項等について、より詳細に説明する。
【００１８】
一般的に、ＳＩＭＤ命令は、図１に例示するように、複数のデータに対して、一つの命令で同じ演算処理を並列に（同時に）実行可能である。図１に示す具体例の場合、１つのＳＩＭＤ命令により、４つのデータに関する加算処理が実行される。
【００１９】
このように、ＳＩＭＤ命令を用いることにより、複数のデータに対する演算処理を、少ない数の命令を用いて実行できる。これより、コードサイズが低減され、プログラムの実行時間が改善される。
【００２０】
例えば、図２に例示するように、あるコードが２つの加算命令を含む場合、ある種のコンパイラは、これらの命令を、２つの加算を並行して（同時に）実行するＳＩＭＤ命令に変換することが可能である。一方、図３に例示するように、異なる命令（図3の場合は、加算命令と乗算命令）の組については、典型的には、これらの命令をＳＩＭＤ命令に直接的には変換できない場合が多い。この場合、各々の命令が逐次的に実行される。即ち、この場合、ＳＩＭＤ命令を用いてプログラムの実行効率を改善することが困難である。
【００２１】
本開示に係る技術は、上記のような事情から着想を得ており、異なる種類の命令をＳＩＭＤ命令として実行可能なコード（例えば、オブジェクトコード、実行コード等のプログラム）を生成することで、コードのサイズを低減する。また、これによりプログラムの実行時間が改善される。
【００２２】
以下の各実施形態を用いて、以下、各実施形態を用いて、本開示に係る技術を実現可能な、コード生成装置、コード生成方法等について詳細に説明する。
【００２３】
以下の各実施形態においては、ＳＩＭＤ命令を実行可能な演算器、より具体的には、ＳＩＭＤ型の融合演算（例えば、ＦＭＡ演算等）を実行可能な演算器（例えば、ＳＩＭＤ型ＦＭＡ演算器）を有するプロセッサ向けのコード（オブジェクトコード、実行コード等）を生成する技術について説明する。
【００２４】
融合演算は、例えば、ＦＭＡ演算のように、複数種類の演算を１つの演算として実行するような演算である。ＳＩＭＤ型の融合演算を実行可能な演算器は、融合演算を表す命令（融合演算命令）を、１つの命令として実行可能である。以下においては、説明の便宜上、融合演算としてＦＭＡ演算を用いる構成を例示する。なお、本開示に係る技術は、これには限定されず、ＦＭＡ演算以外の融合演算が用いられてもよい。以下、ＳＩＭＤ型ＦＭＡ演算器を用いる命令を、ＳＩＭＤ−ＦＭＡ命令と記載することがある。
【００２５】
ＦＭＡ演算器は乗算器と加算器とを含むよう構成され、積和演算を１命令で実行可能な演算器である。積和演算は、例えば、（（Ａ＊Ｂ）＋Ｃ）という形式の演算（乗算の結果を加算する演算）である。ＳＩＭＤ型ＦＭＡ演算器は、複数（例えば２つ）の組のＦＭＡ演算を、１命令で処理可能な演算器である。
【００２６】
本開示に係る技術は、例えば、解析対象のコード（例えば、ソースコード等）に含まれる演算命令の種類と依存関係とに応じて、それらの演算命令をＳＩＭＤ−ＦＭＡ命令に変換可能か否かを判定することを可能とする。そして、その判定結果に基づいて、それらの演算命令を、ＳＩＭＤ−ＦＭＡ命令に変換することを可能とする。また、この際、本開示に係る技術は、ＳＩＭＤ−ＦＭＡ命令により処理されるデータ（オペランド）を、ＳＩＭＤ−ＦＭＡ命令により参照されるレジスタに配置可能な形式にまとめる（パックする）ことが可能である。
【００２７】
以下、本開示に係る技術を実現可能な実施形態について説明する。以下の各実施形態に記載されている装置等の構成は例示であり、本開示に係る技術の範囲はそれらには限定されない。以下の各実施形態における装置を構成する構成要素の区分け（例えば、機能的な単位による分割）は、本開示に係る技術を実現可能な一例である。本開示に係る技術の実現に際しては、以下の例示に限定されず、様々な構成が想定される。即ち、以下の各実施形態に例示する各構成要素は、更に分割されてもよい。また、以下の各実施形態における１以上の構成要素が、統合されてもよい。
【００２８】
本開示に係る技術は、単体の装置（物理的及び仮想的な装置）を用いて実現されてもよく、複数の離間した装置（物理的及び仮想的な装置）を用いて実現されてもよい。本開示に係る技術が複数の装置により実現される場合、各装置は有線、無線、又はそれらを適切に組合せた通信ネットワークにより通信可能に接続されてもよい。係る通信ネットワークは、物理的な通信ネットワークであってもよく、仮想的な通信ネットワークであってもよい。以下において説明する各実施形態を実現可能なハードウェア構成については、後述する。
【００２９】
＜第１の実施形態＞
以下、本開示に係る技術の第１の実施形態について説明する。
【００３０】
［構成］ 
図４は、本実施形態におけるコード生成装置１００の機能的な構成を例示するブロック図である。図４に例示するように、コード生成装置１００は、コンパイラ１０１を備える。コード生成装置１００は、更に、ファイル管理部１０４を備えてもよい。コード生成装置１００を構成するこれらの構成要素の間は、適切な方法（例えば、プロセス間通信、共有メモリ、各種ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）等）を用いて、相互に通信可能に接続されていてもよい。以下、各構成要素について説明する。
【００３１】
コンパイラ１０１は、ソースコードを入力として受け付け、字句解析処理、構文解析処理、意味解析処理、オブジェクトのコード生成処理、等を実行する。これにより、コンパイラ１０１は、ソースコードをオブジェクトコードに変換（コンパイル）する。この際、コンパイラ１０１は、例えば、オブジェクトコードのサイズの低減、オブジェクトコードから最終的に生成される実行コードの実行速度の改善、などを目的とした最適化処理を実行することができる。以下、係る最適化処理を実行可能な構成要素について説明する。
【００３２】
コンパイラ１０１は、コード解析部１０２と、命令生成部１０３と、を有する。
【００３３】
以下、コード解析部１０２がソースコード又は中間コード（ソースコードに対して、構文解析処理、字句解析処理、意味解析処理等を行うことで生成されたコード）解析する構成について説明する。なお、以下、ソースコード及び中間コードをまとめて解析対象コードと記載することがある。
【００３４】
コード解析部１０２は、解析対象コードを解析し、その解析対象コードに含まれる演算命令が、ＳＩＭＤ命令に変換可能か否かを判定する。コード解析部１０２は、例えば、解析対象コードに含まれるループ処理（繰り返し処理）内部の演算が、ＳＩＭＤ命令に変換可能であるか否かを判定することができる。また、コード解析部１０２は、例えば、解析対象コードにおいて逐次実行される演算が、ＳＩＭＤ命令に変換可能であるか否かを判定することができる。
【００３５】
コード解析部１０２は、解析対象コードに含まれる演算（例えば、加減算、乗算、除算、ＦＭＡ演算等）を探索する、探索部１０２ａを含む。探索部１０２ａは、例えば、解析対象コードに含まれるループ処理内部の演算を探索することができる。探索部１０２ａは、探索した結果を、依存関係解析部１０２ｂ（後述）に提供してもよい。
【００３６】
コード解析部１０２は、また、探索部１０２ａが探索した演算の間の依存関係を解析し、それらの演算をＳＩＭＤ命令に変換可能か否かを判定する、依存関係解析部１０２ｂを含む。依存関係解析部１０２ｂは、例えば、探索部１０２ａが探索したループ処理内部における演算の依存関係を解析し、それらの演算がＳＩＭＤ命令に変換可能か判定することができる。
【００３７】
命令生成部１０３は、コード解析部１０２における解析対象コードの解析結果に応じて、解析対象コードに含まれる演算を、ＳＩＭＤ命令に変換する。
【００３８】
命令生成部１０３は、演算命令（例えば、加算命令、減算命令、乗算命令等）をＦＭＡ演算の形式に変換する演算変換部１０３ａを含む。命令生成部１０３は、また、ＳＩＭＤ命令生成部１０３ｂを含む。ＳＩＭＤ命令生成部１０３ｂは、複数のＦＭＡ演算間の依存関係に基づいて、組合せ可能な２つのＦＭＡ演算を選択し、ＳＩＭＤ命令のオペランドを表すデータを成形（パック）し、ＳＩＭＤ−ＦＭＡ命令を生成する処理を実行する。
【００３９】
コード解析部１０２及び命令生成部１０３は、コンパイラ１０１において最適化処理の一部を実行する構成要素として実装されてもよい。なお、コンパイラ１０１は、これ以外に、字句解析、構文解析、意味解析、オブジェクト生成等の典型的な処理を実行するよう構成されてよい。これらの典型的な処理は、例えば、周知技術を用いて実装されてもよい。
【００４０】
ファイル管理部１０４は、ソースコード、オブジェクトコード等を記憶及び管理するよう構成される。本実施形態においては、ファイル管理部１０４は、ソースコード、オブジェクトコード等をファイルの形式で管理してもよい。この場合、ファイル管理部１０４は、ファイルシステムを用いて実現されてもよい。なお、本実施形態はこれには限定されず、ファイル管理部１０４は、例えば、データベース等、ファイルシステム以外の技術を用いて実現されてもよい。
【００４１】
コード生成装置１００は、例えば、コード生成装置１００自身により実行されるオブジェクトコードを生成してもよい。また、コード生成装置１００は、例えば、図１２に例示するような他の情報処理装置１２００において実行可能なオブジェクトコードを生成してもよい。情報処理装置１２００は、例えば、プロセッサ１２０１、メモリ１２０２、ストレージ１２０３等から構成されるコンピュータであってよい。
【００４２】
プロセッサ１２０１は、少なくとも、ＳＩＭＤ型ＦＭＡ演算器と、ＳＩＭＤ演算に用いられるオペランドを記憶可能なレジスタ（ＳＩＭＤ−ＦＭＡレジスタと記載する場合がある）とを含むＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｓｉｎｇ  Ｕｎｉｔ）やＭＰＵ（Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）であってよい。プロセッサ１２０１は、上記以外に、今日における典型的な計算処理を実行可能な構成を備えてよい。メモリ１２０２は、プロセッサ１２０１から参照可能な記憶装置であり、プロセッサ１２０１により実行されるオブジェクトコードを記憶することができる。ストレージ１２０３は、例えば、不揮発性の記憶装置（ハードディスクドライブや、半導体フラッシュメモリ等）により構成され、オブジェクトコードを記憶することが可能である。図１２に例示する情報処理装置１２００の構成は、一つの具体例であり、本実施形態はこれには限定されない。
【００４３】
［動作］
以下、上記のように構成されたコード生成装置１００の動作について説明する。
【００４４】
図５Ａは、コード解析部１０２における処理の一例を示すフローチャートである。コード解析部１０２は、解析対象コードを解析し、探索部１０２ａの機能を用いて、解析対象コードに含まれる演算の種類を特定する（ステップＳ５０１）。コード解析部１０２は、例えば、解析対象コードにおけるループ処理を解析し、探索部１０２ａの機能を用いて、ループ処理に含まれる演算の種類を特定してもよい。
【００４５】
探索部１０２ａは、解析対象コードに含まれる演算のうち、加減算と乗算とを選択し、ＳＩＭＤ命令に変換可能な演算の組合せのパターンを探索する（ステップＳ５０２）。この際、探索部１０２ａは、例えば、オペランドの型及び精度が同じ加減算命令と、乗算命令との組合せを探索してもよい。
【００４６】
依存関係解析部１０２ｂは、探索部１０２ａにより探索された演算の組合せについて、依存関係があるか否かを解析する。この解析の結果に応じて、依存関係解析部１０２ｂは、これらの命令をＳＩＭＤ命令に変換可能であるか否かを判定する（ステップＳ５０３）。依存関係解析部１０２ｂは、例えば、複数の演算が同一のループ処理に含まれ、かつ、それぞれの演算の間に依存関係がない場合、それらの演算の組合せについて、依存関係がないと判定してもよい。
【００４７】
ステップＳ５０３における判定の結果、依存関係があると判定された場合（ステップＳ５０４においてＹＥＳ）、コード解析部１０２は、それらの命令について、ＳＩＭＤ命令に変換しないと決定する。依存関係がある命令をＳＩＭＤ命令に変換した場合、計算結果の値が変わってしまう可能性があるからである。コード解析部１０２は、それらの命令を、ＳＩＭＤ命令に変換される命令の候補から除外してよい（ステップＳ５０５）。
【００４８】
上記解析の結果、依存関係がないと判断された場合（ステップＳ５０４においてＮＯ）、コード解析部１０２は、それらの命令をＳＩＭＤ命令に変換可能であると判定する。
この場合、コード解析部１０２は、例えば、上記処理の結果を命令生成部１０３に提供してもよい。
【００４９】
命令生成部１０３は、依存関係がない演算の組合せを、ＳＩＭＤ命令（より具体的には、ＳＩＭＤ−ＦＭＡ命令）に変換する（ステップＳ５０６）。以下、ステップＳ５０６における処理について、図５Ｂに例示するフローチャートを参照して説明する。図５Ｂは、命令生成部１０３における処理の一例を例示するフローチャートである。
【００５０】
命令生成部１０３は、演算変換部１０３ａの機能を用いて、加減算と乗算とを、ＦＭＡ演算の形式へ変換する（ステップＳ５０８）。
【００５１】
以下、解析対象コードに含まれる非ＦＭＡ演算（例えば、加算、減算、乗算、除算等の単順な算術演算）をＦＭＡ演算に変換する方法について、図６に例示する説明図を参照して説明する。命令生成部１０３は、解析対象コードに含まれる加算について、一方のオペランドにダミーの乗算（結果に影響しない見せかけの乗算）として値”１”をかける（乗算する）。これにより、命令生成部１０３は、当該加算をＦＭＡ演算に変換する（図６の６０１）。以下、加算をＦＭＡ演算に変換する処理を、第１の演算変換と記載することがある。加算をＦＭＡ演算に変換する際に用いられるダミーのオペランド（本具体例においては、”１”）を、第１のダミーオペランドと記載することがある。
【００５２】
命令生成部１０３は、解析対象コードに含まれる減算について、一方のオペランドにダミーの乗算として値”１”をかけ（乗算し）、更に、減数のオペランドの符号を反転することで、当該減算をＦＭＡ演算に変換する（図６の６０２）。以下、減算をＦＭＡ演算に変換する処理を、第２の演算変換と記載することがある。減算をＦＭＡ演算に変換する際に用いられるダミーのオペランド（本具体例においては、”１”）を、第２のダミーオペランドと記載することがある。
【００５３】
命令生成部１０３は、解析対象コードに含まれる乗算について、当該乗算の結果に値”０”を足すダミーの加算（結果に影響しない見せかけの加算）を加えることで、当該乗算をＦＭＡ演算に変換する（図６の６０３）。以下、乗算をＦＭＡ演算に変換する処理を、第３の演算変換と記載する場合がある。以下、乗算をＦＭＡ演算に変換する際に用いられるダミーのオペランド（本具体例においては、”０”）を、第３のダミーオペランドと記載することがある。
【００５４】
上記のような方法によって、命令生成部１０３は、演算の結果を変えることなく、第１、第２、第３の演算変換により、加算、減算、及び乗算をＦＭＡ演算に変換することができる。このような変換により、例えば、コード解析部１０２によってＳＩＭＤ命令化可能であると判断された加算（又は減算）と乗算と組合せは、２つのＦＭＡ演算の組（１つは加算（又は減算）から変換されたＦＭＡ演算、もう１つは乗算から変換されたＦＭＡ演算）、に変換される。
【００５５】
ＳＩＭＤ命令生成部１０３ｂは、上記２つのＦＭＡ演算の組を同時に（並行して）実行可能なＳＩＭＤ命令（ＳＩＭＤ−ＦＭＡ命令）を生成する（ステップＳ５０８）。この際、ＳＩＭＤ命令生成部１０３ｂは、それぞれのＦＭＡ演算のオペランドが、ＳＩＭＤレジスタの上位ビットと下位ビットとにパック（配置）されるように、ＳＩＭＤ−ＦＭＡ命令のオペランドを表すデータを生成する。これにより、ＳＩＭＤ命令生成部１０３ｂは、ＳＩＭＤ−ＦＭＡ命令を生成する。
【００５６】
命令生成部１０３の処理について、図７に例示する具体例を用いて説明する。図７に例示する具体例においては、解析対象コード（ソースコード）には、異なる種類の演算（加算及び乗算）が含まれていることから、これらの命令を単純にＳＩＭＤ命令に置き換えることは困難である。
【００５７】
命令生成部１０３（具体的には、演算変換部１０３ａ）は、ソースコードに含まれる加算及び乗算を、ＦＭＡ演算に変換する。命令生成部１０３（具体的には、ＳＩＭＤ命令生成部１０３ｂ）は、ＦＭＡ演算を、ＳＩＭＤ命令（ＳＩＭＤ−ＦＭＡ命令）に変換する。この際、ＳＩＭＤ命令生成部１０３ｂは、ＦＭＡ演算の各オペランドが、ＳＩＭＤレジスタの上位ビットと、下位ビットとにパックされるように、ＳＩＭＤ−ＦＭＡ命令のオペランドを表すデータを生成する。これにより、係るソースコードから変換されたオブジェクトコードが実行される際、あたかも、ＳＩＭＤレジスタの上位ビットにおいては”Ａ１＋Ｂ１”なる加算処理が実行され、下位ビットにおいては、”Ａ２＊Ｂ２”なる乗算処理が実行されるかのように、演算処理を実行することが可能である。
【００５８】
図７は、２つのＦＭＡ命令をＳＩＭＤ命令として実行する具体例を例示するが、本実施形態は、これには限定されない。コード生成装置１００は、生成したオブジェクトコードが実行さる環境（例えば、プロセッサ１２０１の構成）に応じて、３つ以上のＦＭＡ命令をＳＩＭＤ命令として実行する、ＳＩＭＤ−ＦＭＡ命令を生成してもよい。
【００５９】
以下、コード生成装置１００が、ｎ個（ｎは２以上の整数）のＦＭＡ命令を並列に実行可能なＳＩＭＤ命令（ＳＩＭＤ−ＦＭＡ命令）を生成する場合について概要を説明する。
【００６０】
この場合、命令生成部１０３は、オブジェクトコードが実行される環境（例えばプロセッサ１２０１）におけるＳＩＭＤ−ＦＭＡレジスタをｎ等分したそれぞれの領域に、ｎ個のＦＭＡ命令のオペランドが配置されるように、ＳＩＭＤ−ＦＭＡ命令を生成してもよい。例えば、ＳＩＭＤ−ＦＭＡレジスタが６４ｂｉｔ幅であり、ＦＭＡ命令のオペランドが単精度浮動小数電データ（３２ｂｉｔ）である場合、ＳＩＭＤ−ＦＭＡ命令として、２つのＦＭＡ命令が並列に実行されてよい。この場合、命令生成部は、ＳＩＭＤ−ＦＭＡレジスタを２つの領域（上位３２ｂｉｔ、下位３２ｂｉｔ）に分割し、それぞれの領域に、２つのＦＭＡ演算のオペランドを配置する。例えば、ＳＩＭＤ−ＦＭＡレジスタが６４ｂｉｔ幅であり、ＦＭＡ命令のオペランドが半精度浮動小数電データ（１６ｂｉｔ）である場合、ＳＩＭＤ−ＦＭＡ命令として、４つのＦＭＡ命令が並列に実行されてもよい。この場合、命令生成部は、ＳＩＭＤ−ＦＭＡレジスタを４つの領域（それぞれ１６ｂｉｔ）に分割し、それぞれの領域に、４つのＦＭＡ演算のオペランドを配置する。
【００６１】
コード生成装置１００を用いた場合に得られる効果の一例を、図８乃至図１０に示す具体例を用いて説明する。なお、図８乃至図１０に示す具体例は、一例にすぎず、本実施形態はこれには限定されない。
【００６２】
図８は、解析対象コード（ソースコード）に含まれるループ中に現れる命令列の一例を示す説明図である。図８に例示する演算処理のオペランドは、全て単精度浮動小数点データ（３２ｂｉｔ）を表すことを想定する。また、実行環境（例えば、図１２に例示する情報処理装置）のプロセッサは、ＳＩＭＤ型ＦＭＡ演算器を有することを想定する。また、係るプロセッサは、６４ｂｉｔ幅のＳＩＭＤ命令により、単精度浮動小数を同時に２個計算可能であり、１クロックあたり最大で単精度浮動小数点演算を４個実行できることを想定する。
【００６３】
図８に示す具体例の場合、解析対象コードに（８０１）〜（８０８）の命令が含まれる。命令（８０１）〜（８０４）においては加算が行われ、命令（８０５）〜（８０８）においては乗算が行われる。図９に例示するように、命令（８０２）は、命令（８０１）の演算結果（”Ａ１”）を参照することから、命令（８０２）と、命令（８０１）との間には依存関係がある。命令（８０３）、（８０４）についても同様に、前の命令の結果を参照することから、加算命令（８０１）〜（８０４）の間には依存関係がある。
【００６４】
また、命令（８０６）は、命令（８０５）の演算結果（”Ｘ１”）を参照することから命令（８０５）と、命令（８０６）との間には依存関係がある。命令（８０７）、命令（８０８）についても同様に、前の命令の結果を参照することから、乗算命令（８０５）〜（８０８）の間にも依存関係がある。即ち、  同じ種類の演算命令である命令（８０１）〜（８０４）の加算同士、及び、命令（８０５）〜（８０８）の乗算同士の間に依存関係がある。
【００６５】
一方、命令（８０５）〜（８０８）の乗算命令は、命令（８０１）〜（８０４）の加算命令の結果を参照しない。即ち、命令（８０１）〜（８０４）の加算命令と、命令（８０５）〜（８０８）の乗算命令との間には依存関係がない。
【００６６】
典型的には、同じ種類の演算については、演算の間に依存関係がなければ、ＳＩＭＤ命令に変換することができる。一方、演算の種類が異なる命令（例えば、加算命令と乗算目例）については、単純にＳＩＭＤ命令に置き換えることは困難である。
【００６７】
図８に例示するような命令列の場合、同じ種類の演算命令の間には依存関係があることから、単純にはＳＩＭＤ命令に変換することができない。この場合、８つ命令を逐次的に実行することとなり、十分な実行性能が得られない。また、この場合、プロセッサは、１クロックで１個の演算しか実行できないことから、最大４個同時実行可能なピーク性能に対して、十分な実行効率が得られない。
【００６８】
これに対して、上記説明した本実施形態におけるコード生成装置１００は、図１０に例示するように、命令（８０１）〜（８０８）を、それぞれＦＭＡ演算（ｆ１）〜（ｆ８）に変換することができる。コード生成装置１００は、依存関係のない（ｆ１）と（ｆ５）、（ｆ２）と（ｆ６）、（ｆ３）と（ｆ７）、（ｆ４）と（ｆ８）を、同時に（並行して）実行可能な命令の組であると判定する。コード生成装置１００は、これらの命令をＳＩＭＤ−ＦＭＡ命令に変換し、命令（ｓ１）〜（ｓ４）を生成することができる。
【００６９】
コード生成装置１００は、元の加算命令のオペランドがＳＩＭＤレジスタの上位ビット（上位３２ｂｉｔ）にパックされ、元の乗算命令のオペランドがＳＩＭＤレジスタの下位ビット（下位３２ｂｉｔ）にパックされるよう、ＳＩＭＤ−ＦＭＡ命令を生成する。これにより、命令（ｓ１）〜（ｓ４）においては、あたかもＳＩＭＤレジスタの上位ビットにおいては、命令（ｆ１）〜（ｆ４）に相当する加算命令が実行され、下位ビットにおいては、命令（ｆ５）〜（ｆ８）に相当する乗算命令が実行されるかのように、演算処理が実行される。
【００７０】
図８に示す具体例においては、コード生成装置１００は、ＳＩＭＤ命令に変換できない場合と比較して、命令数を１／２（８命令から４命令へ）に削減することが可能である。また、実行性能は、２倍になる。
【００７１】
コード生成装置１００は、ＳＩＭＤ命令として２つＦＭＡ演算命令を同時発行するコード（オブジェクトコード）を生成することができる。これより、コード生成装置１００により生成されたコードを実行するプロセッサは、１クロックで実質４個の演算（乗算と加減算）を実行することが可能である。これにより、ＳＩＭＤ命令に変換できない場合と比較して、ピーク性能に対する実行効率が４倍になる。
【００７２】
上記のように構成されたコード生成装置１００を用いた場合に得られる効果の他の一例を、図１１に示す具体例を用いて説明する。なお、図１１に示す具体例は、一例にすぎず、本実施形態は、これには限定されない。
【００７３】
図１１に例示する解析対象コード（図１１の（ａ）部分）においては、演算命令（１１０１）における乗算の結果（”Ａ０”）が、後続する他の命令（１１０２）〜（１１０３）に参照される。命令（１１０１）は、加算であり、命令（１１０２）〜（１１０３）は、加算及び乗算であることから、これらの命令を単純にＦＭＡ演算の命令に変換することは困難である。
【００７４】
上記説明した本実施形態とは異なる方法として、例えば、命令（１１０１）と、他の命令（１１０２−１１０４）とを、単純に組合せることで、これらをＦＭＡ演算に変換することが考えられる。そのような方法は、例えば、上記説明した第１、第２、第３のダミー演算を用いず、ＦＭＡ演算に直接的に変換可能な命令の組合せを探索すること、探索された命令をＦＭＡ演算に変換すること、及び、変換したＦＭＡ演算を実行するＳＩＭＤ−ＦＭＡ命令を生成すること、を含んでもよい。そのような方法を用いた場合、命令（１１０１）〜（１１０４）は、例えば、図１１の（ｂ）部分に示す命令（１１０５）〜（１１０８）に変換される。命令（１１０６）、（１１０８）はＦＭＡ命令であるが、これらの命令において、演算”Ｂ０＊Ｃ０”が複数回実行される。即ち、この演算を実行するための処理（例えば、オペランドの読み込み等）に要するコスト（レイテンシ等）が、複数回発生する可能性がある。また、このような方法を用いた場合、ＦＭＡ演算に変換せずに”Ａ０”を先に計算した方が、乗算命令の数が少ない。
【００７５】
これに対して、本実施形態におけるコード生成装置１００は、ＦＭＡ演算に直接的に変換可能な複数の演算を組合せてＦＭＡ演算を生成するのではなく、依存関係のない命令を、それぞれＦＭＡ命令に変換する。図１１に示す具体例の場合、コード生成装置１００は、図１１の命令（１１０１）〜（１１０４）から、命令（１１０９）〜（１１１２）を生成することができる。この場合、命令（１１０９）において、先に”Ａ０”が計算されることから、演算”Ｂ０＊Ｃ０”を実行するコストは、１度のみ生じる。
【００７６】
また、命令（１１１０）〜（１１１２）に含まれる第１、第２のダミーオペランドは、いずれも即値である。よって、ダミーオペランドに関する演算の実行に要するコストは、比較的低いと考えられる。更に、コード生成装置１００は、命令（１１１０）〜（１１１２）のうち、２つの命令をＳＩＭＤ−ＦＭＡ命令に変換することが可能である。これにより、コード生成装置１００は、命令の数を削減できる。
【００７７】
以上説明したように、本実施形態におけるコード生成装置１００は、解析対象コードのコードサイズを低減することが可能である。また、コード生成装置１００は、解析対象コードの実行速度を改善することが可能である。その理由は、以下の通りである。
【００７８】
コード生成装置１００は、解析対象コードに含まれる、異なる種類の演算を表す命令列を、複数のオペランドに関する演算を並行して（同時に）実行可能な命令（ＳＩＭＤ命令）に変換することができる。より具体的には、コード生成装置１００は、解析対象コードに含まれる演算の依存関係を判定することで、それらの演算を、ＳＩＭＤ命令に変換して実行可能か否か判定可能である。コード生成装置１００は、解析対象コードに含まれる演算（例えば、加減算及び乗算）を、ダミーのオペランドを用いて、ＦＭＡ演算に変換可能である。コード生成装置１００は、依存関係のないＦＭＡ演算を、ＳＩＭＤ命令（ＳＩＭＤ−ＦＭＡ命令）に変換可能である。このように、コード生成装置１００は、解析対象コードの一部をＳＩＭＤ−ＦＭＡ命令に変換することで、ＳＩＭＤ命令に変換できない場合に比べて、コードサイズを低減することが可能である。更に、ＳＩＭＤ−ＦＭＡ命令を用いることにより、コード（具体的には、解析対象コードから生成されたオブジェクトコード）の実行速度が改善される。
【００７９】
例えば、科学技術計算の分野では、配列に格納した大量のデータをループによって処理し、ループの繰返しごとに依存関係がある漸化式を計算するようなプログラムが実行されることがある。例えば、図８に示す、Ａ（ｎ）＝Ａ（ｎ−１）＋Ｂ（ｎ）、Ｘ（ｎ）＝Ｘ（ｎ−１）＋Ｙ（ｎ）（Ａ、Ｂ、Ｘ、Ｙは配列、ｎは配列のインデックス）は、そのような漸化式の一例であるとも考えられる。この場合、プログラムの実行により、多くの演算（例えば、加算、乗算等）命令が発行される。しかしながら、例えば、漸化式においては、同種の演算（例えば、加算同士、乗算同士）の間には依存関係があることが多い。よって、これらの命令をそのままＳＩＭＤ命令に置き換える困難である。このように、ループ内に存在する同種の演算命令を、ＳＩＭＤ命令に単純に置き換えられない場合であっても、本実施形態におけるコード生成装置１００は、異なる種別の命令を組合せてＳＩＭＤ命令（ＳＩＭＤ−ＦＭＡ命令）を生成可能である。これにより、コード生成装置１００は、例えば、漸化式を含むようなプログラムであっても、コードサイズを削減することが可能である。また、コード生成装置１００は、そのようなプログラムの実行速度を改善することが可能である。
【００８０】
例えば、組込みシステムのようにメモリのサイズが限られるシステムにおいては、コードサイズを小さくすることが求められる。このような分野においても、本実施形態において説明した方式の有用性が高いと考えられる。
【００８１】
［変形例］
以下、本実施形態の変形例について説明する。本変形例におけるコード生成装置の機能的な構成は、上記第１の実施形態と同様としてよい。
【００８２】
上記第１の実施形態におけるコード生成装置１００は、加減算と乗算との組合せを、それらの間の依存関係に応じて、ＳＩＭＤ命令（具体的にはＳＩＭＤ−ＦＭＡ命令）に変換することができる。
【００８３】
本変形例において、コード生成装置１００は、上記に加え、加減算と除算との組合せを、ＳＩＭＤ−ＦＭＡ命令に変換可能に構成される。浮動小数点数の演算においては、除数の逆数を求めることで、除算を乗算に変換可能である。このため、本変形例において、コード生成装置１００は、例えば、除算を乗算に変換してから、にＦＭＡ命令に変換することで、加減算と除算との組合せから、ＳＩＭＤ−ＦＭＡ命令を生成することが可能である。
【００８４】
＜第２の実施形態＞
以下、本開示に係る技術の基本的な実施形態である、第２の実施形態について説明する。
【００８５】
図１３は、本実施形態におけるコード生成装置１３００の機能的な構成を例示するブロック図である。図１３に例示するように、コード生成装置１３００は、コード解析部１３０１（コード解析手段）と、命令生成部１３０２（命令生成手段）と、を含む。
【００８６】
コード解析部１３０１及び命令生成部１３０２は、第１の実施形態と同様、ソースコードからオブジェクトコードを生成するコンパイラの一部として実現されてもよい。
【００８７】
コード生成装置１３００は、例えば、第１の実施形態におけるコード生成装置１００と同様、コード生成装置１３００自身により実行されるオブジェクトコードを生成してもよい。また、コード生成装置１３００は、例えば、図１２に例示するような他の情報処理装置１２００において実行可能なオブジェクトコードを生成してもよい。
【００８８】
以下、コード生成装置１３００を構成する各構成要素について説明する。
【００８９】
コード解析部１３０１は、複数の演算命令により構成されるコンピュータ・プログラムである解析対象コードに含まれる１以上の演算命令を、その演算命令の種類と、演算命令の間の依存関係とに基づいて、融合演算命令を並列に実行可能な並列実行命令に変換可能が否かを判定する。コード解析部１３０１は、例えば、命令の種類が異なる演算命令の間の依存関係を確認し、それらの命令を並列実行命令に変換可能が否かを判定してもよい。
【００９０】
融合演算命令は、複数のデータに対して、異なる種類の演算を１つの命令として実行可能な命令である。融合演算命令は、例えば、ＦＭＡ演算を実行する命令であってもよい。
【００９１】
並列実行命令は、１つの命令で複数のデータに関する演算を並列に実行可能な命令である。並列実行命令は、例えば、ＳＩＭＤ命令であってもよい。また、融合演算命令を並列に実行可能な並列実行命令は、ＳＩＭＤ−ＦＭＡ命令であってもよい。
【００９２】
命令生成部１３０２は、コード解析部１３０１により、並列実行命令に変換可能であると判定された演算命令を、融合演算命令に変換する。命令生成部１３０２は、変換した融合演算命令のオペランドが、並列実行命令として実行可能な形式に配置されたデータを生成することで、融合演算命令を並列に実行する並列実行命令を生成する。
【００９３】
一例として、符号演算命令がＦＭＡ命令であり、並列実行命令がＳＩＭＤ命令（より具体的にはＳＩＭＤ−ＦＭＡ命令）であることを想定する。この場合、コード解析部１３０１は、例えば、解析対象コードに含まれる、異なる種類の演算（例えば、加算と乗算、減算と乗算等）命令について、それらの間の依存関係を確認し、依存関係がない演算命令の組合せを選択することができる。命令生成部１３０２は、例えば、コード解析部１３０１により選択された、依存関係がない異なる種類の演算をＦＭＡ演算命令に変換し、そのＦＭＡ演算命令を組合せてＳＩＭＤ−ＦＭＡ命令を生成してもよい。この場合、命令生成部１３０２は、例えば、ＳＩＭＤ−ＦＭＡ命令の実行に用いられるレジスタを分割した領域に、並列に実行されるＦＭＡ命令のオペランドが割り当てられるように、ＳＩＭＤ−ＦＭＡ命令のオペランドを表すデータを生成してもよい。
【００９４】
本実施形態において、コード解析部１３０１は、第１の実施形態におけるコード解析部１０２と同様に構成されてもよく、命令生成部１３０２は、第１の実施形態における命令生成部１０３と同様に構成されてもよい。
【００９５】
上記のように構成されたコード生成装置１３００によれば、異なる命令を含むプログラムの実行効率を向上することが可能である。その理由は、コード解析部１３０１が、異なる種類の演算命令間の依存関係を判定し、命令生成部が、依存関係がない演算命令を、融合演算命令を並列に実行する並列実行命令に変換するからである。コード生成装置１３００は、例えば、解析対象コードに含まれる異なる種類の演算である加算と乗算、減算と乗算とを、ＳＩＭＤ−ＦＭＡ命令に変換したオブジェクトコードを生成することが可能である。これにより、コード生成装置１３００は、オブジェクトコードのサイズを低減し、実行速度を向上することができる。
【００９６】
＜ハードウェア及びソフトウェア・プログラム（コンピュータ・プログラム）の構成＞
以下、上記各実施形態を実現可能なハードウェア構成について説明する。
【００９７】
以下の説明においては、上記各実施形態におけるコード生成装置（１００、１３００）をまとめて、単に「コード生成装置」と記載する。またコード生成装置の各構成要素を、単に「コード生成装置の構成要素」と記載する。
【００９８】
上記各実施形態において説明したコード生成装置は、１つ又は複数の専用のハードウェア装置により構成されてもよい。その場合、上記各図に示した各構成要素は、一部又は全部を統合したハードウェア（処理ロジックを実装した回路構成（ｃｉｒｃｕｉｔｒｙ））として実現されてもよい。
【００９９】
例えば、コード生成装置をハードウェアにより実現する場合、コード生成装置の構成要素は、それぞれの機能を提供可能な回路構成を実装するＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）等により実現されてもよい。この場合、例えば、コード生成装置の構成要素が保持するデータは、ＳｏＣに統合されたＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）領域、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）領域、フラッシュメモリ領域等に記憶されてもよい。なお、上記回路構成は１つの具体的態様であり、実装においては、様々なバリエーションが想定される。
【０１００】
コード生成装置の各構成要素を接続する通信回線としては、周知の通信バスあるいは通信ネットワーク採用してもよい。また、各構成要素を接続する通信回線は、それぞれの構成要素間をピアツーピアで接続してもよい。コード生成装置を複数のハードウェア装置により構成する場合、それぞれのハードウェア装置の間は、適切な通信方法（有線、無線、またはそれらの組合せ）により通信可能に接続されていてもよい。
【０１０１】
上述したコード生成装置は、図１４に例示するような汎用のハードウェア装置１４００と、係るハードウェア装置１４００によって実行される各種ソフトウェア・プログラム（コンピュータ・プログラム、例えば、コンパイラ）とによって構成されてもよい。この場合、コード生成装置は、複数のハードウェア装置１４００及びソフトウェア・プログラムにより構成されてもよい。
【０１０２】
図１４におけるプロセッサ１４０１は、汎用のＣＰＵ（中央処理装置：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やマイクロプロセッサ等の演算処理装置である。プロセッサ１４０１は、例えば、後述する不揮発性記憶装置１４０３に記憶された各種ソフトウェア・プログラムをメモリ１４０２に読み出し、係るソフトウェア・プログラムに従って処理を実行してもよい。なお、プロセッサ１４０１は、図１２に例示するプロセッサ１２０１と同様、ＳＩＭＤ−ＦＭＡ命令を実行可能な演算器を備えてもよい。
【０１０３】
この場合、上記各実施形態におけるコード生成装置の構成要素は、例えば、プロセッサ１４０１により実行されるソフトウェア・プログラムとして実現可能である。そのようなソフトウェア・プログラムの実装においては、様々なバリエーションが想定される。
【０１０４】
メモリ１４０２は、プロセッサ１４０１から参照可能な、ＲＡＭ等のメモリ装置であり、ソフトウェア・プログラムや各種データ等を記憶する。なお、メモリ１４０２は、揮発性のメモリ装置であってもよい。
【０１０５】
不揮発性記憶装置１４０３は、例えば磁気ディスクドライブや、フラッシュメモリによる半導体記憶装置のような、不揮発性の記憶装置である。不揮発性記憶装置１４０３は、各種ソフトウェア・プログラムやデータ等を記憶可能である。
【０１０６】
例えば、上記各実施形態における、ファイル管理部（１０４）は、不揮発性記憶装置１４０３にデータを保持してもよい。
【０１０７】
ドライブ装置１４０４は、例えば、後述する記録媒体１４０５に対するデータの読み込みや書き込みを処理する装置である。
【０１０８】
記録媒体１４０５は、例えば、光ディスク、光磁気ディスク、半導体フラッシュメモリ等、データを記録可能な記録媒体である。
【０１０９】
上述した各実施形態を例に説明したコード生成装置は、例えば、図１４に例示するハードウェア装置１４００に対して、上記各実施形態において説明した機能を実現可能なソフトウェア・プログラム（例えば、コンパイラ）を供給することにより、実現されてもよい。より具体的には、例えば、係る装置に対して供給したソフトウェア・プログラムを、プロセッサ１４０１が実行することによって、本開示に係る技術が実現されてもよい。この場合、係るハードウェア装置１４００において稼働しているオペレーティングシステムや、データベース管理ソフト、ネットワークソフト等のミドルウェアなどが各処理の一部を実行してもよい。
【０１１０】
上述した各実施形態において、上記各図（例えば、図４及び図１３）に示した各部は、上述したハードウェアにより実行されるソフトウェア・プログラムの機能（処理）単位である、ソフトウェアモジュールとして実現されてもよい。ただし、これらの図面に示した各ソフトウェアモジュールの区分けは一例であり、実装に際しては、他の様々な構成が想定され得る。
【０１１１】
例えば、上記各部をソフトウェアモジュールとして実現する場合、これらのソフトウェアモジュールは、不揮発性記憶装置１４０３に記憶されてもよい。そして、プロセッサ１４０１が、それぞれの処理を実行する際に、これらのソフトウェアモジュールをメモリ１４０２に読み出してもよい。
【０１１２】
また、これらのソフトウェアモジュールは、共有メモリやプロセス間通信等により、相互に各種データを伝達できるように構成されてもよい。このような構成により、これらのソフトウェアモジュールを、相互に通信可能に接続可能である。
【０１１３】
更に、上記各ソフトウェア・プログラムは、記録媒体１４０５に記録されてもよい。この場合、上記各ソフトウェア・プログラムは、上記通信装置等の出荷段階、又は運用段階等において、適宜ドライブ装置１４０４を通じて不揮発性記憶装置１４０３に格納されるよう構成されてもよい。
【０１１４】
なお、上記の場合において、上記コード生成装置への各種ソフトウェア・プログラムの供給方法として、出荷前の製造段階、又は出荷後のメンテナンス段階等において、適当な治具（ツール）を利用して当該装置内にインストールする方法を採用してもよい。また、各種ソフトウェア・プログラムの供給方法として、インターネット等の通信回線を介して外部からダウンロードする方法等のように、現在では一般的な手順を採用してもよい。
【０１１５】
そして、このような場合において、本開示に係る技術は、係るソフトウェア・プログラムを構成するコード、又は係るコードが記録されたところの、コンピュータ読み取り可能な記録媒体によって構成されると捉えることができる。この場合、係る記録媒体は、ハードウェア装置１４００と独立した媒体に限らず、ＬＡＮやインターネットなどにより伝送されたソフトウェア・プログラムをダウンロードして記憶又は一時記憶した記憶媒体を含む。
【０１１６】
また、上述したコード生成装置、又は、当該コード生成装置の構成要素は、図１４に例示するハードウェア装置１４００を仮想化した仮想化環境と、当該仮想化環境において実行される各種ソフトウェア・プログラム（コンピュータ・プログラム）とによって構成されてもよい。この場合、図１４に例示するハードウェア装置１４００の構成要素は、当該仮想化環境における仮想デバイスとして提供される。なお、この場合も、図１４に例示するハードウェア装置１４００を物理的な装置として構成した場合と同様の構成にて、本開示に係る技術を実現可能である。
【０１１７】
以上、本開示に係る技術を、上述した模範的な実施形態に適用した例として説明した。しかしながら、本開示の技術的範囲は、上述した各実施形態及び変形例に記載した範囲には限定されない。当業者には、係る実施形態に対して多様な変更又は改良を加えることが可能であることは明らかである。そのような場合、係る変更又は改良を加えた新たな実施形態も、本開示の技術的範囲に含まれ得る。更に、上述した各実施形態及び変形例、並びに、係る変更又は改良を加えた新たな実施形態を組合せた実施形態も、本開示の技術的範囲に含まれ得る。そしてこのことは、特許請求の範囲に記載した事項から明らかである。
【符号の説明】
【０１１８】
１００  コード生成装置
１０１  コンパイラ
１０２  コード解析部
１０３  命令生成部
１０４  ファイル管理部
１２００  情報処理装置
１２０１  プロセッサ
１２０２  メモリ
１２０３  ストレージ
１３００  コード生成装置
１３０１  コード解析部
１３０２  命令生成部
１４０１  プロセッサ
１４０２  メモリ
１４０３  不揮発性記憶装置
１４０４  ドライブ装置
１４０５  記録媒体
【図１】
2018163381.tif 000003
【図２】
2018163381.tif 000004
【図３】
2018163381.tif 000005
【図４】
2018163381.tif 000006
【図５Ａ】
2018163381.tif 000007
【図５Ｂ】
2018163381.tif 000008
【図６】
2018163381.tif 000009
【図７】
2018163381.tif 000010
【図８】
2018163381.tif 000011
【図９】
2018163381.tif 000012
【図１０】
2018163381.tif 000013
【図１１】
2018163381.tif 000014
【図１２】
2018163381.tif 000015
【図１３】
2018163381.tif 000016
【図１４】
2018163381.tif 000017