SSE2 函数怎么会从它应该在的 header 中丢失?

How can a SSE2 function be missing from the header it is supposed to be in?

我在 VS2013 上使用 SSE2 指令,我意识到 Intel documentation 中的某些函数在 header 中缺失,它们应该在其中。

方法 void _mm_storeu_si32 (void* mem_addr, __m128i a) 应该在 #include <immintrin.h> 中,但它不是。我确实可以从这个 header 访问其他方法,例如 __m128d _mm_undefined_pd (void)

如果我在 header 文件本身(由 VS2013 提供)中搜索,确实没有提到 _mm_storeu_si32 指令。

这怎么可能?

在旧的离线内在函数指南中,_mm_storeu_si32 列在 'other' 部分下。现在,在网上 intrinsics guide 它被列在 SSE2 下,但并不是所有的编译器都实现了它。作为解决 (store_b) 的便携式解决方案,您可以使用:

#include<immintrin.h>
void storeu_a(void* mem_addr, __m128i a) {
    _mm_storeu_si32(mem_addr, a);
    return;
}

void storeu_b(void* mem_addr, __m128i a) {
    _mm_store_ss((float*)mem_addr, _mm_castsi128_ps(a));
    return;
}

使用 clang 编译为 identical code,但其他编译器可能会选择 movd 而不是 movssstore_a and/or store_b

storeu_a(void*, long long __vector(2)):                     # @storeu_a(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret
storeu_b(void*, long long __vector(2)):                     # @storeu_b(void*, long long __vector(2))
        movss   dword ptr [rdi], xmm0
        ret