多 uop 指令的 x86 解码

x86 decoding of multi-uop instructions

Agner Fog in his microarch.pdf says:

Decoding becomes more efficient because an instruction that generates one fused μop can go into any of the three decoders while an instruction that generates two μops can go only to decoder D0.

我知道解码器将 x86 机器代码作为输入(就像 mov eax, eax 的汇编程序输出),并产生微操作作为输出。

在解码之前,如何确定哪个解码器应该解码特定指令?也许预解码器?

Agner 的微架构 PDF 解释了解码,以及多 uop 指令会发生什么。

如果多 uop 指令不是正在解码的块中的第一个 insn,则解码在该 insn 处结束。在下一个周期,解码从多微指令insn开始,所以它会命中能够处理多微指令的复杂解码器。

这就是 3-1-3-1 重复模式比 3-3-1-1 重复模式解码效果更好的原因。

预解码器只标记指令lengths/boundaries。他们还不知道哪些 insn 将解码为多个 uops。这需要对指令进行实际解码,因此无法随机播放指令流以将复杂指令发送到复杂解码器。

这就是当您遇到解码器瓶颈时指令顺序很重要的原因。对于具有 uop 高速缓存的 CPU,解码性能通常并不重要。如果是,则存在代码大小问题。希望代码 运行 的频率足以使其性能变得重要,但很少见以至于它不会在 uop 缓存中变热。