用于管理返回堆栈的方法和设备的制作方法

文档序号:6366396阅读:119来源:国知局
专利名称:用于管理返回堆栈的方法和设备的制作方法
技术领域
本发明大体上涉及微处理器,且确切地说,涉及管理某些类型的微处理器使用的硬件返回堆栈以便加速从程序调用的返回。
背景技术
由于在要求复杂功能性的不断增加的应用阵列中部署微处理器,所以 需要提高微处理器的执行速度。此外,在例如具有有限电池电力的便携式电子装置的嵌入式应用中,需要减少微处理器的电力消耗。然而,简单地提高微处理器的时钟速度可能不会产生所要的系统性能提高,因为各种输入/输出瓶颈会对微处理器的现实性能强加约束。举例来说,芯片外存储器存取一般比芯片上存储器存取运行得慢,从而导致使用指令和数据高速缓存技术。精简指令集计算机(RISC) —般在每个时钟循环发布一个或一个以上指令,且通常使用指令高速缓存来增强性能。管线RISC处理器可在每个时钟循环发布多个指令,且通常大量使用数据和指令高速缓存。指令高速缓存(“预取”)预测未来指令并在微处理器执行所述指令之前将其放入芯片上指令高速缓冲存储器中。当预取了正确的指令时,预取可消除与较慢芯片外指令存储器相关的大部分延迟。大部分指令依序执行,且可有把握地预取。条件分支指令可“采用”或不“采用”分支,这取决于通常仅在管线深处评估的分支条件。为了避免等待此评估的延迟,通常在管线早期预测分支指令的行为,且从预测的分支目标地址预取指令。指令预取方法包含静态和动态指令预取两者。动态指令预取依赖于指令执行历史,且可能涉及(例如)追踪给定数目的最新近条件分支指令的先前采用或未采用预测的准确性。静态预取一般不依赖于执行历史,且可(例如)在首次遇到条件分支时使用。静态预取为其提供性能优点的一种类型的分支指令是来自被调用程序的返回指令,其中对所述程序的返回地址进行预测以支持对在所述预测返回地址处开始的指令进行预取。可使用“返回堆栈”来支持对程序调用返回指令的返回地址的静态预测。典型的返回堆栈包括多层级缓冲区。当预测或辨别程序调用指令时,可将相应的返回地址从微处理器的指令管线的执行级中取出并推到返回堆栈上。相反,当预测或辨别程序返回指令时,将当前位于返回堆栈顶部的返回地址从堆栈上托,并用作所预测的用于指令预取的返回地址。因此,在常规的管理返回堆栈的方法中,当遇到程序调用时将相应的预测返回地址依序推到返回堆栈上。相反,当遇到程序返回指令时,将返回地址依序从堆栈上托。这种常规方法不正确地预测多层级程序调用中的程序返回地址,其中连续程序调用“串”在一起,因为串中的每一随后程序调用的返回指令均指回到前一程序调用的返回指令。最佳地,应当针对所述串中的最后程序的返回指令预测的返回地址是对应于所述串中的第一程序调用的返回地址。然而,由于连续程序调用导致将每一嵌套程序调用的返回地址依序推到返回堆栈上,因而针对最后程序调用的返回指令上托的返回地址是所述串中的紧接在前的调用程序的返回地址。如果从所述地址继续预取,那么接下来预取的指令将是另一返回,其将再次上托返回堆栈。以此方式连续上托返回堆栈不必要地降低了处理器性能且浪费了电力。

