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 位版本。
似乎没有 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 位版本。