SSE移位指令使用_mm_set1_epi32()将计数向量归零吗?

时间:2019-11-16 20:44:09

标签: sse simd

在这种情况下:m3 = _mm_srli_epi32(m2, 23);确实完成了预期的工作,

m3 = _mm_srl_epi32(m2, shift);(将shift初始化为__m128i shift = _mm_set1_epi32(23);)产生零。

我已经检查过,shift确实具有应有的值。我可能会缺少一些简单的东西吗?

1 个答案:

答案 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位元素没有等效项。