这里是情况:m3 = _mm_srli_epi32(m2, 23);
完全符合预期,
[m3 = _mm_srl_epi32(m2, shift);
但是(shift
初始化为__m128i shift = _mm_set1_epi32(23);
)产生零。
我已经检查过,shift
确实具有应有的值。我可能会缺少一些简单的东西吗?
_mm_srl_epi32 (__m128i a, __m128i count)
”将计数作为计数向量的低64位。 _mm_srl_epi32 (__m128i a, __m128i count)
是set1_epi32(32)
,它是移出所有位的巨大数字。
SSE移位会使计数饱和(与掩盖计数的标量移位不同)。
您希望(23<<32) | 23
将单个_mm_cvtsi32_si128(int)
零扩展为int
,或者,如果移位计数已经在向量中,则需要将其隔离在向量的低64位中, AND,随机播放或其他内容。
[__m128i
可以将64位元素零扩展为128,但是32位元素没有等效项。