1

开始讨论,_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 的示例吗?谢谢!

4

1 回答 1

2

_mm_mul_epu32当操作数应被视为无符号整数时使用,_mm_mul_epi32否则使用。

在 32 位 -> 64 位乘法中,将操作数视为无符号或有符号会产生不同的结果,因此有单独的指令。add、sub 和 mov 不需要单独的指令。没有单独的__m128u类型。只需使用__m128i并记住它包含无符号数字。

于 2013-10-25T08:10:27.920 回答