¿Trabaja el ensamblaje en línea en C para la paridad de bits?

Estoy tratando de calcular elparidad de bits de una gran cantidad de uint64's. Por paridad de bits me refiero a una función que acepta un uint64 y genera 0 si el número de bits establecidos es par, y 1 en caso contrario.

Actualmente estoy usando la siguiente función (por @Troyseph, encontradoaquí):

uint parity64(uint64 n){
  n ^= n >> 1;
  n ^= n >> 2;
  n = (n & 0x1111111111111111) * 0x1111111111111111;
  return (n >> 60) & 1;
}

La misma página SO tiene la siguiente rutina de ensamblaje (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 aprovecha la máquinabandera de paridad. Pero no puedo hacer que funcione con mi programa C (sé que casi no hay ensamblado).

Pregunta. ¿Cómo puedo incluir el código anterior (o similar) como ensamblaje en línea en mi archivo fuente C, para que elparity64() ¿funciona esa función en su lugar?

(Estoy usando GCC con Ubuntu 14 de 64 bits en un Intel Xeon Haswell)

En caso de que sea de alguna ayuda, elparity64() La función se llama dentro de la siguiente rutina:

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;
}

(Se supone que este es el "producto punto" de dos vectores sobre el campo Z / 2Z, también conocido como GF (2)).

Respuestas a la pregunta(4)

Su respuesta a la pregunta