qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] meson: move int128 checks from configure
@ 2022-02-28 20:00 marcandre.lureau
  2022-02-28 20:00 ` [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check marcandre.lureau
  2022-02-28 21:19 ` [PATCH v2 1/2] meson: move int128 checks from configure Richard Henderson
  0 siblings, 2 replies; 5+ messages in thread
From: marcandre.lureau @ 2022-02-28 20:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: pbonzini, richard.henderson, philippe.mathieu.daude,
	Marc-André Lureau, peter.maydell

From: Marc-André Lureau <marcandre.lureau@redhat.com>

(note: the test isn't working as intended, the next patches fixes it)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 configure   | 47 -----------------------------------------------
 meson.build | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 47 deletions(-)

diff --git a/configure b/configure
index c56ed53ee365..66315835a663 100755
--- a/configure
+++ b/configure
@@ -2452,41 +2452,6 @@ 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(&x, 0);
-  __atomic_store(&x, y, 0);
-  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
-  return 0;
-}
-EOF
-  if compile_prog "" "" ; then
-    atomic128=yes
-  fi
-fi
-
-cmpxchg128=no
-if test "$int128" = yes && test "$atomic128" = no; then
-  cat > $TMPC << EOF
-int main(void)
-{
-  unsigned __int128 x = 0, y = 0;
-  __sync_val_compare_and_swap_16(&x, y, x);
-  return 0;
-}
-EOF
-  if compile_prog "" "" ; then
-    cmpxchg128=yes
-  fi
-fi
-
 ########################################
 # check if ccache is interfering with
 # semantic analysis of macros
@@ -2930,18 +2895,6 @@ if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
     echo "CONFIG_TSAN=y" >> $config_host_mak
 fi
 
-if test "$int128" = "yes" ; then
-  echo "CONFIG_INT128=y" >> $config_host_mak
-fi
-
-if test "$atomic128" = "yes" ; then
-  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
-fi
-
-if test "$cmpxchg128" = "yes" ; then
-  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
-fi
-
 if test "$rdma" = "yes" ; then
   echo "CONFIG_RDMA=y" >> $config_host_mak
   echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
diff --git a/meson.build b/meson.build
index 2ed1d97c97ab..a9ec3974bc67 100644
--- a/meson.build
+++ b/meson.build
@@ -1824,6 +1824,45 @@ config_host_data.set('CONFIG_ATOMIC64', cc.links('''
     return 0;
   }'''))
 
+has_int128 = cc.links('''
+  __int128_t a;
+  __uint128_t b;
+  int main (void) {
+    a = a + b;
+    b = a * b;
+    a = a * a;
+    return 0;
+  }''')
+
+config_host_data.set('CONFIG_INT128', has_int128)
+
+if has_int128
+  has_atomic128 = cc.links('''
+    int main(void)
+    {
+      unsigned __int128 x = 0, y = 0;
+      y = __atomic_load(&x, 0);
+      __atomic_store(&x, y, 0);
+      __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
+      return 0;
+    }''')
+
+  config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
+
+  if not has_atomic128
+    has_cmpxchg128 = cc.links('''
+      int main(void)
+      {
+        unsigned __int128 x = 0, y = 0;
+        __sync_val_compare_and_swap_16(&x, y, x);
+        return 0;
+      }
+    ''')
+
+    config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128)
+  endif
+endif
+
 config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
   #include <sys/auxv.h>
   int main(void) {
-- 
2.35.1.273.ge6ebfd0e8cbb



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check
  2022-02-28 20:00 [PATCH v2 1/2] meson: move int128 checks from configure marcandre.lureau
@ 2022-02-28 20:00 ` marcandre.lureau
  2022-02-28 21:20   ` Richard Henderson
  2022-02-28 23:12   ` Philippe Mathieu-Daudé
  2022-02-28 21:19 ` [PATCH v2 1/2] meson: move int128 checks from configure Richard Henderson
  1 sibling, 2 replies; 5+ messages in thread
From: marcandre.lureau @ 2022-02-28 20:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: pbonzini, richard.henderson, philippe.mathieu.daude,
	Marc-André Lureau, peter.maydell

From: Marc-André Lureau <marcandre.lureau@redhat.com>

The current testing code isn't correct and matching QEMU usage:

testfile.c: In function 'main':
testfile.c:5:11: error: incorrect number of arguments to function '__atomic_load'
    5 |       y = __atomic_load(&x, 0);
      |           ^~~~~~~~~~~~~
testfile.c:6:7: error: argument 2 of '__atomic_store' must be a pointer type
    6 |       __atomic_store(&x, y, 0);
      |       ^~~~~~~~~~~~~~
testfile.c:7:7: error: argument 3 of '__atomic_compare_exchange' must be a pointer type
    7 |       __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~

Replace the test with common atomics test for u64 and u128 that matches
better QEMU needs.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 meson.build | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/meson.build b/meson.build
index a9ec3974bc67..893eaa8ff971 100644
--- a/meson.build
+++ b/meson.build
@@ -1808,21 +1808,23 @@ config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
         return printf("%zu", SIZE_MAX);
     }''', args: ['-Werror']))
 
-# See if 64-bit atomic operations are supported.
-# Note that without __atomic builtins, we can only
-# assume atomic loads/stores max at pointer size.
-config_host_data.set('CONFIG_ATOMIC64', cc.links('''
+atomic_test = '''
   #include <stdint.h>
   int main(void)
   {
-    uint64_t x = 0, y = 0;
+    @0@ x = 0, y = 0;
     y = __atomic_load_n(&x, __ATOMIC_RELAXED);
     __atomic_store_n(&x, y, __ATOMIC_RELAXED);
     __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
     __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
     __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
     return 0;
-  }'''))
+  }'''
+
+# See if 64-bit atomic operations are supported.
+# Note that without __atomic builtins, we can only
+# assume atomic loads/stores max at pointer size.
+config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
 
 has_int128 = cc.links('''
   __int128_t a;
