3

+ 比較cmplに相当する命令です。movlもしそうなら、白黒の違いは何ですか: (1)

LBB1_2:    
     cmpl $0, _data_ready(%rip)
     je LBB1_2

および: (2)

LBB1_2:
    movl    _data_ready(%rip), %eax
    testl %eax, %eax
    je LBB1_2

(1)はwhile (!data_ready);、data_ready がある場所に対して生成されます。volatile int data_ready = 0x0;

(2)はwhile (!data_ready.load(std::memory_order_acquire));、data_ready の場所に対して生成されます。std::atomic<int> data_ready(0x0);

どちらの場合も、data_ready は別のスレッドによって 1 に設定されます。Intelmovlは、アラインされたメモリ アクセスに対してアトミックであることを保証しており、アトミックであるようにも思われcmplます。その場合、clang が異なるコードを生成するのはなぜですか? (正当な理由があると確信しているので、私は尋ねています)

また、これは volatile 変数が x86-64 プラットフォームの std::atomic と「同等」であることを意味しますか (これはもちろん何も意味せず、C++ 標準では保証されません)。

これを生成するコードは、この github リポジトリで入手できます

4

1 に答える 1

0

命令はその命令をtestビットごとに実行しAND、その結果に基づいてフラグを設定しますAND(ただし、andそれ自体の結果は破棄されます)。

cmp、フラグを設定するためだけに操作を行う点で似ていますが、ビットごとの代わりに減算を行いANDます。

volatileこの操作は、(もしあれば) orとはあまり関係がありませんatomic。これらのいずれかがコード生成に影響を与える範囲で、その影響は使用されるアドレッシング モードに影響します。つまり、最初のモードでは即値とメモリ内の値を直接比較しますが、2 番目のモードではロードを実行してから値を操作します。レジスターで。

于 2015-02-16T00:11:43.317 に答える