CN116414458A - 指令处理方法以及处理器 - Google Patents
指令处理方法以及处理器 Download PDFInfo
- Publication number
- CN116414458A CN116414458A CN202310401929.4A CN202310401929A CN116414458A CN 116414458 A CN116414458 A CN 116414458A CN 202310401929 A CN202310401929 A CN 202310401929A CN 116414458 A CN116414458 A CN 116414458A
- Authority
- CN
- China
- Prior art keywords
- instruction
- register
- memory
- access address
- data item
- 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
- 238000003672 processing method Methods 0.000 title claims abstract description 47
- 230000004044 response Effects 0.000 claims abstract description 66
- 238000000034 method Methods 0.000 claims description 53
- 230000008569 process Effects 0.000 claims description 24
- 238000013507 mapping Methods 0.000 claims description 16
- 238000007667 floating Methods 0.000 claims description 12
- 238000011010 flushing procedure Methods 0.000 claims description 12
- 238000012545 processing Methods 0.000 abstract description 4
- 238000010586 diagram Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 7
- 238000013461 design Methods 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000012790 confirmation Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
Abstract
本公开的实施例提供一种指令处理方法以及处理器。该指令处理方法包括:响应于在对象存储指令的译码阶段获得对象存储指令中作为目的操作数的第一内存访问地址,使用第一内存访问地址查询对象内存文件;在对象内存文件中维护对应第一内存访问地址的第一数据项,且为对象存储指令分配对应于第一内存访问地址的第一附加架构寄存器。该指令处理方法可以增加被预测进行内存重命名的读取指令的数量,减少了数据就绪的延迟以及缓存的访问次数,在提高处理性能的同时,还有助于降低处理器以及系统的功耗。
Description
技术领域
本公开的实施例涉及一种指令处理方法以及处理器。
背景技术
应用程序在计算机系统中运行的过程,通常需要代码、栈、堆、数据段,并且在运行过程中经常在短时间内需要对同一数据进行存储和读取。代码段主要存放可执行文件中的代码;数据段存放程序中全局变量和静态变量等数据;堆中是程序的动态内存区域,例如,当程序使用malloc或new得到的内存来自堆;栈维护函数调用的上下文,离开了栈就不可能实现函数的调用。
发明内容
根据本公开的至少一个实施例提供了一种指令处理方法,该指令处理方法包括:响应于在对象存储指令的译码阶段获得所述对象存储指令中作为目的操作数的第一内存访问地址,使用所述第一内存访问地址查询对象内存文件;在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,且为所述对象存储指令分配对应于所述第一内存访问地址的第一附加架构寄存器。
例如,在至少一个实施例的指令处理方法中,所述对象内存文件包括至少一个数据项,所述至少一个数据项包括所述第一数据项,所述至少一个数据项每个包括有效位和内存访问地址字段,所述有效位用于指示所属的数据项是否有效,所述内存访问地址字段用于记载所属的数据项被关联存储指令创建时所述关联存储指令中作为目的操作数的内存访问地址。
例如,在至少一个实施例的指令处理方法中,所述至少一个数据项每个还包括线程标号字段,所述线程标号字段用于记载所属的数据项被所述关联存储指令创建时所述关联存储指令所在的线程的标号。
例如,在至少一个实施例的指令处理方法中,所述至少一个数据项每个还包括数据宽度字段。
例如,在至少一个实施例的指令处理方法中,所述第一附加架构寄存器的编号基于所述第一数据项在所述对象内存文件中编号确定。
例如,在至少一个实施例的指令处理方法中,所述对象存储指令为定点指令类型,所述对象内存文件用于定点指令类型;或者,所述对象存储指令为浮点指令类型,所述对象内存文件用于浮点指令类型。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于在所述对象存储指令进入处理器流水线后所述处理器流水线发生了冲刷事件,清空所述对象内存文件;或者,响应于所述对象存储指令为栈操作指令,以及响应于在所述对象存储指令进入处理器流水线后在译码阶段维护的当前栈顶值被无效,清空所述对象内存文件。
例如,在至少一个实施例的指令处理方法中,所述在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,包括:响应于在所述对象内存文件中没有查询到所述第一内存访问地址,在所述对象内存文件中创建对应于第一内存访问地址的所述第一数据项;或者,响应于在所述对象内存文件中查询到第一内存地址,在所述对象内存文件中更新对应于所述第一内存访问地址的所述第一数据项。
例如,在至少一个实施例的指令处理方法中,所述对象内存文件包括按照先进先出方式创建的至少一个数据项,所述在所述对象内存文件中更新对应于所述第一内存访问地址的所述第一数据项,包括:将所述对象内存文件中查找到的对应于所述第一内存访问地址的在先数据项无效,以及在所述对象内存文件中创建对应于所述第一内存访问地址的所述第一数据项。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于所述对象存储指令的源操作数存在于第一源寄存器中,将所述第一附加架构寄存器映射到所述第一源寄存器对应的物理寄存器;或者,响应于所述对象存储指令的源操作数不存在于任何寄存器中,为所述第一附加架构寄存器分配第一物理寄存器,将所述第一附加架构寄存器映射到所述第一物理寄存器,且将所述对象存储指令的源操作数写入所述第一物理寄存器。
例如,在至少一个实施例中,上述指令处理方法还包括:将所述第一附加架构寄存器映射到所述第一源寄存器对应的物理寄存器之后,将所述第一附加架构寄存器设置为就绪;或者,将所述第一附加架构寄存器映射到所述第一物理寄存器,且将所述对象存储指令的源操作数写入所述第一物理寄存器之后,将所述第一附加架构寄存器设置为就绪。
例如,在至少一个实施例中,上述指令处理方法还包括:在所述对象存储指令执行完成时,将所述对象内存文件中的对应于所述对象存储指令的第一数据项设置为无效。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于在对象读取指令的译码阶段获得所述对象读取指令中作为源操作数的第二内存访问地址,使用所述第二内存访问地址查询所述对象内存文件;响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
例如,在至少一个实施例的指令处理方法中,响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器,包括:响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项且所述对象读取指令的源操作数的数据宽度小于等于所述第二数据项的数据宽度字段的值,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于所述对象读取指令用于将第一内存数据加载到所述对象读取指令的第一架构目的寄存器,将所述第一架构目的寄存器映射到所述第二附加架构寄存器所对应的物理寄存器;或者,响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,将所述对象读取指令的第二附加架构寄存器作为源寄存器用于参与所述运算。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,在所述第二附加架构寄存器就绪之后读取所述第二附加架构寄存器中的数据,并将所述第二附加架构寄存器中的数据作为所述运算的源操作数执行所述运算。
例如,在至少一个实施例的指令处理方法中,所述对象存储指令和所述对象读取指令为栈操作指令。
例如,在至少一个实施例的指令处理方法中,响应于指令分派阶段在同一组中分派多条指令,所述对象存储指令和所述对象读取指令属于同一组。
根据本公开的至少一个实施例提供了一种处理器,该处理包括译码单元和指令分派单元,其中,所述译码单元配置为对接收的指令进行译码;所述指令分派单元配置为:响应于所述译码单元在对象存储指令的译码阶段获得所述对象存储指令中作为目的操作数的第一内存访问地址,使用所述第一内存访问地址查询对象内存文件;以及在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,且为所述对象存储指令分配对应于所述第一内存访问地址的第一附加架构寄存器。
例如,在至少一个实施例中,上述处理器还包括执行单元,其中,所述执行单元配置为:在将所述对象存储指令的源操作数写入到所述第一附加架构寄存器映射的物理寄存器中之后,将所述第一附加架构寄存器设置为就绪。
例如,在至少一个实施例中,上述处理器还包括重命名单元,其中,所述指令分派单元还配置为:响应于所述译码单元在对象读取指令的译码阶段获得所述对象读取指令中作为源操作数的第二内存访问地址,使用所述第二内存访问地址查询所述对象内存文件;以及所述重命名单元配置为:响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
例如,在至少一个实施例的处理器中,所述重命名单元还配置为:响应于所述对象读取指令用于将第一内存数据加载到所述对象读取指令的第一架构目的寄存器,将所述第一架构目的寄存器映射到所述第二附加架构寄存器所对应的物理寄存器;或者,响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,将所述对象读取指令的第二附加架构寄存器作为源寄存器用于参与所述运算。
例如,在至少一个实施例中,上述处理器还包括执行单元,其中,所述执行单元配置为:响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,在所述第二附加架构寄存器就绪之后读取所述第二附加架构寄存器中的数据,并将所述第二附加架构寄存器中的数据作为所述运算的源操作数执行所述运算。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
图1示出了应用程序虚拟内存分配的示意图;
图2示出了一种处理器核的流水线的示意图;
图3示出了一种处理器核的流水线的示意图;
图4示出了本公开一实施例的示例性的内存文件的数据项;
图5示出了根据已经生成内存访问地址的存储指令操作内存文件的示例的流程图;
图6示出了对已经生成内存访问地址的读取指令根据内存文件进行操作的示例的流程图;
图7示出了对已经生成内存访问地址的存储指令根据内存文件进行内存重命名的示例的流程图;
图8示出了对已经生成内存访问地址的读取指令根据内存文件进行内存重命名的示例的流程图;
图9示出了根据本公开一实施例的处理器的示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
除非另作定义,此处使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
计算机操作系统一个重要职能是内存管理。在多进程操作系统中,每个进程都有自己的虚拟地址空间,可以使用任意系统规定范围内的虚拟地址。CPU执行一个应用程序时所使用的地址就是虚拟地址。操作系统给一个进程分配内存时,需要把使用到的虚拟地址映射到物理地址,物理地址才是真正的物理内存访问地址。这样做有几个好处,首先,简化程序编译,编译器可以基于一个连续的、充足的虚拟地址空间来编译程序。其次,不同进程的虚拟地址被分配到不同的物理地址,使得系统能够同时运行多个进程,从而提高整个计算机系统的运行效率。最后,由于应用程序可以使用但无法更改地址翻译,因此一个进程无法访问到另一个进程的内存内容,从而增加了系统的安全性。
在计算机系统中,内存访问指令的内存访问虚拟地址通常是动态生成的,生成地址的过程中会使用一个或者多个架构寄存器。
每一个运行在计算机系统中的应用程序的数据地址空间都包括栈(Stack)与堆(Heap),栈和堆由应用程序二进制接口(Application Binary Interface,ABI)定义。图1示出了一种应用程序虚拟内存分配的示意图。
如图1所示,应用程序栈由操作系统自动分配释放,用来存放函数参数值、寄存器的值、局部变量的值等。栈的操作方式类似于通常的数据结构中的栈,采用后入先出(LastIn First Out,LIFO)的方式,数据读出、写入只能在发生在栈顶。因此,栈可以只需一个栈指针(Stack Pointer,SP)来标识当前的栈顶位置(栈顶值),该栈顶值存放在栈顶寄存器。对于栈,可以有如下两个基本操作:
·压入(push)(又称为压栈):调整栈顶寄存器值(即栈顶值)并在新的栈顶写入数据;
·弹出(pop)(又称为出栈):从栈顶中取出数据并调整栈顶寄存器值。当程序调用(call)一个函数时,返回地址被压入栈中;该函数执行完毕后,从栈中取出(ret)该返回地址,然后程序调转到该地址继续执行。
应用程序栈的另一个作用是缓存寄存器的值,这使得这些寄存器可以在不同函数中被使用。
在一些硬件架构中,应用程序栈是从地址高端向低端增长的,比如X86-64(64位X86)硬件架构。同时,X86-64每个push/pop操作都是64位(即8个字节),所以一个push操作将栈顶值减8,而一个pop操作将栈顶值加8。
在本公开中,通常针对“处理器核”进行描述,为了方便,也将“处理器核”简称为“处理器”,也即在本公开中至少就流水线而言“处理器”和“处理器核”是等价的。
图2示出了一种处理器核的流水线的示意图,图中的带箭头的虚线表示重新定向的指令流。如图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以缓存执行之后等待确认结束的指令。同时处理器核的流水线还包括指令队列,以在指令分派与重命名之后缓存等待指令执行单元执行指令。
标量(scalar)处理器(CPU)指令流水线包括五阶段流水线,其中,每条指令可以在每个时钟周期发出并在固定的时间(例如,5个时钟周期)内执行。每条指令的执行分成5步:取指(IF)阶段、译码阶段、执行阶段、访存(MEM)阶段和写回(WB)阶段。
为了支持高运行频率,每一个流水阶段又可能包含多个流水级(时钟周期)。虽然每个流水级执行有限的操作,但是这样每个时钟可以做到最短,通过提高CPU的运行频率来提高CPU核的性能。每个流水级也可以通过容纳更多条指令(即超标量(superscalar)技术)来进一步提高处理器核的性能。超标量指在一个周期内并行执行多条指令的方法,具有增加的指令级并行度,能够在一个周期内处理多条指令的处理器就被称为超标量处理器。超标量处理器在通常的标量处理器的基础上增加额外的资源,创建多条流水线(pipeline),每条管线执行分配给自己的指令,以此来实现并行化。
例如,超标量处理器还可以进一步支持乱序执行(out-of-order execution)。乱序执行指CPU采用允许将多条指令不按程序规定的顺序分开发送给相应电路单元处理的技术。
目前影响流水线主要可以分为三类:资源冲突(结构相关)、数据冲突(数据相关)和控制冲突(控制相关)。数据相关根据冲突访问中读和写的次序可以分为三种情况:RAW(写后读)、WAW(写后写)、WAR(读后写)。可以通过寄存器重命名技术解决WAW(写后写)和WAR(读后写)可能的流水线冲突。
同样为了提高并行度,处理器还可以采用同时多线程(SMT)技术,处理器的用于指令执行的流水线结构(也简称“流水线”)支持两个或多个(例如4个或8个等)线程同时执行。在支持同时多线程技术的处理器的流水线中,计算资源被多个线程共享,例如,每个线程具有各自独立的逻辑寄存器;在流水线的各种控制性功能的队列中,有的是多个线程共享的,如指令调度队列,有的是在多个线程间静态划分的,如指令重排序队列。同时多线程技术可以利用线程间并行性提升流水线资源利用率。
处理器核在微架构内将每一条架构指令(instruction)翻译为一条或者多条微指令(micro-op,uOp),每条微指令只执行有限的操作,这样可以保证每个流水级很短,以提高处理器核运行频率。比如一条内存读指令(load),可以被翻译为一条地址生成微指令以及一条内存读微指令,第二条微指令会依赖第一条微指令的结果,因此只有第一条微指令执行完后,第二条微指令才会开始执行。微指令包含多个微架构相关的域,用来在流水级间传递相关信息。
预测执行(Speculative Execution)是提高处理器性能的另一种技术。该技术在一条指令还未完成执行之前,执行它后面的指令。处理器核前端的分支预测单元(分支预测器),对分支指令的跳转方向进行预测,预取、执行该方向的指令;另一个预测执行的技术是在前面的所有内存写指令的地址都获得前,执行一个内存读指令。预测执行进一步提高了指令间并行度,从而大幅提高处理器核性能。当出现预测执行错误,比如发现分支预测错误,或者内存读指令前的某一条写指令改写了同一个地址,犯错指令其后的所有流水线中的指令需要被冲刷(或称为“清除”)(flush),然后程序跳转到出错点重新执行,以保证程序执行的正确性。为支持预测执行,处理器核微架构也需要支持架构寄存器恢复机制,以保证架构寄存器在预测执行时总有正确的值。
很多内存访问指令的内存访问地址是动态生成的,使用一个或者多个寄存器。处理器核中可以包含单独的执行阶段硬件(称为AGEN)来进行这些地址运算。一个内存访问指令只有通过AGEN获得其地址,才能开始内存访问操作,这增加了这些指令的时延。某些指令集支持多种复杂的地址生成方式,比如X86-64,其AGEN也较复杂,有更多功耗及需要多个时钟获得结果。另外,很多指令都在指令数据中包括一个立即数(imm)用作地址生成的偏移量。
应用程序二进制接口(Application Binary Interface,ABI)规定了软件调用接口,其中包括对于应用程序栈的使用的规范。通常而言,应用程序栈的数据增删只在栈顶进行,只需一个栈顶寄存器(比如X86-64的RSP寄存器)来标识应用程序栈的栈顶位置。
例如,对于应用程序栈的访问往往有专属的指令,比如X86-64中栈操作指令包括call、ret、push、pop指令。如上所述,call指令与push指令先增加栈顶位置,然后将新的数据压入栈;ret/pop指令从栈顶读出数据,然后回退栈顶位置。此外call指令与ret指令还可以包含指令流跳转操作。此外,也可以使用正常的内存读写指令来访问应用程序栈中任意位置的数据,这些应用程序栈读写操作往往使用栈顶寄存器作为唯一或者多个地址计算寄存器之一。
在一个高性能、多流水线级的处理器核中,内存读写指令往往需要多个流水级来获得其数据,而它们的地址生成是导致长延时的一部分原因。上述应用程序栈的访问,不论是通过专有指令还是普通内存访问指令来操作的,其地址生成也是在指令执行阶段动态生成的,需要用到AGEN及至少一个时钟周期完成。
由于应用程序栈的特性,其访问规律比较简单,利用这些规律提前获得对于应用程序栈的访问地址能够降低这些指令的延迟,从而进一步提高处理器的性能;而且,这也可以降低访问寄存器文件及使用AGEN造成的功耗。对应用程序栈的读写及栈顶寄存器的值(栈顶值)的改变大都发生在当前的栈顶位置附近,这意味:
(1)大多数改变应用程序栈的栈顶值的指令,在译码阶段就可以获得其偏移值,从而可以在译码阶段更新当前栈顶值。
(2)很多对于应用程序栈进行读写的访问地址使用固定偏移(比如X86-64中call/push指令的偏移值为8,ret/pop指令的偏移值为0),或者使用保存在指令立即数中的偏移。
在申请人之前的中国专利申请CN114281411A中提供了一种指令处理方法、指令执行方法以及对应的处理器。在指令译码阶段维护该阶段的当前的栈顶值(简称SP@DE),并用该当前的栈顶值来在指令译码阶段获得应用程序栈专有指令(如X86-64中的call/ret/push/pop等指令)及一些访问应用程序栈的普通内存读写指令的访问地址。因此,这些指令可以免除指令执行阶段的地址生成、寄存器文件与AGEN访问及相应时延,从而提高处理器性能并降低系统功耗。
例如,上述专利申请中的指令处理方法可以包括:在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;在对象指令的执行阶段,利用访问地址访问应用程序栈。这里的“对象指令”指代该方法中当前被处理的指令。
例如,上述专利申请中的处理器可以包括译码单元和执行单元,其中,该译码单元配置为在对象指令的译码阶段,获取对象指令对于应用程序栈的访问地址;该执行单元配置为在对象指令的执行阶段,使用访问地址访问应用程序栈。
例如,上述专利申请中的指令执行方法可以包括:响应于发生处理器核的流水线冲刷,将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元;响应于非发生处理器核的流水线冲刷,执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给处理器核的流水线的译码单元,其中,对象指令被标注为,在被执行后需要反馈应用程序栈的栈指针的栈顶值。
例如,上述专利申请中的处理器可以包括执行单元和译码单元,其中,执行单元配置为:响应于发生处理器核的流水线冲刷(flush),将处理器核的流水线冲刷后得到的应用程序栈的栈指针的栈顶值提供给译码单元;响应于非发生处理器核的流水线冲刷(flush),执行对象指令的译码后指令并将对象指令被执行所得到的应用程序栈的栈指针的栈顶值提供给译码单元,其中,对象指令被标注为,在对象指令的执行阶段后,需要反馈对应于对象指令被执行所得到的应用程序栈的栈指针的栈顶值。
在中国专利申请CN114281411A中所公开的处理器核的流水线如图3所示,图3中的带箭头的虚线表示重新定向的指令流。该处理器核可以是单核处理器或多核处理器的处理器核(例如CPU核)。例如,该处理器核可以通过流水线技术提高指令间并行度(InstructionLevel Parallelism)。
与图2相比,如图3所示的处理器核的流水线还可以包括一个缓存DESP,用于记录译码阶段的当前的栈顶值SP@DE。缓存DESP可以通过寄存器等方式实现,例如,该缓存可以设置在指令译码单元中,也可以单独设置。并且,与图2相比,如图3所示的处理器核的流水线还可以进一步包括从指令执行单元向译码单元传递执行了消息的数据通路(如图中的带箭头的实线所示),以传递执行阶段更新的SP值(SP@EX)以及产生该执行阶段更新的SP值(SP@EX)的指令的指令序号(INST_SN)。
例如,获取对象指令对于应用程序栈的访问地址,包括:确定在对象指令的译码阶段时第一栈顶值是否为有效值;响应于第一栈顶值为有效值,使用第一栈顶值获取访问地址。
这里,“第一栈顶值”为由处理器核的流水线的译码单元维护的用于记录应用程序栈的栈指针的数值,即译码阶段当前的栈顶值(SP@DE)。例如,在至少一个示例中,响应于第一栈顶值为有效值,使用第一栈顶值获取访问地址,包括:
·响应于对象指令是call指令或push指令,使用第一栈顶值减去系统架构参数值得到访问地址;或者
·响应于对象指令是ret或pop指令,使用第一栈顶值作为访问地址;或者
·响应于在对象指令是访问应用程序栈的指令且为使用栈指针和立即数之和进行地址编码的方式,使用第一栈顶值加上立即数得到访问地址。
在上述指令处理方法中,需要判断译码阶段当前的栈顶值(SP@DE)的有效性是否为有效,如果是无效,则结束该方法的流程。
本公开的发明人注意到,可以在指令派遣阶段使用指令中已获得的内存读写地址(例如虚拟地址)维护一个内存文件(Memory File),使用该内存文件来预测指令序列中针对内存进行操作的读取指令(Load指令)和存储指令(Store指令)之间的依赖关系,并在寄存器重命名阶段使用参考内存文件所得到的预测结果对读取指令和存储指令中所涉及的内存读写地址通过虚拟的额外架构寄存器进行内存重命名。这样,读取指令在就可以直接从对应的存储指令获得相应的数据,从而避免先由存储指令将数据存储到缓存/内存,然后再由读取指令从缓存/内存将该数据读出的这一过程,因此可以减少等待数据的延迟以及对于缓存的访问次数,从而提供处理器的性能并减小处理器以及系统的功耗。例如,该内存文件可以在处理器核的工作过程中创建并保持在缓存中,该缓存可以使用处理器核中已有的缓存(例如L1缓存)或者单独为内存文件提供的缓存。例如,专门用于栈操作存储指令和读取指令的内存文件也可以称为栈内存文件(Stack Memory File)。
并且,在指令派遣阶段,已知指令中的内存读写地址(例如虚拟地址)不限于上述用于栈操作的存储指令和读取指令,也可以为其他在指令派遣阶段就已经确定了其中所涉及的内存读写地址(例如作为源操作数或目标操作数)的存储指令和读取指令。这里,存储指令的目的操作数为内存操作数,该内存操作数给出存储目的内存单元的物理地址;读取指令的源操作数为内存操作数,该内存操作数给出数据源内存单元的物理地址。在指令中,物理地址根据指令的相应寻址方式得到,例如寻址方式包括直接寻址、间接寻址、寄存器寻址等。
如上所述,在本公开的实施例中,提供了内存文件用于在指令分派阶段预测指令序列中针对内存进行操作的读取指令(Load指令)和存储指令(Store指令)之间的依赖关系,并在寄存器重命名阶段使用参考内存文件所得到的预测结果进行内存重命名,将指令中以及生成的内存访问地址使用虚拟的额外架构寄存器替代,并且例如指向映射该额外架构寄存器的物理寄存器。
例如,在本公开的实施例中,上述内存文件是一个数组,该数组例如为先进先出(FIFO)的队列,进一步地例如为以创建时间排序的循环存储结构,具体项数可以视情况而定。例如,内存文件可以共包含X项,X为正整数,例如X的优选值可以根据处理器核的性能、资源等进行调整;例如,如果处理器核的性能较高(例如主频高、多线程)、资源较多(例如缓存容量大)等,X的取值可以较大,反之可以较小。
图4示出了本公开一实施例的示例性的内存文件的数据项。如图所示,该内存文件包括多个数据项,每个数据项可以包括有效位(Valid)和内存访问地址字段(Va)。
有效位(Valid)用于指示所属的数据项是否有效。该有效位的大小例如为1位(bit),当其为1时代表此数据项有效,而为0时则代表此数据项无效。有效位的初始值为0。
内存访问地址字段(Va)用于记载所属的数据项被关联存储指令创建时(将在下面描述相关流程)该关联存储指令中作为目的操作数的内存访问地址。该内存访问地址字段例如包括N个位,例如N为当前架构支持的虚拟地址比特数,例如,X86-64架构、ARM64架构等可以支持48位或52位的虚拟地址,那么此时相应地N=48或52。该内存访问地址字段的初始值可以设置为-1。
例如,在至少一个示例中,为了支持浮点/定点的内存重命名,同时提供、维护两个彼此独立的内存文件,其中一个内存文件用于定点指令,另一个内存文件用于浮点指令。对应地,在下面描述中,用于定点指令和浮点指令则需要提供两套彼此独立的额外架构寄存器(MrArn),例如,这两套额外架构寄存器的寄存器编号方式不同。
例如,在至少一个涉及同时多线程(SMT)处理器核的示例中,内存文件中的每个数据项还可以包括线程标号字段(TID),线程标号字段用于记载所属的数据项被关联存储指令创建时关联存储指令所在的线程的标号,即,同一内存文件同时用于在处理器核中执行的多个线程,而为了区分不同线程中的存储指令和读取指令,则在内存文件中对于每个数据项记载相应的线程标号字段(TID)。在处理器核中同时执行的多个线程的线程标号彼此不同。同样地,对于SMT处理器核的示例中,还可以同时提供、维护两个彼此独立的内存文件,以分别用于定点指令和浮点指令。在该示例中,线程标号字段(TID)的大小可以根据系统中所采用的线程标号的大小确定。
在上述示例中,例如无论是用于定点指令的内存文件还是用于浮点指令的内存文件,默认创建数据项的存储指令的目的操作数的数据宽度和读取指令的源操作数的数据宽度相同;然而,在至少另一个示例中,内存文件的每个数据项还可以包括数据宽度字段(Wd),例如,数据宽度可以为8位、16位、32位、64位等。
本公开的至少一实施例提供了一种指令处理方法,该指令处理方法包括:响应于在对象存储指令的译码阶段获得对象存储指令中作为目的操作数的第一内存访问地址,使用第一内存访问地址查询对象内存文件;在对象内存文件中维护对应第一内存访问地址的第一数据项,且为对象存储指令分配对应于第一内存访问地址的第一附加架构寄存器。该指令处理方法针对在译码阶段已经产生内存访问地址的存储指令,在内存文件中记录相应的信息,以预测该存储指令和后续的读取指令之间的依赖关系,这增加了被预测进行内存重命名的读取指令的数量,减少了数据就绪的延迟以及缓存的访问次数,在提高处理性能的同时,还有助于降低处理器以及系统的功耗。
这里,“对象存储指令”用于表示作为当前描述对象的存储指令;这里的第一数据项、第一内存访问地址中的“第一”仅用于区分而非表示实际的顺序。该存储指令包括源操作数和目的操作数,且目的操作数包括内存访问地址(即“第一内存访问地址”),例如该第一内存访问地址为用于访问内存的虚拟地址,从而在该内存地址写入数据。“对象内存文件”用于表示当前描述对象的内存文件;例如在系统中还可能同时存在其他内存文件,例如,当对象存储指令为定点指令时,则对象内存文件为定点内存文件,或者当对象存储指令为浮点指令时,则对象内存文件为浮点内存文件。
在使用第一内存访问地址查询对象内存文件,使用第一内存访问地址与对象内存文件中的数据项中的内存访问地址字段(Va)进行比较,从而判断是否查询命中(hit)或缺失(miss);例如,在其他示例中,如果需要,还需要比较线程标号字段(TID)。之后,在对象内存文件中维护对应第一内存访问地址的第一数据项,且为对象存储指令分配对应于第一内存访问地址的第一附加架构寄存器。例如,第一数据项的内存访问地址字段(Va)对应于第一内存访问地址,从而在使用第一内存访问地址进行查询时可以命中第一数据项。为对象存储指令分配的第一附加架构寄存器并非是指令集中事先规定的架构寄存器,而是为了在后续内存重名中使用而事后额外规定的架构寄存器,例如这些附加架构寄存器对于计算机程序并不可见。
例如,第一附加架构寄存器的编号可以基于第一数据项在对象内存文件中编号确定。例如,第一数据项在对象内存文件中编号为011(例如起始编号可以从010开始或从001开始等),则第一附加架构寄存器的编号也可以直接确定为011,或者加上固定的偏移值,这样对应于对象内存文件中不同的数据项的附加架构寄存器不会彼此重复、冲突,而实现方式简单。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于在对象存储指令进入处理器流水线后处理器流水线发生了冲刷事件,清空对象内存文件;或者,响应于对象存储指令为栈操作指令,以及响应于在对象存储指令进入处理器流水线后在译码阶段维护的当前栈顶值(SP@DE)被无效,清空对象内存文件。如前所述,比如X86-64中栈操作指令例如包括call、ret、push和pop指令,其他指令集也包括类似的栈操作指令。
处理器流水线发生了冲刷事件时,此时在处理器流水线上尚未提交的指令都需要被清除,因此对应地需要清空对象内存文件,将其恢复到初始状态;在对象存储指令为栈操作指令时(例如该示例中上述指令处理方法仅针对栈操作指令),如果在对象存储指令进入处理器流水线后在译码阶段维护的当前栈顶值(SP@DE)被无效,则基于当前栈顶值的内存访问地址不再有意义,因此对应地需要清空对象内存文件,将其恢复到初始状态。在清空对象内存文件时,之前对应于对象内存文件中的各个数据项分配的附加架构寄存器也被回收(或清除)。
例如,在至少一个实施例中,上述指令处理方法中,在对象内存文件中维护对应第一内存访问地址的第一数据项,包括如下情形:响应于在对象内存文件中没有查询到第一内存访问地址,在对象内存文件中创建对应于第一内存访问地址的第一数据项;或者,响应于在对象内存文件中查询到第一内存地址,在对象内存文件中更新对应于第一内存访问地址的第一数据项。
在上述操作之后在对象内存文件中存在对应于第一内存访问地址的第一数据项,且该第一数据项对应当前的对象存储指令。此时,该对象存储指令为前述描述的针对第一数据项的“关联存储指令”。
例如,对象内存文件包括按照先进先出(FIFO)方式创建的至少一个数据项;则在该情形中,在对象内存文件中更新对应于第一内存访问地址的第一数据项,包括:将对象内存文件中查找到的对应于第一内存访问地址的在先数据项无效,以及在对象内存文件中创建对应于第一内存访问地址的第一数据项。由此,虽然在前的存储指令和当前的对象存储指令针对同一内存访问地址(即前述第一内存访问地址)先后分别创建了在前的数据项和第一数据项,但是经过上述操作之后,对象内存文件中对应于第一内存访问地址的仅有第一数据项是有效的,仅与第一数据项相应的第一附加架构寄存器可以用于后续的内存重命名操作。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于对象存储指令的源操作数存在于第一源寄存器中,将第一附加架构寄存器映射到第一源寄存器对应的物理寄存器;或者,响应于对象存储指令的源操作数不存在于任何寄存器中,为第一附加架构寄存器分配第一物理寄存器,将第一附加架构寄存器映射到第一物理寄存器,将对象存储指令的源操作数写入第一物理寄存器。
在对象存储指令的源操作数存在于某一寄存器(即第一源寄存器)中的情形,即第一源寄存器中的数据在对象存储指令执行后将被写入到第一内存访问地址,此时第一源寄存器是指令集中规定的架构寄存器,将第一附加架构寄存器映射到第一源寄存器对应的物理寄存器,这样访问第一附加架构寄存器则可以直接获得第一源寄存器对应的物理寄存器中存储的数据,而无需再从存储了该数据的第一内存访问地址读取该数据。
在对象存储指令的源操作数不存在于任何寄存器中的情形,例如对象存储指令的源操作数为立即数的情形,则为第一附加架构寄存器分配第一物理寄存器,将第一附加架构寄存器映射到第一物理寄存器,且将对象存储指令的源操作数写入第一物理寄存器,这样同样地访问第一附加架构寄存器则可以直接获得第一源寄存器对应的物理寄存器中存储的数据,而无需再从第一内存访问地址读取该数据。
例如,还可以在缓存中建立前述额外架构寄存器与物理寄存器之间的映射表,以处理器核后续查询、操作。
例如,在至少一个实施例中,对于上述两种情形,上述指令处理方法还包括:将第一附加架构寄存器映射到第一源寄存器对应的物理寄存器之后,将第一附加架构寄存器设置为就绪;或者,将第一附加架构寄存器映射到第一物理寄存器,且将对象存储指令的源操作数写入第一物理寄存器之后,将第一附加架构寄存器设置为就绪。将第一附加架构寄存器设置为就绪之后,则处理器核将通知后续需要用到该第一附加架构寄存器的指令(例如下面说明的使用该第一附加架构寄存器进行内存重命名的对象读取指令),以便于后续的使用该第一附加架构寄存器的指令在其他执行前置条件(例如其他源操作数就绪)时可以被执行。
例如,在至少一个实施例中,上述指令处理方法还包括:在对象存储指令执行完成时,将对象内存文件中的对应于对象存储指令的第一数据项设置为无效。在将对象存储指令进行内存重命名之后,将实际执行该对象存储指令,将其中源操作数写入第一内存访问地址对应的内存位置中;例如,当提交该对象存储指令之后,将对象内存文件中的对应于对象存储指令的第一数据项设置为无效,从而可以回收对应的额外架构寄存器映射的物理寄存器,从而避免资源浪费,以及避免之后可能出现的误操作。例如,可以在处理器中设置信号通路,以便在提交了上述对象存储指令之后传输将对象内存文件中的对应于对象存储指令的第一数据项设置为无效的控制信号。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于在对象读取指令的译码阶段获得对象读取指令中作为源操作数的第二内存访问地址,使用第二内存访问地址查询对象内存文件;响应于在对象内存文件中查找到对应第二内存访问地址的第二数据项,将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。
这里,“对象读取指令”用于表示当前作为描述对象的读取指令;同样地,这里的第二数据项、第二内存访问地址中的“第二”仅用于区分而非表示实际的顺序。该对象读取指令包括源操作数和目的操作数,且源操作数包括内存访问地址(即“第二内存访问地址”),例如该第二内存访问地址为用于访问内存的虚拟地址。
在使用第二内存访问地址查询对象内存文件,使用第二内存访问地址与对象内存文件中的数据项中的内存访问地址字段(Va)进行比较,从而判断是否查询命中(hit)或缺失(miss);例如,在其他示例中,如果需要,还需要比较线程标号字段(TID)。在对象内存文件中查找到对应第二内存访问地址的第二数据项,则将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。例如,当第一内存访问地址和第二内存访问地址相同时,则第一数据项和第二数据项为对象内存文件中的同一数据项,且第一附加架构寄存器和第二附加架构寄存器为同一附加架构寄存器。
在上述实施例中,上述指令处理方法中,默认对象读取指令的源操作数的数据宽度等于第二数据项的数据宽度字段的值,因此响应于在对象内存文件中查找到对应第二内存访问地址的第二数据项,将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。在另外一些示例中,对于上述操作,如果内存文件的每个数据项还包括数据宽度字段,则响应于在对象内存文件中查找到对应第二内存访问地址的第二数据项且对象读取指令的源操作数的数据宽度小于等于第二数据项的数据宽度字段的值,将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。
在上述示例中,对象读取指令的源操作数的数据宽度小于等于第二数据项的数据宽度字段的值,则意味着之前创建第二数据项的关联存储指令的目的操作数包含对象读取指令的源操作数。在对象读取指令的源操作数的数据宽度小于第二数据项的数据宽度字段的值的情形中,由于在对象内存文件中查找到对应第二内存访问地址的第二数据项,则意味着对象读取指令的源操作数的内存地址与之前创建第二数据项的关联存储指令的目的操作数的内存地址相同,此时仍然可以进行内存重命名并进行后续的操作。因此,本公开实施例不限于对象读取指令的源操作数的数据宽度等于第二数据项的数据宽度字段的值。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于对象读取指令用于将第一内存数据加载到对象读取指令的第一架构目的寄存器,将第一架构目的寄存器映射到第二附加架构寄存器所对应的物理寄存器;或者,响应于对象读取指令加载第二内存数据并使用第二内存数据执行运算后将运算结果存储到对象读取指令的第一架构目的寄存器,将对象读取指令的第二附加架构寄存器作为源寄存器用于参与运算。
在将对象读取指令的第二内存访问地址重命名为对象内存文件中的第二数据项对应的第二附加架构寄存器之后,则对象读取指令的源操作数不再是第二内存访问地址而是第二附加架构寄存器,更是实际指向第二附加架构寄存器映射的物理寄存器,由此无需再实际访问第二内存访问地址就可以从该被映射的物理寄存器获取到需要的操作数,由此减小了数据就绪的延迟以及缓存的访问次数,提高了系统性能,降低处理器以及系统的功耗。
例如,在至少一个实施例中,上述指令处理方法还包括:响应于对象读取指令加载第二内存数据并使用第二内存数据执行运算后将运算结果存储到对象读取指令的第一架构目的寄存器,在第二附加架构寄存器就绪之后读取第二附加架构寄存器中的数据,并将第二附加架构寄存器中的数据作为运算的源操作数执行运算。
例如,在至少一个实施例中,上述对象存储指令和对象读取指令为栈操作指令,例如上述指令处理方法仅涉及栈操作指令,例如栈操作指令包括的存储指令和读取指令,由此加快了栈操作的效率。
例如,在至少一个实施例中,响应于指令分派阶段在同一组中分派多条指令,上述对象存储指令和对象读取指令属于同一组。在处理器核为超标量类型时,可以一次性分派多个指令,该多个指令属于同一组,则上述指令处理方法对同一组中的存储指令和读取指令,这样可以简化操作和设计,无需维护较大的内存文件。
图5示出了根据已经生成内存访问地址的存储指令操作内存文件的示例的流程图。
如图5所示,在步骤501,进行指令分派,分派包括存储指令在内的各种指令;在步骤502,判断当前的指令是否为已经生成内存访问地址的存储指令(“对象存储指令”),如果不是,则结束本流程,如果是,则前进到步骤503;在步骤503,使用对象存储指令的内存访问地址(“第一内存访问地址”)查询内存文件(“对象内存文件”),以确定是否与内存文件中更老的数据项重合,如果重合,即查询命中,则前进到步骤504,否则前进到步骤505;在步骤504,将在内存文件中查询命中的更老的(已有的)数据项的有效位设置为无效(即“0”);在步骤505,在内存文件中创建对应于内存访问地址的新的数据项(“第一数据项”),且将该新的数据项的有效位设置为有效(即“1”);在步骤506,将内存访问地址填充入该第一数据项的内存访问地址字段,且为该第一数据项分配额外架构寄存器(MrArn)(“第一额外架构寄存器”)。至此,本流程结束。
图6示出了已经生成内存访问地址的读取指令根据内存文件进行操作的示例的流程图。
如图6所示,在步骤601,进行指令分派,分派包括读取指令在内的各种指令;在步骤602,判断当前的指令是否为已经生成内存访问地址的读取指令(“对象读取指令”),如果不是,则结束本流程,如果是,则前进到步骤603;在步骤603,将内存文件(“对象内存文件”)中的读指针指向内存文件中已有数据项中的最新项;在步骤604,判断读指针循环是否结束,如果是,则结束本流程,否则前进到步骤605;在步骤605,在对象内存文件中读取当前读指针指向的数据项;在步骤606,判断当前数据项的有效位是否有效(有效位=1?)且(&&)存储的数据是否包含读取的数据(例如对象读取指令的内存访问地址(“第二内存访问地址”)是否等于当前数据项的内存访问地址字段且对象读取指令的源操作数的数据宽度小于等于当前数据项的数据宽度字段的值),如果不是,则前进到步骤607,否则前进到步骤608;在步骤607,将内存文件的读指针指向更老的一个数据项,然后返回到步骤604;在步骤608,判断对象读取指令和当前数据项对应的存储指令的类型是否相同(例如是否都是定点指令或都是浮点数据),如果不是,则结束本流程,如果是,则前进到步骤609;在步骤609,对对象读取指令的涉及第二内存访问地址的源操作数进行内存重命名,对其分配当前数据项对应的附加架构寄存器(MrArn)。至此,本流程结束。
在上述流程中,该内存文件例如是以创建时间排序的循环存储结构。
图7示出了已经生成内存访问地址的存储指令根据内存文件进行内存重命名的示例的流程图。
如图7所示,在步骤701,进入寄存器重命名阶段,对指令的寄存器以及已经生成的内存访问地址进行重命名;在步骤702,判断当前的指令是否为已经生成内存访问地址的存储指令(“对象存储指令”),如果不是,则结束本流程,如果是,则前进到步骤703;在步骤703,判断对象存储指令所需存储的数据是否在源寄存器中,如果是,则前进到步骤704,否则前进到步骤705;在步骤704,将内存文件中该对象存储指令的数据项(“第一数据项”)的额外架构寄存器(MrArn)(“第一额外架构寄存器”)映射到该对象存储指令的源寄存器对应的物理寄存器;在步骤705,判断对象存储指令所需存储的数据是否不在任何寄存器中,如果不是,则本流程结束,如果是,则前进到步骤706;在步骤706,将内存文件中该对象存储指令的数据项(“第一数据项”)的额外架构寄存器(“第一额外架构寄存器”)作为该对象存储指令的目的寄存器,并将该目的寄存器映射到一个新的物理寄存器上。至此,本流程结束。
图8示出了已经生成内存访问地址的读取指令根据内存文件进行内存重命名的示例的流程图。
如图8所示,在步骤801,进入寄存器重命名阶段;在步骤802,判断当前的指令是否为已经生成内存访问地址的读取指令(“对象读取指令”),如果不是,则结束本流程,如果是,则前进到步骤803;在步骤803,判断对象读取指令是否加载数据并运算后写入目的寄存器,如果不是,则前进到步骤805,否则前进到步骤804;在步骤804,将内存文件中对应于对象读取指令的数据项(“第二数据项”)的额外架构寄存器(MrArn)(“第二额外架构寄存器”)作为该对象读取指令的源寄存器;在步骤805,判断对象读取指令是否仅将数据加载到目的寄存器,如果不是,则结束本流程,如果是,则前进到步骤806;在步骤806,将该对象读取指令的目的寄存器映射到内存文件中对应于对象读取指令的数据项(“第二数据项”)的额外架构寄存器(“第二额外架构寄存器”)所对应的物理寄存器。至此,本流程结束。
图9示出了本公开至少一实施例提供的处理器的示意图。
如图9所示,本公开的实施例提供的处理器900包括译码单元901和指令分派单元902,其中,译码单元901配置为对接收的指令进行译码;该指令分派单元902配置为:响应于译码单元901在对象存储指令的译码阶段获得对象存储指令中作为目的操作数的第一内存访问地址,使用第一内存访问地址查询对象内存文件;在对象内存文件中维护对应第一内存访问地址的第一数据项,且为对象存储指令分配对应于第一内存访问地址的第一附加架构寄存器。该处理器可以用于实现本公开实施例的上述指令处理方法,可以在指令的译码阶段获得指令中作为目的操作数或源操作数的内存访问地址。
例如,在至少一个实例中,上述处理器900可以参考图3所示的情形,可以针对栈操作指令实施本公开实施例的上述指令处理方法。
例如,本公开实施例的处理器还可以进一步包括但不限于分支预测(Branchprediction)、指令提取(Instruction fetch)、指令重命名(Rename)、指令执行(Execute)、指令结束(Retire)等结构;并且,本公开实施例的处理器例如可以基于X86架构、ARM架构、RISC-V架构等,对应地支持X86指令集、ARM指令集、RISC-V指令集等。本公开实施例的处理器可以是标量处理器或超标量处理器,可以单线程处理器或多线程处理器。本公开的实施例对上述可选方式不作限制。
例如,在至少一个示例中,上述处理器还包括重命名单元903,其中,该指令分派单元902还配置为:响应于译码单元901在对象读取指令的译码阶段获得对象读取指令中作为源操作数的第二内存访问地址,使用第二内存访问地址查询对象内存文件。该重命名单元903配置为:响应于在对象内存文件中查找到对应第二内存访问地址的第二数据项,将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。
或者,在至少在一个示例中,该重命名单元903还可以配置为:响应于在对象内存文件中查找到对应第二内存访问地址的第二数据项且对象读取指令的源操作数的数据宽度小于等于第二数据项的数据宽度字段的值,将对象读取指令的第二内存访问地址重命名为第二数据项对应的第二附加架构寄存器。
例如,在至少一个示例中,上述指令分派单元902和重命名单元903可以合并或集成为指令分派与重命名(Dispatch and Rename)单元。
在至少在一个示例中,对象内存文件包括至少一个数据项,至少一个数据项包括第一数据项,至少一个数据项每个包括有效位和内存访问地址字段,有效位用于指示所属的数据项是否有效,内存访问地址字段用于记载所属的数据项被关联存储指令创建时关联存储指令中作为目的操作数的内存访问地址。
在至少在一个示例中,至少一个数据项每个还包括线程标号字段,线程标号字段用于记载所属的数据项被关联存储指令创建时关联存储指令所在的线程的标号。
在至少在一个示例中,至少一个数据项每个还包括数据宽度字段。
在至少在一个示例中,第一附加架构寄存器的编号基于第一数据项在对象内存文件中编号确定。
在至少在一个示例中,对象存储指令为定点指令类型,对象内存文件用于定点指令类型;或者,对象存储指令为浮点指令类型,对象内存文件用于浮点指令类型。
在至少在一个示例中,上述译码单元901还配置为:响应于在对象存储指令进入处理器流水线后处理器流水线发生了冲刷事件,清空对象内存文件;或者响应于对象存储指令为栈操作指令,以及响应于在对象存储指令进入处理器流水线后在译码阶段维护的当前栈顶值被无效,清空对象内存文件。
在至少在一个示例中,指令分派单元902还配置为:响应于在对象内存文件中没有查询到第一内存访问地址,在对象内存文件中创建对应于第一内存访问地址的第一数据项;或者,响应于在对象内存文件中查询到第一内存地址,在对象内存文件中更新对应于第一内存访问地址的第一数据项。
在至少在一个示例中,对象内存文件包括按照先进先出方式创建的至少一个数据项,在对象内存文件中更新对应于第一内存访问地址的第一数据项,包括:将对象内存文件中查找到的对应于第一内存访问地址的在先数据项无效,以及在对象内存文件中创建对应于第一内存访问地址的第一数据项。
在至少在一个示例中,上述重命名单元903还配置为:响应于对象存储指令的源操作数存在于第一源寄存器中,将第一附加架构寄存器映射到第一源寄存器对应的物理寄存器;或者,响应于对象存储指令的源操作数不存在于任何寄存器中,为第一附加架构寄存器分配第一物理寄存器,将第一附加架构寄存器映射到第一物理寄存器,且将对象存储指令的源操作数写入第一物理寄存器。
在至少在一个示例中,上述重命名单元903还配置为:将第一附加架构寄存器映射到第一源寄存器对应的物理寄存器之后,将第一附加架构寄存器设置为就绪;或者,将第一附加架构寄存器映射到第一物理寄存器,且将对象存储指令的源操作数写入第一物理寄存器之后,将第一附加架构寄存器设置为就绪。
在至少在一个示例中,上述处理器还包括执行单元904,该执行单元904配置为:在对象存储指令执行完成时,将对象内存文件中的对应于对象存储指令的第一数据项设置为无效。例如,在至少一个示例中,该重命名单元903还配置为:响应于对象读取指令用于将第一内存数据加载到对象读取指令的第一架构目的寄存器,将第一架构目的寄存器映射到第二附加架构寄存器所对应的物理寄存器;或者,响应于对象读取指令加载第二内存数据并使用第二内存数据执行运算后将运算结果存储到对象读取指令的第一架构目的寄存器,将对象读取指令的第二附加架构寄存器作为源寄存器用于参与运算。
例如,在至少一个示例中,上述处理器还包括执行单元904,其中,该执行单元904配置为:在将对象存储指令的源操作数写入到第一附加架构寄存器映射的物理寄存器中之后,将第一附加架构寄存器设置为就绪。
例如,在至少一个示例中,上述处理器还包括执行单元904,其中,该执行单元904配置为:响应于对象读取指令加载第二内存数据并使用第二内存数据执行运算后将运算结果存储到对象读取指令的第一架构目的寄存器,在第二附加架构寄存器就绪之后读取第二附加架构寄存器中的数据,并将第二附加架构寄存器中的数据作为运算的源操作数执行运算。
例如,在至少一个示例中,对象存储指令和对象读取指令为栈操作指令。
例如,在至少一个示例中,响应于指令分派阶段在同一组中分派多条指令,对象存储指令和对象读取指令属于同一组。
在上述实施例中,译码单元、指令分派单元和执行单元还可以进一步用于在上面描述指令处理方法中的其他对应的步骤或操作,为了简单起见,这就不再赘述。
在本公开的至少一实施例中,上述指令处理方法和处理器适用于任何基于寄存器进行提前生成内存访问地址的存储(store)指令和读取(load)指令;并且,上述指令处理方法和处理器适用于在拥有任意数量的源寄存器/数据和目的内存地址的存储指令,以及适用于拥有任意数量的目的寄存器以及源内存地址的读取指令,在这些存储指令和读取指令之间进行内存重命名。例如,本公开的至少一实施例中,可以使用X86-64处理器核作为示例,但是本公开的各个实施例适用于所有类型的可用的处理器核。
对于本公开,还有以下几点需要说明:
(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
以上所述仅是本公开的示范性实施方式,而非用于限制本公开的保护范围,本公开的保护范围由所附的权利要求确定。
Claims (23)
1.一种指令处理方法,包括:
响应于在对象存储指令的译码阶段获得所述对象存储指令中作为目的操作数的第一内存访问地址,使用所述第一内存访问地址查询对象内存文件;
在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,且为所述对象存储指令分配对应于所述第一内存访问地址的第一附加架构寄存器。
2.根据权利要求1所述的方法,其中,所述对象内存文件包括至少一个数据项,所述至少一个数据项包括所述第一数据项,
所述至少一个数据项每个包括有效位和内存访问地址字段,
所述有效位用于指示所属的数据项是否有效,所述内存访问地址字段用于记载所属的数据项被关联存储指令创建时所述关联存储指令中作为目的操作数的内存访问地址。
3.根据权利要求2所述的方法,其中,所述至少一个数据项每个还包括线程标号字段,
所述线程标号字段用于记载所属的数据项被所述关联存储指令创建时所述关联存储指令所在的线程的标号。
4.根据权利要求2或3所述的方法,其中,所述至少一个数据项每个还包括数据宽度字段。
5.根据权利要求1-3任一所述的方法,其中,所述第一附加架构寄存器的编号基于所述第一数据项在所述对象内存文件中编号确定。
6.根据权利要求1-3任一所述的方法,其中,所述对象存储指令为定点指令类型,所述对象内存文件用于定点指令类型;或者,
所述对象存储指令为浮点指令类型,所述对象内存文件用于浮点指令类型。
7.根据权利要求1-3任一所述的方法,还包括:
响应于在所述对象存储指令进入处理器流水线后所述处理器流水线发生了冲刷事件,清空所述对象内存文件;或者,
响应于所述对象存储指令为栈操作指令,以及响应于在所述对象存储指令进入处理器流水线后在译码阶段维护的当前栈顶值被无效,清空所述对象内存文件。
8.根据权利要求1所述的方法,其中,所述在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,包括:
响应于在所述对象内存文件中没有查询到所述第一内存访问地址,在所述对象内存文件中创建对应于第一内存访问地址的所述第一数据项;或者,
响应于在所述对象内存文件中查询到第一内存地址,在所述对象内存文件中更新对应于所述第一内存访问地址的所述第一数据项。
9.根据权利要求8所述的方法,其中,所述对象内存文件包括按照先进先出方式创建的至少一个数据项,
所述在所述对象内存文件中更新对应于所述第一内存访问地址的所述第一数据项,包括:
将所述对象内存文件中查找到的对应于所述第一内存访问地址的在先数据项无效,以及
在所述对象内存文件中创建对应于所述第一内存访问地址的所述第一数据项。
10.根据权利要求1所述的方法,还包括:
响应于所述对象存储指令的源操作数存在于第一源寄存器中,将所述第一附加架构寄存器映射到所述第一源寄存器对应的物理寄存器;或者,
响应于所述对象存储指令的源操作数不存在于任何寄存器中,为所述第一附加架构寄存器分配第一物理寄存器,将所述第一附加架构寄存器映射到所述第一物理寄存器,且将所述对象存储指令的源操作数写入所述第一物理寄存器。
11.根据权利要求10所述的方法,还包括:
将所述第一附加架构寄存器映射到所述第一源寄存器对应的物理寄存器之后,将所述第一附加架构寄存器设置为就绪;或者,
将所述第一附加架构寄存器映射到所述第一物理寄存器,且将所述对象存储指令的源操作数写入所述第一物理寄存器之后,将所述第一附加架构寄存器设置为就绪。
12.根据权利要求10所述的方法,还包括:
在所述对象存储指令执行完成时,将所述对象内存文件中的对应于所述对象存储指令的第一数据项设置为无效。
13.根据权利要求1所述的方法,还包括:
响应于在对象读取指令的译码阶段获得所述对象读取指令中作为源操作数的第二内存访问地址,使用所述第二内存访问地址查询所述对象内存文件;
响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
14.根据权利要求13所述的方法,其中,响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器,包括:
响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项且所述对象读取指令的源操作数的数据宽度小于等于所述第二数据项的数据宽度字段的值,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
15.根据权利要求13所述的方法,还包括:
响应于所述对象读取指令用于将第一内存数据加载到所述对象读取指令的第一架构目的寄存器,将所述第一架构目的寄存器映射到所述第二附加架构寄存器所对应的物理寄存器;或者,
响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,将所述对象读取指令的第二附加架构寄存器作为源寄存器用于参与所述运算。
16.根据权利要求15所述的方法,还包括:
响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,在所述第二附加架构寄存器就绪之后读取所述第二附加架构寄存器中的数据,并将所述第二附加架构寄存器中的数据作为所述运算的源操作数执行所述运算。
17.根据权利要求13所述的方法,其中,所述对象存储指令和所述对象读取指令为栈操作指令。
18.根据权利要求13所述的方法,其中,响应于指令分派阶段在同一组中分派多条指令,所述对象存储指令和所述对象读取指令属于同一组。
19.一种处理器,包括译码单元和指令分派单元,其中,
所述译码单元配置为对接收的指令进行译码;以及
所述指令分派单元配置为:
响应于所述译码单元在对象存储指令的译码阶段获得所述对象存储指令中作为目的操作数的第一内存访问地址,使用所述第一内存访问地址查询对象内存文件;以及
在所述对象内存文件中维护对应所述第一内存访问地址的第一数据项,且为所述对象存储指令分配对应于所述第一内存访问地址的第一附加架构寄存器。
20.如权利要求19所述的处理器,还包括执行单元,其中,
所述执行单元配置为:
在将所述对象存储指令的源操作数写入到所述第一附加架构寄存器映射的物理寄存器中之后,将所述第一附加架构寄存器设置为就绪。
21.如权利要求19所述的处理器,还包括重命名单元,其中,
所述指令分派单元还配置为:
响应于所述译码单元在对象读取指令的译码阶段获得所述对象读取指令中作为源操作数的第二内存访问地址,使用所述第二内存访问地址查询所述对象内存文件;以及
所述重命名单元配置为:
响应于在所述对象内存文件中查找到对应所述第二内存访问地址的第二数据项,将所述对象读取指令的第二内存访问地址重命名为所述第二数据项对应的第二附加架构寄存器。
22.如权利要求21所述的处理器,其中,
所述重命名单元还配置为:
响应于所述对象读取指令用于将第一内存数据加载到所述对象读取指令的第一架构目的寄存器,将所述第一架构目的寄存器映射到所述第二附加架构寄存器所对应的物理寄存器;或者,
响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,将所述对象读取指令的第二附加架构寄存器作为源寄存器用于参与所述运算。
23.如权利要求22所述的处理器,还包括执行单元,其中,
所述执行单元配置为:
响应于所述对象读取指令加载第二内存数据并使用所述第二内存数据执行运算后将运算结果存储到所述对象读取指令的第一架构目的寄存器,在所述第二附加架构寄存器就绪之后读取所述第二附加架构寄存器中的数据,并将所述第二附加架构寄存器中的数据作为所述运算的源操作数执行所述运算。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310401929.4A CN116414458A (zh) | 2023-04-14 | 2023-04-14 | 指令处理方法以及处理器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310401929.4A CN116414458A (zh) | 2023-04-14 | 2023-04-14 | 指令处理方法以及处理器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116414458A true CN116414458A (zh) | 2023-07-11 |
Family
ID=87056082
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310401929.4A Pending CN116414458A (zh) | 2023-04-14 | 2023-04-14 | 指令处理方法以及处理器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116414458A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117289995A (zh) * | 2023-10-11 | 2023-12-26 | 海光信息技术股份有限公司 | 指令处理方法以及处理器 |
-
2023
- 2023-04-14 CN CN202310401929.4A patent/CN116414458A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117289995A (zh) * | 2023-10-11 | 2023-12-26 | 海光信息技术股份有限公司 | 指令处理方法以及处理器 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106716362B (zh) | 用于将微指令序列重排序为优化的微指令序列以实现指令集不可知的运行时架构的分配和发出级 | |
US9311095B2 (en) | Using register last use information to perform decode time computer instruction optimization | |
KR100586058B1 (ko) | 재명명 태그들을 교환함으로써 이동이 이루어지는 레지스터 재명명 | |
US10061588B2 (en) | Tracking operand liveness information in a computer system and performing function based on the liveness information | |
JP3871884B2 (ja) | 記憶からロードへの転送のための機構 | |
JP6690812B2 (ja) | 複数の変換テーブルを用いた命令セットアグノスティックランタイムアーキテクチャの実施 | |
US20160098279A1 (en) | Method and apparatus for segmented sequential storage | |
US20020087849A1 (en) | Full multiprocessor speculation mechanism in a symmetric multiprocessor (smp) System | |
US20140047219A1 (en) | Managing A Register Cache Based on an Architected Computer Instruction Set having Operand Last-User Information | |
JP6690811B2 (ja) | ランアヘッドランタイムゲスト命令変換/デコードプロセスと、ゲストコードが、命令シーケンスにおけるゲスト分岐のターゲットからプリフェッチされるプリフェッチプロセスとを実施するシステム変換器 | |
JP3577052B2 (ja) | 命令発行装置及び命令発行方法 | |
CN106716363B (zh) | 使用转换后备缓冲器来实现指令集不可知的运行时架构 | |
WO2005111794A1 (en) | System and method for validating a memory file that links speculative results of load operations to register values | |
JP2001175473A (ja) | コンピュータ処理システムにおいて実行述語を実現する方法及び装置 | |
CN107077371B (zh) | 用于不可知的运行时架构的系统、微处理器和计算机系统 | |
JP6683321B2 (ja) | ゲストイメージからのコードを実行するための実行時オプティマイザを実行するシステム変換器 | |
JP2001229022A (ja) | コンピュータ処理システムにおけるスタック・リファレンスのリネーム方法およびそのプログラム記憶装置 | |
CN116414458A (zh) | 指令处理方法以及处理器 | |
JP7064273B2 (ja) | 単一のcamポートを使用する分割された順序変更キューを備える読み込み/格納ユニット | |
CN117289995A (zh) | 指令处理方法以及处理器 | |
CN117270971B (zh) | 加载队列控制方法、装置及处理器 | |
CN114281411A (zh) | 指令处理方法、指令执行方法以及处理器 |
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 |