Questo non sembra proprio giusto anche se non sono sicuro del perché. consiglio sarebbe grande come la documentazione per CMPXCHG16B è piuttosto limitata (non possiedo tutti i manuali intel ...)CMPXCHG16B corretto?
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;
}
Quando si esegue con un esempio io sono sempre 0 quando dovrebbe essere 1. Tutte le idee ?
Grazie mille, ha senso. –
Ho copiato e incollato il codice e durante la compilazione con "g ++ - 4.7 -g -DDEBUG = 1 -std = C++ 0x -pthread dwcas.c -o dwcas.o -ldl -lpthread" Ricevo dwcas.c : 29: Errore: junk 'ptr 'dopo l'espressione. qualche idea perché? –
Dovrebbe essere semplicemente 'lock cmpxchg16b% 1'. La dimensione in questo caso non è necessaria poiché è implicita dall'istruzione 'cmpxchg16b'. L'uso di 'oword ptr 'mi suggerirebbe che stavi pensando che questo fosse _MASM_ assembler che non si assemblerebbe con l'assemblatore GNU. –