xmm 寄存器的 vbroadcastsd 等价物是什么?

What's the equivalent of vbroadcastsd for xmm registers?

似乎没有 vbroadcastsd 的版本采用带有 xmm 目标寄存器的 64 位内存源操作数,这有点奇怪,因为 ymm zmm 个版本存在。

所以我想有一些现有的指令涵盖了这个目的?

SSE3 movddup xmm, xmm/m64 是 64->128 广播。

有趣的是,AVX1 256 位版本 (vmovddup ymm, ymm/m256) 进行两个独立的通道内广播,并具有 256 位内存源。但是有了内存源,它仍然纯粹在 Intel CPU 上的加载端口上运行,就像广播加载一样。

正如您所说,vbroadcastsd ymm, m64 是 AVX1,vbroadcastsd ymm, xmm 是 AVX2,并且没有 vbroadcastsd 带有 XMM 目的地。


如果不是因为 AVX1 广播的纯内存源特性,英特尔可能刚刚制作了 movddup[=256 位版本vbroadcastsd。即 128 位 vmovddup 和 vbroadcastsd 可能是同一操作码的别名。

但是将它们分开让英特尔为 AVX1 制作 m64 -> ymm 广播,同时仍然提供 vmovddup xmm, xmm/m64 允许作为寄存器的源。我不知道为什么提供了一个 256 位的车道内广播版本。也许这有时真的很有用,或者他们可以便宜地做到这一点。

如果vbroadcastsd编码为VEX.L= 0(表示128位向量宽度),手册明确表示它将#UD。所以没有未记录的 128 位版本。