@@ -1837,15 +1839,10 @@ has_int128 = cc.links('''
 config_host_data.set('CONFIG_INT128', has_int128)
 
 if has_int128
-  has_atomic128 = cc.links('''
-    int main(void)
-    {
-      unsigned __int128 x = 0, y = 0;
-      y = __atomic_load(&x, 0);
-      __atomic_store(&x, y, 0);
-      __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
-      return 0;
-    }''')
+  # "do we have 128-bit atomics which are handled inline and specifically not
+  # via libatomic". The reason we can't use libatomic is documented in the
+  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
+  has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))
 
   config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
 
-- 
2.35.1.273.ge6ebfd0e8cbb



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] meson: move int128 checks from configure
  2022-02-28 20:00 [PATCH v2 1/2] meson: move int128 checks from configure marcandre.lureau
  2022-02-28 20:00 ` [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check marcandre.lureau
@ 2022-02-28 21:19 ` Richard Henderson
  1 sibling, 0 replies; 5+ messages in thread
From: Richard Henderson @ 2022-02-28 21:19 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel
  Cc: pbonzini, philippe.mathieu.daude, peter.maydell

On 2/28/22 10:00, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau<marcandre.lureau@redhat.com>
> 
> (note: the test isn't working as intended, the next patches fixes it)
> 
> Signed-off-by: Marc-André Lureau<marcandre.lureau@redhat.com>
> ---
>   configure   | 47 -----------------------------------------------
>   meson.build | 39 +++++++++++++++++++++++++++++++++++++++
>   2 files changed, 39 insertions(+), 47 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check
  2022-02-28 20:00 ` [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check marcandre.lureau
@ 2022-02-28 21:20   ` Richard Henderson
  2022-02-28 23:12   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 5+ messages in thread
From: Richard Henderson @ 2022-02-28 21:20 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel
  Cc: pbonzini, philippe.mathieu.daude, peter.maydell

On 2/28/22 10:00, marcandre.lureau@redhat.com wrote:
> -# See if 64-bit atomic operations are supported.
> -# Note that without __atomic builtins, we can only
> -# assume atomic loads/stores max at pointer size.
> -config_host_data.set('CONFIG_ATOMIC64', cc.links('''
> +atomic_test = '''
>     #include <stdint.h>
>     int main(void)
>     {
> -    uint64_t x = 0, y = 0;
> +    @0@ x = 0, y = 0;
>       y = __atomic_load_n(&x, __ATOMIC_RELAXED);
>       __atomic_store_n(&x, y, __ATOMIC_RELAXED);
>       __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
>       __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
>       __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
>       return 0;
> -  }'''))
> +  }'''
> +
> +# See if 64-bit atomic operations are supported.
> +# Note that without __atomic builtins, we can only
> +# assume atomic loads/stores max at pointer size.
> +config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
>   
>   has_int128 = cc.links('''
>     __int128_t a;
> @@ -1837,15 +1839,10 @@ has_int128 = cc.links('''
>   config_host_data.set('CONFIG_INT128', has_int128)
>   
>   if has_int128
> -  has_atomic128 = cc.links('''
> -    int main(void)
> -    {
> -      unsigned __int128 x = 0, y = 0;
> -      y = __atomic_load(&x, 0);
> -      __atomic_store(&x, y, 0);
> -      __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
> -      return 0;
> -    }''')
> +  # "do we have 128-bit atomics which are handled inline and specifically not
> +  # via libatomic". The reason we can't use libatomic is documented in the
> +  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
> +  has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))

Nice fix.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check
  2022-02-28 20:00 ` [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check marcandre.lureau
  2022-02-28 21:20   ` Richard Henderson
@ 2022-02-28 23:12   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-02-28 23:12 UTC (permalink / raw)
  To: marcandre.lureau, qemu-devel; +Cc: pbonzini, richard.henderson, peter.maydell

On 28/2/22 21:00, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> The current testing code isn't correct and matching QEMU usage:
> 
> testfile.c: In function 'main':
> testfile.c:5:11: error: incorrect number of arguments to function '__atomic_load'
>      5 |       y = __atomic_load(&x, 0);
>        |           ^~~~~~~~~~~~~
> testfile.c:6:7: error: argument 2 of '__atomic_store' must be a pointer type
>      6 |       __atomic_store(&x, y, 0);
>        |       ^~~~~~~~~~~~~~
> testfile.c:7:7: error: argument 3 of '__atomic_compare_exchange' must be a pointer type
>      7 |       __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
>        |       ^~~~~~~~~~~~~~~~~~~~~~~~~
> 
> Replace the test with common atomics test for u64 and u128 that matches
> better QEMU needs.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   meson.build | 27 ++++++++++++---------------
>   1 file changed, 12 insertions(+), 15 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-02-28 23:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-28 20:00 [PATCH v2 1/2] meson: move int128 checks from configure marcandre.lureau
2022-02-28 20:00 ` [PATCH v2 2/2] meson: fix CONFIG_ATOMIC128 check marcandre.lureau
2022-02-28 21:20   ` Richard Henderson
2022-02-28 23:12   ` Philippe Mathieu-Daudé
2022-02-28 21:19 ` [PATCH v2 1/2] meson: move int128 checks from configure Richard Henderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).