我有一个包含一些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并反转它?可以一步完成/命令吗?甚至可以加载从原始数组直接反转的值吗?
任何帮助将不胜感激。提前谢谢。
答案 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)
,它实际上可能会更慢,因为它可能会生成内存访问,我建议分析性能是否有问题...