Renamer
从上图中可以看出,重命名器是连接“有序前端”与“调度器的数据流世界(即乱序引擎)”的桥梁。它每周期可以最多从微指令队列搬移4条微指令到乱序引擎。尽管重命名器最多可以搬移4条微指令(未熔合的,微熔合的,宏熔合的),这个带宽已经等价于发射口的带宽(每周期6条微指令)。在这个过程中,乱序核执行如下的步骤:
- 将微指令中x86架构的源操作数/目的操作数重命名为微架构中的源/目的操作数
- 为微指令分配资源。例如,加载缓冲区,或存储缓冲区
- 将微指令绑定到正确的发射口
某些微指令在重命名阶段即可完成,从流水线中移除掉,有效地节省了执行带宽。这些微指令包括:
- 零习语(zero-idiom)(打破依赖习语 dependency breaking idiom,随后有详细讲解)
- NOP指令
- VZEROUPPOER指令
- FXCHG指令
重命名器可以每周期分配两条分支,比起前代微架构的每周期一条分支,可以消除或减少执行时的气泡现象(即执行流不均衡性)。
微熔合的读存与写存操作,如果使用了变址寄存器参量,则将会被分解为两条微指令(即类似于Haswell微架构中的微指令离解unlamination过程,参看后续章节),因此在一个周期中会占用重命名器的两条微指令带宽(注:重命名器的最大带宽是每周期4条微指令)。
Dependency Breaking Idioms
通过使用常用的指令将寄存器清零,可以增强指令的并行性。重命名器可以侦测到将目标寄存器设置为0的操作指令。
可能的话,尽量使用如下打破依赖习语将某个寄存器清零(即前面提到的零习语)。
注:这里打破依赖指的是指令执行结果是确定数,不依赖于指令的输入而变。
- XOR REG, REG
- SUB REG, REG
- PXOR/VPXOR XMMREG, XMMREG
- PSUBB/W/D/Q XMMREG, XMMREG
- VPSUBB/W/D/Q XMMREG, XMMREG
- XORPS/PD XMMREG, XMMREG
- VXORPS/PD YMMREG, YMMREG
由于零习语由重命名器侦测,执行,删除,所以这些指令都不会产生执行时延。
还有另外一种打破依赖习语,被称为壹习语(one idiom)。
CMPEQ XMM1, XMM1; 这个指令将目标寄存器中的所有比特位设置为1
对于这种情况,CMPEQ指令必须执行,但是,因为已知执行结果并不依赖于源操作数的输入数据,目标寄存器中的结果总是所有比特位置1,所以只要有可用的执行单元,壹习语指令可以立即投入执行。
Scheduler
调度器控制微指令的分发过程,这里分发指的是将微指令传输到对应的发射口/执行单元。要实现微指令分发,调度器必须标识出就绪的微指令以及微指令的操作数来源:某个寄存器堆条目,或者来自于某个执行单元的旁路。根据发射口与回写总线的可用性,以及就绪微指令的优先级,调度器在每个周期会选择将哪些微指令分发投入执行。