一种微处理器,其中包括: 一内存,用来储存将被执行的指令; 一提取阶层,用来自该内存中提取指令,而该指令包括具有一现行程序段基础与偏移量的一现行远跳跃指令; 一远跳跃-呼叫分支目标缓冲器,位于该提取阶层中,其包括有一测试机制以决定该缓冲器中是否命中该现行远跳跃-呼叫分支指令,而该缓冲器可储存该现行程序段基础与偏移量以纪录前面所执行过的远跳跃-呼叫指令的目标地址;以及 一退回推测性目标地址产生器,耦接至该远跳跃-呼叫分支目标缓冲器,并可在该缓冲器发生未中情形时,在该现行远跳跃呼叫分支指令相关的该现行程序段基础与偏移量中产生一退回远跳跃呼叫推测性目标地址。(*该技术在2023年保护过期,可自由使用*)
【技术实现步骤摘要】
本专利技术涉及微处理器(microprocessors)的领域,尤其是涉及一种用来执行具有远跳跃(far jump)及远呼叫(far call)指令的分支预测的装置与方法。
技术介绍
在信息处理系统中,计算机指令(instructions)传统上储存于一内存中的连续可寻址的位置上。当中央处理单元(Central Processing Unit,CPU)进行运算时,这些计算机指令将会自该连续的存储地址中被提取(fetched)出来并被加以执行(executed)。每一次的指令存取,位于中央处理单元内的一程序计数器(program counter)将会增加其计数以纪录序列中下一个指令的地址。此即所谓的指令指针(Instruction Pointer,IP)。指令的存取、程序计数器的计数以及指令的执行是线性地连续通过存储单元,直到有一程控指令,例如有条件跳跃(jumpon conditional)、无条件跳跃(nonconditional jump)或是呼叫指令出现为止。当一程控指令被执行时,将改变位于程序计数器内的地址,并将导致控制流程改变。换句话说,程控指令详细记载了各种条件以改变程序计数器的内容。程序计数器的数值的改变是执行程控指令的结果,可中止后续其它指令的执行。这正是数字计算机重要的特点之一,其除了可控制整个程序执行的流程外,还可提供自一程序中分支出不同部分的功能。其中所谓的程控指令包括有跳跃(Jump)、条件式地测试与跳跃(Test and Jump conditionally)、呼叫(Call)以及返回(Return)等,而这些指令也称为分支指令。跳跃(Jump)指令可使中央处理单元无条件地改变程序计数器的内容而成为一特定的值,也就是改变为该程序可继续执行指令的目标地址值。条件式的测试与跳跃(Test and Jump conditionally)指令可有条件地使中央处理单元测试一状态缓存器(status register)的内容或比较两个值,由此测试或比较的结果,条件式测试与跳跃(Test and Jump conditionally)指令可以决定继续后续的执行或是跳跃至一新的地址,其中该新的地址称为目标地址(target address)。呼叫(Call)指令除了可使中央处理单元无条件地跳跃至一新的目标地址外,也可保留程序计数器的计数值以使中央处理单元回到其离开的程序位置。退回(Return)指令则可令中央处理单元找回(retrieve)上一次呼叫指令所保留的程序计数器的计数值,并使程序流程退回至其所找回到的指令地址。早期的微处理器中,程控指令的执行并不会造成明显的延迟处理现象,这是因为早期微处理器的设计是每次只执行单一指令。若被执行的指令为一程控指令,则在其执行完毕前,微处理器便可知道该指令是否需要分支,且若其确定需要分支,微处理器也可知道该分支的目标地址。如此一来,下一个指令无论是否为接续,也无论其分支结果,指令的执行与提取自然不会有明显的延迟出现。然而现今的微处理器已不再如此单纯,在微理器内的不同的区块(block)与管线阶段(pipeline stage)中同时处理数个指令,对新一代的微处理器来说已是非常普遍且容易的。Hennessy与Patterson定义管线操作技术(pipelining)为“一种实用技术,可在执行时使多重指令重叠”,摘录自John L.Hennessy与David A.Patterson所著的Computer ArchitectureA Quantitative Approach,second edition(Morgan Kaufmann Publishers,San Francisco,Calif.,1996)。此外,作者还于下列的例子中阐明管线操作技术“管线(pipeline)就像一条生产线。在一条汽车的装配生产线上包括有许多步骤,于整个汽车的组装过程中,其每一个步骤均提供了相当的贡献。步骤与步骤之间是以并行的方式进行,即便在不同的汽车中也是如此。在计算机系统的管线中,其管线内的每一个步骤可完成一指令的某一部分。如同生产线一般,不同的步骤可并行地完成不同指令中的不同部分。其中每一个不同的步骤称为一个管道阶层(pipe stage)或称为管道分段(pipe segment)。而其中每个阶层均与下一个阶层相连以串成一管线,因此整个管线的流程为指令自一端输入,经过每一个阶层后再自另一端输出,正如同汽车于装配生产线的过程一般。”因此,当指令被提取后将被导入整个管线的其中一端。接着进入微处理器中进行各个管道阶层的运算,直到所有运算均结束为止。在此种管线结构的微处理器中,常无法预知一分支指令是否会改变整个程序流程,其往往需等到指令进入下一个阶层时才能确定。但此时微处理器早已提取其它指令,并已在执行管线中较前面阶层的其它指令了。若一分支指令真的导致了程序流程的改变,则该分支指令后续管线上的所有指令将会被放弃或清除(flushed)。此外,由该分支指令中的目标地址(target address)所记载的指令将必须被提取。只有此种放弃中间阶层指令,并由目标地址中提取指令的操作将会造成处理时的延迟现象。因此为了减轻此一延迟问题,许多管线结构的微处理器就在一管线内的前面阶层中使用分支预测机制,可预测分支指令的结果,并根据其分支预测结果提取下一个指令。若分支预测逻辑正确地预测到分支的结果,则整个流程可从其所提取的该分支的目标地址继续下去。然而,如果其预测结果是错的,则整个管线将必须重新清除(flush),并从前面的分支指令重新开始执行。这种因错误预测所造成管线重新清除的情况是不期望发生的,因其所造成的管线重新激活势必将造成一定程度的时间延误。如前所述,条件式或非条件式分支是由跳跃(jump)指令所执行。其中若跳跃指令所跳至的地址为同一个数据分段(data segment),则此跳跃指令称为近跳跃(near jumps),若其所跳至的地址为不同的数据分段,则此跳跃指令称为远跳跃(far jumps)。同理,若呼叫(call)的地址位于同一个数据分段,则此呼叫指令称为近呼叫(near calls),若是位于不同的数据分段,则此呼叫指令便称为远呼叫(far calls)。在旧的x86管线结构微处理器中,当一远跳跃(far jump)或远呼叫(far call)被执行时,其管线将被清除并重新填写(refilled)。这个清除的操作会减慢微处理器一定程度的操作效能。具体而言,远跳跃或远呼叫指令的执行时,需要将一新程序段描述符(code segment descriptor)加载微处理器的程序段描述符缓存器(code segment descriptor register)中。下面所述的名词远跳跃-呼叫(farjump-call)为远跳跃(far jump)与远呼叫(far call)指令的缩写。远跳跃-呼叫(farjump-call)指令可用来指定带有一偏移量的新程序段描述符(code segmentdescriptor)。此一程序段描述符(code segment descriptor)包括有一新的程序段基地址(code segment base address),而本文档来自技高网...
【技术保护点】
【技术特征摘要】
【专利技术属性】
技术研发人员:葛兰·柯尔,汤玛斯·麦当劳,
申请(专利权)人:智慧第一公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。