IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

<>
  • 特開-変換プログラムおよび変換方法 図1
  • 特開-変換プログラムおよび変換方法 図2
  • 特開-変換プログラムおよび変換方法 図3
  • 特開-変換プログラムおよび変換方法 図4
  • 特開-変換プログラムおよび変換方法 図5
  • 特開-変換プログラムおよび変換方法 図6
  • 特開-変換プログラムおよび変換方法 図7
  • 特開-変換プログラムおよび変換方法 図8
  • 特開-変換プログラムおよび変換方法 図9
  • 特開-変換プログラムおよび変換方法 図10
  • 特開-変換プログラムおよび変換方法 図11
  • 特開-変換プログラムおよび変換方法 図12
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024160544
(43)【公開日】2024-11-14
(54)【発明の名称】変換プログラムおよび変換方法
(51)【国際特許分類】
   G06F 8/41 20180101AFI20241107BHJP
【FI】
G06F8/41 170
【審査請求】未請求
【請求項の数】5
【出願形態】OL
(21)【出願番号】P 2023075665
(22)【出願日】2023-05-01
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】川上 健太郎
【テーマコード(参考)】
5B081
【Fターム(参考)】
5B081CC24
(57)【要約】
【課題】x64向けの実行コードを、CPUがより高速に処理できるAArch64向けの実行コードに変換する。
【解決手段】変換装置1は、変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、変換対象のx64向け実行コードをAArch64の実行コードに変換出力する。かかる変換装置1は、例えば、A64FXのCPUの開発に適用できる。
【選択図】図4
【特許請求の範囲】
【請求項1】
変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、
256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、
該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、
前記変換対象のx64向け実行コードをAArch64の実行コードに変換出力する
処理をコンピュータに実行させる変換プログラム。
【請求項2】
前記CPUのSIMDレジスタサイズの設定値を変更する前に、現在のCPUのSIMレジスタサイズの設定値を保存する実行コードを生成出力し、
前記変換対象のx64向け実行コードの変換が終了した後に、前記CPUのSIMDレジスタサイズの設定値を、保存したSIMDレジスタサイズの設定値に戻す実行コードを生成出力する
ことを特徴とする請求項1に記載の変換プログラム。
【請求項3】
前記SIMDレジスタサイズの設定値を変更する実行コードを生成出力する処理は、512ビット以上のSIMD命令を含まず、256ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を256ビットに変更する実行コードを生成出力し、512ビットより大きいSIMD命令を含まず、512ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を512ビットに変更する実行コードを生成出力する
ことを特徴とする請求項1に記載の変換プログラム。
【請求項4】
前記SIMDレジスタサイズの設定値を変更する実行コードを生成出力する処理は、128×n1ビットのSIMD命令および128×n2(n1>n2)ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128×n1ビットに変更する実行コードを生成出力し、
前記変換先SIMD命令に切り替える処理は、
128×n1ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替え、
128×n2ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替えるとともに、128×n1から128×n2を減じた値分だけ当該変換先SIMD命令の上位ビットを零に設定する変換先SIMD命令に切り替える
ことを特徴とする請求項1に記載の変換プログラム。
【請求項5】
変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、
256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、
該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、
前記変換対象のx64向け実行コードをAArch64の実行コードに変換出力する
処理をコンピュータが実行する変換方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、変換プログラム等に関する。
【背景技術】
【0002】
近年、従来インテルのx64命令セットのCPU(Central Processing Unit)を使っていたシステムで、ArmのAArch64命令セットのCPUが採用されるケースが増えつつある。これは、ArmアーキテクチャのCPUの電力効率が優れているためである。
【0003】
したがって、x64命令セット向けの実行コードをAArch64命令セット向けの実行コードに変換して、Armアーキテクチャのシステムで動かすニーズが高まっている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2023-2165号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
一側面によれば、x64向けの実行コードを、CPUがより高速に処理できるAArch64向けの実行コードに変換することを目的とする。
【課題を解決するための手段】
【0006】
一側面によれば、変換プログラムは、変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、変換対象のx64向け実行コードをAArch64の実行コードに変換出力する、処理をコンピュータに実行させる。
【発明の効果】
【0007】
一側面によれば、x64向けの実行コードを、CPUがより高速に処理できるAArch64向けの実行コードに変換できる。
【図面の簡単な説明】
【0008】
図1図1は、実施例に係る変換装置の機能構成図である。
図2図2は、実施例に係る変換装置のハードウェア構成図である。
図3図3は、実施例に係るプロセッサが備えるレジスタファイルの模式図である。
図4図4は、x64実行コードをAArch64実行コードに変換する一例を示す図である。
図5図5は、実施例に係る命令変換処理のフローチャートの一例を示す図である。
図6図6は、処理aのフローチャートの一例を示す図である。
図7図7は、処理bのフローチャートの一例を示す図である。
図8図8は、処理cのフローチャートの一例を示す図である。
図9図9は、処理dのフローチャートの一例を示す図である。
図10図10は、x64のSIMD命令を説明する図である。
図11図11は、AArch64のSIMD命令を説明する図である。
図12図12は、x64実行コードをAArch64実行コードに変換する参考例を示す図である。
【発明を実施するための形態】
【0009】
本実施形態の説明に先立ち、本実施形態の基礎となる事項について説明する。
【0010】
まず、インテルのx64のSIMD(Single Instruction Multiple Data)命令およびArmのAArch64のSIMD命令について、図10および図11を参照して説明する。
【0011】
図10は、x64のSIMD命令を説明する図である。図10に示すように、x64のSIMDレジスタは、0から31までの32個を備える。
【0012】
x64に基づくCPUの場合、SIMDレジスタのビット長は、512である。そして、1つのSIMDレジスタは、例えば64ビットのデータであれば8個記憶できる。また,32ビットのデータであれば16個記憶できる。複数のSIMDレジスタの各々は、「zmm0」、「zmm1」、・・・「zmm31」の文字列で識別される。
【0013】
例えばzmm0の512ビットのうち、下位256ビット分は、別のレジスタであるymmレジスタと共用する。また、ymm0の256ビットのうち、下位128ビット分は、別のレジスタであるxmmレジスタと共用する。
【0014】
例えば、32ビット整数のSIMD加算命令では、xmmレジスタを用いる場合には、以下の命令コード(1)となる。(1)の命令コードは、32ビット整数について、4個同士を加算する。
vpadd xmm0,xmm1,xmm2・・・(1)
【0015】
また、ymmレジスタを用いる場合には、以下の命令コード(2)となる。(2)の命令コードは、32ビット整数について、8個同士を加算する。
vpadd ymm0,ymm1,ymm2・・・(2)
【0016】
また、zmmレジスタを用いる場合には、以下の命令コード(3)となる。(3)の命令コードは、32ビット整数について、16個同士を加算する。
vpadd zmm0,zmm1,zmm2・・・(3)
すなわち、x64では、実行コード内でSIMDデータのビット長が128,256,512ビットの3種類のSIMD命令を混在して使用できる。
【0017】
図11は、AArch64のSIMD命令を説明する図である。図11に示すように、AArch64のSIMDレジスタは、0から31までの32個を備える。
【0018】
Arm(AArch64)アーキテクチャに基づくCPUの場合、SIMDレジスタのビット長については、CPUを開発するベンダーが128×n(n=1~16の整数)の中から1つを選択できる。すなわち、ベンダーは、128,256,384,512・・・,2048の中から1つを選択して実装して良いことになっている。nが4である場合、SIMDレジスタのビット長は512ビットとなる。そして、1つのSIMDレジスタは、64ビットのデータを8個記憶できる。複数のSIMDレジスタの各々は、「z0」、「z1」、・・・「z31」の文字列で識別される。
【0019】
z0レジスタの中の下位128ビットは、別のレジスタであるvレジスタと共用する。
【0020】
例えば、32ビット整数のSIMD加算命令では、vレジスタを用いる場合には、以下の命令コード(4)となる。(4)の命令コードは、32ビット整数について、4個同士を加算する。
add v0.4s,v1.4s,v2.4s・・・(4)
【0021】
また、zレジスタを用いる場合には、以下の命令コード(5)となる。(5)の命令コードは、32ビット整数について、n×4個同士を加算する。
add z0.s,z1.s,z2.s・・・(5)
つまり、zレジスタについては、CPUの種類(nの値)と、そのときのSVE(Scalable Vector Extensions)サイズの設定値(n以下を設定可)とによって、SIMDレジスタのサイズ(ビット長)が異なる。そして、AArch64では、実行コード内でvレジスタ(128ビットSIMDレジスタ)をオペランドとするかzレジスタをオペランドとするかの2種類のSIMD命令を混在して使用できる。
【0022】
このようなx64向けのSIMD命令をAArch64向けのSIMD命令に変換する参考例を、図12を参照して説明する。図12は、x64実行コードをAArch64実行コードに変換する参考例を示す図である。
【0023】
図12に示すように、上段には、変換対象のx64向けの実行コードとして、xmmレジスタを用いる場合が表されている。xmmレジスタは、zmm0の512ビットのうち、下位128ビット分を共用する。例えば、「vpadd xmm0,xmm1,xmm2」の命令コードは、xmm1+xmm2の結果をxmm0に128ビット分(32ビット×4)を書き込み、残りの上位384ビットに0をセットする。
【0024】
「vpadd xmm0,xmm1,xmm2」の命令コードをAArch64向けの命令コードに変換した結果は、以下の命令コード(e1)および(e2)になる。なお、CPUの種類として示されるnは常に4であるとする。すなわち、zレジスタのサイズは常に512ビットであるとする。
add z0.s,z1.s,z2.s ・・・(e1)
mov z0.s,p0/m,0・・・(e2)
かかる(e1)の命令コードは、z1+z2の結果をz0に512ビット分(32ビット×16)書き込む。加えて、(e2)の命令コードは、x64の場合と同じ結果にするため、z0の384(32ビット整数×12個)ビット分を0にセットする。つまり、(e2)の命令コードが別途必要になる。ここでp0はプレディケートであり,zレジスタをオペランドとする命令において,命令の実行結果を反映させるSIMDレーンを指定するために使うことができる.例えば(e2)のp0レジスタは,zレジスタの上位384ビット分のSIMDレーンに対して実行結果を反映するために必要な値を保持しているものとする。
【0025】
なお、x64向けの「vpadd xmm3,xmm4,xmm5」、「vpadd xmm6,xmm7,xmm8」の命令コードについても、(e1)および(e2)と同様の方法で、AArch64向けに変換される。
【0026】
中段には、変換対象のx64向けの実行コードとして、xmmレジスタ、ymmレジスタを用いる場合が表されている。xmmレジスタを用いる場合については、上段と同様に、AArch64向けに変換される。これに対して、ymmレジスタは、zmm0の512ビットのうち、下位256ビット分を共用する。例えば、「vpadd ymm3,ymm4,ymm5」の命令コードは、ymm4+xmm5の結果をymm3に256ビット分(32ビット×8)を書き込み、残りの上位256ビットに0をセットする。
【0027】
「vpadd ymm3,ymm4,ymm5」の命令コードをAArch64向けの実行コードに変換した結果は、以下の命令コード(e3)および(e4)になる。なお、CPUの種類として示されるnは常に4であるとする。すなわち、zレジスタのサイズは常に512ビットであるとする。
add z3.s,z4.s,z5.s・・・(e3)
mov z3.s,p1/m,0・・・(e4)
かかる(e3)の命令コードは、z4+z5の結果をz3に512ビット分(32ビット×16)書き込む。加えて、(e4)の命令コードは、x64の場合と同じ結果にするため、z3の256(32ビット整数×8個)ビット分を0にセットする。つまり、(e4)の命令コードが別途必要になる。
【0028】
下段には、変換対象のx64向けの実行コードとして、xmmレジスタ、ymmレジスタ、zmmレジスタを用いる場合が表されている。xmmレジスタを用いる場合については、上段と同様に、AArch64向けに変換される。ymmレジスタを用いる場合については、中段と同様に、AArch64向けに変換される。これに対して、zmmレジスタは、zmmの512ビットを使用する。例えば、「vpadd zmm6,zmm7,zmm8」の命令コードは、ymm7+xmm8の結果をymm6に512ビット分(32ビット×16)を書き込む。
【0029】
「vpadd zmm6,zmm7,zmm8」の命令コードをAArch64向けの実行コードに変換した結果は、以下の命令コード(e5)になる。なお、CPUの種類としてのnは常に4であるとする。すなわち、zレジスタのサイズは常に512ビットであるとする。
add z6.s,z7.s,z8.s ・・・(e5)
かかる(e5)の命令コードは、z7+z8の結果をz6に512ビット分(32ビット×16)書き込む。
【0030】
このように、変換対象のx64向け実行コードが128,256ビットレジスタを使用している場合には、変換後のAArch64向け実行コードが常に512ビットレジスタを使用すると、変換対象ビット以外の残りビット数分に0をセットする命令が付加される。そうすると、実行コードが実行される際に、実行ステップが増えるため、CPUがより高速に処理できない。すなわち、x64向けの実行コードを、CPUがより高速に処理できるAArch64向けの実行コードに変換できないという問題がある。
【0031】
そこで、以降の実施例では、x64向けの実行コードを、CPUがより高速に処理できるAArch64向けの実行コードに変換する変換方法について説明する。
【0032】
[変換装置の機能構成]
図1は、実施例に係る変換装置の機能構成図である。図1に示すように、変換装置1は、物理マシンや仮想マシン等のコンピュータであって、制御部20と、記憶部30とを有する。制御部20は、命令変換部21を含む。記憶部30は、変換対象の実行コード11および変換後の実行コード12を有する。変換対象の実行コード11は、変換対象の実行コード(機械語)のバイナリファイルである。変換対象の実行コード11は、例えば、x64向けの実行コードである。変換後の実行コード12は、変換後の実行コード(機械語)のバイナリファイルである。変換後の実行コード12は、例えば、AArch64向けの実行コード(機械語)のバイナリファイルである。なお、実施例では、AArch64)について、SIMDレジスタのビット長が、512である場合について説明する。
【0033】
命令変換部21は、変換対象の実行コード11を変換後の実行コード12に変換する。
【0034】
例えば、命令変換部21は、変換対象の実行コード11を解析して、変換対象の実行コード11に含まれるSIMD命令が128ビットのSIMD命令、256ビットのSIMD命令、512ビットのSIMD命令をそれぞれ含むか否かをチェックする。一例として、命令変換部21は、変換対象の実行コード11を逆アセンブルして、変換対象の実行コード11に含まれるSIMD命令が128ビットのSIMD命令、256ビットのSIMD命令、512ビットのSIMD命令をそれぞれ含むか否かをチェックすれば良い。
【0035】
そして、命令変換部21は、現在のCPUのSIMDレジスタサイズの設定値を保存する実行コードを生成し出力する。一例として、命令変換部21は、現在のCPUのSIMDレジスタサイズをシステムレジスタから取得し、取得したSIMDレジスタサイズを一時的に保存する実行コードを生成出力する。
【0036】
そして、命令変換部21は、変換対象の実行コード11に含まれるSIMD命令が256,512ビットのSIMD命令を含まず、128ビットのSIMD命令を含む場合には、SIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成し、出力する。一例として、命令変換部21は、SIMDレジスタサイズを128ビットとしてシステムレジスタに設定する実行コードを生成出力する。
【0037】
また、命令変換部21は、変換対象の実行コード11に含まれるSIMD命令が512ビットのSIMD命令を含まず、256ビットのSIMD命令を含む場合には、SIMDレジスタサイズの設定値を256ビットに変更する実行コードを生成し、出力する。一例として、命令変換部21は、SIMDレジスタサイズを256ビットとしてシステムレジスタに設定する実行コードを生成出力する。
【0038】
また、命令変換部21は、変換対象の実行コード11に含まれるSIMD命令が512ビットのSIMD命令を含む場合には、SIMDレジスタサイズの設定値を512ビットに変更する実行コードを生成し、出力する。一例として、命令変換部21は、SIMDレジスタサイズを512ビットとしてシステムレジスタに設定する実行コードを生成出力する。
【0039】
そして、命令変換部21は、変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令、256ビットのSIMD命令、512ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替える。
【0040】
一例として、命令変換部21は、変更したSIMDレジスタサイズが128ビットである場合には、x64の128ビットSIMD命令であるxmmレジスタを、AArch64のzレジスタに変更する。具体的には、命令変換部21は、x64の128ビットSIMD命令「vpadd xmm0,xmm1,xmm2」を以下のAArch64向けの実行コード(10)に変換する。
add z0.s,z1.s,z2.s・・・(10)
これにより、命令変換部21は、zレジスタのサイズを128ビットに設定することで、x64から変換されたzレジスタを128ビットとして処理させることができる。
【0041】
別の例として、命令変換部21は、変更したSIMDレジスタサイズが256ビットである場合には、x64の256ビットSIMD命令であるymmレジスタを、AArch64のzレジスタに変更する。具体的には、命令変換部21は、x64の256ビットのSIMD命令「vpadd ymm0,ymm1,ymm2」を、(10)と同様のAArch64向けの実行コードに変換する。これにより、命令変換部21は、zレジスタのサイズを256ビットに設定することで、x64から変換されたzレジスタを256ビットとして処理させることができる。
【0042】
また、命令変換部21は、x64の128ビットSIMD命令であるxmmレジスタを含む場合には、xmmレジスタを、AArch64のzレジスタに変更し、変更されたzレジスタの上位128ビット分に0をセットすれば良い。具体的には、命令変換部21は、x64の128ビットSIMD命令「vpadd xmm0,xmm1,xmm2」をAArch64向けの実行コード(11)および(12)に変換する。なお、(12)は、z0レジスタの上位128(32ビット整数×4)ビット分を0にセットする命令である。
add z0.s,z1.s,z2.s・・・(11)
mov z0,p0/m,0・・・(12)
【0043】
別の例として、命令変換部21は、変更したSIMDレジスタサイズが512ビットである場合には、x64の512ビットSIMD命令であるzmmレジスタを、AArch64のzレジスタに変更する。具体的には、命令変換部21は、x64の512ビットのSIMD命令「vpadd zmm0,zmm1,zmm2」を、(10)と同様のAArch64向けの実行コードに変換する。これにより、命令変換部21は、zレジスタのサイズを512ビットに設定することで、x64から変換されたzレジスタを512ビットとして処理させることができる。
【0044】
また、命令変換部21は、x64の256ビットSIMD命令であるymmレジスタを含む場合には、ymmレジスタを、AArch64のzレジスタに変更し、変更されたzレジスタの上位256ビット分に0をセットすれば良い。具体的には、命令変換部21は、x64の256ビットSIMD命令「vpadd ymm0,ymm1,ymm2」を、(11)(12)と同様の方法でAArch64向けの実行コードに変換する。なお、(12)は、z0レジスタの上位256(32ビット整数×8)ビット分を0にセットする命令であれば良い。
【0045】
また、命令変換部21は、x64の128ビットSIMD命令であるxmmレジスタを含む場合には、xmmレジスタを、AArch64のzレジスタに変更し、変更されたzレジスタの上位384ビット分に0をセットすれば良い。具体的には、命令変換部21は、x64の128ビットSIMD命令「vpadd xmm0,xmm1,xmm2」を、(11)(12)と同様の方法でAArch64向けの実行コードに変換する。なお、(12)は、z0レジスタの上位384(32ビット整数×12)ビット分を0にセットする命令であれば良い。
【0046】
[変換装置のハードウェア構成]
図2は、実施例に係る変換装置のハードウェア構成図である。図2に示すように、変換装置1は、HPC(High Performance Computer)やサーバ等のコンピュータであって、記憶装置10a、メモリ10b、プロセッサ10c、通信インターフェース10d、表示装置10e、入力装置10fおよび記録媒体10hを有する。これらの各部は、バス10gにより相互に接続される。
【0047】
このうち、記憶装置10aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージデバイスであり、変換対象の実行コード11および変換後の実行コード12を記憶する。変換対象の実行コード11は、x64向けのソースプログラムをコンパイルして得られた機械語のバイナリファイルである。変換後の実行コード12は、変換対象の実行コード11を変換した後のAArch64向けの機械語のバイナリファイルである。
【0048】
なお、変換対象の実行コード11をコンピュータが読み取り可能な記録媒体10hに記録させておき、プロセッサ10cに記録媒体10hの変換対象の実行コード11を読み取らせるようにしても良い。
【0049】
そのような記録媒体10hとしては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、およびUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体10hとして使用しても良い。これらの記録媒体10hは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【0050】
さらに、公衆回線、インターネット、およびLAN(Local Area Network)等に接続された装置に変換対象の実行コード11を記憶させておき、プロセッサ10cがその変換対象の実行コード11を読み出すようにしても良い。
【0051】
一方、メモリ10bは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に前述の変換対象の実行コード11が展開される。展開される変換対象の実行コード11は、複数の命令を含む。
【0052】
プロセッサ10cは、図1で説明した変換装置1の各部を制御する。すなわち、プロセッサ10cは、メモリ10bと協働して変換対象の実行コード11を変換後の実行コード12に変換したりするCPU(Central Processing Unit)やGPU(Graphical Processing Unit)等のハードウェアである。プロセッサ10cには、命令やデータ等を格納するレジスタファイル14が設けられる。レジスタファイル14の詳細については、後述する。また、プロセッサ10cには、SIMDレジスタのビット長を記憶するシステムレジスタ15が設けられる。システムレジスタ15には、予め、128×n(n=1~16の整数)の中から、CPUを開発するベンダーによって選択されたSIMDレジスタのビット長が設定される。そして、システムレジスタ15には、変換の際に、128×n(n=1~16の整数)の中から選択されるSIMDレジスタのビット長が設定される。なお、プロセッサ10cは、例えば、富士通株式会社製のA64FXである。A64FXは、Arm社のArmv8.2-A命令セットをSVE(Scalable Vector Extension)で拡張した命令セットを実行可能なプロセッサである。かかる命令セットがAArch64である。
【0053】
さらに、通信インターフェース10dは、変換装置1をLAN(Local Area Network)等のネットワークに接続するためのインターフェースである。
【0054】
そして、表示装置10eは、液晶表示装置等のハードウェアであって、開発者に種々の情報の入力を促すプロンプトを表示する。また、入力装置10fは、キーボードやマウス等のハードウェアである。
【0055】
[レジスタファイルの模式図]
図3は、プロセッサ10cが備えるレジスタファイル14の模式図である。以下では、AArch64の命令セットをプロセッサ10cが実行する場合を例にして説明する。
【0056】
図3に示すように、レジスタファイル14には、SIMDレジスタ140を複数備える。なお、レジスタファイル14は、図示しないが、プレディケートレジスタやスカラレジスタをそれぞれ複数備える。
【0057】
Arm(AArch64)アーキテクチャに基づくCPUの場合、SIMDレジスタ140のビット長は、CPUを開発するベンダーが128,256,384,512・・・2048の中から1つを選択して実装して良いことになっている。図3において、SIMDレジスタのビット長は512ビットである。そして、1つのSIMDレジスタ140は、64ビットのデータを8個記憶できる。以下では、複数のSIMDレジスタ140の各々を「z0」、「z1」、…「z31」の文字列で識別する。
【0058】
なお、1個のSIMDレジスタ140の中の下位128ビットは、別のレジスタであるvレジスタと共有する。vレジスタが演算に用いられる場合には、レーン「0」~「31」を指定したSIMD命令が利用できる。
【0059】
[変換する一例]
ここで、x64実行コードをAArch64実行コードに変換する一例を、図4を参照して説明する。図4は、x64実行コードをAArch64実行コードに変換する一例を示す図である。
【0060】
図4に示すように、左段には、変換対象のx64向けの実行コード11aを逆アセンブルした結果が表されている。
【0061】
左上段には、xmmレジスタを用いる場合が表されている。xmmレジスタは、zmmレジスタの512ビットのうち、下位128ビット分を共用する。
【0062】
このような状況の下、命令変換部21は、変換対象の実行コード11aを逆アセンブルして、変換対象の実行コード11aに含まれるSIMD命令が128ビットのSIMD命令、256ビットのSIMD命令、512ビットのSIMD命令をそれぞれ含むか否かをチェックする。ここでは、命令変換部21は、変換対象の実行コード11aを逆アセンブルした結果にはxmmレジスタのみが使用されているので、変換対象の実行コード11aに含まれるSIMD命令が128ビットのSIMD命令のみを含むと判定する。
【0063】
そして、命令変換部21は、現在のCPUのSIMDレジスタサイズの設定値を一時的に保存する実行コードを生成し出力する。ここでは、命令変換部21は、zレジスタのサイズの設定値を「ZCR_EL1」から取得し、x2レジスタに保存する実行コードを生成し出力する(符号c1)。ここでいう「ZCR_EL1」は、zレジスタのサイズの設定値を保存するシステムレジスタである。
【0064】
そして、命令変換部21は、チェックした結果、SIMD命令が256,512ビットのSIMD命令を含まず、128ビットのSIMD命令のみを含むので、SIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成し、出力する。ここでは、命令変換部21は、zレジスタのサイズの設定値を「ZCR_EL1」に128ビットとして変更する実行コードを生成し出力する(符号c2)。
【0065】
そして、命令変換部21は、x64の128ビットSIMD命令であるxmmレジスタを、AArch64のzレジスタに変換する。ここでは、命令変換部21は、「vpadd xmm0,xmm1,xmm2」を、AArc64向けの以下の実行コード(c3)に変換する。
add z0.s,z1.s,z2.s・・・(c3)
(c3)の実行コードは、32ビット整数×4個を加算することを示す。すなわち、かかる実行コードは、z1+z2の結果をz0に128ビット分(32ビット×4)を書き込む。
【0066】
同様に、命令変換部21は、「vpadd xmm3,xmm4,xmm5」を、Aarc64向けの以下の実行コード(c4)に変換する。
add z3.s,z4.s,z5.s・・・(c4)
【0067】
同様に、命令変換部21は、「vpadd xmm6,xmm7,xmm8」を、Aarc64向けの以下の実行コード(c5)に変換する。
add z6.s,z7.s,z8.s・・・(c5)
【0068】
そして、命令変換部21は、CPUのSIMDレジスタサイズの設定値を、一時的に保存されたサイズに復元する実行コードを生成し、出力する。ここでは、命令変換部21は、「ZCR_EL1」を、x2レジスタに保存されたサイズに復元する実行コードを生成し出力する(符号c6)。
【0069】
これにより、変換対象のx64向けの実行コード11a内のSIMD命令が128ビットSIMD命令しかない場合には、命令変換部21は、zレジスタサイズを128ビットに設定することで、“add z0.s,z1.s,z2.s”が128ビット分の加算命令として処理される。したがって、命令変換部21は、“mov z0,p0/m,0”(32ビット整数×12個分「0」をセット)のような命令を付加しなくても、変換対象のx64向けの実行コード11aと同じ結果を得る実行コードに変換できる。この結果、命令変換部21は、変換後のAArch64向けの実行コード12aの命令数を少なくでき、高速に処理できる実行コードに変換できる。zレジスタサイズの設定および復元に5命令が追加されるが、変換対象のx64向けの実行コードの命令数は数百から数千命令なので、無視しても良い。
【0070】
左下段には、xmmレジスタおよびymmレジスタを用いる場合が表されている。xmmレジスタは、zmmレジスタの512ビットのうち、下位128ビット分を共用する。ymmレジスタは、zmmレジスタの512ビットのうち、下位256ビット分を共用する。
【0071】
このような状況の下、命令変換部21は、変換対象の実行コード11aを逆アセンブルして、変換対象の実行コード11bに含まれるSIMD命令が128ビットのSIMD命令、256ビットのSIMD命令、512ビットのSIMD命令をそれぞれ含むか否かをチェックする。ここでは、命令変換部21は、変換対象の実行コード11aを逆アセンブルした結果にはxmmレジスタおよびymmレジスタが使用されているので、変換対象の実行コード11aに含まれるSIMD命令が128ビットのSIMD命令および256ビットのSIMD命令を含むと判定する。
【0072】
そして、命令変換部21は、現在のCPUのSIMDレジスタサイズの設定値を一時的に保存する実行コードを生成し出力する。ここでは、命令変換部21は、zレジスタのサイズの設定値を「ZCR_EL1」から取得し、x2レジスタに保存する実行コードを生成し出力する(符号c21)。ここでいう「ZCR_EL1」は、zレジスタのサイズの設定値を保存するシステムレジスタである。
【0073】
そして、命令変換部21は、チェックした結果、SIMD命令が512ビットのSIMD命令を含まず、128ビットのSIMD命令および256ビットのSIMD命令を含むので、SIMDレジスタサイズの設定値を256ビットに変更する実行コードを生成し、出力する。ここでは、命令変換部21は、zレジスタのサイズの設定値を「ZCR_EL1」に256ビットとして変更する実行コードを生成し出力する(符号c22)。
【0074】
そして、命令変換部21は、x64の128ビットSIMD命令であるxmmレジスタを、AArch64のzレジスタに変換する。ここでは、命令変換部21は、「vpadd xmm0,xmm1,xmm2」を、AArc64向けの以下の実行コード(c23)および(c24)に変換する。
add z0.s,z1.s,z2.s・・・(c23)
mov z0.s,p0/m,0・・・(c24)
【0075】
(c23)の実行コードは、32ビット整数×8個を加算することを示す。すなわち、かかる実行コードは、z1+z2の結果をz0に256ビット分(32ビット×8)を書き込む。加えて、(c24)の実行コードは、x64の場合と同じ結果にするため、32ビット整数×4個分を0にセットする。なお、「p0」は、プレディケートレジスタであり、どの32ビットデータを変更するのかを指定する。「/m」は、指定されない32ビットデータは変更しないことを指定する。つまり、(c24)の実行コードのp0には、zレジスタの上位128ビット(32ビット×4個)を示す値が設定されている。
【0076】
そして、命令変換部21は、x64の256ビットSIMD命令であるymmレジスタを、AArch64のzレジスタに変換する。ここでは、命令変換部21は、「vpadd ymm3,ymm4,ymm5」を、AArc64向けの以下の実行コード(c25)に変換する。
add z3.s,z4.s,z5.s・・・(c25)
【0077】
そして、命令変換部21は、CPUのSIMDレジスタサイズの設定値を、一時的に保存されたサイズに復元する実行コードを生成し、出力する。ここでは、命令変換部21は、「ZCR_EL1」を、x2レジスタに保存されたサイズに復元する実行コードを生成し出力する(符号26)。
【0078】
これにより、変換対象のx64向けの実行コード11a内のSIMD命令が128ビットSIMD命令および256ビットSIMD命令である場合には、命令変換部21は、zレジスタサイズを256ビットに設定することで、“add z3.s,z4.s,z5.s”が256ビット分の加算命令として処理される。したがって、命令変換部21は、“mov z3.s,p1/m,0”(32ビット整数×8個分「0」をセット)のような命令を付加しなくても、変換対象のx64向けの実行コード11bと同じ結果を得る実行コードに変換できる。この結果、命令変換部21は、変換後のAArch64向けの実行コード12bの命令数を少なくでき、高速に処理できる実行コードに変換できる。zレジスタサイズの設定および復元に5命令が追加されるが、変換対象のx64向けの実行コードの命令数は数百から数千命令なので、無視しても良い。
【0079】
なお、zレジスタサイズが256ビットに設定される場合、x64の128ビットSIMD命令が変換される際に“add z0.s,z1.s,z2.s”が256ビット分の加算命令として処理される。このため、命令変換部21は、“mov z0,p0/m,0”(32ビット整数×4個分「0」をセット)のような命令を付加する必要がある。しかしながら、命令変換部21は、変換対象の実行コード11に256ビット命令を含んでいるので、128ビットSIMD命令が含まれていても、変換後のAArch64向けの実行コード12の命令数を全体的に少なくでき、高速に処理できる実行コードに変換できる。zレジスタサイズが512ビットに設定される場合も、命令変換部21は、同様の効果をもたらす。すなわち、命令変換部21は、変換対象の実行コード11に512ビット命令を含んでいるので、128ビットや256ビットのSIMD命令が含まれていても、変換後のAArch64向けの実行コード12の命令数を全体的に少なくでき、高速に処理できる実行コードに変換できる。
【0080】
[命令変換処理のフローチャート]
次に、命令変換部21が実行する命令変換処理のフローチャートを、図5図9を参照して説明する。図5は、実施例に係る命令変換処理のフローチャートの一例を示す図である。図5に示すように、命令変換部21は、変換対象の実行コード11を解析し、以下の処理を行う。命令変換部21は、変換対象の実行コード11に128ビットSIMDレジスタを扱う命令(A)、256ビットSIMDレジスタを扱う命令(B)、512ビットSIMDレジスタを扱う命令(C)を含むかをチェックする(ステップS11)。
【0081】
命令変換部21は、A,B,Cのいずれも含まないか否かを判定する(ステップS12)。A,B,Cのいずれも含まないと判定した場合には(ステップS12;Yes)、命令変換部21は、SIMD命令なしの場合の処理aを実行する(ステップS13)。なお、処理aのフローチャートについては、後述する。そして、命令変換部21は、命令変換処理を終了する。
【0082】
一方、A,B,Cのいずれかを含むと判定した場合には(ステップS12;No)、命令変換部21は、Aのみ含むか否かを判定する(ステップS14)。Aのみ含むと判定した場合には(ステップS14;Yes)、命令変換部21は、128ビットSIMD命令のみの場合の処理bを実行する(ステップS15)。なお、処理bのフローチャートについては、後述する。そして、命令変換部21は、命令変換処理を終了する。
【0083】
一方、Aのみ含むわけではないと判定した場合には(ステップS14;No)、命令変換部21は、AとBのみを含むか否かを判定する(ステップS16)。AとBのみ含むと判定した場合には(ステップS16;Yes)、命令変換部21は、512ビットSIMD命令なしの場合の処理cを実行する(ステップS17)。なお、処理cのフローチャートについては、後述する。そして、命令変換部21は、命令変換処理を終了する。
【0084】
一方、AとBのみ含むわけではないと判定した場合には(ステップS16;No)、命令変換部21は、512ビットSIMD命令ありの場合の処理dを実行する(ステップS18)。なお、処理dのフローチャートについては、後述する。そして、命令変換部21は、命令変換処理を終了する。
【0085】
次に、SIMD命令なしの場合の処理aのフローチャートを、図6を参照して説明する。図6は、処理aのフローチャートの一例を示す図である。図6に示すように、命令変換部21は、変換対象のSIMD命令を含まないx64命令を、対応するAArch64命令に変換し、出力する(ステップS21)。そして、命令変換部21は、処理aを終了する。
【0086】
次に、128ビットSIMD命令のみの場合の処理bのフローチャートを、図7を参照して説明する。図7は、処理bのフローチャートの一例を示す図である。図7に示すように、命令変換部21は、CPUの現在のSIMDレジスタサイズの設定値を一時的に保存する(ステップS31)。
【0087】
そして、命令変換部21は、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを出力する(ステップS32)。そして、命令変換部21は、x64の128ビットのSIMD命令を、SIMDレジスタサイズが128ビットであるという仮定の下でAArch64の命令に変換し、出力する(ステップS33)。
【0088】
そして、命令変換部21は、変換対象の実行コード11内のx64のSIMD命令を全て変換したか否かを判定する(ステップS34)。全て変換していないと判定した場合には(ステップS34;No)、命令変換部21は、まだ変換していないx64のSIMD命令を変換すべく、ステップS33に移行する。
【0089】
一方、全て変換したと判定した場合には(ステップS34;Yes)、命令変換部21は、CPUのSIMDレジスタサイズを、一時的に保存したサイズに変更する実行コードを出力する(ステップS35)。そして、命令変換部21は、命令変換処理を終了する。
【0090】
次に、512ビットSIMD命令なしの場合の処理cのフローチャートを、図8を参照して説明する。図8は、処理cのフローチャートの一例を示す図である。図8に示すように、命令変換部21は、CPUの現在のSIMDレジスタサイズの設定値を一時的に保存する(ステップS41)。
【0091】
そして、命令変換部21は、CPUのSIMDレジスタサイズの設定値を256ビットに変更する実行コードを出力する(ステップS42)。そして、命令変換部21は、x64の128ビットのSIMD命令と256ビットSIMD命令を、SIMDレジスタサイズが256ビットであるという仮定の下でAArch64の命令に変換し、出力する(ステップS43)。
【0092】
そして、命令変換部21は、変換対象の実行コード11内のx64のSIMD命令を全て変換したか否かを判定する(ステップS44)。全て変換していないと判定した場合には(ステップS44;No)、命令変換部21は、まだ変換していないx64のSIMD命令を変換すべく、ステップS43に移行する。
【0093】
一方、全て変換したと判定した場合には(ステップS44;Yes)、命令変換部21は、CPUのSIMDレジスタサイズを、一時的に保存したサイズに変更する実行コードを出力する(ステップS45)。そして、命令変換部21は、命令変換処理を終了する。
【0094】
次に、512ビットSIMD命令ありの場合の処理dのフローチャートを、図9を参照して説明する。図9は、処理dのフローチャートの一例を示す図である。図9に示すように、命令変換部21は、CPUの現在のSIMDレジスタサイズの設定値を一時的に保存する(ステップS51)。
【0095】
そして、命令変換部21は、CPUのSIMDレジスタサイズの設定値を512ビットに変更する実行コードを出力する(ステップS52)。そして、命令変換部21は、x64の128ビットSIMD命令、256ビットSIMD命令、512ビットSIMD命令を、SIMDレジスタサイズが512ビットであるという仮定の下でAArch64の命令に変換し、出力する(ステップS53)。
【0096】
そして、命令変換部21は、変換対象の実行コード11内のx64のSIMD命令を全て変換したか否かを判定する(ステップS54)。全て変換していないと判定した場合には(ステップS54;No)、命令変換部21は、まだ変換していないx64のSIMD命令を変換すべく、ステップS53に移行する。
【0097】
一方、全て変換したと判定した場合には(ステップS54;Yes)、命令変換部21は、CPUのSIMDレジスタサイズを、一時的に保存したサイズに変更する実行コードを出力する(ステップS55)。そして、命令変換部21は、命令変換処理を終了する。
【0098】
なお、実施例では、命令変換部21は、変更したCPUのSIMDレジスタサイズに応じて、加算命令についてのx64のSIMD命令を、AArch64のSIMD命令に変換する場合について説明した。しかしながら、命令変換部21は、加算命令に限定されず、その他の四則演算、論理演算についても同様の方法で、x64のSIMD命令を、AArch64のSIMD命令に変換しても良い。
【0099】
また、実施例では、変換装置1が、変換対象の実行コード11を、変換後の実行コード12に変換すると説明した。しかしながら、変換後の実行コード12を実行するターゲットマシンが、変換対象の実行コード11を、変換後の実行コード12に変換しても良い。ここでいうターゲットマシンは、プロセッサとメモリとを有しており、プロセッサとメモリが協同して変換後の実行コード12を実行する。そのプロセッサには、命令やデータ等を格納するレジスタファイル14およびシステムレジスタ15が設けられる。プロセッサは、例えば、変換装置1のプロセッサ10cと同じものであれば良い。
【0100】
[実施例の効果]
上記実施例によれば、変換装置1は、変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1~16の整数)ビットのSIMD命令をそれぞれ含むかをチェックする。変換装置1は、256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力する。変換装置1は、該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替える。そして、変換装置1は、変換対象のx64向け実行コードをAArch64の実行コードに変換出力する。これにより、変換装置1は、変換対象のx64実行コードに含まれるSIMD命令に応じてCPUのSIMDレジスタサイズの設定値を変更することで、変換先の命令数が減少することとなり、x64向けの実行コードを、高速に処理できるAArch64向けの実行コードに変換できる。
【0101】
また、上記実施例によれば、変換装置1は、CPUのSIMDレジスタサイズの設定値を変更する前に、現在のCPUのSIMレジスタサイズの設定値を保存する実行コードを生成出力する。そして、変換装置1は、変換対象のx64向け実行コードの変換が終了した後に、CPUのSIMDレジスタサイズの設定値を、保存したSIMDレジスタサイズの設定値に戻す実行コードを生成出力する。これにより、変換装置1は、SIMD命令のサイズがそれぞれ異なる変換対象のx64向けの実行コードごとに、x64向けの実行コードを、高速に処理できるAArch64向けの実行コードを変換できる。
【0102】
また、上記実施例によれば、変換装置1は、512ビット以上のSIMD命令を含まず、256ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を256ビットに変更する実行コードを生成出力する。そして、変換装置1は、512ビットより大きいSIMD命令を含まず、512ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を512ビットに変更する実行コードを生成出力する。これにより、変換装置1は、SIMD命令のサイズがそれぞれ異なる変換対象のx64向けの実行コードごとに、x64向けの実行コードを、高速に処理できるAArch64向けの実行コードを変換できる。
【0103】
また、上記実施例によれば、変換装置1は、128×n1ビットのSIMD命令および128×n2(n1>n2)ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128×n1ビットに変更する実行コードを生成出力する。そして、変換装置1は、128×n1ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替える。変換装置1は、128×n2ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替えるとともに、128×n1から128×n2を減じた値分だけ当該変換先SIMD命令の上位ビットを零に設定する変換先SIMD命令に切り替える。これにより、変換装置1は、変換対象のx64向けの実行コードに、異なるサイズのSIMD命令が含まれていても、x64向けの実行コードをAArch64向けの実行コードを変換できる。
【0104】
[その他]
なお、図示した変換装置1の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、変換装置1の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。また、記憶部30を変換装置1の外部装置としてネットワーク経由で接続するようにしても良い。
【0105】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【0106】
(付記1)変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、
256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、
該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、
前記変換対象のx64向け実行コードをAArch64の実行コードに変換出力する
処理をコンピュータに実行させる変換プログラム。
【0107】
(付記2)前記CPUのSIMDレジスタサイズの設定値を変更する前に、現在のCPUのSIMレジスタサイズの設定値を保存する実行コードを生成出力し、
前記変換対象のx64向け実行コードの変換が終了した後に、前記CPUのSIMDレジスタサイズの設定値を、保存したSIMDレジスタサイズの設定値に戻す実行コードを生成出力する
ことを特徴とする付記1に記載の変換プログラム。
【0108】
(付記3)前記SIMDレジスタサイズの設定値を変更する実行コードを生成出力する処理は、512ビット以上のSIMD命令を含まず、256ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を256ビットに変更する実行コードを生成出力し、512ビットより大きいSIMD命令を含まず、512ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を512ビットに変更する実行コードを生成出力する
ことを特徴とする付記1に記載の変換プログラム。
【0109】
(付記4)前記SIMDレジスタサイズの設定値を変更する実行コードを生成出力する処理は、128×n1ビットのSIMD命令および128×n2(n1>n2)ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128×n1ビットに変更する実行コードを生成出力し、
前記変換先SIMD命令に切り替える処理は、
128×n1ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替え、
128×n2ビットのSIMD命令については、128×n1ビットの変換先SIMD命令に切り替えるとともに、128×n1から128×n2を減じた値分だけ当該変換先SIMD命令の上位ビットを零に設定する変換先SIMD命令に切り替える
ことを特徴とする付記1に記載の変換プログラム。
【0110】
(付記5)変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックし、
256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力し、
該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替え、
前記変換対象のx64向け実行コードをAArch64の実行コードに変換出力する
処理をコンピュータが実行する変換方法。
【0111】
(付記6)変換対象のx64実行コードに含まれるSIMD命令が128×n(n=1,2,4)ビットのSIMD命令をそれぞれ含むかをチェックするチェック部と、
256ビット以上のSIMD命令を含まず、128ビットのSIMD命令を含む場合には、CPUのSIMDレジスタサイズの設定値を128ビットに変更する実行コードを生成出力する生成出力部と、
該変更したSIMDレジスタサイズに応じて、x64の128ビットのSIMD命令をAArch64のSIMD命令に変換する際の変換先SIMD命令に切り替える切替部と、
前記変換対象のx64向け実行コードをAArch64の実行コードに変換出力する変換出力部と、
を有することを特徴とする変換装置。
【符号の説明】
【0112】
1 変換装置
10a 記憶装置
10b メモリ
10c プロセッサ
10d 通信インターフェース
10e 表示装置
10f 入力装置
10g バス
10h 記録媒体
11 変換対象の実行コード
12 変換後の実行コード
14 レジスタファイル
15 システムレジスタ
20 制御部
21 命令変換部
30 記憶部
140 SIMDレジスタ
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12