SSE内在函数 - _mm_and_ps奇怪的行为

时间:2017-12-27 11:43:03

标签: c++ sse

以下代码:

__m128 a   = _mm_setr_ps( 1, 2, 3, 4 );
__m128 b   = _mm_set1_ps( 2 );
__m128 res = _mm_and_ps( a, b );
cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << endl;
cout << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << endl;
cout << res[0] << " " << res[1] << " " << res[2] << " " << res[3] << endl;
cout<<endl;
cout << ( 1 & 2 ) << " " << ( 2 & 2 ) << " " << ( 3 & 2 ) << " " << ( 4 & 2 ) << endl;

结果:

1 2 3 4
2 2 2 2
0 2 2 2

0 2 2 0

SSE操作的结果不应该是0 2 2 0,因为2 = 010, 4 = 100 => 2&4 = 0 根据文件:

  

__ m128 _mm_and_ps(__ m128 a,__ m128 b)

     

计算a和b的四个SP FP值的按位AND。

     

R0 R1 R2 R3

     

a0&amp; b0 a1&amp; b1 a2&amp; b2 a3&amp; B3

1 个答案:

答案 0 :(得分:4)

我找到的documentation说:

  

计算a和b的四个单精度,浮点值的按位AND。

(我的重点)

2和4将具有相同的尾数(0,加上隐含的前导1位),以及分别为128和129的指数。按位和那些是零尾数,指数为128(== 2.0)。

修改

如果要进行逐位AND非负整数,可以添加偏移量。如果使用偏移量8388608(== 1&lt;&lt; 23),则可以按照预期在0..8388607上进行按位操作。

const float offset=8388608;
__m128 mm_offset = _mm_set1_ps();
__m128 a   = _mm_setr_ps( 1, 2, 3, 4 );
a =_mm_add_ps(mm_offset,a);
__m128 b   = _mm_set1_ps( 2+offset );
__m128 res = _mm_and_ps( a, b );
res = _mm_sub_ps(res,mm_offset);