Trabalhando assembly embutido em C para paridade de bits?
Estou tentando calcular oparidade de bits de um grande número de uint64's. Por paridade de bits, quero dizer uma função que aceita um uint64 e gera 0 se o número de bits definidos for par e 1 caso contrário.
Atualmente, estou usando a seguinte função (por @Troyseph, encontradaaqui):
uint parity64(uint64 n){
n ^= n >> 1;
n ^= n >> 2;
n = (n & 0x1111111111111111) * 0x1111111111111111;
return (n >> 60) & 1;
}
A mesma página SO possui a seguinte rotina de montagem (por @papadp):
.code
; bool CheckParity(size_t Result)
CheckParity PROC
mov rax, 0
add rcx, 0
jnp jmp_over
mov rax, 1
jmp_over:
ret
CheckParity ENDP
END
que aproveita as vantagens da máquinabandeira de paridade. Mas não consigo fazê-lo funcionar com o meu programa C (sei quase sem montagem).
Pergunta, questão. Como posso incluir o código acima (ou semelhante) como assembly embutido no meu arquivo de origem C, para que oparity64()
função executa isso em vez disso?
(Estou usando o GCC com o Ubuntu 14 de 64 bits em um Intel Xeon Haswell)
Caso seja de alguma ajuda, oparity64()
A função é chamada dentro da seguinte rotina:
uint bindot(uint64* a, uint64* b, uint64 entries){
uint parity = 0;
for(uint i=0; i<entries; ++i)
parity ^= parity64(a[i] & b[i]); // Running sum!
return parity;
}
(Este deveria ser o "produto escalar" de dois vetores no campo Z / 2Z, também conhecido como GF (2).)