寄存器分配方法、装置、电子设备及计算机存储介质与流程

文档序号:22757391发布日期:2020-10-31 09:54阅读:141来源:国知局
寄存器分配方法、装置、电子设备及计算机存储介质与流程

本发明实施例涉及计算机技术领域,尤其涉及一种寄存器分配方法、装置、电子设备及计算机存储介质。



背景技术:

寄存器分配是通过将程序变量尽可能地分配到寄存器,从而提高程序执行速度的一种方法。在实际编译器中,为了尽可能的榨取性能,提升编译器的分配效率,都采用了各种不同的方式来优化寄存器分配算法。

以llvm为例,llvm是构架编译器(compiler)的框架系统,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)和空闲时间(idle-time),并兼容已有脚本。并且,llvm提供了与语言无关的中间代码,因此,可将不同语言代码生成中间代码,从而实现通过llvm将不同的语言相互连结起来。在llvm中,函数参数由abi(applicationbinaryinterface,应用二进制接口)定义在指定的物理寄存器里传递,llvm通过函数调用前后物理与虚拟寄存器之间的拷贝来表示。寄存器分配器尝试将虚拟寄存器分配给相同的物理寄存器,使得拷贝可以被消除。但是,在目前的llvm中,尚没有明确的针对寄存器参数传递的调用约定(callingconventions,cc),在实际应用中,若想使用某个寄存器,需要编程人员设定额外的、针对要使用的寄存器的调用约定,比如定义一个v8r0r3cc的调用约定,来专门处理r0和r3传参的情况。而若需要使用寄存器r4r5传参,则又需要编程人员再为r4和r5定义一个调用约定。

由此,大大增加了llvm中寄存器参数的传递成本,降低了llvm的编译效率。



技术实现要素:

有鉴于此,本发明实施例提供一种寄存器分配方案,以至少部分解决上述问题。

根据本发明实施例的第一方面,提供了一种寄存器分配方法,包括:根据调用实例的信息,获取待调用的目标函数和调用约定的信息,其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息;根据所述调用约定的信息,获取所述目标函数所使用的寄存器的信息;根据所述寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述目标函数的参数传递。

根据本发明实施例的第二方面,提供了一种寄存器分配装置,包括:第一获取模块,用于根据调用实例的信息,获取待调用的目标函数和调用约定的信息,其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息;第二获取模块,用于根据所述调用约定的信息,获取所述目标函数所使用的寄存器的信息;分配模块,用于根据所述寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述目标函数的参数传递。

根据本发明实施例的第三方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如第一方面所述的寄存器分配方法对应的操作。

根据本发明实施例的第四方面,提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面所述的寄存器分配方法。

根据本发明实施例提供的寄存器分配方案,在需要为待调用的目标函数分配寄存器时,根据预设的调用约定将其携带在调用实例的信息中,以根据所述调用约定对调用实例的信息进行解析,从中获取寄存器的信息,进而据此分配寄存器以传递所述目标函数的参数。其中,所述调用约定中包括有当前设备中所有可用寄存器的定义信息,也即,该调用约定可为当前设备的所有可用寄存器服务在调用约定中找到相应的位置和处理,而无需在每次进行相应的寄存器参数传递时,为使用的寄存器额外设定专用的调用约定。一次设定即可在当前设备上长久使用,有效降低了寄存器参数的传递成本,提高了代码编译效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1为根据本发明实施例一的一种寄存器分配方法的步骤流程图;

图2为根据本发明实施例二的一种寄存器分配方法的步骤流程图;

图3为根据本发明实施例三的一种寄存器分配装置的结构框图;

图4为根据本发明实施例四的一种寄存器分配装置的结构框图;

图5为根据本发明实施例五的一种电子设备的结构示意图。

具体实施方式

为了使本领域的人员更好地理解本发明实施例中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明实施例一部分实施例,而不是全部的实施例。基于本发明实施例中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本发明实施例保护的范围。

下面结合本发明实施例附图进一步说明本发明实施例具体实现。

实施例一

参照图1,示出了根据本发明实施例一的一种寄存器分配方法的步骤流程图。

本实施例的寄存器分配方法包括以下步骤:

步骤s102:根据调用实例的信息,获取待调用的目标函数和调用约定的信息。

