From 6c4c396ddd1bf3b3980b5cef0ad4c7bd0d017237 Mon Sep 17 00:00:00 2001 From: Andreas Fredriksson Date: Sat, 9 Feb 2013 20:11:04 -0800 Subject: [PATCH] Prefer __sync_bool_compare_and_swap() over PPC inline asm. Debian's GCC 4.4 in particular does not compile the PPC assembly. --- configure.in | 16 ++++++++++++++++ include/private/gc_locks.h | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/configure.in b/configure.in index be6f6d42..837e2cb9 100644 --- a/configure.in +++ b/configure.in @@ -217,6 +217,22 @@ case "$host" in esac AM_CONDITIONAL(POWERPC_DARWIN,test x$powerpc_darwin = xtrue) +# Check if the GCC builtin __sync_bool_compare_and_swap is available. +# It is preferred in gc_locks.h for PPC as GCC 4.4 has a problem with the inline assembly there. +AC_MSG_CHECKING(for __sync_bool_compare_and_swap) +AC_TRY_COMPILE([],[ +volatile unsigned int foo = 0; +int main(int argc, char** argv) { + unsigned int r1 = __sync_bool_compare_and_swap(&foo, 0, 1); + return 0; +} +], [ +AC_MSG_RESULT(yes) +AC_DEFINE(HAS___SYNC_BOOL_COMPARE_AND_SWAP) +], [ +AC_MSG_RESULT(no) +]) + AC_MSG_CHECKING(for xlc) AC_TRY_COMPILE([],[ #ifndef __xlC__ diff --git a/include/private/gc_locks.h b/include/private/gc_locks.h index a45553aa..8705d07a 100644 --- a/include/private/gc_locks.h +++ b/include/private/gc_locks.h @@ -475,6 +475,9 @@ inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, GC_word old, GC_word new_val) { +# if HAS___SYNC_BOOL_COMPARE_AND_SWAP + return __sync_bool_compare_and_swap(addr, old, new_val); +# else unsigned long result, dummy; __asm__ __volatile__( "1:\tldarx %0,0,%5\n" @@ -491,12 +494,16 @@ : "r" (new_val), "r" (old), "2"(addr) : "cr0","memory"); return (GC_bool) result; +# endif } # else /* Returns TRUE if the comparison succeeded. */ inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, GC_word old, GC_word new_val) { +# if HAS___SYNC_BOOL_COMPARE_AND_SWAP + return __sync_bool_compare_and_swap(addr, old, new_val); +# else int result, dummy; __asm__ __volatile__( "1:\tlwarx %0,0,%5\n" @@ -513,6 +520,7 @@ : "r" (new_val), "r" (old), "2"(addr) : "cr0","memory"); return (GC_bool) result; +# endif } # endif # endif /* !GENERIC_COMPARE_AND_SWAP */ -- 2.40.0