考虑以下代码
typedef unsigned uint;
uint parity( uint64_t x )
{
uint32_t v = x ^ (x >> 32);
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
v ^= v >> 2;
return (uint)(v ^ (v >> 1)) & 1;
}由于Intelx86-64机器上的指令级并行,有没有办法从根本上重新组织这段代码,以获得显著的改进?
GCC生成了以下代码
parity(unsigned long):
mov rax, rdi
shr rax, 32
xor eax, edi
mov edi, eax
shr edi, 16
xor eax, edi
mov edi, eax
shr edi, 8
xor eax, edi
mov edi, eax
shr edi, 4
xor eax, edi
mov edi, eax
shr edi, 2
xor eax, edi
mov edx, eax
shr eax
xor eax, edx
and eax, 1
ret发布于 2017-02-05 15:35:44
在32位的世界里,我会直接用汇编语言编写,比如test eax,eax,然后是SETPO EAX。
UPDATE 2017-02-06:@EOF是对的,test命令仅根据低字节设置奇偶校验位。
https://stackoverflow.com/questions/42049503
复制相似问题