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 位元素没有等效项。
情况如下: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 位元素没有等效项。