从__m128转换为__m128i会导致错误的值

Converting from __m128 to __m128i results in wrong value

本文关键字:错误 m128i m128 转换      更新时间:2023-10-16

我需要将浮点向量(__m128)转换为整数向量(__m128i),我使用的是_mm_cvtps_epi32,但我没有得到预期的值。下面是一个非常简单的例子:

__m128 test = _mm_set1_ps(4.5f);
__m128i test_i = _mm_cvtps_epi32(test);

调试器输出:

(lldb) po test
 ([0] = 4.5, [1] = 4.5, [2] = 4.5, [3] = 4.5)
(lldb) po test_i
 ([0] = 17179869188, [1] = 17179869188)
(lldb) 

可以看到,得到的整数是…17179869188 ?从4.5吗?为什么只有两个值?_mm_cvtps_epi32应将4个打包的32位浮点值转换为4个打包的32位整数。

Debugger,在这个例子中,将__m128i值解释为两个64位整数,而不是您期望的四个32位整数。实际转换是正确的。

在您的代码中,您需要显式地指定如何解释SIMD值,例如:test_i.m128i_i32[0]