在这种情况下:m3 = _mm_srli_epi32(m2, 23);
确实完成了预期的工作,
m3 = _mm_srl_epi32(m2, shift);
(将shift
初始化为__m128i shift = _mm_set1_epi32(23);
)产生零。
我已经检查过,shift
确实具有应有的值。我可能会缺少一些简单的东西吗?
答案 0 :(得分:2)
_mm_srl_epi32 (__m128i a, __m128i count)
将计数作为计数向量的低 64 位。 set1_epi32(32)
是(23<<32) | 23
,这是一个很大的数字,会将所有位移出。
SSE移位会使计数饱和(与掩盖计数的标量移位不同)。
您希望_mm_cvtsi32_si128(int)
零扩展单个int
到__m128i
,或者如果移位计数已经在矢量中,则需要隔离并使用AND,随机播放或其他方式将其置于向量的低64位。
movq xmm,xmm
可以将64位元素零扩展到128,但是32位元素没有等效项。