在Intel优化手册Chapter 3 Section 3.5.1中,它说
如果需要使用多个micro-op,non-microsequenced指令,试着用几个单独的微操作指令分开。以下指令是不需要微序列器的多个微操作指令的示例:
ADC/SBB
CMOVcc
读-修改-写指令
由于"微指令定序器是选择下一个微指令地址的所有硬件的组合"(微指令定序器的实现)
- "非微测序"是什么意思?
- 在这种情况下如何修改微指令流?
- 这种μop情况是如何与指令级的IP寄存器修改相关的?
你找到的那篇极客文章是关于像8086或6502这样更简单的cpu的,其中所有指令都由微码测序器处理。现代Intel和AMD cpu将足够简单的指令直接解码为1或2个ops (AMD)或1到4个ops (Intel)。
参见什么是微编码指令?关于现代cpu;它在底部也有一个关于老式"微编码cpu"的部分。像6502;有关它们的更多信息,请参阅关于逆向计算的问答。
参见Intel手册的另一部分,他们记录了snb系列cpu的管道,并解释了任何运行超过4个uop的指令都会解码到触发微码测序器的特殊类型的uop。
参见https://www.realworldtech.com/sandy-bridge/4/,特别是Agner Fog的微拱指南(https://agner.org/optimize/),特别是Pentium Pro和Sandybridge部分。引用瑞士法郎部分:
有四个解码器,可以处理产生一个或多个µops的指令按照一定的模式。下面的指令模式被成功解码在我的实验中的一个时钟周期中:
- 1-1-1-1
- 2-1-1
- 3
4生成3µops或4µops的指令单独解码。生成更多的指令小于4µops由微码处理,效率较低。
这就是英特尔的优化指南所谈论的;许多人称之为"微编码指令"的东西;因为它们间接连接到MS-ROM。
像idq.ms_switches
这样的性能事件是相关的:[来自DSB(解码流缓冲区)或MITE(遗留)的交换机数量解码管道)到微码序列器]。DSB是上层缓存。
如果查看perf list
中的其他性能事件,请仔细阅读:以下事件是而不是计数由微码序列器生成的。当问题/重命名阶段从微码测序器读取而不是从IDQ读取时,它们正在计算添加到IDQ的值。
idq.ms_cycles
发送到指令解码队列(IDQ)的周期当微码测序器(MS)忙时]
idq.ms_dsb_cycles
由解码流缓冲区(DSB)启动的up的周期当微码序列器传送到指令解码队列(IDQ)时(MS)很忙]
至少这是我的理解,这与像rep movsb
这样的微编码指令需要从执行反馈才能知道何时停止生成uops的事实是兼容的,因此它们必须在IDQ(指令解码队列)的问题/重命名端进行扩展,而不是在从遗留解码或uop缓存添加新uops的末尾。(在David Kanter关于SnB的RWT文章中,IDQ是方框图中的28- up解码器队列。它显示了一个"代码引擎"。写信给IDQ,但我不确定这是否准确。
我在另一个答案中写过关于微码的间接扩展的细节:在指令周期中微码是如何执行的?
其他相关:
-
在英特尔snb系列cpu上涉及微编码指令的循环的分支对齐似乎由于上缓存而在前端产生性能影响。
-
MSROM程序中的条件跳转指令?-一些来自Andy Glew的信息,关于MS-ROM代码是如何工作的,以及它在实现
rep movsb
等东西时的局限性。