C++ C++;SSE命令反转寄存器值
我有一个数组,其中包含一些int值(位于[position%2=0]的是负值,[position%2=1]的是正值) 我希望以4步的方式将这些值从数组加载到寄存器,但我希望它们反转(正转换为负,反之亦然)C++ C++;SSE命令反转寄存器值,c++,x86,sse,simd,C++,X86,Sse,Simd,我有一个数组,其中包含一些int值(位于[position%2=0]的是负值,[position%2=1]的是正值) 我希望以4步的方式将这些值从数组加载到寄存器,但我希望它们反转(正转换为负,反之亦然) \uuuu m128i v1; 对于(int k=0;k
\uuuu m128i v1;
对于(int k=0;k
上述SSE代码按原样将值加载到寄存器中:是否有命令获取v1并将其反转?可以一步/一个命令完成吗?甚至可以直接加载与原始数组相反的值吗
任何帮助都将不胜感激。提前感谢。假设您的整数元素是32位,那么您可以从0中减去,例如
v1 = _mm_load_si128(...); // load data
v1 = _mm_sub_epi32(_mm_set1_epi32(0), v1); // negate all elements
另一种办法是:
__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)
\u-mm\u-cmpeq\u-epi8(a,a)
将设置所有1,而您可以使用\u-mm\u-set1\u-epi32(-1)
,它实际上可能会较慢,因为它可能会生成内存访问,如果性能有问题,我建议进行评测 如果你希望-1为1,2为-2,那么它被称为“否定”。反转是按位非,即反转值中的所有位,因此-1将变为0
~0 == 1 == (0 ^ 1)
~1 == 0 == (1 ^ 1)