
Peter Dimov wrote:
#LoadLoad means that loads that precede the barrier cannot be reordered with loads that follow the barrier.
I.e. a instruction sequence load(A) #LoadLoad load(B) cannot be executed by the processor as load(B) load(A) but nothing prevents the processor from executing the sequence load(A) #LoadLoad store(B) as store(B) load(A) right? Then load(A) load(B) #LoadLoad | #LoadStore store(C) cannot be reordered as load(B) store(C) load(A) Yes? But in the acquire/release world load(A) load(B).acquire store(C) can be reordered as load(B) store(C) load(A) or I am wrong in this assumption? If I am not wrong, In which respect is your example then an emulation of acquire semantics. If I a wrong, what I am missing?
The four basic primitives can be combined freely, so for example #LoadLoad | #LoadStore means that preceding loads cannot be reordered with subsequent loads or stores.
I see, thank you. Roland