什么是微编码指令?

10 cpu assembly cpu-architecture

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

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

Pet*_*des 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, edx,在Intel Haswell上解码为3 uops.有趣的是,使用3个MOV指令与暂存寄存器进行交换时,你得到的uops并不完全相同,因为它们不是零延迟.

在Intel/AMD CPU上,"微编码"意味着解码器打开微代码序列器,将uop从ROM提供到管道,而不是直接产生多个uop.

在当前的英特尔CPU中,解码器可以直接生成的限制,而不需要微代码ROM,是4 uops(融合域).AMD类似地拥有FastPath单指令或双指令,除此之外它是VectorPath或Microcode,正如David Kanter深入研究AMD Bulldozer所解释的那样,特别是谈论它的解码器.

另一个例子是x86的整数DIV指令,即使在像Intel Haswell这样的现代CPU上也是微编码的.请参阅我的答案为什么这个C++代码比我用于测试Collat​​z猜想的手写程序集更快?对于数字.

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

整数除法和其他微编码指令可以给CPU带来困难,并创建使代码对齐无关紧要的效果.


要了解有关x86 CPU内部的更多信息,请参阅标记wiki,尤其是Agner Fog的微指南.


在一些较旧/较简单的CPU中,每条指令都是有效的微编码.例如,6502 通过运行来自PLA解码ROM的一系列内部指令来执行6502指令.这适用于非流水线CPU,其中使用CPU的不同部分的顺序可能因指令而异.


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

  • @Rob:我认为尝试简化是一个好主意,我只是认为你没有成功,不幸的是最终说出了一些不正确的事情. (3认同)
  • @Rob:您的回答声称正在解码的一些指令*是微码.它没有说明从微代码ROM触发内部指令流的某些指令,而不是直接影响控制信号的其他指令(尽管在现代x86 CPU中,即使是单指令仍然会经历大量复杂的指令有序机械).某些ISA的一些设计(如我认为的MIPS)根本不使用任何微代码,指令位可以直接解码为控制信号. (2认同)