64位虚拟机处理访存指令的方法及装置制造方法
【专利摘要】本发明实施例提供一种64位虚拟机处理访存指令的方法及装置,涉及计算机【技术领域】,解决了整个程序性能损失的问题。该方法包括,获取访存指令,根据访存指令,确定访存指令所指示访存的目标地址的低位地址,根据目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过第一汇编指令和第二汇编指令低位地址加载到第一寄存器;根据访存指令,生成第三汇编指令,第三汇编指令用于访存第一寄存器中存储的低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,高位地址为程序的全局高位地址。用于64位虚拟机中的即时编译。
【专利说明】64位虚拟机处理访存指令的方法及装置
【技术领域】
[0001]本发明实施例涉及计算机技术,尤其涉及一种64位虚拟机处理访存指令的方法
及装置。
【背景技术】
[0002]现有技术中,在64位Java虚拟机处理访存指令时,首先确定访存指令指示访存的目标地址,并对该目标地址进行分析,然后根据该目标地址的特点编译高效的指令序列,因此,针对不同的地址值生成的访存指令序列的长度不同,长度较高时甚至7条指令才能完成一次访存操作。
[0003]上述这种方式在地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响,此外,对于Java虚拟机这种动态生成执行代码的程序,在生成访存代码时,并不一定能够确定目标地址的值,在生成代码后可能会对该地址进行修改,由于必须知道目标地址的值之后才能生成相应的代码,并且由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失。
【发明内容】
[0004]本发明提供一种64位虚拟机处理访存指令的方法及装置,以通过固定较少的汇编指令实现访存的目的。
[0005]第一个方面,本发明提供一种64位虚拟机处理访存指令的方法,包括:
[0006]获取访存指令;根据所述访存指令,确定所述访存指令所指示访存的目标地址的低位地址;根据所述目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过所述第一汇编指令和所述第二汇编指令将所述低位地址加载到第一寄存器;根据所述访存指令,生成第三汇编指令,所述第三汇编指令用于访存所述第一寄存器中存储的所述低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,所述高位地址为程序的全局高位地址。
[0007]第二个方面,本发明提供一种64位虚拟机处理访存指令的装置,包括:
[0008]获取模块,用于获取访存指令;
[0009]确定模块,用于根据所述获取模块获取的所述访存指令,确定所述访存指令所指示访存的目标地址的低位地址;
[0010]第一生成模块,用于根据所述确定模块确定的所述目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过所述第一汇编指令和所述第二汇编指令将所述低位地址加载到第一寄存器;
[0011]第二生成模块,用于根据所述获取模块获取的所述访存指令,生成第三汇编指令,所述第三汇编指令用于访存所述第一寄存器中存储的所述低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,所述高位地址为程序的全局高位地址。
[0012]本发明提供的访存指令处理方法及装置,通过生成固定的三条汇编指令实现访存操作的执行,不需要对访存指令的地址进行分析也不会由于编译访存指令时的代码段出现指令膨胀的情况,解决了现有技术中地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响的问题,还解决了现有技术中由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失的问题。
【专利附图】
【附图说明】
[0013]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0014]图1为本发明64位虚拟机处理访存指令的方法实施例一的流程示意图;
[0015]图2为本发明64位虚拟机处理访存指令的方法实施例二的流程示意图;
[0016]图3为本发明64位虚拟机处理访存指令的装置实施例一的结构示意图;
[0017]图4为本发明64位虚拟机处理访存指令的装置实施例二的结构示意图。
【具体实施方式】
[0018]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0019]本发明实施例提供的64位虚拟机处理访存指令的方法具体可以应用于64为虚拟机接收到访存指令并进行处理时,该64位虚拟机处理访存指令的方法具体可以通过64位虚拟机处理访存指令的装置或即时编译器来执行,该64位虚拟机处理访存指令的装置可以集成在虚拟机中,其中,该64位虚拟机处理访存指令的装置可以采用软件和/或硬件的方式来实现。以下对本实施例提供的64位虚拟机处理访存指令的方法及装置进行说明。
[0020]图1为本发明64位虚拟机处理访存指令的方法实施例一的流程示意图。本实施例的执行的主体可以是即时编译器。如图1所示,本实施例提供的64位虚拟机处理访存指令的方法具体包括如下步骤:
[0021]步骤101、获取访存指令。
[0022]本实施例的适用场景为,64位虚拟机中即时编译器处理程序中的访存指令,其中,访存指令为即时编译器编译执行到中间代码时的访存指令。
[0023]在本实施例中,访存指令包括访问内存的目标地址,例如,该访存指令为读指令,其中,该读指令用以读取目标地址存储的数据,或者,该访存指令为写指令,其中,写指令用以将写指令指示的数据写入目标地址。
[0024]步骤102、根据访存指令,确定访存指令所指示访存的目标地址的低位地址。
[0025]在本实施例中,将目标地址分为高位地址和低位地址,其中,该低位地址为目标地址的低位部分的地址,高位地址为目标地址除低位地址的地址,例如,64位虚拟机中,高位地址为前32位,即63-32,低位地址为32位,即31_0。[0026]值得说明的是,本发明实施例可以用于的64位JAVA虚拟机,64位JAVA虚拟机中的高位地址为全局统一的,即在同一个JAVA程序中,其访存的所有目标地址的高位地址均相同。
[0027]本发明实施例还可以用于程序模块中高位地址为全局统一的64位虚拟机,即在同一个程序块中,其访存的所有目标地址的高位地址均相同。
[0028]步骤103、根据目标地址的低位地址,生成第一汇编指令和第二汇编指令。
[0029]具体的,64位虚拟机处理访存指令的装置根据目标地址的低位地址,编译出两条汇编指令。即根据目标地址的低位地址生成第一汇编指令,第一汇编指令用于将低位地址中的高位子地址加载到第一寄存器,例如,第一汇编指令用于将地址位15-0加载到第一寄存器;根据目标地址的低位地址生成第二汇编指令,第二汇编指令用于将低位地址中的低位子地址加载到第一寄存器,例如,第一汇编指令用于将地址位31-16加载到第一寄存器。
[0030]需要说明的是,该第一寄存器可以是临时的寄存器。
[0031]步骤104、根据访存指令,生成第三汇编指令。
[0032]具体的,本实施例中的第三汇编指令用于访存第一寄存器中存储的低位地址,如地址位为31-0,与第二寄存器中存储的高位地址,如地址位为64-32,并叠加得到的64为的目标地址,其中,高位地址为程序的全局高位地址。
[0033]在本实施例中,第三汇编指令可以是双基址访存指令也可以是其他可实现第三汇编指令功能的指令,此处以双基址访存指令为例进行详细的说明,该双基址访存指令包括操作码、第一寄存器标识、第二寄存器标识、目标寄存器标识以及偏移量,其中偏移量为零。举例来讲,访存指令为读指令,对应的,第三汇编指令为双基址读指令,其中,该双基址读指令用于将通过第一寄存器标识和第二寄存器标识获得的目标地址中存储的数据读取到目标寄存器标识所标示的寄存器。或者,访存指令为写指令;第三汇编指令为双基址写指令,其中,该双基址写指令用于将目标寄存器标识所标示的寄存器中存储的数据写入到通过第一寄存器标识和第二寄存器标识获得的目标地址中。
[0034]通常情况下,64位虚拟机处理程序中不同的访存指令时,需要加载的目标地址的高位地址是相同的,需要说明的是,本实施例中的全局高位地址为64位虚拟机处理程序中不同的访存指令时,需要加载的目标地址的高位地址。
[0035]在本实施例中,高位地址存储在第二寄存器,并且在程序运行的过程中尽量避免更改该第二存储器中存储的数值。
[0036]本发明提供的64位虚拟机处理访存指令的方法及装置,通过生成固定的三条汇编指令实现访存操作的执行,不需要对访存指令的地址进行分析也不会由于编译访存指令时的代码段出现指令膨胀的情况,解决了现有技术中地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响的问题,还解决了现有技术中由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失的问题。
[0037]图2为本发明64位虚拟机处理访存指令的方法实施例二的流程示意图。本实施例的执行的主体可以是即时编译器。如图2所示,
[0038]步骤201、在开始编译所述程序时,将程序对应的全局高位地址存储在第二寄存器。[0039]具体的,在执行程序之前,首先将高位地址存储在第二寄存器中,该第二寄存器可以是全局寄存器,例如在无内部互锁流水级的微处理器(Microprocessor WithoutInterlocked Piped Stages,简称MIPS)的通用寄存器中,选择一个寄存器作为全局寄存器保存32为的高位地址。
[0040]在本实施例中,通常在64为Java虚拟机中,被加载的目标地址的高32为通常是相同的,因此,可以在执行程序之前,首先将高位地址存储在第二寄存器中。
[0041]步骤202、获取访存指令。
[0042]在本实施例中,访存指令包括访问内存的目标地址,例如,该访存指令为读指令,其中,该读指令用以读取目标地址存储的数据,或者,该访存指令为写指令,其中,写指令用以将写指令指示的数据写入目标地址。
[0043]步骤203、根据访存指令,确定访存指令所指示访存的目标地址的低位地址。
[0044]在本实施例中,将目标地址分为高位地址和低位地址,其中,该低位地址为目标地址的低位部分的地址,高位地址为目标地址除低位地址的地址,例如,64位虚拟机中,高位地址为前32位,即63-32,低位地址为32位,即31_0。
[0045]步骤204、根据目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过第一汇编指令和第二汇编指令将低位地址加载到第一寄存器。
[0046]具体的,即时编译器根据目标地址的低位地址,编译出两条汇编指令。即根据目标地址的低位地址生成第一汇编指令,第一汇编指令用于将低位地址中的高位子地址加载到第一寄存器,例如,第一汇编指令用于将地址位0-15加载到第一寄存器中的0-15位;根据目标地址的低位地址生成第二汇编指令,第二汇编指令用于将低位地址中的低位子地址加载到第一寄存器,例如,第一汇编指令用于将地址位16-31加载到第一寄存器中的16-31位。
[0047]在本实施例中,该低位地址为64位目标地址的0-31位地址。需要说明的是,该第一寄存器可以是临时的寄存器,即该第一寄存器在即时编译器处理访存指令时保存全局高位地址,在即时编译器做其他执行操作时,可用于保存其他的数值。
[0048]步骤205、判断第二寄存器中保存的数值是否为程序对应的全局高位地址。
[0049]具体的,若否,则执行步骤206,若是,则执行步骤207。
[0050]需要说明的是,通过步骤205的判断,可以确保从第二寄存器中获得目标地址的高位地址是准确的。
[0051]步骤206、若否,则将程序对应的全局高位地址加载到第二寄存器,并根据访存指令生成第三汇编指令。
[0052]在本实施例中,该第三汇编指令用于访存第一寄存器中存储的低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,其中,该高位地址为程序的全局高位地址。
[0053]举例来讲,第二寄存器中存储的高位地址没有修改之前,该第二寄存器中存储的高位地址为0x5500000000,在确定第二寄存器中存储的数值,即高位地址发生修改,可以通过以下两条指令进行第二寄存器中高位地址的恢复:
[0054]dadd rbase, zero, 0x55
[0055]dsll.32rbase, O。[0056]步骤207、若是,则直接根据访存指令生成第三汇编指令。
[0057]在本实施例中,该第三汇编指令用于访存第一寄存器中存储的低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,其中,该高位地址为程序的全局高位地址。
[0058]需要说明的是,步骤206与步骤207中的第三汇编指令可以为双基址访存指令,该双基址访存指令包括操作码、第一寄存器标识、第二寄存器标识、目标寄存器标识以及偏移量,其中偏移量为零。举例来讲,访存指令为读指令,对应的,第三汇编指令为双基址读指令,其中,该双基址读指令用于将通过第一寄存器标识和第二寄存器标识获得的目标地址中存储的数据读取到目标寄存器标识所标示的寄存器。或者,访存指令为写指令;第三汇编指令为双基址写指令,其中,该双基址写指令用于将目标寄存器标识所标示的寄存器中存储的数据写入到通过第一寄存器标识和第二寄存器标识获得的目标地址中。
[0059]本发明提供的64位虚拟机处理访存指令方法及装置,通过生成固定的三条汇编指令实现访存操作的执行,不需要对访存指令的地址进行分析也不会由于编译访存指令时的代码段出现指令膨胀的情况,解决了现有技术中地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响的问题,还解决了现有技术中由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失的问题。
[0060]图3为本发明64位虚拟机处理访存指令的装置实施例一的结构示意图。如图3所示,该寻址指令处理装置,包括:获取模块31、确定模块32、第一生成模块33和第二生成模块34,其中,
[0061]获取模块31,用于获取访存指令;
[0062]确定模块32,用于根据获取模块31获取的访存指令,确定访存指令所指示访存的目标地址的低位地址;
[0063]第一生成模块33,用于根据确定模块32确定的目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过第一汇编指令和第二汇编指令将低位地址加载到第一寄存器;
[0064]第二生成模块34,用于根据获取模块31获取的访存指令,生成第三汇编指令,第三汇编指令用于访存第一寄存器中存储的低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,高位地址为程序的全局高位地址。
[0065]在本实施例中,通过生成固定的三条汇编指令实现访存操作的执行,不需要对访存指令的地址进行分析也不会由于编译访存指令时的代码段出现指令膨胀的情况,解决了现有技术中地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响的问题,还解决了现有技术中由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失的问题。
[0066]在上述实施例的基础上,第一生成模块33,用于根据确定模块32确定的目标地址的低位地址生成第一汇编指令,第一汇编指令用于将低位地址中的高位子地址加载到第一寄存器;第二生成单元34,用于根据确定模块32确定的目标地址的低位地址生成第二汇编指令,第二汇编指令用于将低位地址中的低位子地址加载到第一寄存器。
[0067]图4为本发明64位虚拟机处理访存指令的装置实施例二的结构示意图。如图4所示,在上述实施例的基础上,该访存指令处理装置,还可以包括:存储模块35 ;
[0068]其中,存储模块35,用于在开始编译程序时,将程序对应的全局高位地址存储在第
二寄存器。
[0069]在本实施例中,通常在64为Java虚拟机中,被加载的目标地址的稿32为通常是相同的,因此,可以在执行程序之前,首先将高位地址存储在第二寄存器中,在需要加载目标地址时,使用一条双基址访存指令将从第二寄存器中加载目标地址的高位地址,以及从第一寄存器中加载目标地址的低位地址,从而大大的节省了访存指令的数量。
[0070]进一步的,在上述实施例的基础上,该装置还可以包括:判断模块36。
[0071]判断模块36,用于判断第二寄存器中保存的数值是否为程序对应的全局高位地址;
[0072]需要说明的是,通过判断模块36的执行,可以确保从第二寄存器中获得目标地址的高位地址是准确的。
[0073]第二生成模块34,包括:第三生成单元341,用于若判断模块36确定第二寄存器中保存的数值不是程序对应的全局高位地址时,则将程序对应的全局高位地址加载到第二寄存器,根据访存指令生成第三汇编指令;第四生成单元342,用于若判断模块36确定第二寄存器中保存的数值是程序对应的全局高位地址时,则直接根据访存指令生成第三汇编指令。
[0074]在上述实施例的基础上,第三汇编指令为双基址访存指令,双基址访存指令包括操作码、第一寄存器标识、第二寄存器标识、目标寄存器标识以及偏移量,其中偏移量为零。
[0075]进一步的,在上述实施例的基础上,该访存指令为读指令;
[0076]对应的,第三汇编指令为双基址读指令,双基址读指令用于将通过第一寄存器标识和第二寄存器标识获得的目标地址中存储的数据读取到目标寄存器标识所标示的寄存器。
[0077]可选的,在上述实施例的基础上,访存指令为写指令;
[0078]第三汇编指令为双基址写指令,双基址写指令用于将目标寄存器标识所标示的寄存器中存储的数据写入到通过第一寄存器标识和第二寄存器标识获得的目标地址中。
[0079]在本实施例中,过生成固定的三条汇编指令实现访存操作的执行,不需要对访存指令的地址进行分析也不会由于编译访存指令时的代码段出现指令膨胀的情况,解决了现有技术中地址分析时相对比较耗时,对于即时编译,地址分析的过程会是一个频发的操作,会给编译进程带来性能影响的问题,还解决了现有技术中由于访存指令序列长度的不定,会增加地址重填过程的复杂度,给整个程序带来性能损失的问题。
[0080]本领域普通技术人员可以理解:实现所述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括所述各方法实施例的步骤;而前述的存储介质包括:R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0081]最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
【权利要求】
1.一种64位虚拟机处理访存指令的方法,其特征在于,包括: 获取访存指令; 根据所述访存指令,确定所述访存指令所指示访存的目标地址的低位地址; 根据所述目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过所述第一汇编指令和所述第二汇编指令将所述低位地址加载到第一寄存器; 根据所述访存指令,生成第三汇编指令,所述第三汇编指令用于访存所述第一寄存器中存储的所述低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,所述高位地址为程序的全局高位地址。
2.根据权利要求1所述的方法,其特征在于,所述根据所述目标地址的低位地址,生成第一汇编指令和第二汇编指令,包括: 根据所述目标地址的低位地址生成第一汇编指令,所述第一汇编指令用于将所述低位地址中的高位子地址加载到所述第一寄存器; 根据所述目标地址 的低位地址生成第二汇编指令,所述第二汇编指令用于将所述低位地址中的低位子地址加载到所述第一寄存器。
3.根据权利要求1或2所述的方法,其特征在于,所述获取访存指令之前,还包括: 在开始编译所述程序时,将所述程序对应的所述全局高位地址存储在所述第二寄存器。
4.根据权利要求3所述的方法,其特征在于,所述根据所述访存指令,生成第三汇编指令之前,还包括: 判断所述第二寄存器中保存的数值是否为所述程序对应的所述全局高位地址; 所述根据所述访存指令,生成第三汇编指令,包括: 若确定所述第二寄存器中保存的数值不是所述程序对应的所述全局高位地址时,则将所述程序对应的全局高位地址加载到所述第二寄存器,根据所述访存指令生成第三汇编指令; 若确定所述第二寄存器中保存的数值是所述程序对应的所述全局高位地址时,则直接根据所述访存指令生成第三汇编指令。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述第三汇编指令为双基址访存指令,所述双基址访存指令包括操作码、第一寄存器标识、第二寄存器标识、目标寄存器标识以及偏移量,其中所述偏移量为零。
6.根据权利要求5所述的方法,其特征在于,所述访存指令为读指令; 所述第三汇编指令为双基址读指令,所述双基址读指令用于将通过所述第一寄存器标识和所述第二寄存器标识获得的所述目标地址中存储的数据读取到所述目标寄存器标识所标示的寄存器。
7.根据权利要求5所述的方法,其特征在于,所述访存指令为写指令; 所述第三汇编指令为双基址写指令,所述双基址写指令用于将所述目标寄存器标识所标示的寄存器中存储的数据写入到通过所述第一寄存器标识和所述第二寄存器标识获得的所述目标地址中。
8.—种64位虚拟机处理访存指令的装置,其特征在于,包括: 获取模块,用于获取访存指令;确定模块,用于根据所述获取模块获取的所述访存指令,确定所述访存指令所指示访存的目标地址的低位地址; 第一生成模块,用于根据所述确定模块确定的所述目标地址的低位地址,生成第一汇编指令和第二汇编指令,以使通过所述第一汇编指令和所述第二汇编指令将所述低位地址加载到第一寄存器; 第二生成模块,用于根据所述获取模块获取的所述访存指令,生成第三汇编指令,所述第三汇编指令用于访存所述第一寄存器中存储的所述低位地址与第二寄存器中存储的高位地址,并叠加得到的目标地址,所述高位地址为程序的全局高位地址。
9.根据权利要求8所述的装置,其特征在于,所述第一生成模块,包括: 第一生成单元,用于根据所述确定模块确定的目标地址的低位地址生成第一汇编指令,所述第一汇编指令用于将所述低位地址中的高位子地址加载到所述第一寄存器; 第二生成单元,用于根据所述确定模块确定的目标地址的低位地址生成第二汇编指令,所述第二汇编指令用于将所述低位地址中的低位子地址加载到所述第一寄存器。
10.根据权利要求8或9所述的装置,其特征在于,还包括:存储模块; 所述存储模块,用于在开始编译所述程序时,将所述程序对应的所述全局高位地址存储在所述第二寄存器。
11.根据权利要求10所述的装置,其特征在于,还包括:判断模块; 所述判断模块,用于判断所述第二寄存器中保存的数值是否为所述程序对应的所述全局高位地址; 所述第二生成模块,包括: 第三生成单元,用于若所述判断模块确定所述第二寄存器中保存的数值不是所述程序对应的所述全局高位地址时,则将所述程序对应的全局高位地址加载到所述第二寄存器,根据所述访存指令生成第三汇编指令; 第四生成单元,用于若所述判断模块确定所述第二寄存器中保存的数值是所述程序对应的所述全局高位地址时,则直接根据所述访存指令生成第三汇编指令。
【文档编号】G06F9/30GK103970507SQ201410216828
【公开日】2014年8月6日 申请日期:2014年5月21日 优先权日:2014年5月21日
【发明者】敖琪, 靳国杰, 高翔 申请人:龙芯中科技术有限公司