Я только что провел некоторую отладку с проверкой памяти с помощью gdb. Там указаны правильные значения. Поэтому я думаю, что это должно быть проблемой с моей процедурой print_dlong. Не стесняйтесь исправить это. Я оставляю этот ответ, поскольку он должен быть исправлен, так как исправленная версия этого будет поучительной для операции cas с печатными результатами.
е совсем верно, хотя я не уверен, почему. Совет был бы отличным, так как документация для CMPXCHG16B довольно минимальна (у меня нет никаких руководств по Intel ...)
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;
}
При работе с примером я получаю 0, когда оно должно быть 1. Есть идеи?