Я пытаюсь написать встроенный asm GCC для CMPXCHG8B для ia32. Нет, я не могу использовать __ sync_bool_compare_and_swap
. Он должен работать как с -fPIC, так и без него.
Пока что лучшее, что я ' ve ( РЕДАКТИРОВАТЬ : все-таки не работает, см. мой собственный ответ bel (подробнее)
register int32 ebx_val asm("ebx")= set & 0xFFFFFFFF;
asm ("lock; cmpxchg8b %0;"
"setz %1;"
: "+m" (*a), "=q" (ret), "+A" (*cmp)
: "r" (ebx_val), "c" ((int32)(set >> 32))
: "flags")
Однако я не уверен, что это на самом деле правильно.
Я не могу выполнить «b» ((int32) (set & 0xFFFFFFFF))
для ebx_val из-за PIC, но очевидно register asm ("ebx")
переменная принимается компилятором.
БОНУС : переменная ret используется для ветвления, поэтому код в конечном итоге выглядит следующим образом:
cmpxchg8b [edi];
setz cl;
cmp cl, 0;
je foo;
Есть идеи, как описать выходные операнды так, чтобы они выглядели так:
cmpxchg8b [edi]
jz foo
?
Спасибо.