本发明实施例中,所采用的调用约定与常规需针对具体使用的寄存器的调用约定不同,本发明实施例的调用约定中包括当前设备中所有可用寄存器的定义信息。所述定义信息包括但不限于:各个可用寄存器的指示信息(如标识信息或指针信息等)、各个可用寄存器的位置信息(也可以认为是顺序信息)、该调用约定中对寄存器和/或参数的具体处理信息,等等。例如,当前设备有5个可用寄存器(如,r0-r4),则该调用约定的格式可以采用诸如:xxxcc:待调用的目标函数,r0,r1,r2,r3,r4的格式。

其中,本领域技术人员可以根据实际需求设定什么样的寄存器为可用寄存器,一种可行方式中,可以将除保留寄存器之外的寄存器设定为可用寄存器。

调用实例为某种调用的实例(instance),例如,llvm的函数、调用和反射均可以有一个选择调用约定指定调用。在实际应用中,根据这些函数、调用和反射,对应生成的具体调用函数、调用点、反射调用等均可认为是调用实例。

调用实例的信息中携带有待传递的参数和调用约定的信息,其中,调用约定的信息可以采用任意适当的方式指示,如调用约定的名称或标识等。

步骤s104:根据调用约定的信息,获取所述目标函数所使用的寄存器的信息。

如前所述,调用约定中包括当前设备中所有可用寄存器的定义信息。因此,可以从调用约定中对应于各个寄存器的值来获取寄存器的信息。

例如,仍以xxxcc:待调用的目标函数,r0,r1,r2,r3,r4的格式为例,若xxxcc:f1,undef,undef,r2,r3,undef,则所述待调用的目标函数所使用的寄存器包括r2和r3。

步骤s106:根据寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述目标函数的参数传递。

在根据寄存器的信息,确定了所述目标函数所使用的寄存器后,即可按照当前应用如当前代码生成器或编译器中的寄存器分配算法,或者由其中负责进行寄存器分配的寄存器分配器来为所述调用实例分配寄存器,以进行所述目标函数的参数传递。

通过本实施例,在需要为待调用的目标函数分配寄存器时,根据预设的调用约定将其携带在调用实例的信息中,以根据所述调用约定对调用实例的信息进行解析,从中获取寄存器的信息,进而据此分配寄存器以传递所述目标函数的参数。其中,所述调用约定中包括有当前设备中所有可用寄存器的定义信息,也即,该调用约定可为当前设备的所有可用寄存器服务在调用约定中找到相应的位置和处理,而无需在每次进行相应的寄存器参数传递时,为使用的寄存器额外设定专用的调用约定。一次设定即可在当前设备上长久使用,有效降低了寄存器参数的传递成本,提高了代码编译效率。

本实施例的寄存器分配方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如手机、pad等)和pc机等。

实施例二

参照图2,示出了根据本发明实施例二的一种寄存器分配方法的步骤流程图。

本实施例以llvm为所述寄存器分配方法的使用方,以设置用于v8引擎的调用约定为例,对本发明实施例的寄存器分配方案进行说明。

基于此,本实施例的寄存器分配方法包括以下步骤:

步骤s202:生成调用约定。

本步骤可以包括:获取当前设备中除保留寄存器外的其它寄存器的信息;为所述其它寄存器设置在调用约定中的参数指示信息及参数位置信息;根据参数指示信息及参数位置信息,生成调用约定。其格式可如xxxcc:待调用的目标函数,r0,r1,r2,r3,r4。在一个llvm的具体示例中,可以如@some_call,i321,i320,i64addrspace(1)*%obj,i320,i325,i32-1……

编译器通常按需要把寄存器分为三组使用:可分配寄存器、保留寄存器和零用寄存器。其中,可分配寄存器用来给变量(源变量和临时变量)分配的寄存器;保留寄存器是系统为特殊任务保留的专用寄存器,如栈指针寄存器、display寄存器等;零用寄存器是用来打“短工”的寿命非常短的寄存器。可分配寄存器只能通过调用子程序的办法来申请;而保留寄存器是在目标代码的整个运行期间都是专用的,因此既不能参加分配,也不能打短工用;零用寄存器是短命的寄存器,故不能参加分配,也不同于专用的保留寄存器,系统可按随需随用的原则使用。因此,当前设备中除保留寄存器外的其它寄存器可以认为是可分配寄存器,即,本发明实施例中的可用寄存器。

