开始讨论,_mm_mul_epu32 和 _mm_mul_epi32 之间的基本区别是:
_mm_mul_epu32在 SSE2 中可用,并获取并生成无符号整数(32 位 -> 64 位)
_mm_mul_epi32在 SSE4.1 中可用,并获取并生成有符号整数(32 位 -> 64 位)
我不明白的是在什么情况下应该使用_mm_mul_epu32?似乎没有像 _mm_set[1]_epi32 这样的设置指令。就像在这个例子中:SSE multiplication of 4 32-bit integers,最好的答案是这样写的:
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
}
_mm_mul_epu32 与 _epi32 指令一起使用。忽略有符号整数和无符号整数之间的区别不是很危险吗?
有人可以提供一个可以安全使用 _mm_mul_epu32 的示例吗?谢谢!