基于寄存器地址环绕式处理的提前装载地址表项目无效的制作方法

文档序号:6556259阅读:243来源:国知局
专利名称:基于寄存器地址环绕式处理的提前装载地址表项目无效的制作方法
技术领域
本发明总的涉及计算机系统中指令的执行和性能优化,更具体地,涉及一种提前装载地址表(ALAT)’用于记录存储器地址和对于不按次序地提前的装载指令的寄存器目标以便达到改进性能,其中在ALAT中的项目根据寄存器地址环绕式处理而被无效。
本专利申请涉及到共同转让的、1998年10月7日提交的、题目为“Method and Apparatus for Optimizing Instruction Execution(用于指令执行优化的方法和设备)”的、美国专利申请序列号09/168,040,和2000年3月8日提交的、题目为“Emulated BranchEffected by Trampoline Mechanism(通过蹦床机制实现的仿真分支)”的、美国专利申请序列号09/521,160,这两个专利在此引用,以供参考。美国专利申请序列号09/051,160是美国专利申请序列号09/168,040的继续部分,后者是1997年10月13日提交的、美国专利申请序列号08/953,836的继续部分。本专利申请也涉及到共同转让的、1997年9月30日提交的、题目为“Method and Apparatus forDetecting Address Range Overlaps(用于检测地址范围重叠的方法和设备)”的、美国专利申请序列号08/940,607,和1999年12月31日提交的、题目为“Method and Apparatus for Advancing LoadOperations(用于提前装载操作的方法和设备)”的、美国专利申请序列号09/476,607。
计算机系统包括至少一个处理器和存储器。存储器存储程序指令,数据,和操作系统。程序指令可包括用于编译应用程序的编译器。操作系统控制处理器和存储器,用于系统操作和用于执行程序指令。
“基本块”是由分支和/或分支目标约束的接连的指令组,不包含分支或分支目标。这是指,如果基本块中的任何指令被执行,则基本块中的所有的指令将被执行,即,被包含在任何基本块内的指令是按照或者全部或者都没有的原则执行的。当控制被传递到基本块时,通过瞄准基本块的先前的分支,使得在基本块内的指令能够被执行(这里所使用的“瞄准”包括通过已取的分支的明显瞄准以及通过未取的分支的隐含的瞄准)。上述的内容是指,如果控制被传递到基本块,则基本块中所有的指令必须被执行;如果控制没有被传递到基本块,则基本块中没有指令被执行。
在控制被传递到指令以前,指令的执行的行动,或规定执行指令的行动,被称为“推测”。由处理器在程序执行时间执行的推测被称为“动态推测”,而由编译器规定的推测被称为“静态推测”。虽然大多数现有技术不是基于静态推测,也不涉及到静态推测,但最近对静态推测的某些参考文献已开始显露。
当一个指令不需要另一个指令的结果时,两个指令被称为“独立的”;当一个指令需要另一个指令的结果时,这两个指令被称为“相关的”。独立的指令可以并行地被执行,而依赖的指令以串行方式被执行。通过识别独立指令和尽可能多地并行执行它们,程序性能得以改进。经验表明,通过搜索多个基本块可以找到的独立指令比起通过只在单个基本块内搜索可以找到的更多。然而,同时执行来自多个基本块的指令需要推测。
识别和调度独立的指令,以及由此提高性能,是编译器和处理器的主要任务之一。编译器和处理器设计的趋势是在每次连续地生成时增加对于独立指令的搜索范围。在现有技术指令组中,可能产生异常的指令不能被编译器推测,因为如果指令造成异常,则程序可呈现错误的行为。这限制编译器对于独立的指令的搜索的有用的范围和使得必须由处理器在程序运行时间通过动态推测进行推测。然而,动态推测引起很大的硬件复杂性,它随其上施加动态推测的基本块的数目指数地增加-这在动态推测的范围上设置了实际的限制。相反,编译器可以搜索独立的指令的范围大得多,-潜在地为整个程序。而且,一旦编译器被设计来对单个基本块边界进行静态推测,由静态推测几个基本块边界,就导致非常小的复杂性。
在计算机系统中需要一种通过使能并行执行尽可能多的独立的指令而达到更高的性能的机制。这即使在第二指令以及取决于该指令的计算,有可能作用在取决于第一指令的执行的数据时,也是希望的。
许多计算机系统实行软件控制的寄存器重命名。当调用程序过程调用被调用程序过程时,调用程序过程的本地寄存器被自动地保存。调用程序过程典型地只提供被调用程序过程以包含输入参量的寄存器。如果被调用程序过程需要它自己的寄存器,则被调用程序过程分配更多的寄存器。在返回到调用程序过程时,调用程序过程的本地寄存器被自动地恢复。
软件控制的寄存器重命名典型地是在大的物理寄存器库上进行的。在调用时,重命名基本指针(即,帧的底部)被加上调用程序过程的本地寄存器的数目。在返回时,重命名基本指针被减去调用程序过程的本地寄存器的数目。
当进行一系列调用,和可提供的寄存器的数目用完时,软件控制的寄存器重命名只环绕(wrap around)物理寄存器的底部进行处理。当请求的物理寄存器比可提供的寄存器多时,寄存器值被溢出到存储器。这样,寄存器的软件可看见的帧被变换到物理寄存器。物理寄存器被概念性地安排在圆圈上,以及当执行调用时,寄存器的软件可看见的帧围绕物理寄存器的概念性的圆周前进。
在计算机系统中需要一种机制,它使得即使在第二指令以及取决于该指令的计算,有可能作用在取决于第一指令的执行的数据时,也并行执行的独立指令的数目最大化。另外,希望这样的机制是与上述的软件控制的寄存器重命名机制完全地和有效地兼容的。
本发明提供一种包括存储编译器的存储器的方法和计算机系统。编译的程序包括存储指令、被调度在存储指令前面的装载指令、和检验指令。处理器执行编译器。物理寄存器保存用于编译的程序的数据。一部分物理寄存器形成寄存器堆栈,当充满时进行环绕式处理。N比特当前环绕处理计数状态,跟踪导致寄存器堆栈环绕处理或不环绕处理的物理寄存器再映射事件。提前装载地址表(ALAT)具有相应于装载指令的项目,每个项目具有至少一个存储器范围区,规定由相应的装载指令存取的存储器单元的范围,物理寄存器数目区,相应于在相应的装载指令中存取的物理寄存器,以及N比特寄存器环绕处理区,它相应于对于相应的装载指令的N比特的当前环绕处理计数状态。检验指令存取ALAT,确定被安排在存储指令之前的存储指令和装载指令是否潜在地存取公共的存储器单元。
在一个实施例中,在执行存储指令以后,相应于ALAT中的装载指令的项目不存在表示公共的存储器单元可能已被存储和装载指令存取。在一个实施例中,如果存储指令和装载指令存取共同的存储器单元,则存储指令的执行清除ALAT中的相应于装载指令的项目。在一个实施例中,如果存储指令和装载指令存取存储器的公共范围,则存储指令的执行清除ALAT中的相应于装载指令的项目。
在一个实施例中,响应使寄存器堆栈环绕处理的调用再映射事件N比特当前环绕处理计数状态被增量。处理器然后搜索ALAT找出在其寄存器环绕处理区具有与更新的N比特当前环绕处理计数状态相匹配的环绕处理计数值的项目,并清除ALAT中的在其寄存器环绕处理区具有匹配的环绕处理计数值的所有的项目。同样地,N比特当前环绕处理计数状态响应使寄存器堆栈不环绕处理的返回再映射事件被减量,然后处理器搜索ALAT找出在其寄存器环绕处理区具有与更新的N比特当前环绕处理计数状态相匹配的环绕处理计数值的项目,以及清除ALAT中的在其寄存器环绕处理区具有匹配的环绕处理计数值的所有的项目。
在一个实施例中,N比特寄存器环绕处理区增大物理寄存器数目区,以便形成用于相应的装载指令的扩展的物理寄存器数目。在一个实施例中,至少一个存储器范围区包括存储器地址区和存储器存取大小区。在一个实施例中,ALAT中的每个项目包括寄存器类型区,表示在装载指令中存取的物理寄存器的类型,例如,在装载指令中可存取的物理寄存器的类型可以包括通用存储器和浮点存储器。在一个实施例中,ALAT中的每个项目还包括表示该项目是否有效的有效比特区。
在一个实施例中,被编译的程序包括恢复代码,当检验指令确定在程序执行期间存储指令和装载指令已存取公共存储器单元时控制被传递给它。恢复代码包括用于重新执行装载指令的代码。
在一个实施例中,被编译的程序包括至少一个取决于由装载指令读出的数据的计算指令,其中该至少一个计算指令在存储指令之前被调度。在一个实施例中,被编译的程序也包括恢复代码,当检验指令确定在程序执行期间存储指令和装载指令已存取公共存储器单元时控制被传递给它。恢复代码包括用于重新执行装载指令和该至少一个计算指令的代码。
按照本发明的计算机系统,通过允许按照本发明的ALAT记录在提前装载时使用的物理寄存器数目而由于ALAT中的项目根据寄存器地址环绕处理被无效,不引起过大的提前装载恢复化费,有效地组合用于实施改进装载的ALAT机制和用寄存器的软件控制的重命名实行的寄存器堆栈机制。