在获取到当前设备中的可用寄存器的信息后,即可为其设置在调用约定中的参数指示信息及参数位置信息。其中,参数指示信息用于标示寄存器,如寄存器名称或寄存器标识等;参数位置信息用于指示各个寄存器的顺序位置。此外,每个调用约定都具有一定的功能,如,调用约定“ccc”是一种匹配目标到c语言的调用约定,这个调用约定支持变长参数函数调用并可容忍函数的声明和实现之间存在一些不匹配的地方。与此类似,本领域技术人员可以设置该调用约定对该约定中的参数如寄存器的信息和使用寄存器传递的参数的信息进行相应的寄存器分配和处理。

在一种可行方式中,所述根据所述参数指示信息及参数位置信息,生成所述调用约定可以包括:为所述其它寄存器进行寄存器分配处理设置,通过所述寄存器分配处理设置指示所述其它寄存器在寄存器分配阶段不进行数据保存处理;根据所述参数指示信息、所述参数位置信息和所述寄存器分配处理设置,生成所述调用约定。在调用约定中,规定在寄存器分配阶段,不会保存任何值到寄存器,编译器就会把所有活动的值保存到堆栈,以方便地从堆栈空间找到安全点,而且由于只有寄存器分配器在处理这项工作,不会引发与安全点生成模块的冲突。

当然,在实际应用中,也可以在该调用约定中约定其它内容。

具体到在llvm中设定用于v8引擎的调用约定,一种可行的方式中,可以定义一个调用约定v8cc,把传参定义为除了保留寄存器外的所有寄存器,v8引擎使用的寄存器包括r0-r11。无参的地方,传入未定义值即可。此外,定义这类调用约定在寄存器分配阶段,不会保存任何值到寄存器,编译器就会把所有活动的值保存到堆栈,以方便地从堆栈空间找到安全点,而且由于只有寄存器分配器在处理这项工作,不会引发冲突。

通过本步骤,实现了调用约定的设定和生成,该调用约定生成后,可在后续长期使用。

步骤s204:获取调用实例的信息,根据调用实例的信息,获取待调用的目标函数和调用约定的信息。

其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息。

若调用实例使用了步骤s202中的调用约定,则可以从该调用实例的信息中获取待调用的目标函数和该调用约定的信息。

例如,若需要传参到r0和r3,则可能从调用实例的信息中获取到:llvmir:callv8ccfunctionp1(r0,undef,r3,undef…undef)。其中,“functionp1”为待调用的目标函数,v8cc为调用约定的信息。

步骤s206:根据调用约定的信息,获取所述待调用的目标函数所使用的寄存器的信息。

在一种可行方式中,可以根据调用约定所约定的参数指示信息和参数位置信息,获取所述待调用的目标函数所使用的寄存器的信息。通过这种方式,可以高效快速地确定寄存器的信息。

如前所述,v8引擎使用的寄存器包括r0-r11,对应的调用约定的传参形式诸如:v8cc待调用的目标函数,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10。而根据“llvmir:callv8ccfunctionp1(r0,undef,r3,undef…undef)”则可确定,其传参使用的寄存器为r0和r3。然后,可以通过selctiondag生成copy节点,copyp1使用的参数到r0和r3。

步骤s208:根据寄存器的信息,为调用实例分配寄存器,以通过所述寄存器进行所述目标函数的参数传递。

在获取了寄存器的信息后,即可为调用实例分配相应的寄存器,以进行参数传递。

若在调用约定中还设置了寄存器分配处理设置,则本步骤可选地,可以实现为:根据所述寄存器的信息和寄存器分配处理设置,为调用实例分配寄存器,并将调用实例中的所有活动值保存至调用实例对应的堆栈中。以使得只有寄存器分配器在保存恢复安全点的值,不会和安全点生成模块冲突。

在将调用实例中的所有活动值保存至调用实例对应的堆栈中后,进一步可选地,可以从所述堆栈中获取调用实例的安全点;根据所述安全点,进行调用实例的处理操作。其中,所述调用实例的处理操作根据调用约定和调用实例的具体代码设置实现,如代码转换或生成等,本发明实施例对此不作限制。

