Правильный способ обернуть CMPXCHG8B во встроенную сборку GCC, 32 бита

Я пытаюсь написать встроенный 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

?

Спасибо.

9
задан Laurynas Biveinis 21 July 2011 в 15:54
поделиться