开始讨论时,_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这样的set指令。如本例所示:4个32位整数的SSE乘法,最佳答案如下:
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的示例吗?谢谢!
使用_mm_mul_epu32
时,操作数应被视为无符号整数,和_mm_mul_epi32
其他。
在32位-> 64位乘法中,将操作数视为无符号或有符号会产生不同的结果,因此有单独的指令。Add,sub和mov不需要单独的说明。没有单独的__m128u
类型。只需使用__m128i
并记住它包含无符号数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句