在llvm中,通过上述过程,llvmir可以容易实现对寄存器的传参和分配,不需要额外的调用约定,也使得代码生成更为容易且高效。并且,在需要垃圾收集和安全点的场景下,一个调用约定能够覆盖传统的多个调用,工程上简洁易行。此外,只有寄存器分配器在保存恢复安全点的值,不会和安全点生成模块冲突。

可见,通过本实施例,在需要为待调用的目标函数分配寄存器时,根据预设的调用约定将其携带在调用实例的信息中,以根据所述调用约定对调用实例的信息进行解析,从中获取寄存器的信息,进而据此分配寄存器以传递所述目标函数的参数。其中,所述调用约定中包括有当前设备中所有可用寄存器的定义信息,也即,该调用约定可为当前设备的所有可用寄存器服务在调用约定中找到相应的位置和处理,而无需在每次进行相应的寄存器参数传递时,为使用的寄存器额外设定专用的调用约定。一次设定即可在当前设备上长久使用,有效降低了寄存器参数的传递成本,提高了代码编译效率。

本实施例的寄存器分配方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如手机、pad等)和pc机等。

实施例三

参照图3,示出了根据本发明实施例三的一种寄存器分配装置的结构框图。

本实施例的寄存器分配装置包括:第一获取模块302,用于根据调用实例的信息,获取待调用的目标函数和调用约定的信息,其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息;第二获取模块304,用于根据所述调用约定的信息,获取所述待调用的目标函数所使用的寄存器的信息;分配模块306,用于根据所述寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述待调用的目标函数的参数传递。

本实施例的寄存器分配装置用于实现前述多个方法实施例中相应的寄存器分配方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的寄存器分配装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。

实施例四

参照图4,示出了根据本发明实施例四的一种寄存器分配装置的结构框图。

本实施例的寄存器分配装置包括:第一获取模块402,用于根据调用实例的信息,获取待调用的目标函数和调用约定的信息,其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息;第二获取模块404,用于根据所述调用约定的信息,获取所述待调用的目标函数所使用的寄存器的信息;分配模块406,用于根据所述寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述待调用的目标函数的参数传递。

可选地,本实施例的寄存器分配装置还包括:生成模块408,用于通过以下方式生成所述调用约定:获取当前设备中除保留寄存器外的其它寄存器的信息;为所述其它寄存器设置在调用约定中的参数指示信息及参数位置信息;根据所述参数指示信息及所述参数位置信息,生成所述调用约定。

可选地,所述生成模块408在根据所述参数指示信息及参数位置信息,生成所述调用约定时:为所述其它寄存器进行寄存器分配处理设置,通过所述寄存器分配处理设置指示所述其它寄存器在寄存器分配阶段不进行数据保存处理;根据所述参数指示信息、所述参数位置信息和所述寄存器分配处理设置,生成所述调用约定。

可选地,所述分配模块406,用于根据所述寄存器的信息和所述寄存器分配处理设置,为所述调用实例分配寄存器,并将所述调用实例中的所有活动值保存至所述调用实例对应的堆栈中。

可选地,本实施例的寄存器分配装置还包括:处理模块410,用于从所述堆栈中获取所述调用实例的安全点;根据所述安全点,进行所述调用实例的处理操作。

可选地,所述第二获取模块404,用于根据所述调用约定所约定的所述参数指示信息和所述参数位置信息,获取所述待调用的目标函数所使用的寄存器的信息。

可选地,本实施例的寄存器分配装置应用于llvm,所述调用约定为v8引擎调用约定。

本实施例的寄存器分配装置用于实现前述多个方法实施例中相应的寄存器分配方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的寄存器分配装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。

实施例五

参照图5,示出了根据本发明实施例五的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。

如图5所示,该电子设备可以包括:处理器(processor)502、通信接口(communicationsinterface)504、存储器(memory)506、以及通信总线508。

其中:

处理器502、通信接口504、以及存储器506通过通信总线508完成相互间的通信。

通信接口504,用于与其它电子设备或服务器进行通信。

处理器502,用于执行程序510,具体可以执行上述寄存器分配方法实施例中的相关步骤。

具体地,程序510可以包括程序代码,该程序代码包括计算机操作指令。

