JP2022023631A - アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 - Google Patents
アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 Download PDFInfo
- Publication number
- JP2022023631A JP2022023631A JP2020126706A JP2020126706A JP2022023631A JP 2022023631 A JP2022023631 A JP 2022023631A JP 2020126706 A JP2020126706 A JP 2020126706A JP 2020126706 A JP2020126706 A JP 2020126706A JP 2022023631 A JP2022023631 A JP 2022023631A
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- assembly
- register
- generation
- instructions
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
- 230000010365 information processing Effects 0.000 title claims description 74
- 238000000034 method Methods 0.000 title claims description 73
- 238000006243 chemical reaction Methods 0.000 title claims description 52
- 230000006870 function Effects 0.000 claims description 109
- 230000008569 process Effects 0.000 claims description 29
- 238000010586 diagram Methods 0.000 description 58
- 230000009486 mnemonic function Effects 0.000 description 50
- 230000008859 change Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 230000007704 transition Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 238000011156 evaluation Methods 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/3017—Runtime instruction translation, e.g. macros
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/3017—Runtime instruction translation, e.g. macros
- G06F9/30174—Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
- G06F8/4435—Detection or removal of dead or redundant code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/52—Binary to binary
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】命令列が長くなるのを抑制すること。【解決手段】アセンブリ命令変換プログラムは、第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を、複数の前記アセンブリ命令ごとに記憶領域に複数格納し、前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定し、前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記命令列の各々におけるテンポラリレジスタとして決定し、前記テンポラリレジスタを使用した前記命令列を生成する処理をコンピュータに実行させる。【選択図】図11
Description
本発明は、アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置に関する。
あるプロセッサで実行されるプログラムは、そのプロセッサが採用している命令セットの命令列からなる。その実行可能プログラムを他のプロセッサでも実行できると便利であるが、これを実現するには命令列を他のプロセッサの命令セットの命令列に変換する必要がある。
しかし、ある命令セットの命令列を他の命令セットの命令列に変換すると、変換後の命令列が無駄に長くなり、変換後のプログラムの実行時間が長くなることがある。
一側面によれば、命令列が長くなるのを抑制することを目的とする。
一側面によれば、第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を、複数の前記アセンブリ命令ごとに記憶領域に複数格納し、前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定し、前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記命令列の各々におけるテンポラリレジスタとして決定し、前記テンポラリレジスタを使用した前記命令列を生成する、処理をコンピュータに実行させるためのアセンブリ命令変換プログラムが提供される。
一側面によれば、命令列が長くなるのを抑制することができる。
本実施形態の説明に先立ち、本実施形態の基礎となる事項について説明する。
ある命令セットを採用したプロセッサ向けのプログラムを、別の命令セットを採用した別のプロセッサで実行できると便利である。例えば、インテル社製のx86_64アーキテクチャの命令セットを採用したプロセッサ向けのプログラムを、ARM社のArmv8-Aアーキテクチャの命令セットを採用したプロセッサで動作させることを考える。これを実現するには、以下のようにx86_64の命令セットに含まれる個々のアセンブリ命令を、Armv8-Aの命令セットに含まれるアセンブリ命令に変換すればよい。
図1は、x86_64のアセンブリ命令からArmv8-Aのアセンブリ命令への変換方法を示す模式図である。
図1の例では、アセンブリファイル1に記述されたx86_64の各アセンブリ命令を、変換テーブル2を用いて変換することでArmv8-Aの各アセンブリ命令が記述されたアセンブリファイル3を得る。
アセンブリファイル1には、x86_64のアセンブリ命令としてmov命令1a、add命令1b、sub命令1c、及びvpmaxsd命令1dが記述されている。
このうち、mov命令1aは、Armv8-Aにおいては7個のアセンブリ命令からなる命令列3aで実現できる。また、add命令1bはArmv8-Aのadd命令3bで実現でき、sub命令1cはArmv8-Aのsub命令3cで実現できる。
そして、vpmaxsd命令1dは、Armv8-Aにおいては12個のアセンブリ命令からなる命令列3dで実現できる。
変換テーブル2には変換元のアセンブリ命令と変換先のアセンブリ命令との対応関係が格納されており、この対応関係を利用して上記のようにアセンブリファイル1から出力アセンブリファイル3を得ることができる。
x86_64とArmv8-Aのいずれにおいても、オペランドにベクトルレジスタが指定されるアセンブリ命令がある。そこで、次にx86_64とArmv8-Aの各々のベクトルレジスタについて説明する。
図2(a)は、x86_64アーキテクチャにおけるベクトルレジスタについて説明するための模式図である。
図2(a)に示すように、x86_64アーキテクチャにおいてはベクトルレジスタとして512ビットのSIMD(Single Instruction Multiple Data)レジスタが全部で32個用意されている。これらのベクトルレジスタの名前は「zmm0」、「zmm1」、…「zmm31」である。
一方、図2(b)は、Armv8-Aアーキテクチャにおけるベクトルレジスタについて説明するための模式図である。
図2(b)に示すように、Armv8-Aアーキテクチャにおいてもベクトルレジスタとして512ビットのSIMDレジスタが32個用意されている。但し、x86_64アーキテクチャとは異なり、これらのベクトルレジスタの名前は「z0」、「z1」、…「z31」である。
x86_64のアセンブリ命令のうち、オペランドとしてベクトルレジスタのみが指定されるアセンブリ命令は、次のように容易にArmv8-Aのアセンブリ命令に変換できる。
図3は、x86_64のアセンブリ命令「vpadd zmm0, zmm1, zmm2」を変換する方法を説明する模式図である。
アセンブリ命令「vpadd zmm0, zmm1, zmm2」は、ベクトルレジスタzmm1に格納されている16個の32ビットのデータの各々と、ベクトルレジスタzmm2に格納されている16個の32ビットのデータの各々とを加算する命令である。加算により得られた16個の32ビットのデータはベクトルレジスタzmm0に格納される。
このアセンブリ命令「vpadd zmm0, zmm1, zmm2」は、Armv8-Aにおけるアセンブリ命令「add z0.s, z1.s, z2.s」で実現できる。この書式において、「.s」は、512ビットのベクトルレジスタを32ビットの16個の要素に分けて使用することを示す。また、add命令は、ベクトルレジスタz1に格納されている16個の32ビットのデータの各々と、ベクトルレジスタz2に格納されている16個の32ビットのデータの各々を加算し、結果をベクトルレジスタz0に格納する命令である。
このようにベクトルレジスタのみがオペランドに指定されたx86_64のvpadd命令は、簡単にArmv8-Aの一つのadd命令に変換することができる。
ただし、オペランドにメモリアドレスが指定されたx86_64のアセンブリ命令は、このように簡単にArmv8-Aの一つのアセンブリ命令に変換することはできない。
これについて、x86_64のアセンブリ命令「vpadd」を例にして説明する。
図4は、x86_64のアセンブリ命令「vpadd zmm0, zmm1, [r8]」をArmv8-Aのアセンブリ命令に変換する方法を示す模式図である。
アセンブリ命令「vpadd zmm0, zmm1, [r8]」は、汎用レジスタr8が示すメモリアドレスに格納されているメモリのデータとベクトルレジスタzmm1に格納されているデータとを加算し、結果をベクトルレジスタzmm0に格納する命令である。なお、図3の例と同様に、加算の対象となるデータは、16個の32ビットのデータである。
一方、Armv8-Aの命令セットには、このアセンブリ命令「vpadd」と等価な処理を実現できるアセンブリ命令がない。そのため、Armv8-Aの命令セットに含まれる複数のアセンブリ命令を組み合わせてアセンブリ命令「vpadd」と等価な処理を実現する必要がある。
この例では、Armv8-Aの命令セットに含まれる「str z31, [x9]」、「ldr z31, [x8]」、「add z0.s, z1.s, z31.s」、及び「ldr z31, [x9]」からなる命令列7で「vpadd」と等価な処理を実現する。
命令列7の最初のアセンブリ命令「str z31, [x9]」は、ベクトルレジスタz31に予め格納されているデータをメモリに退避させるためのストア命令である。その退避先は、汎用レジスタx9が示すメモリアドレスである。
次のアセンブリ命令「ldr z31, [x8]」は、汎用レジスタx8が示すメモリアドレスにあるメモリのデータをベクトルレジスタz31に格納するロード命令である。
更に次のアセンブリ命令「add z0.s, z1.s, z31.s」は、ベクトルレジスタz31に格納されたデータと、ベクトルレジスタz1にあるデータとを加算し、結果をベクトルレジスタz0に格納する命令である。
最後のアセンブリ命令「ldr z31, [x9]」は、最初のアセンブリ命令「str z31, [x9]」がメモリに退避させたデータを、元のベクトルレジスタz31に復帰させるためのロード命令である。
その命令列7におけるベクトルレジスタz31はテンポラリレジスタである。テンポラリレジスタは、ロード命令(ldr z31, [x8])のデスティネーションレジスタに指定され、かつ該ロード命令の直後のアセンブリ命令(add z0.s, z1.s, z31.s)のソースレジスタに指定されたベクトルレジスタである。
このようにテンポラリレジスタを利用した命令列7により、x86_64のアセンブリ命令「vpadd」と等価な処理を実現することができる。
但し、この方法には次のような問題がある。
図5は、その問題について説明するための模式図である。
図5では、x86_64の命令列10に含まれるアセンブリ命令の各々を、これらと等価な処理を実現するArmv8-Aの命令列に変換する場合を例示している。
命令列10におけるアセンブリ命令「vpadd zmm29, zmm0, [r8]」は、図4の例と同様にして「str z31, [z9]」、「ldr z31, [z8]」、「add z29.s, z0.s, z31」、「ldr z31, [x9]」の4個のアセンブリ命令からなる命令列11aで実現できる。
一方、アセンブリ命令「vpadd zmm30, zmm1, [r8+64]」のようにメモリオフセット「64」を含む命令は、命令列11bのようにArmv8-Aの5個のアセンブリ命令で実現できる。
その命令列11bの最初の「str z31, [x9]」は、命令列11bがテンポラリレジスタとして使用するベクトルレジスタz31のデータをメモリに退避させるストア命令である。次の「add x25, x8, 64」は、汎用レジスタx8のデータとオフセット「64」とを加算したメモリアドレスを汎用レジスタx25に格納するアセンブリ命令である。
そして、次の「ldr z31, [x25]」は、汎用レジスタx25が示すメモリアドレスにあるメモリのデータをベクトルレジスタz31に格納するロード命令である。
次の「add z30.s, z1.s, z31.s」は、ベクトルレジスタz31に格納されたデータとベクトルレジスタz1にあるデータとを加算し、その結果をベクトルレジスタz30に格納するアセンブリ命令である。
そして、最後の「ldr z31, [x9]」は、最初にメモリに退避させいておいたデータを元のベクトルレジスタz31に復帰させるロード命令である。
このような命令列11bによりアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」と等価な処理を実現できる。
これと同様に、命令列11cと命令列11dにより、それぞれ「vpadd zmm31, zmm2, [r8+128]」と「vpadd zmm29, zmm3, [r8+192]」の各々と等価な処理を実現できる。
このようにアセンブリ命令を一つずつ変換する方法では、変換元の命令列10に含まれるアセンブリ命令ごとに命令列11a~11dが生成される。そのため、これらの命令列11a~11dの各々が同一のテンポラリレジスタを使用することがある。
図5の例では、命令列11aと次の命令列11bとがテンポラリレジスタとして同一のベクトルレジスタz31を使用している。その結果、同一のベクトルレジスタz31へのデータの退避と復帰を行う二つの命令「ldr z31, [x9]」と「str z31, [x9]」とが連続してしまう。これらの命令「ldr z31, [x9]」、「str z31, [x9]」は、実行前後においてベクトルレジスタz31の内容を変化させない無駄な命令であり、これにより命令列11が無駄に長くなってしまう。
また、命令列11bの最初の命令「str z31, [x9]」と最後の命令「ldr z31, [x9]」は、仮に命令列11b以降の命令列でベクトルレジスタz31をソースオペランドとして使用しないまま、ベクトルレジスタz31をデスティネーションオペランドとして使用するアセンブリ命令が実行される場合、ベクトルレジスタz31に保持されている値は参照されることがないので不要である。
しかし、このように一つのアセンブリ命令ごとに変換を行う方法では命令列11b以降でベクトルレジスタz31を使用しているかを判定できないため、命令「str z31, [x9]」と命令「ldr z31, [x9]」とを削除できない。
以下に、このような無駄な命令を削除できる各実施形態について説明する。
(第1実施形態)
本実施形態では、x86_64アーキテクチャの命令をArmv8-Aアーキテクチャの命令列に変換する場合に、変換後の命令列が無駄に長くなるのを抑制する。そこで、まずこれらのアーキテクチャを採用したターゲットマシンについて説明する。
本実施形態では、x86_64アーキテクチャの命令をArmv8-Aアーキテクチャの命令列に変換する場合に、変換後の命令列が無駄に長くなるのを抑制する。そこで、まずこれらのアーキテクチャを採用したターゲットマシンについて説明する。
図6は、x86_64アーキテクチャを採用した第1のターゲットマシンのハードウェア構成図である。
第1のターゲットマシン30は、サーバやPC(Personal Computer)等の計算機であって、第1のプロセッサ31と第1のメモリ32とを有する。
このうち、第1のプロセッサ31は、x86_64アーキテクチャを採用したCPU(Central Procesing Unit)であって、算術演算や論理演算を行う演算器を含む第1の計算コア33と第1のレジスタファイル34とを備える。
第1のレジスタファイル34は、複数のベクトルレジスタ35と複数の汎用レジスタ36とを備えたハードウェアである。各ベクトルレジスタ35のサイズは512ビットである。また、ベクトルレジスタ35は全部で32個あり、「zmm0」、「zmm1」、…「zmm31」という文字列で各々が識別される。なお、この文字列における整数値「0」、「1」、…「31」は各ベクトルレジスタ35のレジスタ番号を示す。
一方、各汎用レジスタ36のサイズは64ビットである。汎用レジスタ36は全部で16個あり、各々が「eax」、「ebx」、「ecx」、「edx」、「edi」、「esi」、「esp」、「ebp」、「r8」、「r9」、…「r15」という文字列で識別される。ベクトルレジスタ35と同様に、この文字列における整数値「8」、「9」、…「15」は各汎用レジスタ36のレジスタ番号を示し、「eax」、「ebx」、「ecx」、「edx」、「edi」、「esi」、「esp」、「ebp」のレジスタ番号はそれぞれ例えば「0」、「1」、…「7」である。
また、第1のメモリ32は、x86_64の機械語が展開されるDRAM(Dynamic Random Access Memory)等の揮発性メモリである。
図7は、Armv8-Aアーキテクチャを採用した第2のターゲットマシンのハードウェア構成図である。
第2のターゲットマシン40は、サーバやPC等の計算機であって、第2のプロセッサ41と第2のメモリ42とを有する。
第2のプロセッサ41は、Armv8-Aアーキテクチャを採用したCPUであって、算術演算や論理演算を行う演算器を含む第2の計算コア43と第2のレジスタファイル44とを備える。
第2のレジスタファイル44は、複数のベクトルレジスタ45と複数の汎用レジスタ46とを備えたハードウェアである。各ベクトルレジスタ45のサイズは512ビットである。また、ベクトルレジスタ45は全部で32個あり、「z0」、「z1」、…「z31」という文字列で各々が識別される。なお、この文字列における整数値「0」、「1」、…「31」は各ベクトルレジスタ45のレジスタ番号を示す。
一方、各汎用レジスタ46のサイズは64ビットである。汎用レジスタ46は全部で32個あり、各々が「x0」、「x1」、…「x31」という文字列で識別される。ベクトルレジスタ45と同様に、この文字列における整数値「0」、「1」、…「31」は各汎用レジスタ46のレジスタ番号を示す。
また、第2のメモリ42は、Armv8-Aの機械語が展開されるDRAM等の揮発性メモリである。
図8は、第1のプロセッサ31向けのアセンブリ命令を第2のプロセッサ41向けの命令列に変換するための情報処理装置のハードウェア構成図である。
図8に示すように、情報処理装置50は、記憶装置50a、メモリ50b、プロセッサ50c、通信インターフェース50d、表示装置50e、及び入力装置50fを有する。これらの各部は、バス50gにより相互に接続される。
このうち、記憶装置50aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージデバイスであり、本実施形態に係るアセンブリ命令変換プログラム49を記憶する。
なお、アセンブリ命令変換プログラム49をコンピュータが読み取り可能な記録媒体50hに記録させておき、プロセッサ50cに記録媒体50hのアセンブリ命令変換プログラム49を読み取らせるようにしてもよい。
そのような記録媒体50hとしては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体50hとして使用してもよい。これらの記録媒体50hは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
更に、公衆回線、インターネット、及びLAN(Local Area Network)等に接続された装置にアセンブリ命令変換プログラム49を記憶させておき、プロセッサ50cがそのアセンブリ命令変換プログラム49を読み出して実行するようにしてもよい。
一方、メモリ50bは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に前述のアセンブリ命令変換プログラム49が展開される。
プロセッサ50cは、情報処理装置50の各部を制御したり、メモリ50bと協働してアセンブリ命令変換プログラム49を実行したりするCPUやGPU(Graphical Processing Unit)等のハードウェアである。
更に、通信インターフェース50dは、情報処理装置50をLAN(Local Area Network)等のネットワークに接続するためのインターフェースである。
そして、表示装置50eは、液晶表示装置等のハードウェアであって、開発者に種々の情報の入力を促すプロンプトを表示する。また、入力装置50fは、キーボードやマウス等のハードウェアである。
次に、本実施形態に係る情報処理装置50が行う処理の概要について説明する。
図9は、本実施形態に係るアセンブリ命令変換方法を説明するための模式図である。
本実施形態では、情報処理装置50が、変換対象となる複数のアセンブリ命令65a~65dが記述されたアセンブリファイル65を取得することにより、アセンブリ命令65a~65dをこの順に取得する。アセンブリ命令65a~65dは、x86_64アーキテクチャの命令であって、この順に実行されるものとする。
次に、情報処理装置50が、取得したアセンブリ命令65a~65dごとに、生成指示66をFIFO(First In First Out)バッファ60に格納する。FIFOバッファ60は、記憶装置50aやメモリ50b等に確保された記憶領域の一例である。
生成指示66は、x86_64のアセンブリ命令65a~65dの各々と等価な処理を行うArmv8-Aの命令列の生成を指示する情報である。この例では、複数の生成指示66の各々を「vpadd zmm30, xmm1, [r8+64]」等のx86_64のアセンブリ命令で識別する。例えば、「vpadd zmm30, xmm1, [r8+64]」で識別される生成指示66は、アセンブリ命令65bに対応しており、x86_64のアセンブリ命令「vpadd zmm30, xmm1, [r8+64]」と等価な処理を行うArmv8-Aの命令列を生成する指示を表す。
また、FIFOバッファ60に生成指示66が格納される順序は、情報処理装置50がアセンブリ命令65a~65dを取得する順序と同じである。よって、最初に情報処理装置50がアセンブリ命令「vpadd zmm29, zmm0, [r8]」を取得すると、このアセンブリ命令に係る生成指示66がFIFOバッファ60に格納される。その後、「vpadd zmm30, xmm1, [r8+64]」、「vpadd zmm31, zmm2, [r8+128]」、「vpadd zmm29, zmm3, [r8+192]」の各々に係る生成指示66がFIFOバッファ60に格納されていく。
次に、情報処理装置50は、FIFOバッファ60を参照することにより、複数の生成指示66の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35を特定する。
この例では、4個の生成指示66が使用する第1のベクトルレジスタ35は、「0」、「1」、「2」、「3」、「29」、「30」、及び「31」の各レジスタ番号で識別されるレジスタである。よって、情報処理装置50は、これらのレジスタ番号以外の第1のベクトルレジスタ35を特定する。ここでは、第1のベクトルレジスタ35のレジスタ番号0~31のうち、上記の「0」、「1」、「2」、「3」、「29」、「30」、及び「31」の全てと異なる最大の整数値「28」をレジスタ番号として有する第1のベクトルレジスタ35を情報処理装置50が特定する。
続いて、情報処理装置50は、上記で特定した第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45をテンポラリレジスタとして特定する。
この例では、レジスタ番号が「28」の第1のベクトルレジスタ35を情報処理装置50が特定している。よって、情報処理装置50は、これと同じレジスタ番号「28」を有する「z28」の第2のベクトルレジスタ45をテンポラリレジスタとして決定する。
そして、情報処理装置50は、変換テーブル61を参照することにより、アセンブリ命令65a~65dの各々と等価な処理を行うArmv8-Aの命令列67a~67dを生成する。変換テーブル61は、x86_64のアセンブリ命令と、それと等価な処理をするArmv8-Aの命令列とを対応付けたテーブルである。例えば、変換テーブル61には、x86_64のアセンブリ命令「vpadd」と、これと等価なArmv8-Aの命令列「ldr, add」が対応付けられている。また、情報処理装置50は、命令列67a~67dの各々において、前述の「z28」の第2のベクトルレジスタ45をテンポラリレジスタとして使用する。
例えば、x86_64のアセンブリ命令65bは、Armv8-Aの命令列67bにより等価な処理が実現される。その命令列67bにおいては「z28」の第2のベクトルレジスタ45がテンポラリレジスタとして使用されるが、「z28」に対応する「zmm28」の第1のベクトルレジスタ35は後続の命令65c、65dで使用されていない。よって、「z28」の第2のベクトルレジスタ45のデータを第2のメモリ42に退避させるためのストア命令を命令列67bの最初に追加する必要がない。同様に、そのデータを「z28」の第2のベクトルレジスタ45に復帰させるためのロード命令を命令列67bの最後に追加する必要もない。
同様の理由により、命令列67a、67c~67dの各々の最初と最後にストア命令とロード命令を追加する必要もない。
これにより、本実施形態では命令列67a~67dの各々に無駄なストア命令とロード命令が追加されないため、命令列67a~67dの命令数を少なくでき、実行時間が長くなるのを抑制することができる。
なお、これらの命令列67a~67dの後続のアセンブリ命令が「z28」の第2のベクトルレジスタ45を使用している場合もある。この場合に上記のように「z28」の第2のベクトルレジスタ45をテンポラリレジスタとして使用すると、後続のアセンブリ命令が使用する予定のデータが命令列67a~67dによって壊されてしまう。
そのため、情報処理装置50は、命令列67a~67dの最初に、「z28」の第2のベクトルレジスタ45のデータを第2のメモリ42に退避させる「str z28, [x9]」というストア命令68を追加する。そして、命令列67a~67dの最後に、退避させておいたデータを「z28」の第2のベクトルレジスタ45に復帰させるための「ldr z28, [x9]」というロード命令69を追加する。これにより、「z28」の第2のベクトルレジスタ45をテンポラリレジスタとして使用したことに起因して命令列67a~67dの後続のアセンブリ命令の実行結果が変わってしまうのを防ぐことができる。
その後、情報処理装置50は、命令列67a~67d、ストア命令68、及びロード命令69の各々が記述されたアセンブリファイル67を外部に出力する
次に、本実施形態に係る情報処理装置50の機能構成について説明する。
次に、本実施形態に係る情報処理装置50の機能構成について説明する。
図10は、本実施形態に係る情報処理装置50の機能構成図である。
図10に示すように、情報処理装置50は、記憶部51と制御部52とを有する。
このうち、記憶部51は、FIFOバッファ60と変換テーブル61とを記憶する処理部である。一例として、記憶部51は、図8の記憶装置50aとメモリ50bとにより実現される。
一方、制御部52は、情報処理装置50の各部を制御する処理部であって、取得部53、格納部54、判定部55、特定部56、決定部57、生成部58、及び出力部59を有する。
このうち、取得部53は、アセンブリファイル65を取得することにより、そのアセンブリファイル65に記述された変換対象のx86_64のアセンブリ命令65a~65dを取得する処理部である。
格納部54は、取得したアセンブリ命令65a~65dごとに、生成指示66をFIFOバッファ60に格納する処理部である。なお、FIFOバッファ60は、取得部53がアセンブリ命令65a~65dを取得する前では空である。
また、格納部54は、取得部53がアセンブリ命令65a~65dを取得する度にFIFOバッファ60に生成指示66を格納する。そのため、FIFOバッファ60に生成指示66が格納される順序は、取得部53がアセンブリ命令65a~65dを取得する順序と同じになる。
判定部55は、取得部53が新たに取得したアセンブリ命令の種類が、FIFOバッファ60に既に格納されている生成指示66が示すアセンブリ命令の種類と異なるかを判定する処理部である。アセンブリ命令の種類は、アセンブリ命令の名前とオペランドの型との組み合わせである。
なお、本実施形態では、FIFOバッファ60に複数の生成指示66が格納されている場合、格納されている全ての生成指示66が示すアセンブリ命令の種類は全て同一となる。よって、判定部55は、複数の生成指示66のうちのいずれかのセンブリ命令の種類が、取得部53が新たに取得したアセンブリ命令の種類と異なるかを判定することになる。
特定部56は、FIFOバッファ60を参照することにより、複数の生成指示66の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35を特定する処理部である。そのような第1のベクトルレジスタ35が複数ある場合、特定部56は、複数の第1のベクトルレジスタ35のうちでレジスタ番号が最大の第1のベクトルレジスタ35を特定する。
決定部57は、特定部56が特定した第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45を、命令列67a~67dの各々が使用するテンポラリレジスタとして決定する。なお、本実施形態では、同じレジスタ番号を有する第1のベクトルレジスタ35と第2のベクトルレジスタ45とを互いに対応するベクトルレジスタと呼ぶ。
生成部58は、FIFOバッファ60の生成指示66ごとに、生成指示66に係るアセンブリ命令65a~65bの各々と等価な処理を行う命令列67a~67dを生成する処理部である。例えば、生成部58は、変換テーブル61を参照することにより、アセンブリ命令65aに対応する命令列67aを生成する。このとき、生成部58は、決定部57が決定したテンポラリレジスタを命令列67aで使用する。
また、生成部58は、テンポラリレジスタのデータを第2のメモリ42に退避するストア命令と、そのデータをテンポラリレジスタに復帰させるロード命令を命令列67a~67dの各々に追加しない。これにより、図9を参照して説明したように、無駄なストア命令とロード命令によって命令列67a~67dの命令数を少なくでき、実行時間が長くなるのを抑制できる。
更に、生成部58は、命令列67a~67dの最初に、テンポラリレジスタとして使用する第2のベクトルレジスタ45のデータを第2のメモリ42に退避させるストア命令68を追加する。また、生成部58は、命令列67a~67dの最後に、当該データを元の第2のベクトルレジスタ45に復帰させるロード命令69を追加する。
出力部59は、命令列67a~67d、ストア命令68、及びロード命令69の各々が記述されたアセンブリファイル67を外部に出力する処理部である。
次に、本実施形態に係るアセンブリ命令変換方法について説明する。
図11は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、取得部53が、x86_64のアセンブリ命令65aを取得する(ステップS11)。
次に、判定部55が、ステップS11で取得部53が取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と異なるかを判定する(ステップS12)。
ここで、ステップS11で取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と同じ場合(ステップS12:否定)はステップS13に移る。なお、FIFOバッファ60が空の場合もステップS13に移る。
ステップS13においては、格納部54が、ステップS11で取得したアセンブリ命令65aに係る生成指示66をFIFOバッファ60に格納する。
一方、ステップS11で取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と異なる場合(ステップS12:肯定)はステップS14に移る。
ステップS14においては、特定部56が、FIFOバッファ60を参照することにより、複数の生成指示66の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35を特定する。
次に、決定部57が、特定部56が特定した第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45をテンポラリレジスタとして決定する(ステップS15)。
次いで、生成部58は、FIFOバッファ60の生成指示66ごとに、生成指示66に係るアセンブリ命令65a~65bの各々と等価な処理を行う命令列67a~67dを生成する(ステップS16)。このとき、生成部58は、ステップS15で決定したテンポラリレジスタを命令列67aで使用する。更に、生成部58は、命令列67a~67dの最初と最後に、それぞれストア命令68とロード命令69とを追加する。その後、生成部58がFIFOバッファ60を空にする。
次に、格納部54が、ステップS11で取得したアセンブリ命令65aに係る生成指示66をFIFOバッファ60に格納する(ステップS17)。
この後は、取得部53がアセンブリ命令を取得する度にステップS11~S17を繰り返す。
次に、生成部58が、FIFOバッファ60に残っている生成指示66に従い、当該生成指示66が示すアセンブリ命令と等価な処理をするArmv8-Aの命令列を生成する(ステップS18)。
その後に、出力部59が、ステップS15とステップS18の各々で生成した命令列が記述された出力ファイルを外部に出力する(ステップS19)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
次に、本実施形態においてFIFOバッファ60の内容がどのように変わるのかについて説明する。
図12(a)~(f)は、図11のフローチャートに従った場合のFIFOバッファ60の内容の変遷を示す模式図である。
図12(a)に示すように、ステップS11で取得部53がアセンブリ命令65a~65dを取得する前はFIFOバッファ60は空である。
次いで、図12(b)に示すように、ステップS11で「vpadd zmm29, zmm0, [r8]」のアセンブリ命令65aを取得すると、ステップS13において該アセンブリ命令65aに係る生成指示66がFIFOバッファ60に格納される。
この状態で更にステップS11で「vpadd zmm30, zmm1, [r8+64]」のアセンブリ命令65bを取得したとする。ここで、FIFOバッファ60に既に格納されている生成指示66が示すアセンブリ命令「vpadd zmm29, zmm0, [r8]」と、今回新たに取得したアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」は、名前が「vpadd」で同一である。更に、両アセンブリ命令の第1~第3オペランドの型も同一である。よって、FIFOバッファ60に既に格納されている生成指示66が示すアセンブリ命令「vpadd zmm29, zmm0, [r8]」と、今回新たに取得したアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」の各々の種類は同じである。
そのため、この場合にはステップS12からステップS13に移り、図12(c)のようにアセンブリ命令65bに係る生成指示66がFIFOバッファ60に格納される。
これと同様にして、図12(d)~(e)に示すように、アセンブリ命令65c~65dに係る生成指示66がFIFOバッファ60に格納される。
その後に、ステップS11において取得部53がx86_64のアセンブリ命令「ret」を取得したとする。そのアセンブリ命令「ret」は、この時点で既にFIFOバッファ60に格納されている4個の生成指示66が示すアセンブリ命令「vpadd」と名前が相違する。よって、この場合にはステップS16でFIFOバッファ60が空にされる。
その後に、図12(f)に示すように、ステップS17においてアセンブリ命令「ret」に係る生成指示66がFIFOバッファ60に格納される。
このように、本実施形態ではステップS11で取得したアセンブリ命令の種類に応じてステップS12の分岐先が変わる。そのため、FIFOバッファ60に格納される生成指示66が示すアセンブリ命令の名前は同一となる。
上記した本実施形態によれば、格納部54が、複数のアセンブリ命令65a~65dの各々に係る生成指示66をFIFOバッファ60に格納する。そのため、特定部56が、FIFOバッファ60を参照することにより、複数のアセンブリ命令65a~65dの各々が使用していない第1のベクトルレジスタ35を特定することができる。
そして、決定部57が、特定した第1のベクトルレジスタ35に対応した第2のベクトルレジスタ45をテンポラリレジスタとして決定する。そのテンポラリレジスタに対応する第1のベクトルレジスタ35は複数のアセンブリ命令65a~65dのいずれも使用していない。
そのため、生成部58が、テンポラリレジスタのデータを第2のメモリ42に退避させるストア命令と、そのデータをテンポラリレジスタに復帰させるためのロード命令とを各命令列67a~67dに含める必要がない。その結果、これらのストア命令やロード命令によって各命令列67a~67dが無駄に長くなるのを抑制することができる。
(第2実施形態)
本実施形態では、第1実施形態とは異なる方法でテンポラリレジスタを決定する。
本実施形態では、第1実施形態とは異なる方法でテンポラリレジスタを決定する。
図13は、本実施形態に係るアセンブリ命令変換方法を説明するための模式図である。なお、図13において、第1実施形態で説明したのと同じ要素には第1実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図13では、情報処理装置50が、アセンブリファイル65を取得することにより、x86_64の二つの連続したアセンブリ命令65a、65bをこの順に取得した場合を想定している。この場合、情報処理装置50は、まずアセンブリ命令65aに係る生成指示66をFIFOバッファ60に格納する。そして、情報処理装置50は、後続のアセンブリ命令65bを取得した時点で、先行のアセンブリ命令65aで使用するテンポラリレジスタを決定する。
この例では、後続のアセンブリ命令65bのデスティネーションレジスタは、「zmm30」の第1のベクトルレジスタ35である。一方、先行のアセンブリ命令65aは上記の「zmm30」の第1のベクトルレジスタ35を使用していない。
よって、仮にアセンブリ命令65aにおいて「zmm30」をテンポラリレジスタとして使用しても、結局は後続のアセンブリ命令65bで「zmm30」の内容が上書きされるため、アセンブリ命令65a、65bの実行結果は変わらない。
そこで、情報処理装置50は、「zmm30」に対応した「z30」の第2のベクトルレジスタ45をテンポラリレジスタとして使用したArmv8-Aの命令列67aを生成する。その命令列67aは、x86_64のアセンブリ命令65aと等価な処理を実現する命令列である。
また、「zmm30」の第1のベクトルレジスタ35の内容は後続のアセンブリ命令65bで上書きされる。よって、「z30」のデータを第2のメモリ42に退避させるストア命令と、当該データを「z30」に復帰させるためのロード命令とを情報処理装置50が命令列67aに追加する必要がなく、命令列67aが無駄に長くなるのを抑制できる。
なお、命令列67aの生成に際し、情報処理装置50は変換テーブル61を参照する。第1実施形態で説明したように、変換テーブル61には、x86_64のアセンブリ命令「vpadd」と、これと等価なArmv8-Aの命令列「ldr, add」が対応付けられている。この対応関係を基にして、情報処理装置50は命令列67aを生成することができる。
図14は、図13の例とは異なり、アセンブリ命令65bのデスティネーションレジスタ「zmm1」が先行のアセンブリ命令65aのソースレジスタとして使用されている場合の模式図である。
この場合に、命令列67aに示すように、「zmm1」に対応した「z1」の第2のベクトルレジスタ45をテンポラリレジスタとして使用したとする。その命令列67aを実行すると、アセンブリ命令「ldr」によって、「x8」の第2の汎用レジスタ46が示すメモリアドレスのデータが「z1」の第2のベクトルレジスタ45に格納される。そして、アセンブリ命令「add」により、「z1」にあるデータ同士が加算されてその結果が「z30」に格納される。
一方、アセンブリ命令65aを実行すると、「r8」の第1の汎用レジスタ36が示すメモリアドレスのデータと「zmm1」のデータとが加算されてその結果が「zmm30」に格納される。よって、アセンブリ命令65aと命令列67aとは実行結果が異なってしまい、命令列67aはアセンブリ命令65aと等価にならない。
以上のように、アセンブリ命令65bのデスティネーションレジスタをテンポラリレジスタとするには、該デスティネーションレジスタが先行のアセンブリ命令65aでソースレジスタとして使用されていないことが必要となる。
なお、アセンブリ命令65bのデスティネーションレジスタがアセンブリ命令65aのソースレジスタとして使用されていない場合であっても、以下のような問題が生じることがある。
図15は、その問題について説明するための模式図である。
図15の例では、アセンブリ命令65bのデスティネーションレジスタは「zmm1」であり、アセンブリ命令65aのソースレジスタ「zmm0」とは異なる。但し、アセンブリ命令65bのソースレジスタとデスティネーションレジスタが両方とも「zmm1」で同一である。
この場合に、命令列67aが、アセンブリ命令65bのデスティネーションレジスタの「zmm1」に対応した「z1」の第2のベクトルレジスタ45をテンポラリレジスタとして使用したとする。その命令列67aを実行すると、「z1」の第2のベクトルレジスタ45には、「x8」の第2の汎用レジスタ46が示すメモリアドレスのデータが格納されてしまい、「z1」の内容が破壊されてしまう。「z1」に対応した「zmm1」の第1のベクトルレジスタ35にはアセンブリ命令65bが使用するデータが格納されていたため、これではアセンブリ命令65bの実行結果が変わってしまう。
以上のように、アセンブリ命令65bのデスティネーションレジスタをテンポラリレジスタとして使用するには、図16の条件Aと条件Bの両方が満たされる必要がある。
図16は、本実施形態に係る情報処理装置50が判定する条件を示す模式図である。
情報処理装置50は、条件Aと条件Bの両方の条件が満たされる場合に、図13のように、x86_64のアセンブリ命令65aに等価なArmv8-Aの命令列67aを生成する。その命令列67aでは、アセンブリ命令65bのデスティネーションレジスタに対応する第2のベクトルレジスタ45がテンポラリレジスタとして使用される。また、情報処理装置50は、そのテンポラリレジスタのデータを第2のメモリ42に退避させるストア命令と、該データをテンポラリレジスタに復帰させるためのロード命令とを生成しない。これにより、命令列が無駄に長くなるのを抑制することができる。
次に、情報処理装置50の機能構成について説明する。
図17は、本実施形態に係る情報処理装置50の機能構成図である。なお、図17において、第1実施形態で説明したのと同じ要素には第1実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図17に示すように、情報処理装置50の制御部52は、第1実施形態で説明した取得部53と格納部54の他に、判定部71、決定部72、生成部73、及び出力部74を有する。
このうち、取得部53は、図13のx86_64のアセンブリ命令65a、65bが記述されたアセンブリファイル65を取得することにより、アセンブリ命令65a、65bをこの順に取得する処理部である。そして、格納部54は、これらのアセンブリ命令65a、65bの各々に係る生成指示66をFIFOバッファ60に格納する処理部である。
判定部71は、FIFOバッファ60に既に格納されている生成指示66に係るアセンブリ命令65aと、新たに取得したアセンブリ命令65bとに基づいて、図16の条件Aと条件Bの両方が満たされるかを判定する処理部である。
決定部72は、条件Aと条件Bの両方が満たされる場合に、アセンブリ命令65bのデスティネーションレジスタに対応した第2のベクトルレジスタ45を、命令列67aにおけるテンポラリレジスタとして決定する処理部である。
生成部73は、決定部72が決定したテンポラリレジスタを使用した命令列67aを生成する処理部である。そして、出力部74は、命令列67aが記述されたアセンブリファイル67を外部に出力する処理部である。
次に、本実施形態に係るアセンブリ命令変換方法について説明する。
図18及び図19は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、取得部53が、x86_64のアセンブリ命令65aを取得する(ステップS21)。
次に、判定部71が、FIFOバッファ60が空かどうかを判定する(ステップS22)。
FIFOバッファ60が空である場合(ステップS22:肯定)はステップS23に移る。ステップS23においては、格納部54が、ステップS21で取得したアセンブリ命令65aに係る生成指示66をFIFOバッファ60に格納する。
一方、FIFOバッファ60が空ではない場合(ステップS22:否定)はステップS24に移る。ステップS24においては、判定部71が、ステップS21で取得部53が取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と異なるかを判定する。
なお、第1実施形態とは異なり、本実施形態ではFIFOバッファ60には一つの生成指示66のみが格納される。よって、判定部71は、FIFOバッファ60に格納されている一つの生成指示66のセンブリ命令の種類が、ステップS21で取得したアセンブリ命令の種類と異なるかを判定すればよい。
ここで、ステップS21で取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と異なる場合(ステップS24:肯定)はステップS25に移る。
ステップS25においては、図4で説明した方法を用いて、アセンブリ命令65aと等価な処理を行うArmv8-Aの命令列を生成部73が生成する。この方法では、生成部73が、テンポラリレジスタにあるデータを退避させるストア命令を命令列の最初に追加する。また、生成部73は、命令列の最後に、該データをテンポラリレジスタに復帰させるロード命令を追加する。よって、ステップS25では、これらのストア命令とロード命令によって命令数が増え、命令数の削減が実行されない。
一方、ステップS21で取得したアセンブリ命令の種類が、FIFOバッファ60に格納されている生成指示66が示すアセンブリ命令の種類と同じ場合(ステップS24:否定)はステップS26に移る。
ステップS26においては、判定部71が、図16の条件Aと条件Bの両方が満たされるかを判定する。
ここで、条件Aと条件Bの両方が満たされない場合(ステップS26:否定)には前述のステップS25を行う。
一方、条件Aと条件Bの両方が満たされる場合(ステップS26:肯定)にはステップS27に移る。例えば、図13に示したように、アセンブリ命令65aに係る生成指示66が既にFIFOバッファにあり、この状態でステップS21でアセンブリ命令65bを取得した場合を考える。この場合は、アセンブリ命令65bのデスティネーションレジスタ「zmm30」が、アセンブリ命令65aのソースレジスタ「zmm0」と異なるため、条件Aを満たす。更に、アセンブリ命令65bのデスティネーションレジスタ「zmm30」とソースレジスタ「zmm1」とが異なるため、条件Bも満たす。
この場合、ステップS27においては、決定部57が、アセンブリ命令65bのデスティネーションレジスタ「zmm30」に対応した「z30」の第2のベクトルレジスタ45をテンポラリレジスタとして決定する。
次に、生成部73が、ステップS27で決定部57が決定したテンポラリレジスタを使用した命令列67aを生成する(ステップS28)。図13に示したように、その命令列67aには、テンポラリレジスタのデータを第2のメモリ42に退避させるストア命令と、該データをテンポラリレジスタに復帰させるロード命令とがないため、命令数を削減することができる。
上記のようにしてステップS25又はステップS28を終えた後はステップS29に移る。
ステップS29においては、格納部54がFIFOバッファ60を空にする。
次いで、格納部54が、ステップS21で取得したアセンブリ命令に係る生成指示66をFIFOバッファ60に格納する(ステップS30)。
この後は、取得部53がアセンブリ命令を取得する度にステップS21~S30を繰り返す。
次に、生成部73が、FIFOバッファ60に残っている生成指示66に従い、当該生成指示66が示すアセンブリ命令と等価な処理をするArmv8-Aの命令列を生成する(ステップS31)。
その後に、出力部74が、ステップS25、S28、S31の各々で生成した命令列が記述された出力ファイルを外部に出力する(ステップS32)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
次に、本実施形態においてFIFOバッファ60の内容がどのように変わるのかについて説明する。
図20は、取得部53が取得したアセンブリ命令65a~65dの模式図である。以下では、取得部53がアセンブリ命令65a~65dをこの順に取得した場合を例にして説明する。
図21(a)~(e)は、図18及び図19のフローチャートに従った場合のFIFOバッファ60の内容の変遷を示す模式図である。
図21(a)に示すように、ステップS21で取得部53がアセンブリ命令65aを取得する前はFIFOバッファ60は空である。
次いで、図21(b)に示すように、ステップS21で「vpadd zmm29, zmm0, [r8]」のアセンブリ命令65aを取得すると、ステップS23において該アセンブリ命令65aに係る生成指示66がFIFOバッファ60に格納される。
この状態で更にステップS21で「vpadd zmm30, zmm1, [r8+64]」のアセンブリ命令65bを取得したとする。ここで、FIFOバッファ60に既に格納されている生成指示66が示すアセンブリ命令「vpadd zmm29, zmm0, [r8]」と、今回新たに取得したアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」は、名前が「vpadd」で同一である。更に、両アセンブリ命令の第1~第3オペランドの型も同一である。
更に、先行の「vpadd zmm29, zmm0, [r8]」と後続の「vpadd zmm30, zmm1, [r8+64]」は条件Aと条件Bの両方を満たす。よって、この場合にはステップS28において命令列が生成された後、ステップS29でFIFOバッファ60が空にされる。
その後、図21(c)に示すように、ステップS30でFIFOバッファ60に「vpadd zmm30, zmm1, [r8+64]」に係る生成指示66が格納される。
以下、同様にして、図21(d)~(e)のようにFIFOバッファ60に一つの生成指示66のみが格納されていく。
以上説明した本実施形態によれば、格納部54が、アセンブリ命令65aに係る生成指示66をFIFOバッファ60に格納する。そのため、判定部71が、FIFOバッファ60を参照することにより、生成指示66に係るアセンブリ命令65aと後続のアセンブリ命令65bに対し、図16の条件Aと条件Bの両方が満たされるかを判定できる。
そして、条件Aと条件Bの両方が満たされる場合に、決定部72が、アセンブリ命令65bのデスティネーションレジスタに対応した第2のベクトルレジスタ45を命令列67aにおけるテンポラリレジスタとして決定する。そのテンポラリレジスタのデータは後続のアセンブリ命令65bによって上書きされる。そのため、当該データを第2のメモリ42に退避させるストア命令と、当該データをテンポラリレジスタに復帰させるロード命令とを生成部73が生成する必要がなく、命令列67aが無駄に長くなるのを抑制することができる。
(第3実施形態)
第1実施形態と第2実施形態ではFIFOバッファ60を利用して命令数を削減した。これに対し、本実施形態では以下のようにFIFOバッファ60を不要とする。
第1実施形態と第2実施形態ではFIFOバッファ60を利用して命令数を削減した。これに対し、本実施形態では以下のようにFIFOバッファ60を不要とする。
図22は、本実施形態に係るアセンブリ命令変換方法を説明するための模式図である。なお、図22において、第1実施形態や第2実施形態で説明したのと同じ要素にはこれらの実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図22では、情報処理装置50が、x86_64のアセンブリ命令65a~65cが記述されたアセンブリファイル65を取得した場合を想定している。本実施形態では、開発者が、各アセンブリ命令65a~65cよりも前の位置におけるアセンブリファイル65にコード65xを記述する。コード65xは、テンポラリレジスタとして使用可能な第1のベクトルレジスタ35を指定するコードであって、開発者によって記述される。
図22の例では、文字列「release」に続く文字列「zmm8」により、「zmm8」の第1のベクトルレジスタ35がテンポラリレジスタであることが特定される。
更に、情報処理装置50は、変換テーブル61を参照することにより、x86_64の各アセンブリ命令65a~65cと等価な処理を行うArmv8-Aの命令列67a~67cを生成する。このとき、情報処理装置50は、「zmm8」に対応した「z8」の第2のベクトルレジスタ45を命令列67a、67bのテンポラリレジスタとして使用する。
なお、開発者は、第2のメモリ42へのデータの退避や、第2のメモリ42からのデータの復帰が不要なベクトルレジスタをコード65xにおいてテンポラリレジスタとして指定する。そのため、情報処理装置50は、テンポラリレジスタのデータを第2のメモリ42に退避させるためのストア命令を各命令列67a、67bに含めない。同様に、情報処理装置50は、第2のメモリ42からテンポラリレジスタにデータを復帰させるためのロード命令を各命令列67a、67bに含めない。これにより、ロード命令やストア命令によって各命令列67a、67bが無駄に長くなるのを抑制することができる。
また、この例では、アセンブリ命令65bのデスティネーションレジスタが、コード65xで指定された「zmm8」の第1のベクトルレジスタ35と同じである。この場合に後続のアセンブリ命令65cで「zmm8」をテンポラリレジスタとして使用してしまうと、アセンブリ命令65bが「zmm8」の第1のベクトルレジスタ35に格納したデータをアセンブリ命令65cが上書きしてしまう。
よって、この場合は、情報処理装置50は、コード65xで指定されたのとは異なる「z31」の第2のベクトルレジスタ45を命令列67cで使用する。「z31」の第2のベクトルレジスタ45には、命令列67cの後続命令で使用するデータが格納されている可能性がある。そのため、情報処理装置50は、そのデータを第2のメモリ42に退避させるアセンブリ命令「str z31.s, [x9]」を命令列67cの先頭に追加する。また、情報処理装置50は、第2のメモリ42から「z31」に復帰させるアセンブリ命令「ldr z31.s, [x9]」を命令列67cの最後に追加する。
図23は、本実施形態に係る情報処理装置50の機能構成図である。
なお、図23において、第1実施形態や第2実施形態で説明したのと同じ要素にはこれらの実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図23に示すように、本実施形態における記憶部51は、変換テーブル61の他にテンポラリレジスタリスト87を記憶する。テンポラリレジスタリスト87は、コード65xで指定された第1のベクトルレジスタ35の名前「zmm8」を格納するリストである。
一方、制御部52は、取得部80、判定部81、リスト制御部82、決定部83、生成部84、及び出力部85を有する。
このうち、取得部80は、アセンブリファイル65を取得する処理部である。そして、判定部81は、そのアセンブリファイル65にコード85xがあるかを判定する。
リスト制御部82は、コード85xで指定された第1のベクトルレジスタ35の名前をテンポラリレジスタリスト87に追加する処理部である。
また、決定部83は、テンポラリレジスタリスト87に格納されている名前を特定し、その名前に対応する第2のベクトルレジスタ45をテンポラリレジスタとして決定する処理部である。
生成部84は、アセンブリ命令65a~65bの各々と等価な処理を行う命令列67a~67dを生成する処理部である。例えば、生成部84は、変換テーブル61を参照することにより、アセンブリ命令65aに対応する命令列67aを生成する。このとき、生成部84は、決定部83が決定したテンポラリレジスタを命令列67aで使用する。
なお、生成部84は、テンポラリレジスタのデータを第2のメモリ42に退避するストア命令と、そのデータをテンポラリレジスタに復帰させるロード命令を命令列67a~67dの各々に追加しない。これにより、無駄なストア命令とロード命令によって命令列67a~67dの実行時間が長くなるのを抑制できる。
出力部85は、命令列67a~67dが記述されたアセンブリファイル67を外部に出力する処理部である。
次に、本実施形態に係るアセンブリ命令変換方法について説明する。
図24は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
最初に、取得部80が、アセンブリファイル65を取得する(ステップS31)。
これ以降は、アセンブリファイル65の行ごとに以下の処理を繰り返す。
まず、判定部81が、処理対象の行にコード65xが記述されているかを判定することにより、アセンブリファイル65にコード85xがあるかを判定する(ステップS32)。
ここで、コード65xが記述されている場合(ステップS32:肯定)はステップS33に移る。
ステップS33においては、リスト制御部82が、コード85xで指定された第1のベクトルレジスタ35の名前をテンポラリレジスタリスト87に追加する。
図25(a)は、そのテンポラリレジスタリスト87の模式図である。ここでは、図23のようにコード65xが指定する第1のベクトルレジスタ35の名前が「zmm8」である場合を例示している。
再び図24を参照する。
一方、コード65xが記述されていない場合(ステップS32:否定)はステップS34に移る。
ステップS34においては、決定部83が、テンポラリレジスタリスト87に格納されている名前を特定し、その名前に対応する第2のベクトルレジスタ45をテンポラリレジスタとして決定する。
次に、生成部84が、処理中の行に記述されたx86_64のアセンブリ命令と等価な処理を行うArmv8-Aの命令列を生成する(ステップS35)。このとき、生成部84は、ステップS34で決定したテンポラリレジスタを命令列に使用する。
例えば、処理中の行に記述されているアセンブリ命令が、図22のアセンブリ命令65aであるとする。この場合、生成部84は、変換テーブル61を参照することにより、「ldr」と「add」の各アセンブリ命令を用いた命令列67aを生成する。更に、生成部84は、その命令列67aにおいて、テンポラリレジスタリスト87に格納されている名前「zmm8」に対応した「z8」の第2のベクトルレジスタ45をテンポラリレジスタとして使用する。
次に、判定部81が、テンポラリレジスタリスト87に、処理中の行に記述されているアセンブリ命令のデスティネーションレジスタの名前があるかを判定する(ステップS36)。例えば、処理中の行に図22のアセンブリ命令65bが記述されており、テンポラリレジスタリスト87に名前「zmm8」が格納されている場合を考える。この場合は、アセンブリ命令65bのデスティネーションレジスタが「zmm8」であるため、テンポラリレジスタリスト87にその名前があることになる。
この場合に後続のアセンブリ命令65cにおいて「zmm8」をテンポラリレジスタとして使用すると、前述のようにアセンブリ命令65bが「zmm8」に書き込んだデータをアセンブリ命令65cが上書きしてしまう。
これを防ぐために、デスティネーションレジスタの名前がテンポラリレジスタリスト87にある場合(ステップS36:肯定)は、ステップS37においてリスト制御部82がその名前をテンポラリレジスタリスト87から削除する。前述の図22の例では、名前「zmm8」がテンポラリレジスタリスト87から削除されることになる。図25(b)は、このように名前「zmm8」を削除したときのテンポラリレジスタリスト87の模式図である。
この後は、アセンブリファイル65の全ての行に対してステップS32~S37を繰り返す。デスティネーションレジスタの名前がテンポラリレジスタリスト87にない場合(ステップS36:否定)も、同様にしてステップS32~S37を繰り返す。
その後、出力部85が、ステップS35で生成した命令列を含むアセンブリファイル67を外部に出力する(ステップS38)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
上記した本実施形態によれば、生成部84が、コード65xで指定された第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45を命令列67bにおいてテンポラリレジスタとして使用する。そのテンポラリレジスタは、第2のメモリ42へのデータの退避と、第2のメモリ42からのデータの復帰とが不要なベクトルレジスタとして開発者が指定したレジスタである。よって、生成部84は、データの退避と復帰とを行うストア命令とロード命令とを命令列67bに含める必要がなく、命令列67bが無駄に長くなるのを抑制することができる。
(第4実施形態)
第1~第3実施形態では、x86_64のアセンブリ命令に等価な処理を行うArmv8-Aの命令列が無駄に長くなるのを抑制した。これに対し、本実施形態では、JIT(Just In Time)コンパイラ技術で生成した機械語列が無駄に長くなるのを抑制する。
第1~第3実施形態では、x86_64のアセンブリ命令に等価な処理を行うArmv8-Aの命令列が無駄に長くなるのを抑制した。これに対し、本実施形態では、JIT(Just In Time)コンパイラ技術で生成した機械語列が無駄に長くなるのを抑制する。
JITコンパイラ技術は、実行時に決定されるパラメータ、処理内容、及びプロセッサの状況に応じて、好適な機械語の命令列をソースコードから生成する技術である。JITコンパイラ技術を用いて生成した機械語の命令列は、AOT(Ahead Of Time)型のコンパイラが生成する汎用的に処理可能な機械語の命令列からなる実行プログラムよりも処理が高速である。
そのJITコンパイラ技術を用いた場合のアセンブリ命令変換プログラム49のソースコードの例について説明する。
図26(a)は、アセンブリ命令変換プログラム49のソースコードで使用する型宣言のC++の疑似ソースコードの模式図である。
図26(a)に示すように、本実施形態では「ZmmReg」、「memOperand」、「ZRegS」、及び「XReg」の型を宣言する。
このうち、「ZmmReg」型は、x86_64の第1のベクトルレジスタ35を示す型であって、第1のベクトルレジスタ35のレジスタ番号を示すクラス変数「index」を有する。
「memOperand」型は、x86_64のアセンブリ命令のメモリオペランドを示す型である。「memOperand」には、メモリアドレスを保持している第1の汎用レジスタ36のレジスタ番号を示すクラス変数「index」と、メモリオフセットを示すクラス変数「offset」とが宣言される。
また、「ZRegS」型は、Armv8-Aの第2のベクトルレジスタ45を示す型であって、第2のベクトルレジスタ45のレジスタ番号を示すクラス変数「index」を有する。
そして、「XReg」型は、Armv8-Aの第2の汎用レジスタ46を示す型であって、第2の汎用レジスタ46のレジスタ番号を示すクラス変数「index」を有する。
図26(b)は、x86_64のアセンブリ命令「vpadd」の機械語を生成するvpadd関数の定義を示すC++の疑似ソースコード100の模式図である。
vpadd関数101は、第1及び第2オペランドに「ZmmReg」型の変数をとり、第3オペランドに「memOperand」型の変数を引数にとる関数であって、x86_64のアセンブリ命令「vpadd」と等価な処理を行うArmv8-Aの機械語を生成する。このように名前がアセンブリ命令の名前と同一であり、かつ、そのアセンブリ命令の機械語を生成する関数のことを以下ではニーモニック関数と呼ぶ。
このvpmovsxbd関数101を呼び出すと、if文102の判定結果に応じて、genJitCodeOfFifo関数103とコード104のいずれか一方が実行される。
コード104は、アセンブリ命令「vpadd」と等価な処理を行うArmv8-Aの機械語を生成する生成指示をFIFOバッファに格納するコードである。FIFOバッファは、記憶装置50aやメモリ50b等に確保された記憶領域の一例である。
図27(a)~(e)は、FIFOバッファの模式図である。
図27(a)に示すように、FIFOバッファ111は、ソースコード100を実行する前では空である。
そして、図27(b)~(e)に示すように、FIFOバッファ111には、コード104を実行する度に生成指示110が格納される。
ここでは、複数の生成指示110の各々を「vpadd zmm29, zmm0, [r8]」等のアセンブリ命令で識別する。例えば、「vpadd zmm30, zmm1, [r8+64]」で識別される生成指示110は、x86_64のアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」と等価な処理を行うArmv8-Aの機械語を生成する指示を表す。
また、FIFOバッファ111に生成指示110が格納される順序は、コード104を実行する順序と同一である。図27(b)~(e)においては、最初にアセンブリ命令「vpadd zmm29, zmm0, [r8]」に係る生成指示110がFIFOバッファ111に格納された場合を想定している。その後に、「vpadd zmm30, zmm1, [r8+64]」、「vpadd zmm31, zmm2, [r8+128]」、及び「vpadd zmm29, zmm3, [r8+192]」の各々に係る生成指示110がFIFOバッファ111に格納される。
再び図26(b)を参照する。
if文102は、FIFOバッファ111に格納されている生成指示110が示すアセンブリ命令の種類が、ニーモニック関数vpaddの種類と異なるかを判定する文である。なお、アセンブリ命令の種類は、アセンブリ命令の名前とオペランドの型との組である。そして、ニーモニック関数の種類は、ニーモニック関数の名前と引数の型との組である。
例えば、FIFOバッファ111に格納されている生成指示110が示すアセンブリ命令が「vpadd zmm29, zmm0, [r8]」であるとする。この場合は、生成指示110が示すアセンブリ命令の名前とニーモニック関数vpaddの名前「vpadd」とが一致する。また、ニーモニック関数vpaddの第1~第3オペランドの型は、それぞれZmmReg型、ZmmReg型、memOperand型である。これらの型は、アセンブリ命令「vpadd zmm29, zmm0, [r8]」の第1~第3オペランドの型と一致する。よって、この場合は、アセンブリ命令「vpadd zmm29, zmm0, [r8]」の種類は、ニーモニック関数vpaddの種類と同じということになる。
そして、if文102の判定結果に応じ、genJitCodeOfFifo関数103とコード104のいずれか一方が実行される。
なお、本実施形態では、FIFOバッファ111に複数の生成指示110が格納されている場合、格納されている全ての生成指示110が示すアセンブリ命令の種類は全て同一となる。よって、if文102は、複数の生成指示110のうちのいずれかのアセンブリ命令の種類がニーモニック関数vpaddの種類と異なるかを判定することになる。
図28(a)は、ret関数113の定義の一例を示すC++の疑似ソースコードである。
ret関数113は、x86_64アーキテクチャの命令セットに含まれるアセンブリ命令「ret」と等価な処理を行うArmv8-Aの機械語を生成するニーモニック関数である。
このret関数113を呼び出すと、if文114の判定結果に応じて、genJitCodeOfFifo関数103とコード115のいずれか一方が実行される。
if文114は、FIFOバッファ111に格納されている生成指示110が示すアセンブリ命令の種類が、ニーモニック関数retの種類と異なるかを判定する文である。
そして、コード115は、アセンブリ命令「ret」の生成指示110をFIFOバッファ111に格納するコードである。その生成指示110は、x86_64のアセンブリ命令「ret」と等価な処理を行うArmv8-Aの機械語を生成する指示である。
図28(b)は、アセンブリ命令「ret」の生成指示110が格納されたFIFOバッファ111の模式図である。
前述のように、本実施形態では、FIFOバッファ111には同一種類のアセンブリ命令に係る生成指示110のみが格納される。そのため、アセンブリ命令「ret」に係る生成指示110と、アセンブリ命令「vpadd」に係る生成指示110とがFIFOバッファ111に共存することはない。
図29は、genJitCodeOfFifo関数103の定義の一例を示すC++の疑似ソースコードである。
図29に示すように、genJitCodeOfFifo関数103は、if文117において変数instTypeの内容を判定し、その内容に応じた処理を実行する。変数instTypeは、FIFOバッファ111にある生成指示110が示すアセンブリ命令の名前とそのオペランドの型とを示す変数である。
例えば、「vpadd zmm30, zmm1, [r8+64]」の生成指示110の場合、アセンブリ命令の名前「vpadd」が変数instTypeに格納される。更に、第1オペランド(zmm30)及び第2オペランド(zmm1)の各々の型である「ZmmReg」と、第3オペランドの型である「memOperand」が変数instTypeに格納される。
FIFOバッファ111にアセンブリ命令「vpadd」の生成指示110が格納されている場合にはif文117の評価式が真となり、translateVPADD関数118が呼び出される。
また、FIFOバッファ111にアセンブリ命令「ret」の生成指示110が格納されている場合には、if文119の評価式が真となり、translateRET関数120が呼び出される。
そして、genJitCodeOfFifo関数103は、上記のtranslateVPADD関数118やtranslateRET関数120の実行を終えると、コード121においてFIFOバッファ111の中身を空にする。
図30は、本実施形態に係るtranslateVPADD関数118の定義の一例を示すC++の疑似ソースコードである。
translateVPADD関数118を呼び出すと、コード125において、変数「zSrc2」のクラス変数「index」にgetTmpIndexConsideringFifo関数の返り値が代入される。getTmpIndexConsideringFifo関数は、FIFOバッファ111にある複数の生成指示110の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35のレジスタ番号を返す関数である。そのような第1のベクトルレジスタ35が複数ある場合は、そのうちで最大のレジスタ番号をgetTmpIndexConsideringFifo関数が返す。
次いで、コード126においてstr関数が実行される。str関数は、Armv8-Aのアセンブリ命令「str」の機械語を生成するニーモニック関数である。ここでは、そのアセンブリ命令「str」の第1オペランドは、「zSrc2」に対応する第2のベクトルレジスタ45である。そして、第2オペランドは、開発者が予め定めておいた「x9」で示される第2の汎用レジスタ46に格納されているメモリアドレスである。
これにより、「zSrc2」に対応する第2のベクトルレジスタ45に格納されているデータが、「x9」で示されるメモリアドレスに退避されることになる。
次いで、FIFOバッファ111にある生成指示110の個数だけforループが実行される。そのforループにおける変数「i」は、FIFOバッファ111にある生成指示110を特定する変数である。ここでは、FIFOバッファ111に最初に格納された生成指示110に対応する変数「i」の値を「0」とする。そして、2番目、3番目、…に対応する変数「i」の値をそれぞれ「1」、「2」、…とする。
ここで、i番目の生成指示110が示すアセンブリ命令「vpadd」の「memOperand」型の第3オペランド「memOp」のメンバ変数「offset」が「0」であるとする。この場合は、コード127において、「XReg」型の変数「xaddr」のクラス変数「index」に、i番目の生成指示110の変数「memOp」のクラス変数「index」が代入される。
一方、生成指示110が示すアセンブリ命令「vpadd」の「memOperand」型の第3オペランド「memOp」のメンバ変数「offset」が「0」ではないとする。
この場合は、コード128において、「XReg」型の変数「tmp」のクラス変数「index」に、変数「memOp」のクラス変数「index」の値が代入される。そして、コード129においてadd関数が実行される。add関数は、Armv8-Aのアセンブリ命令「add」の機械語を生成するニーモニック関数である。ここでは、そのアセンブリ命令「add」の第1オペランドは、開発者が予め定めておいた「x25」の第2の汎用レジスタ46である。そして、第2オペランドは、変数「tmp」に対応した第2の汎用レジスタである。また、第3オペランドは、i番目の生成指示110の変数「memOp」のクラス変数「offset」が示すメモリオフセットである。
次いで、コード130において、変数「xaddr」のクラス変数「index」に、開発者が予め定めておいた値「25」を代入する。
上記のようにしてforループを終えると、コード131においてldr関数が実行される。ldr関数は、Armv8-Aのアセンブリ命令「ldr」の機械語を生成するニーモニック関数である。ここでは、そのアセンブリ命令「ldr」の第1オペランドは、「zSrc2」に対応する第2のベクトルレジスタ45である。そして、第2オペランドは、変数「xaddr」で示される第2の汎用レジスタ46に格納されているメモリアドレスである。
次に、コード132においてadd関数が実行される。このadd関数は、コード129と同様に、Armv8-Aのアセンブリ命令「add」の機械語を生成するニーモニック関数である。そのアセンブリ命令「add」の第1と第2オペランドは、それぞれZReg型の変数「zSdst」、「zSrc1」である。そして、第3オペランドは、コード125においてテンポラリレジスタのレジスタ番号が格納された変数「zSrc2」である。
その後、コード133においてldr関数が実行される。そのldr関数の引数は、コード126におけるstr関数の引数と同じである。これにより、「x9」で示されるメモリアドレスに退避されたデータが、「zSrc2」に対応する第2のベクトルレジスタ45に復帰することになる。
以上により、translateVPADD関数118の処理を終える。
図31は、translateVPADD関数118の実行例を示す模式図である。
図31の例では、FIFOバッファ111に最初に「vpadd zmm29, zmm0, [r8]」の生成指示110が格納され、次に「vpadd zmm30, zmm1, [r8+64]」以降の三つのアセンブリ命令に係る生成指示110が格納されて場合を想定している。
この場合にtranslateVPADD関数118を実行すると、コード125のgetTmpIndexConsideringFifo関数によって値「28」が変数「zSrc2」に代入される。
次いで、コード126によってストア命令142の「str z28, [x9]」に対応した機械語が生成される。
そして、コード131のldr関数と、コード132のadd関数の各々に対応したアセンブリ命令「ldr」、「add」を含む命令列141a~141dの機械語が生成される。このうち、命令列141b~141dにおいては、コード129のadd関数に対応したアセンブリ命令「add」も含まれる。
その後、コード133によってロード命令143の「ldr z28, [x9]」に対応した機械語が生成される。
これによれば、命令列141a~141dにおいて、「z28」の第2のベクトルレジスタ45をテンポラリレジスタとして使用する。その「z28」に対応する「zmm28」の第1のベクトルレジスタ35は、FIFOバッファ111の各生成指示110では使用されていない。
よって、「z28」の第2のベクトルレジスタ45のデータを第2のメモリ42に退避させるためのストア命令を全ての命令列141a~141dに追加する必要がない。同様に、そのデータを「z28」の第2のベクトルレジスタ45に復帰させるためのロード命令を全ての命令列141a~141dに追加する必要もない。
これにより、本実施形態では命令列141a~141dの各々に無駄なストア命令とロード命令が追加されないため、命令列141a~141dの実行時間が長くなるのを抑制することができる。
図32は、本実施形態に係る情報処理装置50の機能構成図である。
なお、図32において、第1~第3実施形態で説明したのと同じ要素にはこれらの実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図32に示すように、情報処理装置50は、記憶部51と制御部52とを有する。
このうち、記憶部51は、FIFOバッファ111を記憶する処理部である。
一方、制御部52は、呼び出し部153、格納部154、判定部155、特定部156、決定部157、生成部158、及び出力部159を有する。これらの各部は、メモリ50bとプロセッサ50cとが協働してアセンブリ命令変換プログラム49(図8参照)を実行することにより実現される。
このうち、呼び出し部153は、ニーモニック関数のvpadd関数101(図26参照)やret関数113(図28(a)参照)を呼び出す処理部である。
格納部154は、生成指示110をFIFOバッファ111に格納する処理部である。一例として、格納部154は、情報処理装置50がコード104(図26(b)参照)やコード115(図28(a)参照)を実行することにより実現される。
例えば、情報処理装置50がコード104を実行する度に、vpadd関数101(図26(b)参照)の引数のオペランドが指定されたアセンブリ命令「vpadd」に係る生成指示110がFIFOバッファ111に格納される。また、情報処理装置50がコード115を実行することにより、アセンブリ命令「ret」に係る生成指示110がFIFOバッファ111に格納される。
判定部155は、FIFOバッファ111に格納されている生成指示110が示すアセンブリ命令の種類が、呼び出し部153が呼び出したニーモニック関数の種類と異なるかを判定する処理部である。一例として、判定部155は、図26(b)のif文102と、図28(a)のif文114により実現される。
特定部156は、FIFOバッファ111を参照することにより、複数の生成指示110の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35を特定する処理部である。例えば、特定部156は、コード125(図30参照)におけるgetTmpIndexConsideringFifo関数によって実現される。
決定部157は、特定部156が特定した第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45を、命令列141a~141dの各々が使用するテンポラリレジスタとして決定する処理部である。一例として、決定部157は、図30のコード125により実現される。そのコード125において変数「zSrc2」のクラス変数「index」に代入される値がテンポラリレジスタのレジスタ番号である。
生成部158は、FIFOバッファ111の生成指示110ごとに、生成指示110に係るアセンブリ命令の各々と等価な処理を行う命令列141a~141d(図31参照)の機械語を生成する処理部である。この例では、図30のtranslateVPADD関数118によって生成部158が実現される。図31を参照して説明したように、translateVPADD関数118は、ストア命令とロード命令とを全ての命令列141a~141dには追加しないため、命令数が増えるのを抑制することができる。
更に、生成部158は、命令列141aの機械語列の最初に、テンポラリレジスタとして使用する第2のベクトルレジスタ45のデータを第2のメモリ42に退避させるストア命令142の機械語を追加する。この機能は、例えば図30のコード126により実現される。
また、生成部158は、命令列141dの機械語列の最後に、当該データを元の第2のベクトルレジスタ45に復帰させるロード命令143の機械語を追加する。この機能は、例えば図30のコード133により実現される。
出力部159は、命令列141a~141d、ストア命令142、及びロード命令143の各々の機械語列を外部に出力する処理部である。
次に、本実施形態に係るアセンブリ命令変換方法について説明する。
図33は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、呼び出し部153がニーモニック関数を呼び出す(ステップS41)。一例として、情報処理装置50が、ニーモニック関数のvpadd関数101(図26(b)参照)やret関数113(図28(a)参照)を呼び出す。
次に、判定部155が、FIFOバッファ111にある生成指示110のアセンブリ命令と、ステップS41で呼び出されたニーモニック関数の各々の種類が異なるかどうかを判定する(ステップS42)。このとき、判定部155は、FIFOバッファ111が空かどうかも判定する。
ここで、FIFOバッファ111が空であるか、又は生成指示110のアセンブリ命令とニーモニック関数の各々の種類が同一である場合(ステップS42:否定)にはステップS43に移る。
ステップS43においては、格納部154が生成指示110をFIFOバッファ111に格納する。ステップS41でニーモニック関数のvpadd関数101が呼ばれた場合、生成指示110は、アセンブリ命令「vpadd」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する指示となる。また、ステップS41でニーモニック関数のret関数113が呼ばれた場合、生成指示110は、アセンブリ命令「ret」と等価な処理を行うArmv8-Aのアセンブリ命令の機械語を生成する指示となる。
一方、FIFOバッファ111にある生成指示110のアセンブリ命令と、ステップS41で呼び出したニーモニック関数の各々の種類が異なる場合(ステップS42:肯定)にはステップS44に移る。一例として、FIFOバッファ111に格納されている生成指示110が示すアセンブリ命令の名前「vpadd」である場合に、ステップS41でニーモニック関数retが呼び出されたときにステップS44に移る。
ステップS44においては、特定部156が、FIFOバッファ111を参照することにより、複数の生成指示110の各々に係るアセンブリ命令のいずれもが使用しない第1のベクトルレジスタ35を特定する。
次に、決定部157が、ステップS45で特定した第1のベクトルレジスタ35に対応する第2のベクトルレジスタ45を、命令列141a~141d(図31)の各々が使用するテンポラリレジスタとして決定する(ステップS45)。
次いで、生成部158が、FIFOバッファ111の生成指示110ごとに、生成指示110に係るアセンブリ命令の各々と等価な処理を行う命令列141a~141d(図31参照)の機械語を生成する(ステップS46)。このとき、生成部158は、ストア命令とロード命令とを全ての命令列141a~141dには追加しないため、命令数が増えるのを抑制することができる。
更に、生成部158は、命令列141aの機械語列の最初にストア命令142の機械語を追加し、命令列141dの機械語列の最後にロード命令143の機械語を追加する。
その後、情報処理装置50がコード121(図29参照)を実行することによりFIFOバッファ111を空にする。
次に、格納部154が、ステップS41で呼び出したニーモニック関数に係る生成指示110をFIFOバッファ111に格納する(ステップS47)。
この後は、アセンブリ命令変換プログラム49のソースコードに記述されている全てのニーモニック関数を呼び出し部153が呼び出すまでステップS41~S47を繰り返す。
次に、情報処理装置50が、genJitCodeOfFifo関数103(図29参照)を実行することによりFIFOバッファ111に残っている生成指示110の機械語を生成し、FIFOバッファ111を空にする(ステップS48)。
次いで、出力部159が、命令列141a~141d、ストア命令142、及びロード命令143の各々の機械語列を外部に出力する(ステップS49)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
上記した本実施形態によれば、決定部157が決定したテンポラリレジスタに対応する第1のベクトルレジスタ35は、FIFOバッファ111にある複数の生成指示110に係るアセンブリ命令のいずれも使用していない。
そのため、生成部158が、テンポラリレジスタのデータを第2のメモリ42に退避させるストア命令と、そのデータをテンポラリレジスタに復帰させるためのロード命令とを各命令列141a~141dに含める必要がない。その結果、これらのストア命令やロード命令によって各命令列141a~141dが無駄に長くなるのを抑制することができる。
(第5実施形態)
第4実施形態では、図30を参照して説明したように、無駄なストア命令やロード命令を生成しないようにtranslateVPADD関数118を定義した。
第4実施形態では、図30を参照して説明したように、無駄なストア命令やロード命令を生成しないようにtranslateVPADD関数118を定義した。
これに対し、本実施形態では、以下のようにtranslateVPADD関数118を定義することにより、第2実施形態と同様の処理を実現する。
図34は、本実施形態に係るtranslateVPADD関数118で実現される処理を示す模式図である。
図34では、x86_64のアセンブリ命令と等価な処理を実現するArmv8-Aの機械語を生成するニーモニック関数100a、100bがこの順に呼ばれたとする。最初に呼ばれたvpadd関数100aは、x86_64のアセンブリ命令「vpadd zmm29, zmm0, [r8]」と等価な処理を実現するArmv8-Aの機械語を生成するニーモニック関数である。そして、次に呼ばれたvpadd関数100bは、x86_64のアセンブリ命令「vpadd zmm30, zmm1, [r8+64]」と等価な処理を実現するArmv8-Aの機械語を生成するニーモニック関数である。
この場合、情報処理装置50は、最初に呼ばれたニーモニック関数100aに対応した生成指示110をFIFOバッファ111に格納する。
そして、translateVPADD関数118は、FIFOバッファ111を参照して、各vpadd関数100a、100bについて図35の条件Aと条件Bの両方が満たされるかを判断する。
図35は、translateVPADD関数118が判定する条件を示す模式図である。この条件Aと条件Bは、図16におけるのと等価な条件である。
このうち、条件Aは、ニーモニック関数100bに対応したアセンブリ命令vpaddのデスティネーションレジスタが、ニーモニック関数100aに対応したアセンブリ命令vpaddのソースレジスタと異なるという条件である。
そして、条件Bは、ニーモニック関数100bに対応したアセンブリ命令vpaddのデスティネーションレジスタとソースレジスタとが異なるという条件である。
図34の例では条件Aと条件Bの両方が満たされている。この場合、translateVPADD関数118は、vpadd関数100bのデスティネーションレジスタに対応する第2のベクトルレジスタ45をテンポラリレジスタとして決定する。そして、translateVPADD関数118は、vpadd関数100aのアセンブリ命令に対応したArmv8-Aの命令列141aにそのテンポラリレジスタを使用し、該命令列141aの機械語を生成する。
また、translateVPADD関数118は、そのテンポラリレジスタのデータを第2のメモリ42に退避させるストア命令と、該データをテンポラリレジスタに復帰させるためのロード命令とを生成しない。これにより。ストア命令とロード命令によって命令列が無駄に長くなるのを抑制することができる。
図36は、上記の処理を実現する本実施形態に係るtranslateVPADD関数118の定義の一例を示すC++の疑似ソースコードである。なお、図36において、第4実施形態で説明した型や変数の説明は省略する。
このtranslateVPADD関数118を呼び出すと、コード171において、変数「zSrc2」のクラス変数「index」にgetTmpIndexConsideringFifo関数の返り値が代入される。
本実施形態に係るgetTmpIndexConsideringFifo関数はテンポラリレジスタのレジスタ番号を返す関数であるが、その返り値は、図35の条件Aと条件Bの両方が満たされるかどうかに応じて異なる。
条件Aと条件Bの両方が満たされる場合は、getTmpIndexConsideringFifo関数は、vpadd関数100bに対応するアセンブリ命令のデスティネーションレジスタのレジスタ番号を返す。図34の例では、そのレジスタ番号は「30」となる。
一方、条件Aと条件Bの両方が満たされない場合は、getTmpIndexConsideringFifo関数は、FIFOバッファ111にある生成指示110とvpadd関数100bとの両方で使用されていないレジスタ番号を返す。そのレジスタ番号が複数ある場合、getTmpIndexConsideringFifo関数は、複数のレジスタ番号のうちの最大値を返す。
次に、コード172において、isTmpCanDiscard関数の値を変数「TmpCanDiscard」に代入する。isTmpCanDiscard関数は、条件Aと条件Bの両方が満たされる場合に「true」を返し、そうでない場合に「false」を返す関数である。
そして、変数「TmpCanDiscard」に「false」が代入された場合には、コード173においてstr関数が実行される。第4実施形態で説明したように、str関数は、Armv8-Aのアセンブリ命令「str」の機械語を生成するニーモニック関数である。そのアセンブリ命令「str」の第1オペランド「zSrc2」には、getTmpIndexConsideringFifo関数が決定したテンポラリレジスタのレジスタ番号が格納されている。そして、第2オペランドは、開発者が予め定めておいた「x9」で示される第2の汎用レジスタ46に格納されているメモリアドレスである。
これにより、getTmpIndexConsideringFifo関数が決定したテンポラリレジスタに格納されているデータが、「x9」で示されるメモリアドレスに退避されることになる。
ここで、FIFOバッファ111にある生成指示110が示すアセンブリ命令「vpadd」の「memOperand」型の第3オペランド「memOp」のメンバ変数「offset」が「0」であるとする。この場合は、コード174において、「XReg」型の変数「xaddr」のクラス変数「index」に、生成指示110の変数「memOp」のクラス変数「index」が代入される。
一方、生成指示110が示すアセンブリ命令「vpadd」の「memOperand」型の第3オペランド「memOp」のメンバ変数「offset」が「0」ではないとする。
この場合は、コード175において、「XReg」型の変数「tmp」のクラス変数「index」に、変数「memOp」のクラス変数「index」の値が代入される。そして、コード176においてadd関数が実行される。このadd関数に対応したアセンブリ命令「add」の第1オペランドは、開発者が予め定めておいた「x25」の第2の汎用レジスタ46である。そして、第2オペランドは、変数「tmp」に対応した第2の汎用レジスタである。また、第3オペランドは、生成指示110の変数「memOp」のクラス変数「offset」が示すメモリアドレスである。
次いで、コード177において、変数「xaddr」のクラス変数「index」に、開発者が予め定めておいた値「25」を代入する。
その後、コード178においてldr関数が実行される。このldr関数に対応したアセンブリ命令「ldr」の第1オペランドは、「zSrc2」に対応する第2のベクトルレジスタ45である。そして、第2オペランドは、変数「xaddr」で示される第2の汎用レジスタ46に格納されているメモリアドレスである。
次に、コード179においてadd関数が実行される。このadd関数に対応したアセンブリ命令「add」の第1及び第2オペランドは、それぞれZReg型の変数「zSdst」、「zSrc1」である。そして、第3オペランドは、コード171においてテンポラリレジスタのレジスタ番号が格納された変数「zSrc2」である。
その後、変数「TmpCanDiscard」に「false」が代入された場合には、コード180においてldr関数が実行される。そのldr関数の引数は、コード173におけるstr関数の引数と同じである。これにより、「x9」で示されるメモリアドレスに退避されたデータが、「zSrc2」に対応する第2のベクトルレジスタ45に復帰することになる。
以上により、本実施形態に係るtranslateVPADD関数118の処理を終える。
次に、本実施形態に係る情報処理装置50の機能構成について説明する。
図37は、本実施形態に係る情報処理装置50の機能構成図である。なお、図37において、第1~第4実施形態で説明したのと同じ要素にはこれらの実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
図37に示すように、情報処理装置50の制御部52は、第4実施形態で説明した呼び出し部153と格納部154の他に、判定部181、決定部182、生成部183、及び出力部184を有する。
このうち、呼び出し部153は、図34のニーモニック関数100a、100bをこの順に呼び出す処理部である。
そして、格納部154は、これらのニーモニック関数100a、100bの各々に係る生成指示110をFIFOバッファ111に格納する処理部である。
判定部181は、FIFOバッファ111に格納されている生成指示110に係るニーモニック関数100aと、新たに取得したニーモニック関数100bとに基づいて、図35の条件A、Bの両方が満たされるかを判定する処理部である。
決定部182は、条件A、Bの両方が満たされる場合に、ニーモニック関数100bのデスティネーションレジスタに対応した第2のベクトルレジスタ45を、命令列141aにおけるテンポラリレジスタとして決定する処理部である。
生成部183は、決定部182が決定したテンポラリレジスタを使用した命令列141aの機械語列を生成する処理部である。そして、出力部184は、その機械語列を外部に出力する処理部である。
次に、本実施形態に係るアセンブリ命令変換方法について説明する。
図38及び図39は、本実施形態に係るアセンブリ命令変換方法のフローチャートである。
まず、呼び出し部153がニーモニック関数を呼び出す(ステップS51)。例えば、情報処理装置50が、ニーモニック関数のvpadd関数101(図26(b)参照)やret関数113(図28(a)参照)を呼び出す。
次に、判定部181が、FIFOバッファ111が空かどうかを判定する(ステップS52)。
FIFOバッファ111が空である場合(ステップS52:肯定)はステップS53に移る。ステップS53においては、格納部154が、ステップS51で取得したニーモニック関数100aに係る生成指示110をFIFOバッファ111に格納する。
一方、FIFOバッファ111が空ではない場合(ステップS52:否定)はステップS54に移る。ステップS54においては、判定部181が、FIFOバッファ111にある生成指示110のアセンブリ命令と、ステップS51で呼び出されたニーモニック関数の各々の種類が異なるかを判定する。
ここで、FIFOバッファ111にある生成指示110のアセンブリ命令と、ステップS51で呼び出されたニーモニック関数の各々の種類が同じ場合(ステップS54:否定)はステップS56に移る。
ステップS56においては、判定部71が、図35の条件Aと条件Bの両方が満たされるかを判定する。
ここで、条件Aと条件Bの両方が満たされない場合(ステップS56:否定)にはステップS55に移る。
ステップS55においては、図36のコード178、179が実行されることにより、アセンブリ命令「ldr」、「add」の各々の機械語列が生成される。更に、FIFOバッファ111の生成指示110においてメモリオフセットが「0」でない場合には、コード176が実行されることでアセンブリ命令「add」の機械語列も生成される。
また、このように条件Aと条件Bの両方が満たされない場合には、図36のコード173とコード180とが実行されることで、ストア命令「str」とロード命令「ldr」の各々の機械語列も生成される。ステップS55では、これらのストア命令とロード命令によって命令数が増え、命令数の削減が実行されない。
なお、FIFOバッファ111にある生成指示110のアセンブリ命令と、ステップS51で呼び出されたニーモニック関数の各々の種類が異なる場合(ステップS54:肯定)もステップS55を実行する。
一方、条件Aと条件Bの両方が満たされる場合(ステップS56:肯定)にはステップS57に移る。
ステップS57においては、決定部182が、ニーモニック関数100bのデスティネーションレジスタに対応した第2のベクトルレジスタ45を、命令列141aにおけるテンポラリレジスタとして決定する。
次に、生成部183が、ステップS57で決定部182が決定したテンポラリレジスタを使用した命令列141aの機械語列を生成する(ステップS58)。
上記のようにしてステップS55又はステップS58を終えた後はステップS59に移る。
ステップS59においては、格納部154がFIFOバッファ111を空にする。
次いで、格納部154が、ステップS51で呼び出したニーモニック関数に係る生成指示110をFIFOバッファ111に格納する(ステップS60)。
この後は、アセンブリ命令変換プログラム49(図8参照)のソースコードに記述されている全てのニーモニック関数を呼び出し部153が呼び出すまでステップS51~S60を繰り返す。
次に、生成部183が、FIFOバッファ111に残っている生成指示110が示すアセンブリ命令と等価な処理をするArmv8-Aの命令列の機械語列を生成する(ステップS61)。
その後に、出力部184が、ステップS55、S58、S61の各々で生成した機械語列が記述された出力ファイルを外部に出力する(ステップS62)。
以上により、本実施形態に係るアセンブリ命令変換方法の基本的な処理を終える。
上記した本実施形態によれば、判定部181が、図35の条件Aと条件Bの両方が満たされるかを判定する。そして、条件Aと条件Bの両方が満たされる場合に、決定部182が、ニーモニック関数100bのデスティネーションレジスタに対応した第2のベクトルレジスタ45を命令列141aにおけるテンポラリレジスタとして決定する。そのテンポラリレジスタのデータは後続のニーモニック関数100aに係るアセンブリ命令によって上書きされる。そのため、当該データを第2のメモリ42に退避させるストア命令と、当該データをテンポラリレジスタに復帰させるロード命令の各々の機械語を生成部183が生成する必要がない。これにより、本実施形態では命令列141aが無駄に長くなるのを抑制することができる。
以上、各実施形態について詳細に説明したが、各実施形態は上記に限定されない。
図40(a)~(c)は、第1実施形態と第2実施形態の他の例について説明するための模式図である。
図40(a)は、前述の第1実施形態や第2実施形態で説明したように、x86_64用のアセンブリファイル65からArmv8-Aのアセンブリファイル67を情報処理装置50が生成する場合の模式図である。
これに代えて、図40(b)に示すように、x86_64用の実行ファイルからx86_64用の逆アセンブラが生成したアセンブリ命令を情報処理装置50が取得してもよい。この場合は、第1実施形態又は第2実施形態に従って情報処理装置50がArmv8-Aの命令列を生成し、該命令列をArmv8-A用のアセンブラがArmv8-A用の実行ファイルに変換する。
また、図40(c)に示すように、第1のターゲットマシン30(図6参照)の第1のメモリ32に格納されているx86_64用の機械語を変換元として使用してもよい。この場合は、その機械語からx86_64用の逆アセンブラが生成したアセンブリ命令を情報処理装置50が取得する。そして、第1実施形態又は第2実施形態に従って情報処理装置50がArmv8-Aの命令列を生成し、該命令列をArmv8-A用のアセンブラがArmv8-A用の機械語に変換して第2のターゲットマシン40(図7参照)の第2のメモリ42に格納する。
1、3…アセンブリファイル、2…変換テーブル、31…第1のプロセッサ、32…第1のメモリ、33…第1の計算コア、34…第1のレジスタファイル、35…第1のベクトルレジスタ、36…第1の汎用レジスタ、40…第2のターゲットマシン、41…第2のプロセッサ、42…第2のメモリ、43…第2の計算コア、44…第2のレジスタファイル、45…第2のベクトルレジスタ、46…第2の汎用レジスタ、50…情報処理装置、51…記憶部、52…制御部、53…取得部、54…格納部、55…判定部、56…特定部、57…決定部、58…生成部、59…出力部、60…FIFOバッファ、61…変換テーブル、65、67…アセンブリファイル、66…生成指示、71…判定部、72…決定部、73…生成部、74…出力部、80…取得部、81…判定部、82…リスト制御部、83…決定部、84…生成部、85…出力部、87…テンポラリレジスタリスト、110…生成指示、111…FIFOバッファ、153…呼び出し部、154…格納部、155…判定部、156…特定部、157…決定部、158…生成部、159…出力部、181…判定部、182…決定部、183…生成部、184…出力部。
Claims (10)
- 第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を、複数の前記アセンブリ命令ごとに記憶領域に複数格納し、
前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定し、
前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記命令列の各々におけるテンポラリレジスタとして決定し、
前記テンポラリレジスタを使用した前記命令列を生成する、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - 各々の前記命令列は、前記第2のレジスタのデータをメモリに退避させるストア命令と、前記データを前記第2のレジスタに復帰させるロード命令とを含まないことを特徴とする請求項1に記載のアセンブリ命令変換プログラム。
- 複数の前記命令列の最初に、前記第2のレジスタのデータをメモリに退避させるストア命令を追加し、
複数の前記命令列の最後に、前記データを前記第2のレジスタに復帰させるロード命令を追加する、
処理を前記コンピュータに実行させるための請求項1に記載のアセンブリ命令変換プログラム。 - 第1の命令セットに含まれる連続した第1のアセンブリ命令と第2のアセンブリ命令のうち、先行の前記第1のアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を記憶領域に格納し、
前記第2のアセンブリ命令のデスティネーションレジスタが、前記生成指示に係る前記第1のアセンブリ命令のソースレジスタと異なり、かつ前記第2のアセンブリ命令のソースレジスタが前記デスティネーションレジスタと異なる場合に、前記デスティネーションレジスタに対応した前記第2の命令セットのレジスタを、前記命令列におけるテンポラリレジスタとして決定し、
前記テンポラリレジスタを使用した前記命令列を生成する、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - 第1の命令セットのアセンブリ命令が記述されたアセンブリファイルを取得し、
前記アセンブリファイルに第1のレジスタを指定するコードがある場合に、前記第1のレジスタに対応する第2の命令セットの第2のレジスタを、前記アセンブリ命令と等価な処理を行う前記第2の命令セットの命令列におけるテンポラリレジスタとして決定し、
前記テンポラリレジスタが設定された前記命令列を出力する、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - 前記アセンブリファイルに前記コードがある場合に前記第1のレジスタの名前をリストに追加し、
前記リストに前記名前がある場合に、前記第2のレジスタを前記テンポラリレジスタとして決定する、
処理を前記コンピュータに実行させるための請求項5に記載のアセンブリ命令変換プログラム。 - 前記アセンブリ命令において前記第1のレジスタがデスティネーションレジスタとして指定されている場合に、前記リストから前記名前を削除する、
処理を前記コンピュータに実行させるための請求項6に記載のアセンブリ命令変換プログラム。 - 第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの機械語を生成する関数を複数回呼び出し、
前記関数を呼び出す度に、前記機械語の生成を指示する生成指示を前記アセンブリ命令ごとに記憶領域に複数格納し、
前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定し、
前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記機械語におけるテンポラリレジスタとして決定し、
前記関数が、前記生成指示ごとに、前記テンポラリレジスタを使用した前記機械語を生成する、
処理をコンピュータに実行させるためのアセンブリ命令変換プログラム。 - コンピュータが、
第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を、複数の前記アセンブリ命令ごとに記憶領域に複数格納し、
前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定し、
前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記命令列の各々におけるテンポラリレジスタとして決定し、
前記テンポラリレジスタを使用した前記命令列を生成する、
ことを特徴とするアセンブリ命令変換方法。 - 第1の命令セットのアセンブリ命令と等価な処理を行う第2の命令セットの命令列の生成を指示する生成指示を、複数の前記アセンブリ命令ごとに記憶領域に複数格納する格納部と、
前記記憶領域を参照することにより、複数の前記生成指示の各々に係る前記アセンブリ命令のいずれもが使用しない第1のレジスタを特定する特定部と、
前記第1のレジスタに対応する前記第2の命令セットの第2のレジスタを、前記命令列の各々におけるテンポラリレジスタとして決定する決定部と、
前記テンポラリレジスタを使用した前記命令列を生成する生成部と、
を有することを特徴とする情報処理装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020126706A JP2022023631A (ja) | 2020-07-27 | 2020-07-27 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
US17/213,398 US11327758B2 (en) | 2020-07-27 | 2021-03-26 | Non-transitory computer-readable recording medium, assembly instruction conversion method and information processing apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020126706A JP2022023631A (ja) | 2020-07-27 | 2020-07-27 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2022023631A true JP2022023631A (ja) | 2022-02-08 |
Family
ID=80226408
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2020126706A Withdrawn JP2022023631A (ja) | 2020-07-27 | 2020-07-27 | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US11327758B2 (ja) |
JP (1) | JP2022023631A (ja) |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS63138427A (ja) | 1986-11-29 | 1988-06-10 | Nec Corp | 配列に対する命令のスケジユ−リング処理方式 |
DE19731733C1 (de) | 1997-07-23 | 1998-10-01 | Siemens Nixdorf Inf Syst | Verfahren zum Testen eines Assemblerprogramms auf Portabilität |
US7251594B2 (en) * | 2001-12-21 | 2007-07-31 | Hitachi, Ltd. | Execution time modification of instruction emulation parameters |
US7334113B2 (en) * | 2005-09-07 | 2008-02-19 | National Chung Cheng University | Method and system for processing an instruction set |
JP2009258796A (ja) | 2008-04-11 | 2009-11-05 | Toshiba Corp | プログラム開発装置及びプログラム開発方法 |
US10083152B1 (en) * | 2012-01-27 | 2018-09-25 | Open Invention Network Llc | Virtualized multicore systems with extended instruction heterogeneity |
US10540737B2 (en) * | 2017-12-22 | 2020-01-21 | International Business Machines Corporation | Processing unit performance projection using dynamic hardware behaviors |
-
2020
- 2020-07-27 JP JP2020126706A patent/JP2022023631A/ja not_active Withdrawn
-
2021
- 2021-03-26 US US17/213,398 patent/US11327758B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US11327758B2 (en) | 2022-05-10 |
US20220027155A1 (en) | 2022-01-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3120152B2 (ja) | コンピューターシステム | |
TWI550412B (zh) | 在具有異質處理器之電腦平台中執行之方法和電腦平台 | |
JP5681473B2 (ja) | プログラムの最適化装置、最適化方法および最適化プログラム | |
JPH077385B2 (ja) | データ処理装置 | |
JPH0638234B2 (ja) | 変換されたプログラムコードのソース命令不可分性を保持するためのシステムおよび方法 | |
KR950033859A (ko) | 부동 소숫점 유니트에서의 다이나믹 레지스터 관리 장치 및 방법 | |
JP2002527815A (ja) | プログラムコード変換方法 | |
US7386843B2 (en) | Method and system for register allocation | |
KR20200031150A (ko) | 데이터 처리장치의 데이터 항목들 내의 성분들의 계수 | |
JP2560988B2 (ja) | 情報処理装置および処理方法 | |
JPH1115673A (ja) | 異なるランタイム環境において実行するための実行可能プログラムにおけるコードシーケンスを機能的に類似したコードシーケンスと条件付きで置き換えるローダ | |
US6212630B1 (en) | Microprocessor for overlapping stack frame allocation with saving of subroutine data into stack area | |
JP2022023631A (ja) | アセンブリ命令変換プログラム、アセンブリ命令変換方法、及び情報処理装置 | |
JP4465081B2 (ja) | Vliwプロセッサにおける効率的なサブ命令エミュレーション | |
JP2916605B2 (ja) | コンピュータ用プロセツサ | |
WO2021036173A1 (zh) | 解释执行字节码指令流的方法及装置 | |
JP2005215830A (ja) | コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体 | |
US11321094B2 (en) | Non-transitory computer-readable medium, assembly instruction conversion method and information processing apparatus | |
JP2002182926A (ja) | コンパイル方法及びコンピュータ読み取り可能な記録媒体 | |
JP3310308B2 (ja) | プログラム群管理システム | |
JPH07129399A (ja) | 命令属性レジスターを使用して多機能命令を実行する マイクロコンピュータ | |
JP3191263B2 (ja) | 最適オブジェクト選択実行処理装置 | |
JP2022125690A (ja) | 情報処理装置、情報処理プログラムおよびプログラム開発支援方法 | |
JP2000231494A (ja) | ソフトウェア実行システム及びソフトウェア実行方法 | |
JPH11143710A (ja) | 処理対象値入力装置及びプログラム変換装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20230407 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20240129 |