SSE2 函数如何从它应该所在的标头中丢失?

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

本文关键字:函数 SSE2      更新时间:2023-10-16

我正在使用VS2013上的SSE2指令,我意识到英特尔文档中的某些函数在它们应该在的标题中丢失了。

方法无效_mm_storeu_si32 (void* mem_addr, __m128i a)应该在#include <immintrin.h>但事实并非如此。我确实可以从这个标题访问其他方法,例如__m128d _mm_undefined_pd (void)

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

这怎么可能?

在旧的离线内部函数指南中,_mm_storeu_si32列在"其他"部分下。现在,在在线内部函数指南中,它列在 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 编译为相同的代码,但其他编译器可能会选择movd而不是movssstore_a和/或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