Inline Assembly невозможное ограничение в 'asm' - PullRequest
0 голосов
/ 12 октября 2018

Я использую g ++ версии 8.1.1 и Fedora Release 18 на процессоре Intel® Xeon® Platinum 8180 @ 2,50 ГГц

#if (__x86_64__ || __ppc64__)
    inline bool WideCAS(fat_pointer_rec<T> &old_value, 
        fat_pointer_rec<T> &new_value, std::memory_order morder) {
        bool ret;
        __asm__ __volatile__(
        "lock cmpxchg16b %1;\n"
        "sete %0;\n"
        :"=m"(ret),"+m" (*(volatile fat_pointer_rec<T> *) (&fat_p))
        :"a" (old_value.ptr), "d" (old_value.tag), "b" (new_value.ptr), "c" (new_value.tag));
        std::atomic_thread_fence(morder);
        return ret;
    }
#else
    inline bool WideCAS(fat_pointer_rec<T> &old_value, 
        fat_pointer_rec<T> &new_value, std::memory_order morder) {
        errexit("WCAS not supported with -m32.");
    }
#endif

Я получаю следующую ошибку.

./src/trackers/biptr.hpp: In member function ‘bool FatPtr<T>::WideCAS(fat_pointer_rec<T>&, fat_pointer_rec<T>&, std::memory_order) [with T = SortedUnorderedMapRange<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::Node]’:
./src/trackers/biptr.hpp:55:87: error: impossible constraint in ‘asm’
   :"a" (old_value.ptr), "d" (old_value.tag), "b" (new_value.ptr), "c" (new_value.tag));
                                                                                       ^
./src/trackers/biptr.hpp:55:87: error: non-memory input 2 must stay in memory
./src/trackers/biptr.hpp: In member function ‘bool FatPtr<T>::WideCAS(fat_pointer_rec<T>&, fat_pointer_rec<T>&, std::memory_order) [with T = NatarajanTreeRangeTracker<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::Node]’:
./src/trackers/biptr.hpp:55:87: error: impossible constraint in ‘asm’
./src/trackers/biptr.hpp:55:87: error: non-memory input 2 must stay in memory
make[1]: *** [/home/ajit/research/Interval-Based-Reclamation/Makefile:457: obj/release/src/main.o] Error 1
make[1]: Leaving directory '/home/ajit/research/Interval-Based-Reclamation'
make: *** [Makefile:337: default] Error 2

Есть идеи, как это исправить?

...