有效地将 YMM 寄存器的低 64 位设置为常数

Posted

技术标签:

【中文标题】有效地将 YMM 寄存器的低 64 位设置为常数【英文标题】:Efficiently Set Lowest 64 Bits of YMM Register to Constant 【发布时间】:2012-03-03 12:35:57 【问题描述】:

如何在最少的时钟周期内将 YMM 寄存器的最低 64 位设置为某个常数?我知道可以使用 SSE 指令以及 AVX 指令VBROADCASTSD 执行此操作的各种方法,但我不确定哪种方法会产生最佳结果。

编辑:设置64位部分后我仍然需要使用完整的YMM寄存器。

感谢您的帮助!

【问题讨论】:

取决于设置低64位后是使用完整的YMM寄存器还是只使用XMM部分。 抱歉有歧义 -- 设置低 64 位后需要使用完整的 YMM 寄存器。 这也取决于常数。有些常量值可以很容易地生成,有些则必须从内存中加载) 这绝对是真的。这么一个看似简单的问题,却需要大量的规范!我尝试加载的常量没有容易重现的模式(至少通过使用少量的按位、算术、广播或置换操作)。 【参考方案1】:

如果只需要设置最低64位,其他YMM位无所谓,使用VMOVQ

如果需要保留 YMM 寄存器中的其他位,最有效的方法是使用VBLENDPD。或者,您可以使用 VANDPD 清除最低 64 位,然后使用 VORPD 加载常量。

AVX2 允许使用其他替代方法:VPMASKMOVDVPBLENDD(但尚未得到任何处理器的支持)。

【讨论】:

谢谢,这正是我想要的! 我也可以建议使用 VBLENDPD(Sandy Bridge 上的延迟 1)而不是 VANDPD+VORPD。 @NorbertP。 VBLENDPD 肯定更好。谢谢。

以上是关于有效地将 YMM 寄存器的低 64 位设置为常数的主要内容,如果未能解决你的问题,请参考以下文章

测试 256 位 YMM AVX 寄存器为零的最有效/惯用方法

测试 256 位 YMM AVX 寄存器元素是不是等于或小于零的最有效方法

有效地将 CPU 寄存器中的所有位设置为 1

有没有更有效的方法将 4 个连续的双精度广播到 4 个 YMM 寄存器中?

ARM NEON 内部函数将 D(64 位)寄存器转换为 Q(128 位)寄存器的低半部分,而上半部分未定义

在单臂霓虹灯寄存器中有效地将 8 位数字扩展到 12 位