diff mbox

[v2,10/27] tcg: Add atomic128 helpers

Message ID 20160708030028.GB28765@flamenco (mailing list archive)
State New, archived
Headers show

Commit Message

Emilio Cota July 8, 2016, 3 a.m. UTC
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 <rth@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"
>             LDFLAGS="-m64 $LDFLAGS"
>             cc_i386='$(CC) -m32'
>             ;;
> @@ -4434,6 +4437,26 @@ if compile_prog "" "" ; then
>      int128=yes
>  fi
>  
> +#########################################
> +# See if 128-bit atomic operations are supported.
> +
> +atomic128=no
> +if test "$int128" = "yes"; then
> +  cat > $TMPC << EOF
> +int main(void)
> +{
> +  unsigned __int128 x = 0, y = 0;
> +  y = __atomic_load_16(&x, 0);
> +  __atomic_store_16(&x, y, 0);
> +  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
> +  return 0;
> +}
> +EOF
> +  if compile_prog "" "" ; then
> +    atomic128=yes
> +  fi
> +fi

Would it be correct to just trust that gcc is doing the right thing?
As in this delta over the patch:

I might be missing other CFLAGS to be set, but the idea is that
if a program with __atomic[..]_16 links, then we should be OK.

This way we would handle correctly even those old AMD cpus,
and would also handle non-x86 architectures that implement
cmpxchg16.

		Emilio

Comments

Richard Henderson July 8, 2016, 5:26 a.m. UTC | #1
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 <rth@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~
diff mbox

Patch

--- a/configure
+++ b/configure
@@ -1201,10 +1201,7 @@  case "$cpu" in
            cc_i386='$(CC) -m32'
            ;;
     x86_64)
-           # ??? 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"
+           CPU_CFLAGS="-m64"
            LDFLAGS="-m64 $LDFLAGS"
            cc_i386='$(CC) -m32'
            ;;
@@ -4454,6 +4451,10 @@  int main(void)
 EOF
   if compile_prog "" "" ; then
     atomic128=yes
+  elif compile_prog "-mcx16" "" ; then
+    QEMU_CFLAGS="$QEMU_CFLAGS -mcx16"
+    EXTRA_CFLAGS="$EXTRA_CFLAGS -mcx16"
+    atomic128=yes
   fi
 fi