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

questionAnswers(4)

yourAnswerToTheQuestion