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
而不是 movss
和 store_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
我在 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
而不是 movss
和 store_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