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

在现代x86 CPU中,所有微操作的长度都相同吗?,x86,cpu-architecture,instructions,X86,Cpu Architecture,Instructions,在查看u-op缓存一段时间后,我的印象是每个微操作都是8字节,但我的问题是,所有微操作都是相同大小的吗,甚至是融合域微操作?x86芯片供应商没有记录此细节。然而,UOP需要足够简单,以便能够在一个周期内解码。这与x86指令不同,在x86指令中,一条指令至少需要一个解码周期(尽管可以在同一周期中解码多条指令)。因此,以相当统一的格式制作相同大小的UOP有助于实现这一目标。我认为在大多数x86处理器上,融合域和未融合域UOP的大小可能都相同。在英特尔处理器中,uop缓存中的uop大小可能不同,具体取

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

x86芯片供应商没有记录此细节。然而,UOP需要足够简单,以便能够在一个周期内解码。这与x86指令不同,在x86指令中,一条指令至少需要一个解码周期(尽管可以在同一周期中解码多条指令)。因此,以相当统一的格式制作相同大小的UOP有助于实现这一目标。我认为在大多数x86处理器上,融合域和未融合域UOP的大小可能都相同。在英特尔处理器中,uop缓存中的uop大小可能不同,具体取决于uop是否具有立即数和/或置换操作数。另一方面,IDQ可以容纳固定数量的uop,而无需设定uop的条件,这表明IDQ中的每个uop占用相同的空间量。融合域uop的大小可能不同于未融合域uop的大小。但对于任何用途的微熔合,熔合域uop的大小必须严格小于未熔合域uop大小的两倍。此外,我认为我们可以从逻辑上说,融合域uop的大小至少与未融合域uop的大小一样大。

我们知道,在uop缓存中,uop不完全进入固定大小的插槽。Agner Fog发现,如果有空间,具有较大直接/位移的UOP可以从同一缓存线中的其他UOP“借用”空间(在Microach PDF的Sandybridge部分)。但在融合域IDQ中,UOP的宽度是固定的,因为循环缓冲区的大小并不取决于UOP的类型。顺便说一句,
cmp[rdi+1000000000],0x12345
是一个具有imm32和disp32(8字节)的单uop,但从SKL上具有多个背靠背的uop缓存中提取速度很慢,并且(某些)微融合uop的非分层仅在发出/重命名(或添加到IDQ时)时发生索引寻址模式显然,并非融合域的所有部分都使用相同的表示/格式。(). 在ROB中,uop需要一个物理寄存器索引,而不是体系结构寄存器索引。@Peter Cordes我在某处读到uop缓存中的每一行都有元数据,说明该行有多少uop和指令长度信息,因此几乎可以确定它们的长度不同。您似乎对这个主题了解很多,看看我问的一个相关问题:@LewisKelsey:指令长度信息用于记录x86指令的长度,而不是UOP的长度。有固定大小的插槽,但有一些方案用于以相同的缓存方式从其他UOP借用存储,以用于具有大量即时数据的指令。请记住,1条x86指令可以解码为多个UOP,如
haddps
is 3。这也取决于OP的确切要求。从逻辑意义上讲,UOP可能有非常不同的大小,因为一些UOP需要更多的信息,如地址、立即值、最多4个参数等,而其他UOP没有(想象a
nop
),因此这些字段在逻辑上较小的UOP中“未使用”。uops缓存在物理上是一个固定的结构:物理硬件无法更改,因此任何给定的“插槽”随着时间的推移看起来都是相同的。不同的插槽可能有不同的长度,但我也不认为这是真的:大多数证据。。。