X86: Use locked add rather than mfence

Java semantics for memory ordering can be satisfied using
  lock addl $0,0(SP)
rather than mfence.  The locked add synchronizes the memory caches, but
doesn't affect device memory.

Timing on a micro benchmark with a mfence or lock add $0,0(sp) in a loop
with 600000000 iterations:
time ./mfence
real    0m5.411s
user    0m5.408s
sys     0m0.000s

time ./locked_add
real    0m3.552s
user    0m3.550s
sys     0m0.000s

Implement this as an instruction-set-feature lock_add.  This is off by
default (uses mfence), and enabled for atom & silvermont variants.
Generation of mfence can be forced by a parameter to MemoryFence.

Change-Id: I5cb4fded61f4cbbd7b7db42a1b6902e43e458911
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
14 files changed