# HG changeset patch # User andy simpson # Date 1276612354 -3600 # Node ID f27f6b44bd0da825bb3e7bf2c1e7b3a02c04020f # Parent 2d6a1d6b6e59b688136db64771508c42c7bc4015 Bug 2971 GCCE fixes : "impossible constraint in 'asm'" fix ported over from CompilerCompatibility branch (see also Bug 1805) diff -r 2d6a1d6b6e59 -r f27f6b44bd0d glib/glib/gatomic.c --- a/glib/glib/gatomic.c Fri Jun 11 16:28:56 2010 +0100 +++ b/glib/glib/gatomic.c Tue Jun 15 15:32:34 2010 +0100 @@ -40,7 +40,44 @@ #if defined (__GNUC__) -# if defined (G_ATOMIC_I486) +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) + +/* Test for GCC > 4.4.0 */ +# if (GCC_VERSION > 40400) + +EXPORT_C gint +g_atomic_int_exchange_and_add (volatile gint *atomic, + gint val) +{ + return __sync_fetch_and_add(atomic, val); +} + +EXPORT_C void +g_atomic_int_add (volatile gint *atomic, + gint val) +{ + __sync_fetch_and_add(atomic, val); +} + +EXPORT_C gboolean +g_atomic_int_compare_and_exchange (volatile gint *atomic, + gint oldval, + gint newval) +{ + return __sync_val_compare_and_swap(atomic, oldval, newval); +} + +EXPORT_C gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic, + gpointer oldval, + gpointer newval) +{ + return __sync_val_compare_and_swap(atomic, oldval, newval); +} + +#elif defined (G_ATOMIC_I486) /* Adapted from CVS version 1.10 of glibc's sysdeps/i386/i486/bits/atomic.h */ EXPORT_C gint