2012-03-13 3 views
1

インラインアセンブリで64ビット(C++のロングタイプ)カウンタをアトミックにインクリメントしたいと思います。私は32ビット値(int)でそれを行う方法を知っています:インラインアセンブラインクリメント64ビットカウンタ

asm volatile("lock; incl %0" : "=m" (val) : "m"(val)); 

しかし、私は長い値でそれを実行する方法がありません。

+2

32ビットまたは64ビットコード? –

+0

そして、どのCPUのために?一部には[cmpxchg8b](http://www.niallryan.com/node/137)がありますが、すべてではありません。 –

+0

icore7-avxの64ビットコード – Dejwi

答えて

2

は、それは非常に簡単でしたが、私はx86-64のに慣れていなかった質問からの回答に

を、自己の答えを移動しました。

asm volatile("lock; incq %0" : "=m" (val) : "m"(val)); 
0

されるべきであること:誤って最適化される

val = something; 
asm volatile("lock; incq %0" : "=m" (val) : "m"(val)); 

:のような同じ場所に入力を強制的に制約することなく別のオペランドを指定

asm volatile("lock; incq %0" : "+m" (val)); 

が出力コードにつながる可能性として。また、asmを越えて移動される他の変数へのアクセスを防ぐために、メモリクローバーが必要な場合もあります。