Como as cercas atomizam as operações load-modify-store?
Eu li, colocando uma instrução de cerca depois que um load-modify-store, como o BTS, faz você tratar o segundo atomic. Mas, de acordo com a documentação da Intel, as instruções da cerca são descritas como
(MFENCE)
Executa uma operação de serialização em todas as instruções de carga da memória e de armazenamento na memória que foram emitidas antes da instrução MFENCE. Essa operação de serialização garante que todas as instruções de carga e armazenamento que precedem a instrução MFENCE na ordem do programa sejam globalmente visíveis antes de qualquer instrução load ou store que siga a instrução MFENCE.
Então, como esse comportamento garante a "atomicidade" mencionada?
Especificamente, se tivermos duas execuções simultâneas do código a seguir executadas por processadores distintos, como a barreira impediria a leitura de 0 em CF nos dois casos?
start memory assumption: [addr] contains the word 0
BTS WORD PTR [addr], 0
MFENCE