似乎没有 vbroadcastsd
的版本它采用 64 位内存源操作数 xmm
目标寄存器,这有点奇怪,因为 ymm
和zmm
版本已存在。
所以我猜有一些现有的指令涵盖了这个目的?
最佳答案
SSE3 movddup xmm, xmm/m64
是 64->128 广播。
有趣的是,AVX1 256 位版本 ( vmovddup ymm, ymm/m256
) 执行两个单独的 channel 内广播,并具有 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 位 channel 内广播版本。也许这有时确实有用,或者他们可以便宜地做到这一点。
如果vbroadcastsd
编码为 VEX.L= 0
(意味着 128 位向量宽度),手册明确表示它将#UD。因此不存在未记录的 128 位版本。
关于assembly - xmm 寄存器的 vbroadcastsd 相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008950/