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

Optimization 有效地将YMM寄存器的最低64位设置为常量,optimization,assembly,sse,vectorization,avx,Optimization,Assembly,Sse,Vectorization,Avx,如何在最少的时钟周期内将YMM寄存器的最低64位设置为常数?我知道使用SSE指令以及AVX指令VBROADCASTSD可以实现这一点的各种方法,但我不确定哪种方法会产生最佳结果 编辑:设置64位部分后,我仍然需要使用完整的YMM寄存器 谢谢你的帮助 如果您只需要设置最低64位,而其他YMM位无关紧要,请使用VMOVQ 如果需要在YMM寄存器中保留其他位,最有效的方法是使用VBLENDPD。或者,您可以使用VANDPD清除最低64位,然后使用VORPD加载常量 AVX2允许其他替代方法来执行此操作

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

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


谢谢你的帮助

如果您只需要设置最低64位,而其他YMM位无关紧要,请使用
VMOVQ

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


AVX2允许其他替代方法来执行此操作:
VPMASKMOVD
VPBLENDD
(但尚未得到任何处理器的支持).

取决于您是要在设置低64位后使用完整的YMM寄存器,还是只使用XMM部分。很抱歉,不明确--我需要在设置低64位后使用完整的YMM寄存器。这还取决于常量。一些常量值可以很容易地生成,另一些则必须从内存中加载)这绝对正确。这样一个看似简单的问题需要很多规范!我试图加载的常量没有容易复制的模式(至少通过使用少量的按位、算术、广播或置换操作)。谢谢,这正是我想要的!我也可以建议使用VBLENDPD(Sandy Bridge上的延迟1),而不是VANDPD+VORPD。@NorbertP。VBLENDPD肯定更好。谢谢