图1是其上可实施本发明的实施例的通用计算机系统的方框图。
图2是图1的通用计算机系统的通用寄存器的一个实施例的图。
图3是图1的通用计算机系统的浮点寄存器的一个实施例的图。
图4是图1的通用计算机系统的应用寄存器文件的一个实施例的图。
图5是图1的通用计算机系统的当前帧标志的一个实施例的图。
图6描绘了原先的代码序列,包括存储器存储指令后面是存储器装载指令。
图7描绘按照本发明的一个实施例的、由通过使用静态数据推测进行装载指令而安排图6的原先的代码序列造成的安排的代码序列。
图8是按照本发明的一个实施例的、用于把装载指令和依赖于它的指令提前到存储指令前面的处理过程的流程图。
图9描绘按照本发明的一个实施例的、用于在运行时间执行提前的装载指令的处理过程的流程图。
图10描绘按照本发明的一个实施例的、提前的装载地址表的例子。
在以下的优选实施例的详细说明中,进行参考附图,它形成优选实施例的一部分,以及其中通过说明来显示可实施本发明的具体的实施例。应当看到,可以利用其它实施例,以及可以作出结构的和逻辑的改变,而不背离本发明的范围。所以,以下的详细说明不是在限制的意义上给出的,以及本发明的范围由附属权利要求规定。
本发明的一个实施例是一种提前装载地址表(ALAT)用于记录存储器地址和寄存器目标以不按次序地提前的装载指令以达到改进性能。按照本发明的ALAT有效地与软件控制的寄存器重命名交互,允许ALAT记录物理寄存器数目,并通过根据被环绕处理的寄存器地址无效在按照本发明的ALAT中的项目,而不引起过大的提前装载恢复的花费。本发明的这些方面可被使用于任何类型的计算机系统。这样的计算机系统的一个例子是图1所示的通用计算机系统50。通用计算机系统50包括处理器50、输入装置54、输出装置56、和存储器58,它们通过总线60被连接在一起。存储器58包括主存储器62(即,快速易失性存储器,诸如动态半导体存储器)和辅助存储器64(即,非易失性存储器,诸如闪存储器和磁盘)。存储器58存储在处理器52上执行的一个或多个程序66。操作系统(OS)68被存储在存储器58中,以及控制处理器52和存储器58,用来系统操作和用来执行被存储在存储器58中的程序66。
程序66在被处理器52执行时控制通用计算机系统50。程序可以包括编译器,其功能在下面结合图8进行描述。
处理器52包括应用寄存器组70和系统寄存器组72。计算机系统50的体系结构状态由应用寄存器组70、系统寄存器组72和存储器58来表示。应用寄存器组70包括可应用于被存储器存储器58的应用程序的寄存器。系统寄存器组72提供系统寄存器资源,用于处理过程控制,中断操纵,保护,诊断,性能监视等等。系统寄存器组72通常只对于操作系统68是可看见的。
在一个实施例中,应用寄存器组70具体地包括通用寄存器74,浮点(FP)寄存器76,当前帧标记(CFM)78,和应用寄存器文件80。可被包括在应用寄存器组70中的、其它例子的寄存器包括比较结果寄存器,转移信息寄存器,指令指针,进程标识符,和用户标记。
可被包括在系统寄存器组72中的举例的寄存器包括区域寄存器,保护密钥寄存器,诊断中断点寄存器,机器特定的寄存器,处理器状态寄存器,转换表后备缓存器(TLB),和控制寄存器。
图2上总的显示通用寄存器74的一个实施例。在一个实施例中,通用寄存器74提供中心资源,用于整数和整数多媒体计算。通用寄存器74被分成静态通用寄存器82,包括通用寄存器GRO到GRm,和堆栈通用寄存器84,包括通用寄存器GRm+1到GRn。静态通用寄存器82典型地对于所有过程是可见的。堆栈通用寄存器84典型地对每个过程是本地的,以及在大小上可以是从零变化到(n-m)个通用寄存器。计算机系统50中的寄存器堆栈机制通过对地址的软件控制的寄存器重命名而被实施为程序过程调用和返回的副作用。否则寄存器堆栈机制对于应用程序是看不见的。静态通用寄存器82必须按照软件惯例在程序过程边界被保存和被恢复。堆栈通用寄存器84由寄存器堆栈机自动保存和恢复,而没有明显的软件干预。在一个实施例中,堆栈通用寄存器84的一部分可被编程地重命名,以便加速循环。
图3上总的显示了浮点寄存器76的一个实施例。浮点寄存器76被用于浮点计算。浮点寄存器76被分成静态浮点寄存器86,包括浮点寄存器FPO到FPm和旋转浮点寄存器88,包括FPm+1到FPn。在一个实施例中,静态浮点寄存器86包括浮点和多媒体寄存器。在一个实施例中,旋转浮点通用寄存器88可被编程地重命名,以便加速循环。
图4上总的显示了应用寄存器文件80的一个实施例。应用寄存器文件80包括特定用途的数据寄存器和控制寄存器,用于对于应用指令的应用可看见的处理器功能。应用寄存器文件80具体地包括以前功能状态(PFS)寄存器90,具有多个区,表示在调用指令下在CFM78自动地复制的数值,以便加速程序调用。例如,调用指令的执行包括存储返回堆栈和其它状态信息,诸如存储CFM 79的当前帧标记在PFS寄存器90的以前帧标记区(PFS.pfm)92中。
堆栈通用寄存器84通过分配寄存器堆栈帧包括堆栈通用寄存器84的本地的和输出的寄存器的可编程的数目,而对于存储器中的程序可用的,这些寄存器对于更多的程序过程是可看见的。每个寄存器堆栈帧与一个帧标记相联系。帧标记描述堆栈通用寄存器84的状态。CFM 78在当前工作程序过程内保持当前寄存器堆栈帧的状态。
帧标记包含寄存器堆栈帧的各个部分的大小和在寄存器旋转时使用的寄存器重命名的基值。图5上显示CFM 78的帧标记格式。在图5所示的实施例中,帧标记格式包括堆栈帧区(CFM.sof)100的大小,堆栈帧区的本地部分(CFM.sol)102的大小,堆栈帧区的旋转部分(CFM.sor)104的大小,用于通用寄存器区的寄存器重命名基数(CFM.rrb.gr)106;用于浮点寄存器区的寄存器重命名基数(CFM.rrb.fr)108;和用于比较结果寄存器区的寄存器重命名基数(CFM.rrb.cr)110。
在调用时,CFM 78中的当前帧标记作为以前的帧标记被保存在PFS.pfm区92。在调用时,新的数值被写到CFM 78中,产生新的寄存器堆栈帧,不用本地或旋转寄存器,而是用一组输出寄存器,它们是调用者的过程的输出寄存器。另外,在调用时,寄存器重命名基数区106,108,和110被设置为零。在返回时,CFM 78用PFS.pfm区92中的以前的帧标记被恢复。
用于把堆栈通用寄存器84做成对于当前工作的程序过程是可用的计算机系统的寄存器堆栈机制的运行具体如下。寄存器堆栈帧的被分成两个可变大小的区域,包括本地区域和输出区域。紧接在调用以后,新的激活的寄存器堆栈帧的本地区域的大小是零和新的激活的寄存器堆栈帧的输出区域的大小等于调用者过程的输出区域的大小,以及它重叠到调用者过程的输出区域。在一个实施例中,特定的分配指令被用来通过指定被用来确定CFM.sof区100的帧值的大小和CFM.sol区102的堆栈帧值本地部分的大小的立即值,而动态地重新定出当前寄存器堆栈帧的本地和输出区域的大小。CFM.sof区100的值指定对于当前的程序过程可见的整个寄存器堆栈帧的大小。CFM.sol区102的值指定当前的寄存器堆栈帧的本地区域的大小。当前寄存器堆栈帧的输出区域的大小由在CFM.sof区100的值与CFM.sol区102的值之间的值确定。在一个实施例中,读出在当前的寄存器堆栈帧外面的堆栈寄存器,返回一个未规定的结果,以及写入在当前的寄存器堆栈帧外面的堆栈寄存器,造成非法操作故障。
当执行一个调用时,在CFM 78中的当前帧标记的拷贝作为先前的帧标记被保存在PFS.pfm区92中,以及被调用者的过程的寄存器堆栈帧如下地被产生。堆栈的通用寄存器84被重命名,以使得在调用者过程的输出区域中的第一寄存器对于被调用者过程变成为GRm+1。本地区域的大小对于被调用者过程被设置为零。被调用者的过程的寄存器堆栈帧的大小,正如更新的CFM.sof区100表示的,被设置为调用指令以前的调用者的过程的输出区域的大小(即调用者CFM.sof-调用者CFM.sol)。
在一个实施例中,在调用者过程的寄存器堆栈帧的输出区域中的数值对于被调用者过程是可见的,它允许在过程之间传送的参量与返回值全部在寄存器中发生。在一个实施例中,通过发出特定的分配指令,过程寄存器堆栈帧被动态地重新定大小,它不造成寄存器重命名,但确实改变寄存器堆栈帧的大小和在寄存器堆栈帧的本地与输出区域之间的划分。当执行返回指令时,CFM 78用PFS.pfm区92中的以前的帧标记被恢复,以及寄存器重命名被恢复到调用者过程的配置。
应当理解,图1的上述的计算机系统50仅仅被提供用于说明的目的,以及下面描述的本发明的实施例可以在各种其它类型和配置的计算机系统上实施。
在一个实施例中,计算机系统50可从执行统计推测的指令期间遇到的问题中恢复。计算机系统50的一个实施例可以执行已由编译器调度为推测地执行的指令段,验证被推测地执行的指令的执行的整体性,以及执行纠正问题的恢复代码,如果检测到任何问题的话。
指令可被分成两种类别推测的和非推测的。在编译开始时,所有的指令都被初始化为非推测的。在调度过程期间,当编译器调度在指令的始发的基本块外面的指令时,编译器把该指令标记为推测的。遇到异常条件的非推测的指令产生一个异常。遇到异常条件的推测的指令不产生一个异常,而是把“延缓的异常标记”(DET)写入到它们的目的地。异常条件的存在阻止特定的计算指令用专门的操作码完成,所以,指令的目的地包括DET,而不是正确的结果。读DET的非推测指令把另一个DET写入到指令的目的地(再次指出,目的地不包含正确的结果)-这种行为被称为“传播”。通过把非推测指令放置到特定的推测指令的始发的基本块,和通过配置非推测指令来读出推测指令的目的地(或DET可被传播到的任何位置),由推测指令产生的DET可以在其中控制被传送到原先的基本块的地点被检测出。在这个地点,必须重新创建导致DET的原先创建的异常条件,以及用正确的结果代替所有的先前传播的DET。这是通过被称为“恢复”的处理过程完成的。恢复可能涉及用由编译器生成的附加的代码扩大程序;该代码是具有非推测形式的依赖的推测指令组的拷贝,这样,在执行后,所有的异常条件产生异常,以及所有的先前被写入的目的地用正确的结果进行改写。恢复代码不一定是指令序列的精确的拷贝,但可以是在执行时达到同一个结果的的代码。而且,在一个实施例中,新的指令被规定为具有特定的目的检验DCT的存在和在检测到DET的情况下激活相关的恢复的代码。
以上讨论的实施例不取决于DET的精确的形式。另外,用于规定推测和非推测指令的替换的实施例是可能的。例如,某些指令可被规定为在推断上与指令是否被调度在它们的始发的基本块以外是无关的。
直到现在所述的推测被称为“控制推测”,因为指令在控制传送到它们以前被执行。推测可以导取除了控制推测以外的其它形式。其中的一个例子是“数据推测”,由此,按照本发明的机制被规定为允许指令A(它可能依赖于指令B)在指令B以前执行。虽然数据推测可被应用到任何种类的指令,但下面讨论装载和存储,来说明按照本发明的数据推测。在存储下面的装载通常不能被调度在存储的上面,除非可以证明从装载读出的地址决不等于由存储写入的地址。如果地址相等,则装载应当接收存储的结果。然而,如果能够证明从装载读出的地址决不等于由存储写入的地址,则装载可被安全地调度在存储的上面。当编译器调度装载在存储的上面时当不能证明由二者访问的地址将决不相等时,出现数据推测。当由二者存取的地址被确定为在运行时间时相等时,被称为冲突的错误条件出现。在冲突的情况下,恢复机制可被利用来校正任何错误地写入的目的地。在本发明的一个实施例中,即使编译器确定在两个指令之间有冲突,装载指令和依赖于它的一个或多个指令仍被编译器安排在存储指令的上面。
本发明的一个方面涉及到用于不按次序地提前指令的方法和设备。这包括调度第二指令(例如,装载指令),以及可能地,要在第一指令(例如,存储指令)之前执行的、依赖于它的整个计算,它们可能产生被称为冲突的错误条件,由于第一和第二指令存取一部分存储器中的同一个地址。
为实施本发明的某些方面,计算机结构体系可被规定为允许编译器调度在它们的始发的基本块外面的指令(控制推测),以及调度并行执行指令,它们可以潜在地存取同一个存储器单元(数据推测),所以,是潜在地依赖的。这样的计算机结构体系的一个例子,在Ross等的、题目为“Computer Architecture for the Deferral ofExceptions on Speculative Instructions(用于延缓推测指令的异常的计算机结构体系)”的、美国专利No.5,915,117中描述,该专利在此引用,以供参考。虽然下面参照这个结构体系描述了本发明的这个方面,但本发明并不限于使用这种结构,以及可以通过使用其它结构体系特性来实现,正如下面更详细地描述的。
这种新的结构体系规定一组“推测性”指令,它们在出现异常条件时不立即通知一个异常。而是,通过把“延缓的异常标记”(DET)写入到由指令规定的目的地,推测性指令延缓一个异常。指令组也包含“非推测性指令”,它们在出现异常条件时立即通知一个异常,正如传统的指令所共有的。
指令异常在限本领域是熟知的,它们包括,但不限于,诸如页故障、非法操作数、特权违反、被除以零的运算、溢出等异常。新的结构体系也提供新的存储器推测类型,其中在由编程器规定的逻辑次序上跟随在存储指令后面的装载指令,根据这两个指令将不存取同一个存储器单元的推测,可以在存储指令以前被执行。在本发明的一个实施例中,存储器推测检验存取先进装载地址表(ALAT),诸如在处理器52中的ALAT 98,它包含最新推测的存储器存取的记录,以便确定推测是否正确。如果推测正确,则指令被正常地执行。如果不正确,则装载指令以及依赖于装载的、和被调度在存储后面的、任何指令被再次地执行,以便检索由存储的指令写入的内容。
通过使用被标记为推测性的指令,编译器可以调度在它们始发的基本块以外的指令,以及可以调度可能的依赖的存储器并行存取。如上所述,当推测指令产生一个异常时,可以把“延缓的异常标记”(DET)写入到由指令规定的目的地。任何检测到在任何的源中的DET的推测性指令复制该DET到它的目的地。应当指出,当推测性指令在一个源中发现一个DET时,它不需要执行与指令有关的功能。指令可以只复制DET到目的地。这样,DET传播到推测性指令块。因此,在一个实施例中,包括计算结果的目的地可以被检验找出DET,而不用检验在计算时所使用的每个操作数。
在一个源中检测到DET的任何非推测性指令可以产生一个立即的异常。因此,DET以数据流的方式传播到推测性指令,直至(和如果)它们到达非推测性指令为止。
如果程序在运行时间确定据以执行指令的推测是不正确的(例如,被错误地预计的分支),则程序可仅仅忽略该DET,因为该DET不会被程序存取。然而,如果推测是正确的,则如果,和当,产生DET的指令的、始发的基本块被执行时,DET被变换成真实的异常。在一个实施例中,这种变换是由被称为“推测检验”指令(或简称为“chk.s”)的指令执行的。chk.s指令读一个源,以及如果该源包含一个DET,则转移到特定的目标地址,实施恢复代码。同样地,在本发明的一个实施例中,存储器推测的正确性可以由被称为“在前检验”指令(被称为“chk.a”指令)确定。chk.a确定存储器单元是否在按顺序地被存取,以及如果是的话,则chk.a指令转移到特定的目标地址,实施恢复代码。下面将更详细地讨论chk.a指令。chk.s和chk.a,每个可以以多种方式来实施,这导致被执行的指令的流程上的改变。例如,每个可由条件转移指令实施。在一个实施例中,ch.s指令和/或ch.a指令可由为一个指令实施(它产生一个调用异常处理程序的异常),诸如蹦床检验指令,以便通过蹦床机制来实现控制流改变,诸如在以上引用的、2000年3月8日提交的、题目为“EmulatedBranch Effected by Trampoline Mechanism(通过蹦床机制实现的仿真分支)”的、专利申请序列号09/521,160中描述的蹦床机制。
根据定义,chk.s和chk.a指令总是非推测性的。通常,如果这些指令检测DET或错误的存储器推测,则执行恢复代码,包括违反的指令的非推测版本。对于检测到DET的chk.s,在执行恢复代码后,违反的指令的非推测版本将用正确的结果代替它的目的地中的DET和/或产生异常。如果任何以后的推测性指令依赖于违反的指令,则它们也被包括在要被重新执行的恢复代码中,因为DET被传播到以后的推测指令的目的地,所以这些目的地可能包含错误的结果。对于chk.a指令,恢复代码必须重新执行违反的装载指令来从存储器装载正确的内容。例外,任何依赖于违反的装载指令的被调度在装载所依赖的存储的上面的指令也被重新执行。下面将进一步讨论依赖于在存储上面的装载的数值的装载指令和计算指令的安排。不依赖于违反的指令的任何指令不被重新执行,因为这是不必要的和因为如果重新执行的话,其中某些会不正确地修改程序状态。由于编译器安排推测指令和推测检验,编译器将能够产生适合于特定的推测指令组的恢复代码。
本发明的一个方面可以由具有调度安排用于推测执行的指令和产生适当的恢复代码的编译器和具有能够执行被标记为预测性的指令的计算机系统,诸如实施上述的结构体系的计算机系统,来实现。
在本发明的一个实施例中,不按次序地被提前到存储指令之前的装载指令被使用来说明数据推测,以及参照图6-8来描述这些装载指令。正如这里使用的,分别参照装载和存储指令,表示都和写到存储器的任何的指令,不管这些指令是否执行其它功能。装载指令典型地比起其它指令,由于存储器执行时间,需要较长的执行时间。通过在执行程序时较早地移动装载指令,提高在计算机中执行指令的效率。被称为提前的装载的这种装载,允许提高所执行的活动的并行性,它需要使用存储器。
正如上面概略地讨论的,通常编译器不能百分之百的确定性检测出装载指令与存储指令是否将冲突(即,存取共同的存储器单元)。这给出达到并行性的障碍,它迫使更保守的指令调度,以便不重叠装载执行时间,即,不把装载移到它可能与之冲突的存储之前。然而,在这些情况的很大的百分比的情况中,装载和存储指令事实上不冲突。因此,本发明的一个实施例允许装载指令和依赖于它的计算在潜在地冲突的存储指令之前执行,作为改进单个或多个处理器系统中程序执行的并行性的一个方法。
考虑图6所示的简单的原先的代码30。代码30包括指令I22,它把寄存器r3的内容存储在由寄存器r1的内容变址的存储器单元;指令I24,它用由寄存器r2的内容变址的存储器单元的内容装载寄存器r4;以及指令I26,它把寄存器r4和r6相加和把结果写入到寄存器r5。假定当编译器安排代码30时,它确定当指令I22和I24被执行时,多半不会是寄存器r1的内容将是与寄存器r2的内容相同的,但这不是不可能的。而且,假定编译器确定,把指令I24和I26安排在指令I22以前(或并行地),是更有效的。对于安排并行地指令,应当看到,即使在单个处理器系统中,单个处理器将典型地包括多个执行单元,在其上可以并行地执行多个指令。
图7显示按照本发明的一个实施例的调度的代码40,它们是当编译器安排图6的原先的代码30时被产生的。代码40包括被安排在指令I22(存储指令)以前的指令I24和I26。应当指出,“.a”(表示进行的指令)已被附加到装载指令上,表示这个装载指令记录装载地址在ALAT 98中。指令I25是chk.a指令,它检验ALAT 98,确定装载(I24)和存储(I22)指令是否存取到同一个存储器单元。如果寄存器r1和r2的内容不相等,则指令不存取到同一个存储器单元,以及chk.a(I22)不采取行动。然而,如果寄存器r1和r2的内容是相等的,则chk.a指令(I25)检测数据推测错误和转移到在指令I24r开始的恢复代码。指令I24r重新执行装载指令,造成正确的结果被装载到寄存器r4,因为在存储指令(I22)以后重新执行装载指令。指令I26r重新执行相加指令,它把正确的结果写入到寄存器r5,以及指令I23r转移到指令I25,它验证没有数据推测错误。
图8是显示一个可被编译器实施的、以便产生图7所示的调度的代码改变的、示例性程序的流程图。这个流程图仅仅作为例子被提供,因为其它的实施方案也是可能的。本发明并不限于结合特定的程序语言或计算机配置使用,以及可被应用到在单个或多个处理器系统中使用的编译器。
图8的处理从步骤503开始,这时,编译器建立传统的依赖性图,代表在还没有被编译器调度的源计算机程序中的指令。本发明不限于任何特定的类型的图。依赖性图可以取几种形式,包括具有代表一段源计算机程序的至少一条路径和代表这段源计算机程序中每个指令的一个节点的图。用于每个程序的依赖性图典型地包括多条路径,每条路径带有多个节点。代表一个指令的节点可以用与指令有关的信息进行注释,诸如为执行指令所需要的时钟周期数。典型地,图上的弧线连接的节点表示指令之间的依赖性。
在步骤506,编译器检查该图,以及确定图上的哪条路径包括导致从开始到结束的最长的总的执行时间的一系列指令。
在步骤509,编译器试图使得程序中最长的路径的执行优化,因为最长的路径代表在程序中的、限制指令序列的运行时间的关键部分。传统的优化技术可被编译器使用,以及下面描述另一个优化技术,因为它们涉及到提前的装载和它的相关的计算。
如上所述,编译器可以优化最长的关键路径的一个方法是通过数据推测。在本发明的一个实施例中,这可以包括移动指令,诸如包括读操作的装载指令。在步骤512,编译器确定装载指令是否在最长的关键路径。如果装载被包括在最长的路径,则编译器可以提前装载和依赖于它的指令,作为一个优化的方法,诸如下面进一步讨论的。
当发现装载指令在被缩短的路径上时,编译器在步骤521接着确定,哪些计算指令依赖于由装载指令读出的数据。计算是依赖的,如果它们需要使用从完成装载指令得出的数值。
在步骤524,装载指令从调度的指令序列中它的位置被去除。在步骤527,依赖于装载的计算(在步骤521中标识的)被提前到跟随在装载指令后面,这样,装载指令和依赖于装载指令的计算被提前,允许指令序列的优化。编译器把被标记为“1d.a”的装载指令提前到其中它的执行可以导致程序的总的改进的性能的存储单元之前。
正如上面讨论的,存储指令可能存在于在依赖性图的路径上在装载指令“ld.a”之前,以及编译器可能不能够确定足够装载和存储是否冲突(即,使用同一个存储器单元)。在步骤530,编译器确定是否有装载与存储不冲突的绝对肯定性。
当它不能确定装载与它移动到其前面的存储将不冲突的肯定性时,则在步骤533,把在步骤524被去除的装载指令用检验指令代替,诸如以上结合图6和7描述的chk.a指令。chk.a指令代替装载指令,以及如果它没有被提前,则它在原先安排装载的地方被执行。
在步骤536,编译器产生恢复代码,用于在步骤527进行提前的装载和依赖于提前装载的计算。恢复代码将被chk.a指令调用,如果必要的话,诸如下面描述的。
当装载指令在步骤512在最长的关键路径中被找到时,或当在步骤530确定编译器绝对肯定,装载指令没有被提前到将与其冲突的存储指令以前(这样,不需要检验指令或恢复代码),或在步骤536生成恢复代码以后,则处理过程在步骤539继续进行,其中编译器确定是否有可被潜在地优化的最长的关键路径留下。编译器可以在程序中优化每个下一个最长的路径,直至编译器尽可能多地优化源程序,由此,改进了执行源程序的并行性。
当在步骤539,确定编译器不能进一步优化时,程序过程进到步骤542,其中编译器安排用于执行优化指令序列。然而,当编译器在步骤539确定留下有可被潜在地优化的最长的关键路径时,编译器在步骤506识别下一个最长的路径。这样,处理过程继续进行,直至图上可被优化的所有的路径被优化为止。
在步骤542,编译器调度反映执行次序的任何改变的指令的执行,正如由上述的优化程序过程所实行的。编译器可以以多种方式,潜在地利用并行执行单元,来安排程序中指令的执行,以及本发明并不限于任何特定的调度机制。对于上面在图6中描述的例子,结果的优化代码显示于图7,恢复代码被表示为指令I24,I26,和I23r。
图9是显示当执行通过技术(诸如上面结合图8描述的技术,包括不按次序地提前装载指令和依赖的计算到存储之前)被优化的指令序列时,由计算机系统,诸如计算机系统50,执行的程序的流程图。调度的指令序列的执行在步骤603开始。在指令序列执行期间,在步骤606,执行提前的装载(例如,图7上的ld.a)。在提前的装载指令被执行以后,在步骤609,ALAT 98被更新来记录由提前的装载指令读出的存储器单元的范围(例如,在r2中的地址)。在ALAT 98中做出一个项目,以便允许后面执行的存储指令,诸如步骤618中执行的存储指令,确定提前的装载和存储指令是否已存取共同的存储器单元。ALAT 98可以用处理器52中的任何适当的结构或与处理器52相联系地来实施,以便允许将特定的提前的装载和它的相应的存储指令的存储器地址的范围进行比较。
图10上显示按照本发明的ALAT 98的一个实施例。ALAT中的一个项目包括物理存储器地址区112和存储器存取大小区114,它们合在一起规定所存取的存储器单元的范围。本发明并不限于这种规定存储器单元的范围的方法,因为可以采用许多其它技术。例如,所存取的存储器范围可以通过起始的和结束的存储器地址,或通过存储器结束地址和范围来规定。在图10所示的实施例中,ALAT 98也包括有效比特区116,它被使用来表示项目是否有效。正如下面讨论的,在本发明的一个实施例中,有很多次想要无效ALAT 98中的项目(例如,在两个应用项之间前后关系切换)。有效比特区116给出用于执行这样的无效的方便的机制。
在本发明的一个实施例中,同时有多个装载,每个装载被提前到相应的存储之前。正如项目讨论的,在程序执行期间,提供一种用于验证在每对装载和存储之间不发生冲突的技术。这样,在一个实施例中,ALAT 98包括唯一地识别它相应于的、提前的装载指令的信息,这样,项目可被标识以确定与相应的存储指令的可能的冲突。这个唯一的标识可以以任何数目的方式实现,以及ALAT 98不限于任何特定的实施方案。在图10所示的ALAT 98的实施例中,用于特定的提前的装载的项目是根据在提前的装载指令中所使用的寄存器的物理寄存器号码和类型(例如,通用的或浮点的)被变址的。用于每个指令的物理寄存器号码由编译器分配,它确保独特的寄存器被使用于每个提前的装载指令。
这样,图10所示的ALAT 98的实施例包括项目,这些项目有物理寄存器号码区118,相应于在提前装载指令中存取的实际的物理寄存器,和寄存器类型区120,它表示在提前装载指令中存取的实际的物理寄存器是通用的,还是浮点寄存器。另外,用于ALAT 98中每个项目的物理寄存器号码区118扩大到相应于在提前装载指令中使用的N比特当前环绕处理计数状态99(图1所示的)的寄存器环绕处理N比特区122,以便扩展用于提前的装载指令的物理寄存器号码,这允许根据按照本发明的环绕处理的寄存器地址有效地无效ALAT 98中的项目。在下面详细地描述利用当前环绕处理计数状态99和寄存器环绕处理区122用于根据寄存器环绕处理来无效ALAT项目。
参照图9,当在步骤606执行提前的装载时和在作出ALAT 98中的项目以前,ALAT 98通过使用目标寄存器号码作为索引被存取,以及ALAT 98被检验,以便确定是否已存在相应于由提前的装载使用的目标寄存器号码的项目。如果有一个项目,则把它去除,因为它包括与本提前的装载无关的信息,以及多半是在执行先前的提前装载期间输入的。在具有从先前执行的提前装载得出的数据的现有的项目被清除以后,或当在ALAT 98中找到相应于现在的提前装载的目标寄存器号码的空的位置时,做出由目标寄存器号码为下标的新的项目,用于现在的提前的装载指令。
在提前的装载被执行和ALAT 98被更新以后,在步骤612,执行依赖于提前装载指令(例如,I24,I26)的结果的计算指令。在以上讨论的例子中,依赖的计算包括相加指令I26,如图7所示。任何跟随在提前装载指令后面的、以及在存储指令(该装载被提前到它的前面)前面的其它指令,在步骤615被执行。
在步骤618,装载被提前到它前面的、以及装载可能与它发生冲突的、存储指令(例如,I22)被执行。在图7所示的例子中,存储指令I24存取地址r1。在执行存储指令I22时,ALAT 98中所有的有效的项目通过使用由存储指令写入的存储器的物理地址和存储器区域的大小来进行搜索。这种搜索可以以任何数目的方式完成,以及本发明并不限于任何特定的技术。在本发明的一个实施例中,ALAT 98被安排为全部相关的内容可寻址的存储器,以使得所有的有效的项目被同时搜索。这些项目被进行搜索,以便确定在存储指令与任何提前的装载指令之间是否出现冲突。如果在ALAT 98中找到提前的装载(例如,I24)的存储器空间的范围与用于存储指令(例如,I22)的存储器空间的范围相重叠,则出现一个冲突。在本发明的一个实施例中,当检测到冲突时,ALAT 98中的、用于相应于冲突的提前装载的地址的项目在步骤621被去除,通知该冲突。在步骤621,如果由存储指令(例如,I22)存入的存储器空间的范围与任何提前的装载指令(例如,I24)不重叠,则ALAT 98中相应于特定的提前的装载指令的项目仍保留在ALAT 98中。
应当理解,被提前的装载指令可以被移到多个存储指令之前,每个存储指令可能潜在地与装载指令相冲突。在一系列存储指令后面的单个检验指令可被使用来检测,多个存储指令的任一个存储指令是否与装载指令相冲突,因为执行每个存储指令包括搜索ALAT 98中的所有的项目,来确定是否出现冲突。这样,检验指令是和程序中存储指令的数目无关的,因为单独的检验指令代替在步骤533中被提前的每个装载指令,以及每个检验指令检查ALAT 98,如下面在步骤623中描述的。
也应当理解,即使对于由提前的装载与存储指令存取的数据的起始地址是不相同,在提前的装载与存储之间也会出现冲突,正如上面讨论的。具体地,每个指令可以存取多个字节的数据。这样,如果在由提前的装载指令读出的数据占用的存储器地址的范围与由存储指令写入的数据占用的存储器地址的范围之间有冲突,则就会出现冲突。冲突的检测可以以多种方式来实行,以及本发明并不限于任何特定的实施方案。然而,用硬件实施全范围的比较会是昂贵的。所以,按照本发明的一个实施例,采用一种确定冲突的方法,对于由提前的装载和存储指令存取的数据的地址不实行全范围比较。
按照本发明的一个实施例,给出一种优选的、用于大小上对准被存储在存储器中的数据的方法,以使得用于数据块的起始地址优选地是数据大小的偶倍数。例如,包括四字节的数据块优选地被存储在一个地址,在该地址中两个最低位(LSB)是零,八字节的数据块优选地被存储在一个地址,在该地址中三个最低位(LSB)是零,等等。当数据在大小上对准时,冲突可以通过只执行对于由提前的装载与存储指令存取的数据的起始地址的直接相等比较而被检测。应当看到,直接相等比较比起全范围的比较,在硬件实施上化费少得多。当数据被错误对准时,如果只有有限量的错误对准,以使得误对准的数据可以在更大的大小对准的数据范围上适配,则在本发明的一个实施例中,硬件处理该存取误对准的数据的指令(例如,装载指令),就好像它正在存取更大的大小对准的数据范围一样。例如,如果装载指令存取存储器中八字节的误对准数据,但由存储指令存取的数据适合于大小对准的32字节范围,则装载指令被当作为存取32字节的数据进行处理。应当看到,通过把指令处理为利用较大的大小对准的数据块,可能会有由提前的装载和存储指令存取的数据地址出现重叠,但由一个指令实际存取的真实的数据(在以上例子中的8字节)没有重叠的情形,这导致检测到假冲突。这种性能损失是对于减小用于检测冲突的硬件的复杂性而付出的代价。如果数据很大地被误对准,以及不适合于合理地大的大小对准的数据范围,则硬件将不处理装载或存储指令。对于装载,没有项目被插入到ALAT 98中,这导致表示一个冲突。虽然这可能导致检测出假冲突,但这种性能损失是对于减小用于检测冲突的硬件的复杂性而付出的代价。对于被很大地误对准的存储指令,指令可被分成一系列更小的存储指令。在一个实施例中,硬件可被使用来把较大的存储指令分成该一系列多个存储指令。在另一个实施例中,不能适合于大小对准的数据范围的误对准的存储可被中断,以及操作系统通过把存储指令分成一系列更小的存储指令而处理存储。在处理误对准的存储指令的两个实施例中,对于ALAT 98中的有效的项目检验在序列中的每个较小的存储指令,正如在步骤618中描述的。如果对于任何较小的存储指令的存储器空间的范围与提前的装载的存储器空间的范围相重叠,则表示有冲突,如步骤621中描述的。这样,执行每个较小的存储指令,给出了与执行单个较大的存储指令时相同的结果。
在本发明的另一个实施例中,在被利用来检测冲突的硬件中的另一个节省是通过使用由忽略地址的一个或多个最高位(MSB)进行的用于相等比较的部分地址而达到的。忽略一个或多个MSB,导致ALAT98的大小上和用来执行相等比较的硬件的减小,因为在ALAT 98中较少的比特被存储用于每个项目,和较少的比特被比较。例如,对于64比特数据地址,只有装载的20个最低位被保存在ALAT 98中,以及在相等比较中被使用。应当看到,忽略一个或多个MSB,可导致检测到某些假冲突。具体地,当ALAT 98在执行存储指令时被搜索时(例如在步骤618),对于存储指令的数据和装载指令的数据的完全的起始地址对于在其上执行相等比较的LSB(例如,20个LSB)可以是相同的,但对于被忽略的一个或多个MSB可以不同的。当这种情况发生时,将例如通过切换控制流到恢复代码,将好像冲突实际上发生那样地执行图9的子程序。应当看到,由于从事实上没有发生的冲突中恢复,所以,假检测将导致某些性能恶化。这种性能损失是对于减小用于检测冲突的硬件的复杂性而付出的代价。当确定在检测方案中忽略多少个(如果有的话)MSB时,可以考虑在这些竞争的因素之间的平衡。
在步骤623,chk.a指令(例如,I25)被执行,用于在步骤606执行的提前的装载指令。在一个实施例中,chk.a指令检查ALAT 98,通过确定是否有用于提前的装载指令(例如,I24)的项目,而确定是否出现冲突。通过使用目标寄存器的识别符作为索引和由在步骤621在ALAT 98中被更新信息的、提前的装载指令(例如,I24)所使用的寄存器类型,chk.a指令检查ALAT 98。在步骤624,如果在ALAT 98中找到相应于由chk.a指令代替的特定的提前的装载指令的项目,则chk.a指令认识到,存储指令(例如,I22)和被提前到存储前面的装载指令(例如,I24)没有冲突。所以,由存储指令读出的数据是有效的,以及在步骤630,子程序进到结束执行指令序列。
然而,如果在步骤624,chk.a指令检查ALAT 98,并在ALAT 98中没有看到相应于由提前的装载指令(例如,I24)使用的寄存器地址的项目,则chk.a指令(例如,I25)确定,存储和提前装载指令可能已存取相同的存储器空间(即,冲突)。这样,采取进一步的步骤,确保根据提前装载指令(例如,I24)而已被执行的提前装载指令和计算指令的精确度。在一个实施例中,当检测到可能的冲突时,程序的控制流被改变成执行恢复代码。正如上面讨论的,这可以以许多方式(例如,通过转移或使用异常处理技术)来完成。应当看到,ALAT 98可以用多个项目来实施,这些项目不一定足够支持可被包括在被执行的程序中的所有的提前的本地指令。在图9所示的实施例中,chk.a在步骤633转移到恢复代码。恢复代码的例子在图7上被显示为指令I24r,I26r和I23r,它们实质上是命令I24,I26和I23的拷贝。
在步骤636,在步骤524被提前的装载指令(例如,I24)被重新执行。在步骤639,依赖于提前的装载指令(例如,I24)的指令被重新执行。在图7的例子中,显示了重新执行的装载指令I24r和依赖的相加指令I26r。这些指令在存储指令以后被重新执行,以便提供装载指令I24r和它的依赖性的计算I26r的正确的结果。在一个实施例中,恢复代码可以是由提供与原先执行的装载相同的结果的编译器所确定的指令和依赖的计算指令的组合。
在步骤642,控制流从恢复代码返回到编译的执行安排表。这可以通过使用转移指令,诸如图7上的I23,而完成。接着,继续执行安排的指令,直至程序在步骤630结束。
例如,在一个实施例中,ALAT 98具有用于相应于32个提前的指令的项目的空间。在本例的实施例中,如果在执行的程序中有大于32个提前的指令,则ALAT 98将没有足够的空间用于与所有的提前的指令有关的信息。当ALAT 98是充分的和新的提前的指令被执行时,可以使用代替方案来取出ALAT 98中的有效的项目,以便为新的指令留出空间。而且,在本发明的一个实施例中,当在运行时间执行在处理过程之间(诸如在分开的编译的程序之间)进行切换时,在ALAT 98中的项目可被保存用于以后的恢复,或可被无效。这样,在某些情况下,chk.a指令可能没有找到用于特定的提前的指令的项目,即使大于该指令没有出现冲突。
正如上面讨论的,本发明并不限于特定的ALAT结构,以及可以包括用于确定在装载和存储指令之间是否有冲突的其它的替换实施例。例如,可以使用其它的数据结构或比较电路。另外,所使用的ALAT或其它结构在大小和所使用的区的数目上可以变化。此外,分开的ALAT或数据结构可被使用于每个多个寄存器组。例如,在一个实施例中,ALAT可被使用于通用的和浮点的寄存器组。
本发明可被扩展到包括一个既是控制也是数据推测的指令。
控制从chk.s和chk.a指令到恢复代码的转移,可以以多种方式被实施。例如,chk.s和chk.a指令,在恢复代码中的第一指令的地址被包含在chk.s和chk.a指令本身的情况下,每个呈现为转移指令。替换地,chk.s和chk.a指令可以产生特定的异常,以及异常处理程序可以使用在chk.s和chk.a指令中的数值,来识别相应的恢复代码,然后用蹦床机制把控制转移到该恢复代码,诸如在以上引用的、2000年3月8日提交的、题目为“Emulated Branch Effected byTrampoline Mechanism(通过蹦床机制实现的仿真分支)”的、美国专利申请序列号09/521,160中描述的。异常处理器也可以使用chk.s或chk.a指令中的地址,它是指令被存储的存储器单元的地址,来识别恢复代码的位置。恢复代码可以是根据由编译器产生的表,它包括被编译器加到编译的源程序的检验指令的地址。所以,所执行的恢复代码由被执行的检验指令识别。
本发明允许指令不按次序地被提前,即使当编译器没有肯定,被提前的指令将不与后面的指令相冲突时。正如上面讨论的,某些冲突的编译器可以把多个装载指令提前到存储指令的前面,即使没有肯定装载与存储将不冲突。在运行时间时,如果有冲突,装载指令将在编译的执行调度中有序(in line)地重新执行。相反,在本发明的一个实施例中,指令执行的优化是通过不单把装载提前到存储之前,也提前依赖于它的计算,而被完成。这使得编译器和调度程序能够最有效地一次使用多个执行单元。而且,代替如果有冲突则只重新执行装载指令,而是执行检验指令,确定是否有冲突,以及控制流程改变为恢复代码,包括装载指令和它的依赖的计算。因此,多个代码段可以独立地和并行地被执行。
按照本发明的计算机系统50有效地组合用于提前的装载的ALAT机制和用寄存器的软件控制的重命名实施的寄存器堆栈机制。当组合ALAT机制和寄存器堆栈机制时,ALAT不一定记录软件可见的寄存器数目。如果ALAT要记录软件可看见的寄存器数目会遇到的一个问题由以下的实例I说明。
实例I过程A执行提前的装载,从存储器单元X到通用寄存器GRm+1。
过程A调用过程B。
发生寄存器重命名,其中GRm+1通用寄存器名称被重新变换到新的物理寄存器。
过程B进行存储指令到存储器单元X。
过程B进行提前的装载,从存储器单元Y到通用寄存器GRm+1。
过程B进行存储指令到存储器单元Z。
过程B检验它的提前的装载到通用寄存器GRm+1以及确定程序过程B的提前的装载已成功。
过程B返回到过程A。
过程A检验它的提前的装载到通用寄存器GRm+1以及(不正确地)确定过程A的提前的装载已成功。
克服以上的例子的问题的一个方法是使得软件控制的寄存器重命名调节ALAT中的所有项目。然而,这种解决办法在实施上相当复杂,以及大大地增加ALAT的大小。
为此,按照本发明的ALAT 98记录在提前的装载指令中存取的物理寄存器数目,诸如被记录在物理寄存器数目区118中。在ALAT 98的物理寄存器数目区118中的物理寄存器数目将与软件可看见的寄存器相匹配,只要所有的调用与返回相匹配。在所有的调用与返回相匹配的情况下,ALAT 98被软件清除,以避免任何无效的项目。然而,这种清除机制不完全解决以上例子的问题,因为当被执行的调用指令的数目变得足够高造成当前的寄存器堆栈帧环绕处理物理寄存器的概念性圆周时,物理寄存器被复用。
在一个实施例中,当前环绕处理计数状态99的比特数(N)和相应的寄存器环绕处理区122被设置到零。在本实施例中,当发起一个调用时,它引起当前的寄存器堆栈帧移过物理寄存器的基本周期中的某个任意点,使得寄存器地址环绕处理,然后,ALAT 98中所有的项目被清除。在本实施例中,以上的例子的问题被解决,因为检验操作将从未见到被某个其它的过程插入的项目。这种解决办法,其中当前环绕处理计数状态99的比特数(N)和相应的寄存器环绕处理区122等于零,无论如何,使得性能恶化,因为这种解决办法造成ALAT 98的过量的清除,触发过多的提前的装载恢复。
在本发明的优选实施例中,当前环绕处理计数状态99和相应的寄存器环绕处理区122包括N比特,其中N大于零。当前环绕处理计数状态99和相应的寄存器环绕处理区122的N比特代表N比特计数值,它增大ALAT 98的物理寄存器数目区118,形成扩展的物理寄存器数目,用于提前的装载指令。在本发明的优选实施例中,ALAT 98中的项目实质上表示,物理寄存器比实际上存在的多(即,ALAT中增大的物理寄存器数目表示比实际物理寄存器的数目多2N倍的物理寄存器)。
当调用再映射事件造成物理寄存器环绕处理时,N比特当前环绕处理计数状态99被加增量,以及被使用于以后的提前装载指令,来确定写入到相应的ALAT项目的寄存器环绕处理区122中的N比特环绕处理计数值。调用再映射事件在这里是指响应于被调用的、造成新的寄存器的分配的程序过程的任何事件。新的寄存器的分配典型地在程序过程被调用后立即被执行。在一个实施例中,调用再映射事件包括由调用程序过程执行调用指令,后面是由被调用程序过程执行特定的分配指令,它分配多个寄存器供被调用程序过程使用。在本实施例中,特定的分配指令可以导致物理寄存器环绕处理。在使得物理寄存器不环绕处理的返回再映射事件中,N比特当前环绕处理计数状态99被减增量,以及被使用于以后的提前装载指令,确定写入到相应的ALAT项目的寄存器环绕处理区122中的N比特环绕处理计数值。
当调用再映射事件使得物理寄存器环绕处理时,N比特当前环绕处理计数状态99被加增量,然后ALAT 98被搜索,找出它们的寄存器环绕处理区122中的环绕处理计数值与更新的环绕处理计数状态99相一致的项目,以及在它们的寄存器环绕处理区具有匹配的环绕处理计数值的所有的项目被清除。同样地,当返回再映射事件使得物理寄存器不环绕处理时,N比特当前环绕处理计数状态99被减增量,然后ALAT 98被搜索,找出它们的寄存器环绕处理区122中的环绕处理计数值与更新的环绕处理计数状态99相一致的项目,以及在它们的寄存器环绕处理区具有匹配的环绕处理计数值的所有的项目被清除。
本发明通过允许按照本发明的ALAT记录在提前的装载中使用的物理寄存器数目而不引起过量的提前装载恢复化费,允许用于实施提前的装载的ALAT机制和用寄存器的软件控制的重命名实施的寄存器堆栈机制一起有效地工作。
虽然这里为了说明优选实施例显示和描述了具体的实施例,但本领域技术人员将会看到,打算达到同样的目的的各种各样的替换和或等价的实施方案可以代替所显示和描述的具体实施例,而不背离本发明的范围。在化学、机械、电-机械、电气、和计算机技术领域中的技术人员将容易看到,本发明可以以各种各样的实施例来实施。本申请打算覆盖这里讨论的优选实施例的任何改编和变例。所以,显然打算本发明只由权利要求和它的等价物限制。
权利要求
1.一种计算机系统,包括存储器(58),存储编译的程序(66/40),包括存储指令(I22);装载指令(I24),被调度在存储指令之前;以及检验指令(I25);处理器(52),执行编译的程序;物理寄存器(74/76),保存用于编译的程序的数据,一部分物理寄存器形成寄存器堆栈(84/88),当充满时进行环绕式处理;N比特当前环绕处理计数状态(99),跟踪导致寄存器堆栈环绕处理或不环绕处理的物理寄存器再映射事件;提前装载地址表(98),具有相应于装载指令的项目,每个项目具有至少一个存储器范围区(112,114),规定由相应的装载指令存取的存储器单元的范围,物理寄存器数目区(118),相应于在相应的装载指令中存取的物理寄存器,以及N比特寄存器环绕处理区(122),它相应于对于相应的装载指令的N比特的当前环绕处理计数状态;以及其中检验指令存取提前装载地址表,确定存储指令和装载指令是否潜在地存取公共的存储器单元。
2.权利要求1的计算机系统,其中在执行存储指令以后,相应于提前装载地址表中的装载指令的项目不存在,表示公共的存储器单元可能已被存储和装载指令存取。
3.权利要求1的计算机系统,其中如果存储指令和装载指令存取公共的存储器单元或公共存储器范围,存储指令的执行清除在提前装载地址表中的相应于装载指令的项目。
4.权利要求1的计算机系统,其中N比特寄存器环绕处理区增大物理寄存器数目区,形成扩展的物理寄存器数目,用于相应的装载指令。
5.权利要求1的计算机系统,其中响应于使得寄存器堆栈环绕处理的调用再映射事件,N比特寄存器环绕处理计数状态被增大或减小。
6.权利要求5的计算机系统,其中在N比特寄存器环绕处理计数状态被增大或减小以后,处理器搜索提前装载地址表,找出在它们的寄存器环绕处理区中具有与更新的N比特当前环绕处理计数状态相匹配的环绕处理计数值的项目,以及清除在提前装载地址表中的在它们的寄存器环绕处理区中具有与更新的N比特当前环绕处理计数状态相匹配的所有的项目。
7.权利要求1的计算机系统,其特征在于,其中至少一个存储器范围区包括存储器地址区和存储器地址大小区。
8.一种在计算机系统中执行指令的方法,方法包括把用于在计算机系统中执行的程序的数据保存在物理寄存器中,其中一部分物理寄存器形成寄存器堆栈,当充满时进行环绕式处理;执行被调度在存储指令之前的装载指令;保持N比特当前环绕处理计数状态,它跟踪导致寄存器堆栈环绕处理或不环绕处理的物理寄存器再映射事件;把相应于装载指令的项目记录在具有相应于装载指令的项目的提前装载地址表中,每个项目具有至少一个存储器范围区,规定由相应的装载指令存取的存储器单元的范围,物理寄存器数目区,相应于在相应的装载指令中存取的物理寄存器,以及N比特寄存器环绕处理区,它相应于对于相应的装载指令的N比特的当前环绕处理计数状态;执行存储指令;以及执行检验指令,它存取提前装载地址表,确定存储指令和装载指令是否潜在地存取公共的存储器单元。
9.权利要求8的方法,其中在执行存储指令以后,相应于提前装载地址表中装载指令的项目不存在,表示公共的存储器单元可能已被存储和装载指令存取。
10.权利要求8的方法,其中执行存储指令的步骤包括如果存储指令和装载指令存取公共的存储器单元,则清除在提前装载地址表中相应于装载指令的项目。
11.权利要求8的方法,其中N比特寄存器环绕处理区增大物理寄存器数目区,形成扩展的物理寄存器数目,用于相应的装载指令。
12.权利要求8的方法,还包括响应于使得寄存器堆栈环绕处理的调用再映射事件,将N比特寄存器环绕处理计数状态增大或减小。
13.权利要求12的方法,其中在执行增大或减小的步骤以后,方法执行以下步骤搜索提前装载地址表,找出在它们的寄存器环绕处理区中具有与更新的N比特当前环绕处理计数状态相匹配的环绕处理计数值的项目;以及清除在提前装载地址表中在它们的寄存器环绕处理区中具有与更新的N比特当前环绕处理计数状态相匹配的所有的项目。
14.权利要求8的方法,其特征在于,其中至少一个存储器范围区包括存储器地址区和存储器地址大小区。
全文摘要
计算机系统包括物理寄存器,一部分物理寄存器形成寄存器堆栈,当充满时进行环绕式处理。N比特当前环绕处理计数状态,跟踪导致寄存器堆栈环绕处理或不环绕处理的物理寄存器再映射事件。提前装载地址表(ALAT)具有相应于装载指令的项目。检验指令存取ALAT,确定被安排在存储指令之前的存储指令和装载指令是否潜在地存取公共的存储器单元。
文档编号G06F9/34GK1329304SQ0111794
公开日2002年1月2日 申请日期2001年4月27日 优先权日2000年4月27日
发明者D·C·莫里斯, W·R·布里格, A·H·卡普, W·Y·陈 申请人:显露结构开发研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1