在现代x86 CPU中,所有微操作都是相同的长度吗?

Lew*_*sey 3 x86 cpu-architecture instructions

我的印象是,在查看u-op缓存一段时间后,每个微操作都是8个字节,但我的问题是所有微操作都是相同的大小,甚至是融合域微操作?

Had*_*ais 5

x86芯片供应商未记录此详细信息.但是,uops需要足够简单,以便可以在一个周期的一小部分内进行解码.这与x86指令形成对比,其中指令需要至少一个周期被解码(尽管可以在同一周期中解码多个指令).因此,使用相当统一的格式制作相同大小的uops有助于实现这一目标.我认为在大多数x86处理器上,很可能融合域和非融合域uops都具有相同的大小.在Intel处理器中,uop缓存中的uop可以具有不同的大小,具体取决于uop是否具有立即和/或位移操作数.另一方面,IDQ可以容纳固定数量的uop而没有uops的条件,这表明IDQ中的每个uop占用相同的空间量.融合域uop的大小可能与未融合域uop的大小不同.但是对于任何用途的微融合,融合域uop的大小必须严格小于未融合域uop的大小的两倍.另外我认为我们可以逻辑地说融合域uop的大小至少与未融合域uop的大小一样大.

  • 我们知道在uop-cache中,uops并不是纯粹进入固定大小的插槽.Agner Fog发现,如果有空间,那么具有大量立即/位移的uops可以从同一缓存行中的其他uops"借用"空间(https://agner.org/optimize/在微架PDF的Sandybridge部分中).但是在融合域IDQ中,uops*是固定宽度的,因为循环缓冲区的大小不依赖于它们是什么类型的uops.BTW,`cmp [rdi + 1000000000],0x12345`是一个带有imm32和disp32(8字节)的单个uop,但是从多个背对背的SKL上的uop缓存中获取它的速度很慢. (3认同)
  • 这也完全取决于OP的要求。从某种逻辑上讲,由于某些uop需要更多的信息,例如地址信息,立即值,最多4个参数等,所以uops的大小可能会非常不同-其他uops则没有(想像为“ nop”),因此这些字段在逻辑上较小的微指令中“未使用”。物理上,uops缓存是一个固定的结构:物理硬件无法更改,因此任何给定的“插槽”在时间上看起来都是相同的。可能的是,不同的插槽具有不同的长度,但我也不认为这是真的:大多数证据... (2认同)