假想分支目标地址高速缓存分支的装置、系统及方法

文档序号:6578455阅读:605来源:国知局

专利名称::假想分支目标地址高速缓存分支的装置、系统及方法
技术领域
:本发明涉及微处理器(microprocessor)的分支预测(branchprediction)的
技术领域
,尤指分支目标地址(branchtargetaddress)的快取技术,特别涉及一种假想混合分支方向预测装置。
背景技术
:计算机指令一般都储存于内存内可寻址的相连位置。中央处理单元(CentralProcessingUnit,CPU)或处理器由相连的内存位置提取这些指令,并加以执行。CPU从内存每提取一个指令,其内的程序计数器(programcounter,简称PC)或指令指针(instructionpointer,简称IP)就会递增,使其内含序列(sequence)中下个指令的地址,此即为下个循序指令指针(nextsequentialinstructionpointer,简称NSIP)。指令的提取、程序计数器的递增以及指令的执行便通过内存呈线性持续进行,直到遇到程控指令(programcontrolinstruction)为止。程控指令也称为分支指令(branchinstruction),在执行时会改变程序计数器内的地址,并改变控制的流程。换言之,分支指令指定了改变程序计数器内容的条件。因执行一分支指令使程序计数器的值改变,会导致指令执行顺序的中断。这是数字计算机的一项重要特征,因为它提供对程序执行流程的控制,以及分支至程序的不同部分的能力。程控指令的例子包括跳转(jump)、条件跳转(conditionaljump)、调用(call)以及返回(return)。跳转指令使CPU无条件地将程序计数器的内容改变至一特定值,这个值就是程序要继续执行的指令所在的目标地址。条件跳转指令使CPU去测试一状态缓存器(statusregister)的内容,或者可能比较两个值,而后基于测试或比较的结果,不是继续循序执行就是跳转至一新地址,称为目标地址。调用指令使CPU无条件地跳转至一新目标地址,而且储存程序计数器的值以使CPU可返回至先前离开的程序位置。返回指令使CPU去撷取程序计数器于前次调用指令执行时所存的值,并使程序流程返回至所撷取的指令地址。对早期的微处理器而言,程控指令的执行并不会造成处理上显著的延迟,因为这些微处理器被设计为一次只执行一个指令。如果所执行的指令是程控指令,在执行完毕之前,微处理器会知道它是否要分支,而如果是的话,它会知道分支的目标地址为何。因此,不论下个指令是循序的,或是分支的结果,皆会被提取和执行。现代的微处理器则非如此单纯。相反地,对现代的微处理器来说,在微处理器的不同区块或流水线阶段(pipelinestage)内同时处理数个指令乃很平常的事。Hennessy与Patterson将流水线化(pipelining)定义为“一种多个指令得以重叠执行的实作技术。”(引述自ComputerArchitectureAQuantitativeApproach,2ndedition,byJohnL.HennessyandDavidA.Patterson,MorganKaufmannPublishers,SanFrancisco,CA,1996)作者接着对流水线化做了下列精彩的说明“一个流水线就像是条装配线。在汽车的装配线上,有许多步骤,每个步骤对汽车的制造都有所贡献。每个步骤与其它步骤同时并行,然而是在不同的汽车上进行。在一计算机流水线中,每个步骤完成一个指令的部分,就像装配线,不同的步骤并行地完成不同指令的不同部分。每个这些步骤称为一管道阶段(pipestage)或管道区段(pipesegment)。这些阶段一个连接着下一个,形成一个管道——指令从一端进入,历经这些阶段,然后从另一端出去,就像汽车在装配线上一样。”因此,当指令被提取时,就被导入流水线的一端。指令于微处理器中历史流水线阶段,直到执行完毕。在这种流水线化的微处理器中,一分支指令是否会改变程序流程,通常都得等它到达流水线的后期阶段才能得知。然而在这之前,微处理器已经提取了其它指令,且正于流水线的早期阶段执行。如果一分支指令改变了程序流程,所有在这分支指令之后进入流水线的指令都必须被丢弃。此外,则必须提取此分支指令的目标地址上的指令。丢弃已在执行中的指令及提取目标地址上的指令,会造成微处理器在处理上的延迟,称为分支惩罚(branchpenalty)。为减轻这种延迟问题,许多流水线化的微处理器在流水线的一早期阶段使用分支预测机制来预测分支指令。分支预测机制预测分支指令的结果或方向,即是否要进行分支。分支预测机制也预测分支指令的分支目标地址,即分支指令所要分支到的指令的地址。处理器接着就分支至所预测的分支目标地址,即依据分支预测提取后续的指令,这会比没有分支预测时来得早,因而若确定要进行分支,因此便降低了惩罚的可能性。这种用来快取先前所执行分支指令的目标地址的分支预测机制,称为分支目标地址高速缓存(branchtargetaddresscache,简称BTAC)或者分支目标缓冲器(branchtargetbuffer,简称BTB)。在一简单的BTAC或BTB中,当处理器对一分支指令进行译码后,处理器便提供分支指令的地址给BTAC。若该地址命中BTAC且预测分支会进行,处理器就可以利用BTAC中的快取目标地址开始提取目标地址的指令,而非下个循序(sequential)地址的指令。相较于只预测是否采用分支的预测装置,像是分支历史表(branchhistorytable,简称BHT),BTAC的好处是除了确定是否遇到一分支指令所需的时间外,它节省了计算目标地址所需的时间。典型的做法是分支预测数据(例如被采用/不被采用(taken/nottaken))随着目标地址皆储存于BTAC。BTAC运用于流水线的指令译码阶段,这是因为处理器必须先判断分支指令是否存在。处理器使用BTB的一个例子是IntelPentiumII与PentiumIII处理器。现请参阅图1,其绘示PentiumII/III处理器100相关部分的方块图。处理器100包括一BTB134,用来快取分支目标地址。处理器100从一指令高速缓存(instructioncache)102提取指令,该指令高速缓存102快取了指令108与前译码(pre-decoded)分支预测数据104。前译码分支预测数据104可能包括像是指令类型或指令长度这样的讯息。指令从指令高速缓存102提取,并送到指令译码逻辑(instructiondecodelogic)132,由其来译码或解译指令。一般是从下个循序提取地址112来提取指令。该下个循序提取地址112是由递增装置(incrementer)118将现行指令高速缓存102的提取地址122直接加上一指令高速缓存102的快取线的大小所得。然而,如果一分支指令已由指令译码逻辑132译码,接着控制逻辑(controllogic)114便选择性地控制一多工器(multiplexer)116选取BTB134所提供的分支目标地址,作为指令高速缓存102的提取地址122,而非选取下个循序提取地址112。控制逻辑114根据指令高速缓存102提供的前译码数据104以及BTB134预测该分支指令是否会被采用(依用来检索BTB134的指令指针138而定),来选取指令高速缓存102的提取地址122。PentiumII/III在检索BTB134时,并非通过分支指令本身的指令指针,而是利用先于被预测的分支指令的指令的指令指针138来进行。这使得BTB134在分支指令被译码的时,就能查询目标地址136。否则,在分支指令译码后,处理器100必须再等待BTB134的查询,才能进行分支,这样便多了此延迟的分支惩罚。一旦分支指令被指令译码逻辑132译码,且处理器100知道目标地址136的产生是基于确定有分支指令的存在,处理器100才会分支到BTB134根据指令指针138索引所提供的目标地址136。另一个使用BTAC的例子是AMDAthlon处理器。现请参阅图2,其绘示Athlon处理器200相关部分的方块图。处理器200包括与图1PentiumII/III编号类似的组件。Athlon处理器200将其BTAC整合进指令高速缓存202中。也就是,指令高速缓存202除了指令资料108与前译码分支预测数据104的外,还快取了分支目标地址206。对于每个指令字节对(instructionbytepair),指令高速缓存202保留了两个位作为预测分支指令的方向的用。指令高速缓存202在一快取线中,相当于每16个字节的指令即保留两个分支目标地址的空间。从图2可以看出,指令高速缓存202是由提取地址下个循序提取地址来作索引。因BTAC已整合进指令高速缓存202,所以也是由提取地址122来作索引。因此,指令高速缓存202的一快取线若有一命中发生,就可确定快取分支目标地址对应至存在于被检索的指令高速缓存202快取线中一分支指令。虽然现有的方法改进了分支预测,但仍有缺点。前述两种现有方法的一个缺点是,指令前译码数据以及Athlon例子中的分支目标地址大幅增加了指令高速缓存的大小。据推测,对Athlon而言,分支预测数据可能使指令高速缓存的大小加倍。此外,PentiumII/IIIBTB为每个分支指令储存了相当大量的分支历史数据,用以预测分支方向,因而也增加了BTB的大小。Athlon的整合式BTAC的一个缺点是,将BTAC整合进指令高速缓存会使空间的使用缺乏效率。也就是,整合式的指令高速缓存/BTAC对于分支指令以及非分支指令,皆须快取其分支指令数据,因而占用过多储存空间。在Athlon指令高速缓存中,许多由额外的分支预测数据所使用的空间是浪费掉的,这是因为指令高速缓存中分支指令的集中度相当低。例如,一特定的指令快取线中可能未包括任何分支,因此快取线中所有储存目标地址与其它分支预测数据的空间就没用到而浪费掉了。Athlon整合式的BTAC的另一个缺点是,设计目标间的冲突。也就是,关于指令高速缓存的大小,除了分支预测机制的设计目标外,可能有其它不同的设计目标会对此加以规定。以快取线而论,要求BTAC的大小要与指令高速缓存相同,是Athlon架构所固有的,但可能无法理想地达到两组设计目标。例如,可能选定了指令高速缓存的大小,以达成一特定的快取命中率(cache-hitratio)。然而,情况可能是,用比较小的BTAC,就可能达成所要的分支目标地址预测率(predictionrate)。再者,因为BTAC是整合在指令高速缓存中,获得快取分支目标地址所需的资料存取时间必然相同于获得快取指令字节。Athlon的例子中,指令高速缓存相当大,存取时间可能会相当长。较小的、非整合式BTAC的资料存取时间可能比整合式的指令高速缓存/BTAC要明显减少。由于PentiumII/IIIBTB并未整合在指令高速缓存中,PentiumII/III的方法不会遭遇前述Athlon整合式指令高速缓存/BTAC的问题。然而,由于在检索PentiumII/IIIBTB时,乃利用一已译码指令的指令指针,而非指令高速缓存的提取地址,所以PentiumII/III的解决方案于进行分支时可能无法像Athlon解决方案那样早,因此可能也无法那样有效地减少分支惩罚。PentiumII/III解决方案处理这个问题的方式是,使用一先前指令或先前指令群的指令指针,而非实际的分支指令指针,来检索BTB,如前所述。然而,PentiumII/III方法的一个缺点是,使用先前指令的指令指针而非实际的分支指令指针,会牺牲掉一些分支预测的准确度。准确度的降低,一部份是由于分支指令在程序中可能经由多个指令路径遭遇到。也就是,多个先于分支指令的指令可能因相同的分支指令而快取于BTB中。因此,为了这样一个分支指令,必须消耗掉BTB中多个项目(entry),于是就减少了BTB中可快取的分支指令总数。所用的先于分支指令的指令数量愈多,可到达分支指令的路径也愈多。除此之外,由于使用一先前的指令指针造成可能有多个路径到达同一个分支指令,PentiumII/IIIBTB中的方向预测装置可能需要更长的时间来“暖机”(warmup)。PentiumII/IIIBTB保持着分支历史数据,用以预测分支的方向。当一新的分支指令被引入处理器且快取住,到达该分支指令的多个路径可能会使分支历史在更新时,变得比只有单路径到达该分支指令的情形还慢,造成预测较不准确。因此,我们所需要的是,一种能有效利用芯片固有资源(chiprealestate),又能在流水线早期就提供准确分支的分支预测装置,以减少分支惩罚。
发明内容本发明的目的在于提供一种分支预测方法及装置,能有效利用芯片固有资源,又能在流水线早期就提供准确的分支,以减少分支惩罚。于是,为达到前述目的,本发明的一项特征是,在一微处理器中提供一种分支装置,利用一提取地址选取一指令高速缓存的一快取线。该装置亦使用该提取地址假想预测一分支指令是否将被采用(taken)。该分支指令可能潜在地(potentially)存在于该指令快取线中。该装置包括一第一预测装置(predictor),对应至该提取地址,以依据该提取地址预测该分支指令是否将被采用。该装置亦包括一逻辑,对应至该提取地址,以提供该提取地址与一全域分支历史(globalbranchhistory)的一二进制函数(binaryfunction)于此逻辑的一输出端。该装置亦包括一第二预测装置,对应至该逻辑的输出端,以依据该逻辑输出预测该分支指令是否将被采用。该装置亦包括一选择器(selector),对应至该提取地址,以依据该提取地址选取该第一与第二预测装置其中之一。另一方面,本发明的一项特征是,在一具有一指令高速缓存的流水线化微处理器中提供一种假想分支预测装置。该指令高速缓存接收一地址总线(addressbus)上的一提取地址,以选取该指令高速缓存的一快取线。一分支指令被假定存在于该快取线中。该装置包括一假想分支历史表(BHT),提供该分支指令的一第一方向预测。该装置亦包括一分支目标地址高速缓存(BTAC),对应至该地址总线,提供该分支指令的一第二方向预测,并提供一选择预测,用以在第一与第二方向预测间作选择。该装置亦包括一多工器,对应至该BHT与该BTAC,依据该选择预测选取第一与第二方向预测其中之一。第二方向预测系响应该提取地址而提供,即使该分支指令可能并不存在于该指令快取线中。另一方面,本发明的一项特征是,在一微处理器中提供一假想分支目标地址高速缓存(BTAC)。该BTAC包括一数组(array),以储存分支指令的方向预测。该BTAC亦包括一输入,对应至该数组,接收一指令高速缓存的提取地址。该提取地址检索该数组以选取方向预测其中之一。该BTAC亦包括一输出,对应至该数组,提供所选取的方向预测至分支控制逻辑(branchcontrollogic)。若所选取的方向预测指定一采用方向,则不管是否有一分支指令存在于提取地址所检索的指令高速缓存的一快取线中,该分支控制逻辑皆使微处理器进行假想分支。另一方面,本发明的一项特征是,提供一种用于假想分支的微处理器。该微处理器包括一指令高速缓存,以提供一地址总线上的一提取地址所选取的一指令字节线(lineofinstructionbytes)。该微处理器亦包括一假想分支历史表(BHT),对应至该地址总线,提供一分支指令是否将被采用的一第一预测,该分支指令被假定存在于该指令快取线。该第一预测系依据该提取地址与一全域分支历史的组合而提供。该微处理器亦包括一假想分支目标地址高速缓存(BTAC),对应至该地址总线,以提供该假定的分支指令的一第二预测,并提供一选择器。该微处理器亦包括控制逻辑,对应至该BHT与BTAC,若选择器所选取的第一与第二预测其中之一预测该假定的分支指令将被采用,则使微处理器进行假想分支。另一方面,本发明的一项特征是,提供一种在一微处理器中进行假想分支的方法。该方法包括产生一指令的数个假想分支方向预测,选取该数个假想分支方向预测的一作为一最后(final)方向预测,以及若该最后方向预测指出该指令将被采用,则使微处理器进行假想分支。该产生、选取以及假想分支的动作皆在译码该指令之前执行。另一方面,本发明的一项特征是,提供一种在一微处理器中进行假想分支的方法。该方法包括产生一分支指令是否将被采用的第一与第二预测,以响应于一指令高速缓存提取地址的第一与第二二进制函数。该方法亦包括选取该第一与第二预测其中之一作为一最后预测。该选取的动作是响应该提取地址的一第三二进制函数而执行。该方法亦包括若该最后预测指出该分支指令将被采用,则微处理器即进行假想分支。不论该分支指令是否存在于该提取地址所选取的一指令快取线中,该产生、选取以及假想分支的动作皆被执行。本发明的一项优点是,提供一种混合的方式,以对于混杂高度不相依(independent)与高度相依(dependent)的分支,假想地预测其分支方向,以改进假想分支的方向预测的准确性,用来降低整体的分支惩罚。本发明的其它特征与优点,在考察本说明书其余部分与附图后,将可更加明白。图1为PentiumII/III处理器先前技术的相关部分方块图。图2为Athlon处理器先前技术的相关部分方块图。图3为依本发明的流水线化微处理器的方块图。图4为依本发明图3处理器的假想分支预测装置。图5为图4的指令高速缓存的方块图。图6为依本发明图4分支目标地址高速缓存(BTAC)的方块图。图7为依本发明图4BTAC的图6项目的格式的方块图。图8为依本发明的图4假想分支预测装置的运作的流程图。图9为依本发明的图4假想分支预测装置使用图8步骤的一运作范例的方块图。图10为依本发明的图4假想分支预测装置侦测与更正错误的假想分支预测的运作流程图。图11为依本发明列举的程序代码片段及一表格,为说明图10假想分支预测错误的侦测与更正的一范例。图12为依本发明的图4分支预测装置包括一混合假想分支方向预测装置(hybridspeculativebranchdirectionpredictor)的另一具体实施例的方块图。图13为图4的双调用/返回堆栈(dualcall/returnstacks)的运作流程图。图14为说明图4分支预测装置选择性地以非假想分支预测来覆盖(override)假想分支预测,用来改进本发明的分支预测准确度的运作流程图。图15为本发明用以进行图4BTAC中目标地址置换工作装置的方块图。图16为依本发明图15装置的一运作方法的流程图。图17为本发明另一具体实施例绘示图15装置的一运作方式流程图。图18为依本发明的另一具体实施例绘示的用以进行图4BTAC中目标地址置换动作的装置方块图。图19为依本发明的另一具体实施例绘示的用以进行图4BTAC中目标地址置换动作的装置方块图。图号说明100PentiumII/III处理器102指令高速缓存104前译码分支预测数据108指令资料112下个循序提取地址114控制逻辑116多工器118递增装置122提取地址132指令译码逻辑134分支目标缓冲器136分支目标地址138指令指针200Athlon处理器202指令高速缓存206快取分支目标地址300流水线化微处理器302I-阶段304B-阶段306U-阶段308V-阶段312F-阶段314X-阶段316R-阶段318A-阶段322D-阶段324G-阶段326E-阶段328S-阶段332W-阶段342指令缓冲器344F-阶段指令序列346X-阶段指令序列352假想分支目标地址353假想返回地址354非假想分支目标地址355非假想返回地址356解析目标地址400假想分支预测装置402假想分支目标地址高速缓存(BTAC)404控制逻辑406假想调用/返回堆栈408预测检查逻辑412非假想分支方向预测装置414非假想调用/返回堆栈416非假想目标地址计算器418比较器422多工器424储存多工化/缓存器426递增装置428比较器432指令高速缓存434加法器436指令格式化与译码逻辑438假想分支(SB)位442更新信号444非假想分支方向预测446BEG位446AA项目的BEG位446BB项目的BEG位448LEN位452命中信号454假想分支数据(SBI)456ERR信号466下个循序指令指针(NSIP)468现行指令指针(CIP)472控制信号474比较器418的输出476比较器428的输出478控制信号481解析分支方向(DIR)482控制信号483控制信号484信号485比较器489的输出486FULL信号487比较器497的输出488返回地址489比较器491假想返回地址492指令译码数据493指令字节494指令字节快取线495提取地址496指令字节497比较器498储存多工化/缓存器424的输出499下个循序提取地址502转换参照缓冲器(TLB)504标志数组506数据数组508比较器512实际分页号码514实际标志518命中信号602BTAC402的项目602A项目602的A边602B项目602的B边604比较器606路选择多工器608A/B选择多工器612数据数组614标志数组616标志618控制信号622A/B选择信号624A项目626B项目702VALID位702AA项目的VALID位702BB项目的VALID位704CALL位706RET位708WRAP位712分支方向预测数据(BDPI)714分支目标地址722T/NT字段722AA项目的T/NT字段722BB项目的T/NT字段724SELECT位802-834假想分支的运作步骤1002--1054侦测与更正错误的假想分支预测的步骤1100依本发明列举的程序代码实例片段及一表格1200混合假想分支方向预测装置1202分支历史表(BHT)1204异或逻辑1206全域分支历史缓存器1208多工器1212分支方向结果1214信号1216异或逻辑1204的输出1218更新信号1222T/NT_A/B位1224T/NT位1302--1326双调用/返回堆栈的运作步骤1402--1432BTAC402选择性地以非假想分支预测来覆盖假想分支预测的运作步骤1502LastWritten缓存器1504A/BLRU位1506多工器1512更新IP1514信号1516读/写控制信号1602--1646A/B项目置换方法的步骤1716--1726另一实施例中A/B项目置换方法的衍生步骤1812额外的数组1902含LastWritten值与LastWrittenPrev值的缓存器1928信号具体实施例方式现请参阅图3,其绘示本发明的一流水线化微处理器300的方块图。处理器流水线300包括阶段302至阶段332。第一阶段是I-阶段302,或称指令提取阶段(instructionfetchstage)。在I-阶段302,处理器300提供提取地址至一指令高速缓存432(见图4),以提取指令供处理器300执行。指令高速缓存432在关于图4的部分时会更加详细地说明。在一具体实施例中,此指令高速缓存432是一双周期(two-cycle)高速缓存。B-阶段304是指令高速缓存432的存取的第二阶段。指令高速缓存432提供其资料至U-阶段306,在此阶段资料被闩锁住(latched)。U-阶段306提供指令高速缓存的资料至V-阶段308。在本发明中,处理器300还包括一BTAC402(见图4),在其余图标的部分会详细说明。BTAC402并未整合在指令高速缓存432。然而,在I-阶段302,BTAC402是与指令高速缓存432通过使用指令高速缓存432的提取地址495来平行地(inparallel)存取的(见图4),从而致能相当快速的分支以减少分支惩罚。BTAC402提供一假想分支目标地址352,而该地址则被提供至I-阶段302。处理器300选择性地选取目标地址352作为指令高速缓存432提取地址,以达成分支至假想目标地址352,这在其余图标的部分会详加说明。有利地,从图3可以看出,在U-阶段306,由BTAC402所提供的分支目标地址352能使处理器300在流水线300的相当早期就进行分支,如此仅产生一双周期的指令泡沫(instructionbubble)。即,若处理器300分支至假想目标地址352,只有两个阶段的指令必须被清除。换言之,在两个周期内,典型的情况下,于U-阶段306就可得知分支的目标指令,即,如果这些目标指令存在于指令高速缓存432中。有利地,在多数情况下,双周期的指令泡沫够小,可以由一指令缓冲器342、F-阶段指令序列344及/或X-阶段指令序列346来加以吸收,此将说明于后。因此,在许多情形下,假想BTAC402使处理器300能达到零惩罚的分支。处理器300还包括一假想调用/返回堆栈406(见图4),在关于图4、图8与图13的部分有详细说明。假想调用/返回堆栈406与假想BTAC402协同运作,以产生一假想返回地址353,即,提供至I-阶段302的返回指令的目标地址。处理器300选择性地选取假想返回地址353作为指令高速缓存432提取地址,以达成分支至假想返回地址353,就如关于图8部分所详细说明的。在V-阶段308,指令被写入指令缓冲器342。指令缓冲器342暂存指令以提供至F-阶段312。V-阶段308亦包括译码逻辑,以提供关于指令字节的数据给指令缓冲器342,像是x86前置(prefix)与modR/M数据,以及指令字节是否为分支运算码值(branchopcodevalue)。F-阶段312,或称指令格式化阶段(instructionformatstage)312,包括指令格式化与译码逻辑436(见图4)以格式化指令。最好(preferably)处理器300是一x86处理器,其指令集(instructionset)可容许不同长度的指令。指令格式化逻辑436从指令缓冲器342接收指令字节流(stream),并将该指令字节流解析成分离的字节群,每个群构成一x86指令,尤其还提供每个指令的长度。F-阶段312也包括分支指令目标地址计算逻辑(branchinstructiontargetaddresscalculationlogic)416,依据一指令译码产生一非假想分支目标地址354,而不是假想地依据指令高速缓存432提取地址来产生,如在I-阶段302BTAC402所作的。F-阶段312亦包括一调用/返回堆栈414(见图4),依据一指令译码产生一非假想返回地址355,而不是假想地依据指令高速缓存432提取地址来产生,如在I-阶段302BTAC402所作的。F-阶段312非假想地址354与355被送至I-阶段302。处理器300选择性地选取F-阶段312非假想地址354或355作为指令高速缓存432提取地址,以达成分支至地址354或355两者之一,就如下文所详细说明的。F-阶段指令序列344接收格式化的指令。格式化指令由F-阶段指令序列344送至X-阶段314中一指令转换器(instructiontranslator)。X-阶段314,或称转换阶段314,指令转换器将x86巨指令(macroinstruction)转换成微指令(microinstruction),让其余的流水线阶段可加以执行。X-阶段314将转换过的微指令送至X-阶段指令序列346。X-阶段指令序列346将转换过的微指令送至R-阶段316,或称缓存器阶段316。R-阶段316包括使用者可见(user-visible)的x86缓存器集合,以及非使用者可见的缓存器。微指令的指令操作数(operand)存于R-阶段316缓存器,供流水线300的后续阶段执行微指令。A-阶段318,或称地址阶段(addressstage)318,包括地址产生逻辑(addressgenerationlogic),从R-阶段316接收操作数与微指令,并产生微指令所需的地址,像是用以加载/储存的内存地址。D-阶段322,或称资料阶段(datastage)322,包括存取资料的逻辑,该资料由A-阶段318产生的地址所指定。特别是,D-阶段322包括一资料高速缓存,用来快取处理器300内从系统内存而来的数据。在一具体实施例中,数据高速缓存是双周期高速缓存。G-阶段324是资料高速缓存存取的第二阶段,而在E-阶段326,可取得资料高速缓存的资料。E-阶段326,或称执行阶段(executionstage)326,包括执行逻辑(executionlogic),像是算数逻辑单元(arithmeticlogicunit),依据先前阶段提供的资料及操作数执行微指令。特别是,E-阶段326会产生BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速缓存432快取线中所有分支指令的解析(resolved)目标地址356。即,E-阶段326目标地址356被认为是所有分支指令的正确目标地址,所有预测的目标地址必须与其匹配。此外,E-阶段326产生一所有分支指令的解析方向(DIR)481(见图4)。S-阶段328,或称储存阶段(storestage)328,从E-阶段326接收微指令的执行结果,将其储存至内存。此外,还将E-阶段326所计算的分支指令的目标地址356在I-阶段302时从S-阶段328送至指令高速缓存432。再者,I-阶段302的BTAC402通过从S-阶段328而来的分支指令的解析目标地址来予以更新。此外,在BTAC402的其它假想分支数据(speculativebranchinformation,简称SBI)454(见图4)亦从S-阶段328来更新。假想分支数据454包括分支指令长度,在一指令高速缓存432快取线内的位置,分支指令是否涵盖多条指令高速缓存432快取线,分支是否为一调用或返回指令,以及用来预测分支指令的方向的数据,如关于图7的部分所描述的。W-阶段332,或称回写阶段(write-backstage),将S-阶段328处理的结果回写入R-阶段316缓存器,用来更新处理器300的状态。指令缓冲器342、F-阶段指令序列344以及X-阶段指令序列346除了别的功能外,还能将分支对于处理器300每个指令值的脉冲所造成的冲击减至最小。现请参阅图4,其绘示依本发明图3处理器300的一假想分支预测装置400。处理器300包括指令高速缓存432,以快取来自系统内存的指令字节496。指令高速缓存432由提取地址总线上的提取地址495来寻址,对指令高速缓存432内一快取线作检索。最好(preferably)提取地址495包括一32位的虚拟地址。即,提取地址495并非指令的物理内存地址(physicalmemoryaddress)。在一具体实施例中,虚拟提取地址495是一x86线性(linear)指令指针。在一具体实施例中,指令高速缓存432具有32个字节的宽度;因此,只用到提取地址495之前27个位来检索指令高速缓存432。一选定的指令字节快取线494则由指令高速缓存432输出。指令高速缓存432在接下来图5部分会更详细地说明。现请参照图5,其绘示图4指令高速缓存432的一具体实施例的方块图。指令高速缓存432包括用来将图4的虚拟提取地址495转换成实际地址的逻辑(图上未显示)。指令高速缓存432包括一转换参照缓冲器(translationlookasidebuffer,简称TLB)502,以快取先前转换逻辑从虚拟提取地址495转换的实际地址。在一具体实施例中,TLB502接收虚拟提取地址495的位[3112],当虚拟提取地址495命中TLB502时,则输出一对应的20位的实际分页号码(physicalpagenumber)512。指令高速缓存432包括一快取指令字节的数据数组506。资料数组506配置成数条快取线,以虚拟提取地址495的一部份来作索引。在一具体实施例中,数据数组506储存了64KB的指令字节,其以32个字节的快取线来配置。在一具体实施例中,指令高速缓存432是一四路集合关联高速缓存(4-waysetassociativecache)。因此,资料数组506包括512条指令字节线,以提取地址495的位[135]来作索引。虚拟提取地址495所选取的指令字节线494,由指令高速缓存432输出至指令缓冲器342,如图4所示。在一具体实施例中,一次将选定的指令字节线的一半送至指令缓冲器342,即,分成两周期,每周期送16个字节。在本说明书中,快取线或指令位线可用以指称由提取地址495于指令高速缓存432内所选定的一快取线的部分,像是半快取线(half-cacheline)或其它再细分的部分。指令高速缓存432亦包括一快取标志的标志数组(tagarray)504。标志数组504,如同数据数组506,皆由虚拟提取地址495的相同位来作索引。实际地址的位快取于标志数组504,作为实际标志。由提取地址495位选定的实际标志514则送至标志数组504的输出端。指令高速缓存432亦包括一比较器508,将实际标志514与TLB502所提供的实际分页号码512作比较,以产生一命中信号(hitsignal)518,指明虚拟提取地址495是否命中指令高速缓存432。命中信号518真正指出了是否有快取现行的工作指令(taskinstruction),因为指令高速缓存432将虚拟提取地址495转换为一实际地址,并用此实际地址来测定是否有命中。前述指令高速缓存432的运作与BTAC402的运作成对比,后者仅依虚拟地址,即提取地址495,来测定是否命中,而非依据实际地址。此种运作上不同所造成的结果是,虚拟别名化(virtualaliasing)可能会发生,以致于BTAC402产生错误的目标地址352,如下所述。请再参阅图4,图3的指令缓冲器342从指令高速缓存432接收快取线的指令字节494并予以缓冲,直至其被格式化与转换为止。如前文关于图3的V-阶段308所述,指令缓冲器342也储存了其它分支预测的相关数据,像是x86前置与modR/M数据,以及指令字节是否为分支运算码值。此外,指令缓冲器342为其内所存的每个指令字节储存了一假想分支(speculativelybranched,简称SB)位。如果处理器300假想地分支至BTAC402所提供的假想目标地址352或假想返回地址353,其由假想调用/返回堆栈406依据快取于BTAC402中的SBI454所提供,则设定SBI454所指出的指令字节的SB位438。也就是,如果处理器300进行假想分支是基于如下假设在指令高速缓存432提供的指令字节线494中有一分支指令存在,而其SBI454快取于BTAC402中,则设定存于指令缓冲器342的指令字节494其中之一的SB位438。在一具体实施例中,则是针对SBI454所指出假定的分支指令的运算码字节,设定其SB位438。指令译码逻辑436从指令缓冲器342接收指令字节493(包括分支指令字节)以将其译码,产生指令译码数据492。指令译码数据492用来进行分支指令预测,以及侦测与更正错误的假想分支。指令译码逻辑436提供指令译码数据492至流水线300的后段。此外,指令译码逻辑436在译码现行指令时,会产生下个循序指令指针(NSIP)466以及现行指令指针(currentinstructionpointer,CIP)468。此外,指令译码逻辑436提供指令译码数据492至非假想目标地址计算器(non-speculativetargetaddresscalculator)416、非假想调用/返回堆栈414以及非假想分支方向预测装置(non-speculativebranchdirectionpredictor)412。最好(preferably)非假想调用/返回堆栈414、非假想分支方向预测装置412以及非假想目标地址计算器416属于流水线300的F-阶段312。非假想分支方向预测装置412产生一分支指令方向的非假想预测444,即是否要进行分支,以响应从指令译码逻辑436接收的指令译码数据492。最好(preferably)非假想分支方向预测装置412包括一个或更多分支历史表,以储存已执行的分支指令的解析方向的历程。最好(preferably)分支历史表连同由指令译码逻辑436提供的分支指令本身的译码数据,用于预测条件分支指令的方向。非假想分支方向预测装置412的一个示范实施例详述于美国专利申请序号09/434,984HYBRIDBRANCHPREDICTORWITHIMPROVEDSELECTORTABLEUPDATEMECHANISM,具有一共同申请人,通过参考此案可并入本发明。最好(preferably)最后解析出分支指令方向的逻辑属于流水线300的E-阶段326。非假想调用/返回堆栈414产生图3的非假想返回地址355,以响应从指令译码逻辑436接收的指令译码数据492。除了别的以外,指令译码数据492还指明现行译码的指令是否为调用指令、返回指令或两者皆否。此外,如果正由指令译码逻辑436译码的指令为一调用指令,指令译码数据492还会包括一返回地址488。最好(preferably)返回地址488包括现行译码的调用指令的指令指针加上调用指令的长度所得的值。当指令译码数据492显示现行译码的指令为一调用指令时,返回地址488会被推入非假想调用/返回堆栈414,如此在指令译码逻辑436进行后续返回指令的译码时,返回地址488就能做为非假想返回地址355。非假想调用/返回堆栈414的一个示范实施例详述于美国专利申请序号09/271,591METHODANDAPPARATUSFORCORRECTINGANINTERNALCALL/RETURNSTACKINAMICROPROCESSORTHATSPECULATIVELYEXECUTESCALLANDRETURNINSTRUCTIONS,具有一共同申请人,通过参考此案可并入本发明。非假想目标地址计算器416产生图3的非假想目标地址354,以响应从指令译码逻辑436接收的指令译码数据492。最好(preferably)非假想目标地址计算器416包括一算数逻辑单元,以计算程序计数器相关(PC-relative,下文称PC相关)类型或直接类型(directtype)分支指令的分支目标地址。最好(preferably)算数逻辑单元将分支指令的长度与一指令指针加到内含于分支指令的一带正负号的位移量(signedoffset),来计算PC相关类型分支指令的目标地址。最好(preferably)非假想目标地址计算器416包括一相当小的分支目标缓冲器(BTB),以快取间接类型(indirecttype)分支指令的分支目标地址。非假想目标地址计算器416的一个示范实施例详述于美国专利申请序号09/438,907APPARATUSFORPERFORMINGBRANCHTARGETADDRESSCALCULATIONBASEDONBRANCHTYPE,具有一共同申请人,通过参考此案可并入本发明。分支预测装置400包括假想分支目标地址高速缓存(BTAC)402。BTAC402通过提取地址总线上的提取地址495进行寻址,检索BTAC402内一快取线。BTAC402并未整合在指令高速缓存432,而是分离且不同于指令高速缓存432,如图所示。也就是,BTAC402与指令高速缓存432在实际上与概念上皆有所区别。BTAC402与指令高速缓存432实际上的区别,在于两者在处理器300内处于不同的空间位置。BTAC402与指令高速缓存432概念上的区别,在于两者具有不同的大小,即在一具体实施例中,它们包括不同数量的快取线。BTAC402与指令高速缓存432概念上的区别,也在于指令高速缓存432将提取地址495转换成实际地址,以决定指令字节线的命中与否;BTAC402却以虚拟提取地址495作为一虚拟地址来作索引,而没有将其转换为实际地址。最好(preferably)BTAC402属于流水线300的I-阶段302。BTAC402快取了先前执行分支指令的目标地址。当处理器300执行一分支指令时,该分支指令的解析目标地址通过更新信号442快取于BTAC402。该分支指令的指令指针1512(见图15)用来更新BTAC402,如下文关于图15部分所描述的。为了产生图3的快取分支目标地址352,BTAC402连同指令高速缓存432皆由指令高速缓存432的提取地址495平行地(inparallel)检索。BTAC402响应提取地址495而提供假想分支目标地址352。最好(preferably)提取地址495的32个位全都用来从BTAC402选取假想目标地址352,如下文将更详细叙述的,主要是关于图6到图9的部分。假想分支目标地址352被送至包括一多工器422的地址选择逻辑422。多工器422从数个地址(包括BTAC402目标地址352)中选取提取地址495,下文将会予以讨论。多工器422输出提取地址495至指令高速缓存432与BTAC402。若多工器422选取了BTAC402目标地址352,接着处理器300便会分支到BTAC402目标地址352。也就是,处理器300将开始从指令高速缓存432提取位于BTAC402目标地址352的指令。在一具体实施例中,BTAC402比指令高速缓存432还小。特别是,BTAC402快取目标地址所用的快取线数量比指令高速缓存432所含的还少。BTAC402未整合在指令高速缓存432的结果是(虽然使用指令高速缓存432的提取地址495作为索引),若处理器300分支至BTAC402所产生的目标地址352,它是以假想方式进行的。此分支是假想的,乃因根本无法确定在所选定的指令高速缓存432快取线中,是否有一分支指令存在,更别说是目标地址352因的而被快取的分支指令了。命中BTAC402仅表示一分支指令先前存在于提取地址495所选取的指令高速缓存432快取线中。之所以无法确定一分支指令是否存在于所选取的快取线中,至少有两个理由。无法确定一分支指令是否在提取地址495所检索的指令高速缓存432快取线中,其第一个理由是提取地址495是一虚拟地址;因此,虚拟别名化可能会发生。也就是,两个不同的实际地址可能对应到相同的虚拟提取地址495。一给定的提取地址495,其为虚拟的,可能转换成两个不同的实际地址,这两个地址关联于一多工(multitasking)处理器(像是处理器300)的两个不同行程或工作。指令高速缓存432利用图5的转换参照缓冲器502执行虚拟到实际的转换工作,以提供准确的指令资料。然而,BTAC402依据虚拟提取地址495执行其查询工作,而没有执行虚拟到实际地址的转换工作。通过BTAC402避免虚拟到实际地址的转换工作是有利的,因为比起有执行虚拟到实际地址转换工作的情形,它使假想分支能更快速地执行。执行工作转换的操作系统,提供了虚拟别名化情形可能会发生的一个例子。在工作转换之后,处理器300会从指令高速缓存432提取位于关联新行程的虚拟提取地址495的指令,该关联新行程的虚拟提取地址495等同于关联旧行程的虚拟提取地址495,而旧行程则包括一分支指令,其目标地址快取于BTAC402。指令高速缓存432会依据从虚拟提取地址495转换的实际地址来产生新行程的指令,如上文关于图5部分所描述的;然而,BTAC402会只用虚拟提取地址495以产生旧行程的目标地址352,因而造成一错误的分支。有利的是,错误的假想分支只会在新行程的指令第一次执行时发生,此因在发现错误后,BTAC402目标地址352将变为无效,如下文关于图10部分说明的。因此,分支到BTAC402目标地址352是假想的,乃因在有些情况下,由于分支指令并不存在于指令高速缓存432的提取地址495(例如,因为虚拟别名化的关系),处理器300将分支至BTAC402所产生的不正确的目标地址352。相反地,从这方面来看前述图2的Athlon整合式BTAC/指令高速缓存202以及图1的PentiumII/III分支目标缓冲器134,就是非假想性的。尤其,Athlon的方法因为在分支指令字节108旁并列储存了图2的目标地址206而假设虚拟别名化并未发生,所以是非假想性的。也就是,AthlonBTAC202的查询工作是基于实际地址来执行的。PentiumII/III的方法,则因分支目标缓冲器134只在从指令高速缓存102提取分支指令以及指令译码逻辑132确定有一分支指令存在后,才产生一分支目标地址136。此外,非假想目标地址计算器416、非假想调用/返回堆栈414以及非假想分支方向预测装置412也是非假想性的,此因它们只在从指令高速缓存432提取分支指令以及由指令译码逻辑436译码后,才产生分支预测,如下文将要说明的。应该了解到,虽然非假想分支方向预测装置412所产生的方向预测444是“非假想性的”,即是在一分支指令已由指令译码逻辑436译码并确定该分支指令存在于现行指令流的情况下产生,非假想方向预测444仍是一“预测”。也就是,如果分支指令是条件分支指令,像是x86JCC指令,则在分支指令的任何既定的执行中,分支可能会进行,也可能不会。相类似地,非假想目标地址计算器416所产生的目标地址354以及非假想调用/返回堆栈414所产生的返回地址355也是非假想性的,因为这些地址是在确定有一分支指令存在于现行指令流的情况下而产生;尽管如此,它们仍然是预测。例如,以通过内存进行的x86间接跳转而言,自前次执行间接跳转以来,内存内容可能已有改变。如此,目标地址可能随的改变。因此,在本说明书中,就分支方向而言,“非假想的”不能与“无条件的”相混淆;就目标地址而言,“非假想的”则不能与“确定的”(certain)相混淆。无法确定一分支指令是否在提取地址495所检索的指令高速缓存432快取线中,其第二个理由是自我修改码(self-modifyingcode)的存在。自我修改码可能会改变指令高速缓存432的内容,但这改变并不会反映在BTAC402中。因此,一先前包括分支指令的指令高速缓存432快取线可能命中了BTAC402,但此分支指令已被修改或置换为不同的指令。分支预测装置400亦包括假想调用/返回堆栈406。假想调用/返回堆栈406储存返回指令的假想目标地址。假想调用/返回堆栈406因应控制逻辑404产生的控制信号483,产生图3的假想返回地址353。假想返回地址353被送至多工器422的一输入。当多工器422选取了假想调用/返回堆栈406所产生的假想返回地址353,处理器300便分支至假想返回地址353。当BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速缓存432快取线中时,控制逻辑404会产生控制信号483,以控制假想调用/返回堆栈406来提供假想返回地址353。最好(preferably)当所选取的BTAC402项目602的VALID702与RET706位(见图7)被设定,且BTAC402命中信号452显示已命中BTAC402标志数组614时,则BTAC402指出一返回指令可能存在于由提取地址495指定的指令高速缓存432快取线中。BTAC402响应提取地址495而产生命中信号452以及假想分支数据(SBI)454。命中信号452显示提取地址495命中了BTAC402的一快取标志,此于下文关于图6的部分说明。SBI454也会在下文关于图6部分作更详尽的说明。SBI454包括一BEG446信号(指令高速缓存432一快取线内的分支指令起始字节位移量(beginningbyteoffset))与一LEN448信号(分支指令长度)。BEG446的值、LEN448的值与提取地址495由加法器434予以加总,而产生返回地址491。返回地址491由加法器434输出至假想调用/返回堆栈406,如此返回地址491就能被推入假想调用/返回堆栈406。控制逻辑404通过信号483与BTAC402协同运作,将返回地址491推入假想调用/返回堆栈406。只有在所选定的BTAC402项目602的VALID702与CALL704位(见图7)被设定且命中信号452显示已命中BTAC402的标志数组614(见图6)时,返回地址491才会被推入堆栈。假想调用/返回堆栈406的运作方式在后文关于图8与图13部分会更详细地说明。分支预测装置400也包括控制逻辑404。控制逻辑404通过控制信号478控制多工器422,以选取数个地址输入之一,作为提取地址495。控制逻辑404也通过信号482设定指令缓冲器342中的SB位438。控制逻辑404接收命中信号452、SBI454、来自非假想分支方向预测装置412的非假想分支方向预测444以及来自指令缓冲器342的FULL信号486。分支预测装置400亦包括预测检查逻辑408。预测检查逻辑408产生一ERR信号456,其被送至控制逻辑404,以指出已依据一BTAC402的命中而执行一错误的假想分支,如后文关于图10部分所描述的。预测检查逻辑408通过信号484从指令缓冲器342接收SB位438,信号484亦被送至控制逻辑404。预测检查逻辑408也从BTAC402接收SBI454。预测检查逻辑408也从指令译码逻辑436接收指令译码数据492。预测检查逻辑408也接收图3E-阶段326所产生的解析分支方向DIR481。预测检查逻辑408也接收比较器489的输出485。比较器489将BTAC402产生的假想目标地址352与图3E-阶段产生的解析目标地址356作比较。BTAC402产生的假想目标地址352被存于缓存器,并顺着指令流水线300而下至比较器489。预测检查逻辑408也接收比较器497的输出487。比较器497将假想调用/返回堆栈406产生的假想返回地址353与解析目标地址356作比较。假想返回地址353被存于缓存器,并顺着指令流水线300而下至比较器497。BTAC402的假想目标地址352被存于缓存器,并顺着指令流水线300而下,由比较器428将其与非假想目标地址计算器416的目标地址354作比较。比较器428的输出476被送至控制逻辑404。相类似地,假想调用/返回堆栈406产生的假想返回地址353也被存于缓存器,并顺着指令流水线300而下,由比较器418将其与非假想返回地址355作比较。比较器418的输出474亦被送至控制逻辑404。分支预测装置400亦包括一储存多工化/缓存器(savemultiplexed/register,以下简称savemux/reg)424。savemux/reg424由控制逻辑404所产生的控制信号472来控制。savemux/reg424的输出498作为多工器422的一个输入。savemux/reg424接收自己的输出498以及BTAC402的假想目标地址352作为输入。多工器422亦接收S-阶段328的分支地址356作为其输入。多工器422也接收提取地址495本身作为输入。多工器422亦接收由递增装置426产生的下个循序提取地址499,递增装置426接收提取地址495,并递增其值至指令高速缓存432的下条循序快取线。现请参照图6,其为依本发明绘示的图4BTAC402的方块图。在图6所示的具体实施例中,BTAC402包括一四路集合关联高速缓存。BTAC402包括一数据数组612与一标志数组614。资料数组612包括储存组件的数组,以储存快取分支目标地址与假想分支数据的项目。标志数组614包括一储存组件的数组,以储存地址标志。数据数组612与标志数组614各自皆配置成四路,图标为路0、路1、路2以及路3。最好(preferably)数据数组612的每一路储存两个快取分支目标地址与假想分支数据的项目,称为A与B。由此,每次读取资料数组612时,就会产生八个项目602。此八个项目602被送至一八对二路选择多工器(wayselectmux)606。数据数组612与标志数组614皆由图4指令高速缓存432的提取地址495来作索引。提取地址495的较低有效位(significantbit)选定了数组612与614内各一条快取线。在一具体实施例中,每个数组包括了128条快取线。因此,BTAC402能够快取多达1024个目标地址(128条快取线的每条具四个路,每路可储存两个目标地址)。最好(preferably)数组612与614是通过提取地址495的位[115]来作索引。标志数组614为每路产生一标志616。最好(preferably)每个标志616包括虚拟地址的20个位,且四个标志616的每一个皆由比较器604将其与提取地址495的位[3112]作比较。比较器604产生图4的命中信号452,其依据是否有一标志616与提取地址495的最高有效位相匹配,以指出是否有命中BTAC。命中信号452被送至图4的控制逻辑404。此外,比较器604产生控制信号618,以控制路选择多工器606。路选择多工器606因而在BTAC402产生的快取线中,选取四个路之一的A项目624与B项目626。将A项目624与B项目626送至A/B选择多工器608以及控制逻辑404。控制逻辑404因应命中信号452、A项目624与B项目626、提取地址495及其它控制信号而产生一控制信号622,来控制A/B选择多工器608。A/B选择多工器608便选取A项目624或B项目626两者之一作为图3BTAC402的目标地址352及图4的SBI454。BTAC402最好(preferably)是一单端口(single-ported)高速缓存。单端口高速缓存的优点是尺寸上比较小,因而比起双端口(dual-ported)高速缓存,在同样大小的空间中能够快取更多的目标地址。然而,双端口高速缓存的考虑是使同时地读写BTAC402变得容易。双端口BTAC402所具备的可同时读写的特征,由于更新写入的动作不需等待读取动作,使得BTAC402的更新能更快速地进行。一般而言更快速的更新可得到更正确的预测,此因BTAC402内的数据是更为现时的(current)。在一具体实施例中,指令高速缓存432内每条快取线包括32个字节。然而,指令高速缓存432有时会提供指令字节的半快取线494。在一具体实施例中,BTAC402的每条快取线储存了两个项目602,因而包括了两个目标地址714,用于指令高速缓存432的每条半快取线。现请参阅图7,其为依本发明绘示图4BTAC402的图6项目602的格式方块图。项目602包括了图4的SBI(假想分支数据)454与一分支目标地址(TA)714。SBI454包括一VALID位702、图4的BEG446与LEN448、一CALL位704、一RET位706、一WRAP位708以及分支方向预测数据(BDPI)712。在图3的流水线300执行一分支后,该分支的解析目标地址即被快取于TA字段(field)714,而译码与执行分支指令所得的SBI454则被快取于BTAC402的项目602的SBI454字段中。VALID位702指出了项目602是否可用于将处理器300假想分支至关联的目标地址714。特别是,VALID位702最初是处于清除状态,此因BTAC402由于未快取任何有效的目标地址而是空的。当处理器300执行一分支指令,且与该分支指令关联的解析目标地址与假想分支数据被快取于项目602时,VALID位702就被设定。之后,如果BTAC402依据项目602作了错误的预测,VALID位702就被清除,如下文关于图10部分所述。BEG字段446指定了指令高速缓存432的一快取线内分支指令的起始字节位移量。在侦测到有一调用指令命中BTAC402时,BEG字段446被用来计算一返回地址,以储存于图4的假想调用/返回堆栈406。此外,BEG字段446被用来确定所选取BTAC402路的图6项目A624或项目B626两者中哪一个导致了BTAC402的命中,如下文关于图8部分所述。最好(preferably)由项目A624与项目B626所指定的分支指令位置,在指令高速缓存432的快取线内不需有任何特定的顺序。也就是,在指令高速缓存432的快取线中,项目B626的分支指令可能还早于项目A624的分支指令。LEN448字段指出分支指令字节的长度。在侦测到一调用指令命中BTAC402时,LEN448字段被用来计算一返回地址,以储存于图4的假想调用/返回堆栈406。CALL位704指出所快取的目标地址714是否关联到一调用指令。也就是,如果一调用指令由处理器300执行,且该调用指令的目标地址快取于项目602,则CALL位704将被设定。RET位706指出所快取的目标地址714是否关联到一返回指令。也就是,如果一返回指令由处理器300执行,且该返回指令的目标地址快取于项目602,则RET位706将被设定。WRAP位708在分支指令字节横跨两条指令高速缓存432的快取线时,会被设定。在一具体实施例中,WRAP位708在分支指令字节横跨两条指令高速缓存432的半快取线时,会被设定。BDPI(分支方向预测数据)字段712包括一T/NT(taken/nottaken,即采用/不采用)字段722与一SELECT位724。T/NT字段722包括分支的方向预测,即,它指明了分支是预测会采用或不会采用。最好(preferably)T/NT字段722包括一两位的上/下数饱和计数器(up/downsaturatingcounter),用以指定四种状态极可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)与极可能不采用(strongnottaken)。在另一实施例中,T/NT字段722包括单一T/NT位。SELECT位724用来在下列两者中作一选择BTAC402T/NT方向预测722与由BTAC402的外的分支历史表(BHT)(见图12)所做的方向预测,如关于图12部分所述。在一具体实施例中,如果在分支执行后,所选定的预测装置(即,BTAC402或BHT1202)准确地预测了方向,SELECT位724就不会更新。然而,如果所选定的预测装置没有准确地预测方向而另一个预测装置正确地预测方向,SELECT位724就会更新,以指明是非选定的预测装置,而不是所选定的预测装置。在一具体实施例中,SELECT位724包括一两位的上/下数饱和计数器,用以指定四种状态极可能是BTAC(stronglyBTAC)、有可能是BTAC(weaklyBTAC)、有可能是BHT(weaklyBHT)与极可能是BHT(strongBHT)。在此实施例中,如果在分支执行后,所选定的预测装置(即,BTAC402或BHT1202)准确地预测了方向,饱和计数器即朝所选定的预测装置来计数。如果所选定的预测装置没有准确地预测方向而另一个预测装置正确地预测方向,饱和计数器即朝非选定的预测装置来计数。现请参照图8,其为依本发明绘示的图4假想分支预测装置400的运作流程图。图4的BTAC402由图4的提取地址495作索引。因此,图6的BTAC402比较器604响应图6的BTAC402标志数组614的虚拟标志616,以产生图4的命中信号452。在步骤802中,图4的控制逻辑404检查命中信号452,以确定提取地址495是否命中BTAC402。如果BTAC402的命中并未发生,则在步骤822中控制逻辑404便不进行假想分支。也就是,控制逻辑404通过图4的控制信号478控制多工器422,以选取除了BTAC402的目标地址352与假想调用/返回堆栈406的返回地址353外的一个输入。然而,如果BTAC402的命中确实发生,在步骤804中,控制逻辑404便会确定图6的A项目624是否有效,被看见(seen)与被采用(taken)。若图7VALID位702被设定,控制逻辑404便确定项目624为“有效的”。如果VALID位702被设定,由提取地址495所选取的指令高速缓存432快取线就被假定为包括一分支指令,而该分支指令的分支预测数据则已先快取于A项目624;然而,如上文所讨论的,并不确定所选取的指令高速缓存432快取线包括有分支指令。若项目A624的T/NT字段722指出,所假定的分支指令方向预期会被采用,则控制逻辑404便确定项目624“被采用”(taken)。在下述图12的具体实施例中,若所选取的方向指示装置(directionindicator)指出,所假定的分支指令方向预期会被采用,则控制逻辑404便确定项目624“被采用”。若图7的BEG字段446大于或等于提取地址495相对应的最低有效位(leastsignificantbits),则控制逻辑404便确定项目624“被看见”(seen)。也就是,BEG字段446与提取地址495相对应的最低有效位作比较,以决定下个指令提取的位置是否位在指令高速缓存432中对应于A项目624的分支指令位置之前。例如,假设A项目624的BEG字段446包括一数值3,而提取地址495的较低位值为8。在这种情况下,可能就不会因此提取地址495分支至A项目624的分支指令。因此,控制逻辑404将不会假想分支至A项目624的目标地址714。这在提取地址495是分支指令的目标地址时特别有关系。若A项目624是有效的、预期会被采用且被看见,在步骤806中,控制逻辑404会检查图6的B项目626是否为有效、被看见与采用。控制逻辑404是以类似于步骤804对A项目624所用的方式,来决定B项目626是否为有效、被看见与采用。若A项目624是有效的、预期会被采用且被看见,但B项目626不是有效的、预期不被采用或者不被看见,则在步骤812中,控制逻辑404检查图7的RET字段706,以决定A项目624是否已快取返回指令的数据。若RET位706未被设定,则在步骤814中,控制逻辑404控制图6的A/B多工器608以选取项目A624,并通过控制信号48控制多工器422,以假想分支至目标地址信号352所提供的BTAC402项目A624的目标地址714。相反地,若RET位706指出,在提取地址495所选取的指令高速缓存432快取线中,可能存在一返回指令,则在步骤818中,控制逻辑404通过控制信号478控制多工器422,以假想分支至图4假想调用/返回堆栈406的返回地址353。在步骤814或步骤818进行假想分支后,于步骤816中,控制逻辑404产生一指示于控制信号482中,表示已响应BTAC402而执行一假想分支。也就是,不论处理器300假想分支至假想调用/返回堆栈406的返回地址353,或是BTAC402项目A624的目标地址352,控制逻辑404皆会于控制信号482中,显示已执行一假想分支。当一指令字节从指令高速缓存432进行至图3的指令缓冲器342时,控制信号482会用来设定SB位438。在一具体实施例中,控制逻辑404利用项目602的BEG446字段,来设定指令缓冲器342内关联于分支指令的运算码字节的SB位438。此分支指令的SBI454在提取地址495命中BTAC402时,是假定已快取于BTAC402中。若A项目624是无效的,或预期不被采用,或不被看见,如步骤804中所确定的,则控制逻辑404在步骤824中便会确定B项目626是否为有效、被看见与被采用。控制逻辑404是以类似于步骤804对A项目624所用的方式,来决定B项目626是否为有效、被看见与采用。若B项目626是有效的、预期会被采用且被看见,则在步骤832中,控制逻辑404检查RET字段706,以决定B项目626是否已快取返回指令的数据。若RET位706未被设定,则在步骤834中,控制逻辑404控制图6的A/B多工器608以选取项目B626,并通过控制信号478控制多工器422,以假想分支至目标地址信号352所提供的BTAC402项目B626的目标地址714。相反地,若RET位706指出,在提取地址495所选取的指令高速缓存432快取线中,可能存在一返回指令,则在步骤818中,控制逻辑404通过控制信号478控制多工器422,以假想分支至假想调用/返回堆栈406的返回地址353。在步骤834或步骤818进行假想分支后,于步骤816中,控制逻辑404产生一指示于控制信号482中,表示已响应BTAC402而执行一假想分支。若A项目624与B项目626皆是无效的,预期不被采用,或不被看见,则在步骤822中,控制逻辑404便不会进行假想分支。若A项目624与B项目626两者皆为有效的,预期被采用,且被看见,则在步骤808中,控制逻辑404便会去确定,在假定的分支指令(其数据快取于A项目624与B项目626)中,哪一个是指令高速缓存432的快取线指令字节494内,最先被看见的有效且被采用的分支指令。也就是,如果两个假定的分支指令都被看见、有效且被采用,控制逻辑404便通过比较A项目624与B项目626的BEG446字段,来决定哪一个假定的分支指令具有较小的内存地址。若B项目626的BEG446的值比A项目624的BEG446的值还小,则控制逻辑404便进行至步骤832,依据B项目626进行假想分支。否则,控制逻辑404便进行至步骤812,依据A项目624进行假想分支。在一具体实施例中,假想调用/返回堆栈406并不存在。所以,步骤812、818与832皆未执行。从图8可以看出,本发明有利地提供一装置,用以将多个分支指令的目标地址与假想分支数据快取于一分支目标地址高速缓存中一特定的指令快取线,而该分支目标地址高速缓存并未整合在指令高速缓存内。特别是,分支指令的位置数据快取于快取线内的BEG字段446,有利地使控制逻辑404无需前译码快取线,就能够从快取线内可能的多个分支指令中,决定要假想分支至哪一个。也就是,BTAC402在虑及可能有两个或更多分支指令存在于所选取快取线的情况下,决定目标地址,而不用知道有多少分支指令(假若有的话)存在于快取线中。现请参阅图9,其为依本发明绘示的图4假想分支预测装置400使用图8步骤选取图4目标地址352的一运作范例的方块图。此范例显示一值为0x10000009的提取地址495进行指令高速缓存432与BTAC402的检索,且该提取地址495也被送至图4的控制逻辑404。为了简明起见,关于指令高速缓存432与BTAC402的多路关联性(multi-wayassociativity)的数据,像是图6的多个路与路多工器606,并未显示出来。指令高速缓存432的一快取线494由提取地址495选取。快取线494包括快取于地址0x10000002的一x86条件跳转指令(JCC)与快取于地址0x1000000C的一x86CALL指令。此范例也显示了提取地址495所选取的BTAC402快取线内A项目602A与B项目602B的一些组成部份。项目A602A包括CALL指令的快取数据,而项目B602B包括JCC指令的快取数据。项目A602A显示其VALID位702A被设为1,表示其为一有效的项目A602A,即,图7相关联的目标地址714与SBI454是有效的。项目A602A也显示出一值为0x0C的BEG字段446A,对应于该CALL指令的指令指针地址的最低有效位。项目A602A也显示了一值为“被采用”的T/NT字段722A,表示该CALL指令预期会被采用。响应提取地址495,A项目602A通过图6的信号624送至控制逻辑404。项目B602B显示其VALID位702B被设为1,表示其为一有效的项目B602B。项目B602B也显示出一值为0x02的BEG字段446B,对应于该JCC指令的指令指针地址的最低有效位。项目B602B也显示了一值为“被采用”的T/NT字段722B,表示该JCC指令预期会被采用。响应提取地址495,B项目602B通过图6的信号626送至控制逻辑404。此外,BTAC402将命中信号452设定为真,以显示提取地址495命中了BTAC402。控制逻辑404接收项目A602A与项目B602B,并依照图8所述的方法,根据命中信号452、提取地址495的值以及602A与602B两个项目,产生图6的A/B选择信号622。在步骤802中,控制逻辑404依据命中信号452被设定为真,而确定BTAC402有一命中发生。接着于步骤804中,控制逻辑404依据VALID位702A被设定,而确定项目A602A是有效的。而因T/NT字段722A显示为被采用,控制逻辑404也于步骤804确定项目A602A是被采用的。由于BEG字段446A的值0x0C大于或等于提取地址195的值0x09对应的较低位,控制逻辑404亦于步骤804确定项目A602A被看见。既然项目A602A是有效的、被采用与被看见,控制逻辑404便进行至步骤806。于步骤806中,控制逻辑404依据VALID位702B被设定,而确定项目B602B是有效的。而因T/NT字段722B显示为被采用,控制逻辑404也于步骤806确定项目B602B是被采用的。由于BEG字段446B的值0x02小于提取地址495的值0x09对应的较低位,控制逻辑404亦于步骤806确定项目B602B未被看见。既然项目B602B未被看见,控制逻辑404便进行至步骤812。在步骤812中,控制逻辑404通过图7被清除的RET位706而确定关联于项目A602A所快取的指令不是返回指令,并进行至步骤814。在步骤814中,控制逻辑404产生一A/B选择信号622的值,以驱使图6的A/B多工器608选取信号624上的项目A602A。这个选择的动作导致项目A602A的图7目标地址714被选为图3的目标地址352,送至图4的提取地址495选择多工器422。因此,从图9的范例可以看出,图4的分支预测装置400有利地运作,以选取最先、有效、被看见、被采用的所选定BTAC402快取线的项目602,将处理器300假想分支至其中关联的目标地址714。有利的是,即使有多个分支指令存在于对应的选定的指令高速缓存432快取线494,装置400仍能在不知快取线494内容的情况下,完成假想分支的动作。现请参阅图10,其为依本发明绘示的图4假想分支预测装置400侦测与更正错误的假想分支预测的运作流程图。从指令缓冲器342接收一指令后,在步骤1002中,图4的指令译码逻辑436便译码该指令。尤其,指令译码逻辑436将指令字节流(streamofinstructionbytes)格式化成一不同的x86巨指令,并确定该指令的长度以及是否为分支指令。接着,在步骤1004中,图4的预测检查逻辑408测定所译码指令中,是否有任何指令字节的SB位438被设定。也就是,预测检查逻辑408测定是否先前已基于现行译码的指令命中BTAC402,而执行一假想分支。若没有执行任何假想分支,则不会采取行动去更正。若有执行一假想分支,则在步骤1012中,预测检查逻辑408会检查现行译码的指令,以确定该指令是否为非分支指令。最好(preferably)预测检查逻辑408会测定该指令是否为x86指令集的非分支指令。如果该指令不是分支指令,则在步骤1022中,预测检查逻辑408将图4的ERR信号456设定为真,以表示侦测到一错误的假想分支。此外,通过图4的更新信号442,BTAC402得以更新,而清除图6对应的BTAC402项目602的图7VALID位702。再者,图3的指令缓冲器342会清除掉因此一错误的假想分支而从指令高速缓存432误取的指令。如果该指令不是分支指令,则在步骤1024中,控制逻辑404接着控制图4的多工器422,以分支至指令译码逻辑436所产生的CIP468,更正该错误的假想分支。步骤1024中所进行的分支,将使得包括该指令的指令高速缓存432快取线重新被提取与作假想预测。然而,这次该指令的VALID位702将被清除;因此,该指令将不执行任何假想分支,用来更正先前错误的假想分支。若在步骤1012中已确定该指令为一有效的分支指令,则在步骤1014中,预测检查逻辑408会确定在所译码指令的指令字节内,位于非运算码(non-opcode)字节位置的指令,有否任何字节的SB位438被设定。也就是,虽然一字节可能包括一处理器300指令集的有效运算码值,该有效运算码值却可能位于一个就指令格式而言是无效的字节位置。对一x86指令而言,除了前置字节外,运算码字节应该是指令的第一个字节。例如,对于在指令的立即资料(immediatedata)或位移字段(displacementfield)中,或者因虚拟别名化而在一x86指令modR/M或SIB(ScaleIndexBase,比例-索引-基底)字节中所含的分支运算码值,SB位438可能因的而错误地被设定。若分支运算码字节位于非运算码字节位置,则执行步骤1022与1024以更正错误的假想预测。若在步骤1012中,预测检查逻辑408确定该指令为一有效的分支指令,且在步骤1014中,确定没有非运算码字节的SB位438被设定,则在步骤1016中,预测检查逻辑408会确定是否有假想与非假想指令长度上的不匹配。也就是,预测检查逻辑408将步骤1002中指令译码逻辑436产生的非假想指令的长度与BTAC402产生的图7假想LEN448字段作一比较。若指令长度不匹配,则执行步骤1022与1024以更正错误的假想预测。若在步骤1012中,预测检查逻辑408确定该指令为一有效的分支指令,且在步骤1014中,确定只有运算码字节的SB位438被设定,以及在步骤1016确定指令长度匹配,则该指令便顺着流水线300而下,直至抵达图3的E-阶段326。在步骤1032中,E-阶段326解析出图3的正确的分支指令目标地址356,并确定图4的正确的分支方向DIR481。接着,在步骤1034中,预测检查逻辑408确定BTAC402是否错误预测了分支指令的方向。也就是,预测检查逻辑408将E-阶段326所解析的正确方向DIR481与BTAC402产生的图7预测722作比较,以确定是否已执行一错误的假想分支。若BTAC402预测了一错误的方向,则在步骤1042中,预测检查逻辑408将ERR信号456设定为真,以告知控制逻辑404此错误。因此,控制逻辑404便通过图4的更新信号442,来更新图6对应的BTAC402项目602的BTAC402方向预测722。最后,在步骤1042中,控制逻辑404会清除掉流水线300中因该错误的假想分支而从指令高速缓存432误取的指令。接着,在步骤1044中,控制逻辑404驱使多工器422选取图4的NSIP466,使处理器300分支至分支指令的下个指令,以更正该错误的假想分支。若在步骤1034中无方向的错误,则在步骤1036中,预测检查逻辑408会确定是否BTAC402或假想调用/返回堆栈406错误地预测了分支指令的目标地址。也就是,若处理器300假想分支至BTAC402目标地址352,则预测检查逻辑408会检查图4比较器489的结果485,以确定是否假想目标地址352不匹配所解析的正确目标地址356。另一种情况是,若处理器300假想分支至假想调用/返回堆栈406返回地址353,则预测检查逻辑408会检查图4比较器497的结果487,以确定是否假想返回地址353不匹配所解析的正确目标地址356。若在步骤1036侦测到一目标地址的错误,则在步骤1052中,预测检查逻辑408将ERR信号456设定为真,以显示侦测到一错误的假想分支。此外,控制逻辑404通过更新信号442,以步骤1032产生的解析目标地址356来更新图6对应的BTAC402项目602。再者,会清除掉流水线300中因该错误的假想分支而从指令高速缓存432误取的指令。接着,在步骤1054中,控制逻辑404控制图4的多工器422,以分支至解析目标地址356,用来更正先前错误的假想分支。现请参照图11,为依本发明列举的程序代码实例片段及一表格1100,为说明图10假想分支预测错误的侦测与更正的一范例。程序代码片段包括一先前程序代码片段与一现行程序代码片段。例如,该先前程序代码片段图标了在图3处理器300进行工作交换(taskswitch)前,图4指令高速缓存432中位于虚拟地址0x00000010的程序代码。该现行程序代码片段则图标了在工作交换后,指令高速缓存432中位于虚拟地址0x00000010的程序代码,就像在虚拟别名化情形所可能发生的。该先前程序代码序列(codesequence)包括一在0x00000010地址位置的x86JMP(无条件跳转)指令。该JMP指令的目标地址为0x00001234。该JMP指令已执行;所以,在现行程序代码序列执行时,目标地址0x00001234已因应地址0x00000010而快取于图4的BTAC402。也就是,目标地址714已被快取,VALID位702被设定,BEG446、LEN448与WRAP708字段写入适当的值,图7的CALL704与RET706位则被清除。在此范例中,假定T/NT字段722显示出所快取的分支将被采用,且JMP快取于BTAC402快取线的A项目624中。现行程序代码序列包括一位于0x00000010的ADD(算术加)指令,与先前程序代码序列中的JMP指令的虚拟地址相同。现行程序代码序列中位置0x00001234是SUB(算术减)指令,位置0x00001236则是INC(算术递增)指令。表格1100包括八行(column)与六列(row)。第一列之后七行代表七个脉冲周期(clockcycle),从1至7。第一行之后五列代表流水线300最先的五个阶段,即I-阶段302、B-阶段304、U-阶段306、V-阶段308与F-阶段312。表格1100的其它方格则显示当执行现行程序代码序列时,在不同脉冲周期中每个阶段的内容。在脉冲周期1期间,BTAC402与指令高速缓存432被存取。ADD指令显示于I-阶段302。图4值为0x00000010的提取地址495检索BTAC402与指令高速缓存432,依据图8的流程决定是否需要进行一假想分支。在图11的范例中,一值为0x00000010的提取地址495会命中BTAC402,如下所述。在脉冲周期2期间,ADD指令显示于B-阶段304。这是指令高速缓存432提取周期(fetchcycle)的第二个脉冲。标志数组614提供标志616,而资料数组612提供图6的项目602,每个项目602包括图7的目标地址714与SBI454。因为先前程序代码序列的JMP指令在执行后已被快取,图6的比较器604便根据图8的步骤802产生一标志命中(taghit)于信号452上。比较器604也通过信号618控制路多工器606去选取适当的路。控制逻辑404检查A项目624与B项目626的SBI454,在此例中并选择A项目624以提供目标地址352与SBI454。在此例中,控制逻辑404也依据步骤804与812来决定项目是有效、被采用、被看见且不是返回指令。在脉冲周期3期间,ADD指令显示于U-阶段306。ADD指令由指令高速缓存432提供,并闩锁于U-阶段306。因为图8的步骤802至814是在脉冲周期2中执行,控制逻辑404便通过控制信号478控制图4的多工器422,以选取BTAC402所提供的目标地址352。在脉冲周期4期间,ADD指令进行至V-阶段308,在此阶段被写入指令缓冲器342。脉冲周期4是假想分支周期。也就是,处理器300依据图8的步骤814,开始提取位于值为0x00001234的快取目标地址352的指令。即,根据图8,提取地址495被改为地址0x00001234,以完成假想分支至该地址的动作。因此,位于地址0x00001234的SUB指令,在脉冲周期4是显示于I-阶段302。此外,控制逻辑404通过图4的信号482指出,已执行一假想分支。所以,根据图8的步骤816,指令缓冲器342中一SB位438对应于ADD指令被设定。在脉冲周期5期间,侦测到假想分支中的错误。ADD指令进行到F-阶段312。SUB指令进行至B-阶段304。位于下个循序指令指针的INC指令,则显示于I-阶段302。图4的F-阶段312指令译码逻辑436译码ADD指令,并产生图4的CIP468。预测检查逻辑408依据步骤1004,通过信号484侦测到关联于ADD指令的SB位438被设定。预测检查逻辑408依据步骤1012,也侦测到ADD指令是一非分支指令,并接着依据步骤1022将图4的ERR信号456设为真,以表示在周期4中已执行错误的假想分支。在脉冲周期6期间,使错误的假想分支无效。依据步骤1022,指令缓冲器342被清空。尤其,ADD指令从指令缓冲器342中清除。此外,依据步骤1022,导致错误假想分支的项目602所关联的VALID位702则被清除,以更新BTAC402。再者,控制逻辑404控制多工器422,以选取CIP468作为下个周期的提取地址495。在脉冲周期7期间,更正错误的假想分支。处理器300开始从指令高速缓存432提取位于ADD指令的指令指针的指令,该ADD指令是在脉冲周期5侦测到错误时,由指令译码逻辑436所译码的。也就是,处理器300依据步骤1024分支至对应于ADD指令的CIP468,用来更正在脉冲周期5所执行的错误的假想分支。因此,ADD指令在脉冲周期7是显示于I-阶段302。这次,ADD指令将顺着流水线300而下并执行。现请参阅图12,其为依本发明绘示的图4分支预测装置400包括一混合假想分支方向预测装置1200的另一具体实施例的方块图。简单就可以看出,BTAC402的分支方向预测愈准确,假想分支至BTAC402产生的假想目标地址352就愈能有效地减少分支延迟惩罚。反过来说,错误的假想分支愈不常被更正,如关于图10部分所述,假想分支至BTAC402产生的假想目标地址352就愈能有效地减少处理器300的平均分支延迟惩罚。方向预测装置1200包括图4的BTAC402、一分支历史表(BHT)1202、异或逻辑(exclusive0Rlogic)1204、全域分支历史缓存器(globalbranchhistoryregisters)1206与一多工器1208。全域分支历史缓存器1206包括一移位缓存器(shiftregister),对于处理器300所执行的所有分支指令,全域分支历史缓存器1206接收其分支指令方向结果(branchinstructiondirectionoutcomes)1212,而该移位缓存器则储存分支指令方向结果1212的全域历史。每次处理器300执行一分支指令,图4的DIR位481就被写入移位缓存器1206,若分支方向被采用,该位值为“设定”;若分支方向不被采用,该位值为“清除”。由此,最早的(oldest)位就被移出移位缓存器1206。在一具体实施例中,移位缓存器1206储存了全域历史的13个位。全域分支历史的储存,在分支预测的
技术领域
中是为人熟知的,对于程序中高度依存于其它分支指令的分支指令,可改良其结果的预测。全域分支历史1206通过信号1214送至异或逻辑1204,以与图4的提取地址495进行一逻辑的异或运算。异或逻辑1204的输出1216作为分支历史表1202的索引。在分支预测的
技术领域
中,异或逻辑1204所执行的功能一般都称为gshare运算。分支历史表1202包括一储存组件的数组,以储存数个分支指令的分支方向结果的历史。该数组由异或逻辑1204的输出1216作为索引。当处理器300执行一分支指令,由异或逻辑1204的输出1216所检索的分支历史表1202的数组组件便通过信号1218选择性地加以更新,而信号1218的内容则视解析分支方向DIR481而定。在一具体实施例中,分支历史表1202数组中的每个储存组件包括两个方向预测A与B方向预测。最好(preferably),如图所示,分支历史表1202产生A与B方向预测于T/NT_A/B1222信号上,针对BTAC402产生的图6A项目624与B项目626各指定一方向预测以供选取。在一具体实施例中,分支历史表1202的储存组件数组包括4096个项目,每个可储存两个方向预测。在一具体实施例中,A与B预测各包括单一T/NT(taken/nottaken,即采用/不采用)位。在此实施例中,该T/NT位更新为DIR位481的值。在另一具体实施例中,A与B预测各包括一两位的上/下数饱和计数器,指定了四种状态极可能采用(stronglytaken)、有可能采用(weaklytaken)、有可能不采用(weaklynottaken)与极可能不采用(strongnottaken)。在此实施例中,饱和计数器朝DIR位481指出的方向来计数。多工器1208从分支历史表1202接收两个方向预测位T/NT_A/B1222,并从BTAC402接收A项目624与B项目626各自的图7T/NT方向预测722。多工器1208亦从BTAC402接收A项目624与B项目626各自的SELECT位724,作为选择控制信号。A项目624的SELECT位724从两个A输入中选取一T/NT给A项目624。B项目626的SELECT位724从两个B输入中选取一T/NT给B项目626。所选取的两个T/NT位1224被送至控制逻辑404,通过图4的信号478,用于控制多工器422。在图12的实施例中,所选取的两个T/NT位1224分别包括于项目A624与项目B626,被送至控制逻辑404,如图6所示。可以看出,若处理器300分支至目标地址352,且该地址352是BTAC402依据(至少部分是)分支历史表1202所提供的方向预测1222而产生,则该分支是以假想的方式进行。该分支是假想的,此因虽然命中BTAC402已指出一分支指令先前存在于提取地址495所选取的指令高速缓存432快取线中,但仍无法确定一分支指令位于所选取的指令高速缓存432快取线中,如上所讨论的。也可以看出,比起单单只有BTAC402方向预测722,图12的混合分支方向预测装置1200可能有利地提供一更准确的分支方向预测。尤其,一般而言,对于高度依存于其它分支历史的分支而言,分支历史表1202提供了较准确的预测;反的,对于并非高度依存于其它分支历史的分支而言,则是BTAC402提供了较准确的预测。就一既定的分支而言,通过SELECT位724能选择较准确的预测装置。因此,可以看出,图12的方向预测装置1200能有利地与BTAC402协同运作,以使用BTAC402所提供的目标地址352进行更准确的假想分支。现请参阅图13,其为图4的双调用/返回堆栈406与414的运作流程图。计算机程序的一项特性是,可能从程序内多个位置来调用子程序(subroutine)。所以,子程序内—返回指令的返回地址可能变来变去。因此,可以看出,利用分支目标地址高速缓存去预测返回地址通常很不容易,从而调用/返回堆栈的出现,实有其必要。本发明的双调用/返回地址堆栈的架构提供了本发明的假想BTAC的好处,像是在流水线300早期即预测分支目标地址,以减少分支惩罚。除此之外,还广泛提供了调用/返回堆栈的优点,即,比一简单的BTAC402更准确地预测返回地址。在步骤1302中,图4的BTAC402由图4的提取地址495作索引,而图4的控制逻辑404检查命中信号452,以确定提取地址495是否命中BTAC402,还检查SBI454的VALID位702,以确定所选取的BTAC402项目602是否有效。若BTAC402的命中未发生或VALID位702未被设定,则控制逻辑404并不会使处理器300进行假想分支。若在步骤1302期间一有效的BTAC402命中发生,则在步骤1304中,控制逻辑404会检查图4SBI454的图7CALL位704,以确定所快取的分支指令假想地或大概地是否为一调用指令。若CALL位704被设定,则在步骤1306中,控制逻辑404控制假想调用/返回堆栈406,以将假想返回地址491推入其中。也就是,该假定的调用指令的假想返回地址491,其为图4的提取地址495、BEG446与LEN448的总和,储存于假想调用/返回堆栈406。假想返回地址491之所以为假想的,乃因在命中BTAC402的提取地址495所关联的指令高速缓存432快取线中,并不确定真有包括一调用指令,更别说是BEG446与LEN448因的而被快取于BTAC402的调用指令了。假想返回地址491,或目标地址,在下一次执行返回指令时,可由返回地址信号353提供,以便假想分支至此返回地址491,就如下文关于步骤1312至1318所述。若Call位704被设定,则在步骤1308中,控制逻辑404接着控制多工器422去选取图3的BTAC402目标地址352,以假想分支至目标地址352。若控制逻辑404在步骤1304确定CALL位704未被设定,则在步骤1312中,控制逻辑404会检查SBI454的图7RET位706,以确定所快取的分支指令假想地或大概地是否为一返回指令。若RET位706被设定,则在步骤1314中,控制逻辑404控制假想调用/返回堆栈406,以将图3的假想返回地址353从堆栈顶端取出。在取出假想返回地址353后,则在步骤1316中,控制逻辑接着控制多工器422去选取从假想调用/返回堆栈406取出的假想返回地址353,以假想分支至返回地址353。返回指令顺着流水线300而下,直至抵达图3的F-阶段312,图4的指令译码逻辑436则译码此假定的返回指令。若此假定的返回指令的确是一返回指令,则图4的非假想调用/返回堆栈414产生此返回指令的图3非假想返回地址355。在步骤1318中,图4的比较器418将假想返回地址353与非假想返回地址355作比较,并将结果714送至控制逻辑404。在步骤1318中,控制逻辑404检查比较器418的结果474,以确定是否有不匹配发生。若假想返回地址353与非假想返回地址355不相匹配,则在步骤1326中,控制逻辑404会控制多工器422选取非假想返回地址355,以使处理器300分支至非假想返回地址355。若控制逻辑404于步骤1304中确定CALL位704并未设定,且于步骤1312中确定RET位706也未设定,则在步骤1322中,控制逻辑404会控制多工器422假想分支至图3的BTAC402目标地址352,如图8步骤814或834所描述的。因此,从图13可看出,图4的双重调用/返回堆栈的运作可减少调用与返回指令的分支惩罚。这种分支惩罚的减少,是通过将处理器300结合BTAC402,使调用与返回指令在流水线更早期就进行分支,同时也克服以下现象由于子程序一般都从一些不同的程序位置来调用,返回指令因而会返回至多个不同的返回地址。现请参照图14,为说明图4的分支预测装置400以非假想分支预测来选择性地覆盖(override)假想分支预测,用来改进本发明的分支预测准确度的运作流程图。在从指令缓冲器342接收一指令后,在步骤1402中,图4的指令译码逻辑436便译码该指令,图4的非假想目标地址计算器416、非假想调用/返回堆栈414以及非假想分支方向预测装置412则依图4的指令译码数据492产生非假想分支预测。指令译码逻辑436在步骤1402中,产生该指令的类型数据于指令译码数据492中。尤其,指令译码逻辑436会确定该指令是否为分支指令、指令的长度以及分支指令的类型。最好(preferably)指令译码逻辑436会确定分支指令是否为条件或无条件类型分支指令、PC相关类型分支指令、返回指令、直接类型分支指令或间接类型分支指令。若该指令为一分支指令,非假想分支方向预测装置412会产生图4的非假想方向预测444。此外,非假想目标地址计算器416则计算图3的非假想目标地址354。最后,若该指令为一返回指令,则非假想调用/返回堆栈414产生图3的非假想返回地址355。在步骤1404中,控制逻辑404会确定分支指令是否为条件分支指令。也就是,控制逻辑404会确定该指令是否依靠一条件而被采用或不被采用,该条件像是旗标(flag)位是否设定,如零旗标(zeroflag)、进位旗标(carryflag)等等。在x86指令集中,JCC指令是条件类型的分支指令。相对地,RET、CALL与JUMP指令,则是无条件分支指令,因为这些指令总会有一被采用的方向。若该指令为条件类型的分支指令,则在步骤1412中,控制逻辑404会确定非假想分支方向预测装置412所预测的非假想方向预测444以及BTAC402所预测SBI454中图7的假想方向722两者间,是否不相匹配。若有方向预测上的不匹配,则在步骤1414中,控制逻辑404会确定非假想方向预测444是否要被采用。若非假想方向预测444不被采用,则在步骤1414中,控制逻辑404会控制多工器422选取图4的NSIP466,以分支至现行分支指令后的指令。也就是,控制逻辑404选择性地覆盖假想的BTAC402方向预测。假想方向预测722之所以被覆盖,是因非假想方向预测444一般比较准确。若非假想方向预测444被采用,则在步骤1432中,控制逻辑404会控制多工器422分支至非假想目标地址354。同样地,假想方向预测722之所以被覆盖,是因非假想方向预测444一般比较准确。若控制逻辑404于步骤1412确定并无方向预测上的不匹配,且已执行分支指令的假想分支(即,若SB位438被设定),则在步骤1428中,控制逻辑404会确定假想目标地址352与非假想目标地址354间是否不相匹配。若有一条件类型分支的目标地址的不匹配,则在步骤1432中,控制逻辑404会控制多工器422分支至非假想目标地址354。假想目标地址预测352会被覆盖,此因非假想目标地址预测354一般更为准确。若没有一条件类型分支的目标地址的不匹配,则不会采取任何行动。也就是,允许进行假想分支,并接受错误更正的管制,如关于图10部分所述。若在步骤1404中,控制逻辑404确定该分支指令不是条件类型的分支,则于步骤1406控制逻辑404会确定该分支指令是否为返回指令。若该分支指令是返回指令,则在步骤1418中,控制逻辑404会确定假想调用/返回堆栈406产生的假想返回地址353与非假想调用/返回堆栈414产生的非假想返回地址355两者间,是否不相匹配。若假想返回地址353与非假想返回地址355两者不相匹配,则在步骤1422中,控制逻辑404会控制多工器422分支至非假想返回地址355。也就是,控制逻辑404选择性地覆盖假想返回地址353。假想返回地址353之所以被覆盖,是因非假想返回地址355一般比较准确。若没有一直接类型分支的目标地址的不匹配,则不会采取任何行动。也就是,允许进行假想分支,并接受错误更正的管制,如关于图10部分所述。请注意步骤1418与1422分别对应到图13的步骤1324与1326。若在步骤1406中,控制逻辑404确定该分支指令不是返回指令,则于步骤1408控制逻辑404会确定该分支指令是否为PC相关类型的分支指令。在x86指令集中,PC相关类型的分支指令所指定的带正负号的位移量会加上现行程序计数器的值,以计算目标地址。在另一具体实施例中,控制逻辑404于步骤1408也会确定该分支指令是否为直接类型的分支指令。在x86指令集中,直接类型的分支指令于自身内即指定目标地址。直接类型的分支指令也被称为立即类型(immediatetype)的分支指令,因为目标地址被指定于指令的立即字段(immediatefield)。若该分支指令为PC相关类型的分支指令,则在步骤1424中,控制逻辑404会确定假想目标地址352与非假想目标地址354间是否不相匹配。若有一PC相关类型分支的目标地址的不匹配,则在步骤1426中,控制逻辑404会控制多工器422分支至非假想目标地址354。假想目标地址预测352会被覆盖,此因非假想目标地址预测354对PC相关类型的分支而言一般更为准确。若没有一PC相关类型分支的目标地址的不匹配,则不会采取任何行动。也就是,允许进行假想分支,并接受错误更正的管制,如关于图10部分所述。若在步骤1408中,控制逻辑404确定该分支指令不是PC相关类型的分支指令,则不会采取任何行动。也就是,允许进行假想分支,并接受错误更正的管制,如关于图10部分所述。在一具体实施例中,非假想目标地址计算器416在F-阶段312包括一相当小的分支目标缓冲器(branchtargetbuffer,BTB),仅用来快取间接类型分支指令的分支目标地址,如前面关于图4部分所述。可以看出,对间接类型的分支指令而言,BTAC402的预测一般是比相当小的F-阶段312BTB更为准确。所以,若确定该分支为一间接类型的分支指令,控制逻辑404不会覆盖BTAC402的假想预测。也就是,若一间接类型分支指令的假想分支因图8所述的BTAC402命中而执行,则控制逻辑404会通过分支至间接类型的BTB目标地址,而不覆盖该假想分支。然而,即使在此间接类型的分支中,BTAC402所产生的假想目标地址352未被非假想目标地址354给覆盖,在流水线300稍后仍会于假想目标地址352与图3从S-阶段328接收的非假想目标地址356两者间,做一目标地址的比较,以执行图10的步骤1036,侦测错误的假想分支。现请参照图15,其为依本发明绘示的用来置换图4BTAC402中目标地址的装置的方块图。为了简明起见,关于BTAC402的多路关联性的数据,像是图6的多路与路多工器606,并未显示。图6BTAC402的数据数组612显示其包括了一选定的BTAC402快取线,其中具有项目A602A与项目B602B,分别通过图6的信号624与626送至控制逻辑404。项目A602A与项目B602B各包括其相关的图7VALID位702。该选定的BTAC402快取线亦包括一A/BLRU(leastrecentlyused)位1504,以指出项目A602A与项目B602B两者中,哪一个最近最少被使用到。在一具体实施例中,每次一发生命中BTAC402的一既定目标地址714,A/BLRU位1504就被更新,以指定发生命中项目的相对项目。也就是,若控制逻辑404因项目A602A发生命中而进行至图8的步骤812,则A/BLRU位1504就被更新成显示项目B602B。相反地,若控制逻辑404因项目B602B发生命中而进行至图8的步骤832,则A/BLRU位1504就被更新成显示项目A602A。A/BLRU位1504也被送至控制逻辑404。此置换装置也包括一多工器1506。多工器1506接收图4提取地址495与一更新指令指针(IP)作为输入。多工器1506依据控制逻辑404提供的读/写控制信号1516来选取其中一输入。读/写控制信号1516亦被送至BTAC402。当读/写控制信号1516显示为“读”,则多工器1506选取提取地址495,经由信号1514送至BTAC402,以读取BTAC402。当读/写控制信号1516显示为“写”,则多工器1506选取更新IP1512,经由信号1514送至BTAC402,以通过图4信号442将一更新目标地址714与/或SBI454与/或A/BLRU位1504写入BTAC402。当一分支指令执行且被采用,该分支指令的目标地址714以及相关联的SBI454会被写入,或快取于,一BTAC402项目602。也就是,用已执行的分支指令的新目标地址714及相关联的SBI454来更新BTAC402。控制逻辑404必须决定在BTAC402的哪一边,A或B,来更新由更新IP1512选取的BTAC402快取线与路。也就是,控制逻辑404必须决定是否要置换所选取的快取线与路的项目A602A或项目B602B。控制逻辑404如下表一所示来决定置换哪一边。ValidAValidBReplace00--LastWritten01A10B11LRU表一表一为具有两个输入的真值表(truthtable),两个输入为项目A602A的VALID位702与项目B602B的VALID位702。该真值表的输出用以决定要置换BTAC402的哪一边。如表一所示,若A项目602A无效且B项目602B有效,则控制逻辑404将A项目602A置换掉。若A项目602A有效且B项目602B无效,则控制逻辑404将B项目602B置换掉。若A项目602A与B项目602B皆有效,则控制逻辑404将最近较少被使用的项目置换掉,而此项目是由更新IP1512所选取BTAC402快取线与路中的A/BLRU位1504来指定。若A项目602A与B项目602B皆无效,则控制逻辑404必须决定要置换哪一边。一种解决方式是总是写到某一边,如A。然而,这种解决方式会造成如下程序代码序列1所示的问题。0x00000010JMP0X000000140x00000014ADDBX,10x00000016CALL0x12345678程序代码序列1在程序代码序列1中,此三个指令都位在相同的指令高速缓存432的快取线内,因为其指令指针地址除了较低的四个地址位外余皆相同;因此,JMP与CALL指令选取相同的BTAC402快取线与路。假设此范例中,当指令执行时,由JMP与CALL指令所选取BTAC402快取线与路内的A项目602A与B项目602B皆无效。使用“当两个项目皆无效时,总是更新A这一边”的解决方式,JMP指令将见到两边皆为无效,且将更新A项目602A。然而,由于在程序序列中CALL指令相当接近JMP指令,若流水线相当长,如处理器300,则在A项目602A的VALID位702被更新前,有相当多数量的周期可能会通过。因此,在BTAC402被已执行的JMP指令更新前,特别是在A项目602A的VALID位702与所选取BTAC402快取线的BTAC402路置换状态被JMP指令更新之前,CALL指令非常有可能会选取BTAC402。所以,CALL指令将见到两边皆为无效,而且也将依“当两个项目皆无效时,总是更新A这一边”的解决方式,来更新A项目602A。这样做是有问题的,因为JMP指令的目标地址714将由于一空的即无效的B项目602B可用来快取CALL指令的目标地址714而不必要地被取代。为解决如表一所示的问题,若A项目602A与B项目602B皆无效,则控制逻辑404最好选取存于一全域置换状态旗标缓存器即LastWritten1502的一边或其相反边。LastWritten缓存器1502包括于置换装置,并由其来更新。LastWritten缓存器1502储存一指示,其显示就BTAC402整体而言,其A边或B边是否为最后被写到一无效的BTAC402项目602。有利地,此方法使用LastWritten缓存器1502以避免前面程序代码序列1所示的问题,如现在关于图16与17部分所要叙述的。现请参照图16,其为依本发明图15装置的一运作方法的流程图。图16阐明了上述表一的一具体实施例。当控制逻辑404需要去更新BTAC402的项目602时,控制逻辑404会分别检查所选取的A项目602A与B项目602B的VALID位702。在步骤1602中,控制逻辑404会确定是否A项目602A与B项目602B两者皆为有效。若两个项目皆有效,则在步骤1604中,控制逻辑404会检查A/BLRU位1504以确定A项目602A或B项目602B为最近最少被使用者。若A项目602A为最近最少被使用者,则控制逻辑404于步骤1606将A项目602A置换掉。若B项目602B为最近最少被使用者,则控制逻辑404于步骤1608将B项目602B置换掉。若控制逻辑404于步骤1602中确定并非两个项目都无效,则在步骤1612中,控制逻辑404会确定是否为A项目602A有效而B项目602B无效。若是,则控制逻辑404于步骤1614将B项目602B置换掉。不然,在步骤1622中,控制逻辑404会确定是否为A项目602A无效而B项目602B有效。若是,则控制逻辑404于步骤1624将A项目602A置换掉。否则,在步骤1632中,控制逻辑404会检查LastWritten缓存器1502。若LastWritten缓存器1502显示BTAC402的A边并非最后被写到一选定的快取线与路中,而在此选定的快取线与路中A项目602A与B项目602B皆为无效,则控制逻辑404于步骤1634将A项目602A置换掉。控制逻辑404接着于步骤1636更新LastWritten缓存器1502,以指定BTAC402的A边为最后被写到一选定快取线与路的边,而在此选定的快取线与路中A项目602A与B项目602B皆为无效。若LastWritten缓存器1502显示BTAC402的B边并非最后被写到一选定的快取线与路中,而在此选定的快取线与路中A项目602A与B项目602B皆为无效,则控制逻辑404于步骤1644将B项目602B置换掉。控制逻辑404接着于步骤1646更新LastWritten缓存器1502,以指定BTAC402的B边为最后被写到一选定快取线与路的边,而在此选定的快取线与路中A项目602A与B项目602B皆为无效。可以看出,图16的方法可避免在上述程序代码序列1中,以CALL指令的目标地址覆写掉JMP指令的目标地址。假设当JMP指令执行时,LastWritten缓存器1502指定了A边。既然B边并不是最后被写的,控制逻辑404将依据图16与表一来更新B项目602B。此外,控制逻辑404将更新LastWritten缓存器1502以指定B边。因此,当CALL指令执行时,控制逻辑404将依据图16更新A项目602A,此因当BTAC402被选取时,两个项目皆无效,且LastWritten缓存器1502指明了A边并不是最后被写到。因此,有利地,JMP与CALL指令两者的目标地址将快取于BTAC402,供后续的假想分支使用。现请参照图17,其为依本发明的另一具体实施例绘示图15装置的一运作方法的流程图。图17的步骤除了两个额外步骤外,其余皆与图16的步骤相同。在此另一具体实施例中,控制逻辑404在置换一无效的项目后,会更新LastWritten缓存器1502,即使另一项目为有效的。因此,在图17,于步骤1614置换了B项目602B后,在步骤1716中,控制逻辑404将更新LastWritten缓存器1502以指定B边。此外,于步骤1624置换了A项目602A后,在步骤1726中,控制逻辑404将更新LastWritten缓存器1502以指定A边。虽然实际的仿真并未看到图16与17的实施例在效能上有显著差别,但可看出图16实施例解决了图17实施例所无法处理的一个问题。此问题以下述程序代码序列2来解说。0x00000010JMP0x123456780x12345678JMP0x000000140x00000014JMP0x20000000程序代码序列2位于指令指针0x00000010与0x00000014的两个JMP指令都在同一条指令高速缓存432快取线中,并选取BTAC402内相同的快取线。位于指令指针0x12345678的JMP指令则在另一条指令高速缓存432快取线中,并选取BTAC402内另一条不同的快取线。当JMP0x12345678指令执行时,假设有下列情况存在。LastWritten缓存器152指定了B边。由JMP0x12345678指令与JMP0x20000000指令的指令指针所选取BTAC402快取线与路中的A项目602A与B项目602B两者皆为无效。由JMP0x00000014指令的指令指针所选取的BTAC402快取线与路则显示A项目602A有效而B项目602B无效。假设在JMP0x12345678指令更新BTAC402前,执行JMP0x20000000指令。因此,JMP0x12345678与JMP0x20000000指令的指令指针在相同BTAC402快取线中选取相同的路。依据图16与17,当JMP0x12345678执行时,控制逻辑404将于步骤1634以JMP0x12345678的目标地址来置换A项目602A,并在步骤1636更新LastWritten缓存器1502以指定A边。依据图16与17,当JMP0x00000014执行时,控制逻辑404将于步骤1614以JMP0x00000014的目标地址来置换B项目602B。依据图17,控制逻辑404将于步骤1716更新LastWritten缓存器1502以指定B边。然而,依据图16,控制逻辑404将不会更新LastWritten缓存器1502;而是,LastWritten缓存器1502将继续指定A边。因此,当JMP0x00000020执行时,依据图17,控制逻辑404将于步骤1634以JMP0x00000020的目标地址来置换A项目602A,用来needlesslyclobberingJMP0x12345678的目标地址。相反地,依据图16,当JMP0x00000020执行时,控制逻辑404将于步骤1644置换B项目602B,用来有利地使A项目602A中JMP0x12345678的目标地址保持不变。现请参照图18,其为依本发明的另一具体实施例绘示的用以进行图4BTAC402中目标地址置换动作的装置方块图。图18的实施例类似于图15的实施例。然而,在图18的实施例中,A/BLRU位1504与两个项目的T/NT位722,显示为T/NTA722A与T/NTB722B,储存于一另外的数组1812,而非数据数组612。此额外的数组1812是双端口的;而数据数组612却是单端口。因为A/BLRU位1504与T/NT位722比起项目602的其它字段更常被更新,对较常被更新的字段提供双端口的存取,可减低在高存取量期间于BTAC402形成瓶颈的可能性。然而,由于双端口的高速缓存数组比单端口的高速缓存数组来得大,且消耗更多功率,较少被存取的字段就储存在单端口的资料数组612。现请参照图19,其为依本发明的另一具体实施例绘示的用以进行图4BTAC402中目标地址置换动作的装置方块图。图19的实施例类似于图15的实施例。然而,图19的实施例中,每一BTAC402快取线与路皆包括一第三项目,项目C602C。项目C602C通过信号1928送至控制逻辑404。有利地,图19的实施例支持假想分支至三个分支指令中任一个的能力,而此三个分支指令快取由提取地址495所选取的一对应的指令高速缓存432快取线中;或者,在一实施例中,支持假想分支至快取于一对应的指令高速缓存432半快取线的三个分支指令中的任一个。除此之外,图19的实施例不使用LastWritten缓存器1502,取而代之的是一缓存器1902,其包括一LastWritten值与一LastWrittenPrev值。当LastWritten值要更新时,控制逻辑404在更新LastWritten值之前,便将LastWritten值的内容复制到LastWrittenPrev值。LastWritten值与LastWrittenPrev值这两个值一起使得控制逻辑404得以确定三个项目中哪一个是最近最少被写到的,如现在于表二及其后的等式所描述的。表二类似于表一,除了表二有三个输入,包括项目C602C的附加的VALID位702。在等式中,“lw”对应至LastWritten值,“lwp”LastWrittenPrev值。在一具体实施例中,只有当所有三个项目皆为无效时,才更新LastWritten与LastWrittenPrev的值,类似于图16的方法。在另一具体实施例中,任何时候控制逻辑404更新了一无效的项目,LastWritten与LastWrittenPrev的值就会更新,类似于图17的方法。表二LRW=AOlderThanB?LRWofAandCLRWofBandCLRWofAandB=AOlderThanB?ABLRWofAandC=AOlderThanC?ACLRWofBandC=BOlderThanC?BCAOlderThanB=(lw==B)|((lwp==B&(lw!=A))BOlderThanC=(lw==C)|((lwp==C&(lw!=B))AOlderThanC=(lw==C)|((lwp==C&(lw!=A))虽然本发明及其目的、特征与优点已详细叙述了,其它具体实施例仍涵盖在本发明的范围内。例如,BTAC可用任何数量的高速缓存来配置,包括直接映像(direct-mapped)、完全关联(fullyassociative)或不同数目的路高速缓存。再者,BTAC的大小可增或减。而且,一提取地址,而不是位于实际包括被预测分支指令的快取线的提取地址,可用来检索BTAC与分支历史表。例如,先前提取指令的提取地址可用来在分支前减低指令泡沫的大小。此外,储存于高速缓存的每一路的目标地址数量可能改变。另外,分支历史表的大小可能改变,且存于其中的位的数目与方向预测数据的形式,以及检索分支历史表的算法(algorithm)也可能改变。再者,指令高速缓存的大小可能改变,且用以检索指令高速缓存与BTAC的虚拟提取地址的类型也可能改变。总之,以上所述仅为本发明的较佳实施例而已,当不能限定本发明所实施的范围。凡是依本发明权利要求所作的等效变化与修饰,皆应仍属于本发明专利涵盖的范围内。LRWofAandC=AOlderThanC?ACLRWofBandC=BOlderThanC?BCAOlderThanB=(lw==B)|((lwp==B&(lw!=A))BOlderThanC=(lw==C)|((lwp==C&(lw!=B))AOlderThanC=(lw==C)|((lwp==C&(lw!=A))238表二类似于表一,除了表二有三个输入,包括项目C702C的附加的VALID位702。在等式中,「lw」对应至LastWritten值,「lwp」LastWrittenPrev值。在一具体实施例中,只有当所有三个项目皆为无效时,才更新LastWritten与LastWrittenPrev的值,类似于图16的方法。在另一具体实施例中,任何时候控制逻辑404更新了一无效的项目,LastWritten与LastWrittenPrev的值就会更新,类似于图17的方法。239虽然本发明及其目的、特征与优点已详细叙述了,其它具体实施例仍涵盖在本发明的范围内。例如,BTAC可用任何数量的高速缓存来配置,包括直接映像(direct-mapped)、完全关联(fullyassociative)或不同数目的路高速缓存。再者,BTAC的大小可增或减。而且,一提取地址,而不是位于物理包括被预测分支指令的快取线的提取地址,可用来检索BTAC与分支历史表。例如,先前提取指令的提取地址可用来在分支前减低指令泡沫的大小。此外,储存于高速缓存的每一路的目标地址数量可能改变。另外,分支历史表的大小可能改变,且存于其中的位的数目与方向预测数据的形式,以及检索分支历史表的算法(algorithm)也可能改变。再者,指令高速缓存的大小可能改变,且用以检索指令高速缓存与BTAC的虚拟提取地址的类型也可能改变。240总之,以上所述仅为本发明的较佳实施例而已,当不能以的限定本发明所实施的范围。凡是依本发明权利要求所作的均等变化与修饰,皆应仍属于本发明专利涵盖的范围内。权利要求1.一种用于一微处理器内的分支装置,该装置利用一提取地址选取一指令高速缓存中的一快取线,该装置亦使用该提取地址来假想预测一分支指令是否将被采用,该分支指令可能潜在地(potentially)存在于该指令快取线中,其特征在于,该装置包括一第一预测装置,对应至该提取地址,依据该提取地址预测该分支指令是否将被采用;一逻辑,对应至该提取地址,提供该提取地址与一全域分支历史的一二进制函数于该逻辑的一输出端;一第二预测装置,对应至该逻辑的输出端,依据该输出预测该分支指令是否将被采用;一选择器,对应至该提取地址,依据该提取地址选取该第一与第二预测装置其中之一。2.如权利要求1所述的装置,其特征在于,该二进制函数包括至少一部份该提取地址与该全域分支历史的一异或运算。3.如权利要求1所述的装置,其特征在于,该第一预测装置由该提取地址所检索的一分支目标地址高速缓存所提供。4.如权利要求1所述的装置,其特征在于,该第二预测装置由提取地址与该全域分支历史的该二进制函数所检索的一分支历史表所提供。5.如权利要求1所述的装置,其特征在于,该选择器由该提取地址所检索的一分支目标地址高速缓存所提供。6.如权利要求1所述的装置,其特征在于,该选择器包括一位,用以在该第一与第二预测间做选择。7.如权利要求1所述的装置,其特征在于,每一该第一与第二预测装置包括数个预测该分支指令是否将被采用的预测器,其中该选择器包括数个对应于该数个预测器的位,用以在所对应的该数个第一与第二预测器间做选择。8.如权利要求1所述的装置,其特征在于,该选择器包括一饱和上/下数计数器。9.如权利要求8所述的装置,其特征在于,该饱和上/下数计数器从下列情形的一储存一选取值(selectionvalue)极可能是第一预测装置(stronglyfirstpredictor)、有可能是第一预测装置(weaklyfirstpredictor)、有可能是第二预测装置(weaklysecondpredictor)以及极可能是第二预测装置(stronglysecondpredictor)。10.如权利要求1所述的装置,其特征在于,还包括一缓存器,对应至该第二预测装置,储存该全域分支历史。11.如权利要求10所述的装置,其特征在于,该缓存器包括一N位移位缓存器,以储存微处理器所执行的分支指令是否被采用的N个先前结果。12.一种假想分支预测装置,位在具有一指令高速缓存的一流水线化微处理器中,该指令高速缓存接收一地址总线上的一提取地址,以选取该指令高速缓存的一快取线,一分支指令被假定存在于该快取线中,其特征在于,该装置包括一假想分支历史表(BHT),提供该分支指令的一第一方向预测;一分支目标地址高速缓存(BTAC),对应至该地址总线,提供该分支指令的一第二方向预测,并提供一选择预测,用以在该第一与第二方向预测间作选择;以及一多工器,对应至该BHT与该BTAC,依据该选择预测选取该第一与第二方向预测其中之一;其中该第二方向预测系响应该提取地址而提供,即使该分支指令可能并不存在于该指令快取线中。13.如权利要求12所述的装置,其特征在于,还包括一全域分支历史缓存器,对应至该BHT,储存微处理器先前所执行数个分支指令的方向的一全域历史。14.如权利要求13所述的装置,其特征在于,BHT响应该指令高速缓存提取地址与存于该全域分支历史缓存器的全域历史的一函数,而提供该第一方向预测。15.如权利要求14所述的装置,其特征在于,该函数包括存于该全域分支历史缓存器的全域历史与一部份该指令高速缓存提取地址的一逻辑的异或运算。16.如权利要求14所述的装置,其特征在于,BHT包括一具数个储存组件的数组,以储存数个方向预测,其中该数组由指令高速缓存提取地址与该全域历史的该函数作索引。17.如权利要求16所述的装置,其特征在于,每一该些储存组件被组态为储存数个方向预测,以供选取作为该第一方向预测。18.如权利要求12所述的装置,其特征在于,该第一方向预测、该第二方向预测以及该选择预测的每一个皆包括数个预测。19.如权利要求18所述的装置,其特征在于,该多工器为每一该第一与第二方向预测选取该数个预测之一,以响应一对应的其中一该数个选择预测。20.在如权利要求19所述的装置,其特征在于,还包括一控制逻辑,对应至该多工器,从该多工器接收每一该第一与第二方向预测的所选取的其中一该数个预测,该控制逻辑组态为依据所选取的其中一该数个预测,使微处理器选择性地进行假想分支或不分支。21.如权利要求20所述的装置,其特征在于,该控制逻辑被组态为使微处理器选择性地假想分支至该BTAC响应提取地址所提供的一假想分支目标地址。22.一种用在一微处理器中的假想分支目标地址高速缓存(BTAC),其特征在于,该BTAC包括一数组,组态为储存数个分支指令的方向预测;一输入,对应至该数组,组态为接收一指令高速缓存的提取地址,该提取地址检索该数组,以选取该数个方向预测其中之一;以及一输出,对应至该数组,提供所选取的方向预测至一分支控制逻辑;其中若所选取的方向预测指定一采用方向,则不管是否有一分支指令存在于该提取地址所检索的指令高速缓存的一快取线中,该分支控制逻辑皆使微处理器进行假想分支。23.一种用于假想分支的微处理器,其特征在于,包括一指令高速缓存,提供一地址总线上的一提取地址所选取的一指令字节线;一假想分支历史表(BHT),对应至该地址总线,提供一分支指令是否将被采用的一第一预测,该分支指令被假定存在于该指令快取线,该第一预测系依据该提取地址与一全域分支历史的一组合而提供;一假想分支目标地址高速缓存(BTAC),对应至该地址总线,提供该假定的分支指令的一第二预测,并提供一选择器;以及一控制逻辑,对应至该BHT与BTAC,若该选择器所选取的该第一与第二预测其中之一预测该假定的分支指令将被采用,则该控制逻辑使微处理器进行假想分支。24.如权利要求23所述的微处理器,其特征在于,该控制逻辑使微处理器假想分支至BTAC依据该提取地址而提供的一假想分支目标地址。25.如权利要求23所述的微处理器,其特征在于,还包括一假想调用/返回堆栈,对应至BTAC,储存数个假想返回地址;其中该控制逻辑使微处理器假想分支至该假想调用/返回堆栈依据该提取地址而提供的其中一该数个假想返回地址。26.如权利要求25所述的微处理器,其特征在于,BTAC被组态为提供一指示,以指出该假定的分支指令是否为返回指令。27.如权利要求26所述的微处理器,其特征在于,只有在该指示指出该假定的分支指令是返回指令时,该控制逻辑才使微处理器假想分支至该假想调用/返回堆栈所提供的假想返回地址。28.如权利要求27所述的微处理器,其特征在于,BTAC被组态为提供一指示,以指出该假定的分支指令是否为调用指令。29.如权利要求28所述的微处理器,其特征在于,若该指示指出该假定的分支指令是调用指令,则该控制逻辑使该假想调用/返回堆栈所提供的假想返回地址被推入该假想调用/返回堆栈中。30.如权利要求23所述的微处理器,其特征在于,该选择器系响应该假定分支指令是否会被采用的一解析方向而更新。31.如权利要求30所述的微处理器,其特征在于,若该第一与第二预测中一被选取的预测是不正确的,且若该第一与第二预测中一未被选取的预测是正确的,则该选择器系响应该解析方向而更新。32.如权利要求31所述的微处理器,其特征在于,该选择器系通过切换(toggling)该选择器而更新。33.如权利要求31所述的微处理器,其特征在于,该选择器系通过使选择器朝该未被选取的预测计数而更新。34.如权利要求23所述的微处理器,其特征在于,该BHT包括一具数个储存组件的数组,用来为数个分支指令的每一个储存一分支历史。35.如权利要求34所述的微处理器,其特征在于,为该数个分支指令的每一个所储存的该分支历史包括一被采用/不被采用(taken/nottaken)位。36.如权利要求34所述的微处理器,其特征在于,为该数个分支指令的每一个所储存的该分支历史包括一饱和上/下数计数器。37.一种在一微处理器中进行假想分支的方法,其特征在于,该方法包括产生一指令的数个假想分支方向预测;选取该数个假想分支方向预测的一作为一最后方向预测;以及若该最后方向预测指出该指令将被采用,则使微处理器进行假想分支;其中该产生、选取以及假想分支的动作皆在译码该指令之前执行。38.如权利要求37所述的方法,其特征在于,还包括在该假想分支的动作之后,侦测该最后方向错误地指出该指令将被采用。39.如权利要求38所述的方法,其特征在于,还包括因应该侦测动作,分支至一正确目标地址。40.一种在一微处理器中进行假想分支的方法,其特征在于,该方法包括产生一分支指令是否将被采用的第一与第二预测,以响应于一指令高速缓存提取地址的第一与第二二进制函数;选取该第一与第二预测其中之一作为一最后预测,该选取的动作系响应该提取地址的一第三二进制函数而执行;以及若该最后预测指出该分支指令将被采用,则微处理器进行假想分支其中不论该分支指令是否存在于该提取地址所选取的一指令快取线中,该产生、选取以及假想分支的动作皆被执行。41.如权利要求40所述的方法,其特征在于,该第一与第二函数系不同的函数。42.如权利要求40所述的方法,其特征在于,该第二二进制函数包括该提取地址与一全域分支历史的一二进制函数。43.如权利要求42所述的方法,其特征在于,该第二二进制函数包括至少一部分该提取地址与该全域分支历史的一异或运算。44.如权利要求40所述的方法,其特征在于,该第一与第三二进制函数系相同的函数。45.如权利要求44所述的方法,其特征在于,该第一与第三二进制函数包括一预先决定(predetermined)数量的该提取地址的最低有效位。45.如权利要求16所述的微处理器,其特征在于,该假想BTAC与该指令高速缓存实质上被并行存取。46.一种用以从错误地分支至一假想目标地址的情况回复的方法,其特征在于,包括为一分支指令产生一假想目标地址,该分支指令被假定存在于一提取地址所选取的一指令快取线中;分支至该假想目标地址,不论该假定的分支指令是否存在于该指令快取线中;在产生该假想目标地址后,产生该假定的分支指令的一正确目标地址;确定该假想目标地址是否匹配该正确目标地址;以及若假想目标地址不匹配该正确目标地址,则分支至该正确目标地址。47.如权利要求46所述的方法,其特征在于,还包括在该确定动作之前,储存一指示,以指出该分支至假想目标地址的动作是否发生;以及只有在该指示指出该分支至假想目标地址的动作发生时,才进行该分支至该正确目标地址的动作。48.如权利要求46所述的方法,其特征在于,该产生正确目标地址的动作包括使用假定的分支指令的数个指令字节来计算该正确目标地址。49.如权利要求46所述的方法,其特征在于,还包括若该假想目标地址不匹配该正确目标地址,则以该正确目标地址更新一分支目标地址高速缓存中的一包括该假想目标地址的项目。50.一种用以从错误地分支至一分支指令的一假想目标地址的情况回复的方法,该分支指令被假定存在于一指令快取线中,该指令快取线由一指令高速缓存响应一提取地址而提供,该假想目标地址由一分支目标地址高速缓存(BTAC)响应该提取地址而假想地产生,其特征在于,该方法包括在BTAC假想地产生该假想目标地址后,译码该假定的分支指令;因应该译码动作,确定该假定的分支指令是否为一非分支指令;以及若该假定的分支指令为一非分支指令,则分支至该假定的分支指令的一指令指针。51.如权利要求50所述的方法,其特征在于,还包括因应该译码动作,计算该假定的分支指令的该指令指针。52.如权利要求50所述的方法,其特征在于,还包括若该假定的分支指令为一非分支指令,则使BTAC中一包括该假想目标地址的项目无效。53.如权利要求52所述的方法,其特征在于,使该项目无效的动作先于该分支至该指令指针的动作而执行。54.一种用以从错误地分支至一假想目标地址的情况回复的方法,该假想目标地址关联于假定存在于一提取地址所选取一快取线中的一分支指令,该假想目标地址由一分支目标地址高速缓存(BTAC)响应该提取地址而提供,其特征在于,该方法包括在BTAC提供该假想目标地址后,译码该假定的分支指令;确定该假定的分支指令的一长度;以及若假定的分支指令的该长度与分支目标地址高速缓存所假想提供的一指令长度不相匹配,则分支至该假定的分支指令的一指令指针。55.如权利要求54所述的方法,其特征在于,还包括若假定的分支指令的该长度与分支目标地址高速缓存所假想提供的该指令长度不相匹配,则使BTAC中一包括该假想目标地址的项目无效。56.如权利要求55所述的方法,其特征在于,使该项目无效的动作先于该分支至该指令指针的动作而执行。57.一种用以从错误地分支至一假想目标地址的情况回复的方法,其特征在于,包括产生一分支指令的一假想目标地址,该分支指令被假定存在于一提取地址所选取一指令快取线中;产生该假定的分支指令的一假想方向预测;分支至该假想目标地址,不论该假定的分支指令是否存在于该指令快取线中;在产生该假想方向预测后,产生该假定的分支指令的一正确方向;确定该正确方向是否不被采用;以及若该正确方向不被采用,则分支至假定的分支指令的下个指令的一指令指针。58.如权利要求57所述的方法,其特征在于,还包括若该正确方向不被采用,则响应该正确方向而更新一分支目标地址高速缓存中的该假想方向预测。59.一种用于一微处理器中的装置,用以侦测是否错误地分支至一假想调用/返回堆栈所提供的一假想返回地址,其特征在于,该装置包括一储存组件,储存一指示,以指出该微处理器是否在不知关联于该指示的一指令是否为分支指令的情况下,分支至该假想返回地址;一指令译码逻辑,组态为在微处理器分支至该假想返回地址后接收并译码该指令;一预测检查逻辑,对应至该指令译码逻辑,用以告知分支控制逻辑,若指令译码逻辑指出该指令不是分支指令且该指示显示微处理器分支至假想返回地址,则微处理器已错误地分支至假想返回地址。60.一种微处理器,用以侦测及更正一错误的假想分支,其特征在于,包括一指令高速缓存,提供一提取地址所选取的一指令字节线;一假想调用/返回堆栈,因应该提取地址而提供一先前执行的分支指令的一假想返回地址,不论该先前执行的分支指令是否存在于该指令字节线中;一控制逻辑,对应至该假想调用/返回堆栈,组态为控制一多工器在一第一周期选取该假想返回地址作为提取地址;以及一预测检查逻辑,对应至该控制逻辑,用以侦测控制逻辑是否控制该多工器错误地选取了该假想返回地址;其中该控制逻辑更组态为控制该多工器在一第二周期选取一正确地址作为提取地址,控制逻辑选取该正确地址,以响应预测检查逻辑侦测到控制逻辑控制该多工器错误地选取了该假想返回地址。61.一种用于一微处理器中的方法,用以从错误地分支至一假定分支指令的一假想目标地址的情况回复,其特征在于,该方法包括因应一指令高速缓存的提取地址而提供一假想目标地址;因应该指令高速缓存的提取地址而产生一指令快取线;在提供该假想目标地址后从该指令快取线译码一指令;其中该微处理器为第一次执行该指令的译码;在该译码动作前分支至该假想目标地址;以及在该分支至假想目标地址的动作后,响应该译码动作分支至该指令的一正确的目标地址。62.一种用以从错误地分支至一假想目标地址的情况回复的方法,其特征在于,包括提供一分支指令的一假想目标地址,该分支指令被假定存在于一提取地址所选取一指令快取线中;分支至该假想目标地址,不论该假定的分支指令是否存在于该指令快取线中;以及若该假定的分支指令不存在于该指令快取线中,则更正一错误的分支。63.一种用于一微处理器中的分支装置,用以侦测该微处理器何时错误地分支至一假想目标地址,该假想目标地址由一分支目标地址高速缓存(BTAC)所提供,其特征在于,该装置包括一分支命中指示,用以指出该微处理器何时分支至该假想目标地址,不论关联于该分支命中指示的一指令是否为分支指令,皆提供该分支命中指示;一指令译码逻辑,组态为接收及译码该指令,并指出该指令是否为分支指令;一预测检查逻辑,对应至该指令译码逻辑,用以确定该微处理器错误地分支至该假想目标地址;其中当指令译码逻辑指出该指令不是分支指令,以及该分支命中指示显示该微处理器分支至该假想目标地址时,该微理器即为错误地分支至该假想目标地址。全文摘要本发明涉及一种装置,用以侦测由一流水线化微处理器所作的错误的假想分支,以及更正该错误的假想分支。一分支目标地址高速缓存(BTAC)快取已执行的分支指令的目标地址。在流水线初期,于译码一指令前,基于一指令高速缓存的提取地址命中BTAC而执行一假想分支至一快取目标地址。当该假想分支执行时,一命中位被设定。稍后在流水线中,该假定的分支指令被译码和执行。若该命中位因该指令而被设定,则检查该已译码的指令,并将正确的目标地址及方向与假想的版本做一比较,以确定该假想分支是否错误。若侦测到错误,该分支目标地址高速缓存就会更新或无效化,且处理器会分支至适当地址以更正错误。文档编号G06F9/38GK1397879SQ0211855公开日2003年2月19日申请日期2002年4月27日优先权日2001年5月4日发明者葛兰·亨利,汤玛斯·麦当劳,泰瑞·派克斯申请人:智慧第一公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1