指令地址获取方法和即时编译器的制造方法

文档序号:6542595阅读:288来源:国知局
指令地址获取方法和即时编译器的制造方法
【专利摘要】本发明实施例提供一种指令地址获取方法和即时编译器,其中,该方法包括:确定目标指令;在所述目标指令前插入加载预设地址至预设寄存器的指令;将所述预设地址更新为所述目标指令的地址。当程序运行到目标指令时,目标指令的地址已经存储在预设寄存器中,因此后续代码可以直接访问使用存储在预设寄存器中的目标指令的地址。由于通过加载预设地址常量到预设寄存器的指令来实现存储目标指令的地址到预设寄存器的目的,不会打断代码执行的流水线,因此提高了代码执行效率。
【专利说明】指令地址获取方法和即时编译器
【技术领域】
[0001 ] 本发明实施例涉及计算机【技术领域】,尤其涉及一种指令地址获取方法和即时编译器。
【背景技术】
[0002]在即时编译器中,经常需要获取目标指令地址,以便在编译过程中做出指令顺序的调整或者将指令地址保存以供后续代码使用。
[0003]现有技术中,无内部互锁流水线的微处理器(Microprocessor withoutinterlocked piped stages,简称:MIPS)架构下,获取目标指令地址的过程为:首先确定目标指令,在目标指令前插入一条跳转空函数指令和延迟槽,在执行跳转空函数指令时,硬件会将目标指令的地址放于31号寄存器中,从而在运行至目标指令时,目标指令的地址已经位于31号寄存器,后续代码可以直接访问31号寄存器,获取目标指令的地址。
[0004]然而,跳转指令会打断代码流水线,造成代码执行效率低下。

【发明内容】

[0005]本发明实施例提供一种指令地址获取方法和即时编译器,用于解决现有技术的问题,提高代码执行效率。
[0006]第一方面,本发明实施例提供一种指令地址获取方法,包括:
[0007]确定目标指令;
[0008]在所述目标指令前插入加载预设地址至预设寄存器的指令;
[0009]将所述预设地址更新为所述目标指令的地址。
[0010]第二方面,本发明实施例提供一种即时编译器,包括:
[0011]确定单元,用于确定目标指令;
[0012]插入单元,用于在所述目标指令前插入加载预设地址至预设寄存器的指令;
[0013]更新单元,用于将所述预设地址更新为所述目标指令的地址。
[0014]本发明实施例提供的指令地址获取方法和即时编译器,通过确定目标指令;在所述目标指令前插入加载预设地址至预设寄存器的指令;将所述预设地址更新为所述目标指令的地址,当程序运行到目标指令时,目标指令的地址已经存储在预设寄存器中,因此后续代码可以直接访问使用存储在预设寄存器中的目标指令的地址。由于通过加载预设地址常量到预设寄存器的指令来实现存储目标指令的地址到预设寄存器的目的,不会打断代码执行的流水线,因此提高了代码执行效率。
【专利附图】

