On Sun, Aug 23, 2015 at 18:32:51 -0700, Paolo Bonzini wrote: > > > On 23/08/2015 17:23, Emilio G. Cota wrote: > > + case INDEX_op_fence_load: > > + tcg_out_fence(s, 0xe8); > > + break; > > + case INDEX_op_fence_full: > > + tcg_out_fence(s, 0xf0); > > + break; > > + case INDEX_op_fence_store: > > + tcg_out_fence(s, 0xf8); > > + break; > > + > > lfence and sfence are not needed in generated code; all loads are > acquires and all stores are release on x86.
lfence and sfence here serve two purposes: 1) Template for other architectures 2) x86 code does sometimes have lfence/sfence (e.g. movntq+sfence), so I guessed they should remain in the translated code. If on x86 we always ignore the Write-Combining from the guest, maybe we could claim the l/sfence pair here is really unnecessary. I'm no x86 expert so for a first stab I decided to put them there. I didn't intend to translate say *all* PPC/ARM load barriers into lfences when generating x86, which is I think your point. > Also, on targets that do not have MFENCE you want to generate something > like "lock addl $0, (%esp)". Good point, will fix. Thanks, Emilio