以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、第1の実施の形態の情報処理装置を説明するための図である。
第1の実施の形態の情報処理装置10は、あるアセンブリ言語で記述されたコードを、別のアセンブリ言語または別のアセンブリ言語に対応する機械語で記述されたコードに変換するための変換プログラムを、テーブルデータから生成する。生成された変換プログラムは、情報処理装置10で実行されてもよいし他の情報処理装置で実行されてもよい。情報処理装置10は、クライアント装置でもよいしサーバ装置でもよい。情報処理装置10が、コンピュータや命令変換支援装置などと呼ばれてもよい。
情報処理装置10は、記憶部11および処理部12を有する。記憶部11は、RAM(Random Access Memory)などの揮発性半導体メモリでもよい。また、記憶部11は、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性ストレージでもよい。処理部12は、例えば、CPU(Central Processing Unit)、GPU(Graphics Processing Unit)、DSP(Digital Signal Processor)などのプロセッサである。処理部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部11でもよい)に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
記憶部11は、テーブルデータ13を記憶する。テーブルデータ13は、変換元のアセンブリ言語の複数のオペランドパターンと、変換先のアセンブリ言語または機械語の複数の命令との間の対応関係を示す。アセンブリ言語は、プロセッサが解釈可能な機械語命令と1対1に対応するアセンブリ命令を規定した低水準プログラミング言語である。変換元のアセンブリ言語は、いわゆるCISC型プロセッサのように、複雑な命令セットをもつプロセッサに対応する。変換先のアセンブリ言語または機械語は、いわゆるRISC型プロセッサのように、比較的単純な命令セットをもつプロセッサに対応する。
ただし、第1の実施の形態の情報処理装置10は、CISC型プロセッサの命令をRISC型プロセッサの命令に変換する処理に限定されるものではない。RISC型プロセッサのアセンブリコードをCISC型プロセッサのアセンブリコードへ変換したい場合にも、本実施の形態を容易に適用可能である。CISC型プロセッサの命令セットにおいては、RISC型プロセッサと同様の単純な処理を行う命令を含むため、RISC型プロセッサの命令をCISC型プロセッサの命令に変換して実行することは可能である。また、RISC型プロセッサでも1クロックあたりの処理性能を高めるために、1命令で複雑な処理ができる命令が搭載されている。この場合、RISC型プロセッサの1命令は、CISC型プロセッサの複数の命令に変換することができる。
複数のオペランドパターンは、オペランドパターン13a,13b,13cを含む。オペランドパターン13a,13b,13cはそれぞれ、変換元のアセンブリ言語で使用される命令X1に含まれ得るオペランドの種類を示す。命令X1は複雑な演算を表す複合命令であってもよく、同じ命令X1であってもオペランドの種類が異なることがある。例えば、命令X1の命令長が異なることがある。また、例えば、命令X1のオペランドの個数が異なることがある。また、例えば、レジスタと主記憶の違いやレジスタの種類の違いのように、命令X1のオペランドが指し示す記憶領域の種類が異なることがある。また、例えば、128ビット、256ビット、512ビットのように、命令X1のオペランドが指し示すデータのデータ長が異なることがある。命令X1は、複数の単位データ(ワード)に対して同一種類の演算を並列に実行させるベクトル演算命令であってもよい。
図1の例では、オペランドパターン13aは、第2オペランドがレジスタを指しており、データ長が128ビットであることを示している。オペランドパターン13bは、第2オペランドがレジスタを指しており、データ長が256ビットであることを示している。オペランドパターン13cは、第2オペランドが主記憶の記憶領域を指しており、データ長が128ビットであることを示している。
変換先のアセンブリ言語または機械語で使用される複数の命令は、命令Y1,Y2,Y3,Y4,Y5を含む。命令Y1,Y2,Y3,Y4,Y5は、比較的単純な演算を表す単純命令である。例えば、命令Y1,Y2,Y3,Y4,Y5の命令長は同一である。また、例えば、2つのデータの間の演算を表す単純命令は、主記憶を指し示すオペランドを含まない。また、例えば、命令Y1,Y2,Y3,Y4,Y5のオペランドのデータ長は同一である。また、例えば、命令Y1,Y2,Y3,Y4,Y5はベクトル演算命令を含まない。
ここで、1つの複合命令と同等の演算を1つの単純命令で表現することは難しい。1つの複合命令と2以上の単純命令の組み合わせとが等価であることが多い。そこで、テーブルデータ13は、オペランドパターン13a,13b,13cそれぞれに対して、命令Y1,Y2,Y3,Y4,Y5のうちの2以上の命令を対応付ける。
テーブルデータ13は、例えば、オペランドパターン13a,13b,13cに対応する複数の行と、命令Y1,Y2,Y3,Y4,Y5に対応する複数の列とを含むマトリクス型データである。1つの行と1つの列の交点に、例えば、1つのフラグが配置される。フラグは、その行に対応するオペランドパターンをもつ命令X1の変換に、その列に対応する命令が使用されるか否かを示す。例えば、使用される場合にフラグ=1が記載される。テーブルデータ13は、例えば、変換プログラムを開発する開発者によって作成される。テーブルデータ13は、表計算ソフトウェアを用いて作成されてもよい。
図1の例では、オペランドパターン13aに命令Y2,Y5が対応付けられている。また、オペランドパターン13bに命令Y3,Y5が対応付けられている。また、オペランドパターン13cに命令Y1,Y2,Y5が対応付けられている。開発者は、セル(1,2),(1,5),(2,3),(2,5),(3,1),(3,2),(3,5)に「1」を記載することで、上記の対応関係を定義することができる。
処理部12は、テーブルデータ13に基づいて変換プログラム14を生成する。変換プログラム14は、変換元のアセンブリ言語で記述されたコード15を、変換先のアセンブリ言語または機械語で記述されたコード16に変換するためのソフトウェアである。コード15は、アセンブリコードである。コード16は、アセンブリコードまたは機械語コードである。処理部12は、例えば、変換プログラム14のソースコードを生成する。ソースコードは、C言語のような高水準プログラミング言語で記述されてもよい。
ここで、処理部12は、テーブルデータ13を解析し、テーブルデータ13に定義された対応関係に従って変換先のアセンブリ言語または機械語の命令が出力されるように、変換プログラム14を生成する。変換プログラム14は、コード15に含まれる命令X1のオペランドパターンを判定し、判定したオペランドパターンに対応付けられた2以上の命令を出力する処理を規定する。処理部12は、テーブルデータ13を横方向にスキャンして、特定の2以上の命令の組み合わせを出力する条件を決定し、決定した条件を満たすか否か判定する判定処理と当該2以上の命令の組み合わせを出力する出力処理とを実装してもよい。また、処理部12は、テーブルデータ13を縦方向にスキャンして、特定の1つの命令を出力する条件を決定し、決定した条件を満たすか否か判定する判定処理と当該1つの命令を出力する出力処理とを実装してもよい。
図1の例では、コード15に命令X1が含まれ、その命令X1に含まれるオペランドがオペランドパターン13cを満たす。テーブルデータ13では、オペランドパターン13cに対して命令Y1,Y2,Y5が対応付けられている。そこで、コード16に命令Y1,Y2,Y5が挿入される。なお、処理部12は、1つのオペランドパターンに対応付けられた2以上の命令が、テーブルデータ13の左側の列から右側の列に向かう順序で出力されるように、変換プログラム14を生成してもよい。この場合、テーブルデータ13は、変換後の命令の順序も表現している。
第1の実施の形態の情報処理装置10によれば、変換元のアセンブリ言語の命令X1のオペランドパターン13a,13b,13cと、変換先のアセンブリ言語または機械語の命令Y1,Y2,Y3,Y4,Y5との対応関係を示すテーブルデータ13が作成される。テーブルデータ13では、1つのオペランドパターンに対して2以上の命令の組み合わせが対応付けられる。そして、テーブルデータ13に基づいて、テーブルデータ13が示す対応関係に従って命令X1を変換する変換プログラム14が生成される。
これにより、変換プログラム14の開発者は、テーブルデータ13を用いて、変換プログラム14の仕様を効率的に定義することができる。そして、開発者は、テーブルデータ13を作成すれば、変換プログラム14のソースコードを手作業で記述しなくても変換プログラム14を実装することができる。よって、変換プログラム14の実装負担が軽減される。特に、CISC型の命令セットからRISC型の命令セットへの変換のように、多様なオペランドをもつ1つの複合命令が、オペランドに応じた単純命令の組み合わせに変換される場合において、変換プログラム14の実装負担が軽減される。
また、変換元の命令セットが拡張された際、開発者は、テーブルデータ13を拡張することで、変換プログラム14を手作業で修正しなくても、拡張された命令セットに対応する変換プログラム14を実装することができる。
例えば、テーブルデータ13が対象としているニーモニックが、新しいオペランドパターンと組み合わせることができるように命令セットが拡張されたとする。この場合、テーブルデータ13では、新しいオペランドパターンに対応する行を追加し、このオペランドパターンに応じた単純命令の組み合わせについて、追加した行にのみフラグを設定していけばよい。また、既存の命令Y1,Y2,Y3,Y4,Y5で変換対象の命令の処理に不足がある場合は、変換後命令の列を増やして対応すればよい。この際、既存のオペランドパターン13a,13b,13cと変換後命令との対応関係は変更されない(オペランドパターン13a,13b,13cの行は修正不要である)。したがって、もし新しいオペランドパターンに対して変換処理を追加する作業をするときに記述間違いが生じたとしても、新しいオペランドパターンに対してのみ不具合(変換間違い)を生じるに留まり、既存のオペランドパターンの変換処理に対して影響を与えない。すなわち、オペランドパターン毎に変換処理が正しいかを独立して確認でき、この点でも変換プログラム14の実装負担が軽減される。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
第2の実施の形態の情報処理装置は、ある命令セット(I命令セット)のアセンブリコードを別の命令セット(A命令セット)のアセンブリコードに変換するための変換プログラムを、テーブル形式データから生成する。また、第2の実施の形態の情報処理装置は、生成した変換プログラムを利用して、I命令セットの機械語コードをA命令セットの機械語コードに変換するプログラム移植を実行する。ただし、変換プログラムの生成と変換プログラムの実行を、異なる情報処理装置が行うことも可能である。第2の実施の形態の情報処理装置は、クライアント装置でもよいしサーバ装置でもよい。
図2は、第2の実施の形態の情報処理装置のハードウェア例を示す図である。
情報処理装置100は、CPU101、RAM102、HDD103、GPU104、入力インタフェース105、媒体リーダ106および通信インタフェース107を有する。情報処理装置100が有するこれらのユニットは、バスに接続されている。なお、情報処理装置100は、第1の実施の形態の情報処理装置10に対応する。CPU101は、第1の実施の形態の処理部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。CPU101は複数のプロセッサコアを備えてもよく、情報処理装置100は複数のプロセッサを備えてもよい。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に使用するデータを一時的に記憶する揮発性半導体メモリである。情報処理装置100は、RAM以外の種類のメモリを備えてもよく、複数のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性ストレージである。情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)など他の種類のストレージを備えてもよく、複数のストレージを備えてもよい。
GPU104は、CPU101と連携して画像を生成し、情報処理装置100に接続された表示装置111に画像を出力する。表示装置111として、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイ、プロジェクタなど、任意の種類の表示装置を使用することができる。情報処理装置100に、プリンタなど表示装置111以外の出力デバイスが接続されてもよい。
入力インタフェース105は、情報処理装置100に接続された入力デバイス112から入力信号を受け付ける。入力デバイス112として、マウス、タッチパネル、タッチパッド、キーボードなど、任意の種類の入力デバイスを使用することができる。情報処理装置100に複数種類の入力デバイスが接続されてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、半導体メモリなど、任意の種類の記録媒体を使用することができる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他の情報処理装置と通信する。通信インタフェース107は、スイッチやルータなどの有線通信装置に接続される有線通信インタフェースでもよいし、基地局やアクセスポイントなどの無線通信装置に接続される無線通信インタフェースでもよい。
次に、I命令セットをもつCPU用に開発されたユーザプログラムを、A命令セットをもつCPUに実行させるプログラム移植の流れを説明する。ユーザプログラムについて、移植元のCPU用の実行ファイルは存在するものの、高水準プログラミング言語で記述されたソースコードが存在しないことがある。その場合、移植元のCPU用の実行ファイルが、移植先のCPU用の実行ファイルに変換される。
図3は、プログラム移植のデータフロー例を示す図である。
情報処理装置100は、機械語コード131を取得する。機械語コード131は、I命令セットをもつCPUが解釈可能な機械語で記述されている。機械語コード131は、I命令セットのCPU用の実行ファイルに含まれる。また、情報処理装置100は、逆アセンブラ132を取得する。逆アセンブラ132は、I命令セットの機械語コードをI命令セットのアセンブリコードに変換するソフトウェアである。逆アセンブラ132は、例えば、CPUメーカーによって提供されている。
情報処理装置100は、機械語コード131を逆アセンブラ132に入力して、機械語コード131をアセンブリコード133に変換する。アセンブリコード133は、I命令セットのアセンブリ言語で記述されている。アセンブリ言語は、機械語命令の種類およびオペランドを文字列で表現して、可読性を向上させた低水準プログラミング言語である。I命令セットの機械語命令とI命令セットのアセンブリ命令とは、1対1に対応する。
情報処理装置100は、アセンブリコード133を変換プログラム134に入力して、アセンブリコード133をアセンブリコード135に変換する。アセンブリコード135は、A命令セットのアセンブリ言語で記述されている。A命令セットの機械語命令とA命令セットのアセンブリ命令とは、1対1に対応する。I命令セットはCISCに相当し、A命令セットはRISCに相当する。そのため、アセンブリコード133の1つの命令が、アセンブリコード135の2以上の命令に変換されることがある。
後述するように、情報処理装置100は、変換プログラム134を予め生成しておく。変換プログラムは、変換元のアセンブリ言語と変換先のアセンブリ言語との組み合わせ毎に用意される。情報処理装置100は、アセンブラ136を取得する。アセンブラ136は、A命令セットのアセンブリコードをA命令セットの機械語コードに変換するソフトウェアである。アセンブラ136は、例えば、CPUメーカーによって提供されている。
情報処理装置100は、アセンブリコード135をアセンブラ136に入力して、アセンブリコード135を機械語コード137に変換する。機械語コード137は、A命令セットをもつCPUが解釈可能な機械語で記述されている。機械語コード137は、A命令セットのCPU用の実行ファイルに含まれる。これにより、情報処理装置100は、I命令セット用の機械語コード131をA命令セット用の機械語コード137に変換できる。変換プログラム134の用途として、変換プログラム134を、逆アセンブラ132およびアセンブラ136と組み合わせて使用しなくてもよい。
図4は、変換前後のアセンブリコードの例を示す図である。
アセンブリコード141は、I命令セットのアセンブリ言語で記述されている。アセンブリコード141は、前述のアセンブリコード133に相当する。アセンブリコード142は、A命令セットのアセンブリ言語で記述されている。アセンブリコード142は、前述のアセンブリコード135に相当する。
I命令セットはCISCに相当する。そのため、アセンブリコード141は、複雑な演算を表す複合命令を含む。具体的には、アセンブリコード141は、mov,add,sub,vpmaxsdの4つの命令を含む。アセンブリコード141の第1命令は、64ビットのデータをレジスタに格納する命令である。アセンブリコード141の第4命令は、オペランド#1(xmm14)とオペランド#2(xmm15)を32ビット長のワード単位で比較し、大きい方のワードをオペランド#0(xmm0)に格納する命令である。オペランド#0,#1,#2は128ビットのデータ長をもつベクトルレジスタを表すオペランドであり、第4命令は4組のワードの比較および4つのワードの格納を実行させる。
これに対して、A命令セットはRISCに相当する。そのため、アセンブリコード142は、単純な演算を表す単純命令のみを含む。具体的には、アセンブリコード142は、アセンブリコード141よりも多い21個の命令を含む。7個の命令を含む命令グループ142aは、アセンブリコード141の第1命令に対応する。すなわち、アセンブリコード141の第1命令と同等な演算が、A命令セットの7個の命令で表現されている。これは、命令グループ142aでは、64ビット長をもつワードの格納が16ビット分ずつ4回に分けて実行されるためである。また、12個の命令を含む命令グループ142bは、アセンブリコード141の第4命令に対応する。すなわち、アセンブリコード141の第4命令と同等な演算が、A命令セットの12個の命令で表現されている。
アセンブリコード141において、rN(Nは0から15までの自然数)は、レジスタインデックスNである汎用レジスタを表す。アセンブリコード142において、xN(Nは0から30までの自然数)は、レジスタインデックスNである汎用レジスタを表す。SPはスタックポインタレジスタを表す。pN(Nは0から15までの自然数)は、レジスタインデックスNであるプレディケイトレジスタ(マスクレジスタ)を表す。zN(Nは0から31までの自然数)は、レジスタインデックスNであるベクトルレジスタを表す。
また、movはデータをコピーする命令を表す。addはデータの加算命令を表す。subはデータの減算命令を表す。orrはビット単位の論理和演算命令を表す。strは、データをメモリから読み出してレジスタにセットする命令を表す。ビット単位のnotは論理否定演算命令を表す。cmpgeは、2つのベクトルレジスタの各ワードを比較し、比較結果をプレディケイトレジスタにセットする命令を表す。cmpgtは、2つのベクトルレジスタの各ワードを比較し、比較結果をプレディケイトレジスタにセットする命令を表す。ldrは、レジスタに保存されているデータをメモリに書き込む命令を表す。
また、[x24]は、x24レジスタをアドレスレジスタとしてstr,ldr命令を実行することを表す。また、「.s」は、ベクトルレジスタやプレディケイトレジスタを32ビット長が1ワードであるデータを格納するものとして命令を実行することを表す。プレディケイトレジスタに続く「/m」と「/z」は、プレディケイトレジスタのフラグが有効であるワードのみ命令実行時に処理対象とすることを表す。「/m」は、フラグが無効であるワードについては命令実行前の値が保持されることを表す。「/z」は、フラグが無効であるワードについては命令の実行後、値が0クリアされることを表す。
図5は、変換プログラムの例を示す図である。
情報処理装置100は、アセンブリコード141をアセンブリコード142に変換することが可能な変換プログラム143を、予め作成しておく。変換プログラム143は、前述の変換プログラム134に相当する。
変換プログラム143が規定する変換処理は、変換元のアセンブリコードから命令を1つ読み出し、読み出した命令に含まれるニーモニックを抽出し、読み出した命令に含まれるオペランドを解析してオペランド情報を生成する。ニーモニックは、命令の中のオペランド以外の部分であり、add,sub,vpmaxsdといった命令の種類を表す。オペランド情報は、オペランドの解析結果を示しており、オペランドの特徴を表す。オペランド情報は、オペランドの個数、即値やレジスタや主記憶アドレスといった各オペランドの種類、各オペランドのデータ長、オプションの有無などの情報を含む。
変換プログラム143が規定する変換処理は、抽出したニーモニックに応じて異なる変換関数を呼び出す。変換プログラム143は、ニーモニック毎の変換関数を含む。例えば、変換プログラム143は、ニーモニックaddに対応する変換関数translateADD、ニーモニックsubに対応する変換関数translateSUB、ニーモニックvpmaxsdに対応する変換関数translateVPMAXSDを含む。変換処理は、変換関数を呼び出す際、上記のオペランド情報を引数に指定する。各変換関数は、引数として与えられたオペランド情報に応じた命令集合を出力する。ニーモニックが同じでも、オペランド情報が異なると異なる命令集合が出力され得る。
ここで、各変換関数の実装方法が問題となる。オペランドの種類と出力される命令との対応関係が複雑であることがあるため、開発者が各変換関数のソースコードを手作業で記述すると開発者の負担が大きい。また、開発者によるソースコードの記述ミスによって、変換関数に誤りが混入するリスクがある。そこで、情報処理装置100は、変換関数の実装を支援する。開発者は、以下に説明するパターンテーブルを用いて、変換関数の仕様を簡潔に記述する。情報処理装置100は、開発者が記述したパターンテーブルに基づいて、変換関数のソースコードを自動的に生成する。以下では、複数の変換関数のうち、変換関数translateVPMAXSDの実装例を説明する。
図6は、パターンテーブルの例を示す図である。
ニーモニック毎にパターンテーブルが用意される。パターンテーブル144は、ニーモニックvpmaxsdに対応するパターンテーブルである。パターンテーブル144は、変換関数translateVPMAXSDの仕様を示している。
パターンテーブル144は、複数の行と複数の列とを含む。開発者は、表計算ソフトウェアのユーザインタフェースを用いてパターンテーブル144を記述することができる。パターンテーブル144は、列名を示すタイトル行を含む。また、パターンテーブル144は、31通りのオペランドパターンに対応する31個の行を含む。
また、パターンテーブル144は、パターン番号を示すB列を含む。また、パターンテーブル144は、I命令セットの命令のフォーマットを示すE列を含む。また、パターンテーブル144は、オペランドパターンを規定する7個のオペランド条件を示すF,G,H,I,N,O,P列を含む。オペランド条件は、変換関数translateVPMAXSDの引数であるオペランド情報に含まれる情報である。
また、パターンテーブル144は、A命令セットの命令を出力するための36通りのソースコード記述を示す36個の列を含む。ソースコード記述を示す1つの列は、通常、A命令セットの1つの命令に対応する。36個の列のうちの一部の列が示す変換後命令を、パターンテーブル144の左側の列から右側の列に向かって出力すれば、適切な命令列になるように、これら36個の列が配置されている。そのため、36個の列の中には、同一内容の変換後命令を示す列が含まれている。
図6は、パターンテーブル144の全体のうち、一部の行および一部の列によって特定される一部分を表している。一部の行には、タイトル行およびパターン番号#1~#11の行が含まれる。一部の列には、パターン番号を示すB列、命令のフォーマットを示すE列、オペランド条件を示すF,G,H,I,N,O,P列、および、変換後命令を示す8個の列が含まれる。すなわち、図6は、パターンテーブル144の左上部分を表す。
F列は、オペランド#0の種類を示す。パターンテーブル144では、F列の値はREG0のみである。REG0は、1つ目のレジスタを表す。G列は、オペランド#1の種類を示す。パターンテーブル144では、G列の値はREG1のみである。REG1は、2つ目のレジスタを表す。H列は、オペランド#2の種類を示す。H列の値は、REG2またはMEM0である。REG2は、3つ目のレジスタを表す。MEM0は、主記憶領域を表す。I列は、オペランド#3の種類を示す。I列の値は、INVALID、REG3またはMEM0である。INVALIDは、オペランド#3が存在しないことを表す。REG3は、4つ目のレジスタを表す。MEM0は、主記憶領域を表す。
N列は、オペランド#0のデータ長(ビット幅)を示す。パターンテーブル144では、N列の値は128ビット、256ビットまたは512ビットである。O列は、マスク指定を示す。O列の値は、空欄、NO、ZEROまたはMERGである。空欄およびNOは、マスク無しを表す。マスク無しの場合、ベクトルレジスタ中の複数のワードの全てが演算対象に指定される。なお、128ビットのデータは4個の32ビット長のワードを含み、256ビットのデータは8個のワードを含み、512ビットのデータは16個のワードを含む。
ZEROは、マスク有りかつゼロ埋めを表す。MERGは、マスク有りかつデータ結合を表す。マスク有りの場合、複数のワードのうちの一部のワードのみが演算対象に指定される。ゼロ埋めの場合、指定されなかったワードの演算結果は、全てのビットが0のビット列になる。データ結合の場合、指定されなかったワードの演算結果は、演算結果を格納するレジスタに直前に存在するビット列を引き継ぐ。よって、データ結合は、前回の演算結果と今回の演算結果とを結合することを意味する。
なお、変換前命令は、省略可能オプションk,zを含むことがある。省略可能オプションkは、複数のワードのうち演算対象のワードを指定するオプションである。省略可能オプションkを含まない変換前命令は、マスク無しを意味する。省略可能オプションzは、ゼロ埋め指定を示すオプションである。マスク有りの場合に省略可能オプションzを含む変換前命令は、ゼロ埋め指定を意味する。マスク有りの場合に省略可能オプションzを含まない変換前命令は、データ結合指定を意味する。よって、O列の値は、変換前命令の省略可能オプションk,zから判定される。
P列は、ブロードキャスト指定を示す。P列の値は、空欄、0(ブロードキャスト無し)または1(ブロードキャスト有り)である。ブロードキャスト無しの場合、オペランド#2が示す複数のワードとオペランド#3が示す複数のワードとの間で、1対1の比較演算が行われる。ブロードキャスト有りの場合、オペランド#2が示す複数のワードとオペランド#3が示す1つのワードとの間で、多対1の比較演算が行われる。
変換後命令を示す36個の列の値は、空欄または1である。ただし、空欄に代えて0が記載されてもよい。これら36個の列の値は、1ビットのフラグであると言える。1つのオペランドパターンを示す行と1つの変換後命令を示す列との交点に位置するセルの値が空欄であることは、そのオペランドパターンをもつ変換前命令の変換に、その変換後命令が使用されないことを意味する。一方、セルの値が1であることは、そのオペランドパターンをもつ変換前命令の変換に、その変換後命令が使用されることを意味する。開発者は、パターンテーブル144の中の適切なセルに1を記入することで、変換関数translateVPMAXSDの仕様を定義することができる。
図7は、パターンテーブルの例を示す図(続き1)である。
図7は、パターンテーブル144の全体のうち、一部の行および一部の列によって特定される一部分を表している。一部の行には、図6と同様、タイトル行およびパターン番号#1~#11の行が含まれる。一部の列には、変換後命令を示す残りの28個の列が含まれる。すなわち、図7は、パターンテーブル144の右上部分を表す。
図8は、パターンテーブルの例を示す図(続き2)である。
図8は、パターンテーブル144の全体のうち、一部の行および一部の列によって特定される一部分を表している。一部の行には、パターン番号#12~#31の行が含まれる。一部の列には、図6と同様、パターン番号を示すB列、命令のフォーマットを示すE列、オペランド条件を示すF,G,H,I,N,O,P列、および、変換後命令を示す8個の列が含まれる。すなわち、図8は、パターンテーブル144の左下部分を表す。
図9は、パターンテーブルの例を示す図(続き3)である。
図9は、パターンテーブル144の全体のうち、一部の行および一部の列によって特定される一部分を表している。一部の行には、図8と同様、パターン番号#12~#31の行が含まれる。一部の列には、図7と同様、変換後命令を示す残りの28個の列が含まれる。すなわち、図9は、パターンテーブル144の右下部分を表す。
図10は、変換関数生成のデータフロー例を示す図である。
前述の通り、開発者は、ニーモニック毎にパターンテーブルを作成する。例えば、開発者は、ニーモニックvpmaxsdの仕様を表すパターンテーブル151aと、ニーモニックaddの仕様を表すパターンテーブル151bと、ニーモニックsubの仕様を表すパターンテーブル151cとを作成する。パターンテーブル151aは、前述のパターンテーブル144に相当する。情報処理装置100は、パターンテーブル151a,151b,151cを受け付け、パターンテーブル151a,151b,151cを生成ツール152に入力することで、ソースコード153a,153b,153cを生成する。
生成ツール152は、1つのパターンテーブルから1つの変換関数のソースコードを生成するソフトウェアである。変換関数のソースコードは、C言語といった高水準プログラミング言語で記述される。ソースコード153aは、変換関数translateVPMAXSDのソースコードであり、パターンテーブル151aから生成される。ソースコード153bは、変換関数translateADDのソースコードであり、パターンテーブル151bから生成される。ソースコード153cは、変換関数translateSUBのソースコードであり、パターンテーブル151cから生成される。
情報処理装置100は、変換プログラム本体のソースコードおよびソースコード153a,153b,153cを、プログラミング言語に応じたコンパイラを用いてコンパイルする。これにより、情報処理装置100は、変換関数154a,154b,154cを含む変換プログラム154を生成する。変換関数154aは、ニーモニックvpmaxsdに対応し、ソースコード153aから生成される。変換関数154bは、ニーモニックaddに対応し、ソースコード153bから生成される。変換関数154cは、ニーモニックsubに対応し、ソースコード153cから生成される。
変換プログラム154を生成した後、情報処理装置100は、I命令セットのアセンブリ言語で記述されたアセンブリコード155を受け付ける。情報処理装置100は、アセンブリコード155を入力データに指定して変換プログラム154を起動し、A命令セットのアセンブリ言語で記述されたアセンブリコード156を生成する。変換プログラム154の実行中、情報処理装置100は、アセンブリコード155から命令を抽出し、抽出した命令のニーモニックに対応する変換関数を呼び出す。呼び出された変換関数は、オペランド情報に基づいて適切な命令列を出力する。
次に、パターンテーブルから変換関数を生成する方法について説明する。
パターンテーブル144が示す対応関係を変換関数プログラムで表現する方法として、行優先方法および列優先方法がある。行優先方法では、変換関数プログラムは、31通りのオペランドパターンに対応する31個のブロックを含む。行優先方法では、情報処理装置100は、パターンテーブル144を横方向にスキャンして、パターンテーブル144の1つの行から変換関数プログラムの1つのブロックを生成する。一方、列優先方法では、変換関数プログラムは、36個のソースコード記述に対応する36個のブロックを含む。列優先方法では、情報処理装置100は、パターンテーブル144を縦方向にスキャンして、パターンテーブル144の1つの列から変換関数プログラムの1つのブロックを生成する。まず、行優先方法について説明する。
図11は、変換関数プログラムの第1の例を示す図である。
変換関数プログラム145は、変換関数translateVPMAXSDのソースコードであり、パターンテーブル144から行優先方法によって生成される。変換関数プログラム145は、ブロック145a,145bを含む。ブロック145aは、パターンテーブル144のパターン番号#1の行に対応する。ブロック145bは、パターンテーブル144のパターン番号#2の行に対応する。変換関数プログラム145は、パターン番号#3~#31の行に対応するブロックも含む。
ブロック145aは、引数であるオペランド情報が特定の実行条件を満たすか否か判定する条件判定文を含む。ブロック145aの実行条件は、パターンテーブル144におけるパターン番号#1の行のF,G,H,I,N列のオペランド条件を満たすことである。すなわち、ブロック145aの実行条件は、オペランド#0がREG0であり、オペランド#1がREG1であり、オペランド#2がREG2であり、オペランド#3がINVALIDであり、かつ、データ長が128ビットであることである。
また、ブロック145aは、A命令セットの命令を出力するための12個の実行文を含む。パターンテーブル144におけるパターン番号#1の行には、U,AD,AG,AH,AK,AN,AO,AU,AY,BC,BJ,BK列にフラグ=1が配置されている。そこで、ブロック145aは、これら12個の列の列名に相当する12個の実行文を含む。12個の実行文は、左側の列から右側の列の順に並べられる。
ブロック145bは、引数であるオペランド情報が特定の実行条件を満たすか否か判定する条件判定文を含む。ブロック145bの実行条件は、パターンテーブル144におけるパターン番号#2の行のF,G,H,I,N列のオペランド条件を満たすことである。すなわち、ブロック145bの実行条件は、オペランド#0がREG0であり、オペランド#1がREG1であり、オペランド#2がMEM0であり、オペランド#3がINVALIDであり、かつ、データ長が128ビットであることである。
また、ブロック145bは、A命令セットの命令を出力するための16個の実行文を含む。パターンテーブル144におけるパターン番号#2の行には、T,U,W,AA,AD,AG,AI,AK,AN,AU,AW,AZ,BC,BI,BJ,BK列にフラグ=1が配置されている。そこで、ブロック145bは、これら16個の列の列名に相当する16個の実行文を含む。16個の実行文は、左側の列から右側の列の順に並べられる。
このように、行優先方法では、パターンテーブル144の1行から変換関数プログラム145の1つのブロックが生成される。情報処理装置100は、31個のオペランドパターンに対応する31個のブロックを、互いに独立に生成することができる。各ブロックの条件判定文は、F,G,H,I,N,O,P列が示すオペランド条件から生成される。各ブロックの実行文は、「1」が記入されている列の列名から生成される。情報処理装置100は、複数の列名を、パターンテーブル144の左側の列から優先的に並べればよい。
図12は、変換関数プログラムのプレビュー例を示す図である。
情報処理装置100は、パターンテーブル144上で、変換関数プログラム145の各ブロックのプレビューを表示してもよい。図12の例では、パターンテーブル144のQ列に、ブロック145a,145bのプレビューが表示されている。プレビュー機能は、表計算ソフトウェアのユーザインタフェースを用いて実装することが可能である。その場合、表計算ソフトウェアは、開発者がフラグ=1を追加または削除したときに、リアルタイムにQ列のプレビューを更新する。これにより、情報処理装置100は、開発者によるパターンテーブル144の作成を支援することができる。例えば、パターンテーブルのセルQ1に次のような数式を記述しておけば、プレビュー機能を実現することができる。
=IF(T1<>"", $T0 & CHAR(10), "") & IF(U1<>"", $U0 & CHAR(10), "") & IF(W1<>"", $W0 & CHAR(10), "") & IF(Y1<>"", $Y0 & CHAR(10), "") & IF(Y1<>"", $Y0 & CHAR(10), "") … & IF(BK1<>"", $BK0, "")。
上記の数式は、1行目のT列のセルに0以外の値が記入されているとき、セルQ1にT列の先頭行に既述した文字列+改行文字を出力する。また、上記の数式は、1行目のU列のセルに0以外の値が記入されているとき、セルQ1にU列の先頭行に既述した文字列+改行文字を追加で出力する。また、上記の数式は、1行目のBK列のセルに0以外の値が記入されているとき、セルQ1にBK列の先頭行に既述した文字列を追加で出力する。
次に、列優先方法について説明する。開発者は、変換関数プログラムを行優先方法で生成するか列優先方法で生成するかを、情報処理装置100に対して指定してもよい。
図13は、変換関数プログラムの第2の例を示す図である。
変換関数プログラム146は、変換関数translateVPMAXSDのソースコードであり、パターンテーブル144から列優先方法によって生成される。変換関数プログラム146は、ブロック146a,146bを含む。ブロック146aは、パターンテーブル144のT列に対応する。ブロック146bは、パターンテーブル144のU列に対応する。変換関数プログラム146は、残りの34列に対応するブロックも含む。
ブロック146aは、引数であるオペランド情報が特定の実行条件を満たすか否か判定する条件判定文を含む。ブロック146aの実行条件は、オペランド情報が、パターンテーブル144の31通りのオペランドパターンのうち、T列が「1」である26通りのオペランドパターンの何れか1つに該当することである。26通りのオペランドパターンのオペランド条件が、論理和によって連結される。また、ブロック146aは、T列に対応する1つの実行文を含む。ブロック146aの実行文は、T列の列名である。
ブロック146bは、引数であるオペランド情報が特定の実行条件を満たすか否か判定する条件判定文を含む。ブロック146bの実行条件は、オペランド情報が、パターンテーブル144の31通りのオペランドパターンのうち、U列が「1」である23通りのオペランドパターンの何れか1つに該当することである。23通りのオペランドパターンのオペランド条件が、論理和によって連結される。また、ブロック146bは、U列に対応する1つの実行文を含む。ブロック146bの実行文は、U列の列名である。
このように、列優先方法では、パターンテーブル144の1列から変換関数プログラム146の1つのブロックが生成される。情報処理装置100は、36個の列に対応する36個のブロックを、互いに独立に生成することができる。情報処理装置100は、変換関数プログラム146において、36個のブロックを、パターンテーブル144の左側の列に対応するブロックから優先的に並べる。
ここで、列優先方法では、フラグ=1のオペランドパターンのオペランド条件を単純に論理和で結合した場合、各ブロックの条件判定文が大規模化してしまう。ただし、各ブロックの条件判定文には冗長な比較式が含まれており、簡略化すれば条件判定文が十分に小さくなる。一方、列優先方法では、各ブロックには1つの実行文のみが含まれており、変換関数プログラム中で同一の実行文が繰り返し出現することが抑制される。このため、列優先方法は行優先方法と比べて、条件判定文が簡略化されれば、変換関数プログラムのプログラム量を削減でき、高速な変換関数プログラムを生成できる。
条件判定文の簡略化は、変換関数プログラム146のソースコードをコンパイルする際に、コンパイラが最適化処理の中で自動的に行うことがある。また、情報処理装置100は、変換関数プログラム146のソースコードを生成する際に、数式処理ライブラリを用いて、論理式を簡略化する論理圧縮を条件判定文に対して実行してもよい。また、情報処理装置100は、以下に説明するような明示的な手順で条件判定文を簡略化してもよい。
図14は、オペランド条件の簡略化例を示す図である。
まず、情報処理装置100は、パターンテーブル144から、オペランド条件を示す列をカウントして列数Cを算出し、オペランドパターンを示す行をカウントして行数Rを算出する。情報処理装置100は、サイズC×Rの配列161(配列pattern)と、サイズCの配列162(配列flag)を生成する。
次に、情報処理装置100は、オペランド条件を示すF,G,H,I,N,O,P列をそれぞれスキャンし、列毎にユニークな値を列挙して配列161に登録する。配列161の要素(0,*)にはF列のユニークな値が登録される。よって、要素(0,0)=REG0である。要素(1,*)にはG列のユニークな値が登録される。よって、要素(1,0)=REG1である。要素(2,*)にはH列のユニークな値が登録される。よって、要素(2,0)=REG2、要素(2,1)=MEM0である。
また、配列161の要素(3,*)にはI列のユニークな値が登録される。よって、要素(3,0)=INVALID、要素(3,1)=REG3、要素(3,2)=MEM0である。要素(4,*)にはN列のユニークな値が登録される。よって、要素(4,0)=128、要素(4,1)=256、要素(4,2)=512である。要素(5,*)にはO列のユニークな値が登録される。よって、要素(5,0)=NO、要素(5,1)=ZERO、要素(5,2)=MERGである。要素(6,*)にはP列のユニークな値が登録される。よって、要素(6,0)=0、要素(6,1)=1である。
次に、情報処理装置100は、配列161に基づいて、オペランド条件を示すF,G,H,I,N,O,P列のうち、ユニークな値が1個のみである列を検出する。ユニークな値が1個のみのオペランド条件は、オペランドパターンの選択に影響を与えないため、無視することが可能である。情報処理装置100は、要素(*,1)が空である第1次元の要素番号を配列161から検索することで、ユニークな値が1個のみの列を検出できる。ここでは、F,G,H,I,N,O,P列のうちF,G列が、ユニークな値が1個のみの列である。情報処理装置100は、検出した列に対応する配列162の要素をfalseに更新する。なお、配列162の要素の初期値はtrueである。
次に、情報処理装置100は、配列162から値がtrueの要素の要素番号を抽出し、第1次元の要素番号が一致する要素を配列161から抽出する。情報処理装置100は、抽出した配列161の要素から、「列記号=値」という命題を生成して配列163(配列proposition)に登録する。
配列163の要素(2,0)は、命題「H列の値がREG2」である。要素(2,1)は、命題「H列の値がMEM0」である。要素(3,0)は、命題「I列の値がINVALID」である。要素(3,1)は、命題「I列の値がREG3」である。要素(3,2)は、命題「I列の値がMEM0」である。要素(4,0)は、命題「N列の値が128」である。要素(4,1)は、命題「N列の値が256」である。要素(4,2)は、命題「N列の値が512」である。要素(5,0)は、命題「O列の値がNO」である。要素(5,1)は、命題「O列の値がZERO」である。要素(5,2)は、命題「O列の値がMERG」である。要素(6,0)は、命題「P列の値が0」である。要素(6,1)は、命題「P列の値が1」である。
次に、情報処理装置100は、パターンテーブル144のF,G,H,I,N,O,P列のうち、命題が定義されたH,I,N,O,P列の値を、配列163の要素を示す命題記号に置換する。図14では、配列163の要素がP[*][*]と表記されている。これにより、パターンテーブル164が生成される。
パターン番号#1のH列の値はP[2][0]、I列の値はP[3][0]、N列の値はP[4][0]と置換されている。パターン番号#2のH列の値はP[2][1]、I列の値はP[3][0]、N列の値はP[4][0]と置換されている。パターン番号#3のH列の値はP[2][0]、I列の値はP[3][0]、N列の値はP[4][1]と置換されている。パターン番号#4のH列の値はP[2][1]、I列の値はP[3][0]、N列の値はP[4][1]と置換されている。
図15は、オペランド条件の簡略化例を示す図(続き)である。
次に、情報処理装置100は、変換後命令を示すT~BK列それぞれについて、パターンテーブル164に基づいて結合命題を生成する。このとき、情報処理装置100は、パターンテーブル164の行毎に、H,I,N,O,P列の命題記号を論理積で結合した結合命題を生成する。情報処理装置100は、各列の結合命題として、「1」が記載された行の結合命題を論理和で更に結合した命題を生成する。そして、情報処理装置100は、論理圧縮アルゴリズムを用いて、命題記号を用いた結合命題を簡略化する。
ここでは説明を簡単にするため、図15に示すように、パターンテーブル164が、パターン番号#1~#4の4つの行と、B,H,I,N,T列のみを含むものと仮定する。この場合、情報処理装置100は、パターン番号#1について、P[2][0]andP[3][0]andP[4][0]という結合命題を生成する。また、情報処理装置100は、パターン番号#2について、P[2][1]andP[3][0]andP[4][0]という結合命題を生成する。情報処理装置100は、パターン番号#3について、P[2][0]andP[3][0]andP[4][1]という結合命題を生成する。また、情報処理装置100は、パターン番号#4について、P[2][1]andP[3][0]andP[4][1]という結合命題を生成する。
T列には、パターン番号#2,#4の位置にフラグ=1が記載されている。そこで、情報処理装置100は、パターン番号#2,#4の結合命題を論理和で結合して、T列の結合命題165を生成する。結合命題165は、P[2][1]andP[3][0]andP[4][0]orP[2][1]andP[3][0]andP[4][1]である。
情報処理装置100は、結合命題165を簡略化して結合命題166を生成する。ここで、パターンテーブル164のI列には、命題P[3][0]しか出現しない(変換対象としているニーモニックは、オペランドパターンのうち、I列で指定されるパターンが必ず命題P[3][0]が成立するパターンしか入力されない)。このため、命題P[3][0]は結合命題165の結論に影響を与えておらず削除できる。また、パターンテーブル164のN列には命題P[4][0],P[4][1]しか出現しない。結合命題165に命題P[4][0],P[4][1]の両方が出現しているため、命題P[4][0],P[4][1]は削除できる。その結果、簡略化された結合命題166は、P[2][1]となる。
情報処理装置100は、結合命題166に含まれる命題記号を元の命題形式に戻す。これにより、結合命題166は「H列の値がMEM0」と変換される。情報処理装置100は、各命題を「列名==値」という形式の条件式に変換する。これにより、opName2==MEM0という条件判定文が生成される。情報処理装置100は、この条件判定文とT列の列名に相当する実行文とを含むブロック167を生成する。このようにして、情報処理装置100は、列優先方法で変換関数プログラムを生成することができる。
次に、情報処理装置100の機能および処理手順について説明する。
図16は、情報処理装置の機能例を示すブロック図である。
情報処理装置100は、テーブル記憶部121、変換関数記憶部122および実行ファイル記憶部123を有する。これらの記憶部は、例えば、RAM102またはHDD103の記憶領域を用いて実現される。また、情報処理装置100は、テーブル編集部124、変換関数生成部125および実行ファイル変換部126を有する。これらの処理部は、例えば、CPU101が実行するプログラムを用いて実現される。
テーブル記憶部121は、I命令セットに含まれるニーモニックそれぞれに対応するパターンテーブルを記憶する。変換関数記憶部122は、I命令セットに含まれるニーモニックそれぞれに対応する変換関数のソースコードを記憶する。また、変換関数記憶部122は、変換プログラムの本体のソースコードを記憶する。
また、変換関数記憶部122は、これらソースコードをコンパイルするためのコンパイラを記憶する。また、変換関数記憶部122は、コンパイル済みの変換プログラムを記憶する。また、変換関数記憶部122は、I命令セット用の逆アセンブラと、A命令セット用のアセンブラを記憶する。実行ファイル記憶部123は、変換前のI命令セットの実行ファイルと、変換後のA命令セットの実行ファイルを記憶する。
テーブル編集部124は、テーブル記憶部121に記憶されたパターンテーブルを表示装置111に表示する。テーブル編集部124は、入力デバイス112を用いた入力操作を受け付け、入力操作に応じてパターンテーブルを更新してテーブル記憶部121に保存する。テーブル編集部124は、表計算ソフトウェアを用いて実装されてもよい。
変換関数生成部125は、テーブル記憶部121から各ニーモニックに対応するパターンテーブルを読み出し、各ニーモニックに対応する変換関数のソースコードを生成して変換関数記憶部122に保存する。変換関数生成部125は、前述の行優先方法と列優先方法の何れか一方により、変換関数のソースコードを生成する。変換関数生成部125は、行優先方法と列優先方法の選択を示す入力操作を開発者から受け付けてもよい。
また、変換関数生成部125は、ニーモニックに応じた変換関数を呼び出す変換プログラム本体のソースコードを生成して、変換関数記憶部122に保存する。変換関数生成部125は、変換プログラム本体および変換関数のソースコードをコンパイラに入力して、コンパイル済みの変換プログラムを生成し、変換関数記憶部122に保存する。
実行ファイル変換部126は、変換対象のI命令セットの実行ファイルを指定する入力操作を受け付ける。すると、実行ファイル変換部126は、実行ファイル記憶部123からI命令セットの実行ファイルを読み出し、逆アセンブラに入力してI命令セットのアセンブリコードを生成する。実行ファイル変換部126は、変換関数記憶部122からコンパイル済みの変換プログラムを読み出し、I命令セットのアセンブリコードを入力に指定して変換プログラムを起動し、A命令セットのアセンブリコードを生成する。実行ファイル変換部126は、A命令セットのアセンブリコードをアセンブラに入力してA命令セットの実行ファイルを生成し、実行ファイル記憶部123に保存する。
図17は、変換関数生成の第1の手順例を示すフローチャートである。
ここでは、行優先方法による変換関数生成を説明する。
(S10)変換関数生成部125は、パターンテーブルからオペランドパターンを示す1行を選択する。ここで選択する行をi行(iは1以上の整数)と表現する。また、変換関数生成部125は、"if("という文字列を出力する。ただし、2つ目以降の行を選択する場合、変換関数生成部125は、"else if("という文字列を出力する。
(S11)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列(jは1以上の整数)と表現する。
(S12)変換関数生成部125は、パターンテーブルのセル(i,j)に値が存在するか判断する。セル(i,j)に値が存在する場合はステップS13に進み、セル(i,j)が空である場合はステップS14に進む。
(S13)変換関数生成部125は、パターンテーブルから、j列のタイトル行に記載された列名とセル(i,j)の値を抽出する。変換関数生成部125は、”[列名]==[セル(i,j)の値]&&”という文字列を出力する。
(S14)変換関数生成部125は、ステップS11において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS15に進み、未選択の列がある場合はステップS11に戻る。
(S15)変換関数生成部125は、"true){"という文字列を出力する。
(S16)変換関数生成部125は、パターンテーブルから変換後命令を示す1列を選択する。ここで選択する列をk列(kは1以上の整数)と表現する。
(S17)変換関数生成部125は、パターンテーブルのセル(i,k)の値が1であるか判断する。セル(i,k)の値が1である場合はステップS18に進み、セル(i,k)が空である場合はステップS19に進む。
(S18)変換関数生成部125は、パターンテーブルからk列のタイトル行に記載された列名を抽出する。この列名は、A命令セットの命令を生成するためのソースコード上の実行文に相当する。変換関数生成部125は、抽出した列名を出力する。
(S19)変換関数生成部125は、ステップS16において、変換後命令を示す全ての列を選択したか判断する。変換後命令を示す全ての列を選択した場合はステップS20に進み、未選択の列がある場合はステップS16に戻る。
(S20)変換関数生成部125は、"}"という文字列を出力する。
(S21)変換関数生成部125は、ステップS10において、オペランドパターンを示す全ての行を選択しかた判断する。オペランドパターンを示す全ての行を選択した場合は変換関数生成を終了し、未選択の行がある場合はステップS10に戻る。
図18は、変換関数生成の第2の手順例を示すフローチャートである。
ここでは、列優先方法による変換関数生成を説明する。
(S30)変換関数生成部125は、パターンテーブルからオペランドパターンを示す行をカウントして行数Rを算出する。また、変換関数生成部125は、パターンテーブルからオペランド条件を示す列をカウントして列数Cを算出する。
(S31)変換関数生成部125は、サイズCの配列flagを生成し、配列flagの各要素をtrueに初期化する。また、変換関数生成部125は、サイズC×Rの配列patternを生成し、配列patternの各要素を空に初期化する。なお、配列flagの要素番号は0以上C-1以下の整数である。配列patternの第1次元の番号は0以上C-1以下の整数、第2次元の番号は0以上R-1以下の整数である。
(S32)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列と表現する。
(S33)変換関数生成部125は、パターンテーブルのj列をスキャンし、j列のユニークな値を検出してpattern[j][*]に格納する。ユニークな値は、j列に出現する値のうち重複を排除した後の値である。pattern[j][*]は、配列patternの要素のうち第1次元の番号がjの要素である。このとき、変換関数生成部125は、第2次元の番号が小さい要素から優先的にユニークな値を埋めていく。
(S34)変換関数生成部125は、ステップS32において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS35に進み、未選択の列がある場合はステップS32に戻る。
(S35)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列と表現する。
(S36)変換関数生成部125は、配列patternに基づいて、j列のユニークな値が1個のみであるか判断する。例えば、変換関数生成部125は、pattern[j][1]が空であるか判断する。pattern[j][1]が空の場合、j列のユニークな値は1個のみである。pattern[j][1]が空でない場合、j列のユニークな値は2個以上存在する。j列のユニークな値が1個のみの場合はステップS37に進み、j列のユニークな値が2個以上ある場合はステップS38に進む。
(S37)変換関数生成部125は、flag[j]をfalseに更新する。
(S38)変換関数生成部125は、ステップS35において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS39に進み、未選択の列がある場合はステップS35に戻る。
図19は、変換関数生成の第2の手順例を示すフローチャート(続き1)である。
(S39)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列と表現する。
(S40)変換関数生成部125は、flag[j]がtrueであるか判断する。trueの場合はステップS41に進み、falseの場合はステップS42に進む。
(S41)変換関数生成部125は、空でないpattern[j][*]それぞれについて、j列を示す列記号とpattern[j][*]に格納された条件値を特定し、「[列記号]の値が[条件値]である」という命題を生成する。変換関数生成部125は、生成した命題をproposition[j][*]に格納する。proposition[j][*]の第2次元の番号は、pattern[j][*]と同じとする。
(S42)変換関数生成部125は、ステップS39において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS43に進み、未選択の列がある場合はステップS39に戻る。
(S43)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列と表現する。
(S44)変換関数生成部125は、flag[j]がtrueであるか判断する。trueの場合はステップS45に進み、falseの場合はステップS46に進む。
(S45)変換関数生成部125は、パターンテーブルのセル(i,j)の値を、proposition[j][*]の命題を指し示す命題記号に置換する。
(S46)変換関数生成部125は、ステップS43において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS47に進み、未選択の列がある場合はステップS43に戻る。
図20は、変換関数生成の第2の手順例を示すフローチャート(続き2)である。
(S47)変換関数生成部125は、パターンテーブルから変換後命令を示す1列を選択する。ここで選択する列をk列と表現する。また、変換関数生成部125は、結合命題という文字列変数を定義し、結合命題を空に初期化する。
(S48)変換関数生成部125は、パターンテーブルからオペランドパターンを示す1行を選択する。ここで選択する行をi行と表現する。また、変換関数生成部125は、tmp結合命題という文字列変数を定義し、tmp結合命題を空に初期化する。
(S49)変換関数生成部125は、パターンテーブルのセル(i,k)の値が1であるか判断する。セル(i,k)の値が1である場合はステップS50に進み、セル(i,k)が空である場合はステップS55に進む。
(S50)変換関数生成部125は、パターンテーブルからオペランド条件を示す1列を選択する。ここで選択する列をj列と表現する。
(S51)変換関数生成部125は、flag[j]がtrueであるか判断する。trueの場合はステップS52に進み、falseの場合はステップS53に進む。
(S52)変換関数生成部125は、パターンテーブルからセル(i,j)の値を抽出し、tmp結合命題とセル(i,j)の値との論理積を示す新たな命題を生成する。変換関数生成部125は、生成した命題をtmp結合命題に代入する。
(S53)変換関数生成部125は、ステップS50において、オペランド条件を示す全ての列を選択したか判断する。オペランド条件を示す全ての列を選択した場合はステップS54に進み、未選択の列がある場合はステップS50に戻る。
(S54)変換関数生成部125は、結合命題とtmp結合命題との論理和を示す新たな命題を生成する。変換関数生成部125は、生成した命題を結合命題に代入する。
(S55)変換関数生成部125は、ステップS48において、オペランドパターンを示す全ての行を選択したか判断する。オペランドパターンを示す全ての行を選択した場合はステップS56に進み、未選択の行がある場合はステップS48に戻る。
(S56)変換関数生成部125は、結合命題を簡略化する。変換関数生成部125は、論理圧縮アルゴリズムが実装された数式処理ライブラリを利用してもよい。
(S57)変換関数生成部125は、パターンテーブルからk列のタイトル行に記載された列名を抽出する。変換関数生成部125は、”if([結合命題]){[列名]}”という文字列を出力する。
(S58)変換関数生成部125は、ステップS47において、変換後命令を示す全ての列を選択したか判断する。変換後命令を示す全ての列を選択した場合は変換関数生成を終了し、未選択の列がある場合はステップS47に戻る。
図21は、実行ファイル変換の手順例を示すフローチャートである。
(S60)実行ファイル変換部126は、変換対象に指定されたI命令セットの実行ファイルを実行ファイル記憶部123から読み出す。
(S61)実行ファイル変換部126は、I命令セット用の逆アセンブラを用いて、I命令セットの実行ファイルからI命令セットのアセンブリコードを生成する。
(S62)実行ファイル変換部126は、ステップS61で生成したアセンブリコードから1命令を選択する。ここで選択する命令をI命令と表現する。
(S63)実行ファイル変換部126は、I命令からニーモニックを抽出する。ニーモニックは、addやsubといった命令の種類を示す文字列である。
(S64)実行ファイル変換部126は、I命令からオペランドを抽出して解析する。オペランドは、ニーモニックに続く文字列である。実行ファイル変換部126は、オペランド数やデータ長といったオペランドの特徴を示すオペランド情報を生成する。
(S65)実行ファイル変換部126は、ステップS64で生成したオペランド情報を引数に指定して、ステップS63で抽出したニーモニックに対応する変換関数を呼び出す。実行ファイル変換部126は、変換関数からの戻り値としてA命令セットの命令を取得する。ここで取得する命令をA命令と表現する。実行ファイル変換部126は、1個のA命令のみを取得することもあるし、2個以上のA命令を取得することもある。
(S66)実行ファイル変換部126は、変換後のA命令セットのアセンブリコードの末尾に、ステップS65で取得したA命令を追加する。
(S67)実行ファイル変換部126は、ステップS62において、I命令セットのアセンブリコードに含まれる全ての命令を選択したか判断する。全ての命令を選択した場合はステップS68に進み、未選択の命令がある場合はステップS62に戻る。
(S68)実行ファイル変換部126は、A命令セット用のアセンブラを用いて、A命令セットのアセンブリコードからA命令セットの実行ファイルを生成する。実行ファイル変換部126は、A命令セットの実行ファイルを実行ファイル記憶部123に保存する。
第2の実施の形態の情報処理装置100によれば、I命令セットをもつプロセッサ用の実行ファイルが、A命令セットをもつプロセッサ用の実行ファイルに変換される。よって、既存プログラムのソースコードが存在しない場合でも、既存プログラムを異なる計算環境で再利用することが可能となる。また、開発者が作成したパターンテーブルから、アセンブリコードを変換するための変換プログラムが自動的に生成される。よって、開発者が手作業で変換プログラムを実装する場合と比べて、開発者の実装負担が軽減される。また、作業ミスによって変換プログラムに誤りが混入するリスクが低減される。
特に、CISC型命令セットからRISC型命令セットへの変換は、変換前の1つの命令が、オペランドの種類に応じて異なる命令集合に変換されるという複雑さをもつ。この点、変換プログラムの自動生成によって開発者の実装負担が軽減される。また、パターンテーブルは、オペランドパターンに対応する行と変換後命令に対応する列とを含み、行と列の交点にフラグを記入するための記入欄を含むユーザインタフェースをもつ。また、複数の変換後命令に対応する複数の列は、実行される順序に従って左から右に並んでいる。よって、開発者は、パターンテーブルに「1」などのフラグを記入するだけで、変換関数の仕様を効率的に定義することができる。
また、変換元の命令セットが拡張された場合、開発者は、新しいオペランドパターンに対応する行をパターンテーブルに追加することで、変換プログラムを修正することができる。よって、開発者が手作業で変換プログラムを修正する場合と比べて、開発者の作業負担が軽減される。また、新しいオペランドパターンに対応する行の記載は、既存のオペランドパターンについての変換関数の仕様に影響を与えない。このため、変換プログラムに修正ミスが生じるリスクを低減できる。また、開発者は、仕様が確定したオペランドパターンから段階的にパターンテーブルを記述していくことができる。
また、パターンテーブルのプレビュー機能を利用することで、開発者は、生成される変換プログラムのソースコードをリアルタイムに確認しながら、パターンテーブルを編集することができる。これにより、開発者の作業効率が向上する。また、列優先方法の採用および条件判定文の簡略化により、サイズの小さい効率的な変換プログラムが生成される。
[第3の実施の形態]
次に、第3の実施の形態を説明する。前述の第2の実施の形態との違いを中心に説明し、第2の実施の形態と同様の内容については説明を省略することがある。
変換先のA命令セットは、オペランドに指定されるデータのデータ長がCPUによって異なるSIMD(Single Instruction Multiple Data)命令を含むことがある。SIMD命令は、加算などの同種の演算を複数の単位データに対して並列に実行する並列処理命令である。SIMD命令のオペランドのデータ長は、ベクトル長と呼ばれることがある。
CPUがサポートするベクトル長は、SIMD命令のデータを格納するSIMDレジスタのサイズによって決まる。一方、A命令セットは、組み込みデバイス用CPUやサーバ装置用CPUなど、様々な用途のCPUに使用され得る。そこで、A命令セットは、あるSIMD命令について、CPU実装者がベクトル長を選択することを許容している。このSIMD命令は、CPU依存または実装依存のSIMD命令であると言える。
例えば、A命令セットは、CPU依存のSIMD命令をサポートしないことを許容する。また、A命令セットは、CPU依存のSIMD命令のベクトル長を、128,256,384,512,640,768,896,1024,1152,1280,1408,1536,1664,1792,1920,2048ビットの中から選択することを許容する。第3の実施の形態では、サポートなし、128ビット、256ビット、512ビットの4通りのCPU実装の例を挙げる。
ここで、変換後のアセンブリコードにCPU依存のSIMD命令を利用する場合、情報処理装置は、ベクトル長の異なるCPUが異なる命令セットをもつとみなして、第2の実施の形態の方法を実行することも考えられる。この場合、情報処理装置は、ベクトル長毎にパターンテーブルを作成して変換プログラムを生成する。また、情報処理装置は、変換先のCPUのベクトル長の指定を受け付け、指定されたベクトル長に対応する変換プログラムを用いて、A命令セットのアセンブリコードを生成する。
しかし、ベクトル長のみが異なるA命令セットのアセンブリコードは互いに類似し、そのようなアセンブリコードを生成するためのパターンテーブルおよび変換プログラムも互いに類似する。そのため、ベクトル長毎にパターンテーブルを作成することは非効率であり、パターンテーブルの作成負担や保守負担が増大する。そこで、第3の実施の形態では、1つのパターンテーブルが、ベクトル長の異なる複数のCPUをカバーする。また、第3の実施の形態の情報処理装置は、このパターンテーブルから、ベクトル長の異なる複数のCPUをカバーする変換プログラムを生成する。
第3の実施の形態の情報処理装置は、図2,16に示した第2の実施の形態の情報処理装置100と同様のモジュール構造によって実現される。そこで、以下では第3の実施の形態を、図2,16と同じ符号を用いて説明する。
図22は、ベクトル長の異なる命令セットの例を示す図である。
I命令セット211は、変換元のCPUがもつ命令セットである。I命令セット211は、CPU依存のSIMD命令を含まない。A命令セット212~215は、変換先のCPUの候補がもつ命令セットである。A命令セット212~215は、ベクトル長が異なる複数のCPUに対応する。A命令セット212は、CPU依存のSIMD命令を含まない。A命令セット213~215は、CPU依存のSIMD命令を含む。A命令セット213は、128ビットのベクトル長に対応する。A命令セット214は、256ビットのベクトル長に対応する。A命令セット215は、512ビットのベクトル長に対応する。
I命令セット211は、スカラ命令221、SIMDi1命令222、SIMDi2命令223およびSIMDi3命令224を含む。スカラ命令221は、64ビットの単位データ1個に対する加算、減算、乗算などの演算を示す単純命令である。SIMDi1命令222は、64ビットの単位データ2個、すなわち、128ビットのデータの演算を示す並列処理命令である。SIMDi2命令223は、64ビットの単位データ4個、すなわち、256ビットのデータの演算を示す並列処理命令である。SIMDi3命令224は、64ビットの単位データ8個、すなわち、512ビットのデータの演算を示す並列処理命令である。SIMDi1命令222、SIMDi2命令223およびSIMDi3命令224のデータ長は、CPUによらず固定である。
A命令セット212は、スカラ命令231およびSIMDa1命令232を含む。スカラ命令231は、64ビットの単位データ1個の演算を示す単純命令である。SIMDa1命令232は、64ビットの単位データ2個、すなわち、128ビットのデータの演算を示す並列処理命令である。SIMDa1命令232のデータ長は、CPUによらず固定である。A命令セット212をもつCPUは、128ビットのSIMDレジスタを含む。
A命令セット213は、スカラ命令231、SIMDa1命令232およびSIMDa2命令233を含む。SIMDa2命令233は、64ビットの単位データ2個、すなわち、128ビットのデータの演算を示す並列処理命令である。A命令セット213をもつCPUは、128ビットのSIMDレジスタを含む。
A命令セット214は、スカラ命令231、SIMDa1命令232およびSIMDa2命令234を含む。SIMDa2命令234は、64ビットの単位データ4個、すなわち、256ビットのデータの演算を示す並列処理命令である。A命令セット214をもつCPUは、256ビットのSIMDレジスタを含む。
A命令セット215は、スカラ命令231、SIMDa1命令232およびSIMDa2命令235を含む。SIMDa2命令235は、64ビットの単位データ8個、すなわち、512ビットのデータの演算を示す並列処理命令である。A命令セット215をもつCPUは、512ビットのSIMDレジスタを含む。SIMDa2命令233,234,235は、ベクトル長がCPUによって異なるCPU依存命令に相当する。
情報処理装置100は、I命令セット211のアセンブリコードを、A命令セット212~215のうちの何れか1つのA命令セットのセンブリコードに変換する。I命令セット211からA命令セット212への変換では、情報処理装置100は、スカラ命令221をスカラ命令231に変換し、SIMDi1命令222をSIMDa1命令232に変換する。SIMDi2命令223およびSIMDi3命令224は、SIMDレジスタのサイズが不足するため変換対象外である。
同様に、I命令セット211からA命令セット213への変換では、情報処理装置100は、スカラ命令221をスカラ命令231に変換し、SIMDi1命令222をSIMDa1命令232に変換する。SIMDi2命令223およびSIMDi3命令224は、SIMDレジスタのサイズが不足するため変換対象外である。
I命令セット211からA命令セット214への変換では、情報処理装置100は、スカラ命令221をスカラ命令231に変換し、SIMDi1命令222をSIMDa1命令232に変換し、SIMDi2命令223をSIMDa2命令234に変換する。SIMDi3命令224は、SIMDレジスタのサイズが不足するため変換対象外である。
I命令セット211からA命令セット214への変換では、情報処理装置100は、スカラ命令221をスカラ命令231に変換し、SIMDi1命令222をSIMDa1命令232に変換する。また、情報処理装置100は、SIMDi2命令223およびSIMDi3命令224を、SIMDa2命令235に変換する。
A命令セット215は256ビットのSIMD命令を含まないため、256ビット演算が、512ビットのSIMD命令を利用して実行される。このとき、512ビットのSIMDレジスタの中の下位256ビットの演算結果のみが意味をもち、上位256ビットの演算結果は意味をもたない。そこで、演算の同等性を確保するため、上位256ビットの演算結果を破棄する(例えば、ゼロに置換する)という付随的処理が行われる。
図23は、SIMDレジスタの使用例を示す図である。
SIMDレジスタ241は、I命令セット211をもつCPUに含まれる。SIMDレジスタ241は512ビットのサイズをもち、64ビットの単位データを8個保持する。SIMDレジスタ241は、SIMDi1命令222、SIMDi2命令223およびSIMDi3命令224から共通に使用される。なお、スカラ命令221は、64ビットの通常レジスタを使用する。
SIMDi1命令222は、SIMDレジスタ241の下位128ビットを使用する。このとき、上位384ビットは無効になるように自動的に制御される。SIMDi2命令223は、SIMDレジスタ241の下位256ビットを使用する。このとき、上位256ビットは無効になるように自動的に制御される。SIMDi3命令223は、SIMDレジスタ241の512ビット全体を使用する。
SIMDレジスタ242は、A命令セット212をもつCPUに含まれる。SIMDレジスタ242は128ビットのサイズをもち、64ビットの単位データを2個保持する。SIMDa1命令232は、SIMDレジスタ242の128ビット全体を使用する。なお、スカラ命令231は、64ビットの通常レジスタを使用する。
SIMDレジスタ243は、A命令セット213をもつCPUに含まれる。SIMDレジスタ243は128ビットのサイズをもち、64ビットの単位データを2個保持する。SIMDレジスタ243は、SIMDa1命令232およびSIMDa2命令233から共通に使用される。SIMDa1命令232およびSIMDa2命令233は、SIMDレジスタ243の128ビット全体を使用する。
SIMDレジスタ244は、A命令セット214をもつCPUに含まれる。SIMDレジスタ244は256ビットのサイズをもち、64ビットの単位データを4個保持する。SIMDレジスタ244は、SIMDa1命令232およびSIMDa2命令234から共通に使用される。SIMDa1命令232は、SIMDレジスタ244の下位128ビットを使用する。このとき、上位128ビットは無効になるように自動的に制御される。SIMDa2命令234は、SIMDレジスタ244の256ビット全体を使用する。
SIMDレジスタ245は、A命令セット215をもつCPUに含まれる。SIMDレジスタ245は512ビットのサイズをもち、64ビットの単位データを8個保持する。SIMDレジスタ245は、SIMDa1命令232およびSIMDa2命令235から共通に使用される。SIMDa1命令232は、SIMDレジスタ245の下位128ビットを使用する。このとき、上位384ビットは無効になるように自動的に制御される。SIMDa2命令235は、SIMDレジスタ245の512ビット全体を使用する。
SIMDi2命令223をSIMDa2命令235に変換する場合、SIMDレジスタ245の上位256ビットは自動的には無効にならない。そこで、情報処理装置100は、SIMDレジスタ245の上位256ビットにゼロを代入するようなアセンブリコードを生成する。なお、図22で説明した他の変換パターンでは、変換前後の命令のベクトル長が同一であるため、上位ビットへのゼロ代入は不要である。
図24は、ベクトル長の異なる命令セットの命令への変換例を示す図である。
テーブル251は、I命令セット211のvaddps命令と同等なA命令セット212~215のアセンブリコードを示している。vaddps命令は、並列に加算を行うSIMD命令である。vaddps命令は、第2オペランドと第3オペランドの和を第1オペランドに格納する。vaddps命令のオペランドパターンは、ベクトル長と、第3オペランドがメモリアドレスか否かに応じて、6通りに分類される。
ベクトル長が128ビットであり、第3オペランドが演算対象データである場合、このvaddps命令はSIMDi1命令222に相当する。A命令セット215の同等なアセンブリコードは、SIMDa1命令232を用いて128ビットの加算を行う。A命令セット212~214のアセンブリコードも同様である。
ベクトル長が128ビットであり、第3オペランドがメモリアドレスである場合、このvaddps命令はSIMDi1命令222に相当する。A命令セット215の同等なアセンブリコードは、あるSIMDレジスタの64バイト(512ビット)のデータをスタック領域に退避し、メモリアドレスが示すデータをメモリから上記SIMDレジスタにロードする。アセンブリコードは、SIMDa1命令232を用いて128ビットの加算を行い、退避されたデータをスタック領域から上記SIMDレジスタに戻す。
A命令セット214の同等なアセンブリコードは、A命令セット215の場合と基本的には同様である。ただし、スタック領域に退避するデータが、32バイト(256ビット)である。A命令セット212,213の同等なアセンブリコードも、A命令セット215の場合と基本的には同様である。ただし、スタック領域に退避するSIMDレジスタのデータが、16バイト(128ビット)である。
ベクトル長が256ビットであり、第3オペランドが演算対象データである場合、このvaddps命令はSIMDi2命令223に相当する。A命令セット215の同等なアセンブリコードは、SIMDa2命令235を用いて512ビットの加算を行い、演算結果を格納するSIMDレジスタの上位256ビットにゼロを代入する。命令セット214の同等なアセンブリコードは、SIMDa2命令234を用いて256ビットの加算を行う。演算結果を格納するSIMDレジスタへのゼロ代入は不要である。
ベクトル長が256ビットであり、第3オペランドがメモリアドレスである場合、このvaddps命令はSIMDi2命令223に相当する。A命令セット215の同等なアセンブリコードは、あるSIMDレジスタの64バイトのデータをスタック領域に退避し、メモリアドレスが示すデータをメモリから上記SIMDレジスタにロードする。アセンブリコードは、SIMDa2命令235を用いて512ビットの加算を行い、演算結果を格納するSIMDレジスタの上位256ビットにゼロを代入し、退避されたデータをスタック領域からオペランドのSIMDレジスタに戻す。A命令セット214の同等なアセンブリコードは、スタック領域に退避するデータが32バイトである点と、SIMDレジスタへのゼロ代入が不要である点が、A命令セット215の場合と異なる。
ベクトル長が512ビットであり、第3オペランドが演算対象データである場合、このvaddps命令はSIMDi3命令224に相当する。A命令セット215の同等なアセンブリコードは、SIMDa2命令235を用いて512ビットの加算を行う。
ベクトル長が512ビットであり、第3オペランドがメモリアドレスである場合、このvaddps命令はSIMDi3命令224に相当する。A命令セット215の同等なアセンブリコードは、あるSIMDレジスタの64バイトのデータをスタック領域に退避し、メモリアドレスが示すデータをメモリから上記SIMDレジスタにロードする。アセンブリコードは、SIMDa2命令235を用いて512ビットの加算を行い、退避されたデータをスタック領域から上記SIMDレジスタに戻す。
このように、ベクトル長が異なるCPU用のアセンブリコードは、互いに類似するものの同一でないことがある。そこで、情報処理装置100は、第2の実施の形態で説明したパターンテーブルを拡張して、ベクトル長の違いの影響を表現する。
図25は、パターンテーブルの第1の変形例を示す図である。
パターンテーブル252は、第2の実施の形態のパターンテーブル144と同様に、複数のオペランドパターンに対応する複数の行を含む。また、パターンテーブル252は、オペランドパターンを記述する列と、A命令セットの複数の命令に対応する複数の列とを含む。A命令セットの命令に対応する列の列名には、変換関数プログラムにおいてA命令セットの命令を出力するためのステートメント(文)が含まれる。
更に、第3の実施の形態のパターンテーブル252は、列名を記述する行と複数のオペランドパターンに対応する複数の行との間に、ベクトル長とA命令セットの命令との対応関係を示すCPU依存情報を記述する行を含む。CPU依存情報を記述する行として、パターンテーブル252は、なし,128ビット,256ビット,512ビットに対応する4つの行を含む。CPU依存情報は、各ベクトル長について、A命令セットの複数の命令それぞれが有効か否かを示すフラグを含む。例えば、有効である場合はフラグとして「1」が記述され、無効である場合は何も記述されない。
変換関数プログラムの使用時に、変換先のCPUのベクトル長がユーザから指定される。指定されたベクトル長にとって有効な命令は、オペランドパターンに対応する行に「1」が記述されていれば出力される。一方、指定されたベクトル長にとって無効な命令は、オペランドパターンに対応する行に「1」が記述されていても出力されない。よって、CPU依存情報は、A命令セットの命令に対するフィルタとして機能する。これにより、特定のベクトル長をもつCPUのために使用される命令が出力され得る。
図26は、パターンテーブルの第1の変形例を示す図(続き)である。
パターンテーブル252は、第2の実施の形態のパターンテーブル144と同様に、変換関数プログラムのソースコードのプレビューを示す列を含む。全てのベクトル長にとって有効な命令を出力するステートメントは、そのままソースコードに挿入される。一方、一部のベクトル長にのみ有効な命令を出力するステートメントは、ベクトル長を判定する条件分岐文が付加された上でソースコードに挿入される。
パターンテーブル252の末尾から2番目の列が示す命令は、なし,128ビット,256ビット,512ビットのうち、ベクトル長が512ビットのCPUにのみ有効な命令である。また、この命令は、3番目と4番目のオペランドパターンに使用される。そこで、3番目のオペランドパターンに対応するソースコードは、指定のベクトル長が512ビットか判定し、512ビットの場合に上記命令を出力するステートメントを含む。同様に、4番目のオペランドパターンに対応するソースコードは、指定のベクトル長が512ビットか判定し、512ビットの場合に上記命令を出力するステートメントを含む。
図27は、変換関数生成の第3の手順例を示すフローチャートである。
ここでは、行優先方法による変換関数生成の例を説明する。第2の実施の形態で説明した列優先方法によって変換関数を生成することも可能である。
(S70)変換関数生成部125は、パターンテーブル252からオペランドパターンに対応する1行を選択する。ここで選択する行をi行(iは1以上の整数)と表現する。
(S71)変換関数生成部125は、図17のステップS11~S15と同様の方法によって、オペランド条件を判定する条件判定文を出力する。
(S72)変換関数生成部125は、パターンテーブル252から変換後命令に対応する1列を選択する。ここで選択する列をk列(kは1以上の整数)と表現する。
(S73)変換関数生成部125は、k列のisNoVectorからisVector512までの間のTrueフラグ(値が1のフラグ)の個数をカウントする。カウントの最小値は0であり、カウントの最大値は4である。
(S74)変換関数生成部125は、パターンテーブル252のセル(i,k)の値が1であるか判断する。セル(i,k)の値が1である場合はステップS75に処理が進み、セル(i,k)の値が1でない場合はステップS78に処理が進む。
(S75)変換関数生成部125は、ステップS73のカウントが4であるか判断する。カウントが4である場合、すなわち、選択された命令が全てのベクトル長にとって有効な場合、ステップS77に処理が進む。カウントが4でない場合、すなわち、選択された命令が一部のベクトル長にとって無効である場合、ステップS76に処理が進む。
(S76)変換関数生成部125は、Trueフラグに応じた条件分岐文を出力する。この条件分岐文の判定条件は、isNoVector,isVector128,isVector256,isVector512のうち、フラグが1であるものを論理和で結合した論理式である。例えば、isNoVectorとisVector128のフラグが1の場合、判定条件は、isNoVector||isVector128である。
(S77)変換関数生成部125は、パターンテーブル252からk列の列名を抽出する。変換関数生成部125は、抽出した列名を出力する。
(S78)変換関数生成部125は、ステップS72において変換後命令に対応する全ての列を選択したか判断する。全ての列を選択した場合はステップS79に処理が進み、未選択の列がある場合はステップS72に処理が戻る。
(S79)変換関数生成部125は、ステップS70においてオペランドパターンに対応する全ての行を選択したか判断する。全ての行を選択した場合は変換関数生成が終了し、未選択の行がある場合はステップS70に処理が戻る。
実行ファイル変換については、図21に示した第2の実施の形態のフローチャートと同様の手順によって実行できる。ただし、第3の実施の形態の実行ファイル変換では、情報処理装置100は、ユーザから対象CPUのベクトル長の指定を受け付ける。情報処理装置100は、変換関数を呼び出す際にベクトル長を指定する。
第3の実施の形態の情報処理装置100によれば、第2の実施の形態と同様の効果が得られる。更に、情報処理装置100は、CPUによってベクトル長が異なるSIMD命令を利用して、A命令セットのアセンブリコードや機械語コードを生成する。よって、情報処理装置100は、A命令セットをもつ様々なCPUをカバーすることができる。
また、情報処理装置100は、複数のベクトル長のための変換規則を、単一のパターンテーブルによって定義する。よって、ベクトル長毎にパターンテーブルを作成する場合と比べて、変換プログラムの開発者がパターンテーブルを作成する負担が軽減されると共に、パターンテーブルの保守の負担が軽減される。また、第3の実施の形態のパターンテーブルは、使用する変換後命令をベクトル長に応じてフィルタリングするためのフラグを含む。よって、開発者は、異なるベクトル長の変換規則を簡潔に記述することができる。
[第4の実施の形態]
次に、第4の実施の形態を説明する。前述の第3の実施の形態との違いを中心に説明し、第3の実施の形態と同様の内容については説明を省略することがある。
第4の実施の形態の情報処理装置は、第3の実施の形態と同様に、CPUによってベクトル長が異なるA命令セットのSIMD命令をサポートする。ただし、第4の実施の形態は、パターンテーブルの構造が第3の実施の形態と異なる。
第4の実施の形態の情報処理装置は、図2,16に示した第2の実施の形態の情報処理装置100と同様のモジュール構造によって実現される。そこで、以下では第4の実施の形態を、図2,16と同じ符号を用いて説明する。
図28は、パターンテーブルの第2の変形例を示す図である。
パターンテーブル253は、第2の実施の形態のパターンテーブル144と同様に、複数のオペランドパターンに対応する複数の行を含む。また、パターンテーブル253は、オペランドパターンを記述する列と、A命令セットの複数の命令に対応する複数の列とを含む。A命令セットの命令に対応する列の列名には、変換関数プログラムにおいてA命令セットの命令を出力するためのステートメント(文)が含まれる。
ここで、列名に相当するステートメントは、ベクトル長に応じて異なる命令を出力するライブラリ関数を呼び出すことがある。パターンテーブル253の1番目、8番目および9番目の変換後命令は、ベクトル長に依存する。そこで、1番目のステートメントに含まれる関数XT_PUSH_ZREG、8番目のステートメントに含まれる関数MOV_FOR_512、および、9番目のステートメントに含まれる関数XT_POP_ZREGは、ベクトル長に依存するライブラリ関数である。
図29は、パターンテーブルの第2の変形例を示す図(続き)である。
パターンテーブル253は、第2の実施の形態のパターンテーブル144と同様に、変換関数プログラムのソースコードのプレビューを示す列を含む。情報処理装置100は、オペランドパターン毎に、フラグが1である列の列名を左から右に向かって順に列挙することで、変換関数プログラムのソースコードを生成する。ソースコードは、ベクトル長に応じて異なる命令を出力するライブラリ関数の呼び出しを含む。
パターンテーブル253の2番目のオペランドパターンは、1番目と9番目の変換後命令を使用する。そこで、2番目のオペランドパターンのソースコードは、関数XT_PUSH_ZREGと関数XT_POP_ZREGの呼び出しを含む。また、3番目のオペランドパターンは、8番目の変換後命令を使用する。そこで、3番目のオペランドパターンのソースコードは、関数MOV_FOR_512の呼び出しを含む。
また、4番目のオペランドパターンは、1番目と8番目と9番目の変換後命令を使用する。そこで、4番目のオペランドパターンのソースコードは、関数XT_PUSH_ZREGと関数MOV_FOR_512と関数XT_POP_ZREGの呼び出しを含む。また、6番目のオペランドパターンは、1番目と9番目の変換後命令を使用する。そこで、6番目のオペランドパターンのソースコードは、関数XT_PUSH_ZREGと関数XT_POP_ZREGの呼び出しを含む。
図30は、変換関数プログラムのライブラリ関数の例を示す図である。
変換関数プログラム254は、ライブラリ関数として、関数XT_PUSH_ZREG、関数XT_POP_ZREGおよび関数MOV_FOR_512を含む。関数XT_PUSH_ZREGは、使用するSIMDレジスタのレジスタ番号を取得し、ベクトル長のバイト数を算出する。当該関数は、ベクトル長の指定が「なし」または128ビットである場合、128ビットのデータを退避するストア命令を生成し、それ以外の場合、SIMDレジスタ全体のデータを退避するストア命令を生成する。
関数XT_POP_ZREGは、ベクトル長の指定が「なし」または128ビットである場合、128ビットのデータを読み出すロード命令を生成し、それ以外の場合、SIMDレジスタ全体のデータを読み出すロード命令を生成する。関数MOV_FOR_512は、ベクトル長の指定が512バイトである場合、SIMDレジスタの上位256ビットにゼロを代入する代入命令を生成し、それ以外の場合、命令を出力しない。
このように、ベクトル長に応じて異なる命令を出力するライブラリ関数が事前に用意され、ベクトル長の違いから直接的に生じる変換後命令の違いは、ライブラリ関数によって吸収される。変換プログラムの開発者は、ライブラリ関数の呼び出しを示す列のフラグを1に設定することで、ベクトル長の影響を意識せずに変換仕様を記述できる。
変換関数生成については、図17~20に示した第2の実施の形態のフローチャートと同様の手順によって実行できる。また、実行ファイル変換については、図21に示した第2の実施の形態のフローチャートと同様の手順によって実行できる。ただし、第4の実施の形態の実行ファイル変換では、情報処理装置100は、ユーザから対象CPUのベクトル長の指定を受け付け、変換関数を呼び出す際にベクトル長を指定する。
第4の実施の形態の情報処理装置100によれば、第2の実施の形態と同様の効果が得られる。更に、情報処理装置100は、CPUによってベクトル長が異なるSIMD命令を利用して、A命令セットのアセンブリコードや機械語コードを生成する。よって、情報処理装置100は、A命令セットをもつ様々なCPUをカバーすることができる。
また、情報処理装置100は、複数のベクトル長のための変換規則を、単一のパターンテーブルによって定義する。よって、ベクトル長毎にパターンテーブルを作成する場合と比べて、変換プログラムの開発者がパターンテーブルを作成する負担が軽減されると共に、パターンテーブルの保守の負担が軽減される。
また、第4の実施の形態のパターンテーブルは、ベクトル長の違いの影響を、変換後命令を出力するライブラリ関数の中にカプセル化する。よって、変換後命令レベルでのベクトル長の影響を特定してライブラリ関数を一旦定義すれば、開発者は、ライブラリ関数を利用して様々なベクトル長の変換規則を抽象的に記述することができる。その結果、開発者は、異なるベクトル長の変換規則を簡潔に記述することができる。