处理器52可能是中央处理器cpu,或者是特定集成电路asic(applicationspecificintegratedcircuit),或者是被配置成实施本发明实施例的一个或多个集成电路。智能设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个cpu;也可以是不同类型的处理器,如一个或多个cpu以及一个或多个asic。

存储器506,用于存放程序510。存储器506可能包含高速ram存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。

程序510具体可以用于使得处理器502执行以下操作:根据调用实例的信息,获取待调用的目标函数和调用约定的信息,其中,所述调用约定中包括当前设备中所有可用寄存器的定义信息;根据所述调用约定的信息,获取所述待调用的目标函数所使用的寄存器的信息;根据所述寄存器的信息,为所述调用实例分配寄存器,以通过所述寄存器进行所述待调用的目标函数的参数传递。

在一种可选的实施方式中,程序510还用于使得处理器502通过以下方式生成所述调用约定:获取当前设备中除保留寄存器外的其它寄存器的信息;为所述其它寄存器设置在调用约定中的参数指示信息及参数位置信息;根据所述参数指示信息及所述参数位置信息,生成所述调用约定。

在一种可选的实施方式中,程序510还用于使得处理器502在根据所述参数指示信息及参数位置信息,生成所述调用约定时,为所述其它寄存器进行寄存器分配处理设置,通过所述寄存器分配处理设置指示所述其它寄存器在寄存器分配阶段不进行数据保存处理;根据所述参数指示信息、所述参数位置信息和所述寄存器分配处理设置,生成所述调用约定。

在一种可选的实施方式中,程序510还用于使得处理器502在根据所述寄存器的信息,为所述调用实例分配寄存器时,根据所述寄存器的信息和所述寄存器分配处理设置,为所述调用实例分配寄存器,并将所述调用实例中的所有活动值保存至所述调用实例对应的堆栈中。

在一种可选的实施方式中,程序510还用于使得处理器502从所述堆栈中获取所述调用实例的安全点;根据所述安全点,进行所述调用实例的处理操作。

在一种可选的实施方式中,程序510还用于使得处理器502在根据所述调用约定的信息,获取所述待调用的目标函数所使用的寄存器的信息时,根据所述调用约定所约定的所述参数指示信息和所述参数位置信息,获取所述待调用的目标函数所使用的寄存器的信息。

在一种可选的实施方式中,本实施例的电子设备应用于llvm,所述调用约定为v8引擎调用约定。

程序510中各步骤的具体实现可以参见上述寄存器分配方法实施例中的相应步骤和单元中对应的描述,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。

通过本实施例的电子设备,在需要为待调用的目标函数分配寄存器时,根据预设的调用约定将其携带在调用实例的信息中,以根据所述调用约定对调用实例的信息进行解析,从中获取寄存器的信息,进而据此分配寄存器以传递所述待调用的目标函数的参数。其中,所述调用约定中包括有当前设备中所有可用寄存器的定义信息,也即,该调用约定可为当前设备的所有可用寄存器服务在调用约定中找到相应的位置和处理,而无需在每次进行相应的寄存器参数传递时,为使用的寄存器额外设定专用的调用约定。一次设定即可在当前设备上长久使用,有效降低了寄存器参数的传递成本,提高了代码编译效率。

需要指出,根据实施的需要,可将本发明实施例中描述的各个部件/步骤拆分为更多部件/步骤,也可将两个或多个部件/步骤或者部件/步骤的部分操作组合成新的部件/步骤,以实现本发明实施例的目的。

上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可存储在记录介质(诸如cdrom、ram、软盘、硬盘或磁光盘)中的软件或计算机代码,或者被实现通过网络下载的原始存储在远程记录介质或非暂时机器可读介质中并将被存储在本地记录介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件(诸如asic或fpga)的记录介质上的这样的软件处理。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件(例如,ram、rom、闪存等),当所述软件或计算机代码被计算机、处理器或硬件访问且执行时,实现在此描述的寄存器分配方法。此外,当通用计算机访问用于实现在此示出的寄存器分配方法的代码时,代码的执行将通用计算机转换为用于执行在此示出的寄存器分配方法的专用计算机。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明实施例的范围。

以上实施方式仅用于说明本发明实施例,而并非对本发明实施例的限制,有关技术领域的普通技术人员,在不脱离本发明实施例的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明实施例的范畴,本发明实施例的专利保护范围应由权利要求限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1