非循序执行的微处理器及其操作方法

文档序号:6603194阅读:174来源:国知局

专利名称::非循序执行的微处理器及其操作方法
技术领域
:本发明是有关于非循序执行微处理器(out-of-orderexecutionmicroprocessor),特别是有关于非循序执行微处理器内的存储器加载指令的效能。
背景技术
:微处理器具有加载指令(loadinstruction),用以将数据由存储器来源位置(sourcememorylocation)加载至微处理器的暂存器;以及储存指令,用以将数据由微处理器的暂存器储存至存储器目的地位置(destinationmemorylocation)。一般而言,微处理器会遭遇的情况是加载指令所指定(specify)的存储器来源地址等同于较先前的(older)储存指令的存储器目的地地址。换言之,较先前的储存指令将数据写入至加载指令正在读取的存储器地址。这种情况通常称为储存碰撞(storecollision)。当储存碰撞发生时,为了要正确地执行程序,微处理器必须确定加载指令接收由较先的地址重迭的储存指令所写入的数据。非循序执行微处理器并不依照程序顺序(outoftheprogramorder)来执行指令。当储存碰撞发生时,这会是个问题,原因在于加载指令可能会在较先前的储存指令之前被发布(issued)并执行,因此使得加载指令接收到错误的数据。在这种情况下,加载指令不能将加载的数据退返(retire)至其架构目的地暂存器(architecturaldestinationregister)。更确切地说,加载指令必须接收正确的储存数据,并且将正确的数据退返至目的地暂存器(destinationregister)。让加载指令能够接收正确的储存数据的一种方法是重新执行(replay)。换言之,微处理器会检测前述的情况,并在执行储存指令之后,使得加载指令被重新发出并且重新执行。由于储存指令已经被执行,故在后续执行操作中,加载指令将可接收到正确的储存数据。然而,重新执行指令所付出的代价是相当大的,特别是发生在具有非常多管线级的微处理器中。首先,储存指令可能依附于其它指令;事实上,储存指令是位于相依性长链接(longchainofdependencies)的一端,所以储存指令可能不会执行这么多时钟;因此,加载指令在被重新执行之前可能要等待很多时钟周期。若加载指令在重新执行前须等待的时钟周期愈多,则处理加载指令所造成的效能损失(penalty)也就愈严重。此外,当加载指令被重新发布并重新执行时,加载指令必须通过相关管线级(relevantpipelinestages)而被再次地传回(passbackagain),并因此花费更多时钟周期。若加载指令需要通过愈多的管线级才能将加载指令传回,以处理加载指令的时钟周期数来看,则效能损失也就愈严重。Panwar等人的专利(美国专利号6,006,326)借着使用储存关于加载指令和储存指令的彩色位(colorbits)的特殊阵列(specialarray)试图解决这个问题。彩色位阵列中所包含的项目(entries)对应于指令高速缓存的项目,当加载指令或储存指令由指令高速缓存(instructioncache)被读取时,彩色位阵列亦会被读取。在发布早先于储存指令的加载指令而造成的重新执行之后,彩色位阵列中相应的一个项目的彩色位会被更新为相同的色彩值(colorvalue),用以表示加载指令和储存指令的相依性(依附关系)。当储存指令和加载指令再度被设置于管线中而执行时,相依性比对逻辑(d印endencycheckinglogic)检测到储存指令和加载指令具有相同的色彩值,故将相依性回报至指令调度逻辑器(instructionschedulinglogic),其中指令调度逻辑器在具有类似色彩的储存指令(similarlycoloredstoreinstruction)已经被调度后,才对此加载指令进行调度。因为彩色位阵列需要为指令高速缓存的每个加载指令和储存指令储存彩色位,所以彩色位阵列的大小会是指令高速缓存项目个数的函数。因为指令高速缓存的项目数目通常很多,所以彩色位阵列的潜在缺点是其在微处理器中需要大量的储存空间。一个大的彩色位阵列会消耗大量的电源和微处理器的物理空间。因此,需要一种新的机制,用以减少在非循序执行微处理器中发生储存碰撞时,重新执行加载指令的次数。
发明内容本发明实施例提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括队列存储器以及暂存器别名表。队列存储器包括多个项目,每个项目用以存放加载指令的指令指针和用来识别储存指令的信息,信息会使得第一加载指令在执行时被要求重新执行。暂存器别名表耦接于队列存储器,用于依据循序排列的多个指令以产生多个相依性,以便判断多个指令何时能够非循序执行,其中暂存器别名表用以在遇到第二加载指令时,判断第二加载指令的指令指针是否符合于队列存储器的项目的一者的指令指针,以及当判断符合时,使得第二加载指令依附于所符合的项目中的信息所识别的储存指令。本发明实施例提供一种非循序执行微处理器的操作方法,用以减少因储存碰撞而必须在非循序执行微处理器中重新执行加载指令的可能性,非循序执行微处理器具有暂存器别名表,暂存器别名表用于依据循序排列的多个指令以产生多个相依性,以便判断多个指令何时能够非循序执行,非循序执行微处理器的操作方法包括在第一加载指令重新执行时,指派队列存储器的多个项目的一者;于所指派的项目中存放加载指令的指令指针和用来识别储存指令的信息,信息会使得第一加载指令重新执行;于上述暂存器别名表遇到第二加载指令时,判断第二加载指令的指令指针是否符合于队列存储器的项目的一者的指令指针;以及使得第二加载指令依附于所符合的项目中的信息所识别的储存指令。本发明实施例提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括队列存储器以及暂存器别名表。队列存储器包括多个项目,每个项目存放用以识别储存指令的来源的信息以及相依性,其中相依性用以识别储存指令为了其储存数据所依附的指令,而储存数据的来源用以计算储存指令的储存地址。暂存器别名表耦接于队列存储器,暂存器别名表用于依据循序排列的多个指令以产生多个相依性,以便判断指令何时能够非循序执行,其中当暂存器别名表遇到加载指令时,暂存器别名表判断加载指令中用以计算其加载地址的来源是否符合于队列存储器的一项目中储存指令的来源,且若符合,则使得加载指令共享所符合的储存指令的相依性。本发明实施例提供一种非循序执行微处理器的操作方法,用以减少因储存碰撞而必须在非循序执行微处理器中重新执行加载指令的可能性,非循序执行微处理器具有暂存器别名表,暂存器别名表用于依据循序排列的多个指令以产生多个相依性,以便判断指令何时能够非循序执行,非循序执行微处理器的操作方法包括当暂存器别名表遭遇到储存指令时,指派队列存储器的多个项目的一者;于所指派的项目中,填入用以识别储存指令的来源的信息,并且储存指令的来源地址用以计算储存指令的储存地址;当暂存器别名表遇到加载指令时,判断用来计算加载指令的加载地址的来源是否符合于队列存储器的项目的一者中的储存指令的来源地址;以及若加载指令的来源符合于队列存储器的项目的一者中的储存指令的来源,则使得加载指令共享所符合的储存指令的相依性。本发明实施例提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括第一队列存储器、第二队列存储器以及暂存器别名表。第一队列存储器包括多个项目。第二队列存储器包括多个项目。暂存器别名表耦接于第一和第二队列存储器,暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定指令何时能够非循序执行,其中暂存器别名表用以当暂存器别名表判断出加载指令必须被重新执行时,则指派第一队列存储器的项目,并在所指派的项目中填入加载指令的指令指针;当暂存器别名表遇到储存指令时,指派第二队列存储器的项目,并在所指派的项目中填入相依性,而相依性用以识别储存指令为了其储存数据所依附的指令;以及当暂存器别名表遇到加载指令被后续执行且判断后续执行的加载指令的指令指针符合于第一队列存储器的所指派的项目的指令指针时,使得后续执行的加载指令共享相依性,相依性用以识别第二队列存储器的所指派项目中储存指令为了其储存数据所依附的指令。本发明实施例提供一种非循序执行微处理器的操作方法,用以减少因储存碰撞而必须在非循序执行微处理器中重新执行加载指令的可能性,非循序执行微处理器具有暂存器别名表,暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定指令何时能够非循序执行,非循序执行微处理器的操作方法包括于判断出加载指令必须被重新执行时,指派第一队列存储器的多个项目的一者,并在所指派的项目中填入加载指令的指令指针;当加载指令遇到储存指令时,指派第二队列存储器的多个项目的一者,并在所指派的项目中填入相依性,而相依性用以识别储存指令为了其储存数据所依附的指令;以及当暂存器别名表遇到加载指令被后续执行且判断后续执行的加载指令的指令指针符合于第一队列存储器的所指派的项目的指令指针时,使得后续执行的加载指令共享相依性,相依性用以识别第二队列存储器的所指派项目中储存指令为了其储存数据所依附的指令。图1为本发明中具有扩充式RAT的微处理器的方块图;图2为本发明中图1的SACQ的项目的方块图;图3为本发明中图1的RAT的操作流程图;图4为本发明中图1的ROB的操作流程图;图5为本发明中图1的保留站的操作流程图;图6为本发明中图1的SAAQ的项目的方块图;图7显示图1的微处理器产生加载指令的扩充式相依性信息的流程图,用以说明当发生储存碰撞时避免重新执行的操作;图8为本发明中图1的SDAQ的项目的方块图;图9为本发明中图1的SDDQ的项目的方块图;图10显示图1的微处理器产生加载指令的扩充式相依性信息的流程图,用以说明当发生储存碰撞时避免重新执行的操作;图11为本发明中图1的微处理器指定并更新SDAQ项目的流程图。具体实施例方式本文所述实施例为管线化(pipelined)的非循序执行微处理器,用以在发生储存碰撞时,减少加载指令重新执行的次数。微处理器包括一暂存器别名表(registeraliastable,RAT),用以预测加载指令何时会发生储存碰撞,并使得加载指令与一个附加指令(additionalinstruction)具有依附关系,而加载指令通常不会与该附加指令具有依附关系。在本文中,通过RAT而被加载指令依附的附加指令称为被依赖者指令(d印endeeinstruction)。这种附加或扩充式的相依性会使得微处理器的发布逻辑器等到被依赖者指令已经执行后(即已经产生其执行结果),才发布加载指令。故被依赖者指令的执行结果能够被发送(转交)至加载指令,或是能够自数据高速缓存而被读取。因此,当发布逻辑器(issuelogic)将加载指令发布来执行时,因为加载指令将会接收到正确的数据,所以加载指令不需被重新执行。在一实施例中,RAT将用以识别(identify)操作数来源(sourcesofoperands)的信息储存在队列存储器(queue)中,其中用以识别操作数来源的信息由RAT用以计算所遭遇到的最近的(mostrecent)储存指令的储存地址。当遇到加载指令时,RAT会比较用以计算加载地址的来源与队列存储器中储存地址的来源。若符合,则RAT预测储存碰撞会发生,故使得加载指令和储存指令具有相依性(依附关系)。换言之,RAT使得加载指令与储存指令依附于同一个被依赖者指令,而储存指令则为了其储存数据亦依附于此被依赖者指令。在另一实施例中,当加载指令与具有未解析储存位置的较先的储存指令发生储存碰撞而接收到错误的数据,并因而被重新执行时,RAT会将此加载指令的指令指针(instructionpointer)和用以识别此储存指令的信息储存在一队列存储器中。随后,当RAT遇到另一个加载指令(RAT是由于储存指令的指令指针值符合于队列存储器中的其中一个指令指针,而判断出遇到另一个加载指令)时,RAT使得加载指令依附于相符的队列存储器项目所识别的储存指令。在另一实施例中,当RAT遇到一储存指令时,RAT将一信息推入(pushinto)—第一队列存储器,其中上述信息用以识别储存指令为了其储存数据所依附到的指令。因此第一队列存储器用以储存有关于RAT最近遇到的储存指令的相依性信息(d印endencyinformation)0当加载指令与不具有储存数据(储存数据尚不存在或尚未有效)的较先的储存指令发生储存碰撞而接收到错误的数据,而加载指令因而被重新执行时,RAT将加载指令的指令指针储存于一第二队列存储器中。接着,当RAT遇到另一个储存指令(RAT是由于储存指令的指令指针值符合于队列存储器中的其中一个指令指针,而判断出遇到另一个储存指令)时,RAT使得加载指令依附于储存指令由于其储存数据而在第一队列存储器中所依附到的指令。RAT根据第二队列存储器中的每个项目中所存放的加载指令的重新执行历史,由第一队列存储器中选择储存指令。当RAT指派(allocates)加载指令到第二队列存储器的某一项目时,RAT清除该项目所对应的重新执行历史,并且在每次该加载指令重新执行后,增加重新执行历史的次数。若重新执行历史的次数超出一既定值,则RAT让加载指令成为循序的(ordered)加载指令,使得加载指令在所有较先的储存指令都被发布后,RAT才会发布加载指令。参考图1,其显示本发明中具有扩充式的RAT134的微处理器100的方块图。在一实施例中,微处理器100是X86巨架构微处理器(macroarchitecturemicroprocessor)。所谓x86巨架构微处理器是指能够正确地执行为x86架构微处理器设计的大部分应用程序的微处理器。若微处理器100能够获得其预期的结果,则称其应用程序能够正确地执行。具体而言,微处理器100用以执行x86指令集的指令,并且包括x86可见暂存器集合(x86user-visibleregisterset)。然而,本文中所述的用以降低加载指令被重新执行的机制(reductionmechanics)亦可使用于目前的或是未来的其它架构的微处理器。微处理器100包括一指令高速缓存(instructioncache)106,用以储存来自系统存储器(图1未图标)的程序指令。微处理器100亦包括一指令解码器(instructiondecorderUOS,用以接收来自指令高速缓存106的指令并将其解码。在一实施例中,指令解码器108包括指令转译器(instructiontranslator),用以将微处理器100的一宏指令集(macroinstructionset)的宏指令转译为微处理器100的一微指令集(microinstructionset)的微指令。具体而言,指令解码器108将存储器存取指令(memoryaccessinstructions)(例如x86MOV、PUSH、POP、CALL、RET等指令)转译为一个微指令的序列,上述序列包括一或多个加载微指令或储存微指令,其中为了简化说明将其称为一个加载指令或一个储存指令。在其它实施例中,上述加载指令和储存指令是微处理器100原生指令集(nativeinstructionset)的一部分。微处理器100亦包括一RAT134,耦接于指令解码器108;—保留站(reservationstation)136,耦接于RAT134;—重整缓冲器(reorderbuffer,简称为ROB)172,耦接于RAT134和保留站136;执行单元138,耦接于保留站136和ROB172;以及架构暂存器(architecturalregister)162,耦接于ROB172和执行单元138。执行单元138包括存储器重整缓冲器(memoryorderbuffer,简称为MOB)182或者称为存储器子系统182,用以执行存储器存取指令,例如加载指令与储存指令。具体而言,M0B182根据加载指令与储存指令,由与其耦接的数据高速缓存186中读出数据,或者是写入数据至与其耦接的高速缓存186中。此外,M0B182对应于一总线接口单元(图1未显示),用以将数据由系统存储器读出,或者是写入系统存储器。虽然M0B182并非依照程序次序地接收加载和储存指令来加以执行,但是M0B182仍可以正确地解析出储存碰撞。换言之,M0B182会确保每个加载指令接收到正确的数据,具体而言,接收到来自正确的储存指令(或多个储存指令,单一加载指令所指定的数据由多个储存指令所提供的情况下)的正确的数据以免发生储存碰撞。如有必要,M0B182会产生一重新执行信号166至ROB172,用以要求ROB172将加载指令重新执行,以确保本身(M0B182)能够接收到正确的数据。然而,本实施例试图减少M0B182必须提出请求以重新执行加载指令的次数。执行单元138亦包括用以执行非存储器存取指令的其它执行单元184,例如整数指令执行单元、浮点数指令执行单元、多媒体指令执行单元,以及类似的执行单元。RAT134依照程序次序地由指令解码器108接收解码的指令,并且判断微处理器100中每一个指令与其它未退返指令的相依性。RAT134会储存微处理器100中有关于每个未退返指令的暂存器更名信息(registerrenaminginformation)。暂存器更名信息包括(incorporates)这些未退返指令的程序次序。此外,RAT134包括一复杂状态机(complexstatemachine),用以根据更名信息和RAT134的其它输入,控制微处理器100的多种操作。RAT134包括一相依性产生器(cbpendencygenerator)188,用以根据每个指令的程序次序、每个指令所指定的操作数来源,以及更名信息(renaminginformation)来产生每个指令的相依性信息(cbpendencyinformation)158。相依性信息158包括指令中每个输入操作数的一识别符(identifier),即输入操作数所依附的被依赖者指令的识别符。在一实施例中,识别器是R0B172中的项目的一个索引(index),用以识别R0B172中的一个项目,而该项目用以储存被依赖者指令以及被依赖者指令所相关的状态信息,如下所述。相依性信息158包括一般的(normal)相依性信息。相依性信息158亦包括有关于加载指令的扩充式或附加的相依性信息,用以降低由于储存碰撞导致加载指令被重新执行的可能性。RAT134根据提供来源操作数(sourceoperands)的指令的暂存器来产生一般的相依性信息。举例而言,在下列表1所示的程序码序列(codesequence)中,第(1)列中的指令ADD将R5和R6的内容相加并将结果放入R3。第⑵列中的指令SUB将R3的内容减掉R8的内容并将结果放入R7。因为指令ADD在程序次序上先前于指令SUB,且指令SUB指定R3作为其操作数来源之一,并且指令ADD指定R3作为其结果的目的地,所以指令SUB与指令ADD具有相依性(或是依附关系)。因此,指令SUB中第一操作数来源的一般的相依性信息包括指令ADD的R0B索引,使得保留站136在指令ADD被执行后(即指令ADD已经产生其结果并且该结果对指令SUB是有效的(存在的或可取得的时候))才会发布指令SUB。在一实施例中,微处理器100执行暂存器更名,R0B172中由架构暂存器162更名而成的临时暂存器(temporaryregister)是作为用以提供输入操作数的暂存器。(l)ADDR3,R5,R6(2)SUBR7,R3,R8表1RAT134被加以扩充(enhanced),用以预测加载指令何时会发生储存碰撞,并在一般的相依性信息之外亦产生扩充式相依性信息,使得加载指令依附于一个附加指令,而加载指令通常不会依附于该附加指令。RAT134产生扩充式相依性信息是为了减少加载指令需被重新执行的可能性。在一实施例中,RAT134将一被依赖者指令的ROB索引包括于一加载指令的一个未使用的输入操作数字段(一第三输入操作数字段)内,以便让上述加载指令依附于上述被依赖者指令。RAT134包括多个队列存储器,RAT134借着上述队列存储器作出储存碰撞的预测,并产生扩充式的加载指令相依性。上述队列存储器包括储存地址碰撞队列存储器(storeaddresscollisionqueue,简称为SACQ)192、储存地址别名队列存储器(storeaddressaliasqueue,简称为SAAQ)194、储存数据别名队列存储器(storedataaliasqueue,简称为SDAQ)196以及储存数据相依性队列存储器(storedatadependencyqueue,简称为SDDQ)198,图2、图6、图8和图9将分别详细说明每个上述队列存储器的项目。RAT134会派送(dispatches)已解码指令(decodedinstruction)和有关于已解码指令的相依性信息158至保留站136。在派送指令之前,RAT134会为指令指派ROB172的一个项目。因此,指令会依照程序次序地被指派至R0B172,其中ROB172是环形队列存储器(circularqueue)。这使得ROB172得以确保指令能够依照程序次序地被退返。RAT134亦将相依性信息158提供予ROB172,用以将指令的项目储存于ROB172。当ROB172重新执行一指令(如加载指令)时,ROB172在重新执行该指令的期间,将储存在ROB项目中的相依性信息提供予保留站136。保留站136包括多个队列存储器,用以存放(hold)由RAT134接收的指令和相依性信息158。保留站136亦包括一发布逻辑器,用以当指令准备好将被执行时,将指令由队列存储器发布至执行单元138。当一指令的所有相依性都是已解析的(resolved)时,该指令是准备好将被发布且执行的。当被依赖者指令已经执行并使得其执行结果对所依附指令(依赖者指令)是有效的时,依赖者指令的相依性则是已解析的(即此执行结果对即将执行所依附指令的执行单元而言是有效的)。执行单元138经由架构暂存器162、经由R0B172中由架构暂存器162更名而得的临时暂存器(图1未图示),或者经由直接来自执行单元138本身的转发路径(forwardingpaths)176,来接收已执行指令的结果164。执行单元138亦提供其结果164至R0B172,以便写入至临时暂存器。M0B182使用由加载指令和储存指令所指定的来源操作数来为加载指令解析(即计算)加载地址,以及为储存指令解析储存地址。操作数的来源包括架构暂存器162、常数,及/或由指令指定的位移(displacements)。M0B182亦通过所解析的加载地址(resolvedloadaddress)由数据高速缓存186中读取加载数据。M0B182亦通过所解析储存地址将储存数据写入至数据高速缓存186中。在一实施例中,M0B182包括用以执行加载指令的一加载单元,以及用以执行储存指令的一或多个储存单元。如上所述,在一些情况下,M0B182必须要求加载指令的重新执行,其中重新执行以提供至R0B172的重新执行信号166表示。重新执行信号166指定需被重新执行的指令(例如加载指令)的R0B索引,使得R0B172能够以重新执行所需的指示(indication)将索引项目(indexedentry)加以更新。在一实施例中,重新执行信号166亦指定与加载指令碰撞的储存指令的R0B索引,该碰撞使得加载指令必须重新执行。当具有被标记为需被重新执行的R0B索引的指令将紧接着被退返时(即最先的未退反指令),R0B172重新执行加载指令。换言之,R0B172将加载指令和其相关的相依性信息158由ROB172重新派送(re-dispatches)至保留站136,等待以后重新发布(re-issuance)至执行单元138并被其重新执行(re-execution)。在一实施例中,ROB172不仅将加载指令重新执行,亦将后于(newer)加载指令的所有指令重新执行。当R0B172重新执行加载指令时,ROB172以重新执行信号168通知(signals)RAT134此事件(event)。重新执行信号168用以指定被重新执行的加载指令的R0B索引。参考图2,其显示用以说明本发明图1的SACQ192的项目202(以下简称SACQ项目202)的方块图。SACQ项目202用以存放RAT134所遇到的储存指令的信息。RAT134会如图3和图4所述地指派、填入(populates)并使用SACQ项目202。SACQ项目202包括一有效位(validbit)204,用以指出此SACQ项目202是否有效。在重置时,微处理器100将所有的SACQ项目202初始化为无效的(invalid),意即清除每个SACQ项目202的有效位204。SACQ项目202亦包括一srcA字段(srcAfield)206和一srcB(srcBfield)字段208,分别用以识别第一和第二操作数的来源,其中MOB182使用srcA字段206和srcB字段208来计算储存指令的储存地址。srcA字段206和srcB字段208用以识别存放有操作数或作为操作数的常数的架构暂存器162。SACQ项目202亦包括一位移字段(displacementfield)212,用以存放由储存指令所指定的位移,其中MOB182使用位移字段212来计算其储存地址。SACQ项目202亦包括位移有效位(displacementvalidbit)214,用以指出位移字段212的数值是否有效。若储存指令为了其储存数据依附至被依赖者指令,SACQ项目202亦会包括一索引字段(indexfield)216,用以存放被依赖者指令的ROB索引。在一实施例中,RAT134将一既定值填入索引字段216,用以指出储存指令与其储存数据并无相依性。参考图3,其显示用以说明本发明图1的RAT134的操作的流程图。流程始于步骤304。在步骤304,RAT134解码一指令并产生其一般的相依性信息,其中一般的相依性信息被包括于图1的相依性信息158中。流程前进至判断步骤306。在判断步骤306,RAT134判断已解码指令是否为一储存指令。若是,流程前进至步骤308;否则,流程前进至判断步骤312。在步骤308,RAT134会指派SACQ项目202。换言之,就逻辑上而言,RAT134用以将SACQ项目202推入SACQ192的尾端(tail),亦用以将SACQ项目202由SACQ192的前端(head)推出。接着,RAT134将来自储存指令的合适的信息填入所指派的SACQ项目202的srcA字段206、srcB字段208和位移字段212中。若储存指令指定一位移,则RAT134设定(sets)位移有效位214;否则,RAT134会清除位移有效位214。储存指令若由于其储存数据依附至一被依赖者指令,RAT134亦会将被依赖者指令的ROB索引填入索引字段216。最后,RAT134会设定有效位204。在一实施例中,储存指令实际上是两个独立的微指令一个是储存地址(storeaddress,简写为STA)微指令,另一个则是储存数据(storedata,简写为STD)微指令。STA微指令被发布至M0B182的储存地址单元,其中储存地址单元用以计算储存地址。STD微指令被发布至M0B182的储存数据单元,其中储存数据单元用以由来源暂存器(sourceregister)取得储存数据,并且将储存数据发布(posts)至储存缓冲器,以便后续写入存储器。在本实施例中,当RAT134遇见(sees)STA微指令时,RAT134会指派SACQ192的项目202并且将来自储存指令的合适的信息填入srcA字段206、srcB字段208和位移字段212中,而当RAT134遇见(sees)STD微指令时,若储存指令为了其储存数据依附至被依赖者指令,RAT134则会将被依赖者指令的ROB索引填入索引字段216,并且设定有效位204。流程退回至步骤304。在判断步骤312,RAT134判断已解码指令是否为一加载指令。若是,流程前进至判断步骤314;否则,流程前进至判断步骤318。在判断步骤314,RAT134会比较加载指令所指定的来源与SACQ项目202所指定的储存指令的来源,用以判断其(由加载指令指定的来源)是否符合于与SACQ项目202有关的任何储存指令。换言之,RAT134会比较加载指令的第一来源操作数的字段与每个SACQ项目202的srcA字段206、比较加载指令的第二操作数的字段与每个SACQ项目202的srcB字段208,以及比较加载指令的位移字段与每个SACQ项目202的位移字段212。在一实施例中,RAT134亦允许加载指令以调换次序的方式(swappedorder)指定相同的来源暂存器。若对任何一个SACQ项目202而言,上述三种字段均符合,而加载指令用以指定一位移且该位移有效位214是被设定的,或加载指令未指定一位移且该位移有效位214是被清除的,则流程前进至步骤316;否则,流程退回步骤304。在步骤316,RAT134预测出加载指令将与符合于SACQ项目202的较先的加载指令发生碰撞,故因而使得加载指令为了储存指令的储存数据,而分享(共享)储存指令的相依性。换言之,RAT134为加载指令产生扩充式相依性(enhancedcbpendency)158,其中扩充式相依性158用以指定符合于SACQ项目202的指针字段216的数值,如步骤314所述。在一实施例中,MOB182的作用在于若MOB182在相同时钟周期接收到发生储存碰撞的加载和储存指令,则MOB182能够将正确的数据由储存指令转发(forwarding)至加载指令,使得加载指令不需被重新执行。因此,通过产生扩充式相依性让加载指令依附于被预测为将发生碰撞的储存指令,且储存指令是为了其储存数据依附至被依赖者指令,RAT134将让保留站136等待至被依赖者指令之后,才将加载指令和被预测为将发生碰撞的储存指令发布出去,而在多数情况中,加载指令将不会早于被预测为将发生碰撞的储存指令被发布。流程退回步骤304。在判断步骤318,RAT134判断已解码指令是否为能够修正由任何SACQ项目202的srcA字段206或srcB字段208指定为(储存地址)来源的一指令。若是,则流程前进至步骤322;否则,流程退回步骤304。在步骤322,RAT134清除每个SACQ项目202的有效位204,其中有效位204用以指定SACQ项目202的srcA字段206或srcB字段208中的暂存器是否由步骤318判断后的已解码指令所修正。因为加载地址和储存地址将不会重迭,所以RAT134会清除有效位204;因此,让后续的加载指令与SACQ项目202所相关的储存指令共享(分享)储存数据的相依性不太可能会具有帮助。流程退回步骤304。参考图4,其显示用以说明本发明图1的R0B172的操作的流程图。流程始于步骤402。在步骤402,R0B172退返一指令并通知(notify)RAT134。流程前进至判断步骤404。在步骤404,RAT134扫描SACQ192,用以判断是否有任何SACQ项目202的索引字段216符合于被R0B172退返的指令的索引。若有,则流程前进至步骤406;否则,流程退回步骤402。在步骤406中,RAT134清除符合的SACQ项目202的有效位204。这样能够确保RAT134不会为后续的加载指令产生扩充式相依性去依附至一个已被退返的指令。流程退回步骤402。参考图5,其显示用以说明本发明图1的保留站136的操作的流程图。流程始于步骤502。在步骤502,保留站136检查(examines)指令的相依性信息。流程前进至判断步骤504。在步骤504,保留站136判断由有关于一指令的相依性信息指定的所有相依性(dependencies)是否都已被解析。在一实施例中,保留站136会检查由相依性信息158的ROB索引所指定的ROB172项目中的完成位(completebit)。当所有的完成位都是设定的时候,则相依性已被解析。当一执行单元138产生一指令的执行结果时,执行单元138会设定R0B172项目中有关于该指令的完成位。具体而言,在RAT134为加载指令产生扩充式相依性后(如图3步骤316所述),保留站136判断被预测为将发生碰撞的储存指令为了其储存数据所依附的该(加载)指令是否为完成的。若(加载)指令的所有相依性都已被解析,则流程前进至步骤506;否则,流程退回步骤502。在步骤506,保留站136发布具有已被解析的相依性的指令至执行单元138。流程退回步骤402。该已被解析的相依性的指令包含加载指令以及其它种类的指令。根据图2至图5的实施例,图1的微处理器100的操作将以下列表2和表3中程序码序列的处理加以说明。为了简化,在本实施例中,加载和储存指令不包括位移值(displacementvalue)0第(1)列中的加法指令ADD将暂存器R5和R6的内容相加并将结果放入暂存器R3。第(2)列中的储存指令ST将暂存器R3的内容储存至存储器的储存地址,其中储存地址是将暂存器R1和R2的内容相加而得。第(3)列中的加载指令LD将存储器的加载地址加载暂存器R7,其中加载地址是将暂存器R1和R2的内容相加而得。(l)ADDR3,R5,R6(2)STR3,R1,R2(3)LDR7,R1,R2表2当RAT134遇到第⑵列的储存指令ST时,RAT134会执行图3的步骤304至步骤308。换言之,RAT134产生一般的相依性信息158、指派SACQ192的项目,以及将暂存器R1和R2分别填入srcA字段206和srcB字段208。此外,因为暂存器R3是储存指令ST的储存数据的来源暂存器(sourceregister)且暂存器R3亦是加法指令ADD执行结果的目的地暂存器,储存指令ST会由于其储存数据(暂存器R3的储存数据)而依附至加法指令ADD,因此RAT134会将加法指令ADD的ROB索引填入索引字段216。最后,RAT134会清除位移有效位214并且设定有效位204。当RAT134遇到第(3)行的加载指令LD时,RAT134执行程序的流程是由图3的步骤304,经步骤312至步骤316。换言之,在步骤304时,RAT134产生一般的相依性信息158;在判断步骤314时,RAT134检测到加载地址的来源(即暂存器R1和R2)正好符合于刚才为储存指令ST所填入的SACQ项目202的srcA字段206和srcB字段208,故因而产生扩充式相依性信息158。扩充式相依性信息158为刚才为储存指令ST所填入的SACQ项目202的索引字段216的值,并且扩充式相依性信息158会使得加载指令LD依附至第(1)列的加法指令ADD,意即使得加载指令LD为了储存指令ST的储存数据,而共享储存指令ST的相依性,依附至加法指令ADD。因此,根据图5,保留站136在加法指令ADD已经完成后(即加法指令ADD的执行结果对储存指令ST是有效的)才会发布加载指令LD,其中储存指令ST会将执行结果转发至加载指令LD。接着,如图4所述,当R0B172退返第(1)列的加法指令ADD时,RAT134清除有关于第(2)列储存指令ST所对应的SACQ项目202的有效位204。表3中的的程序码序列类似于表2中的程序码序列;然而,在第(2)列的储存指令ST和第(3)列的加载指令LD间的第(2’)列中,有一减法指令SUB,用以将暂存器R8的内容减去暂存器R9的内容,然后将结果放入暂存器R1。(l)ADDR3,R5,R6(2)STR3,R1,R2(2,)SUBRl,R8,R9(3)LDR7,R1,R2表3当RAT134遇到第(2,)列的减法指令SUB时,RAT134执行程序的流程是由图3的步骤304,经步骤318至步骤322。换言之,因为减法指令SUB修改了被SACQ项目202的scrA字段206所指定的暂存器R1的内容,所以RAT134会产生一般的相依性信息158并且清除有关于第⑵列的储存指令ST的SACQ项目202的有效位204。由图1图5和表1表3中的说明可以发现本发明的优点在于RAT134产生的扩充式相依性能够使得加载指令LD和储存指令ST依附于相同的指令。当RAT134遇到加载指令LD和储存指令ST时,因为加载地址和储存地址仍未产生,故即使加载地址和储存地址会发生碰撞,RAT134亦不会由于储存指令ST因此为加载指令产生一般的相依性。相较于Panwar等人以彩色位阵列为基础的系统(美国专利案号6,006,326),图2图5的实施例的优点是为了预测储存碰撞并产生扩充式相依性信息,在本实施例中,不需要让加载指令重新执行其先前的执行;更确切地说,本实施例能够完全避免加载指令的重新执行,意即若用以计算加载地址和储存地址的来源是相同的,则本实施例能够避免加载和储存指令在第一次执行后的重新执行。如前所述,如果时钟周期的严重效能损失是源自于指令的重新执行,则这是显著的优点。然而,RAT产生的扩充式相依性却可能是错误的相依性。换言之,虽然加载地址和储存地址并未重迭,但是RAT134却错误地预测了一次储存碰撞,这项错误实际上会让微处里器花费更多时间来执行加载指令,这是因为加载指令可能在扩充式相依性的被依赖者指令之前就已经被发布,而加载指令不需要被重新执行。然而,发明人发现,对多数程序而言,加载指令重新执行次数的减少所得到的益处远大于错误预测的后果。这可能是重新执行的效能损失相对较大所导致,其中在一实施例中,因为重新执行而导致的效能损失为50个时钟周期,而由错误预测所导致的效能损失为1或2个时钟周期,并且若加载地址和储存地址的来源是相同的,则其重迭的机率也很高。相较于Panwar等人以彩色位阵列为基础的系统(美国专利案号6,006,326),图2图5的实施例的另一种优点是相较于彩色位阵列,本实施例不需要太多的储存空间,并且具有提供附加(concomitant)空间和节能的优点。虽然SACQ的每个项目都可能储存比彩色位实施例更多的位,但是因为彩色位阵列的大小相应于指令高速缓存的每个指令(或指令区块)的项目数量,而SACQ项目的数量远少于彩色位项目的数量,因此,SACQ项目的数量反而比较少。举例而言,在微处理器的一实施例中,发明人发现具有4个项目的SACQ能够大幅减少加载指令重新执行的次数。相较于Panwar等人以彩色位阵列为基础的系统(美国专利案号6,006,326),图2图5的实施例的另一种优点是本实施例能够让加载指令比彩色字节更快被发布。具体而言,彩色位阵列根据其本身的储存指令来产生加载指令的相依性,这表示加载指令只能够在储存指令执行后被发布;反之,图2图5和图8图11的实施例根据发生碰撞的储存指令为了其储存数据而依附的被依赖者指令来产生扩充式相依性,并不是如同Panwar等人是根据有关于发生碰撞的储存指令本身来产生相依性,这表示在一些情况下,通过本处所述实施例,加载指令会比Panwar等人的实施例更快被发布。如同即将被说明的表4中的程序码片段,在一些情况下,图2图4的实施例并未预测到储存碰撞。然而,图6图11的实施例能够预测到该等情况下的储存碰撞。表4中的程序码片段类似于表2中的程序码片段;然而,第(3)列的加载指令LD将暂存器R8(而非暂存器R2)的内容和暂存器R1的内容相加以计算加载地址。因为在第(2)列的储存指令用以计算储存地址的来源与第(3)列的加载指令用以计算加载地址的来源并不相同,所以即使加载地址储存地址互相符合,SACQ192也不会如同图2图5预测可能发生的储存碰撞;然而,图6图11的实施例能够预测到可能的储存碰撞。(l)ADDR3,R5,R6(2)STR3,R1,R2(3)LDR7,R1,R8表4参考图6,其显示用以说明本发明图1的SAAQ194的项目602(以下简称SAAQ项目602)的方块图。因为加载指令的加载地址与具有仍未被产生的储存地址的较先的储存指令发生储存碰撞,所以加载指令接收到错误的数据,且加载指令因此而被重新执行,故SAAQ项目602用以存放被重新执行的加载指令的信息。RAT134会如图7所述地指派、填入并使用SAAQ项目602。SAAQ项目602包括一有效位602,用以指出SAAQ项目602是否有效。在重置时,微处理器100将所有的SAAQ项目602初始化为无效的(即清除每个SAAQ项目602的有效位604)。此外,在一实施例中,每当x86程序码片段的片段描述符(segmentdescriptor)中的程序码限制数值(codesegmentlimitvalue)被写入时,每个SAAQ项目602的有效位604便被清除。SAAQ项目602亦包括一指令指针(instructionpointer,简写为IP)字段606,用以储存加载指令所停留的存储器地址。在一实施例中,IP字段606用于记录在加载指令之后的下一个指令的存储器地址,而非记录加载指令本身的存储器地址。SAAQ602亦包括一差值(delta)字段608,用以储存介于加载指令的ROB索引和储存指令的(在一实施例中,该储存指令为一STA指令)R0B索引之间的差值,该差值是造成加载指令重新执行的原因,如下所述。参考图7,其显示本发明中图1的微处理器100产生加载指令的扩充式相依性信息的流程图,用以说明当发生储存碰撞时避免重新执行的操作。流程始于步骤702。在步骤702,因为加载指令与仍未被M0B182产生的地址的一较先的储存指令发生储存碰撞,所以M0B182检测到已完成的加载指令接收到错误的数据。因此,M0B182并不知道M0B182或执行单元138必需将发生碰撞的储存指令的数据转发至加载指令。在一实施例中,即使M0B182知道有一或多个较先的储存指令的储存地址仍未被解析,也就是即使M0B182知道在加载指令和具有未解析储存地址的储存指令之间有可能发生储存碰撞,M0B182仍允许加载指令存取数据高速缓存186。M0B182这样作是希望储存碰撞从未发生,在这种情况下,相较于M0B182在储存地址被解析后才让加载指令停止等待(才发布加载指令),加载指令能够执行得更快。若存在储存碰撞的情况,即因为M0B182应该都已经将正确的数据从具有未解析地址的发生碰撞的储存指令之处转发出去,加载指令因而接收到错误的数据时,则这么作的后果是加载指令必须被重新执行。流程前进至步骤704。在步骤704,MOB182产生重新执行信号166至ROB172,用以指出步骤702所检测到的情况。具体而言,MOB182输出加载指令的ROB索引和储存指令,其中ROB172使用加载指令的R0B索引来更新加载指令的R0B项目的状态,以便指出加载指令需要被重新执行。流程前进至步骤706。在步骤706,RAT134监测(snoops)MOB182在步骤704产生的重新执行信号166、记录(notes)加载指令的重新执行请求,以及计算加载指令的R0B索引和储存指令的R0B索引之间的差值并将该差值储存于其中。在一实施例中,当RAT134在计算差值时,RAT134会考虑ROB172的环形队列存储器特性的绕回影响(wraparoundaffect)。在表4的实施例中,在步骤704,M0B182输出第(3)列的加载指令LD的R0B索引和第(4)列的储存指令ST的R0B索引;因为上述两个指令在程序次序上是相邻的,所以RAT134计算其R0B索引之间的差值为1。如上所述,在一实施例中,储存指令ST实际上是两个独立的微指令一个是储存地址STA微指令,其次是紧接其后的STD微指令。在本实施例中,在步骤704中,R0B172输出STA微指令的R0B索引,其中STA微指令在程序次序上先前于STD微指令;因此,RAT134计算加载指令的ROB索引和STA微指令的ROB索引之间的差值为2。流程前进至步骤708。在步骤708,R0B172判断紧接的加载指令要被退返,即加载指令已经成为R0B172中最先的指令。R0B172发现(sees)加载指令被标记为需被重新执行并重新执行加载指令。换言之,R0B172重新派送加载指令和其相依性信息158至保留站136,用以等待后续被重新发布至执行单元138,以便重新执行。在一实施例中,R0B172不仅将加载指令重新执行,亦将后于加载指令的所有指令重新执行。此外,R0B172产生重新执行信号168至RAT134。流程前进至步骤712。在步骤712,RAT134会根据步骤708产生的重新执行指令168而指派SAAQ项目602。换言之,RAT134将被指派的新SAAQ项目602推入SAAQ194的尾端(tail),亦将由SAAQ194的前端推出一个SAAQ项目602。接着,RAT134将来自储存指令的IP数值填入IP字段606。RAT134亦将步骤706计算的差值填入差值字段608。最后,RAT134设定有效位604。流程前进至步骤714。在步骤714,RAT134遇到一第二加载指令并为该加载指令产生其一般的相依性信息。此外,RAT134会比较每个有效的SAAQ项目602的IP字段606与加载指令的IP数值。流程前进至判断步骤716。在判断步骤716,RAT134判断步骤714所执行的比较是否显示具有任何SAAQ项目602符合于加载指令的IP数值。若无,则流程结束;否则流程前进至步骤718。要注意的是,RAT134在步骤714/716/718遇到的第二加载指令不同于RAT134在步骤712填入的IP所属的加载指令。因此,当加载指令被重新执行时,RAT134不会将储存指令目前的(actual)R0B索引填入SAAQ项目602。更确切地说,本发明的优点在于当加载指令被重新执行时,RAT134会先将第一次遭遇到的加载指令和储存指令之间ROB索引的差值填入SAAQ项目602,以便RAT134在下一次遇到第二加载指令或在其之后的加载指令时,RAT134能够为较先的储存指令在先前已决定的差值字段608和目前的加载指令产生一扩充式相依性,如以下步骤718所述。发明人已经确认加载指令所需要等待的加载指令和储存指令之间ROB索引的差值极有可能相同于重新执行后的ROB索引。在步骤718,RAT134预测加载指令会与较先的储存指令发生碰撞,因而使得加载指令依附于储存指令,其中较先的储存指令的ROB索引是由符合的SAAQ项目602的差值字段608的数值计算而得。换言之,RAT134为加载指令产生扩充式相依性158,其中扩充式相依性158用以指定ROB索引,而此ROB索引是一个差值,其等于加载指令的R0B索引减去在步骤716所决定的符合的SACQ项目602的差值字段608的数值(即储存指令的R0B索引)。本发明的优点在于因为加载指令依附于储存指令,所以加载和储存指令将依程序次序被发布。具体而言,储存指令会被及时地(intime)执行(即产生其储存地址),以便M0B182检测其与加载地址碰撞的地址。因此,当加载指令到达M0B182时,而储存数据是可取得的(有效的、存在的),M0B182将检测到加载和储存指令间发生碰撞,并且将储存数据转发给加载指令。若储存数据是无法取得的(无效的、不存在的),则M0B182将重新执行加载指令,如以下图8图11所讨论的实施例。在表4的实施例中,因为差值字段608的数值为1(若是STA微指令,则数值是2),所以RAT134将为第(3)列的加载指令LD产生扩充式相依性158,用以指定第(2)列的储存指令ST,使得保留站136进行等待,然后在储存指令ST(或STA微指令)已经发布之后,才发布加载指令LD。流程中止于步骤718。根据一实施例,SAAQ194的IP字段606的长度少于IP地址的位数。因此,即使在步骤716判断有SAAQ项目的IP字段606符合于加载指令的IP数值,亦不能保证加载指令与在步骤708/712被重新执行的加载指令是相同的。此外,亦不能保证在索引的R0B172项目中有一个储存指令,或者是其储存地址与加载指令的加载地址发生碰撞。更确切地说,RAT134只是作出预测而已。然而,发明人发现,虽然RAT134有预测错误的可能性,但是使用图6图7的实施例仍可大幅减少加载指令重新执行的次数。相较于Panwar等人以彩色位阵列为基础的系统(美国专利案号6,006,326),上述图6图7和下述图8图11的实施例的一种优点是上述实施例所需的储存空间少于彩色位阵列,并且具有提供附加空间和节能的优点,如上所述。虽然SAAQ或SAAQ+SDDQ的每个项目都可能比彩色位阵列储存更多位数,但是因为彩色位阵列的项目必须对应到指令高速缓存的每个指令(或指令区块),所以SAAQ或SAAQ+SDDQ项目的数量却可能远少于彩色位阵列的项目数量;因此,SAAQ或SAAQ+SDDQ项目的总存储器数量反而比较少。举例而言,在微处理器的一实施例中,发明人发现具有4个项目的SAAQ、具有4个项目的SDAQ,以及具有2个项目的SDDQ能够大幅减少加载指令重新执行的次数。相较于Panwar等人以彩色位阵列为基础的系统(美国专利案号6,006,326),上述图6图7和下述图8图11的实施例的另一种优点是因为上述实施例提供加载指令重新执行的理由较多较细致,并且试图根据重新执行的不同理由,使用不同方法来预测储存碰撞,所以上述实施例能够大幅减少加载指令重新执行的次数。只有当重新执行是因为已完成的加载指令接收到错误的数据所造成时,图6图7的实施例才会填入SAAQ194的项目,上述成因是加载指令与仍未被M0B182产生的地址的较先的加载指令发生碰撞,M0B182因而并未检测到其必需将发生碰撞的数据转发至加载指令。然而,发明人已经确定有一些储存碰撞引起的(storecollision-induced)加载指令重新执行是不能通过图6图7的实施例而预测的。具体而言,有一些重新执行的起因在于M0B182检测到在执行了一加载指令时,MOB182提供了错误的数据给该加载指令(因为其检测到在加载指令和储存指令间的储存碰撞),但是发生碰撞的储存指令的储存数据却是无效的(不存在的或无法取得的)。本发明的优点在于图8图11的实施例解决了这个问题。具体而言,RAT134会试图为加载指令产生扩充式相依性,让加载指令分享储存指令的相依性,使得加载指令在储存指令为了其储存数据所依附的指令已经发布后,加载指令才会被发布执行,其细节如下所述。参考图8,其显示用以说明本发明图1的SDAQ196的项目802(以下简称『SDAQ项目802』)的方块图。SDAQ项目802用以存放被重新执行的加载指令的信息,加载指令被重新执行的原因是当MOB182执行加载指令时,因为加载指令的加载地址与具有无效的(不存在的或无法取得的)储存数据的储存指令发生碰撞,所以加载指令接收到错误的数据,加载指令因而被重新执行。RAT134会如图10和图11所述地指派、填入并使用SDAQ项目802。SDAQ项目802包括一有效位804,用以指出SDAQ项目802是否有效。在重置时,微处理器100将所有的SDAQ项目802初始化为无效的(即清除每个SDAQ项目802的有效位804)。此外,在一实施例中,每当x86程序码片段的片段描述符中的程序码限制数值被写入时,每个SDAQ项目802的有效位804便被清除。SDAQ项目802亦包括一IP字段806,用以储存加载指令所停留的存储器地址。在一实施例中,IP字段806记录在加载指令之后的下一个指令的存储器地址,而非加载指令本身的存储器地址。SDAQ项目802亦包括一历史字段(histOryfield)808,用以估计(approximates)加载指令的IP字段806的重新执行次数,其细节如以下详述。在一实施例中,历史字段808的数值逐渐递增并在数值等于4时饱和。SDAQ项目802亦包括一索引字段812,用以存放IP字段806所指定地址上最近的加载指令的ROB索引。SDAQ项目802亦包括一索引有效字段814,用以指出索引字段812的数值是否有效。参考图9,其显示用以说明本发明图1的SDDQ198的项目902(以下简称『SDDQ项目902』)的方块图。SDDQ项目902用以存放有关于RAT134最近遇到的储存指令的相依性信息。RAT134会如图10和图11所述地指派、填入并使用SDDQ项目902。SDDQ项目902包括一有效位04,用以指出SDDQ项目902是否有效。在重置时,微处理器100将所有的SDDQ项目902初始化为无效的(即清除每个SDDQ项目902的有效位904)。此外,类似于图4中的R0B172将SACQ172无效化(invalidates)的方式,当ROB172将具有符合于SDDQ项目902的索引字段906的索引字段的指令退返时,R0B172将SDDQ项目902无效化。若储存指令为了其储存数据依附至一被依赖者指令,SDDQ项目902亦会包括索引字段906,用以存放被依赖者指令的R0B索引。在一实施例中,RAT134将一既定值填入索引字段906,指出储存指令不会由于其储存数据而具有依附关系。参考图10,其显示本发明中图1的微处理器100产生加载指令的扩充式相依性信息的流程图,用以说明当发生储存碰撞时避免重新执行的操作。流程始于步骤1004。在步骤1004,RAT134解码一指令并产生其一般的相依性信息,其中一般的相依性信息被包括于图1的相依性信息158中。流程前进至判断步骤1006。在判断步骤1006,RAT134判断已解码指令是否为一储存指令。若是,流程前进至步骤1008;否则,流程前进至判断步骤1012。在判断步骤1008,RAT134指派SDDQ项目902。换言之,在队列存储器逻辑结构上而言,RAT134会将SDDQ项目902推入SDDQ902的尾端(tail),亦会将SDDQ项目902由SDDQ902的前端(head)推出。接着,若储存指令为了其储存数据相依至被依赖者指令,RAT134则将被依赖者指令的ROB索引填入索引字段906。最后,RAT134设定有效位904。在一实施例中,储存指令实际上是两个独立的微指令一个是STA微指令,另一个则是STD微指令。在本实施例中,当RAT134遇见STD微指令时,RAT134指派SDDQ项目902、将被依赖者指令的ROB索引填入索引字段906(若储存指令为了其储存数据依附至被依赖者指令),以及设定有效位904。流程退回步骤1004。在步骤1012,RAT134判断已解码指令是否为一加载指令。若否,流程退回步骤1004;否则,流程前进至步骤1014。在步骤1014,RAT134会比较每个有效的SDAQ项目802的IP字段806与加载指令的IP数值。流程前进至判断步骤1016。在判断步骤1016,RAT134判断步骤1014所执行的比较是否显示具有任何SDAQ项目802符合于加载指令的IP数值。若无,则流程退回步骤1004;否则,流程前进至步骤1018。根据一实施例,SDAQ196的IP字段806长度少于IP地址的位数。因此,即使在步骤1016判断有SDAQ项目符合于加载指令的IP数值,亦不能保证加载指令与在步骤1104中(图11)被重新执行的加载指令是同一个的。在步骤1018,RAT134检查符合的SDAQ项目802的历史字段808的数值。若历史字段808的数值为0或1,则RAT134让加载指令分享(共享)被较后(新)的SDAQ项目902的索引字段906所指定的储存指令的相依性。若历史字段808的数值为2或3,则RAT134让加载指令共享(分享)较先的SDAQ项目902的索引字段906所指定的储存指令的相依性(在一实施例中,SDDQ项目902的数目为2)。若历史字段808的数值大于3,则RAT134让加载指令成为强制依照顺序执行的加载指令。换言之,RAT134为加载指令产生扩充式相依性158,使得保留站136进行等待,然后在所有较先的储存指令(或STA微指令)已经发布之后,才发布加载指令LD。在其它实施例中,SDDQ项目902的数目不为2,并且随着历史字段808的数值的增加,RAT134选择的SDDQ198中更加老旧的储存指令。再者,在其它实施例中,历史字段808的最大数值大于4,且历史字段808的临界数值亦不同于图10的实施例。只有当SDDQ项目902有效时,RAT134才会让加载指令共享(分享)SDDQ项目902所指定的储存指令的相依性;否则,若所有SDDQ项目902都无效时,根据一实施例,则RAT134让加载指令成为强制依照顺序执行的加载指令,并且根据另一实施例,则RAT134并不为加载指令产生扩充式相依性。流程前进至判断步骤1022。在判断步骤1022,RAT134判断索引有效字段814是否为了步骤1016被判断为符合的SDAQ项目802而被设定的。若SQAQ项目802是有效的,流程退回步骤1004;否则,步骤前进至步骤1024。在步骤1024,RAT134以目前的加载指令的ROB索引填入SDAQ项目802的索引字段812,并设定索引有效位字段814,其中目前的加载指令的地址是被IP字段指定的(即RAT134在步骤1004所遇到的加载指令的ROB索引)。流程退回步骤1004。参考图11,其显示本发明中图1的微处理器100指定并更新SDAQ196的项目802(以下简称『SDAQ项目802』)的流程图。流程始于步骤1102。在步骤1102,当MOB182执行加载指令时,MOB182检测到加载指令与不具有储存数据(即储存数据是无效的、不存在的或无法取得的)的储存指令发生碰撞,而且MOB182提供给加载指令的数据是错误的。因此,MOB182产生重新执行信号166给ROB172,用以告知MOB182所检测到的情况。具体而言,MOB182输出加载指令的ROB索引给ROB172,其中ROB172使用加载指令的ROB索引来更新ROB172的项目的状态,以便指出加载指令需要被重新执行。流程前进至步骤1104。在步骤1104,R0B172判断出步骤1105所检测到的加载指令紧接着要被退返,即加载指令已经成为R0B172中最先的指令。ROB172发现加载指令被标记为需被重新执行,因而重新执行加载指令。换言之,R0B172从ROB172重新派送加载指令和其相依性信息158至保留站136,用以等待后续被重新发布至执行单元138并加以重新执行。在一实施例中,R0B172不仅将加载指令重新执行,亦将后于加载指令的所有指令重新执行。此外,R0B172产生重新执行信号168至RAT134。流程前进至步骤1106。在步骤1106,RAT134会比较重新执行的加载指令的IP数值与每个有效的SDAQ项目802的IP字段806。流程前进至判断步骤1108。在判断步骤1108,RAT134判断步骤1106所执行的比较是否显示具有任何SDAQ项目802符合于加载指令的IP数值。若无,则流程前进至步骤1112;否则,流程前进至步骤1114。在步骤1112,RAT134会指派SDAQ项目802。换言之,逻辑上而言,RAT134会将SDAQ项目802推入SDAQ802的尾端(tail),亦会将SDAQ项目802由SDAQ802的前端(head)推出。接着,RAT134将加载指令的IP数值填入IP字段806。RAT134亦将历史字段808清除为0。最后,RAT134设定有效位804。流程中止于步骤1112。在步骤1114,RAT134会比较加载指令的ROB索引与每个有效的SDAQ项目802的索引字段812,其中每个有效的SDAQ项目802的索引有效位是被设定为有效的。流程前进至判断步骤1116。在步骤1116,RAT134判断步骤1114所执行的比较是否显示具有任何SDAQ项目802符合于加载指令的R0B索引。若无,则流程结束;否则,流程前进至步骤1118。在步骤1118,RAT134将符合的SDAQ项目802的历史字段808增量。因为在步骤1102决定将加载指令重新执行,所以加载指令在步骤1104被重新执行,RAT134因而将历史字段808增量。然而,要注意的是,若加载指令是由于其它原因而被重新执行,例如图7的步骤702,则RAT134不会将历史字段808增量。此外,RAT134将索引有效字段814清除。流程中止于步骤1118。根据图8图11的实施例,图1的微处理器100的操作将以下列表5之中程序码序列的处理加以说明。为了简化,在本实施例中,加载和储存指令不包括位移值。表5的第3列至第5列类似于表4的第1列至第3列。然而,在表5,第1列的加法指令ADD和第2列的储存指令ST在程序次序上是先前于的第3列至第5列的指令,其中第1列的加法指令ADD将暂存器R8和R9的内容相加并将结果放入暂存器R4。第⑵列中的储存指令ST将暂存器R4的内容储存至存储器的储存地址,其中储存地址是将暂存器R1和R2的内容相加而得。因此,第2列的储存指令ST与第1列的加法指令ADD具有一般的相依性,如同第4列的储存指令ST与第3列的加法指令ADD具有一般的相依性。(l)ADDR4,R8,R9(2)STR4,R1,R2(3)ADDR3,R5,R6(4)STR3,R1,R2(5)LDR7,R1,R8表5根据图11的步骤1104,假设第5列的加载指令会被重新执行,并且根据图11的步骤1112,RAT134指派SDAQ项目802,并将有关于重新执行的加载指令的IP数值填入SDAQ项目802。一般而言,因为发生碰撞的储存指令已经被退返,所以当加载指令重新执行时,被重新执行的加载指令将成功地执行和退返,这是因为加载指令会在微处理器100中最先的未退返指令(即较先的发生碰撞的储存指令)已经退返后,才被重新执行。假设表5中的指令是程序循环的一部分,并且接着程序会第二次执行表5中的指令,根据图10的步骤1008,RAT134指派SDDQ项目902,并将第2列储存指令ST为了其储存数据所依附的指令的ROB索引填入SDDQ项目902;根据步骤1008,RAT134将第4列储存指令ST为了其储存数据所依附到的指令的ROB索引填入SDDQ项目902;根据图10的步骤1018,RAT134为第5列的加载指令LD产生扩充式相依性158,使得第5列的加载指令LD与第4列的加载指令ST共享(分享)相依性;以及根据图10的步骤1024,RAT134以加载指令LD的索引填入IP符合的(IP-matching)SDAQ项目802的索引字段812,并且将索引有效字段设定为有效的。这会使得保留站136进行等待,在第3列的加法指令ADD执行后,才会发布加载指令LD,亦通常会使得加载指令LD不会早于第4列的储存指令被发布。藉此将能避免因储存碰撞而产生的加载指令重新执行。然而,假设这样作无法避免重新执行且加载指令LD需要被第二次重新执行(因为步骤1102决定的原因),RAT134则会根据步骤1118将历史字段808增量(此时为1)并且清除索引有效字段814。进一步假设程序接着第三次执行表5中的指令,RAT134则会根据步骤1008为两个储存指令ST指派SDDQ项目902并且填入SDDQ项目;根据步骤1018,为加载指令LD产生扩充式相依性158,使得加载指令LD共享(分享)储存指令ST的相依性;并根据步骤1024,以加载指令的ROB索引填入索引字段812,并且将索引有效字段814设定为有效的。假设这样作仍无法避免重新执行且加载指令LD需要被第三次重新执行(因为步骤1102决定的原因),RAT134则会根据步骤1118再将历史字段808增量(此时为2)并且清除索引有效字段814。进一步假设程序接着第三次执行表5中的指令,RAT134则根据步骤1008为两个储存指令ST指派SDDQ项目902并且填入SDDQ项目。在第三次重新执行中,因为历史字段808的数值为2,所以RAT134会根据步骤1018为加载指令LD产生扩充式相依性158,使得加载指令LD共享(分享)第2列储存指令LD的相依性;并且根据步骤1024,以加载指令的ROB索引填入索引字段812。藉此将能避免因储存碰撞而产生的加载指令重新执行。然而,若这样作仍无法避免重新执行,则在历史字段808的数值等于4后,这种模式将不继续操作下去,根据步骤1018,此时RAT134为加载指令产生扩充式相依性158,使得加载指令成为强制依照顺序执行的加载指令,藉此将能避免因储存碰撞而产生的加载指令重新执行。根据本发明的数个实施例,微处理器100能够通过多种方式来避免加载指令重新执行。然而如上所述,要注意的是,在本发明实施例中,可能有其它因素会让微处理器花费更多时间来执行加载指令。举例而言,在一些情况下,由加载指令指定的来源地址可能不会与由储存指令指定的目的地地址发生碰撞,这使得RAT产生错误的预测,在上述情况中,扩充式相依性让保留站不必要地延迟了加载指令的发布。换言之,若无扩充式相依性,则保留站便能够将加载指令发布执行,并且加载指令亦能够正确且快速地被执行而无需被重新执行。然而,发明人发现,对多数程序而言,减少加载指令重新执行次数所得到的益处远大于错误预测的后果。这可能是重新执行的效能损失相对较大所导致,其中在一实施例中,因为重新执行而导致的效能损失为15个时钟周期,而由错误预测所导致的效能损失为1或2个时钟周期,并且若加载地址和储存地址的来源是相同的,则其重迭的机率也很高。产生上述益处的另外一种原因是RAT能够极正确地预测储存碰撞。虽然本发明已经由数种实施例揭露如上,但其仅用以作为例子,并非用以限定本发明。计算器领域的本领域技术人员应能理解,在不脱离本发明的精神的前提下,当可对本发明作些许更动。举例而言,软件能够致能本发明的装置和方法的功能、制造、模型建立、仿真、各种性质,以及/或测试。其能够通过不同的程序语言而达成,例如程序语言(如C、C++)、硬件描述语言(hardwaredescriptionlanguage,HDL,如VerilogHDL、VHDL),或是其它可能的程序语言。上述软件能够设置于任何已知的计算器可读取储存媒体(computerusablemedium),例如半导体、磁盘,或光盘(如CD-ROM、DVD-ROM)。本发明的装置和方法可能包括于任何半导体知识产权核心(semiconductorIPcore)之内,例如(以HDL嵌入的)微处理器核心,或是当集成电路制造时,转移至硬件。此外,本发明可能通过硬件和软件的组合而实现。因此,本发明不应被此处所述的任何实施例所限制,本发明应该是根据所附权利要求范围与其等效的装置/方法而被定义。特别的是,本发明能够设置于一般用途计算器的微处理器装置内。最后,本领域技术人员应能理解到在不脱离由权利要求范围定义的本发明范畴的前提下,其能够以本发明揭露的概念和特定的实施例作为基础,用以设计或修改其它架构来执行与本发明相同的目的。权利要求一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括一第一队列存储器,包括多个项目;一第二队列存储器,包括多个项目;以及一暂存器别名表,耦接于上述第一和第二队列存储器,上述暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定上述指令何时能够非循序执行,其中上述暂存器别名表用以当上述暂存器别名表判断出一加载指令必须被重新执行时,则指派上述第一队列存储器的一项目,并在所指派的项目中填入上述加载指令的一指令指针;当上述暂存器别名表遇到一储存指令时,指派上述第二队列存储器的一项目,并在所指派的项目中填入一相依性,而上述相依性用以识别上述储存指令为了其储存数据所依附的一指令;以及当上述暂存器别名表遇到上述加载指令被后续执行且判断上述后续执行的加载指令的指令指针符合于上述第一队列存储器的上述所指派的项目的指令指针时,使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述第二队列存储器的上述所指派项目中上述储存指令为了其储存数据所依附的上述指令。2.根据权利要求1所述的非循序执行微处理器,其中当执行上述加载指令时,若因为上述加载指令与一较先前的储存指令发生储存碰撞,且发生碰撞的上述较先前的储存指令的储存数据仍然是无效的,而使得上述暂存器别名表判断出上述加载指令必须被重新执行时,上述暂存器别名表是以指派上述第一队列存储器的上述项目,并于上述所指派的项目中填入上述加载指令的上述指令指针。3.根据权利要求1所述的非循序执行微处理器,其中上述暂存器别名表根据上述加载指令的重新执行的历史,选择上述第二队列存储器的上述项目,使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令。4.根据权利要求3所述的非循序执行微处理器,其中上述加载指令的重新执行的上述历史包括在上述第一队列存储器的每个上述项目中的一历史字段,并且当上述暂存器别名表指派上述第一队列存储器的上述项目时,清除上述历史字段,并根据上述后续执行的加载指令,选择性地增加上述历史字段的数值。5.根据权利要求4所述的非循序执行微处理器,其中若上述历史字段的数值小于一既定数值时,则上述暂存器别名表选择上述第二队列存储器的上述项目的最后一者,用以使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令,其中若上述历史字段的数值大于或等于一既定数值时,则上述暂存器别名表选择上述第二队列存储器的上述项目中早于上述最后一者的一较先者,用以使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令。6.根据权利要求4所述的非循序执行微处理器,还包括一发布逻辑器,耦接于上述暂存器别名表,用以根据上述暂存器别名表所产生的上述相依性,将上述指令非循序地发布执行;其中若上述历史字段大于一既定数值,则上述暂存器别名表用以为上述加载指令产生一相依性,使得上述发布逻辑器在所有上述较先的储存指令都已被发布后,才发布上述加载指令。7.根据权利要求3所述的非循序执行微处理器,其中当上述暂存器别名表遇到上述后续执行的加载指令,并且判断出上述后续执行的加载指令的指令指针符合于上述第一队列存储器的一项目的上述指令指针时,上述暂存器别名表用以于上述第一队列存储器的所指派的项目的一字段中填入上述后续执行的加载指令的一识别符,接着当上述暂存器别名表判断出上述加载指令必须被重新执行时,上述暂存器别名表用以使用上述后续执行的加载指令的上述识别符来判断是否更新上述加载指令的重新执行的上述历史字段。8.根据权利要求1所述的非循序执行微处理器,还包括一重整缓冲器,耦接于上述暂存器别名表,上述重整缓冲器包括一阵列,上述阵列包括多个项目,并且上述重整缓冲器依照程序次序地储存多个未退返指令,上述项目的每一者是由写入上述阵列的一索引所识别;其中第二队列存储器的每个上述项目的相依性包括上述储存指令为了其储存数据所依附的上述指令的一重整缓冲器索引。9.根据权利要求1所述的非循序执行微处理器,其中只有当上述加载指令的上述指令指针不符合上述第一队列存储器的任何上述项目的上述指令指针,上述暂存器别名表才于判断出上述加载指令必须被重新执行时,指派上述第一队列存储器的上述项目的一者,并于所指派的项目中填入一加载指令的一指令指针。10.一种非循序执行微处理器的操作方法,用以减少因储存碰撞而必须在非循序执行微处理器中重新执行加载指令的可能性,上述非循序执行微处理器具有一暂存器别名表,上述暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定上述指令何时能够非循序执行,上述非循序执行微处理器的操作方法包括于判断出上述加载指令必须被重新执行时,指派上述第一队列存储器的多个项目的一者,并在所指派的项目中填入上述加载指令的一指令指针;当上述加载指令遇到一储存指令时,指派一第二队列存储器的多个项目的一者,并在所指派的项目中填入一相依性,而上述相依性用以识别上述储存指令为了其储存数据所依附的一指令;以及当上述暂存器别名表遇到上述加载指令被后续执行且判断上述后续执行的加载指令的指令指针符合于上述第一队列存储器的上述所指派的项目的指令指针时,使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述第二队列存储器的上述所指派项目中上述储存指令为了其储存数据所依附的上述指令。11.根据权利要求10所述的非循序执行微处理器的操作方法,其中当执行上述加载指令时,若因为上述加载指令与一较先前的储存指令发生储存碰撞,且发生碰撞的上述较先前的储存指令的储存数据仍然是无效的,而使得上述暂存器别名表判断出上述加载指令必须被重新执行时,上述暂存器别名表是指派上述第一队列存储器的上述项目,并于上述所指派的项目中填入上述加载指令的上述指令指针。12.根据权利要求10所述的非循序执行微处理器的操作方法,还包括根据上述加载指令的重新执行的历史,选择上述第二队列存储器的上述项目,使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令。13.根据权利要求12所述的非循序执行微处理器的操作方法,其中上述加载指令的重新执行的上述历史包括在上述第一队列存储器的每个上述项目中的一历史字段,上述非循序执行微处理器的操作方法还包括清除上述历史字段;以及根据上述后续执行的加载指令,选择性地增加上述历史字段的数值。14.根据权利要求13所述的非循序执行微处理器的操作方法,其中若上述历史字段的数值小于一既定数值时,则上述选择上述第二队列存储器的上述项目的步骤包括选择上述第二队列存储器的上述项目的最后一者,用以使得后续执行上述加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令,其中若上述历史字段的数值大于或等于一既定数值时,则上述选择上述第二队列存储器的上述项目的步骤包括选择上述第二队列存储器的上述项目中早于上述最后一者的一较先者,用以使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令。15.根据权利要求13所述的非循序执行微处理器的操作方法,其中上述非循序执行微处理器还包括一发布逻辑器,耦接于上述暂存器别名表,用以根据上述暂存器别名表所产生的上述相依性,将上述指令非循序地发布执行,上述非循序执行微处理器的操作方法还包括若上述历史字段大于一既定数值,则上述暂存器别名表用以为上述加载指令产生一相依性,使得上述发布逻辑器在所有上述较先的储存指令都已被发布后,才发布上述加载指令。16.根据权利要求12所述的非循序执行微处理器的操作方法,还包括当上述暂存器别名表遇到上述后续执行的加载指令,并且判断出上述后续执行的加载指令的指令指针符合于上述第一队列存储器的一项目的上述指令指针时,上述暂存器别名表用以于上述第一队列存储器的所指派的项目的一字段中填入上述后续执行的加载指令的一识别符;以及当上述暂存器别名表判断出上述加载指令必须被重新执行时,上述暂存器别名表用以接着使用上述后续执行的加载指令的上述识别符来判断是否更新上述加载指令的重新执行的上述历史字段。17.根据权利要求10所述的非循序执行微处理器的操作方法,其中第二队列存储器的每个上述项目的相依性包括上述储存指令为了其储存数据所依附的上述指令的一重整缓冲器索引。18.根据权利要求10所述的非循序执行微处理器的操作方法,其中只有当上述加载指令的上述指令指针不符合上述第一队列存储器的任何上述项目的上述指令指针,上述暂存器别名表才于判断出上述加载指令必须被重新执行时,指派上述第一队列存储器的上述项目的一者,并于所指派的项目中填入一加载指令的一指令指针。全文摘要本发明提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括第一队列存储器,包括多个项目;一第二队列存储器,包括多个项目;以及暂存器别名表,耦接于上述第一和第二队列存储器,暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定上述指令何时能够非循序执行,其中暂存器别名表用以指派上述第一队列存储器的一项目,并在所指派的项目中填入上述加载指令的一指令指针;指派上述第二队列存储器的一项目,并在所指派的项目中填入一相依性;以及使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述第二队列存储器的上述所指派项目中上述储存指令为了其储存数据所依附的上述指令。文档编号G06F9/38GK101853150SQ20101018555公开日2010年10月6日申请日期2010年5月19日优先权日2009年5月29日发明者罗德尼·E·虎克,马修·D·戴申请人:威盛电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1