发明内容
本发明包括一种使得微处理器能够正确地预测多层级程序调用中的初始顶部层级调用程序的返回地址的方法和设备。此类多层级程序调用包括一串两个或两个以上连续程序调用,其中每一随后程序的返回地址均指回到紧接在前的程序的返回指令。根据本发明的一个或一个以上实施例的返回堆栈电路不是提供最后推入的返回地址作为串中调用的最后程序中的返回指令的目标,而是从堆栈依序上托某一数目的返回地址,所述数目等于连续调用程序串中的返回层级的数目。这样做时,返回堆栈电路检索初始调用程序的返回地址,可将所述返回地址提供到指令预取单元作为指令预取的目标。因此,在一个实施例中,本发明包括一种基于以下操作来管理返回堆栈的方法确定与返回指令相关联的返回层级数目,且将所述数目的返回地址从返回堆栈上托。可将最后上托的地址提供到指令预取单元作为用于指令预取的目标地址。将从堆栈上托以获得给定返回指令的预测返回地址的返回地址数目可从与返回指令相关联的静态层级指示符值中读取,或者可在程序执行期间在运行中确定。在一个实施例中,层级指示符可包括嵌入在返回指令中的字段或标签,其值已在编译时间处确定。因此,本发明包含一种程序编译方法,其中编译器逻辑确定与返回指令相关联的返回层级数目,并将与返回指令相关联的返回层级指示符设置成对应于所述数目的值。为了确定返回层级数目,编译器可对成串程序调用序列中的程序调用数目计数。一般来说,编译器通过以下操作来确定与返回指令相关联的返回层级数目检测成串的程序调用;追踪给定程序调用串的嵌套深度;以及根据所述嵌套深度设置给定程序调用串中的最后返回指令的返回层级数目。在另一实施例中,微处理器中的返回堆栈电路或其它支持逻辑在运行时间动态地确定与给定返回指令相关联的返回层级数目。通过这种配置,没有必要在编译时间存储返回层级指示符。对返回层级的运行时间确定可基于与用于编译时间实施例的方法相似的方法。举例来说,支持逻辑可对成串程序调用序列中的程序调用数目计数,并基于所述计数为最后调用的程序的返回指令设置返回层级值。更一般来说,动态运行时间追踪包括检测成串的程序调用;追踪给定程序调用串的嵌套深度;以及根据所述嵌套深度设置给定程序调用串中的最后返回指令的返回层级数目。


图I是说明微处理器的方框图。 图2是说明图I的微处理器中使用的返回堆栈的方框图。
图3是说明包括连续成串的程序调用的多层级程序调用的程序指令流程图。图4是说明借以根据给定多层级程序调用中的返回层级数目上托返回堆栈的过程的逻辑流程图。图5是包含嵌入式返回层级指示符的编译器产生的返回指令的方框图。图6是说明借以将返回堆栈上托由嵌入在给定返回指令中或与所述返回指令相关联的层级指示符指示的次数的过程的逻辑流程图。图7是说明用于检测多层级程序调用、追踪此类多层级程序调用内的调用嵌套深度并基于所追踪的深度设置返回层级的过程的逻辑流程图。
具体实施方式

