什么是微编码指令?

时间:2016-11-01 18:48:25

标签: assembly cpu cpu-architecture

我看过很多参考微编码指令的文献。

这些是什么以及为什么使用它们?

1 个答案:

答案 0 :(得分:13)

CPU读取机器代码并将其解码为内部控制信号,将正确的数据发送到正确的执行单元。

大多数指令映射到一个内部操作,可以直接解码。 (例如,在x86上,add eax, edx只是将eax和edx发送到整数ALU以进行ADD操作,并将结果放入eax。)

其他一些指令 更多工作。例如x86的rep movs实现memcpy(edi, esi, ecx),并要求CPU循环。

当指令解码器看到这样的指令时,不是直接产生内部控制信号,而是从微码ROM中读取微码。

微编码指令是解码为许多内部操作的指令

现代x86 CPU始终将x86指令解码为内部微操作。在这个术语中,即使add [mem], eax解码为[mem]的加载,ALU ADD操作和存储回[mem],它仍然不算“微编码”。另一个例子是xchg eax, edxdecodes to 3 uops on Intel Haswell。有趣的是,使用3个MOV指令与刮擦寄存器进行交换时,你得到的uops并不完全相同,因为它们不是零延迟。

在Intel / AMD CPU上,“微编码”意味着解码器打开微代码序列器,将uop从ROM输入管道,而不是直接产生多个uop。

在目前的英特尔CPU中,解码器可以直接生成的限制,无需使用微代码ROM,是4 uops(融合域)。 AMD类似地有FastPath单指令或双指令,除此之外它是VectorPath或Microcode,正如in David Kanter's in-depth look at AMD Bulldozer所述,特别是谈论它的解码器。

另一个例子是x86的整数DIV指令,即使在像Intel Haswell这样的现代CPU上也是微编码的。有关数字,请参阅Why is this C++ code faster than my hand-written assembly for testing the Collatz conjecture?上的答案。

FP划分也很慢,但是被解码为单个uop,因此它不会成为前端的瓶颈。如果FP划分很少并且不是延迟瓶颈的一部分,它可以像乘法一样便宜。 (但如果执行必须等待其结果或其吞吐量的瓶颈,则 更慢。)

整数除法和其他微编码指令会给CPU带来困难,creates effects that make code alignment matter where it wouldn't otherwise.

要了解有关x86 CPU内部的更多信息,请参阅标记wiki,尤其是Agner Fog's microarch guide

在一些较旧/较简单的CPU中,每条指令都是有效的微编码。例如,6502执行了6502条指令by running a sequence of internal instructions from a PLA decode ROM。这适用于非流水线CPU,其中使用CPU的不同部分的顺序可能因指令而异。

历史上,“微码”有不同的技术含义,意思是从指令字解码的内部控制信号。特别是在像MIPS这样的CPU中,指令字直接映射到那些控制信号,而不需要复杂的解码。 (我可能有部分错误;我读过这样的内容(除了在这个问题上删除的答案)但后来再也找不到了。)