【问题标题】:What's the equivalent of vbroadcastsd for xmm registers?xmm 寄存器的 vbroadcastsd 等价物是什么?
【发布时间】:2018-08-24 17:05:06
【问题描述】:

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

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

【问题讨论】:

  • 启用各种指令集时,只看编译器为__m128d f(double*x){return _mm_set1_pd(*x);}生成的代码?
  • @MarcGlisse - 好电话! emits vmovddupmovddup 或者更糟糕的是,如果你只使用基本 SSE。

标签: assembly x86 sse avx


【解决方案1】:

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

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

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


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

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

如果vbroadcastsd 使用VEX.L= 0 编码(意味着128 位向量宽度),手册明确说明它将#UD。因此,没有未记录的 128 位版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2014-06-12
    • 1970-01-01
    • 2022-11-28
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多