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

SSE Shift Instruction zeroes the vector with _mm_set1_epi32() for the count vector?

情况如下: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 位。 set1_epi32(32)(23<<32) | 23 这是一个巨大的数字,它移出了所有位。

SSE 移位使计数饱和(不同于屏蔽计数的标量移位)。

您希望 _mm_cvtsi32_si128(int) 将单个 int 零扩展为 __m128i,或者如果您的班次计数已经在vector 你需要将它隔离在一个 vector 的低 64 位中,使用 AND、shuffle 或其他任何东西。

movq xmm,xmm 可以将 64 位元素零扩展为 128,但对于 32 位元素没有等效项。