如何最有效地将常数(整数)值放入avx _m256寄存器的所有8个插槽中

时间:2019-09-12 16:32:14

标签: intel sse avx masm64

我的整数值为-1,并希望尽快将其加载到ym0之类的_m256寄存器的所有8个插槽中。

我没有找到汇编指令。 MASM不接受

vmovaps    ymm1, 0FFFFFFFFh         ; -1

使用诸如此类的内在函数

// get constant values into sse register    
    __m256  tmp     = _mm256_set1_ps(rp->xc);

Visual Studio中生成的代码如下:

mov         rax,qword ptr [rp]  
vmovss      xmm0,dword ptr [rax+34h]  
vshufps     xmm0,xmm0,xmm0,0  
vinsertf128 ymm0,ymm0,xmm0,1  
vmovups     ymmword ptr [rbp+7C0h],ymm0  
vmovups     ymm0,ymmword ptr [rbp+7C0h]  
vmovups     ymmword ptr [tmp],ymm0 

这对于发生的一件相当简单的事情来说有点长 每时每刻。我仍然希望有直接的指示可以做到这一点。我正在寻找汇编器(使用内在函数只是为了查看编译器的作用)。

我知道我必须以某种方式指定_m256中的所有8个插槽都具有相同的值。

到目前为止,我唯一的想法是在rdx中传递常量(-1)。 然后将rdx加载到ymm1中,然后进行一些改组。 我只是认为我做错了,因为再次将恒定值(或单个float / int)加载到avx寄存器的所有插槽应该是非常常见的任务。所以我不敢相信没有专门的指示。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用内在函数时,您实际上应该坚持使用_mm256_set1_epi32(-1)(如果要使用_mm256_castsi256_ps而不是__m256,请使用__m256i)。并确保在启用优化的情况下进行编译:https://godbolt.org/z/zQ9nZZ

从内存中加载常量还是使用vcmptrueps(如clang所做的那样,用vxorps清除寄存器以避免虚假的依赖之后)是更好的选择,这取决于上下文以及目标体系结构(对于gcc和clang,如果您知道目标体系结构,则应始终使用-march=native进行编译。)