如何将四个 32 位整数乘以另外 4 个整数?我没有找到任何可以做到这一点的指令。
问问题
14081 次
2 回答
25
如果您需要有符号的 32x32 位整数乘法,那么software.intel.com上的以下示例看起来应该可以满足您的需求:
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 */
}
您可能希望有两个构建 - 一个用于旧 CPU,一个用于最近的 CPU,在这种情况下,您可以执行以下操作:
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
#ifdef __SSE4_1__ // modern CPU - use SSE 4.1
return _mm_mullo_epi32(a, b);
#else // old CPU - use SSE 2
__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 */
#endif
}
于 2012-05-08T15:19:23.873 回答
8
来自 SSE 4.1 的PMULLD就是这样做的。
描述有点误导,它谈论有符号乘法,但由于它只存储低 32 位,它实际上是一个可以用于两者的符号忽略指令,就像IMUL
.
于 2012-05-08T14:42:16.120 回答