一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

指令处理方法、指令执行方法以及处理器与流程

2022-04-06 19:32:16 来源:中国专利 TAG:


1.本公开的实施例涉及一种指令处理方法、指令执行方法以及处理器。


背景技术:

2.应用程序在计算机系统中运行的过程,通常需要代码、栈、堆、数据段。代码段主要存放可执行文件中的代码;数据段存放程序中全局变量和静态变量等数据;堆中是程序的动态内存区域,例如,当程序使用malloc或new得到的内存来自堆;栈维护函数调用的上下文,离开了栈就不可能实现函数的调用。


技术实现要素:

3.根据本公开的至少一个实施例提供了一种指令处理方法,包括:在对象指令的译码阶段,获取所述对象指令对于应用程序栈的访问地址;在所述对象指令的执行阶段,利用所述访问地址访问所述应用程序栈。
4.例如,在根据本公开的至少一个实施例的指令处理方法中,所述获取所述对象指令对于所述应用程序栈的访问地址,包括:确定在所述对象指令的译码阶段时第一栈顶值是否为有效值;响应于所述第一栈顶值为有效值,使用所述第一栈顶值获取所述访问地址,其中,所述第一栈顶值为由处理器核的流水线的译码单元维护的用于记录所述应用程序栈的栈指针的数值。
5.例如,在根据本公开的至少一个实施例的指令处理方法中,所述响应于所述第一栈顶值为有效值,使用所述第一栈顶值获取所述访问地址,包括:响应于所述对象指令是call指令或push指令,使用所述第一栈顶值减去系统架构参数值得到所述访问地址;或者,响应于所述对象指令是ret或pop指令,使用所述第一栈顶值作为所述访问地址;或者,响应于在所述对象指令是访问所述应用程序栈的指令且为使用所述栈指针和立即数之和进行地址编码的方式,使用所述第一栈顶值加上所述立即数得到所述访问地址。
6.例如,根据本公开的至少一个实施例的指令处理方法还包括:在所述对象指令的译码阶段,结合所述访问地址得到对应于所述对象指令的译码后指令;其中,所述在所述对象指令的执行阶段,利用所述访问地址访问所述应用程序栈,包括:使用所述访问地址,执行所述译码后指令以访问所述应用程序栈。
7.根据本公开的至少一个实施例还提供了一种处理器,包括:
8.译码单元,配置为在对象指令的译码阶段,获取所述对象指令对于应用程序栈的访问地址;
9.执行单元,配置为在所述对象指令的执行阶段,使用所述访问地址访问所述应用程序栈。
10.例如,在根据本公开的至少一个实施例的处理器中,所述译码单元还配置为在所述对象指令的译码阶段,得到对应于所述对象指令的译码后指令;所述执行单元还配置为,执行所述译码后指令以使用所述访问地址访问所述应用程序栈。
11.根据本公开的至少一个实施例还提供了一种指令处理方法,包括:通过处理器核的流水线的译码单元维护用于记录应用程序栈的栈指针的第一栈顶值,提供所述第一栈顶值用于在所述处理器核的流水线的译码单元得到对于所述应用程序栈的访问地址。
12.例如,在根据本公开的至少一个实施例的指令处理方法中,所述通过处理器核的流水线的译码单元维护用于记录所述应用程序栈的栈指针的第一栈顶值,包括:在对象指令的译码阶段,根据所述对象指令的内容设置用于记录所述应用程序栈的栈指针的第一栈顶值。
13.例如,在根据本公开的至少一个实施例的指令处理方法中,所述根据所述对象指令的内容设置用于记录所述应用程序栈的栈指针的第一栈顶值,包括:响应于所述对象指令为改变所述应用程序栈的栈指针的指令,确定所述对象指令属于第一类型指令还是第二类型指令,其中,所述第一类型指令是直接使用所述栈指针进行算术运算以更新所述栈顶值的指令,所述第二类型指令是非直接使用所述栈指针进行算术运算以更新所述栈顶值的指令;响应于所述对象指令属于所述第一类型指令,根据所述对象指令的内容更新所述第一栈顶值;响应于所述对象指令属于所述第二类型指令,将所述第一栈顶值设置为所述应用程序栈的栈指针的初始值(0),将所述第一栈顶值的有效性设置为无效,以及记录所述对象指令的指令序号作为所述第一栈顶值的相关指令序号。
14.例如,在根据本公开的至少一个实施例的指令处理方法中,响应于所述对象指令属于所述第一类型指令,根据所述对象指令的内容更新所述第一栈顶值,包括:响应于所述对象指令是call指令或push指令,使用所述第一栈顶值减去系统架构参数值得到更新后的所述第一栈顶值;或者,响应于所述对象指令是ret或pop指令,使用所述第一栈顶值加上所述系统架构参数值得到更新后的所述第一栈顶值;或者,响应于在所述对象指令是改变所述应用程序栈的栈指针的指令且使用立即数作为源操作,使用所述第一栈顶值和所述立即数进行运算得到更新后的所述第一栈顶值。
15.例如,根据本公开的至少一个实施例的指令处理方法还包括:响应于所述对象指令属于所述第二类型指令,将所述对象指令标注为,在所述对象指令的执行阶段后,需要反馈对应于所述对象指令被执行所得到的所述应用程序栈的栈指针的第二栈顶值。
16.例如,根据本公开的至少一个实施例的指令处理方法还包括:响应于所述对象指令属于所述第二类型指令,接收所述第二栈顶值,响应于所述对象指令的指令序号与所述第一栈顶值当前的相关指令序号相同,使用所述第二栈顶值更新所述第一栈顶值。
17.例如,根据本公开的至少一个实施例的指令处理方法还包括:在所述对象指令的执行阶段,响应于所述对象指令被标注为需要反馈所述第二栈顶值,在所述对象指令被执行后向所述处理器核的流水线的译码单元反馈所述第二栈顶值以及所述对象指令的指令序号。
18.例如,在根据本公开的至少一个实施例的指令处理方法中,所述通过处理器核的流水线的译码单元维护用于记录所述应用程序栈的栈指针的第一栈顶值,还包括:在所述对象指令的译码阶段,接收处理器核的流水线的指令执行单元提供的对应于所述应用程序栈的栈顶值的第二栈顶值,以及响应于发生处理器核的流水线冲刷,将所述第一栈顶值设置为所述第二栈顶值,响应于非发生处理器核的流水线冲刷,还接收所述指令执行单元提供的产生所述第二栈顶值的被执行指令的指令序号,且响应于所述被执行指令的指令序号
与所述第一栈顶值的相关指令序号相同,使用所述第二栈顶值设置所述第一栈顶值,将所述第一栈顶值的有效性设置为有效,其中,所述第一栈顶值的相关指令序号指代在所述对象指令的译码阶段之前记录的最新的将修改所述应用程序栈的栈指针的在先指令的指令序号。
19.根据本公开的至少一个实施例还提供了一种处理器,包括译码单元,其中,所述译码单元配置为:维护用于记录应用程序栈的栈指针的第一栈顶值,提供所述第一栈顶值用于在所述译码单元得到对于所述应用程序栈的访问地址。
20.根据本公开的至少一个实施例还提供了一种指令执行方法,包括:响应于发生处理器核的流水线冲刷,将所述处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给所述处理器核的流水线的译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将所述对象指令被执行所得到的所述应用程序栈的栈指针的栈顶值提供给所述处理器核的流水线的译码单元,其中,所述对象指令被标注为,在被执行后需要反馈所述应用程序栈的栈指针的栈顶值。
21.例如,根据本公开的至少一个实施例的指令执行方法还包括:响应于非发生处理器核的流水线冲刷,将所述对象指令的指令序号提供给所述处理器核的流水线的译码单元。
22.例如,在根据本公开的至少一个实施例的指令执行方法中,所述响应于非发生处理器核的流水线冲刷,执行所述对象指令的译码后指令并将所述对象指令被执行所得到的所述应用程序栈的栈指针的栈顶值提供给所述处理器核的流水线的译码单元,包括:响应于所述对象指令是当前已经分发的最新的被标注为在被执行后需要反馈所述应用程序栈的栈指针的栈顶值的指令,执行所述对象指令的译码后指令并将所述对象指令被执行所得到的所述应用程序栈的栈指针的栈顶值提供给所述处理器核的流水线的译码单元。
23.例如,根据本公开的至少一个实施例的指令执行方法还包括:在指令分发阶段,记录所述当前已经分发的最新的被标注为在被执行后需要反馈所述应用程序栈的栈指针的栈顶值的指令。
24.根据本公开的至少一个实施例还提供了一种处理器,包括执行单元和译码单元,其中,所述执行单元配置为:响应于发生处理器核的流水线冲刷,将所述处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给所述译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将所述对象指令被执行所得到的所述应用程序栈的栈指针的栈顶值提供给所述译码单元,其中,所述对象指令被标注为,在所述对象指令的执行阶段后,需要反馈对应于所述对象指令被执行所得到的应用程序栈的栈指针的栈顶值。
25.例如,在根据本公开的至少一个实施例的处理器中,所述执行单元还配置为:响应于非发生处理器核的流水线冲刷,将所述对象指令的指令序号提供给所述译码单元。
26.例如,在根据本公开的至少一个实施例的处理器中,所述执行单元还配置为:响应于所述对象指令是当前已经分发的最新的被标注为在被执行后需要反馈所述应用程序栈的栈指针的栈顶值的指令,执行所述对象指令的译码后指令并将所述对象指令被执行所得到的所述应用程序栈的栈指针的栈顶值提供给所述处理器核的流水线的译码单元。
27.例如,根据本公开的至少一个实施例的处理器还包括指令分发单元,其中,所述指
令分发单元配置为,记录所述当前已经分发的最新的被标注为在被执行后需要反馈所述应用程序栈的栈指针的栈顶值的指令。
附图说明
28.为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
29.图1示出了应用程序虚拟内存分配的示意图;
30.图2示出了一种处理器核的流水线的示意图;
31.图3示出了根据本公开至少一个实施例提供的一种处理器核的流水线;
32.图4示出了根据本公开至少一个实施例的缓存desp的示例的示意图;
33.图5示出了根据本公开一实施例的指令处理方法的示意性流程图;
34.图6示出了根据本公开一实施例的指令处理方法的示意性流程图;
35.图7示出了根据本公开一实施例的指令处理方法的示意性流程图;
36.图8示出了根据本公开一实施例的指令处理方法的示意性流程图;
37.图9a示出了根据本公开一实施例的用于获得应用程序栈的访问地址的运算单元的示例;以及
38.图9b示出了根据本公开一实施例的用于维护译码阶段当前的栈顶值的运算单元的示例。
具体实施方式
39.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
40.除非另作定义,此处使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
41.每一个运行在计算机系统中的应用程序的数据地址空间都包括栈(stack)与堆(heap),栈和堆被由应用程序二进制接口(application binary interface,abi)定义。图1示出了一种应用程序虚拟内存分配的示意图。
42.如图1所示,应用程序栈由操作系统自动分配释放,用来存放函数参数值、寄存器的值、局部变量的值等。栈的操作方式类似于通常的数据结构中的栈,采用后入先出(last in first out,lifo)的方式,数据读出、写入只能在发生在栈顶。因此,栈可以只需一个栈指针(stack pointer,sp)来标识当前的栈顶位置(栈顶值),该栈顶值存放在栈顶寄存器。
对于栈,可以有如下两个基本操作:
43.●
压入(push)(又称为压栈):调整栈顶寄存器值(即栈顶值)并在新的栈顶写入数据;
44.●
弹出(pop)(又称为出栈):从栈顶中取出数据并调整栈顶寄存器值。
45.当程序调用(call)一个函数时,返回地址被压入栈中;该函数执行完毕后,从栈中取出(ret)该返回地址,然后程序调转到该地址继续执行。
46.应用程序栈的另一个作用是缓存寄存器的值,这使得这些寄存器可以在不同函数中被使用。
47.在一些硬件架构中,应用程序栈是从地址高端向低端增长的,比如x86-64(64位x86)硬件架构。同时,x86-64每个push/pop操作都是64位(即8个字节),所以一个push操作将栈顶值减8,而一个pop操作将栈顶值加8。
48.图2示出了一种处理器核的流水线的示意图,图中的带箭头的虚线表示重新定向的指令流。如图所示,单核处理器或多核处理器的处理器核(例如cpu核)通过流水线技术提高指令间并行度(instruction level parallelism)。处理器核内部包括多个流水阶段,比如,在流水线送入各种来源的程序计数器,通过多路选择器(mux)选择出下一程序计数器(pc)之后,该程序计数器对应的指令要经过分支预测(branch prediction)、指令提取(instruction fetch)、指令译码(decode)、指令分发与重命名(dispatch and rename)、指令执行(execute)、指令结束(retire)等。在各个流水级之间根据需要设置等待队列,这些队列通常是先入先出(fifo)队列。例如,在分支预测单元之后,设置有分支预测(bp)fifo队列,以存储分支预测结果;在指令提取单元之后,设置有指令缓存(instruction cache,ic)fifo,以缓存所取得的指令;在指令译码单元之后,设置有译码(de)fifo,以缓存译码后的指令;在指令分发与重命名单元之后,设置有结束(rt)fifo以缓存执行之后等待确认结束的指令。同时处理器核的流水线还包括指令队列,以在指令分发与重命名之后缓存等待指令执行单元执行指令。为了支持高运行频率,每一个流水阶段又可能包含多个流水级(时钟周期)。虽然每个流水级执行有限的操作,但是这样每个时钟可以做到最短,通过提高cpu的运行频率来提高cpu核的性能。每个流水级也可以通过容纳更多条指令(即超标量(superscalar)技术)来进一步提高处理器核的性能。
49.处理器核在微架构内将每一条架构指令(instruction)翻译为一条或者多条微指令(micro-op,uop),每条微指令只执行有限的操作,这样可以保证每个流水级很短,以提高处理器核运行频率。比如一条内存读指令(load),可以被翻译为一条地址生成微指令以及一条内存读微指令,第二条微指令会依赖第一条微指令的结果,因此只有第一条微指令执行完后,第二条微指令才会开始执行。微指令包含多个微架构相关的域,用来在流水级间传递相关信息。
50.预测执行(speculative execution)是提高处理器性能的另一种技术。该技术在一条指令还未完成执行之前,执行它后面的指令。处理器核前端的分支预测单元(分支预测器),对分支指令的跳转方向进行预测,预取、执行该方向的指令;另一个预测执行的技术是在前面的所有内存写指令的地址都获得前,执行一个内存读指令。预测执行进一步提高了指令间并行度,从而大幅提高处理器核性能。当出现预测执行错误,比如发现分支预测错误,或者内存读指令前的某一条写指令改写了同一个地址,犯错指令其后的所有流水线中
的指令需要被冲刷(或称为“清除”)(flush),然后程序跳转到出错点重新执行,以保证程序执行的正确性。为支持预测执行,处理器核微架构也需要支持架构寄存器恢复机制,以保证架构寄存器在预测执行时总有正确的值。
51.很多内存访问指令的内存访问地址是动态生成的,使用一个或者多个寄存器。处理器核中可以包含单独的执行阶段硬件(称为agen)来进行这些地址运算。一个内存访问指令只有通过agen获得其地址,才能开始内存访问操作,这增加了这些指令的时延。某些指令集支持多种复杂的地址生成方式,比如x86-64,其agen也较复杂,有更多功耗及需要多个时钟获得结果。另外,很多指令都在指令数据中包括一个立即数(imm)用作地址生成的偏移量。
52.应用程序二进制接口(application binary interface,abi)规定了软件调用接口,其中包括对于应用程序栈的使用的规范。通常而言,应用程序栈的数据增删只在栈顶进行,只需一个栈顶寄存器(比如x86-64的rsp寄存器)来标识应用程序栈的栈顶位置。
53.例如,对于应用程序栈的访问往往有专属的指令,比如x86-64中的call、ret、push、pop指令。如上所述,call与push指令先增加栈顶位置,然后将新的数据压入栈;ret/pop指令从栈顶读出数据,然后回退栈顶位置。此外call与ret指令还可以包含指令流跳转操作。此外,也可以使用正常的内存读写指令来访问应用程序栈中任意位置的数据,这些应用程序栈读写操作往往使用栈顶寄存器作为唯一或者多个地址计算寄存器之一。
54.在一个高性能、多流水线级的处理器核中,内存读写指令往往需要多个流水级来获得其数据,而它们的地址生成是导致长延时的一部分原因。上述应用程序栈的访问,不论是通过专有指令还是普通内存访问指令来操作的,其地址生成也是在指令执行阶段动态生成的,需要用到agen及至少一个时钟周期完成。
55.本公开的发明人注意到,由于应用程序栈的特性,其访问规律比较简单,利用这些规律提前获得对于应用程序栈的访问地址能够降低这些指令的延迟,从而进一步提高处理器的性能;而且,这也可以降低访问寄存器文件及使用agen造成的功耗。
56.具体而言,本公开的发明人观察到如下现象,并据此提出本公开至少一实施例的技术方案。由于应用程序栈的特性,对应用程序栈的读写及栈顶寄存器的值(栈顶值)的改变大都发生在当前的栈顶位置附近,这意味:
57.(1)大多数改变应用程序栈的栈顶值的指令,在译码阶段就可以获得其偏移值,从而可以在译码阶段更新当前栈顶值。
58.(2)很多对于应用程序栈进行读写的访问地址使用固定偏移(比如x86-64中call/push偏移值为8,ret/pop偏移值为0),或者使用保存在指令立即数中的偏移。
59.基于上述观察,在本公开的至少一个实施例中,在指令译码阶段维护该阶段的当前的栈顶值(简称sp@de),并用该当前的栈顶值来在指令译码阶段获得应用程序栈专有指令(如x86-64中的call/ret/push/pop等)及一些访问应用程序栈的普通内存读写指令的访问地址。因此,这些指令可以免除指令执行阶段的地址生成、寄存器文件与agen访问及相应时延,从而提高处理器性能并降低系统功耗。
60.根据本公开的至少一个实施例提供了一种指令处理方法,包括:在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;在对象指令的执行阶段,利用访问地址访问应用程序栈。
61.根据本公开的至少一个实施例还提供了一种处理器,包括:
62.译码单元,配置为在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;
63.执行单元,配置为在对象指令的执行阶段,使用访问地址访问应用程序栈。
64.根据本公开的至少一个实施例还提供了一种指令处理方法,包括:通过处理器核的流水线的译码单元维护用于记录应用程序栈的栈指针的第一栈顶值,提供第一栈顶值用于在处理器核的流水线的译码单元得到对于应用程序栈的访问地址。
65.根据本公开的至少一个实施例还提供了一种处理器,包括译码单元,其中,译码单元配置为:维护用于记录应用程序栈的栈指针的第一栈顶值,提供第一栈顶值用于在译码单元得到对于应用程序栈的访问地址。
66.根据本公开的至少一个实施例还提供了一种指令执行方法,包括:响应于发生处理器核的流水线冲刷,将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元,其中,对象指令被标注为,在被执行后需要反馈应用程序栈的栈指针的栈顶值。
67.根据本公开的至少一个实施例还提供了一种处理器,包括执行单元和译码单元,其中,执行单元配置为:响应于发生处理器核的流水线冲刷(flush),将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给译码单元;响应于非发生处理器核的流水线冲刷(flush),执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给译码单元,其中,对象指令被标注为,在对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的栈顶值。
68.本公开至少一个实施例提供的指令处理方法或处理器考虑如下至少一个方面以实现对于处理器核的优化:
69.(1)在多级流水处理器核中,指令执行阶段更新(或产生)的栈顶值(简称sp@ex)与指令译码阶段维护的当前的栈顶值(sp@de)往往不同,这是因为可能有多个改变sp的指令在这两个阶段之间的流水级中;
70.(2)在指令译码阶段获得应用程序栈访问指令的地址,并在相应的无需地址生成的情形,将它们译码成对于应用程序栈的访问指令,执行阶段执行这些访问指令。
71.本公开至少一个实施例的指令处理方法在译码阶段将对象指令分为如下2种类型:
72.(1)改变栈顶值(sp值)的指令
73.(a)改变sp值的简单指令(simple sp instruction)。这些指令包括call/ret/push/pop指令,它们将sp值增加或者减少一个处理器核架构定义的固定值(以下简称“架构参数值”),比如8或者4字节。该类型的指令还包括将sp值增加/减少一个立即数(比如add sp,0x30将sp值增加48),该立即数(imm)包括在对应的指令中,所以可在译码阶段获得。对于这些指令,可以在指令译码阶段使用算术运算来更新sp值,例如,可以使用一个加法器来更新sp值。
74.(b)改变sp值的复杂指令。这些指令包括除上述改变sp值的简单指令之外的所有
其他改变sp值的指令。这些复杂指令使用其它寄存器,或是需要更复杂的运算,无法仅使用一个加法器来更新sp值。这些复杂指令修改的sp值必须在执行阶段通过agen获得,然后传回指令译码阶段。当在译码阶段,将这些指令译码成为微指令时,对这些微指令进行标注以(如下所述通过参数needsp值来传递),以使得这些微指令在执行完会将更新的sp值传回指令译码阶段。
75.(2)访问应用程序栈的指令
76.(a)访问应用程序栈的简单指令(simple sp load/store)。这些指令包括call/ret/push/pop指令以及其他使用“sp 立即数”地址编码的读写指令。例如,本公开的至少一些实施例对这些指令进行的执行过程进行优化。
77.(b)访问应用程序栈的复杂指令。这些指令为除上述访问应用程序栈的简单指令之外的其他访问应用程序栈的指令,它们可能不使用sp寄存器,或是用到多个寄存器值来计算内存访问地址。
78.在本公开的至少一些实施例中,一个对象指令可以既是改变sp值的简单指令,又是访问应用程序栈的简单指令,例如call/ret/push/pop指令。对于call/push指令,对于应用程序栈的访问地址等于新的sp@de值,分别等于当前sp@de值减架构参数值(例如8字节)。而对于ret/pop指令,对于应用程序栈的访问地址等于当前sp@de值,而同时新的sp@de值加架构参数值(例如8字节)。
79.图3示出了根据本公开的至少一个实施例提供的一种处理器核的流水线,图中的带箭头的虚线表示重新定向的指令流。该处理器核可以是单核处理器或多核处理器的处理器核(例如cpu核)。例如,该处理器核通过流水线技术提高指令间并行度(instruction level parallelism),但是本公开的实施例不限于此。
80.例如,该处理器核内部包括多个流水阶段,比如,在流水线送入、选择出下一程序计数器(pc)之后,该程序计数器对应的指令要经过分支预测(branch prediction)、指令提取(instruction fetch)、指令译码(decode)、指令分发与重命名(dispatch and rename)、指令执行(execute)、指令结束(retire)等。在各个流水级之间根据需要设置等待队列,这些队列通常是先入先出(fifo)队列。
81.与图2相比,本公开的至少一个实施例提供的处理器核的流水线还包括一个缓存desp,用于记录译码阶段的当前的栈顶值sp@de。缓存desp可以通过寄存器等方式实现,例如,该缓存可以设置在指令译码单元中,也可以单独设置,本公开的实施例对此不作限制。
82.在本公开的实施例中,可以在记录sp@de之外,还可以进一步记录该数值的其他属性,例如有效性等。例如,图4示出了缓存desp的一个示例。如图4所示,缓存desp包括如下3个域:
83.●
sp@de域,例如长度为n位(n-bits)。sp@de保存指令译码阶段的当前的栈顶位置(即栈顶值)。例如,n为当前架构支持的虚拟地址比特数(正整数),例如x86-64处理器核可以支持48-bit的虚拟地址,则此时n=48。
84.●
valid域,例如长度为1位(1-bit)。当valid为1时表示sp@de的有效性为有效,即sp@de中的值为有效栈顶值;valid为0时表示sp@de的有效性为无效,例如,sp@de中为-1或者sp@de与sp@ex之间的差值。
85.●
sn域,例如长度为m位(m-bits)。sn用于记录最近一条被标注needsp标识的架构
指令/微指令(以下统称“指令”)的指令序号,被标注needsp标识指代一条指令被执行后需要将产生的栈顶值回传到流水线的译码阶段。
86.例如,处理器核可以标识流水线中的每个指令以实现调试(debug)等功能,且这个标识在译码阶段生成,因此本公开的实施例可以使用指令的这一标识来记录needsp标识。这个标识的大小只要足够记录所有在流水线中的指令即可,比如8-bit的sn可以表示256个指令,则此时m等于8。缓存desp中的sn域仅记录最近一条被标注needsp标识的指令的指令序号,因此之前记录的旧的指令序号总是被当前记录的新的指令序号取代。
87.本公开的实施例不限于复用指令中上述用于调试的标识,也可以在每条架构指令/微指令中另行增加一个例如1位(1-bit)的域来标注needsp标识,该needsp标识可以由指令译码单元来设置,以通知将执行阶段更新的sp值(sp@ex)传递回指令译码单元。可以通过现有的或另行设置的数据传输通路来传递在执行阶段更新的sp值(sp@ex)。
88.例如,与图2相比,如图3所示的本公开的至少一个实施例提供的处理器核的流水线还进一步包括从指令执行单元向译码单元传递执行了消息的数据通路(如图中的带箭头的实现所示),以传递执行阶段更新的sp值(sp@ex)以及产生该执行阶段更新的sp值(sp@ex)的指令的指令序号(inst_sn)。
89.在本公开的实施例中,对于sp@de值,除了设置上述valid和/或sn属性之外,也可以提供其他属性,本公开的实施例对此不作限制。
90.同时,图4还示出了在本公开的至少一个实施例中,上述valid、sp@de和sn各自的初始值,分别为0、-1和0,本公开的实施例对此不作限制。需要设置这些初始值的场景将在下面具体说明。
91.本公开的至少一个实施例提供了一种指令处理方法,包括:在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;在对象指令的执行阶段,利用访问地址访问应用程序栈。这里的“对象指令”指代该方法中当前被处理的指令。
92.在至少一个示例中,获取对象指令对于应用程序栈的访问地址,包括:确定在对象指令的译码阶段时第一栈顶值是否为有效值;响应于第一栈顶值为有效值,使用第一栈顶值获取访问地址。这里,“第一栈顶值”为由处理器核的流水线的译码单元维护的用于记录应用程序栈的栈指针的数值,即译码阶段当前的栈顶值(sp@de)。
93.在至少一个示例中,响应于第一栈顶值为有效值,使用第一栈顶值获取访问地址,包括:
94.●
响应于对象指令是call指令或push指令,使用第一栈顶值减去系统架构参数值得到访问地址;或者
95.●
响应于对象指令是ret或pop指令,使用第一栈顶值作为访问地址;或者
96.●
响应于在对象指令是访问应用程序栈的指令且为使用栈指针和立即数之和进行地址编码的方式,使用第一栈顶值加上立即数得到访问地址。
97.在至少一个示例中,本公开上述实施例的指令处理方法还包括:在对象指令的译码阶段,结合访问地址得到对应于对象指令的译码后指令。并且,在对象指令的执行阶段,利用访问地址访问应用程序栈,包括:使用访问地址,执行译码后指令以访问应用程序栈。
98.在本公开上述实施例中,通过在指令译码阶段使用当前的栈顶值(即第一栈顶值,sp@de),在指令译码阶段获得对象指令访问应用程序栈的访问地址,然后在指令执行阶段
使用该访问地址访问应用程序栈,由此可以免除指令执行阶段的地址生成、寄存器文件与agen访问及相应时延,从而可以提高处理器性能并降低系统功耗。
99.图5示出了根据本公开一实施例的指令处理方法的示意性流程图,该指令处理方法用于在译码阶段得到访问应用程序栈的访问地址。如图5所示,该指令处理方法包括如下步骤500~508:
100.步骤500:进入对象指令的指令译码阶段。
101.步骤501:判断对象指令是否为访问应用程序栈的简单指令,如果不是,则结束该方法的流程,否则前进到步骤502。
102.步骤502:判断译码阶段当前的栈顶值(sp@de)的有效性是否为有效(例如valid的值是否为1),如果是无效,则结束该方法的流程,否则前进到步骤503。
103.步骤503:判断对象指令是否为call或push指令,如果是,则前进到步骤504,否则前进到步骤505。
104.步骤504:使用当前的栈顶值(sp@de)减去系统架构参数值(s)得到访问地址addr,即addr=sp@de-s。
105.步骤505:判断对象指令是否为ret或pop指令,如果是,则前进到步骤506,否则前进到步骤507。
106.步骤506:使用当前的栈顶值(sp@de)加上系统架构参数值(s)得到访问地址addr,即addr=sp@de s。
107.步骤507:使用当前的栈顶值(sp@de)加上加上对象指令包括的作为源操作数的立即数(inst_imm)得到访问地址,即addr=sp@de inst_imm。
108.步骤508:结合访问地址(addr)得到对象指令的译码后指令。
109.在步骤508,译码后指令本身将包括访问地址,该译码后指令将在对象指令的执行阶段被执行,由此使用该访问地址访问应用程序栈,可以提高处理器性能并降低系统功耗。
110.对应于上述指令执行方法,本公开的至少一个实施例还提供了一种处理器,包括译码单元和执行单元。该译码单元配置为在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;该执行单元配置为在对象指令的执行阶段,使用访问地址访问应用程序栈。
111.在至少一个示例中,在该处理器中,译码单元还配置为在对象指令的译码阶段,得到对应于对象指令的译码后指令;执行单元还配置为,执行译码后指令以使用访问地址访问应用程序栈。
112.根据需要,参考图3,上述实施例的处理器还可以进一步包括但不限于分支预测(branch prediction)、指令提取(instruction fetch)、指令分发与重命名(dispatch and rename)、指令结束(retire)等结构,本公开的实施例对此不作限制。
113.本公开的至少一个实施例还提供了一种指令处理方法,包括:通过处理器核的流水线的译码单元维护用于记录应用程序栈的栈指针的第一栈顶值,提供第一栈顶值用于通过处理器核的流水线的译码单元得到对于应用程序栈的访问地址。
114.该实施例的指令处理方法,在通过处理器核的流水线的译码单元维护用于记录应用程序栈的栈指针的第一栈顶值,即维护译码阶段当前的栈顶值(sp@de),使得译码阶段当前的栈顶值能够被正确地用于得到对于应用程序栈的访问地址,使得对象指令在执行阶段
可以正确执行。
115.这里,同样地,“第一栈顶值”指代译码阶段的当前的栈顶值,“对象指令”指代该方法中当前被处理的指令。
116.在至少一个示例中,通过处理器核的流水线的译码单元维护用于记录所述应用程序栈的栈指针的第一栈顶值,包括:在对象指令的译码阶段,根据所述对象指令的内容设置用于记录所述应用程序栈的栈指针的第一栈顶值。
117.在至少一个示例中,根据对象指令的内容设置用于记录应用程序栈的栈指针的第一栈顶值,包括:响应于对象指令为改变应用程序栈的栈指针的指令,确定对象指令属于第一类型指令还是第二类型指令,其中,第一类型指令是直接使用栈指针进行算术运算以更新栈顶值的指令(例如,对应于前述改变sp值的简单指令),第二类型指令是非直接使用栈指针进行算术运算以更新栈顶值的指令(例如,对应于前述改变sp值的复杂指令)。响应于对象指令属于第一类型指令,根据对象指令的内容更新第一栈顶值;响应于对象指令属于第二类型指令,将第一栈顶值设置为应用程序栈的栈指针的初始值(例如,0),将第一栈顶值的有效性设置为无效,以及记录对象指令的指令序号作为第一栈顶值的相关指令序号。
118.在至少一个示例中,响应于对象指令属于第一类型指令,根据对象指令的内容更新第一栈顶值,包括:
119.●
响应于对象指令是call指令或push指令,使用第一栈顶值减去系统架构参数值得到更新后的第一栈顶值;或者
120.●
响应于对象指令是ret或pop指令,使用第一栈顶值加上系统架构参数值得到更新后的第一栈顶值;或者
121.●
响应于在对象指令是改变应用程序栈的栈指针的指令且使用立即数作为源操作,使用第一栈顶值和立即数进行运算得到更新后的第一栈顶值。
122.在至少一个示例中,该实施例的指令处理方法还包括:响应于对象指令属于第二类型指令,将对象指令标注为,在对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的第二栈顶值。这里,“第二栈顶值”用于指代在执行阶段更新后的应用型程序栈的栈顶值(即sp@ex)。
123.在至少一个示例中,该实施例的指令处理方法还包括:响应于对象指令属于第二类型指令,接收第二栈顶值,响应于对象指令的指令序号与第一栈顶值当前的相关指令序号相同,使用第二栈顶值更新第一栈顶值。
124.在至少一个示例中,该实施例的指令处理方法还包括:在对象指令的执行阶段,响应于对象指令被标注为需要反馈第二栈顶值,在对象指令被执行后向处理器核的流水线的译码单元反馈第二栈顶值以及对象指令的指令序号。
125.在至少一个示例中,通过处理器核的流水线的译码单元维护用于记录应用程序栈的栈指针的第一栈顶值,还包括:在对象指令的译码阶段,接收处理器核的流水线的指令执行单元提供的对应于应用程序栈的栈顶值的第二栈顶值,以及
126.●
响应于发生处理器核的流水线冲刷,将第一栈顶值设置为第二栈顶值,
127.●
响应于非发生处理器核的流水线冲刷,还接收指令执行单元提供的产生第二栈顶值的被执行指令的指令序号,且响应于被执行指令的指令序号与第一栈顶值的相关指令序号相同,使用第二栈顶值设置第一栈顶值,将第一栈顶值的有效性设置为有效,其中,第
一栈顶值的相关指令序号指代在对象指令的译码阶段之前记录的最新的将修改应用程序栈的栈指针的在先指令的指令序号。
128.图6示出了根据本公开一实施例的指令处理方法的示意性流程图,该指令处理方法用于在译码阶段维护译码阶段当前的栈顶值(sp@de)。如图6所示,该指令处理方法包括如下步骤600~610:
129.步骤600:进入对象指令的指令译码阶段。
130.步骤601:判断译码阶段当前的栈顶值(sp@de)是否为初始值(例如-1),如果不是,则前进到步骤602,否则前进到步骤609。
131.译码阶段当前的栈顶值(sp@de)为初始值例如对应于一个应用程序开始执行时或者进程切换时的情形。
132.步骤602:判断对象指令是否为改变sp的指令,如果是,则前进到步骤603,否则结束该方法的流程。
133.步骤603:判断对象指令是否为改变sp的简单指令,如果是,则前进到步骤604,否则前进到步骤609。
134.步骤604:判断对象指令是否为call或push指令,如果是,则前进到步骤605,否则前进到步骤606。
135.步骤605:使用当前的栈顶值(sp@de)减去系统架构参数值(s)得到更新的当前的栈顶值,即sp@de=sp@de-s。
136.步骤606:判断对象指令是否为ret或pop指令,如果是,则前进到步骤607,否则前进到步骤608。
137.步骤607:使用当前的栈顶值(sp@de)加上系统架构参数值(s)得到更新的当前的栈顶值,即sp@de=sp@de s。
138.步骤608:使用当前的栈顶值(sp@de)加上对象指令包括的作为源操作数的立即数(inst_imm)得到更新的当前的栈顶值,即sp@de=sp@de inst_imm。
139.步骤609:将当前的栈顶值(sp@de)设置为初始值(例如0),将当前的栈顶值的有效性设置为有效(valid=1),将当前的栈顶值的sn域设置为对象指令的指令序号。
140.步骤610:将对象指令标注为,在该对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的最新栈顶值(即sp@ex)。
141.在本公开的上述实施例中,在如下几种情况,指令执行阶段会将最新获得的sp@ex值发给指令译码阶段:
142.(a)流水线冲刷时,需要恢复应用程序栈的sp值;
143.(b)一个应用程序刚开始执行时,需要获得初始sp值;
144.(c)在系统中多个进程之间进行进程切换后,需要恢复sp值;
145.(d)改变sp值的复杂指令需要在指令执行阶段更新sp值,并将它传给译码器。
146.上面第一种情况下,如下所述,指令执行阶段执行单元会将sp值传递给译码单元。在另三种情况下,只有在一个指令(架构指令或微指令)的needsp标识为1时(即被标注需要传递sp@ex),指令执行阶段才会将sp@ex值传递给译码单元;这样仅在必要时才传递sp@ex值,可以减少传递sp@ex值这一工作造成的功耗。
147.在本公开的上述如图6所示的实施例中,译码单元在不同情况下更新sp@de值,或
者设置微指令needsp标识:
148.●
在如下两种情况之一下设置needsp标识;
149.■
sp@de值为-1(与上述情况(b)与(c)对应,此时存储sp@de的缓存处于初始状态,此时valid为0);
150.■
改变sp值的复杂指令(上述情况(d));
151.●
否则,更新sp@de值;
152.■
call或push指令:sp@de减s;
153.■
ret或pop指令:sp@de加s;
154.■
其他改变sp值的简单指令:sp@de加立即数。
155.图7示出了根据本公开一实施例的指令处理方法的示意性流程图,该指令处理方法用于在译码阶段维护译码阶段当前的栈顶值(sp@de)。如图7所示,该指令处理方法包括如下步骤700~705:
156.步骤700:接收指令执行阶段最新的栈顶值(sp@ex)。
157.步骤701:判断当前是否要执行流水线冲刷,如果不是,则前进到步骤702,否则前进到步骤705。
158.步骤702:判断在指令执行阶段得到上述最新的栈顶值的指令的指令序号(inst_sn)与译码阶段当前的栈顶值(sp@de)相关联的指令序号(sn)是否相同,如果是,则前进到步骤703,否则结束该方法的流程。
159.步骤703:使用指令执行阶段最新的栈顶值(sp@ex)更新译码阶段当前的栈顶值(sp@de),且sp@de=sp@ex sp@de。
160.步骤704:将译码阶段当前的栈顶值的有效性设置为有效(valid=1)。
161.步骤705:使用指令执行阶段最新的栈顶值(sp@ex)更新译码阶段当前的栈顶值(sp@de),即sp@de=sp@ex。
162.当发生处理器核的流水线冲刷(flush)时,流水线的译码阶段和执行阶段将没有任何指令,因此可以将译码阶段当前的栈顶值(sp@de)设置为执行阶段更新的栈顶值(sp@ex)。
163.另一方面,非发生处理器核的流水线冲刷(flush)时,需要判断当前缓存的sn与从执行阶段传来的inst_sn是否相等,这是因为译码单元在一段时间内可能发出多个具有needsp标识的指令之后才收到一个从执行阶段传来的对于needsp表示的回复,但是这时对于前述多个needsp标识中只有最后一个的回复才是有效的,而对其他更老的neesp标识的回复将被忽略。并且,非发生处理器核的流水线冲刷(flush)时,sp@de中保存译码阶段到执行阶段sp的差值,因此需要将sp@ex与sp@de相加获得译码阶段的当前栈顶值。
164.上述实施例的指令处理方法有助于在译码阶段维护了译码阶段当前的栈顶值(sp@de),从而使得可以使用该译码阶段当前的栈顶值(sp@de)用于得到准确的访问应用程序栈的访问地址,由此可以提高处理器性能并降低系统功耗。
165.对应于上述实施例的指令处理方法,本公开的至少一个实施例还提供了一种处理器,包括译码单元。该译码单元配置为维护用于记录应用程序栈的栈指针的第一栈顶值,提供第一栈顶值用于在译码单元得到对于应用程序栈的访问地址。
166.该实施例的处理器,在通过处理器核的流水线的译码单元维护用于记录应用程序
栈的栈指针的第一栈顶值,即维护译码阶段当前的栈顶值(sp@de),使得译码阶段当前的栈顶值能够被正确地用于得到对于应用程序栈的访问地址,使得对象指令在执行阶段可以正确执行。
167.在至少一个示例中,译码单元还配置为,维护用于记录所述应用程序栈的栈指针的第一栈顶值,包括:在对象指令的译码阶段,根据所述对象指令的内容设置用于记录所述应用程序栈的栈指针的第一栈顶值。
168.在至少一个示例中,根据对象指令的内容设置用于记录应用程序栈的栈指针的第一栈顶值,包括:响应于对象指令为改变应用程序栈的栈指针的指令,确定对象指令属于第一类型指令还是第二类型指令,其中,第一类型指令是直接使用栈指针进行算术运算以更新栈顶值的指令(例如,对应于前述改变sp值的简单指令),第二类型指令是非直接使用栈指针进行算术运算以更新栈顶值的指令(例如,对应于前述改变sp值的复杂指令)。响应于对象指令属于第一类型指令,根据对象指令的内容更新第一栈顶值;响应于对象指令属于第二类型指令,将第一栈顶值设置为应用程序栈的栈指针的初始值(例如,0),将第一栈顶值的有效性设置为无效,以及记录对象指令的指令序号作为第一栈顶值的相关指令序号。
169.在至少一个示例中,响应于对象指令属于第一类型指令,根据对象指令的内容更新第一栈顶值,包括:
170.●
响应于对象指令是call指令或push指令,使用第一栈顶值减去系统架构参数值得到更新后的第一栈顶值;或者
171.●
响应于对象指令是ret或pop指令,使用第一栈顶值加上系统架构参数值得到更新后的第一栈顶值;或者
172.●
响应于在对象指令是改变应用程序栈的栈指针的指令且使用立即数作为源操作,使用第一栈顶值和立即数进行运算得到更新后的第一栈顶值。
173.在至少一个示例中,译码单元还配置为,响应于对象指令属于第二类型指令,将对象指令标注为,在对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的第二栈顶值。这里,“第二栈顶值”用于指代在执行阶段更新后的新的应用型程序栈的栈顶值(即sp@ex)。
174.在至少一个示例中,译码单元还配置为,响应于对象指令属于第二类型指令,接收第二栈顶值,响应于对象指令的指令序号与第一栈顶值当前的相关指令序号相同,使用第二栈顶值更新第一栈顶值。
175.在至少一个示例中,译码单元还配置为,在对象指令的执行阶段,响应于对象指令被标注为需要反馈第二栈顶值,在对象指令被执行后向处理器核的流水线的译码单元反馈第二栈顶值以及对象指令的指令序号。
176.在至少一个示例中,译码单元还配置为,在对象指令的译码阶段,接收处理器核的流水线的指令执行单元提供的对应于应用程序栈的栈顶值的第二栈顶值,以及
177.响应于发生处理器核的流水线冲刷,将第一栈顶值设置为第二栈顶值,
178.响应于非发生处理器核的流水线冲刷,还接收指令执行单元提供的产生第二栈顶值的被执行指令的指令序号,且响应于被执行指令的指令序号与第一栈顶值的相关指令序号相同,使用第二栈顶值设置第一栈顶值,将第一栈顶值的有效性设置为有效,其中,第一栈顶值的相关指令序号指代在对象指令的译码阶段之前记录的最新的将修改应用程序栈
的栈指针的在先指令的指令序号。
179.根据需要,参考图3,上述该处理器还可以进一步包括但不限于分支预测(branch prediction)、指令提取(instruction fetch)、指令分发与重命名(dispatch and rename)、指令执行、指令结束(retire)等结构,本公开的实施例对此不作限制。
180.本公开的至少一个实施例还提供一种指令执行方法,该指令执行方法包括:响应于发生处理器核的流水线冲刷,将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元,其中,对象指令被标注为,在被执行后需要反馈应用程序栈的栈指针的栈顶值。
181.该实施例的指令执行方法在执行对象指令的过程中,在该对象指令被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的情形,向译码阶段反馈执行该对象指令得到的执行阶段最新的栈顶值(sp@ex),用于更准确地在译码阶段维护译码阶段当前的栈顶值(sp@de)。
182.在该实施例的至少一个示例中,该指令执行方法还包括:响应于非发生处理器核的流水线冲刷,将对象指令的指令序号提供给处理器核的流水线的译码单元。
183.在该实施例的至少一个示例中,响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元,包括:响应于对象指令是当前已经分发的最新的被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的指令,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元。
184.在该实施例的至少一个示例中,该指令执行方法还包括:在指令分发阶段,记录当前已经分发的最新的被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的指令。
185.图8示出了根据本公开一实施例的指令处理方法的示意性流程图,该指令处理方法用于在执行阶段项译码阶段传送执行阶段最新的栈顶值(sp@ex)。如图8所示,该指令处理方法包括如下步骤800~803:
186.步骤800:进入对象指令的执行阶段。
187.步骤801:判断当前是否要执行流水线冲刷,如果不是,则前进到步骤802,否则前进到步骤803。
188.步骤802:判断对象指令是否被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的指令,即对象指令是否具有needsp的表示,如果是,则前进到步骤803,否则结束该方法的流程。
189.步骤803:发送执行对象指令所得到的执行阶段最新的栈顶值(sp@ex)以及对象指令的指令序号。
190.上述实施例的指令执行方法在执行对象指令的过程中,在该对象指令被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的情形,向译码阶段反馈执行该对象指令得到的执行阶段最新的栈顶值(sp@ex),用于更准确地在译码阶段维护译码阶段当前的栈顶值(sp@de)。
191.对应上述指令执行方法,本公开的至少一实施例提供了一种处理器,该处理包括执行单元和译码单元。执行单元配置为:响应于发生处理器核的流水线冲刷,将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给译码单元,其中,对象指令被标注为,在对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的栈顶值。
192.在该实施例的至少一个示例中,执行单元还配置为:响应于非发生处理器核的流水线冲刷,将对象指令的指令序号提供给译码单元。
193.在该实施例的至少一个示例中,执行单元还配置为:响应于对象指令是当前已经分发的最新的被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的指令,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元。
194.在该实施例的至少一个示例中,该处理器还包括指令分发单元,其中,指令分发单元配置为,记录当前已经分发的最新的被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的指令。
195.上述实施例的指令执行方法在执行对象指令的过程中,在该对象指令被标注为在被执行后需要反馈应用程序栈的栈指针的栈顶值的情形,向译码阶段反馈执行该对象指令得到的执行阶段最新的栈顶值(sp@ex),用于更准确地在译码阶段维护译码阶段当前的栈顶值(sp@de)。
196.对于例如图5所示的实施例中为了执行对于call/ret/push/pop等指令的生成访问地址的算术运算,在本公开的至少一个实施例中提供了一种运算单元来执行该算术运算操作。图9a示出了该运算单元的一个示例,如图9a所示,该运算单元包括多路选择器901以及加法器902。多路选择器901具有多个三个输入,分别为0、-s(负的架构参数值)和inst_imm(对象指令中的立即数)。加法器902具有两个输入,分别为多路选择器901的输出和译码阶段当前的栈顶值(sp@de),用于将二者相加得到对象指令对于应用程序栈的访问地址(inst_addr)。多路选择器901的选择信号为inst_type,可以分别具有对应于ret/pop指令、call/push指令以及其他访问应用程序栈的简单指令的三个值,用于分别选择上述三个输入之一,被选择的输入被送入加法器与译码阶段当前的栈顶值(sp@de)相加得到对象指令对于应用程序栈的访问地址(inst_addr)。
197.对于例如图6所示的实施例中为了执行对于call/ret/push/pop等指令的更新译码阶段当前的栈顶值(sp@de)的算术运算,在本公开的至少一个实施例中提供了一种运算单元来执行该算术运算操作。图9b示出了该运算单元的一个示例,如图9b所示,该运算单元包括多路选择器911以及加法器912。多路选择器911具有多个三个输入,分别为s(架构参数值)、-s(负的架构参数值)和inst_imm(对象指令中的立即数)。加法器912具有两个输入,分别为多路选择器901的输出和译码阶段当前的栈顶值(sp@de),用于将二者相加得到和,用于更新译码阶段当前的栈顶值(sp@de)。多路选择器911的选择信号为inst_type,可以分别具有对应于ret/pop指令、call/push指令以及其他访问修改应用程序栈的栈顶值的简单指令的三个值,用于分别选择上述三个输入之一,被选择的输入被送入加法器与译码阶段当前的栈顶值(sp@de)相加,得到的和用于更新译码阶段当前的栈顶值(sp@de)。
198.在本公开至少一些实施例中,对于图5、图6、图7所示的方法都可以在指令译码阶段进行。并且,维护sp@de的方法(图6与图7所示的方法)以及生成访问应用程序栈的访问地址的方法(图5所示的方法)可以是并行的,例如可以在同一个时钟周期中完成。
199.在本公开至少一些实施例中,维护sp@de的两个工作(即图6与图8所示的方法)可以在同一个时钟周期内发生,这时它们将依次完成,但是它们的先后顺序并不影响维护sp@de的正确性。
200.本公开上述实施例的描述中,部分使用x86-64处理器核作为描述用示例,但是本公开的各个实施例适用于所有类型的使用应用程序栈的处理器核。
201.对于本公开,还有以下几点需要说明:
202.(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
203.(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
204.以上所述仅是本公开的示范性实施方式,而非用于限制本公开的保护范围,本公开的保护范围由所附的权利要求确定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献