All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.