我的整数值为-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寄存器的所有插槽应该是非常常见的任务。所以我不敢相信没有专门的指示。
感谢您的帮助!
答案 0 :(得分:1)
使用内在函数时,您实际上应该坚持使用_mm256_set1_epi32(-1)
(如果要使用_mm256_castsi256_ps
而不是__m256
,请使用__m256i
)。并确保在启用优化的情况下进行编译:https://godbolt.org/z/zQ9nZZ
从内存中加载常量还是使用vcmptrueps
(如clang所做的那样,用vxorps
清除寄存器以避免虚假的依赖之后)是更好的选择,这取决于上下文以及目标体系结构(对于gcc和clang,如果您知道目标体系结构,则应始终使用-march=native
进行编译。)