【附图说明】
[0015]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0016]图1为本发明指令地址获取方法实施例一的流程图;
[0017]图2为本发明指令地址获取方法实施例二的流程图;
[0018]图3为本发明即时编译器实施例一的结构示意图。
【具体实施方式】
[0019]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0020]图1为本发明指令地址获取方法实施例一的流程图,如图1所示,本实施例的执行主体为即时编译器,本实施例的方法可以包括:
[0021]SlOl、确定目标指令。
[0022]S102、在所述目标指令前插入加载预设地址至预设寄存器的指令。
[0023]S103、将所述预设地址更新为所述目标指令的地址。
[0024]本实施例中,即时编译器在已经完成源码的编译但还没有完成链接(也就是指令还没有实际地址时)时可以确定出目标指令,确定出的目标指令可以为至少一条,以其中的一条目标指令为例,假设该目标指令为addu t0, t0, tl。然后在该确定的目标指令前插入加载预设地址至预设寄存器的指令,预设地址可以为地址常量,例如:预设地址为O地址;预设寄存器为存储常数的寄存器,例如可以为I号寄存器(at寄存器),或者其它处于空闲状态的寄存器。若即时编译器运行在32位系统下,指令的地址大小为32位,在MIPS架构下需要两条指令:lui和ori来加载一个32位的地址常量。具体代码可以为:
[0025]Iui at, 0x0
[0026]ori at,0x0
[0027]addu t0,t0,tl
[0028]addu t0,t0,tl为目标指令,在目标指令:addu t0,t0,tl前插入Iui at,0x0和ori at,0x0两个指令,Iui at,0x0表示将0地址的高16位(即0x0)加载至at寄存器高16中,ori at,0x0表示将O地址的低16位(即0x0)加载至at寄存器低16中。
[0029]在确定目标指令的地址后,将预设地址更新为目标指令地址,即更新加载指令,更新加载指令的源操作数(预设地址)为目标指令地址,从而可以将预设地址更新为目标指令的地址。假设目标指令的地址为0x2a006900,即更新Iui指令的操作数0x0为目标指令的地址的高16位和ori指令的操作数0x0为目标指令的地址的低16位。具体代码为:
[0030]Iui at,0x2a00
[0031]ori at,0x6900
[0032]addu t0,t0,tl
[0033]addu t0,t0,tl为目标指令,将目标指令:addu t0,t0,tl前的Iui at,0x0指令中的操作数0x0更新为0x2a006900的高16位(即0x2a00),更新后的指令为Iui at,0x2a00,从而可以将目标指令的地址的高16位存储在at寄存器的高16位。将目标指令:addu t0,t0,tl前的ori at,0x0指令中的操作数0x0更新为0x2a006900的低16位(即0x6900),从而可以将目标指令的地址的低16位存储在at寄存器的低16位。从而可以将目标指令的地址存储在加载有预设地址的预设寄存器中,因此当程序运行到目标指令时,目标指令的地址已经存储在预设寄存器中,因此后续代码可以直接访问预设寄存器,使用存储在预设寄存器中的目标指令的地址。
[0034]需要说明的是,本实施例是以一条目标指令进行举例说明,若确定了多条目标指令时,每条目标指令可以参见上述目标指令的处理过程,即在每条指令前插入加载预设地址至预设寄存器的指令,然后将所述预设地址更新为该目标指令的地址。
[0035]本发明实施例提供的指令地址获取方法,通过确定目标指令;在所述目标指令前插入加载预设地址至预设寄存器的指令;将所述预设地址更新为所述目标指令的地址,当程序运行到目标指令时,目标指令的地址已经存储在预设寄存器中,因此后续代码可以直接访问预设寄存器,使用存储在预设寄存器中的目标指令的地址。由于通过加载预设地址常量到预设寄存器的指令来实现存储目标指令的地址到预设寄存器的目的,不会打断代码执行的流水线,因此提闻了指令执行效率。
[0036]图2为本发明指令地址获取方法实施例二的流程图,如图2所示,本实施例的执行主体为即时编译器,本实施例的方法可以包括:
[0037]S201、确定目标指令。
[0038]S202、在所述目标指令前插入加载预设地址至预设寄存器的指令。
[0039]S203、在所述加载指令后插入压栈保存所述预设寄存器的指令。
[0040]S204、确定所述目标指令的地址。
[0041]S205、将所述预设地址更新为所述目标指令的地址。
[0042]本实施例中,即时编译器在已经完成源码的编译但还没有完成链接(也就是指令还没有实际地址时)时可以确定出目标指令,此时目标指令的地址还不确定,需要使用一个临时缓存区将编译后的目标指令进行缓存,当缓冲区空间不足时还可以重新申请缓冲区并复制原缓冲区的目标指令到新缓冲区。上述确定出的目标指令可以为至少一条,以其中的一条目标指令为例,假设该目标指令为addu t0, t0, tl。然后在该确定的目标指令前插入加载预设地址至预设寄存器的指令,预设地址可以为地址常量,例如:预设地址为O地址;预设寄存器为存储常数的寄存器,例如可以为I号寄存器(at寄存器),或者其它处于空闲状态的寄存器。若即时编译器运行在32位系统下,指令的地址大小为32位,在MIPS架构下需要两条指令:lui和ori来加载一个32位的地址常量。进一步地,本实施例中如果后续目标指令需要使用预设寄存器,如在后续目标指令前也插入将预设地址加载至同一预设寄存器中的指令或者其它指令需要用到预设寄存器时,那么需要将预设寄存器进行压栈保存,也就是在所述加载指令后插入压栈保存所述预设寄存器的指令,在32位MIPS架构下需要两条指令:addiu和sw来压栈保存预设寄存器。具体代码可以为:
[0043]Iui at, 0x0
[0044]ori at,0x0
[0045]addiu sp,sp,_4
[0046]sw at,(0) sp
[0047]addu t0,t0,tl
[0048]addu t0,t0,tl为目标指令,在目标指令:addu t0,t0,tl前插入Iui at,0x0和ori at,OxO两个指令,Iui at,0x0表示将O地址的高16位(B卩0x0)加载至at号寄存器高16中,ori at,0x0表示将O地址的低16位(即0x0)加载至at号寄存器低16中,addiusp, sp, -4表示申请4个字节的栈空间,在32位系统下申请的栈空间为4个字节。sw at,
(0)sp表示将预设寄存器进行压栈保存。
[0049]当即时编译器链接完成后,可以确定目标指令在内存中的位置,即可以确定目标指令的地址。需要说明的是,本实施例中,如何确定目标指令在内存中的位置与现有技术类似,此处不再赘述。
[0050]在确定目标指令的地址后,更新加载指令的操作数,从而可以更新预设地址为目标指令的地址。假设目标指令的地址为0x2a006900,即更新Iui指令的操作数0x0为目标指令的地址的高16位和ori指令的操作数0x0为目标指令的地址的低16位。具体代码为:
[0051]Iui at,0x2a00
[0052]ori at,0x6900
[0053]addiu sp, sp, _4
[0054]sw at, (O) sp
[0055]addu t0, t0, tl
[0056]addu t0,t0,tl为目标指令,将目标指令:addu t0, t0, tl前的Iui at, 0x0指令中的操作数0x0更新为0x2a006900的高16位(即0x2a00),更新后的指令为Iui at,0x2a00,从而可以将目标指令的地址的高16位存储在at寄存器的高16位。将目标指令:addu t0,t0,tl前的ori at, 0x0指令中的操作数0x0更新为0x2a006900的低16位(即0x6900),从而可以将目标指令的地址的低16位存储在at寄存器的低16位。addiu sp,sp,_4表示申请4个字节的栈空间,在32位系统下申请的栈空间为4个字节。sw at, (0)sp表示将预设寄存器进行压栈保存,即将预设寄存器中的目标指令地址压栈保存。从而可以将目标指令的地址存储在加载有预设地址的预设寄存器中,并进行压栈保存,因此当程序运行到目标指令时,目标指令的地址已经存储在栈中,因此后续代码可以直接访问使用存储在栈中的目标指令的地址。
[0057]需要说明的是,本实施例是以一条目标指令进行举例说明,若确定了多条目标指令时,每条目标指令可以参见上述目标指令的处理过程,即在每条指令前插入加载预设地址至预设寄存器的指令,和压栈保存预设寄存器的指令,然后将所述预设地址更新为该目标指令的地址。
[0058]本发明实施例提供的指令地址获取方法,通过确定目标指令,在所述目标指令前插入加载预设地址至预设寄存器的指令,在所述加载指令后插入压栈保存所述预设寄存器的指令,将所述预设地址更新为所述目标指令的地址;当程序运行到目标指令时,目标指令的地址已经存储在栈中,因此后续代码可以直接访问使用存储在栈中的目标指令的地址。
[0059]图3为本发明即时编译器实施例一的结构示意图,如图3所示,本实施例的即时编译器可以包括:确定单元11、插入单元12和更新单元13,其中,确定单元11用于确定目标指令;插入单元12用于在所述目标指令前插入加载预设地址至预设寄存器的指令;更新单元13用于将所述预设地址更新为所述目标指令的地址。
[0060]本实施例的即时编译器,可以用于执行图1所示方法实施例的技术方案,其实现原理类似,此处不再赘述。
[0061 ] 本发明实施例提供的即时编译器,通过确定目标指令;在所述目标指令前插入加载预设地址至预设寄存器的指令;将所述预设地址更新为所述目标指令的地址,当程序运行到目标指令时,目标指令的地址已经存储在预设寄存器中,因此后续代码可以直接访问使用存储在预设寄存器中的目标指令的地址。由于通过加载预设地址常量到预设寄存器的指令来实现存储目标指令的地址到预设寄存器的目的,不会打断代码执行的流水线,因此提闻了指令执行效率。
[0062]在本发明即时编译器实施例二中,本实施例的即时编译器在图3所示结构的基础上,进一步地,确定单元11还用于在插入单元12在所述目标指令前插入加载预设地址至预设寄存器的指令之后,确定所述目标指令的地址。
[0063]更进一步地,插入单元12还用于在所述目标指令前插入加载预设地址至预设寄存器的指令之后,在所述目标指令前插入压栈保存所述预设寄存器的指令。
[0064]可选地,所述预设地址为地址常量。
[0065]可选地,所述预设寄存器为存储常数的寄存器或者处于空闲状态的寄存器。
[0066]本实施例的即时编译器,可以用于执行图2所示方法实施例的技术方案,其实现原理类似,此处不再赘述。
[0067]本发明实施例提供的即时编译器,通过确定目标指令,在所述目标指令前插入加载预设地址至预设寄存器的指令,在所述加载指令后插入压栈保存所述预设寄存器的指令,将所述预设地址更新为所述目标指令的地址;当程序运行到目标指令时,目标指令的地址已经存储在栈中,因此后续代码可以直接访问使用存储在栈中的目标指令的地址。
[0068]本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0069]最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
【权利要求】
1.一种指令地址获取方法,其特征在于,包括: 确定目标指令; 在所述目标指令前插入加载预设地址至预设寄存器的指令; 将所述预设地址更新为所述目标指令的地址。
2.根据权利要求1所述的方法,其特征在于,所述在所述目标指令前插入加载预设地址至预设寄存器的指令之后,还包括: 确定所述目标指令的地址。
3.根据权利要求1所述的方法,其特征在于,所述在所述目标指令前插入加载预设地址至预设寄存器的指令之后,还包括: 在所述目标指令前插入压栈保存所述预设寄存器的指令。
4.根据权利要求1-3任意一项所述的方法,其特征在于,所述预设地址为地址常量。
5.根据权利要求1-3任意一项所述的方法,其特征在于,所述预设寄存器为存储常数的寄存器或者是处于空闲状态的寄存器。
6.一种即时编译器,其特征在于,包括: 确定单元,用于确定目标指令; 插入单元,用于在所述目标指令前插入加载预设地址至预设寄存器的指令; 更新单元,用于将所述预设地址更新为所述目标指令的地址。
7.根据权利要求6所述的即时编译器,其特征在于,所述确定单元还用于在所述插入单元在所述目标指令前插入加载预设地址至预设寄存器的指令之后,确定所述目标指令的地址。
8.根据权利要求6所述的即时编译器,其特征在于,所述插入单元还用于在所述目标指令前插入加载预设地址至预设寄存器的指令之后,在所述目标指令前插入压栈保存所述预设寄存器的指令。
9.根据权利要求6-8任意一项所述的即时编译器,其特征在于,所述预设地址为地址常量。
10.根据权利要求6-8任意一项所述的即时编译器,其特征在于,所述预设寄存器为存储常数的寄存器或者是处于空闲状态的寄存器。
【文档编号】G06F9/38GK103870249SQ201410128997
【公开日】2014年6月18日 申请日期:2014年4月1日 优先权日:2014年4月1日
【发明者】余银, 薛双柏, 王策, 彭飞 申请人:龙芯中科技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1