From 4f016b4824ab3d174e17ffd04bb1b9ed29687c09 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 3 Aug 2005 20:18:15 +0000 Subject: [PATCH] Add native atomic operations for s390. 2005-08-03 Matthias Clasen * glib/gatomic.c: Add native atomic operations for s390. * configure.in: ... and use them on s390. --- ChangeLog | 7 +++++++ ChangeLog.pre-2-10 | 7 +++++++ ChangeLog.pre-2-12 | 7 +++++++ ChangeLog.pre-2-8 | 7 +++++++ configure.in | 6 ++++++ glib/gatomic.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 76 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index cffcdeab3..4638d549a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-08-03 Matthias Clasen + + * glib/gatomic.c: Add native atomic operations + for s390. + + * configure.in: ... and use them on s390. + 2005-08-03 Ross Burton * glib/gstdio.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index cffcdeab3..4638d549a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +2005-08-03 Matthias Clasen + + * glib/gatomic.c: Add native atomic operations + for s390. + + * configure.in: ... and use them on s390. + 2005-08-03 Ross Burton * glib/gstdio.c: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index cffcdeab3..4638d549a 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,10 @@ +2005-08-03 Matthias Clasen + + * glib/gatomic.c: Add native atomic operations + for s390. + + * configure.in: ... and use them on s390. + 2005-08-03 Ross Burton * glib/gstdio.c: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index cffcdeab3..4638d549a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,10 @@ +2005-08-03 Matthias Clasen + + * glib/gatomic.c: Add native atomic operations + for s390. + + * configure.in: ... and use them on s390. + 2005-08-03 Ross Burton * glib/gstdio.c: diff --git a/configure.in b/configure.in index 0607164e8..562707a2b 100644 --- a/configure.in +++ b/configure.in @@ -1967,6 +1967,12 @@ if test x"$GCC" = xyes; then [ia64 atomic implementation]) glib_memory_barrier_needed=yes ;; + s390|s390x) + AC_MSG_RESULT([s390]) + AC_DEFINE_UNQUOTED(G_ATOMIC_S390, 1, + [s390 atomic implementation]) + glib_memory_barrier_needed=no + ;; *) AC_MSG_RESULT([none]) glib_memory_barrier_needed=yes diff --git a/glib/gatomic.c b/glib/gatomic.c index 2f4f9b00f..ad1f163bc 100644 --- a/glib/gatomic.c +++ b/glib/gatomic.c @@ -442,9 +442,49 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic, } # define G_ATOMIC_MEMORY_BARRIER __sync_synchronize () -# else /* !G_ATOMIC */ +# elif defined (G_ATOMIC_S390) +/* Adapted from glibc's sysdeps/s390/bits/atomic.h + */ +# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gint __result = oldval; \ + __asm__ __volatile__ ("cs %0, %2, %1" \ + : "+d" (__result), "=Q" (*(atomic)) \ + : "d" (newval), "m" (*(atomic)) : "cc" ); \ + __result == oldval; \ + }) + +# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (gpointer *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result = oldval; + __asm__ __volatile__ ("cs %0, %2, %1" + : "+d" (result), "=Q" (*(atomic)) + : "d" (newval), "m" (*(atomic)) : "cc" ); + result == oldval; +} +# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (gpointer *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result = oldval; + gpointer *a = atomic; + __asm__ __volatile__ ("csg %0, %2, %1" + : "+d" (result), "=Q" (*a) + : "d" ((long)(newval)), "m" (*a) : "cc" ); + result == oldval; +} +# else /* What's that */ +# error "Your system has an unsupported pointer size" +# endif /* GLIB_SIZEOF_VOID_P */ +# else /* !G_ATOMIC_IA64 */ # define DEFINE_WITH_MUTEXES -# endif /* G_ATOMIC */ +# endif /* G_ATOMIC_IA64 */ #else /* !__GNUC__ */ # ifdef G_PLATFORM_WIN32 # define DEFINE_WITH_WIN32_INTERLOCKED