宏融合
原理
x86是典型的CISC架构。为了便于实现流水线和超标量,90年代中期以后的主流x86处理器均在前端使用解码器将x86指令翻译成类似RISC指令的微指令送入后端执行。一条x86指令将被解码成一条或多条微指令。受解码单元和执行单元数目限制,在同一时钟周期内,前端能够解码的宏指令最大数量和后端能够执行的微指令最大数量都是有限的固定值。宏融合将在程序中经常连续出现的若干条x86指令在解码前融合成一条,从而提高了解码器的效率;同时,融合后的多条x86指令可以被解码成一条微指令,从而也提高了后端执行的效率。[1]据估计,运行典型的x86程序时,宏融合可以带来约11%的性能提升[2]。
英特尔基于Core和更新微架构的处理器、威盛凌珑处理器[3]和超微(AMD)基于Bulldozer和更新微架构的处理器均支持宏融合。
可被宏融合的指令
在英特尔的实现中,特定的两条连续x86指令可以被一个解码单元在一个时钟周期内解码成一条微指令,因此4个解码单元可在一个时钟周期里解码5条x86指令。这两条x86指令中的第一条必须是影响标志位的指令,如TEST或CMP;第二条必须是条件跳转。这样的组合在编译器生成的代码中非常常见,因此程序不需要重新编译就可以获得性能提升。
Core和Nehalem微架构只支持将TEST或CMP作为第一条指令。具体而言,当第一条指令是TEST时,第二条指令可以是任何的条件跳转指令;而当第一条指令是CMP时,Core微架构的处理器仅在第二条指令是JA(JNBE)、JAE(JNB、JNC)、JE(JZ)、JNA(JBE)JNAE(JC、JB)或JNE(JNZ)时支持宏融合,但Nehalem微架构的处理器在第二条指令是JL(JNGE)、JGE(JNL)、JLE(JNG)、JG(JNLE)时也支持宏融合。
在Sandy Bridge微架构的处理器中,英特尔进一步拓展了宏融合的支持范围。例如,除TEST和CMP外,ADD和SUB等作为第一条指令也可以参与宏融合。