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__
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"
: "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"
: "r" (new_val), "r" (old), "2"(addr)
: "cr0","memory");
return (GC_bool) result;
+# endif
}
# endif
# endif /* !GENERIC_COMPARE_AND_SWAP */