X86 MSROM程序中的条件跳转指令?

X86 MSROM程序中的条件跳转指令?,x86,intel,cpu-architecture,branch-prediction,micro-architecture,X86,Intel,Cpu Architecture,Branch Prediction,Micro Architecture,这涉及到一个问题 但仔细想想,在现代intel CPU上,SEC阶段是在微码中实现的,这意味着会有一个检查,即使用烧入密钥来验证PEI ACM上的签名。如果它不匹配,那么它需要做一些事情,如果它匹配,那么它需要做其他事情。如果这是作为MSROM过程实现的,则必须有一种分支方式,但前提是MSROM指令没有RIP 通常,当分支预测失误时,当指令失效时,ROB将检查异常代码,从而将指令长度添加到ROB行的RIP中,或者只使用下一个ROB条目的IP,这将导致前端在分支预测更新中重新定位到该地址。在BOB

这涉及到一个问题

但仔细想想,在现代intel CPU上,SEC阶段是在微码中实现的,这意味着会有一个检查,即使用烧入密钥来验证PEI ACM上的签名。如果它不匹配,那么它需要做一些事情,如果它匹配,那么它需要做其他事情。如果这是作为MSROM过程实现的,则必须有一种分支方式,但前提是MSROM指令没有RIP

通常,当分支预测失误时,当指令失效时,ROB将检查异常代码,从而将指令长度添加到ROB行的RIP中,或者只使用下一个ROB条目的IP,这将导致前端在分支预测更新中重新定位到该地址。在BOB中,这个功能现在已经被借给了跳转执行单元。显然,MSROM例程不会发生这种情况,因为前端与之无关


我的想法是,有一个特定的跳转指令,只有MSROM例程可以发出,跳转到MSROM中的不同位置,并且可以配置为MSROM分支指令总是被预测而不是执行,当分支执行单元遇到该指令并执行分支时,它生成一个异常代码,可能会将特殊的跳转目标连接到该代码,并且在失效时发生异常。或者,执行单元可以处理它,它可以使用BOB,但我的印象是,BOB是由分支指令RIP索引的,然后还有一个事实,生成MSROM代码的异常通常在失效时处理;分支预测失误不需要MSROM,我认为所有操作都是在内部执行的。

微码分支显然是特殊的

根据Andy Glew对原始P6()的描述,Intel的P6和SnB系列不支持微码分支的动态预测。考虑到SnB系列
rep
-字符串指令的类似性能,我假设这个PPro事实甚至适用于最新的Skylake/CoffeeLake CPUs1

但是微码分支预测失误会受到惩罚,因此它们是静态(?)预测的。(这就是为什么
rep movsb
对于ECX中的低/中/高计数,以及对齐与未对齐,启动成本以5个周期的增量递增。)


微代码指令在uop缓存中占据一整行当它到达IDQ的前端时,它将接管发布/重命名阶段,直到完成微码UOP的发布。(有关更多详细信息,以及来自性能事件描述(如
idq.dsb_uops
)的一些证据,这些证据表明,在问题/重命名阶段从微码序列器读取数据时,idq可以从uop缓存接收新的uop。)

对于
rep
-字符串指令,我认为循环的每次迭代实际上都必须通过前端发出,而不仅仅是后端内部的循环并重用那些UOP。因此,这涉及OoO后端的反馈,以确定指令何时完成执行

我不知道当issue/rename切换到从MS-ROM而不是IDQ读取UOP时会发生什么的细节

即使每个uop没有自己的RIP(作为单个微代码指令的一部分),我猜分支预测失误检测机制的工作原理与正常分支类似

rep mov
某些CPU上的设置时间似乎以5个周期为一步,具体取决于哪种情况(小与大、对齐等)。如果这些是来自微码分支预测失误,这似乎意味着预测失误的惩罚是一个固定的周期数,除非这只是
rep movs
的特殊情况。可能是因为OoO后端可以跟上前端?从MS-ROM读取比从uop缓存读取更缩短路径,让罚失那么低

rep movsb
周围可能出现的OoO exec数量进行一些实验将是很有意思的,例如,使用两条相关
imul
指令链,看看它是否(部分地)。我们希望不是这样,但为了实现ILP,必须在不等待后端耗尽的情况下发布后一个
imul
UOP

我在天湖(i7-6700k)上做了一些实验.初步结果:95字节及以下的拷贝大小是便宜的,并且由于IMUL链的延迟而被隐藏,但它们基本上完全重叠。96字节及以上的拷贝大小会耗尽RS,将两条IMUL链序列化。无论是
rep movsb
使用RCX=95还是
rep movsd
使用RCX=23对24。关于我的发现的更多总结,请参见评论中的讨论;如果我有时间,我将发布更多细节

“排空RS”行为是通过
RS\u事件来测量的。空的\u end:u
甚至变成1 per
rep movsb
而不是~0.003。
其他\u辅助。任何:u
都是零,因此它不是“辅助”,或者至少不算为一

如果微码分支不支持通过BoB进行快速恢复,那么无论涉及到什么uop,都可能只在达到失效状态时检测到预测失误?96字节的阈值可能是某些替代策略的截止值。RCX=0也会耗尽RS,可能是因为这也是一种特殊情况

使用
rep scas
进行测试会很有意思(它不支持快速字符串,只是慢而哑的微码。)

在P6中描述了实现。它没有IDQ(因此,在阶段和uop缓存之间具有缓冲区的现代CPU将有一些变化是有意义的),但它们描述的避免分支的机制很简洁,可能仍然用于现代ERMSB:第一个