C ++ SSE命令反转寄存器值

时间:2013-08-30 15:11:51

标签: c++ x86 sse simd

我有一个包含一些int值的数组(位置%2 = 0的那些是负数,而位置%2 = 1的那些是正数)。

我想从数组到寄存器的4步加载这些值,但我希望它们反转(正转换为负数,反之亦然)

__m128i v1;
for (int k = 0; k < limit; k += 4) {
        v1 = _mm_load_si128((__m128i *) & myArray[position + k]);
}

上面的SSE代码按原样将值加载到寄存器中:是否有命令采取v1并反转它?可以一步完成/命令吗?甚至可以加载从原始数组直接反转的值吗?

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:4)

假设您的整数元素是32位,那么您可以从0中减去,例如

v1 = _mm_load_si128(...);                   // load data
v1 = _mm_sub_epi32(_mm_set1_epi32(0), v1);  // negate all elements

答案 1 :(得分:2)

另一种方法是:

__m128i v1 = _mm_xor_si128(
    _mm_load_si128((__m128i *)&myArray[position + k]), 
    _mm_cmpeq_epi8(v1, v1)
);

基本上我们这样做:x ^ -1假设我们使用的是带有二进制补码的机器,所以-1是所有一个的序列......

请注意以下内容,其中~表示反转,^表示独占或。

~0 == 1 == (0 ^ 1)
~1 == 0 == (1 ^ 1)

_mm_cmpeq_epi8(a, a)会设置所有1,而你可以使用_mm_set1_epi32(-1),它实际上可能会更慢,因为它可能会生成内存访问,我建议分析性能是否有问题...