On 07/07/2016 08:00 PM, Emilio G. Cota wrote:
On Fri, Jul 01, 2016 at 10:04:36 -0700, Richard Henderson wrote:
Force the use of cmpxchg16b on x86_64.
Wikipedia suggests that only very old AMD64 (circa 2004) did not have
this instruction. Further, it's required by Windows 8 so no new cpus
will ever omit it.
If we truely care about these, then we could check this at startup time
and then avoid executing paths that use it.
Signed-off-by: Richard Henderson <r...@twiddle.net>
---
configure | 29 ++++++++++++-
cputlb.c | 6 +++
include/qemu/int128.h | 6 +++
softmmu_template.h | 110 +++++++++++++++++++++++++++++++++++++-------------
tcg/tcg.h | 22 ++++++++++
5 files changed, 144 insertions(+), 29 deletions(-)
diff --git a/configure b/configure
index 59ea124..586abd6 100755
--- a/configure
+++ b/configure
@@ -1201,7 +1201,10 @@ case "$cpu" in
cc_i386='$(CC) -m32'
;;
x86_64)
- CPU_CFLAGS="-m64"
+ # ??? Only extremely old AMD cpus do not have cmpxchg16b.
+ # If we truly care, we should simply detect this case at
+ # runtime and generate the fallback to serial emulation.
+ CPU_CFLAGS="-m64 -mcx16"
...
if compile_prog "" "" ; then
atomic128=yes
+ elif compile_prog "-mcx16" "" ; then
+ QEMU_CFLAGS="$QEMU_CFLAGS -mcx16"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -mcx16"
+ atomic128=yes
Your change doesn't change anything. If the user gave -march=haswell, then
cx16 is enabled and the first test succeeds. If the user gave -march=k8, the
initial test would fail, but the second test would explicitly add cx16, and the
second test would succeed.
In all cases, cx16 gets enabled.
r~