CN114546411A - 面向栈式浮点架构使用规则翻译的动态二进制翻译方法 - Google Patents
面向栈式浮点架构使用规则翻译的动态二进制翻译方法 Download PDFInfo
- Publication number
- CN114546411A CN114546411A CN202210176244.XA CN202210176244A CN114546411A CN 114546411 A CN114546411 A CN 114546411A CN 202210176244 A CN202210176244 A CN 202210176244A CN 114546411 A CN114546411 A CN 114546411A
- Authority
- CN
- China
- Prior art keywords
- translation
- target
- stack
- register
- floating point
- 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.)
- Pending
Links
Images
Classifications
-
- 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
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/12—Use of codes for handling textual entities
- G06F40/151—Transformation
- G06F40/16—Automatic learning of transformation rules, e.g. from examples
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种面向栈式浮点架构使用规则翻译的动态二进制翻译方法,扩展了翻译规则的适用范围,提高了现有动态二进制翻译系统对于栈式浮点指令集的支持。本发明具体操作如下,在翻译规则匹配过程中,通过虚拟化栈寄存器保证翻译规则的正确性,进而在实例化翻译规则中产生正确的目标架构指令序列;在生成目标代码时,结合浮点寄存器栈的特点,利用寄存器分配约束对浮点栈的寄存器进行分配,通过标识目标寄存器和出栈操作,实现源架构寄存器与目标架构寄存器同步,最终生成高效的目标架构浮点指令序列。相较于软件模拟的浮点指令翻译方法,本发明的方法在保证正确翻译的情况下,实现了高效的动态二进制翻译。
Description
技术领域
本发明属于系统模拟技术领域,具体涉及一种面向栈式浮点架构使用规则翻译的动态二进制翻译方法。
背景技术
动态二进制翻译是一项广泛应用于系统级应用的技术,动态二进制翻译系统通过将源指令集架构的二进制代码实时地翻译为目标架构的二进制代码,并将生成的二进制代码直接运行在目标架构主机上。目前,动态二进制翻译在系统模拟、系统虚拟化、系统分析和调试以及系统安全等方面都有着广泛的应用。
随着计算机图形学、AI等领域的发展,浮点运算在工业以及研究领域变得越来越重要。硬件开发商开始诸如AMD、Intel纷纷提出了一些用于加速浮点运算的协处理器。用于浮点运算的协处理器主要有两种架构,分别是栈式浮点架构和非栈式浮点架构。栈式浮点架构是使用具有栈操作特征的指令和栈寄存器来进行浮点运算,非栈式浮点架构的指令寻址模式与普通指令的寻址模式相同,并且将浮点寄存器看作普通寄存器来使用。栈式浮点架构作为最早出现的浮点指令集架构,首先被Intel提出并使用,X87 FPU作为X86架构的浮点栈式浮点运算单元,至今仍然存在于各个处理器中;随着运算精度的不断提高以及运算量逐渐增大,非栈式浮点架构后来者居上,以其众多的寄存器数量以及更高的运算精度、更快的运算速度逐渐成为了浮点运算的主流。例如,后来,Intel也提出了SSE、AVX指令集加速浮点运算,ARM则提出了VFP浮点运算指令集,这几种浮点指令集都属于非栈式浮点架构。
X87 FPU在Intel处理器中是一种通用的浮点处理架构,它可以工作在32位兼容模式和64位模式下,在如今的各个版本的Intel处理器中,X87 FPU仍然存在,并发挥着重要的作用。并且相较于SSE、AVX等指令集,X87提出较早,在宿主机上更加普遍,在一些早期的浮点应用程序中大量存在着X87代码。伴随着RISC精简指令集的发展,精简指令集在浮点架构的选择上,统一采用了非栈式浮点架构。由于不同的处理器之间指令集之间的显著差异、运行的宿主机不同,这对于浮点应用程序代码生态的管理带来了很大的困难,因此本发明提出了适用范围更广的、针对X87栈式浮点架构的动态二进制翻译方法,完善二进制翻译对于栈式浮点架构的支持。
X87 FPU是一种专用于进行标量浮点运算的运算单元,可以对单精度、双精度以及扩展双精度浮点进行计算。如图1所示,是X87 FPU浮点寄存器栈的结构图。如图所示,X87FPU拥有8个位宽为扩展双精度长的浮点寄存器,不同于普通寄存器,这8个寄存器只能进行栈式访问。如图所示,浮点寄存器栈自上向下增长,这些寄存器的所有寻址都与栈顶寄存器相关,栈顶寄存器的寄存器号存储在X87 FPU状态字节的TOP字段中,例如,图中当前TOP字段存储为二进制数‘011’,即表示当前栈顶寄存器为数字3所指的寄存器。在X87的指令中,大部分指令的设计与实现都与栈的操作紧密相关,整个栈包含‘ST(0)-ST(7)’寄存器,其中‘ST(0)’为栈顶寄存器,访问栈中每个寄存器通过TOP值+偏移量得到,在实际运算中,我们无需关心当前偏移量是多少,偏移量由硬件直接进行运算,只需直接访问‘ST(i)’即可得到对应寄存器的值。在指令的设计上,X87指令集的所有指令都只能对栈顶寄存器进行操作,也就是说,如果指令拥有一个操作数,那么这条指令的目标操作数一定是栈顶寄存器‘ST(0)’;如果指令包含两个操作数,那么这个指令的其中一个操作数必然是栈顶寄存器‘ST(0)’。在出入栈管理上,X87使用‘FLD’来进行入栈操作,使用‘FST’来进行出栈操作,同时还支持算术运算指令的运算结果直接出栈的选项,用来加速运算。例如对于一个栈式加法运算,X87指令通过‘FADDP ST(1)’用来表示将‘ST(0)’中的值与‘ST(1)’中的值相加并保存至‘ST(0)’,然后将‘ST(0)’的值弹出栈。而对于非栈式的指令集,例如VFP指令集,一条加法运算需要三个操作数‘VADD S0,S0,S1’,才能完成加法操作。两者之间最大的区别在于,X87指令精确地使用栈来进行运算,在指令实现上可以省略部分操作数,指令简短密集,但寄存器使用有限制,多数情况下只能够对栈顶的寄存器操作;对于非栈式指令集来说,寄存器操作更方便,更容易进行维护和管理。
目前动态二进制翻译领域在翻译方法上有三种,一种是使用中间表达语言的方式,一种是使用翻译规则进行翻译的方式,还有一种是使用软件模拟的方式。使用中间表达语言的翻译方法是指在源指令架构于目标指令架构中增加一种新的中间语言,通过将源指令序列翻译为中间语言,再将中间语言翻译为目标指令序列,以此来减少前后端耦合性。使用翻译规则进行翻译的方式是在源指令架构于目标指令架构之间构建一一对应的翻译规则,以此来进行翻译。使用软件模拟的方式进行翻译是使用目标指令的一些指令来翻译,目的是确保源指令翻译的语义正确性,例如对原子性指令、系统级指令等的翻译。在使用中间浮点指令集方式的翻译方法方面,中国专利号CN201010300269.3使用中间浮点指令集对SSE2浮点指令进行翻译,特点是使用中间指令集减少了前后端体系架构的耦合性,该专利所实现的中间浮点指令集能够支持非栈式的浮点指令的翻译,但对于栈式浮点指令来说,该方法无法使用。在使用软件模拟的方法进行浮点指令的翻译方法上,中国专利号CN200410074532.6通过使用模拟浮点栈的方法,将模拟的浮点栈映射到RISC架构固定的浮点寄存器中,以此来进行浮点操作;中国专利号CN200810112231.6也是使用模拟浮点栈的方法,利用整型数据变量和浮点数组变量模拟TOP寄存器和模拟数据寄存器,动态地实现目标架构的寄存器分配,从而减少因固定映射寄存器而生产的数据交换和数据传输指令翻译时的开销。
在采用翻译规则方式上,中国专利号CN202010625228.5提出了一种新型的动态二进制翻译方法,通过自动学习生成翻译规则,并将翻译规则应用在源架构和目标架构之间,以此来实现动态二进制翻译。该方法可以适用于非栈式浮点指令,但对于栈式浮点架构指令,无法通过该方法自动学习生成对应浮点指令的翻译规则,因此该方法无法使用在栈式浮点指令上。并且该方法直接使用翻译规则对指令集进行翻译,该方法也不适用于栈式浮点架构。
对于浮点指令,传统的动态二进制翻译方法还可以采用其他软件模拟的方法进行浮点运算,即使用整型的指令对浮点操作进行模拟。例如QEMU,使用软件模拟的方式来支持浮点指令。但这种软件模拟带来的性能损耗非常严重,这种方式对于应用程序的执行时间来说是很难接受的。
发明内容
本发明是为解决上述问题而进行的,目的在于提供一种能够应用于栈式浮点架构的、且能够达到理想翻译质量和翻译效率的动态二进制翻译方法,本发明采用了如下技术方案:
本发明提供了一种面向栈式浮点架构使用规则翻译的动态二进制翻译方法,其特征在于,包括以下步骤:
步骤S1,在翻译规则中为每条栈式浮点指令虚拟化出栈寄存器;
步骤S2,将所有的所述翻译规则进行操作码参数化以及操作数参数化,从而得到参数化后的所述翻译规则;
步骤S3,应用参数化后的所述翻译规则对源指令集架构的源指令序列进行规则匹配并翻译,并将匹配成功的所述源指令序列进行实例化,得到目标指令序列;
步骤S4,对所述目标指令序列进行实际的寄存器分配,并将所述目标指令序列生成对应的目标二进制码。
本发明提供的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,还可以具有这样的技术特征,其中,步骤S2包括以下子步骤:步骤S2-1,将所述源指令序列的操作码与所述目标指令序列的所述操作码按照构建好的映射关系进行参数化;
步骤S2-2,将所述翻译规则中的所述源指令序列的操作数与所述目标指令序列的所述操作数,按照所述映射关系以及所述操作数的类型分别进行参数化,得到参数化后的所述翻译规则。
本发明提供的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,还可以具有这样的技术特征,其中,步骤S3包括以下子步骤:步骤S3-1,判断源基础块中的所述源指令序列是否能够使用所述翻译规则进行匹配;
步骤S3-2,步骤S3-1判断为否时,选择使用软件模拟方法进行二进制翻译;
步骤S3-3,通过所述软件模拟方法生成目标指令集架构的可执行代码;
步骤S3-4,步骤S3-1判断为是时,进一步判断当前源指令的所述操作码是否能够与参数化后的所述翻译规则中的参数化的所述操作码建立所述映射关系;
步骤S3-5,步骤S3-4判断为是时,进一步判断所述源指令的所述操作数是否能够与所述翻译规则中的参数化的所述操作数建立所述映射关系;
步骤S3-6,根据所述映射关系,将虚拟化后的所述翻译规则实例化为完整的所述翻译规则;
步骤S3-7,提取出完整的所述翻译规则中的所述目标指令序列,用于生成所述目标指令集架构的可执行代码,即目标指令序列。
本发明提供的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,还可以具有这样的技术特征,其中,步骤S4包括以下子步骤:步骤S4-1,对所述目标指令序列中的每条目标指令,识别所述目标指令的所述操作码,并判断所述目标指令是否包含浮点运算;
步骤S4-2,步骤S4-1判断为是时,对所述目标指令进行栈寄存器的分配,根据栈寄存器约束将浮点栈的栈顶寄存器作为目标寄存器分配给所述目标指令的目标操作数,所述目标操作数即步骤S1中虚拟化出的所述栈寄存器;
步骤S4-3,当所述目标指令执行结束后,将执行结果保存至所述目标指令的所述操作数在内存模拟中的位置,以完成所述目标寄存器的结果同步,同时释放所述栈顶寄存器的资源;
步骤S4-4,步骤S4-1判断为否时,使用线性池扫描算法对所述目标指令进行普通寄存器的分配;
步骤S4-5,根据所述目标指令的所述操作码以及所述操作数,生成对应的所述目标二进制代码。
发明作用与效果
根据本发明的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,首先通过虚拟化栈寄存器,对于栈式浮点指令来说,将翻译规则中的隐含栈顶的寄存器虚拟化出来,使得翻译规则变得完整,与其他翻译规则保持一致。然后进行参数化翻译规则,将栈式浮点指令与整数型指令的操作数、操作码进行统一。在翻译规则匹配过程中,通过实例化产生正确的目标指令序列;对于栈式浮点指令,在生成目标代码时,结合浮点寄存器栈的特点,利用寄存器分配约束对目标指令中所需使用的寄存器进行分配,最后生成对应的目标架构浮点指令序列。本发明的方法是一种高效的使用参数化翻译规则进行二进制翻译的方法,本发明扩展了翻译规则的使用范围,在保证翻译规则不改变的同时,能够产生高质量的目标代码,并能够大幅提高动态二进制翻译中的浮点运算效率。
附图说明
图1是本发明实施例中动态二进制翻译方法的流程简图;
图2是本发明实施例中动态二进制翻译方法的流程图;
图3是本发明实施例中参数化翻译规则的流程简图;
图4是本发明实施例中翻译规则匹配及实例化的流程简图;
图5是本发明实施例中栈寄存器分配及代码生成的流程简图;
图6是本发明实施例中虚拟化栈寄存器和参数化翻译规则的示例图;
图7是本发明实施例中翻译规则匹配和实例化的示例图;
图8是本发明实施例中栈寄存器分配和目标代码生成的示例图;
图9是现有技术中X87 FPU浮点栈的结构示意图。
具体实施方式
为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,以下结合实施例及附图对本发明的面向栈式浮点架构使用规则翻译的动态二进制翻译方法作具体阐述。
<实施例>
本实施例提供一种面向栈式浮点架构使用规则翻译的动态二进制翻译方法,用于基于翻译规则将源指令集架构的二进行代码实时地翻译为目标指令集架构的二进制代码,其中,源指令集架构为ARM VFP-d16浮点指令集,目标指令集架构为X86架构的X87 FPU浮点指令集,均包含有多个栈式浮点指令,X87 FPU浮点栈的结构如图9所示,本实施例的翻译方法基于改进的动态二进制翻译系统QEMU。
图1是本实施例中动态二进制翻译方法的流程简图。
图2是本实施例中动态二进制翻译方法的流程图。
如图1和图2所示,本实施例的面向栈式浮点架构使用规则翻译的动态二进制翻译方法主要包括五个步骤:虚拟化栈寄存器、参数化翻译规则、翻译规则匹配以及实例化、栈寄存器分配以及浮点目标代码生成,并具体包括以下步骤:
步骤S1,在翻译规则中,为每条栈式浮点指令虚拟化出栈寄存器,从而得到完整的翻译规则。
对于栈式浮点指令,因为其特殊的指令格式,大部分栈式浮点指令中仅包含一个操作数,甚至有些栈式浮点指令没有操作数,这些操作数因为与栈操作的原因被隐藏,因此首先需要虚拟化出栈式浮点指令中缺失的操作数。对于本实施例采用的X87浮点指令集,所有栈式浮点指令的隐藏操作数都是该指令的目标操作数,并且是浮点栈的栈顶寄存器,因此,在翻译规则中,首先虚拟化出指令中的栈寄存器。
图6是本实施例中虚拟化栈寄存器和参数化翻译规则的示意图。
如图6所示,本实施例中,首先对于已学习到包含栈式浮点指令的翻译规则进行虚拟化栈寄存器的操作,将包含有浮点指令的翻译规则进行操作数虚拟化,为每一条栈式浮点指令虚拟化出栈顶寄存器‘ST(0)’。在图2中,‘faddp’是一条X87的栈式浮点加法指令,如图2所示,这条指令只有一个操作数,因此为该条指令虚拟化出指令隐藏的目标操作数‘ST(0)’,而对于这条翻译规则来说,源指令序列部分则不需要进行修改。
步骤S2,将所有的翻译规则进行操作码参数化以及操作数参数化,从而得到通用的翻译规则。
在虚拟化栈寄存器后,栈式浮点指令的指令格式与整型指令的格式一致,因此可以一起进行参数化,形成统一表示,增加翻译规则的适用性。一条指令由操作码和操作数组成,其中,操作码代表指令的实际操作含义,操作数则是指令所要操作的内容,例如具体的寄存器、内存地址等等。在经过参数化翻译规则后,翻译规则的通用性得到了大幅的提高,提高代码的覆盖率。参数化翻译规则首先需要对操作码进行分类,根据指令的功能于指令特征,将所有指令分为以下四类:1)算术逻辑运算指令,例如整型加法运算、浮点乘法、除法运算等等;2)内存访问指令,例如加载(load)指令和存储(store)指令等等;3)比较指令,一般用于两个数值之间的比较,例如cmp指令、test指令等等;4)其他指令,这里包含一些不能被参数化的特殊指令,例如跳转指令等等。其次需要对操作码进行分类,对于操作数,指令中操作数主要分为三类:分别是寄存器、立即数跟内存操作数。分别对三种操作数做参数化,将所有寄存器参数化为统一表示形式‘reg’,将所有的立即数转化为统一的表示形式‘imm’,将所有的内存操作转化为‘imm(reg)’。根据分类,构建指令与参数化表示形式之间的映射关系,然后进行参数化。
图3是本实施例中参数化翻译规则的流程简图。
如图3所示,基于已预先构建好的映射关系,步骤S2中,对其中一条翻译规则进行参数化的过程具体包括以下子步骤:
步骤S2-1,翻译规则操作码参数化。将翻译规则中的源指令序列的操作码与目标指令序列的操作码,按照构建的映射关系进行参数化,得到操作码参数化后的翻译规则;
步骤S2-2,翻译规则操作数参数化。将翻译规则中源指令序列与目标指令穆列中的所有操作数,按照操作数类型分别进行参数化,得到完整的参数化后的翻译规则。
重复执行步骤S2-1与步骤S2-2,直到所有的翻译规则都经过参数化。经过操作码与操作数参数化之后的翻译规则被用来与源指令块中的指令序列进行匹配,并随后被用来生成最终的目标代码。
如图6所示,本实施例中,将源指令集的算数逻辑运算指令与参数化操作码‘op1’进行映射,将访存指令与参数化操作码‘op2’进行映射,将比较指令与参数化操作码‘op3’进行映射,将所有寄存器映射为‘reg’,将‘imm(reg)’映射为内存的统一表现形式。然后将这些参数化后的翻译规则应用于浮点应用程序的动态二进制翻译中。
步骤S3,应用参数化后的翻译规则对源指令集架构的源指令序列进行规则匹配并翻译,并将匹配成功的源指列序列进行实例化,得到目标指令序列。
翻译规则匹配是将源指令序列与翻译规则中的源指令序列进行匹配,即对于指令中的操作码、操作数分别进行匹配,在参数化翻译规则中,源指令中的操作码与参数化操作码的映射一致、操作数映射类型一致才能匹配成功。对于一个源基础块,可能有一至多条翻译规则被匹配,用来翻译整个基础块。被匹配的翻译规则,在经过实例化后进一步生成浮点指令序列,然后进行栈寄存器的分配,进而生成对应的目标代码。
在翻译规则被匹配后,翻译规则中的目标代码部分可以用来生成可执行的目标代码。根据参数化翻译规则阶段生成的源指令操作码、操作数与目标指令操作码操作数的对应关系,实例化出具体的指令,包含具体的操作码与寄存器。
图4是本实施例中翻译规则匹配及实例化的流程简图。
如图4所示,步骤S3具体包括以下子步骤:
步骤S3-1,判断源基础块中的源指令序列是否可以使用翻译规则进行匹配,当判断为是(即可以匹配)时,进入步骤S3-4,当判断为否时,进入步骤S3-2;
步骤S3-2,源指令序列不能使用翻译规则进行匹配,选择使用软件模拟方法进行二进制翻译,软件模拟方法是使用一些整型指令对浮点指令进行翻译;
步骤S3-3,经过软件模拟后,生成目标指令集架构的可执行代码;
步骤S3-4,源指令序列可以使用翻译规则进行匹配,判断当前源指令的操作码是否能够与翻译规则中参数化的操作码建立映射关系,当判断为是(即可以建立映射关系),则匹配成功,进入步骤S3-5进行操作数匹配,当判断为否,则进入步骤S3-2;
步骤S3-5,判断当前源指令的操作数是否能够与翻译规则中参数化的操作数建立映射关系,当判断为是,则匹配成功,进入步骤S3-6,当判断为否,则同样进入步骤S3-2;
对于源指令序列中的每一条源指令执行上述步骤S3-4、S3-5,直到源基础块中所有被翻译规则匹配的源指令序列全部经过步骤S3-4、S3-5;
步骤S3-6,根据参数化翻译规则(即步骤S2)建立的映射关系,将虚拟化后的翻译规则实例化为完整的翻译规则,分别将翻译规则中的源指令序列部分与目标指令序列部分进行完善;
步骤S3-7,提取出实例化后的翻译规则中的目标指令序列,用于生成最终可执行的目标代码。
图7是本实施例中翻译规则匹配和实例化的示例图。
如图7所示,本实施例中,源基础块中包含一条单精度的浮点加法运算指令,在翻译模块,源基础块中的源指令序列可以被参数化的翻译规则‘op1’匹配,在实例化过程中,首先,源指令序列的操作码被实例化为对应的操作码,如图中的‘vadd’,其次,目标指令序列的操作码以及目标操作数根据目标架构的指令集分别被实例化为‘fadd’和‘ST(0)’,‘fadd’是X87 FPU浮点指令集的加法运算,‘ST(0)’寄存器为X87浮点栈的栈顶寄存器。
步骤S4,对生成的目标指令序列进行实际的寄存器分配,并将目标指令序列生成对应的目标二进制码。
在完成翻译规则匹配,得到完整的目标指令序列后,首先对这些目标指令进行实际的寄存器分配,完成寄存器分配后便可以最终交给目标代码生成模块,生成对应的目标二进制码。对于其他非浮点指令,采取线性池扫描算法进行寄存器的分配。对于浮点指令,需要按照栈的操作方式将浮点栈中的寄存器分配给指令:先将栈顶的寄存器分配给指令的目标操作数,进而在剩余可用的寄存器中,按照邻近原则,将距离栈顶最近的可用寄存器分配至其他操作数。因为所有浮点指令都需要与栈顶进行交互,因此当一条浮点指令执行结束后,需要将栈顶弹出,进行寄存器同步,同时将栈顶交给下一条指令使用。当栈内所有寄存器都被使用时,即没有可用的剩余寄存器可以被用来分配给其他操作数,则将栈内所有寄存器都进行寄存器同步,将所有寄存器的值同步到内存中。完成寄存器分配时,将带有具体操作数、操作码的汇编指令翻译为目标代码,并写入代码缓存、移交至控制流去执行指令。
当一条指令完成寄存器分配之后,意味着这条指令完全拥有了操作码以及实际的操作数,可以生成实际的二进制代码。在目标代码生成模块,负责将实际的汇编码指令翻译为对应的二进制码,并将二进制码存储在代码缓存中,当整个源基础块都生成相应的目标二进制码之后,交还给控制流去执行目标二进制码。
图5是本实施例中栈寄存器分配及代码生成的流程简图。
如图5所示,步骤S4具体包括以下子步骤:
步骤S4-1,对目标指令序列中的每一条目标指令,识别目标指令的操作码,并判断该目标指令是否包含浮点运算,当判断为是时,进入步骤S4-2,当判断为否时,对下一条目标指令重复执行步骤S4-1,直到目标指令序列中的所有指令都执行了步骤S4-1;
步骤S4-2,目标指令包含有浮点运算,对该目标指令进行栈寄存器分配,具体地,由于浮点栈寄存器操作的约束为:指令的目标操作数需要为栈顶寄存器,因此需要首先进行目标指令的目标操作数的寄存器分配,目标操作数即上述生成的虚拟化栈寄存器,因此根据栈寄存器约束将浮点栈栈顶寄存器分配给该操作数,并标记为目标寄存器;
步骤S4-3,当一条目标指令执行结束后,因为栈顶寄存器接下来需要被其他指令使用,因此对于标记为目标寄存器的操作数,需要将指令执行完之后的结果保存至该操作数在内存模拟中的位置,以完成目标寄存器结果同步,同时释放栈顶寄存器资源,以供其他指令使用;源寄存器同步后,执行目标代码生成模块;
步骤S4-4,对于不包含浮点运算的目标指令,进行普通寄存器分配,使用线性池扫描算法,对普通寄存器进行分配;
步骤S4-5,根据目标指令操作码以及操作数生成对应的目标二进制代码,并最终交给控制流去执行目标二进制代码。
图8是本实施例中栈寄存器分配和目标代码生成的示例图。
如图8所示,本实施例中,依次根据目标指令序列的操作码以及操作数进行目标二进制代码生成,对于浮点指令,首先识别目标操作数,识别标记为‘ST(0)’的目标操作数,将栈顶寄存器分配至该指令,再根据现有的映射关系,选择剩余可用的‘ST(1)-ST(7)’寄存器进行分配给其他操作数,如图中最终将‘ST(3)’寄存器分配给了这条指令,最终生成了‘FADD ST(0),ST(3)’这样一条目标指令序列。
最后将这条汇编码放入目标代码生成模块,生成对应的二进制代码‘D8 C3’,然后放入代码缓存中并交给控制流准备执行。在生成二进制代码之后,对于一个源基础块的动态二进制翻译就到此结束。
在上述动态二进制翻译过程中,QEMU中的小型代码生成器(Tiny codegenerator,TCG)被用于支持源基础块中需要使用软件模拟实现的指令。本实施例使用标准测试集SPEC CPU 2006测试集进行测试,在Intel E52680物理机上进行测试,测试结果与软件模拟方法的结果进行对比,实验结果证明,本实施例的方法在代码执行过程中性能得到了大幅的提升,相较于使用软件模拟方法,性能结果平均提升了3.35倍。
本实施例中未详细说明的部分为本领域的公知技术。
实施例作用与效果
根据本实施例提供的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,首先通过虚拟化栈寄存器,对于栈式浮点指令来说,将翻译规则中的隐含栈顶的寄存器虚拟化出来,使得翻译规则变得完整,与其他翻译规则保持一致。然后进行参数化翻译规则,将栈式浮点指令与整数型指令的操作数、操作码进行统一。在翻译规则匹配过程中,通过实例化产生正确的目标指令序列;对于栈式浮点指令,在生成目标代码时,结合浮点寄存器栈的特点,利用寄存器分配约束对目标指令中所需使用的寄存器进行分配,最后生成对应的目标架构浮点指令序列。本发明实施例的方法是一种高效的使用参数化翻译规则进行二进制翻译的方法,本发明实施例扩展了翻译规则的使用范围,在保证翻译规则不改变的同时,能够产生高质量的目标代码,并能够大幅提高动态二进制翻译中的浮点运算效率。
上述实施例仅用于举例说明本发明的具体实施方式,而本发明不限于上述实施例的描述范围。
Claims (4)
1.一种面向栈式浮点架构使用规则翻译的动态二进制翻译方法,其特征在于,包括以下步骤:
步骤S1,在翻译规则中为每条栈式浮点指令虚拟化出栈寄存器;
步骤S2,将所有的所述翻译规则进行操作码参数化以及操作数参数化,从而得到参数化后的所述翻译规则;
步骤S3,应用参数化后的所述翻译规则对源指令集架构的源指令序列进行规则匹配并翻译,并将匹配成功的所述源指令序列进行实例化,得到目标指令序列;
步骤S4,对所述目标指令序列进行实际的寄存器分配,并将所述目标指令序列生成对应的目标二进制码。
2.根据权利要求1所述的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,其特征在于:
其中,步骤S2包括以下子步骤:
步骤S2-1,将所述源指令序列的操作码与所述目标指令序列的所述操作码按照构建好的映射关系进行参数化;
步骤S2-2,将所述翻译规则中的所述源指令序列的操作数与所述目标指令序列的所述操作数,按照所述映射关系以及所述操作数的类型分别进行参数化,得到参数化后的所述翻译规则。
3.根据权利要求2所述的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,其特征在于:
其中,步骤S3包括以下子步骤:
步骤S3-1,判断源基础块中的所述源指令序列是否能够使用所述翻译规则进行匹配;
步骤S3-2,步骤S3-1判断为否时,选择使用软件模拟方法进行二进制翻译;
步骤S3-3,通过所述软件模拟方法生成目标指令集架构的可执行代码;
步骤S3-4,步骤S3-1判断为是时,进一步判断当前源指令的所述操作码是否能够与参数化后的所述翻译规则中的参数化的所述操作码建立所述映射关系;
步骤S3-5,步骤S3-4判断为是时,进一步判断所述源指令的所述操作数是否能够与所述翻译规则中的参数化的所述操作数建立所述映射关系;
步骤S3-6,根据所述映射关系,将虚拟化后的所述翻译规则实例化为完整的所述翻译规则;
步骤S3-7,提取出完整的所述翻译规则中的所述目标指令序列,用于生成所述目标指令集架构的可执行代码,即目标指令序列。
4.根据权利要求3所述的面向栈式浮点架构使用规则翻译的动态二进制翻译方法,其特征在于:
其中,步骤S4包括以下子步骤:
步骤S4-1,对所述目标指令序列中的每条目标指令,识别所述目标指令的所述操作码,并判断所述目标指令是否包含浮点运算;
步骤S4-2,步骤S4-1判断为是时,对所述目标指令进行栈寄存器的分配,根据栈寄存器约束将浮点栈的栈顶寄存器作为目标寄存器分配给所述目标指令的目标操作数,所述目标操作数即步骤S1中虚拟化出的所述栈寄存器;
步骤S4-3,当所述目标指令执行结束后,将执行结果保存至所述目标指令的所述操作数在内存模拟中的位置,以完成所述目标寄存器的结果同步,同时释放所述栈顶寄存器的资源;
步骤S4-4,步骤S4-1判断为否时,使用线性池扫描算法对所述目标指令进行普通寄存器的分配;
步骤S4-5,根据所述目标指令的所述操作码以及所述操作数,生成对应的所述目标二进制代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210176244.XA CN114546411A (zh) | 2022-02-24 | 2022-02-24 | 面向栈式浮点架构使用规则翻译的动态二进制翻译方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210176244.XA CN114546411A (zh) | 2022-02-24 | 2022-02-24 | 面向栈式浮点架构使用规则翻译的动态二进制翻译方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114546411A true CN114546411A (zh) | 2022-05-27 |
Family
ID=81678738
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210176244.XA Pending CN114546411A (zh) | 2022-02-24 | 2022-02-24 | 面向栈式浮点架构使用规则翻译的动态二进制翻译方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114546411A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116501451A (zh) * | 2023-06-25 | 2023-07-28 | 北京开源芯片研究院 | 二进制翻译方法、翻译控制方法、指令执行方法及装置 |
-
2022
- 2022-02-24 CN CN202210176244.XA patent/CN114546411A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116501451A (zh) * | 2023-06-25 | 2023-07-28 | 北京开源芯片研究院 | 二进制翻译方法、翻译控制方法、指令执行方法及装置 |
CN116501451B (zh) * | 2023-06-25 | 2023-10-17 | 中国科学院计算技术研究所 | 二进制翻译方法、翻译控制方法、指令执行方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7243213B2 (en) | Process for translating instructions for an arm-type processor into instructions for a LX-type processor; relative translator device and computer program product | |
EP2142987B1 (en) | Improvements in and relating to floating point operations | |
US8578351B2 (en) | Hybrid mechanism for more efficient emulation and method therefor | |
JP5299979B2 (ja) | Riscプロセッサ及びレジスタのフラグビットの処理方法 | |
JPH025140A (ja) | シミュレーシヨン方法 | |
JPH0782441B2 (ja) | シミユレーシヨン方法 | |
US20120331278A1 (en) | Branch removal by data shuffling | |
CN101963918A (zh) | 实现cpu/gpu异构平台的虚拟执行环境的方法 | |
Diamos et al. | Translating GPU binaries to tiered SIMD architectures with Ocelot | |
Reddy et al. | Bridging functional heterogeneity in multicore architectures | |
Nie et al. | Vectorization for java | |
CN107729118A (zh) | 面向众核处理器的修改Java虚拟机的方法 | |
US7251594B2 (en) | Execution time modification of instruction emulation parameters | |
CN114546411A (zh) | 面向栈式浮点架构使用规则翻译的动态二进制翻译方法 | |
US20050278507A1 (en) | Long displacement instruction formats | |
CN114077424A (zh) | 扩展mips指令集处理器支持risc指令集多模系统的方法和装置 | |
CN113204448A (zh) | 用于请求处理器核的历史重置的指令的设备、方法和系统 | |
CN116775127A (zh) | 一种基于RetroWrite框架的静态符号执行插桩方法 | |
Knorst et al. | An energy efficient multi-target binary translator for instruction and data level parallelism exploitation | |
Martínez del Amor et al. | Simulation of recognizer P systems by using manycore GPUs | |
US20030046669A1 (en) | Methods, systems, and computer program products for translating machine code associated with a first processor for execution on a second processor | |
Dong et al. | A Translation Framework for Virtual Execution Environment on CPU/GPU Architecture | |
Wentzlaff et al. | Constructing virtual architectures on a tiled processor | |
Chen et al. | Binary compatibility for embedded systems using greedy subgraph mapping | |
Tartara et al. | Parallelism and Retargetability in the ILDJIT Dynamic Compiler |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |