Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;SSE命令反转寄存器值_C++_X86_Sse_Simd - Fatal编程技术网

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

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

我有一个数组,其中包含一些int值(位于[position%2=0]的是负值,[position%2=1]的是正值)

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

\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)