Esto no parece exactamente correcto aunque no estoy seguro de por qué. consejo sería grande como la documentación para CMPXCHG16B es bastante escaso (No soy dueño de todos los manuales de inteligencia ...)CMPXCHG16B ¿correcto?
template<>
inline bool cas(volatile types::uint128_t *src, types::uint128_t cmp, types::uint128_t with)
{
/*
Description:
The CMPXCHG16B instruction compares the 128-bit value in the RDX:RAX and RCX:RBX registers
with a 128-bit memory location. If the values are equal, the zero flag (ZF) is set,
and the RCX:RBX value is copied to the memory location.
Otherwise, the ZF flag is cleared, and the memory value is copied to RDX:RAX.
*/
uint64_t * cmpP = (uint64_t*)&cmp;
uint64_t * withP = (uint64_t*)&with;
unsigned char result = 0;
__asm__ __volatile__ (
"LOCK; CMPXCHG16B %1\n\t"
"SETZ %b0\n\t"
: "=q"(result) /* output */
: "m"(*src), /* input */
//what to compare against
"rax"(((uint64_t) (cmpP[1]))), //lower bits
"rdx"(((uint64_t) (cmpP[0]))),//upper bits
//what to replace it with if it was equal
"rbx"(((uint64_t) (withP[1]))), //lower bits
"rcx"(((uint64_t) (withP[0])))//upper bits
: "memory", "cc", "rax", "rdx", "rbx","rcx" /* clobbered items */
);
return result;
}
Cuando se ejecuta con un ejemplo que estoy recibiendo 0 cuando debería ser 1. Todas las ideas ?
Muchas gracias, tiene sentido. –
He copiado y pegado tu código, y al compilar con "g ++ - 4.7 -g -DDEBUG = 1 -std = C++ 0x -pthread dwcas.c -o dwcas.o -ldl -lpthread" Obtengo dwcas.c : 29: Error: basura 'ptr 'después de la expresión. alguna idea ¿por qué? –
Simplemente debería ser 'lock cmpxchg16b% 1'. El tamaño en este caso no es necesario ya que está implícito en la instrucción 'cmpxchg16b'. El uso de 'oword ptr' me sugiere que crees que se trata de un ensamblador deMASM_ que no se ensamblará con el ensamblador de GNU. –