图I至少部分说明微处理器10,其包括处理器内核12、指令预取单元14、指令高速缓冲存储器16、指令高速缓冲存储器控制器18、加载/存储单元20、数据高速缓冲存储器22、数据高速缓冲存储器控制器24以及主翻译后备缓冲区26。以非限制性方式举例来说,微处理器10可以是基于精简指令集计算机(RISC)结构的管线处理器。在一个或一个以上实施例中,内核12包含指令执行单元(未图示),所述单元包括一个或一个以上多级指令管线。在操作中,内核12执行程序指令,并进行相应的加载/存储数据操作。翻译后备缓冲区26接受来自内核12的输入,并向内核12提供输出。更确切地说,翻译后备缓冲区26将内核12分别介接到指令高速缓冲存储器16和数据高速缓冲存储器22。指令和数据高速缓冲存储器16和22包括快速板上存储器,且微处理器10经由指令和数据高速缓冲存储器控制器18和24使用指令和数据预取,以保持高速缓冲存储器填充有接下来需要的指令和数据。确切地说,微处理器10的指令预取操作包含对从被调用程序的返回的指令流进行预测。预测程序返回的地址通过使得微处理器10能够在完成程序之后开始预取最可能需要的指令来改进性能。图2说明内核12用来预测程序返回指令的目标地址的返回堆栈电路30的一个实施例。所说明的返回堆栈电路30包括返回堆栈32和相关联的返回堆栈控制器34。临时存储寄存器可在返回堆栈控制器34的控制下以逻辑方式链接在一起以形成返回堆栈32。可实施各种缓冲区布置,但在一个实施例中,返回堆栈32被配置为后进先出存储器堆栈。当内核的指令管线(未图示)中的指令执行单元预测或另外方面辨别程序调用时,返回堆栈控制器34接收相应的返回地址,并将其推到返回堆栈32上。返回堆栈控制器34因此在预测程序调用时将程序返回地址一次一个地依序推到返回堆栈32上。当遇到或预测到程序返回指令时,返回堆栈控制器34通常上托程序返回地址,从而将其提供到指令预取单元14。然而,与常规的返回堆栈管理方法相反,返回堆栈控制器34不是始终通过一次只从返回堆栈32上托一个返回地址来为指令预取获得返回地址。事实上,返回堆栈控制器34一般经配置以将返回地址依序推到返回堆栈32上,并从返回堆栈32依序上托返回地址,但其经特别配置以确定与给定返回指令相关联的返回层级数目,且将所述数目的返回地址从返回堆栈32上托。接着,将最后上托的返回地址作为预测的程序返回地址提供到预取单元14。
一次从返回堆栈32上托一个以上返回地址的能力允许返回堆栈控制器34正确地预测多层级程序调用中的初始顶部层级调用程序的返回地址。此类多层级程序调用包括一串两个或两个以上连续程序调用,其中每一随后程序的返回地址指回到紧接在前的程序的返回指令。图3说明一系列程序指令,其包含包括多层级程序调用在内的许多程序调用。根据所说明的程序流,“主”程序包含对称为“procl”的程序的调用。Procl程序包含对称为“pr0C2”的程序的调用。Proc2程序包含对称为“proc3”的程序的调用。因此,procl包括连续程序调用链接串中的第一顶部层级程序。程序串的特征在于,每一连续调用的程序中的返回指令的返回地址“指”回到紧接在前的程序的返回指令。也就是说,proc3的返回指令的返回地址是proc2的返回指令的地址,且proc2的返回指令的返回地址是初始调用程序procl之后的下一指令的地址。
图4说明图3的程序流的返回堆栈控制器34的操作。主程序包含地址“bl”处的对程序procl的调用指令,因此返回堆栈控制器34将返回地址bl+Ι推到返回堆栈32上(步骤100)。依次地,程序procl包含地址“b2”处的对程序pr0C2的调用指令,因此返回堆栈控制器34将返回地址b2+l推到返回堆栈32上(步骤102)。最后,程序proc2包含地址b3处的对程序pr0C3的调用指令,因此返回堆栈控制器34将返回地址b3+l推到返回堆栈32上(步骤104)。所述推入序列导致返回堆栈32保持返回地址b3+l、b2+l以及bl+1,其中b3+l保持在返回堆栈32的顶部。对于pr0C3的返回指令,常规的返回堆栈管理方法将上托最顶部的堆栈值b3+l,且将所述值用作用于指令预取的预测返回地址。所述地址将取出proc2的返回指令,从而导致返回堆栈32上托地址b2+l,所述地址b2+l将取出procl的返回指令,从而导致返回堆栈32上托bl+Ι。此连续返回堆栈上托和指令预取既浪费电力又浪费处理器执行时间,从而对性能造成负面影响。由于连续程序调用的成串性质,实际返回地址位置是初始顶部层级调用程序procl中的bl+Ι。因此,返回堆栈控制器34通过确定其必须从返回堆栈32上托的层级数目来获得proc3的返回指令的正确顶部层级返回地址(步骤106)而优化性能。返回堆栈控制器34从返回堆栈32上托所述数目的返回地址(步骤108),并使用最后上托的返回地址(此处为bl+Ι)作为用于预取单元(PFU) 14的预测返回地址(步骤110)。尽管本论述按照将返回地址推到返回堆栈32上和从返回堆栈32上托出返回地址来构造操作描述,但应了解,此类操作可根据需要基于在逻辑上移动堆栈指针,使得返回堆栈32中的指向值代表用于指令预取的返回地址。图4是返回堆栈控制器在预测到或另外遇到连续程序调用串中的最后程序的返回指令时跳过存储在返回堆栈32上的中间返回地址并提供对应于所述串中的第一顶部层级程序的返回地址的能力的非限制性实例。更一般来说,返回堆栈控制器34经配置以确定与给定返回指令相关联的返回层级数目,并将返回堆栈32上托相应次数以获得用于指令预取的返回地址。图5说明一种用于确定与任何给定返回指令相关联的返回层级数目的机制,其中所述返回指令包含返回层级指示符或与所述返回层级指示符相关联,所述返回层级指示符的值指示返回层级数目。因此,在一个或一个以上实施例中,由微处理器10辨别和使用的指令集包含返回指令,所述返回指令包括返回操作码(“操作码”)和与所述操作码一起嵌入或另外链接到所述操作码的返回层级指示符字段或标签。因此,如图6所示,确定与任何给定返回指令相关联的返回层级数目包括读取指令的返回层级字段或标签。返回堆栈控制器34可经配置以实施图6的处理逻辑,其中返回堆栈控制器34确定给定返回指令是否包含返回层级指示符或是否与所述指示符相关联(步骤120)。如果是(步骤122),那么返回堆栈控制器34将返回堆栈32上托相应次数(步骤124)以获得用于指令预取的返回地址。如果不是(步骤122),那么返回堆栈控制器34将返回堆栈32上托默认次数(步骤126)以获得用于指令预取的返回地址。举例来说,默认次数可以是一次。在一个实施例中,程序编译器可经配置以为每个返回指令产生返回层级指示符,且返回堆栈控制器34可因此始终经配置以为每个返回指令读取相应的返回层级指示符值并相应地控制返回堆栈上托。然而,如图6所示,程序编译器可仅在返回层级数目超出默认值“一”的情况下产生返回层级指示符。换句话说,第一类型的返回指令并不包含返回层级 指示符,且返回堆栈控制器34经配置以将其辨别为返回堆栈32应被上托一次的隐含指示符。第二类型的返回指令确实包含返回层级指示符,且返回堆栈控制器经配置以使用所述返回层级指示符的值来控制堆栈上托。程序编译器的一个或一个以上实施例可经配置以根据图7中说明的处理逻辑产生用于返回指令的返回层级指示符。所述编译器可经配置以确定两个或两个以上连续程序调用是否串在一起成为多层级程序调用(步骤130)。编译器可(例如)通过确定被调用程序的返回指令是否指回到调用程序的返回指令来辨别多层级程序调用。如果给定程序调用不是多层级程序调用串的一部分,那么编译器可清除例如调用层级计数器等的返回层级追踪信息(步骤132),并根据需要继续进行正常编译操作。然而,如果编译器检测到多层级程序调用,那么其追踪所述多层级程序调用的嵌套(调用)深度。一种追踪嵌套深度的方法包括对连续成串的程序调用计数(步骤134)。因此,编译器可维持计数器以累计多层级程序的调用深度。当检测到串中的最后程序的返回指令(步骤136)时,编译器基于所追踪的计数为所述指令设置返回层级指示符(步骤138)。因此,如上文解释的,编译器可基于所累计的计数为所述最后程序的返回指令设置返回层级指示符的值。因此,在编译时间设置这个值使得返回堆栈控制器34能够在运行时间(即,当微处理器10正在执行所编译的程序码时)执行多层级返回地址预测。还应了解,图7的处理逻辑可实施为由返回堆栈控制器34或由微处理器10内的其它支持逻辑实行的动态运行时间处理。举例来说,返回堆栈控制器34可经配置以在运行时间处理期间与内核的指令执行单元或其它逻辑协作以检测多层级程序,追踪那些程序的调用深度,并产生适当的返回层级指示符以用于预测顶部层级返回地址。因此,返回堆栈控制器34或内核12内的其它电路可配置有必需的逻辑和存储器电路元件,需要用所述逻辑和存储器电路元件来辨别成串程序调用、追踪/计数成串程序调用的调用深度和产生相应的返回层级指示符值以用于控制返回地址预测。一般来说,可在编译时间或在运行时间确定返回层级数目。在任一情况下,均可通过对成串序列中的程序调用计数来确定与给定指令相关联的返回层级数目,使得针对所述串中的最后程序的返回指令预测的返回地址是顶部层级的初始调用程序的返回地址,而不是所述串中的紧接在前的程序的地址。
在任何情况下,微处理器10均基于用成串程序调用序列中的第一程序调用的返回地址代替所述成串程序调用序列中的最后程序调用的返回地址并提供所述代替的返回地址以用于指令预取,来实施一种为成串程序调用序列预测用于指令预取的返回地址的方法。可通过辨别出对于给定的当前程序过程而言对下一程序过程的调用是所述当前程序的返回指令之前的最后指令,来检测到成串的程序调用。以此方式,微处理器10的性能在对成串程序调用的执行方面得到优化,因为多余的中间返回指令不被取入微处理器的指令管线中并加以执行。 所属领域的技术人员应了解,对一个或一个以上实施例的在前论述以及附图均不限制本发明。而是,本发明只受所附权利要求书及其合法等效物限制。
权利要求
1.一种管理返回堆栈的方法,其包括 确定与在成串程序调用序列中的返回指令相关联的返回层级数目,其中所述成串程序调用序列包括一串两个或两个以上连续程序调用,其中所述串中的每一随后程序调用的返回指令均指回到紧接在前的程序调用的返回指令;以及 从所述返回堆栈上托所述数目的返回地址。
2.根据权利要求I所述的方法,其进一步包括将从所述返回堆栈最后上托的返回地址提供到指令预取单元作为所预测的用于指令预取的返回地址。
3.根据权利要求I所述的方法,其中确定与返回指令相关联的返回层级数目包括读取与所述返回指令相关联的返回层级指示符值。
4.根据权利要求3所述的方法,其中读取与所述返回指令相关联的返回层级指示符值包括读取嵌入在所述返回指令中的值。
5.根据权利要求I所述的方法,其中确定与返回指令相关联的返回层级数目包括确定返回指令是否包含嵌入的返回层级指示符,如果包含的话,通过读取所述返回层级指示符来确定所述返回层级数目,如果不包含的话,基于针对所述返回堆栈的默认返回层级设置来确定返回层级指示符的数目。
6.根据权利要求5所述的方法,其进一步包括将针对所述返回堆栈的所述默认返回层级设置成一,使得所述返回堆栈为缺乏嵌入的返回层级指示符的返回指令从所述返回堆栈上托一个返回地址,且为包含嵌入的返回层级指示符的返回地址从所述返回堆栈上托所指示数目的返回地址。
7.根据权利要求I所述的方法,其中确定与返回指令相关联的返回层级数目包括对成串的程序调用序列中的程序调用数目进行计数。
8.根据权利要求I所述的方法,其中确定与返回指令相关联的返回层级数目包括检测成串的程序调用,追踪给定程序调用串的嵌套深度,以及根据所述嵌套深度设置用于所述给定程序调用串中最后一个返回指令的返回层级数目。
9.一种返回堆栈电路,其包括 返回堆栈,其经配置以存储多个返回地址; 返回堆栈控制器,其经配置以将返回地址依序推到所述返回堆栈上且从所述返回堆栈依序上托返回地址,且经配置以确定与在成串程序调用序列中的给定返回指令相关联的返回层级数目且从所述返回堆栈上托所述数目的返回地址,其中所述成串程序调用序列包括一串两个或两个以上连续程序调用,其中所述串中的每一随后程序调用的返回指令均指回到紧接在前的程序调用的返回指令。
10.根据权利要求9所述的返回堆栈电路,其中所述返回堆栈控制器进一步经配置以将从所述返回堆栈最后上托的返回地址提供到指令预取单元作为所预测的用于指令预取的返回地址。
11.根据权利要求9所述的返回堆栈电路,其中所述返回堆栈控制器经配置以通过读取与返回指令相关联的返回层级指示符值来确定与所述给定返回指令相关联的返回层级数目。
12.根据权利要求11所述的返回堆栈电路,其中所述返回堆栈控制器经配置以读取嵌入在所述给定返回指令中的值作为所述返回层级指示符。
13.根据权利要求9所述的返回堆栈电路,其中所述返回堆栈控制器经配置以通过确定所述给定返回指令是否包含嵌入的返回层级指示符来确定与所述给定返回指令相关联的返回层级数目,如果包含的话,通过读取所述返回层级指示符来确定所述返回层级数目,如果不包含的话,基于针对所述返回堆栈的默认返回层级设置来确定返回层级指示符的数目。
14.根据权利要求13所述的返回堆栈电路,其进一步包括将针对所述返回堆栈的所述默认返回层级设置设置成一,使得所述返回堆栈为缺乏嵌入的返回层级指示符的返回指令从所述返回堆栈上托一个返回地址,且为包含嵌入的返回层级指示符的返回指令从所述返回堆栈上托所指示数目的返回地址。
15.根据权利要求9所述的返回堆栈电路,其中所述返回堆栈控制器经配置以通过对成串程序调用序列中的程序调用数目进行计数来确定与所述给定返回指令相关联的所述返回层级数目。
16.根据权利要求9所述的返回堆栈电路,其中所述返回堆栈控制器经配置以通过以下操作来确定与所述给定返回指令相关联的所述返回层级数目检测成串的程序调用,追踪给定程序调用串的嵌套深度,以及根据所述嵌套深度设置用于所述给定程序调用串中最后一个返回指令的返回层级数目。
17.一种计算机程序编译方法,其包括 确定与返回指令相关联的返回层级数目;以及 将与所述返回指令相关联的返回层级指示符设置成对应于所述数目的值。
18.根据权利要求17所述的方法,其中确定与返回指令相关联的返回层级数目包括对成串程序调用序列中的程序调用数目进行计数。
19.根据权利要求17所述的方法,其中确定与返回指令相关联的返回层级数目包括 检测成串的程序调用;追踪给定程序调用串的嵌套深度;以及根据所述嵌套深度设置用于所述给定程序调用串中最后一个返回指令的返回层级数目。
20.根据权利要求17所述的方法,其中将与所述返回指令相关联的返回层级指示符设置成对应于所述数目的值包括设置嵌入在所述返回指令中的值。
21.一种为成串程序调用序列预测用于指令预取的返回地址的方法,其包括 通过确定与在成串程序调用序列中的返回指令相关联的返回层级数目以及从所述返回堆栈上托所述数目的返回地址,用所述成串程序调用序列中的第一程序调用的返回地址代替所述成串程序调用序列中的最后程序调用的返回地址;以及提供所述代替的返回地址以用于指令预取, 其中所述成串程序调用序列包括一串两个或两个以上连续程序调用,其中所述串中的每一随后程序调用的返回指令均指回到紧接在前的程序调用的返回指令。
22.根据权利要求21所述的方法,其进一步包括检测成串程序调用序列通过辨别出,对于给定的当前程序过程而言,对下一程序过程的调用是所述当前程序的返回指令之前的最后指令。
23.根据权利要求22所述的方法,其进一步包括在程序编译期间检测成串程序调用序列。
24.根据权利要求22所述的方法,其进一步包括在程序执行期间检测成串程序调用序列。
25.根据权利要求21所述的方法,其中用所述成串程序调用序列中的第一程序调用的返回地址代替所述成串程序调用序列中的最后程序调用的返回地址包括对于所述成串程序调用序列中的连续程序调用,将返回地址依序推到返回堆栈上;以及响应于所述最后程序调用的返回指令,将所述返回堆栈上托所需的次数以获得所述第一程序调用的返回地址。
全文摘要
本发明涉及用于管理返回堆栈的方法和设备。一种处理器包含用来预测程序返回地址以用于指令预取的返回堆栈电路,其中返回堆栈控制器确定与给定返回指令相关联的返回层级数目,并将所述数目的返回地址从所述返回堆栈上托。将多个返回地址从所述返回堆栈上托允许所述处理器预取连续程序调用串中的初始调用程序的返回地址。在一个实施例中,所述返回堆栈控制器从嵌入在所述返回指令中的值中读取所述返回层级数目。补充编译器在编译时间为给定返回指令计算返回层级值,并将那些值嵌入在所述返回指令中。在另一实施例中,所述返回堆栈电路通过对连续程序调用串中的程序调用(分支)进行计数来动态地追踪所述返回层级数目。
文档编号G06F9/38GK102707933SQ20121006838
公开日2012年10月3日 申请日期2006年2月17日 优先权日2005年2月18日
发明者托马斯·安德鲁·萨托里乌斯, 杰弗里·托德·布里奇斯, 罗德尼·韦恩·史密斯, 詹姆斯·诺里斯·迪芬德尔费尔 申请人:高通股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1