CN101169710A - 对状态寄存器进行重命名的方法和使用该方法的处理器 - Google Patents
对状态寄存器进行重命名的方法和使用该方法的处理器 Download PDFInfo
- Publication number
- CN101169710A CN101169710A CNA2006101503380A CN200610150338A CN101169710A CN 101169710 A CN101169710 A CN 101169710A CN A2006101503380 A CNA2006101503380 A CN A2006101503380A CN 200610150338 A CN200610150338 A CN 200610150338A CN 101169710 A CN101169710 A CN 101169710A
- Authority
- CN
- China
- Prior art keywords
- register
- microcode
- status
- status register
- instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Abstract
根据本发明,提出了一种在具有超标量流水线结构的处理器中对状态寄存器进行重命名的方法,其中所述状态寄存器是由从标志寄存器的所有标志位中选择的多个标志位组成的寄存器,所述方法包括以下步骤:在对指令译码后的微码到达所述处理器的寄存器重命名模块时,确定所述微码是否要读状态寄存器;如果确定所述微码要读状态寄存器,则为所述状态寄存器分配最近映射到的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器;确定所述微码是否要写状态寄存器;如果确定所述微码要写状态寄存器,则为所述状态寄存器分配新的状态为空的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器。
Description
技术领域
本发明涉及微处理器体系结构,具体来说,涉及到一种在具有超标量流水线结构的处理器中对状态寄存器进行重命名的方法和使用该方法的处理器,能够通过对寄存器进行重命名的方式消除指令执行中出现的数据假相关,以提高流水线结构处理器的执行效率,且能够很方便地实现标志寄存器的重命名机制,以减少因读写标志位带来的流水线停顿。
背景技术
在现代微处理器设计中,指令的吞吐率,即每秒所能执行的指令数是很重要的一个指标,而单位时间指令数的方法有多种途径,最直接的技术就是增加处理器运行的频率,然而,频率的增加会导致到处理器功耗以及发热量的迅速上升,并因此已经受到严重的制约。
因而,现代处理器更多的是关注于通过增加单个时钟周期内执行的指令数来提高指令吞吐率,即通过流水线以及超标量的结果来实现。流水线技术把一条指令的执行划分成若干个阶段,每一阶段在流水线中的一级进行处理,且需要占用一个时钟周期,这样同一时刻可以有多条指令位于流水线的不同阶段执行,从而提高处理器执行效率。而在超标量技术中,一个时钟周期将发射不止一条的指令(如同时发射两条或四条指令),这样也能提高处理器的效率。
在现代的处理器中大量的是同时使用了流水线和超标量这两种技术以获得更高的性能,然而,在实际中,指令和指令之间可能存在着某种数据的依赖关系,比如一条指令执行所需要读取的源操作数可能就是上一条指令要写的那个值,如它们对应的是同一个寄存器,这样,第二条指令就必须等到前面指令执行完并写回结果到寄存器后才能继续执行。因而,需要有一种方法来有效的检测出这些相关性并很好的进行处理,通常,可以采取寄存器重命名的方式来解决这种问题。
所谓的寄存器重命名就是将逻辑寄存器映射到物理寄存器,处理器的指令集一般包括数量有限的可用逻辑寄存器(如x86结构处理器中包括8个定点通用寄存器),且数目小于处理器中实际可用的物理寄存器数目。处理器通过对逻辑寄存器的重命名可以有效消除WAR(读后写)以及WAW(写后写)这样的假相关,以允许利用同一个逻辑寄存器的独立指令能同时发出,来防止相关性造成的延迟。
除了主要用于存储算术运算结果的通用寄存器之外,兼容x86架构的处理器还包括一个称之为Eflags的标志寄存器,其中存储着有关cpu的一些信息,包括一些状态标志、系统标志以及控制标志位。某些指令执行之后会修改其中的部分位,而另一些指令的执行也可能需要读取其中的某个或某些标志位,这样实际上标志寄存器也会导致不同的指令之间出现隐含的依赖关系,事实上,在x86指令集中,算术、逻辑运算指令等都是经常修改标志位的,而程序中往往大量存在的是这样的指令,因而十分有必要对标志位进行适当的重命名以降低其所引起的延迟。
发明内容
为了克服上述缺陷提出了本发明,本发明的目的是提出一种在具有超标量流水线结构的处理器中对状态寄存器进行重命名的方法和使用该方法的处理器,能够通过对寄存器进行重命名的方式消除指令执行中出现的数据假相关,以提高流水线结构处理器的执行效率,且能够很方便地实现标志寄存器的重命名机制,以减少标志位带来的流水线停顿。
为了实现上述目的,根据本发明,提出了一种在具有超标量流水线结构的处理器中对状态寄存器进行重命名的方法,其中所述状态寄存器是由从标志寄存器的所有标志位中选择的多个标志位组成的寄存器,所述方法包括以下步骤:在对指令译码后的微码到达所述处理器的寄存器重命名模块时,确定所述微码是否要读状态寄存器;如果确定所述微码要读状态寄存器,则为所述状态寄存器分配最近映射到的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器;确定所述微码是否要写状态寄存器;如果确定所述微码要写状态寄存器,则为所述状态寄存器分配新的状态为空的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器。
优选地,所述多个标志位为会频繁受到指令修改的多个状态标志位。
优选地,所述多个状态标志位包括进位标志位、奇偶标志位、调整标志位、零标志位、符号标志位、以及溢出标志位。
优选地,所述最近映射到的物理寄存器根据用于维护所述状态寄存器和物理寄存器的动态映射关系的重命名表来确定。
优选地,所述重命名表包括表示状态的域和表示改写物理寄存器的指令所在的基本块的域。
优选地,所述重命名表还包括有效域,用于确定最近映射到的物理寄存器。
优选地,所述多个状态标志位中的一部分状态位会受到屏蔽以防止对这一部分状态位的修改。
优选地,所述最近映射到的物理寄存器根据状态指针寄存器的值来确定。
优选地,在对状态寄存器进行重命名操作之后,所述微码进入发射队列并在所分配的物理寄存器准备就绪之后能够参与调度并被发射出去。
根据本发明,还提出了一种包括实现了上述的方法的寄存器重命名模块的、具有超标量流水线结构的处理器。
本发明所涉及的微处理器是采用流水线、多发射的体系结构,为了减少多指令并发执行中由于读写标志位导致的隐含依赖关系,提出了一种方法和装置,包括检测当前指令是否需要读取标志寄存器中的状态位,以及需要读取哪些位,还检测当前指令是否需要改写状态标志位以及改写的是哪些位,利用寄存器重命名表为需要读取和改写状态标志位的操作快速高效地分配相应的物理重命名寄存器,以减少读写状态位造成的依赖关系所带来的流水线停顿,针对标志寄存器的特点,本发明对部分最常读取和修改的6个状态标志位单独提取出来作为一个逻辑寄存器进行重命名,既实现简单又很好的减少了大部分由标志位引入的相关。本发明详细给出了对这部分标志位的重命名方案,能在不增加过多硬件代价的前提下很好的降低由于读写标志位所引起的流水线阻塞。
附图说明
通过参考以下结合附图对所采用的优选实施例的详细描述,本发明的上述目的、优点和特征将变得显而易见,其中:
图1给出了一个超标量、流水线处理器的内部结构框图;
图2给出了本发明的一个具体实施例所用的更详细的微处理器结构框图;
图3是本发明所描述的标志寄存器的一个示例;
图4是一个状态寄存器的实例图;
图5所示的是寄存器重命名模块中状态寄存器重命名表的结构图;
图6A表示的是从译码模块出来后微码所携带的部分标记信息;
图6B表示的是微码经过寄存器重命名之后所携带的部分标记信息;
图7给出了译码模块生成微码相关信息的流程图;以及
图8给出了本发明的一个实施例中,重命名模块进行物理寄存器分配的一个流程图。
具体实施方式
这里所描述的涉及对标志寄存器进行重命名的装置和方法。以用于解决因隐含的读写标志寄存器所引起的流水线停顿问题,在下面的描述中,给出了一些相关的具体细节,以提供对本发明更好的理解。
图1给出了一个实现该重命名机制的处理器的部分结构图,如图所示,结构中主要包括以下一些模块:
取指模块100,根据给出的pc值取出下一条要执行的指令,送到流水线中执行;
译码模块101,对取指模块送入的宏指令进行译码生成一条或多条处理器内部表示的微码格式,该宏指令是对应处理器兼容的指令集格式的,如x86架构处理器对应的CICS格式指令,或者诸如PowerPC、Alpha等RISC架构的指令格式,而内部微码格式则一般都是类RISC的格式的;
寄存器重命名模块102,该模块含有寄存器重命名表,在具体的实现中,可对应于不同类型的寄存器分别维护一张重命名表,如对定点寄存器、浮点寄存器以及本发明中重点讨论到的状态寄存器各维护一份重命名表,记录着各类逻辑寄存器到物理寄存器的动态映射关系。
发射队列模块103,该模块负责从进入到发射队列的微操作中选出当前可以发射的若干个,并送到功能部件去执行。
图2给出了一个更为详细的实现图,该发射队列共包含定点和浮点2个发射队列,从功能部件205可以看出,总共含有5个独立的功能部件,其中FALU1和FALU2为浮点运算部件,执行浮点运算操作,ALU1和ALU2为定点运算部件,执行定点运算操作,MEM为访存部件,执行访存地址的运算。这里面,定点操作以及访存操作进入到定点发射队列进行调度,浮点相关操作则进入到浮点发射队列进行调度。发射队列模块要做的是为每个可用的功能部件,从两个发射队列中选出已经准备好的操作发射到相应功能部件中去执行,注意,一次只能向一个功能部件发射一条指令。比如这里有两个浮点运算部件,那么每次可以分别为FALU1和FALU2各选出一条准备好的指令发射出去执行。那么,如何判断一个操作是否准备好呢?看的是它的所有源寄存器中的数据是否已经准备好,即所需要读取的操作数已经写回寄存器堆了。当然,如果对应某个功能部件,发射队列中有多条准备好的指令,那么则要从中选择一条等待时间最长的发射出去。对于已经发射出去的操作,其相应表项在发射队列中将被删除,以便让新的微码进来。
寄存器堆模块也包含三个部分:定点寄存器堆、浮点寄存器堆以及状态寄存器堆,他们主要是用来提供所需的源操作数值,微码从发射队列发射出去之后,需要从寄存器堆读取相应源操作数的值,然后进入各自功能部件执行。
功能部件205共包括五个独立的运算部件,分别用来完成定点、浮点和访存操作的运算,在本发明所阐述的实现中,该定点运算部件ALU1和ALU2可以设计成完全相同的实现,也可以有所不同,如将一些较快完成的操作放在ALU1中执行,而一些需要比较多个时钟周期的操作放到ALU2中去执行,同时还有某些操作既可以在ALU1中又可以在ALU2中完成。同样,浮点运算部件FALU1和FALU2也可以设计成完全一样,或者完成的操作有所不同。访存部件MEM用来完成访存操作地址的计算,对于像x86这样的复杂指令集来讲,寻址方式可能有很多种而且会有相当复杂的,访存部件MEM可以完成其有效地址或者完整线性地址的计算,图中访存部件只画出一个,当然如果实现需要,也可以包含两个甚至更多个独立的访存地址运算部件。
指令在该结构中的流程为:取指模块根据给出的pc地址取出对应的指令,该宏指令经过译码模块101之后被翻译成类RISC的处理器内部微操作(uop),操作均只在寄存器之间进行,需要访存的运算需要先用一条访存指令将操作数从内存导入到寄存器再进行运算。从译码模块出来的uop进入到寄存器重命名模块102,该模块用来将uop中的逻辑寄存器映射到实际的物理寄存器号,并消除WAR,WAW这样的假相关现象,然后经过重命名后的uop进入到发射队列103等待调度,如果其所有的操作数均已准备好且被选中,并且功能部件105不忙的话,则将其发射到对应的功能部件进行执行,执行完后,结果从结果总线110写回到寄存器堆104以更新结果寄存器的值,同时,还需要将写回的寄存器号等信息送到ROB模块106中,当uop从ROB中提交的时候还需要用这些信息来更新寄存器重命名表中的相应表项状态。这一过程在后面的描述中会做更进一步的详细说明。
图3给出了一个标志寄存器Eflags的结构图,Eflags共有32位,其中bit 1,3,5,15,以及22到31都是保留位,未使用,其余的位包含一组状态标志、一组控制标志以及一组系统标志。当执行8086代码时只用到低的16比特,而在执行保护模式代码时,会用到整个的32位。
Eflags寄存器中6比特的状态标志位是本发明关注的重点,也是本发明进行重命名的对象,在这里也给出一些简要的说明,这6个状态标志位包括有:
CF:进位标志,在算术运算时如果结果的最高有效位产生进位或者借位,则将该位置位,否则清零。该标志指示着无符号整数算术运算溢出的条件。
PF:奇偶标志,当运算结果最低字节中“1”的个数为偶数时该标志位置位,否则清零。
AF:调整标志,也称辅助进位标志,在用BCD码进行算术运算时,如果运算结果的第3位产生进位或者借位,则将该标志位置位,否则清零。
ZF:零标志,运算结果为0时置位该标志,否则清零。
SF:符号标志,该标志为等于带符号整数运算结果的最高有效位,为0表示整数,1表示负数。
OF:溢出标志,如果整形数结果大于目标操作数所能表示的最大整数,或者小于目标操作数所能表示的最小负数,则将该标志置位,否则清零。该标志位指示着带符号整形数的算术运算的溢出条件。
另外的几个标志位中,控制标志位为DF,系统标志位有TF、IF、IOPL、NT、RF、VM、AC、VIF、VIP、ID。关于它们的具体含义可以参见处理器厂商发布的相关编程手册,这里不做详细解释。
为了消除上面标志位导致的指令依赖关系,有必要对标志位进行重命名,方法之一是对单个位进行重命名,即分别将CF、PF、AF、ZF、SF、OF、DF等看成是单个的寄存器然后分别进行重命名,但是经常出现某条指令需要修改或读取的是多于一位的标志位,如大部分算术指令需要改写全部的6位状态位,而有些条件跳转指令也需要读取多达3位的标志位,这样分别重命名的话会导致控制逻辑十分复杂,而且对应每个标志位都需要1个检测逻辑来检测当前微码中的标志位与前面的各个微码是否存在依赖情况,这种实现将大大影响整个处理器系统执行的性能。
另一种处理方法是对整个32位的Eflags进行整体重命名,即只要指令修改某一位或几位标志位,就看成是修改整个标志寄存器,后续的需要读取某一位或几位标志位的指令必须等到前面这条写标志位的指令写回之后才能继续执行,然而,如果前面的指令修改的CF,而后续指令要读取的是DF,则很明显他们本来其实是不存在相关的,但是在整体重命名后出现了相关性,导致后续指令被延迟执行,直到前面的指令已经将标志位写回之后,后续需要读DF的指令才能取出相应的标志位继续执行。由此可见这种方法虽然控制十分简单,但实现效率并不高,并会因此而引出大量的新的相关。
通过分析指令的执行特性,可以发现,在所有的这些标志位中,6个状态标志位是最频繁被指令修改的(如算术运算指令ADD,SUB,逻辑运算指令AND,OR,XOR等),而且指令的执行修改的一般也都是这几个状态标志位,极少改写到控制和系统标志位,并且指令对状态位的修改一般都是全部改写6个状态位,这就使得可以考虑只对这6个状态位进行整体的重命名。另外指令读取状态标志位的次数也同样比读取其它标志位的情况更多(如Jcc,SETcc,CMOVcc等指令),因而在本发明的实施例中,将Eflags寄存器划分成两个部分:6个状态标志位,以及其余的控制和系统标志位。第二部分的控制标志位和系统标志位较少被指令改写和读取到,对流水线延迟的影响不如6个状态标志位,所以本发明将其拆开处理,且只对第一部分进行重命名,而不是对整个的32bit的Eflags寄存器整体重命名。这样既能使得控制逻辑比较简单,又能很大限度的处理到指令执行中遇到的大多数由标志位引起的相关情况。
由于因标志位引起的相关与读写通用寄存器导致的相关十分类似,因此在硬件结构上均采用相似的方法来处理。在寄存器堆模块中,本发明的实现添加了实现6比特状态寄存器的硬件结构,这里将6比特标志位组成的状态寄存器称为AFG,把宏指令中隐含的对状态标志位的读写转化为显示的对AFG的读写。需要说明的是,在本文中如无特殊说明,所有提到的“状态寄存器”均指的是6bit的状态位组成的状态寄存器AFG,而用“标志寄存器”来统称通常所说的32bit的完整Eflags寄存器。
图4给出了一个状态寄存器的描述图,该寄存器包含了6个状态位的信息,任何对状态位的读写都将被看成是对该状态寄存器的读写操作。
图5所示的是寄存器重命名模块中状态寄存器的重命名表结构的一个具体实施例,整个表共有若干项,每个物理状态寄存器在表中对应一项,比如当处理器中有16个标志位物理寄存器时,该表就有16个表项,表中需要包含到以下两个域:表示状态的域301和表示改写该物理状态寄存器的指令所在基本块的域302。而状态位可以根据处理器的具体实现情况划分为若干个状态,比如在一个实施例中,可以选用2bit的状态位包含以下3个状态:
EMPTY:表示这个物理寄存器空闲。
MAPPED:表示该物理寄存器已经被分配出去,但结果尚未写回。
WRITEBACK:结果已经写回,但写该结果的指令尚未从重排序缓冲器ROB(reorder buffer)中提交,该状态还可以被取消。
COMMIT:提交状态,表示写该物理寄存器的指令已经从ROB中提交,且已改写真正的结构寄存器(architecture register)。
这样的实现中状态位只需要2比特表示,当然,也可以实现成其它的状态表示方式,对应的状态位的位数也可能相应不同。
基本块号302指明了改写该寄存器的指令所在的基本块号,用于在分支猜错的时候判断是否需要取消该物理寄存器的重命名状态。对于现代的超标量流水线结构的处理器,大量应用到乱序执行以及分支猜测技术,对于分支指令,如果其分支目标的判断依赖于前一条指令生成的结果数据,由于结果往往要到比较靠后的流水级里才能生成,所以导致后续指令需要等待若干个时钟周期,直到前面分支所依赖的数据已经确定之后才能知道下一条要取的指令的地址,这时再从目标地址中取出正确的指令,这将导致流水线中出现停顿,为了降低这种停顿开销,现有处理器均对分支指令的目标地址进行预测,取指部件从预测的目标地址去取得新的指令继续执行而不等待前面结果的写回,如果分支预测是正确的,则很明显,处理器可以顺着当前的路径继续执行,不需要额外的开销,从而节省了停顿等待的时间,当然,如果预测错误,则需要从分支指令处将后续的所有指令取消掉,因为它们本来是不应该被执行的,同时错误分支的后续指令所改写的其它机器状态都应予以恢复。在寄存器重命名表中,也需要配套的机制来实现这一目的,当分支猜错时,需要将重命名表的状态也恢复到与分支时的一致,通过检测重命名表中各项对应的基本块号是否位于分支猜错指令所在基本块号之后,该基本块号可用来决定是否需要恢复重命名表的状态。
图5中虚框的有效域valid是不一定需要这样实现的,本发明在下面将会具体介绍,而对于定点寄存器和浮点寄存器的重命名表的构造,由于一般定点和浮点的逻辑寄存器都含有多个,而不像这里的状态寄存器就只仅仅是一个,如x86系列中定点逻辑寄存器包含EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP,而浮点逻辑寄存器也有8个,分别被表示为STO/ST1/ST2/ST3/ST4/ST5/ST6/ST7,因而对于定点、浮点寄存器的重命名表所需要的信息将会比状态寄存器更多,需要在同一张表中分别保存着对应多个不同的逻辑寄存器到物理寄存器的映射关系,但总得来说,定点和浮点寄存器重命名表的构造和状态寄存器是类似的,他们不是本发明讨论的重点,所以本发明中暂不做详细说明。
图6 A说明了当指令经过译码模块生成微码后能够确定的一些信息,译码模块需要确定指令是否需要读取状态标志位以及是否需要改写状态标志位,判断之后生成相应的信息往后传递,这样每条微码除了操作码(opcode)等信息外还会包括是否需要读标志位,以及是否需要写标志位的信息,比如,本发明中分别用读状态寄存器标记和写状态寄存器标记来表示。读状态寄存器标记指明了该微码是否需要读取状态状态寄存器AFG,写状态寄存器标记表明该微码是否需要改写AFG,读状态寄存器标记和写状态寄存器标记均为1的话则表明这条微码的执行既需要读取AFG,又会改写AFG。正如本发明中前面已讲到的,对与状态位的读写都是以整个的状态寄存器为单位来统一进行的,也就是说,如果译码模块根据微码判断出该微码需要读取6比特状态位中的某位或多位,则表示其需要读取状态寄存器AFG,并将读状态寄存器标记置1,如果该微码会改写6比特状态位中的某位或多位时,则表示其需要修改状态寄存器AFG,并将写状态寄存器标记置1。另外,对于某些微码,可能有时候需要改写AFG,但是有些时候可能保留某些状态位不修改,当存在这种情况时,可以给微码附带上一个掩码标记,这个掩码指示出这次微码操作之后是否需要对修改标志位的操作进行屏蔽,对于6位的AFG这样的情况,这个掩码可以用6位来表示,每位表示对应的一个状态位,置位表示不屏蔽对该位的修改,清零时表示被屏蔽对该位的修改,因而保留其原始值不变,功能部件105在执行该微码操作时将根据该掩码标记信息是否置上来生成相应的标志位结果写回到状态寄存器中。
微码带着这些信息后进入寄存器重命名模块102(参见图1)。
这里有一个地方需要注意的是,由于本发明中实现对6比特的状态标志位寄存器AFG整体重命名,这样6个状态位实现为一个单独的寄存器,因此对AFG的读写都是按6比特为单位的,而不只对部分位读或写。本发明中前面提到,指令对状态位的修改一般都是6比特全部改写,但这并不是绝对的,仍然还是存在只对部分位进行修改的指令,例如分析指令可以看出,诸如指令RCL/RCR这样的只修改OF和CF位,而并不修改PF,AF,ZF,SF这其余的四个状态位,对于这种情况,本发明给出的解决方法是:当某条微码语义本身只需要改写某一位或几位状态位,而不是整个的6位状态位时,就需要将AFG的原始值读入,然后在功能部件中将不会改变的状态位和新生成的状态位进行拼接形成新的6比特状态位写回AFG。因而当译码器译出的某条微码不是修改全部的6个状态位时,除了要将写状态寄存器标记置1外,还会将读状态寄存器标记置1。
图7给出了一个实现上述做法的流程图,具体为如果微码操作本身需要读取状态位信息,则读状态寄存器的标记一定被置上,如果微码本身不需要读取状态位,但是要改写的状态位不是整个6位,而只是其中的一部分,则同样需要置上读状态寄存器的标记,以将不需要修改的状态位的原始值读入,再和新产生的其他状态位值进行拼接后写回,如果这两种情况都不成立,则不需要读状态寄存器。对于写状态寄存器,则要简单一些,只要微码操作本身需要改写状态位的话,则写状态寄存器的标记就需要被置上。
上述做法实现起来比较简单,并且由于改写部分位的指令毕竟只是少数几个,大量的指令或者不改写状态位,或者改写的是整个6比特,因而这样的实现并不会引入过多额外的相关。另外,这种实现实际上还能够大大减少不必要的流水线停顿,先看如下一个例子。假设某条微码uop-x仅需要改写ZF标志位,在微码uop1之后有某条微码uop-y需要读取全部6个标志位的值,现考虑当uop-x已经在功能部件执行完毕之后但由于还没有到ROB的队列头而还不能提交时的处理情况。在现有公开资料的一种实现方法中,需要检测后续微码读取的标志位是否是前面最近一条写标志位微码所写的位的子集,如果是则后续微码所需要的标志位可从前面微码通过旁路的方式得到,而不需要等到前面的微码提交之后,否则像该示例中给出的情况,微码uop-y所需读取的标志位是前面微码uop-x所写标志位的超集,则微码uop-x需要停止执行,直到前面微码提交之后已更新结构寄存器(architecture register),再从结构寄存器中读出所需要的值继续执行。而采用本发明给出的实现方法时,由于uop-x在功能部件中执行完毕后已经生成了完整的6比特AFG值并会马上写到寄存器堆中,那么后续的uop-y此时就已经无需等待,可以从发射队列中送出,然后到寄存器堆中读出6比特标志位值继续执行,而不用等到微码uop-x提交之后。
微码经过寄存器重命名之后,对于要读取状态标志位的情况,将被分配到一个要被读取的物理状态寄存器,当要写入状态标志位时,也将被分配到一个被写入的物理状态寄存器。
图6B显示了微码经过寄存器重命名模块之后被确定的一些标记。包括被分配的要读取的源状态寄存器号,微码等待标记以及要改写的目的状态寄存器号等,等待标记表明当前源操作数是否准备好了,如果准备好了则等待标记清0,否则置1。除此之外,微码中还包含其它实现微码操作所需的各种信息,这里就不再详细给出。
图8给出了一个实现状态寄存器重命名机制的流程图。
在微码到达寄存器重命名模块102(图1)时,对于读状态寄存器标记为1的微码,它需要读取AFG,就为其分配一个最近被改写的物理寄存器(802),但是要如何才能得到最近映射到的物理寄存器是哪一个呢?
方法之一是可以在图3中的重命名表中增加一项valid域,如图中虚框中项所示,该域表明逻辑状态寄存器AFG最近映射到的是哪一个物理寄存器,即表明在微码进入到重命名模块时,它所读的应该是哪一个物理寄存器内的值。因为对应x86架构中只有一个程序员可见的逻辑状态寄存器,所以在该重命名表中,只可能有一项的valid是为1的,表明逻辑状态寄存器AFG所最近映射的物理寄存器。
另一种实现方法中,也可以不用在每个表项中都增加一个域,而是单独使用一个寄存器指针来保存需要读取的寄存器是哪一个,本发明中称为状态指针寄存器,该指针寄存器能实现和valid位相同的作用,即相对于到达寄存器重命名模块的当前微码来说,逻辑状态寄存器映射到的是哪个物理寄存器。这个寄存器的大小可以根据具体的物理寄存器数目来定,它需要能表示出最近被改写的是哪个物理状态寄存器。采用这样的实现方法就不需要在重命名表中逐项查找其valid域是否为1来判断了。该寄存器在开机或重启时需要适当初始化以使其能正常工作。
当找到最近映射的物理寄存器后,记下其寄存器号到微码中相应的域,并查看其状态,如果当前状态表明数据已经写回,并且可用,即所需读取的状态寄存器是准备好的,否则,表明产生该数据的指令尚未写回,数据还未准备好,这时需要等到前面指令产生的相应标志位数据写回后,才能被发射队列调度发射。
为需要读取状态位的微码分配好了物理寄存器后,到达804,在这里需要判断当前读取的物理寄存器是否已经准备好了,如果准备好,则等待标记置0,否则置1(805/806)。置上该等待标记表明在发射队列还不能马上对其进行调度并发射出去,需要等待源操作数就绪之后才有可能发射。
对于读状态寄存器标记为0的微码,由于它不需要读取任何的状态位,应该将表示源状态寄存器号的标记置为不需要读取AFG的状态,并直接设置微码源状态寄存器状态为准备就绪,将等待标记清零,以避免出现错误的流水线阻塞(803)。
当微码的写状态寄存器标记置为1时,表明它执行后需要改写AFG,这时就需要在重命名模块为其重新分配一个新的状态为空的物理寄存器,并相应修改该表项的状态,表明已经被分配出去了,然后将要改写的目标状态寄存器号置为刚分配的物理寄存器号,以消除WAR,WAW这样的假相关,这和熟知的通用寄存器的重命名做法是相似的,在此就不再多做解释了。
当微码不需要改写状态位时,就相应地将目标状态寄存器号置为空(808),表示不修改任何的状态寄存器。
微码根据是否需要读写状态位的情况,设置好相应标记之后就进入发射队列中去等待调度执行了。
当微码从寄存器重命名模块出来进入相应的发射队列103之后,将携带一些新的信息,比如微码需要读取的状态寄存器号,需要写的状态寄存器号,以及当前要读的状态寄存器是否已经准备好,即寄存器中的数据是否可用。如果要读取的状态寄存器尚未准备就绪,则微码需要在发射队列中等待,直到前面的微码将对应的标志位写回到状态寄存器后才能发射出去,正如前面所讲到的,微码所需读取的寄存器都准备好只是发射的必要条件之一,除此之外,微码能否发射出去,还有其它相关因素,如还需看功能部件是否空闲,并且如果当前对应某个功能部件有多条准备就绪的微码时,仍需根据指定的规则从中进行选择。微码发射到功能部件中执行后的结果送到结果总线110上,结果总线上的内容有多个模块需要用到,比如ROB、状态寄存器堆、寄存器重命名模块以及发射队列模块等。这些模块接收结果总线上的数据后进行相应的处理:
1ROB:通常,微码在功能部件中的执行是乱序的,为了保持精确中断,就需要让微码顺序的提交,ROB就是实现这一功能的,因为进入ROB的微码都是保持原始顺序的,可以从对头开始逐个检测能够提交的微码以保证提交的有序性。为了判断指令可否提交,ROB需要从结果总线110得到指令是否已经执行完毕的信息。
2状态寄存器堆:寄存器堆接受结果总线上的相关写回数据信息来更新相应物理寄存器的值,以保证从发射队列发出的微码能从寄存器堆中读到正确的值。
3寄存器重命名模块:寄存器重命名模块接收该信息用于更新相应物理寄存器项的状态,如前面所述,当微码需要改写状态寄存器时,就在该模块为其分配了一个新的物理寄存器号,并修改了相应重命名表的项的状态,如果该微码已经在功能部件中执行完,并送到结果总线上了,则要更新重命名表中写回的状态寄存器号所对应的项的状态,以指示数据正被写回寄存器,接下来可以被后续微码使用了。
4发射队列模块:由于进入发射队列103的微码可能需要读取的状态寄存器还没有准备好,此时等待标记被置上了,它将在发射队列中进行等待,所以也可以让其侦听结果总线,如果发现结果总线上出现了状态寄存器号与某条微码要读的源寄存器号相同的写回结果时,则表明数据在下一个时钟周期是可用的了,此时,发射队列中的该微码操作数可以看成是准备好了,发射队列可以考虑调度该微码到功能部件中去执行了。
如上所述,功能模块的计算结果需要通过结果总线110发送到以上的各个模块,参见图1中所示。
最后,当微码在功能部件中执行完,并可以从ROB中提交时,还需要更新寄存器重命名模块102中的重命名表(参见图5),具体做法是,ROB将提交的微码所改写的物理状态寄存器号等信息从提交总线111送给寄存器重命名模块102,寄存器重命名模块102接收到该信息后需要对寄存器重命名表中相应表项进行更新,主要是对于提交微码所改写的物理寄存器号对应的状态由WRITEBACK改为COMMIT,同时,以前所提交的对应同一逻辑寄存器的物理寄存器状态重新置为空,以允许其被重新分配出去。
根据本发明,指令在执行过程中,除了需要读取和修改通用寄存器之外,也往往暗含要读取或着修改标志寄存器中的某些标志位,如典型的X86指令集就包含这种情况。和通用寄存器导致的数据依赖类似,读写标记寄存器也可能导致指令之间出现隐含的依赖关系,为了降低标志寄存器引起的指令依赖关系,也有必要对标志寄存器进行重命名,本发明给出了一种对标志寄存器中使用频率较高的部分单独拿出来进行整体重命名的方法,这样实现起来比整个标志寄存器整体重命名要更为灵活,减少了不必要的相关,同时又比对每个位进行单独重命名的硬件代价要小,且保证了较好的性能,因而,该方法是方便而又合理的,基于该方法,可以很方便地实现标志寄存器的重命名机制,以减少因读写标志位带来的流水线停顿。
尽管以上已经结合本发明的优选实施例示出了本发明,但是本领域的技术人员将会理解,在不脱离本发明的精神和范围的情况下,可以对本发明进行各种修改、替换和改变。因此,本发明不应由上述实施例来限定,而应由所附权利要求及其等价物来限定。
Claims (10)
1.一种在具有超标量流水线结构的处理器中对状态寄存器进行重命名的方法,其中所述状态寄存器是由从标志寄存器的所有标志位中选择的多个标志位组成的寄存器,所述方法包括以下步骤:
在对指令译码后的微码到达所述处理器的寄存器重命名模块时,确定所述微码是否要读状态寄存器;
如果确定所述微码要读状态寄存器,则为所述状态寄存器分配最近映射到的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器;
确定所述微码是否要写状态寄存器;
如果确定所述微码要写状态寄存器,则为所述状态寄存器分配新的状态为空的物理寄存器;否则,则不为所述状态寄存器分配物理寄存器。
2.根据权利要求1所述的方法,其特征在于所述多个标志位为会频繁受到指令修改的多个状态标志位。
3.根据权利要求2所述的方法,其特征在于所述多个状态标志位包括进位标志位、奇偶标志位、调整标志位、零标志位、符号标志位、以及溢出标志位。
4.根据权利要求1所述的方法,其特征在于所述最近映射到的物理寄存器根据用于维护所述状态寄存器和物理寄存器的动态映射关系的重命名表来确定。
5.根据权利要求1所述的方法,其特征在于所述重命名表包括表示状态的域和表示改写物理寄存器的指令所在的基本块的域。
6.根据权利要求5所述的方法,其特征在于所述重命名表还包括有效域,用于确定最近映射到的物理寄存器。
7.根据权利要求2所述的方法,其特征在于所述多个状态标志位中的一部分状态位会受到屏蔽以防止对这一部分状态位的修改。
8.根据权利要求1所述的方法,其特征在于所述最近映射到的物理寄存器根据状态指针寄存器的值来确定。
9.根据权利要求1所述的方法,其特征在于在对状态寄存器进行重命名操作之后,所述微码进入发射队列并在所分配的物理寄存器准备就绪之后能够参与调度并被发射出去。
10.一种包括实现了权利要求1所述的方法的寄存器重命名模块的、具有超标量流水线结构的处理器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006101503380A CN100524208C (zh) | 2006-10-26 | 2006-10-26 | 对状态寄存器进行重命名的方法和使用该方法的处理器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006101503380A CN100524208C (zh) | 2006-10-26 | 2006-10-26 | 对状态寄存器进行重命名的方法和使用该方法的处理器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101169710A true CN101169710A (zh) | 2008-04-30 |
CN100524208C CN100524208C (zh) | 2009-08-05 |
Family
ID=39390350
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006101503380A Active CN100524208C (zh) | 2006-10-26 | 2006-10-26 | 对状态寄存器进行重命名的方法和使用该方法的处理器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100524208C (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102508635A (zh) * | 2011-10-19 | 2012-06-20 | 中国科学院声学研究所 | 一种处理器装置及其循环处理方法 |
US8583901B2 (en) | 2009-02-04 | 2013-11-12 | Stmicroelectronics (Beijing) R&D Co. Ltd. | Register renaming system using multi-bank physical register mapping table and method thereof |
WO2015165017A1 (zh) * | 2014-04-28 | 2015-11-05 | 华为技术有限公司 | 一种数据处理装置及方法 |
CN105359089A (zh) * | 2013-07-12 | 2016-02-24 | 高通股份有限公司 | 用于在微处理器中进行选择性重命名的方法和设备 |
CN105993000A (zh) * | 2013-10-27 | 2016-10-05 | 超威半导体公司 | 用于浮点寄存器混叠的处理器和方法 |
CN106990941A (zh) * | 2015-12-24 | 2017-07-28 | Arm 有限公司 | 使用寄存器重命名处理移动指令 |
CN109800086A (zh) * | 2018-12-27 | 2019-05-24 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN110647361A (zh) * | 2019-09-09 | 2020-01-03 | 中国人民解放军国防科技大学 | 一种空闲物理寄存器的获取方法和装置 |
CN111209039A (zh) * | 2018-11-21 | 2020-05-29 | 展讯通信(上海)有限公司 | 指令处理方法及装置 |
CN111414196A (zh) * | 2020-04-03 | 2020-07-14 | 中国人民解放军国防科技大学 | 一种零值寄存器的实现方法及装置 |
CN113254079A (zh) * | 2021-06-28 | 2021-08-13 | 广东省新一代通信与网络创新研究院 | 一种用于实现自增指令的方法及系统 |
CN113703842A (zh) * | 2021-09-10 | 2021-11-26 | 中国人民解放军国防科技大学 | 一种基于分支预测的值预测方法、装置及介质 |
CN114675890A (zh) * | 2022-05-26 | 2022-06-28 | 飞腾信息技术有限公司 | 一种指令执行方法、装置、设备及存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5784589A (en) * | 1993-10-18 | 1998-07-21 | Cyrix Corporation | Distributed free register tracking for register renaming using an availability tracking register associated with each stage of an execution pipeline |
US6405304B1 (en) * | 1998-08-24 | 2002-06-11 | Compaq Information Technologies Group, L.P. | Method for mapping instructions using a set of valid and invalid logical to physical register assignments indicated by bits of a valid vector together with a logical register list |
CN1264087C (zh) * | 1999-09-08 | 2006-07-12 | 关一 | 寄存器再命名方法 |
JP3817436B2 (ja) * | 2000-09-28 | 2006-09-06 | 株式会社東芝 | プロセッサおよびリネーミング装置 |
US20050114632A1 (en) * | 2003-11-21 | 2005-05-26 | Intel Corporation | Method and apparatus for data speculation in an out-of-order processor |
-
2006
- 2006-10-26 CN CNB2006101503380A patent/CN100524208C/zh active Active
Cited By (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9436472B2 (en) | 2009-02-04 | 2016-09-06 | France Brevets | Register renaming system using multi-bank physical register mapping table and method thereof |
US8583901B2 (en) | 2009-02-04 | 2013-11-12 | Stmicroelectronics (Beijing) R&D Co. Ltd. | Register renaming system using multi-bank physical register mapping table and method thereof |
CN101794214B (zh) * | 2009-02-04 | 2013-11-20 | 世意法(北京)半导体研发有限责任公司 | 使用多块物理寄存器映射表的寄存器重命名系统及其方法 |
CN102508635B (zh) * | 2011-10-19 | 2014-10-08 | 中国科学院声学研究所 | 一种处理器装置及其循环处理方法 |
CN102508635A (zh) * | 2011-10-19 | 2012-06-20 | 中国科学院声学研究所 | 一种处理器装置及其循环处理方法 |
CN105359089A (zh) * | 2013-07-12 | 2016-02-24 | 高通股份有限公司 | 用于在微处理器中进行选择性重命名的方法和设备 |
CN105359089B (zh) * | 2013-07-12 | 2017-12-26 | 高通股份有限公司 | 用于在微处理器中进行选择性重命名的方法和设备 |
CN105993000B (zh) * | 2013-10-27 | 2021-05-07 | 超威半导体公司 | 用于浮点寄存器混叠的处理器和方法 |
CN105993000A (zh) * | 2013-10-27 | 2016-10-05 | 超威半导体公司 | 用于浮点寄存器混叠的处理器和方法 |
CN105308557A (zh) * | 2014-04-28 | 2016-02-03 | 华为技术有限公司 | 一种数据处理装置及方法 |
CN105308557B (zh) * | 2014-04-28 | 2018-06-15 | 华为技术有限公司 | 一种数据处理装置及方法 |
WO2015165017A1 (zh) * | 2014-04-28 | 2015-11-05 | 华为技术有限公司 | 一种数据处理装置及方法 |
CN106990941A (zh) * | 2015-12-24 | 2017-07-28 | Arm 有限公司 | 使用寄存器重命名处理移动指令 |
CN106990941B (zh) * | 2015-12-24 | 2022-01-25 | Arm 有限公司 | 使用寄存器重命名处理移动指令 |
CN111209039A (zh) * | 2018-11-21 | 2020-05-29 | 展讯通信(上海)有限公司 | 指令处理方法及装置 |
CN109800086A (zh) * | 2018-12-27 | 2019-05-24 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN109800086B (zh) * | 2018-12-27 | 2022-12-06 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN110647361A (zh) * | 2019-09-09 | 2020-01-03 | 中国人民解放军国防科技大学 | 一种空闲物理寄存器的获取方法和装置 |
CN111414196A (zh) * | 2020-04-03 | 2020-07-14 | 中国人民解放军国防科技大学 | 一种零值寄存器的实现方法及装置 |
CN113254079A (zh) * | 2021-06-28 | 2021-08-13 | 广东省新一代通信与网络创新研究院 | 一种用于实现自增指令的方法及系统 |
CN113254079B (zh) * | 2021-06-28 | 2021-10-01 | 广东省新一代通信与网络创新研究院 | 一种用于实现自增指令的方法及系统 |
CN113703842A (zh) * | 2021-09-10 | 2021-11-26 | 中国人民解放军国防科技大学 | 一种基于分支预测的值预测方法、装置及介质 |
CN113703842B (zh) * | 2021-09-10 | 2024-03-26 | 中国人民解放军国防科技大学 | 一种基于分支预测的值预测方法、装置及介质 |
CN114675890A (zh) * | 2022-05-26 | 2022-06-28 | 飞腾信息技术有限公司 | 一种指令执行方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN100524208C (zh) | 2009-08-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100524208C (zh) | 对状态寄存器进行重命名的方法和使用该方法的处理器 | |
US9329869B2 (en) | Prefix computer instruction for compatibily extending instruction functionality | |
US9286072B2 (en) | Using register last use infomation to perform decode-time computer instruction optimization | |
KR100592122B1 (ko) | 가상 레지스터 번호들을 이용하여 논리적 레지스터 번호들을 물리적 레지스터 번호들로 맵핑시키도록 구성된 프로세서 | |
EP0686914B1 (en) | Resynchronisation of a superscalar processor | |
US7711929B2 (en) | Method and system for tracking instruction dependency in an out-of-order processor | |
US6505293B1 (en) | Register renaming to optimize identical register values | |
EP0686913B1 (en) | Superscalar microprocessor including flag operand renaming and forwarding apparatus and method of processing RISC-like operations in said superscalar microprocessor | |
US7003629B1 (en) | System and method of identifying liveness groups within traces stored in a trace cache | |
EP1442364B1 (en) | System and method to reduce execution of instructions involving unreliable data in a speculative processor | |
US8769539B2 (en) | Scheduling scheme for load/store operations | |
TWI507980B (zh) | 最佳化暫存器初始化操作 | |
US6594754B1 (en) | Mapping destination logical register to physical register storing immediate or renamed source register of move instruction and using mapping counters | |
US6393555B1 (en) | Rapid execution of FCMOV following FCOMI by storing comparison result in temporary register in floating point unit | |
US5828873A (en) | Assembly queue for a floating point unit | |
US9424036B2 (en) | Scalable decode-time instruction sequence optimization of dependent instructions | |
TW201423584A (zh) | 提取寬度預測器 | |
US8171240B1 (en) | Misalignment predictor | |
US20160011876A1 (en) | Managing instruction order in a processor pipeline | |
US6266763B1 (en) | Physical rename register for efficiently storing floating point, integer, condition code, and multimedia values | |
US20160011877A1 (en) | Managing instruction order in a processor pipeline | |
KR100572040B1 (ko) | 명령들의 퇴거시 물리적인 레지스터들을 선택적으로 자유화하도록 구성된 프로세서 | |
US5812812A (en) | Method and system of implementing an early data dependency resolution mechanism in a high-performance data processing system utilizing out-of-order instruction issue | |
US7694110B1 (en) | System and method of implementing microcode operations as subroutines | |
US5859998A (en) | Hierarchical microcode implementation of floating point instructions for a microprocessor |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |