我需要使用 intrincics 将一段代码转换为 SIMD。 所以我首先查看了当时非 SIMD 代码的反汇编。 我发现编译器似乎做了一些我不明白的技巧。
这是反汇编(抱歉无法复制粘贴,只能截图):
有人可以帮我解释一下吗? 我不明白这一行是如何编译的:
chk = x ^ (x<<1);
(x 是一个 32 位有符号整数。符号位与其右侧的位进行异或运算)
以及如何比较 <0 is done after that.
lea eax, [rcx + rcx]
正在做eax = ecx + ecx = 2 * ecx = ecx << 1
,这是你的x << 1
。
然后 xor eax, ecx
计算 x ^ (x << 1)
。 xor edx, 7FFFFFFFh
正如其所说。
最后 cmovns edx, ecx
有条件地撤消该 xor
。