ia32のCMPXCHG8B用にGCCインラインasmを作成しようとしています。いいえ、私は__sync_bool_compare_and_swap
を使用できません。 -fPICの有無にかかわらず動作する必要があります。GCCインラインアセンブリーでCMPXCHG8Bを32ビットでラップする正しい方法
これまでのところ、私がした最高(EDIT:詳細については、以下の私自身の答えを見、結局は動作しませんが)
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")
で、これは実際に正しいかどうか、私はよく分からないが。
PICのためにebx_valのために"b" ((int32)(set & 0xFFFFFFFF))
を実行できませんが、明らかにregister asm("ebx")
変数がコンパイラによって受け入れられます。
BONUS:RET変数が分岐に使用し、そのコードは次のように見て終わるさ:
cmpxchg8b [edi];
setz cl;
cmp cl, 0;
je foo;
それがなるように、出力オペランドを記述するためにどのように任意のアイデア:
cmpxchg8b [edi]
jz foo
?
ありがとうございます。
コンパイラ組み込み関数は-fPICでは動作しないという事実は、ちょうどフラットアウトコンパイラのバグ次のとおりです。http: //gcc.gnu.org/bugzilla/show_bug.cgi?id=37651 壊れたコンパイラを回避する必要がある場合は、そのバグのCCリストに載せたいと思うかもしれません。 – Crashworks
IA32で '-fPIC'を使用しますか?なぜ私は不思議です。 – Gabe
@Gabe - 共有ライブラリオブジェクトを書くときに最も重要です。 Ulrich Drepper氏は、このテーマに関する優れた論文を持っています。http://www.akkadia.org/drepper/dsohowto.pdf – Crashworks