基于旋转的别名保护寄存器中的寄存器分配的制作方法

文档序号:6484675阅读:236来源:国知局
基于旋转的别名保护寄存器中的寄存器分配的制作方法
【专利摘要】一种系统可以包括优化器/调度器,用于对一组指令进行调度,计算调度的指令组的数据相关性、检查约束和/或防检查约束,以及,基于数据相关性、检查约束和/或防检查约束,为调度的指令组分配别名寄存器。在一个实施例中,优化器用于释放未使用的寄存器,以减少用来保护调度的指令的别名寄存器。优化器进一步将伪指令插入到合并的指令之后,以中断检查约束和防检查约束中的循环。
【专利说明】基于旋转的别名保护寄存器中的寄存器分配
[0001]背景
[0002]硬件/软件共同设计的系统可以利用动态二进制优化来改善性能。对于对存储器指令的动态二进制优化,可能需要存储器别名信息。动态二进制优化可以为原子区中的推测性的存储器优化利用硬件别名检查。当加载指令被推测性地重新排序到存储指令之前并且它们之间有可能的存储器别名时,加载指令可能需要设置别名保护寄存器,其存储器地址存储在其中。响应于存储指令被执行,存储指令可以检查带有其存储器地址的别名保护寄存器来检测错误推测。错误推测可能会导致整个区域的回滚和非优化的或不太优化的代码的重新执行。
[0003]附图简述
[0004]此处所描述的本发明是作为示例说明的,而不仅限于各个附图的图形。为说明简单和清楚起见,图形中所示出的元件不一定是按比例绘制的。例如,为了清楚起见,某些元件的尺寸可以相对于其他元件而放大。此外,在合适的情况下,在不同的图形中参考标签重复使用,以表示对应的或类似的元件。
[0005]图1A是根据本发明的一个实施例的示例性系统的框图。
[0006]图1B是根据本发明的一个实施例的另一示例性系统的框图。
[0007]图1C是根据本发明的一个实施例的再一个示例系统的框图。
[0008]图2A-2K是根据本发明的某些实施例的基于旋转的别名保护寄存器中的寄存器分配的示意图。
[0009]图3是根据本发明的一些实施例的流程图。
[0010]详细描述
[0011]下面的描述说明了提供别名寄存器分配算法,以减少基于旋转的别名保护寄存器中的寄存器使用的技术。技术的实现不局限在计算系统中;它可以被任何执行环境用于类似的目的,诸如,例如,任何其他数字/电子设备。在下面的描述中,阐述了诸如逻辑实现、操作码、指定操作数的手段、资源分区/共享/重复实现,系统组件的类型和相互关系,以及逻辑分区/集成选择之类的很多具体细节,以便提供对本发明的更全面的理解。然而,本发明可以在没有这样的具体细节的情况下实施。在其他情况下,没有详细示出控制结构和完全软件指令序列,以便不至于使本发明变得模糊。
[0012]说明书中对〃 一个实施例"、〃实施例"、〃示例实施例〃等等的引用表示所描述的实施例可包括特定特征、结构或特性,但是,每一个实施例可以不一定包括该特定特征、结构或特征。此外,这样的短语不一定是指同一个实施例。此外,当结合一个实施例描述特定特征、结构或特性时,认为在本领域技术人员学识范围内,可以与其他实施例一起实施这样的特征、结构或特性,无论是否对此明确描述。
[0013]可以使用硬件、软件、固件或其任何组合来实现本发明的各实施例。本发明的各实施例还可实现为存储在机器可读取的介质中的可以由一个或多个处理器读取和执行的指令。机器可读的介质可以包括用于以机器(例如,计算设备)可读的形式存储或传输信息的任何机制。例如,机器可读的介质可以包括,只读存储器(ROM);随机存取存储器(RAM);磁盘存储介质;光存储介质;闪存设备;电的、光学的、声音或其他形式的传播信号(例如,载波、红外信号、数字信号等等);及其他。
[0014]下面的描述可以包括只用于描述性的目的而不应该理解为限制性的诸如第一、第二等等之类的术语。
[0015]图1A示出了系统100的示例性实施例的框图。系统100可以包括处理器102。处理器102可以包括任何类型的能够执行软件和/或处理数据信号的处理器。在一个实施例中,处理器102可以包括复杂指令集计算机(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器、实现指令集的组合的处理器,或任何其他处理器设备,诸如数字信号处理器,诸如微处理器、数字信号处理器或微控制器。
[0016]虽然图1A只示出了一个这样的处理器102,但是,系统100中可以有一个或多个处理器,一个或多个处理器可以包括多个线程、多个核等等。本增强不仅限于计算系统。本发明的替换实施例可以用于使用统一可扩展固件接口(UEFI)基本输入/输出系统(BIOS)的诸如手持式设备和嵌入式应用之类的任何形状因子设备中。手持式设备的某些示例包括蜂窝电话、网际协议设备、数码相机、个人数字助理(PDA),或诸如上网本或笔记本之类的手持式PC。嵌入式应用可包括微控制器、数字信号处理器(DSP)、单片系统、网络计算机(NetPC)、机顶盒、网络中枢、广域网(WAN)交换机,或任何其他系统。
[0017]处理器102可以耦合到系统逻辑芯片104。例如,在所示出的实施例中,系统逻辑芯片104可以是存储器控制器中枢(MCH)。在一个实施例中,MCH104可以提供到系统存储器106的存储器路径120用于指令和数据存储和/或用于例如图形命令、数据和纹理的存储。存储器路径120可以包括存储器总线。MCH104可以在系统100中的处理器102、系统存储器106、及其他组件之间定向数据信号,并在处理器102、系统存储器106、以及系统I/O之间桥接数据信号。存储器106可以是硬盘、软盘、随机存取存储器(RAM)、只读存储器(ROM)、闪存,或可由处理器102读取的任何其他类型的介质。
[0018]MCH104可以通过本地I/O互连来耦合到I/O控制器中枢(ICH) 108。在一个实施例中,本地I/O互连可以是诸如外围组件互连(PCI)总线之类的高速I/O总线。ICH108可以,例如,通过本地I/O互连,提供到一个或多个I/O设备的连接。某些示例可以包括数据存储设备118、音频1/0120、键盘/鼠标1/0122,以及网络控制器116,或其他集成的I/O组件,诸如集成的驱动器电子设备(IDE),局域网(LAN)和串行扩展端口,诸如通用串行总线(USB)、PCI插槽(未示出)、无线收发器,旧式I/O控制器等等。数据存储设备118可以包括硬盘驱动器、软盘驱动器、CD-ROM设备、闪存设备,或其他大容量存储设备。
[0019]参考图1A,诸如闪存112之类的非易失性存储器可以通过,例如,低管脚数(LPC)总线,耦合到ICH108。BIOS固件114可以驻留在闪存112中,引导程序可以执行来自闪存,或固件的指令。虽然图1A示出了闪存112中的BIOS固件114,但是,在某些实施例中,BIOS固件114可以存储在诸如固件中枢之类的其他非易失性存储器等等中。在一个实施例中,BIOS固件114可以通过统一可扩展固件接口(UEFI)固件或任何其他固件来实现。
[0020]虽然图1A示出了系统100,但是,根据本发明的各实施例可以用于任何其他硬件体系结构中,诸如使用多个处理器核的平台,或使用处理器或协同处理器的平台,使用1/0中枢的平台,或可以使用嵌入在处理器内的存储器控制等等。
[0021]图1B示出了实现本发明的原理的系统140的替换实施例。系统140可以包括处理器142。处理器142可以包括任何类型的能够执行软件和/或处理数据信号的处理器。在一个实施例中,处理器142可以包括如上文对于处理器102所提及的任何类型的处理器或处理器设备。在一个实施例中,处理器142可以通过存储器路径(未示出)耦合到用于指令和数据存储和/或用于,例如,图形命令、数据和纹理的存储的系统存储器144。在另一个实施例中,处理器142可以通过PCI互连耦合到一个或多个外围组件互连(PCI)端口 160 ;然而,在某些实施例中,PCI端口 160可能不是必需的。存储器144可以是硬盘、软盘、随机存取存储器(RAM)、只读存储器(ROM)、闪存,或可由处理器142读取的任何其他类型的介质。
[0022]虽然图1B只示出了一个这样的处理器142,但是,系统140中可以有一个或多个处理器,一个或多个处理器可以包括多个线程、多个核等等。本增强不仅限于计算机系统或数据处理设备系统。本发明的替换实施例可以用于使用统一可扩展固件接口(UEFI)基本输入/输出系统(BIOS)的诸如手持式设备和嵌入式应用之类的任何形状因子设备中。手持式设备的某些示例包括蜂窝电话、网际协议设备、数码相机、个人数字助理(PDA),或诸如上网本或笔记本之类的手持式PC,或诸如平板电脑或智能电话之类的智能设备等等。嵌入式应用可包括微控制器、数字信号处理器(DSP)、单片系统、网络计算机(NetPC)、机顶盒、网络中枢、广域网(WAN)交换机,或任何其他系统。
[0023]处理器142可以耦合到系统逻辑芯片146。例如,在所示出的实施例中,系统逻辑芯片146可以是平台控制器中枢(PCH)。在一个实施例中,PCH146可以,例如,通过本地I/O互连,提供到一个或多个I/O设备的连接。在一个实施例中,本地I/O互连可以是诸如外围组件互连(PCI)总线之类的高速I/O总线。PCH146可以在处理器142和系统140中的一个或多个其他组件之间定向数据信号或其他信息,并在处理器142和系统I/O之间桥接数据信号或信息。
[0024]一个或多个组件的某些示例可以包括数据存储设备142、一个或多个PCI端口154、网络控制156、USB端口 158。在一个实施例中、数据存储设备152可以包括硬盘驱动器、软盘驱动器、CD-ROM设备、闪存设备,或其他大容量存储设备。虽然图1B示出了组件的某些示例,但是PCH146可以提供到任何其他组件的连接,诸如音频I/O、键盘/鼠标1/0,及其他集成I/O组件,诸如集成的驱动器电子设备(IDE)、局域网(LAN)及其他串行扩展端口,无线收发器,旧式I/O控制器等等。
[0025]参考图1B,诸如闪存148之类的非易失性存储器可以通过,例如,低管脚数(LPC)总线,耦合到PCH146。BIOS固件150可以驻留在闪存148中,引导程序可以执行来自闪存或固件的指令。虽然图1B示出了闪存148中的BIOS固件150,但是,在某些实施例中,BIOS固件150可以存储在诸如固件中枢之类的其他非易失性存储器等等中。在一个实施例中,BIOS固件150可以通过统一可扩展固件接口(UEFI)固件或任何其他固件来实现。
[0026]虽然图1B示出了系统140,但是,根据本发明的各实施例可以用于任何其他硬件和软件体系结构中,诸如使用多个处理器核的平台,或使用处理器或协同处理器的平台,使用I/o集线器的平台,或可以使用嵌入在处理器内的存储器控制等等。
[0027]图1C示出了可以实现本发明的原理的系统160的另一实施例。系统160可以包括处理器162。处理器162可以包括任何类型的能够执行软件和/或处理数据信号的处理器。处理器162可以包括如上文对于处理器102所提及的任何类型的处理器或处理器设备。系统160可以包括存储器163,该存储器163可以通过互连168或诸如总线、存储器路径等等之类的任何其他连接耦合到处理器162。存储器163的示例可以包括硬盘、软盘、随机存取存储器(RAM)、只读存储器(ROM)、闪存、易失性存储器设备或非易失性存储器设备,或任何其他类型的可由处理器162读取的介质。在另一个实施例中,处理器162可以耦合到网络组件164,网络组件164可以包括,例如,有线网络连接和/或无线网络连接或任何其他网络连接。处理器162可以进一步耦合到I/O控制器165,该I/O控制器165可以耦合到一个或多个I/O设备166。图1C示出了系统160的实施例;在某些实施例中,系统160可以包括可以以硬件、软件、固件或它们的任何组合来实现的一个或多个其他组件。在另一个实施例中,系统160的示例可以包括如上文对于图1A或IB所提及的任何形状因子设备或装置。
[0028]图2A是根据本发明的一个实施例的不意图。参考编号210可以表不可以具有store_0 (存储_0)、store_l等等的顺序的原始代码或指令,如图2A所示。在一个实施例中,原始代码可以在原子区内;然而,在某些实施例中,原子区可能不是必需的。在一个实施例中,可以将原始代码210重新排序或调度到可以相对于原始代码具有不同的序列或顺序的调度的代码或指令220。例如,指令220a可以表示存储器存储指令Store_5,该存储器存储指令store_5可以被调度到由,例如,执行逻辑执行的第一指令。图2A的实施例可以使用基于旋转的别名保护寄存器,这些寄存器可以允许每一个存储器指令设置别名保护寄存器,并针对带有比特屏蔽的一组别名保护寄存器进行检查。
[0029]在一个实施例中,可以使用基于旋转的别名检查。别名保护寄存器可以以环形缓存器或基于AHPTR (别名首部指示符)270旋转的循环队列来组织,AHPTR270可以指向环形缓存器的首部。存储器指令可以指定相对于当前AHPTR270的别名保护寄存器编号0RD230(带有可能的折回)。例如,参考图2A,基于原始代码的顺序,可以在环形缓存器的首部设置第一指令storej)的带有寄存器ORD “O”的第一别名保护寄存器,第二指令storej可以指定带有寄存器ORD “I”的第二别名保护寄存器,等等。在另一个实施例中,存储器指令可以具有P比特以表示,诸如处理器102或142之类的硬件或任何其他执行逻辑可以为当前指令设置带有寄存器编号AHPTR+0RD的别名保护寄存器。在一个实施例中,可以检查[AHPTR+ORD, AHPTR)的范围中的寄存器。例如,如果AHPTR=2,ORD=I,并且总的寄存器编号是5 (例如,0-4),则可以检查[3,2)范围内的寄存器3,寄存器4,寄存器O和寄存器I。在一个实施例中,可以使用折回。
[0030]存储器指令可以具有C比特以表示,诸如处理器之类的硬件或任何其他执行逻辑可以检查所有带有寄存器编号>=AHPTR+0RD (带有可能的折回)的别名保护寄存器。响应于指令调度,可以基于指令的原始执行顺序,为调度的指令分配带有编号0RD230的别名保护寄存器。例如,在图2A中,作为原始程序执行的顺序,可以分配带有0RD230的别名保护
寄存器。
[0031]在另一个实施例中,存储器指令可以指定旋转编号R0T,该ROT可以表示别名首部指示符可以旋转ROT中所指出的量。在一个实施例中,可以使用旋转值ROT来表示可以释放AHPTR和AHPTR+R0T之间的所有别名保护寄存器(带有可能的折回,包括AHPTR,排除AHPTR+R0T),例如,在执行指令之前。在一个实施例中,诸如处理器102或142之类的硬件可以将AHPTR旋转R0T,并清除AHPTR和AHPTR+R0T之间的别名保护寄存器的所有有效比特。
[0032]在一个实施例中,响应于设置带有P比特的别名保护寄存器,硬件可以为寄存器设置有效比特。例如,带有,例如,逻辑“I”的有效比特可以表示可以通过,例如,硬件,检查的有效别名保护寄存器。在另一个实施例中,带有逻辑值,例如,“O”的有效比特可以表示可以不检查相应的别名保护寄存器。例如,图2A的数字参考编号240可以表示“valid_all (有效_全部)”,“valid_all ”可以包括一组一个或多个别名保护寄存器的一组一个或多个有效比特。在一个实施例中,“valid_all”240中的有效比特的数量可以与别名保护寄存器的数量和/或调度的指令的数量相同;然而,在某些实施例中,有效比特的数量可以不同于调度的指令的数量。例如,基于原始代码的顺序,可以在valid_all240的最高阶比特设置最后一个指令store_5的带有ORD“5”的别名保护寄存器的有效比特,并可以在valid_all240的最低阶比特设置第一指令store_0的带有ORD “O”的别名保护寄存器的有效比特,等等;然而,在某些实施例中,可以按不同的顺序提供valid_all240中的有效比特。在某些实施例中,valid_all240中的有效比特可以具有基于别名保护寄存器的ORD的顺序。
[0033]例如,valid_all字段240a可以是“000000”,“000000”可以表示对于指令“st0re_5”(调度的序列中的第一指令),可以不检查别名保护寄存器中的任何一个。valid_all字段240b可以涉及调度的代码中的后续指令“store_2”。valid_all字段240b可以是“ 100000”,其中,有效比特“ I”可以对应于前一指令“store_5”,并可以表示可以检查“st0re_5”的别名保护寄存器。而且,240b中的有效比特“00000”可以表示,可以不检查store_2 其本身、store_0、load_4 (加载 _4)、store_l, load_3 的别名保护寄存器。
[0034]参考图2A,valid_st (有效_st)字段250可以涉及存储指令,并可以包括一组一个或多个有效比特。例如,valid_st250可以与valid_all240的不同之处在于,加载指令的别名保护寄存器的有效比特可以具有valid_st250中的逻辑值“O”。在一个实施例中,诸如102或142之类的硬件或其他执行逻辑可以为,例如,所有别名保护寄存器维持有效比特,并在执行每一个指令之前,计算比特屏蔽260,用于检查。加载指令可以不检查另一个加载指令。从load_3的比特屏蔽260a可以看出,可以没有load_4的有效比特(例如,逻辑值“1”),或可以不断言load_4的别名保护寄存器的有效比特。在另一个实施例中,对于load_3的比特屏蔽260a,可以没有按原始执行顺序排序在load_3之前的store_0,store_l,和store_2的有效比特。硬件可以为所有指令(例如,valid_all240)以及只为存储指令(例如,valid_st250),维持单独的有效比特。存储指令可以检查valid_all240,加载指令可以只检查valid_st250。
[0035]图2A示出了诸如处理器或任何其他执行逻辑之类的硬件维持valid_all240、valid_st250并基于0RD230,例如,以C语言语义,计算屏蔽260的公式的实施例。图2A的基于旋转的别名保护寄存器的寄存器分配的算法可以按它们的原始程序顺序为每一个指令分配寄存器,在图2A中示为“寄存器0RD”230。可以使用该算法来保证在别名检查中没有假阴性或假阳性。参考图2A,在一个实施例中,每一个指令都可以具有P/C比特(未示出),但是可以不具有R0T。在再一个实施例中,诸如处理器或任何其他执行逻辑之类的硬件可以运行带有0RD/P/C230的调度的代码220,并计算valid_all240、valid_st250和valid_mask (有效_屏蔽)260,以执行别名检查。
[0036]参考图2B,示出了寄存器分配的实施例。在一个实施例中,可以使用图2B的寄存器分配来减少基于旋转的别名保护寄存器方案中所使用的别名保护寄存器的数量,并可能不生成假阳性或假阴性。图2B的实施例可以与指令调度和优化集成,并可以用于动态优化。在一个实施例中,不是每一个存储器指令都可以设置别名保护寄存器,并且不是每一个存储器指令都可以检查其他别名保护寄存器。例如,在图2B中,storej)、^^01^_1和load_3中一个也不可以设置别名保护寄存器,因为没有指令可以检查它们。Store_5可以不检查任何其他别名保护寄存器,因为它被调度为区域中的第一指令。图2B的实施例可以使用三个寄存器,而并非六个寄存器。
[0037]参考图2B,store_5、store_2和load_4可能需要保护(例如,它们的P比特可以设置为1,它们的C比特(未示出)可以设置为0),可以给它们分别分配带有ORD编号2,0,和I的寄存器。Store_0、store_l和load_3可能不需要保护,并可能只检查其他别名寄存器(例如,它们的P比特可以设置为0,它们的C比特可以设置为I)。图2B示出了基于0RD,P和C计算valid_all240、valid_st250和屏蔽260的实施例。
[0038]图2C示出了寄存器分配的另一实施例。在图2C的实施例中,响应于判断store_l和load_4可以不访问同一个存储器,例如,通过软件分析,store_l可以不检查load_4。图2C的实施例可以使用两个寄存器。参考图2C,可以保护st0re_5、st0re_2 (例如,它们的P比特=1),可以给它们分别分配带有0RD1,以及O的寄存器。store_0, load_4, store_l以及load_3 (例如,它们的P比特=0,C比特=1)可以只检查其他别名寄存器。在图2A到2C的各实施例中,寄存器分配可以遵循原始程序顺序。例如,如果在原始程序中第一指令将在第二指令之前执行,则第一指令的寄存器编号可以不大于第二指令。
[0039]图2D示出了寄存器分配的再一个实施例。参考图2D,示出了数据相关性的实施例。例如,可以定义相关性Al—A2,如果I)以原始程序顺序,指令Al将在指令A2之前执行;2) Al和A2可以访问同一个存储器;3)A1和A2中的至少一个是存储指令。图2D进一步示出了检查约束的实施例。例如,响应于,例如,指令调度器推测Al和A2在运行时可能不会冲突,指令调度器可以将A2移动到Al之前。例如,指令调度器可以通过软件来实现。如果Al — A2,并且指令A2被重新排序到Al之前,则A2可以设置要由Al检查的别名保护寄存器。可以定义检查约束Aloc A2,如果1)A1—A2;2)通过调度,A2被重新排序到Al之前。在一个实施例中,指令Al可以响应于Alic A2,检查指令A2。在某些实施例中,检查约束可以不是过渡的。例如,Al=C A2和A2二c A3可以不暗示Al=c A3
[0040]在一个实施例中,检查约束Al=c A2可以判断哪一个指令可以设置别名保护寄存器,哪些指令可以检查其他指令。例如,检查约束Al=C A2可以判断指令A2可以设置带有P比特的新别名保护寄存器,而指令Al (带有C比特)可以检查指令A2。图2D示出了原始程序顺序的寄存器分配的实施例。例如,如图2D所示,load_l和load_3可以基于相应的检查约束和/或数据相关性,设置带有P比特的新别名保护寄存器,如图2D所示。寄存器O和I可以根据它们的原始程序顺序分别分配到load_l和load_3。Store_2可以检查在store_2之前调度的指令load_3的寄存器I。Store_0可以检查在store_0之前调度的指令load_l的寄存器O。在图2D的实施例中,可以没有检查约束store_0—c load_3 (例如,
store_0可以不访问带有load_3的同一存储器),并且store_0可能不需要检查load_3。
[0041]图2E示出了不在原始程序顺序里的寄存器分配的实施例。例如,参考图2E,可以按与它们的原始程序顺序相反的顺序,分别将寄存器O和I分配给load_3和load_l。参考图2E,Load_3的寄存器O (0RD0/P)可以只由Store_2检查(0RD0/C)。在图2E的实施例中,在Store_2之后,可以不检查寄存器O。参考图2F,可以旋转AHPTR达ROT “1”,以释放寄存器O。例如,寄存器O可以在load_l的执行开始时旋转和释放;然而,在某些实施例中,寄存器O可以被释放,例如,响应于寄存器可能已经被检查并可能不被任何其他指令使用。在另一个实施例中,旋转可以在store_2的执行之后执行。响应于旋转,AHPTR可以增大I(例如,当前AHPTR=I)。对于相对于当前AHPTR计数的后续指令,ORD仍可以是“O”。图2E和图2F可以执行相同别名检查。例如,图2F可以利用旋转将寄存器编号减少为I个寄存器。
[0042]在图2F的利用旋转的寄存器分配的实施例中,可以响应于store_2已经检查寄存器0,load_3所使用的寄存器O通过寄存器旋转来释放。在此实施例中,可以使用一个寄存器。图2F示出了基于0RD,P,C,ROT和寄存器计数REG (例如,I)来计算valid_all、valid_st和屏蔽的实施例。在一个实施例中,可以相对于AHPTR,计算公式中的val id_al 1、valid_st和屏蔽。例如:
[0043]mask(n) =valid_all (η)& ~ ((1?0RD (η)) -1),如果 η 是存储且 C(n);
[0044]=valid_st (n)& ~((1?0RD (n)) -1),如果 n 是加载且 C (n).[0045]在一个实施例中,硬件可以循环地将屏蔽左移位,达AHPTR,以便检查。在一个实施例中,“循环地左移位”可以将屏蔽中的比特向左移,并向右折回溢出比特。例如,对于屏蔽00001111,循环地左移位2,会导致00111100。在图2F的实施例中,可以相对于AHPTR,计算valid_all、valid_st,以及屏蔽。例如,如果AHPTR=2,屏蔽00001111可以表示寄存器2到寄存器5具有屏蔽值“ I”,寄存器6、7、0、I中每一个都可以具有屏蔽值“O”。
[0046]可以使用图2G的实施例来基于与指令调度集成的检查约束和防检查约束来提供寄存器分配。在一个实施例中,如果`Al=C A2,Al的寄存器Al可以不大于A2的,以便Al检查A2。在某实施例中,在寄存器分配中可以使用检查约束和防检查约束,来避免别名检查中的假阳性。在一个实施例中,可以定义防检查约束Al = ac A2,如果1)A1 — A2 ;2)A1可以基于检查约束AO=C Al,来设置别名保护寄存器;3)A2可以基于检查约束A2=c A3来检查某些别名保护寄存器;以及4)调度可以不将A2重新排序在Al之前。
[0047]在一个实施例中,基于防检查约束Alsac A2,Al的寄存器编号可以小于A2,以防止A2检查Al (例如,以避免可能的假阳性)。可以使用检查约束来减少或最小化寄存器分配中的约束,例如,以防止检查中的假阴性,可以使用防检查约束来减少/最小化寄存器分配中的额外的约束,例如,以防止检查中的假阳性。
[0048]当用完别名寄存器时,可以使用图2G的实施例来动态地限制调度。参考图2G,可以在调度过程中递增地构建检查约束和防检查约束。可以只响应于指令被调度,分配指令的寄存器。如果Al=C A2或Al=ac A2,则可以延迟对于A2的寄存器分配,直到分配Al的寄存器。在图2G的实施例中,P (A) ,C(A)、ORD (A)和ROT(A)可以分别表示指令A的P比特、C比特、ORD和R0T。在一个实施例中,优化器/调度器可以被用来跟踪在一个或多个指令的执行过程中,例如,在调度过程中,可能发生的AHPTR变化。在一个实施例中,优化器/调度器可以,例如,通过软件来实现。例如,AHPTR_AT(A)可以为延迟的寄存器分配,在执行指令A时记录AHPTR。R(A)可以表示是否分配A的寄存器。在图2G的实施例中,在所有检查指令的指令都被调度之后(例如,基于检查约束),可以延迟对于指令的寄存器分配。在一个实施例中,可以释放一个或多个已分配的寄存器,例如,在相应的调度的指令之后(例如,只在下一调度的指令的开始时)。虽然图2G的实施例可以使用列表调度,但是,可以扩展一些实施例,以与诸如模调度之类的任何其他调度技术一起协作。
[0049]参考图2G,可以与指令调度集成的寄存器分配的实施例。在一个实施例中,实施例可以检查它是否用完寄存器(例如,ORD(A) >=REG)。参考图2G,ORD(A)可以涉及三个变量,可以表示寄存器计数的REG、AHPTR和AHPTR_AT (A)。AHPTR可以始终可用。变量“REG”可以被若干个指令包围,P(A)=I和!R(A),P(A)可以表示指令A可能需要新寄存器来设置保护,!R(A)可以表示指令A的寄存器还没有分配。例如,变量“REG”可以被其寄存器分配被延迟的若干个指令包围。在一个实施例中,AHPTR可以保持按调度的顺序增大。AHPTR_AT(A)可以为延迟的寄存器分配,在执行指令A时记录AHPTR。在一个实施例中,可以计数延迟的寄存器分配,以阻止寄存器溢出。
[0050]在一个实施例中,优化器/调度器可以在调度过程中跟踪诸如变量REG、AHPTR,AHPTR_AT之类的信息,以估计是否有一个或多个别名保护寄存器待被分配给调度的指令或它是否用完寄存器。在一个实施例中,响应于用完寄存器,可以防止任何新指令A的重新排序(即,P(A)=1)。在一个实施例中,可以按它们的原始执行顺序来调度剩余指令,以避免重新排序。
[0051]图2H示出了可以使用别名寄存器的处理存储器优化的实施例。如果第二存储器操作可能与它们之间的某些存储器操作有冲突,则优化可能是推测性的。例如,推测性的存储器优化可以使用别名寄存器保护和检查。可以在指令调度之前应用优化,可以在指令调度过程中执行别名寄存器分配:然而,在某些实施例中,指令优化可能不是必需的。响应于优化和在调度过程中,已优化的代码可以在逻辑上被视为将消除的指令合并到其他指令,而合并的指令/代码可以用于所有消除的指令上的别名检查。参考图2H,在store-load(存储-加载)消除282的实施例中,代码可以在逻辑上被视为将load_2合并到store_l。在1ad-1oad (加载-加载)消除284,代码可以在逻辑上被视为将load_2合并到load_l。在store-store-elimination (存储-存储-消除)286,代码可以在逻辑上被视为将store_l合并到store_2。在一个实施例中,合并的指令可以包含一个或多个逻辑指令/代码。
[0052]在对于合并的指令的调度过程中,可以考虑合并的指令中的逻辑指令上的约束。例如,在图21所不的代码中,可以从store_0到load_3应用store-load-elimination(存储-加载-消除)。在优化之后以及在调度中,当调度storej)时,可以考虑storej)和load_3上的约束。在图21中,示出了寄存器分配。参考图21,在优化中,Store_2可以检查Load_3, Store_0 可以检查 Load_l。响应于 Load_3 和 Store_0 被合并到 Store_0, Store_2可以检查Store_0, Store_0可以检查Load_l。Store_0和Load_l可能需要保护(P比特=1),并可以被分配寄存器O, I。Store_2和Store_0可以对照寄存器O检查(C比特=1)。Store_0可以在设置保护(P比特=1)之前检查寄存器0,如此,Store_0可以不检查其本身。
[0053]在某些实施例中,合并的指令可能在数据相关性中包含循环,这可能会导致检查/防检查约束中的循环。例如,检查/防检查约束中的循环可以被表示为:store」)(load_3)—c load_l —ac store_2—c store—O (load_3)n 在一个实施例中,如果
检查/防检查约束包含循环,则分配别名保护寄存器可能会导致假阴性和假阳性。
[0054]图2J示出了插入伪加载以中断约束循环的实施例。参考2J,在一个实施例中,合并的指令可以使用一个或多个别名保护寄存器来中断约束循环。在另一个实施例中,可以将可以与合并的指令访问同一个存储器但是相对于合并的指令可以使用不同的别名保护寄存器的伪存储器指令插入在合并的指令紧接的后面。在一个实施例中,硬件可以实现伪存储器指令,以只执行别名保护/检查,而没有实际存储器访问,以减少开销。
[0055]在一个实施例中,如果约束循环可能不频繁地发生,当约束循环即将发生时,可以插入伪存储器操作。例如,在调度过程中,可以跟踪有关合并的指令中的每一个逻辑指令的P/C比特的信息。在P/C比特位于合并的指令中的一个或多个逻辑指令的情况下,可以插入伪存储器指令以分区P/C比特。在某些实施例中,如果合并的指令中的一个或多个逻辑指令访问同一个存储器,则可以避免合并的指令中的一个或多个逻辑指令上的ρ/c比特设置。例如,在图2H所示的加载-加载消除情况下,响应于Load_2检查的指令可以始终由Load_l检查,Load_2上的C比特可以不设置。类似地,响应于检查Load_l的指令可以始终检查Load_2,Load_l上的P比特可以不设置。在一个实施例中,可以保留至多三个逻辑指令上的C/P比特,诸如带有C比特的最早的指令,带有P比特的最近的指令和带有P比特的最近的存储,不管有多少逻辑指令被合并到合并的指令中。图2J的实施例示出了使用伪存储器指令来中断循环的示例。
[0056]在某些实施例中,伪存储器指令可以中断循环,但是,可以不删除检查/防检查约束。响应于别名保护寄存器可能不足以用于调度,在循环的情况下,可以不执行伪存储器指令的调度。例如,在图2J所示的调度中,响应于在调度load_l之后没有别名保护寄存器,可以不调度store_0或store_2中的任何一个,如果对于任何一个调度需要至少多一个别名保护寄存器的话。图2J的实施例可以示出,如果store_0将被调度,则对于将要被store_2检查的du_y_load (伪_加载)可能需要新别名保护寄存器。如果store_2将被调度,则对于可能被store_0 (load_3)检查的store_2,可能需要新别名保护寄存器。在一个实施例中,store_2的调度可以基于store_2的新别名保护寄存器的可用性来执行。例如,响应于判断store_2的新别名保护寄存器可能不存在或可能不可用,可以不调度store_2。
[0057]在一个实施例中,可以预留若干个别名寄存器。例如,数量可以等于合并的指令中的消除的指令的数量。如果按它们的原始顺序(对于合并的指令,其第一逻辑指令的顺序)调度了所有剩余的指令,则只有重新排序的逻辑指令可以使用额外的别名寄存器。在预留了别名寄存器的情况下,可以在没有用完寄存器的情况下执行调度。
[0058]图2K描绘了可以扩展图2G中的寄存器分配以处理寄存器溢出和约束循环的算法的实施例。参考图2K,实施例可以为所有合并的指令预留寄存器计数。在一个实施例中,可以按照合并的指令中的消除的指令的数量来预留别名寄存器,以避免用完寄存器。在另一个实施例中,如果按它们的原始顺序(对于合并的指令,其第一逻辑指令的顺序)调度了所有剩余的指令,则只有重新排序的逻辑指令可能需要额外的别名寄存器。
[0059]图3示出了方法的实施例。图3的流程可以被用来对原始代码执行优化和调度。在一个实施例中,在图3的流程可以使用如图2A到2K所示的一个或多个实施例。在一个实施例中,可以使用图3的流程来实现可以优化和/或调度原始代码的优化器/调度器。在一个实施例中,优化器/调度器可以通过软件来实现;然而,在某些实施例中,优化器/调度器可以通过硬件、软件、固件和/或它们的任何组合来实现。在框302中,优化器/调度器可以计算指令Al和A2之间的诸如Al — A2之类的数据相关性。在框304中,优化器/调度器可以预留若干个别名寄存器,以阻止由于一个或多个合并的指令而导致的寄存器溢出。在一个实施例中,别名寄存器的数量可以等于合并的指令的数量;然而,在某些实施例中,别名寄存器的数量可以具有不同的值。在框306中,优化器/调度器可以选择一个指令,例如,第二指令A2,来调度,直到调度完原始代码中的所有指令。
[0060]在框308中,响应于判断所选第二指令A2的调度可能会导致别名寄存器溢出,优化器/调度器可以返回到框306,其中,优化器/调度器可以选择除第二指令A2以外的第三指令A3。响应于在框306中选择第三指令A3,优化器/调度器可以判断第三指令A3是否可以用完别名寄存器(框308)。如果是,则优化器/调度器可以继续选择不同的指令来调度,直到判断所选指令可能不会导致别名寄存器溢出。优化器/调度器可以响应于判断所选指令可能不会导致别名寄存器溢出,来调度所选指令(框308)。在框310中,优化器/调度器可以向约束图(例如,如图2K所示)添加涉及调度的指令(例如,A3)的约束,并设置相应的C/P比特。在一个实施例中,优化器/调度器可以向约束图或任何其他结构中添加对于调度的指令A3的检查约束和/或防检查约束。在框312中,优化器/调度器可以插入伪存储器操作或代码,以阻止约束图中的循环。在一个实施例中,优化器/调度器可以删除不需要的C/P比特,如果调度的指令A3是合并的指令的话。在另一个实施例中,如果调度的指令在多个逻辑指令上具有C/P比特,则优化器/调度器可以插入一个或多个伪存储器操作或指令以分区C/P比特。在另一个实施例中,如果调度的指令不需要别名寄存器,则流程可以返回到框306以选择和调度下一指令(框314)。在框316中,优化器/调度器可以通过旋转释放已分配的别名寄存器。例如,释放可以响应于已分配的别名寄存器已经被检查并且没有其他指令要对照已分配的寄存器检查来实现。在一个实施例中,可以在下一指令的执行开始时释放别名保护寄存器。在另一个实施例中,可以延迟当前指令所使用的别名保护寄存器的分配,直到在下一指令的执行开始时释放寄存器。在框316中,可以响应于旋转,来更新AHPTR。在框318中,如果约束图中的约束阻止对于调度的指令的别名寄存器分配,例如,如果有来自未被调度的后续指令的一个或多个约束,则优化器/调度器可以延迟对于当前调度的指令的寄存器分配。在一个实施例中,可以响应于后续指令正在被调度,分配当前调度的指令的别名寄存器。
[0061]例如,流程可以返回到框306,以选择并调度下一指令。在框320中,响应于判断对于当前调度的指令的寄存器分配可能不需要被延迟,优化器/调度器可以为调度的指令分配别名寄存器。在框322中,响应于为调度的指令分配新别名寄存器,优化器/调度器可以删除与调度的指令相关的约束,和/或可以递归地为其寄存器分配由于约束而被延迟的调度的指令分配别名寄存器。
[0062]在一个实施例中,图2A到2K和图3的各实施例可以用于对于基于旋转的别名保护寄存器的寄存器分配。在一个实施例中,各实施例可以被用来减少基于旋转的别名保护中所使用的寄存器的数量。例如,减少别名寄存器可以用于优化优点和性能。减少别名寄存器可以被用来实现别名硬件的减少,以节省管芯区和功耗。尽管图3的方法被示为包括过程的序列,但是,某些实施例中的方法可以以不同的顺序执行所示出的过程。尽管如图3和/或图2A到2K所示的各实施例可以通过优化器/调度器来实现,但是,在某些实施例中,优化和调度指令可以分别由优化器和调度器分开地实现,或在某些实施例中,诸如寄存器分配逻辑之类的一个或多个逻辑可以被用来实现图3和/或图2A到2K的各实施例。在另一个实施例中,优化和调度指令可以通过优化器或者调度器来实现。尽管如此处所提及的各实施例可以涉及存储和/或加载指令,但是,在某些实施例中,可以使用任何其他存储器指令。
[0063]尽管参考各实施例描述了本发明的某些特征,但是,描述不旨在以限制性方式来解释。对本发明涉及的所属【技术领域】的专业人员显而易见的对各实施例的各种修改,以及本发明的其他实施例被认为在本发明的精神和范围内。
【权利要求】
1.一种方法,包括: 对一组指令执行调度; 计算所述调度的指令组的数据相关性; 计算所述调度的指令组的检查约束;以及 基于所述数据相关性和所述检查约束,为所述调度的指令组分配别名寄存器。
2.如权利要求1所述的方法,还包括: 计算所述调度的指令组的防检查约束;以及 进一步基于所述防检查约束,为所述调度的指令组分配别名寄存器。
3.如权利要求1所述的方法,还包括: 响应于所述别名寄存器已经被检查,通过旋转,释放为所述指令组中的第一调度的指令而分配的别名寄存器;以及 将所述释放的别名寄存器分配到第二调度的指令。
4.如权利要求1所述的方法,还包括: 响应于判断要被调度的第一指令是导致别名寄存器溢出,选择所述指令组中的第二指令来执行所述调度。
5.如权利要求1所述的方法,还包括: 合并所述指令组中的至少两个指令来提供合并的指令;以及 在所述指令组中插入伪指令以中断所述检查约束中的一个或多个循环。
6.如权利要求1所述的方法,还包括: 将伪指令插入到所述指令组中的合并的指令之后,其中,所述伪指令是与所述合并的指令访问同一个存储器,并是与所述合并的指令使用不同的别名寄存器。
7.一种系统,包括: 处理器;以及 优化器,用于优化要被所述处理器执行的一组原始代码,将所述优化的代码调度到调度的代码中,以及基于所述调度的代码的数据相关性和约束中的至少一个,将新别名寄存器分配到所述调度的代码。
8.如权利要求7所述的系统,其中,所述优化器进一步计算所述调度的代码的所述数据相关性和所述约束。
9.如权利要求7所述的系统,其中,所述优化器进一步响应于判断所述分配的别名寄存器将不被所述调度的代码检查,旋转分配的别名寄存器,以释放所述新别名寄存器的所述分配的别名寄存器。
10.如权利要求7所述的系统,其中,所述优化器进一步优化所述原始代码以提供合并的代码,并且响应于所述合并的代码在所述合并的代码中的多个逻辑代码上包括C/P比特,插入伪代码以分区所述C/P比特,具有C/P比特。
11.如权利要求7所述的系统,其中,所述优化器进一步优化所述原始代码以提供合并的代码,并将伪代码插入到所述合并的代码之后,以中断所述约束中的一个或多个循环,其中,所述伪代码与所述合并的代码访问同一个存储器,并与所述合并的代码使用不同的别名寄存器。
12.如权利要求7所述的系统,其中,所述优化器进一步响应于检测到所述约束中的一个或多个循环,延迟对于所述调度的代码的所述寄存器分配,阻止对于所述调度的代码的所述别名寄存器分配。
13.如权利要求12所述的系统,其中,所述优化器进一步将伪代码插入到所述寄存器分配延迟的代码之后,以中断所述约束中的所述循环,其中,所述伪代码与所述寄存器分配延迟的代码访问同一个存储器,并与所述寄存器分配延迟的代码使用不同的别名寄存器。
14.如权利要求12所述的系统,其中,所述约束包括检查约束或防检查约束。
15.如权利要求7所述的系统,其中,所述优化器进一步响应于所述新别名寄存器正在被分配,删除所述调度的代码的所述约束。
16.包含当由处理系统执行时导致计算系统执行以下操作的指令的机器可读取的介质: 调度一组指令; 计算所述调度的指令组的约束; 基于所述约束,为调度的指令中的一个分配新别名寄存器。
17.如权利要求16所述的机器可读取的介质,其中,还包括响应于被执行导致所述计算系统执行以下操作的多个指令: 释放未使用的已分配的别名寄存器并为所述新别名寄存器分配所述释放的寄存器。
18.如权利要求16所述的 机器可读取的介质,其中,还包括响应于被执行导致计算设备执行以下操作的多个指令: 在所述调度的指令组中插入伪调度指令以中断所述约束中的循环。
【文档编号】G06F9/06GK103502945SQ201180070544
【公开日】2014年1月8日 申请日期:2011年11月29日 优先权日:2011年4月7日
【发明者】王诚, 吴友峰 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1