Я только что провел некоторую отладку с проверкой памяти с помощью 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. Есть идеи?

Ответы на вопрос(2)

Ваш ответ на вопрос