X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fatomic.c;h=543e8ce9b0cb2c7171035f965964887b9835bd42;hb=23a69556ded315d102337bf13971411188e26bcd;hp=9ab8746f299f98ca783767ec8545aea0bab17928;hpb=ee230d062073b8e20aa6890102277b597f37ee16;p=mono.git diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index 9ab8746f299..543e8ce9b0c 100644 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -12,7 +12,7 @@ #include #include -#include +#include #if defined (WAPI_NO_ATOMIC_ASM) || defined (BROKEN_64BIT_ATOMICS_INTRINSIC) @@ -504,10 +504,56 @@ InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) return __sync_val_compare_and_swap (dest, comp, exch); } -#elif defined (HAVE_64BIT_CMPXCHG_FALLBACK) +#elif defined (__arm__) && defined (HAVE_ARMV7) && (defined(TARGET_IOS) || defined(TARGET_WATCHOS) || defined(TARGET_ANDROID)) + +#if defined (TARGET_IOS) || defined (TARGET_WATCHOS) + +#ifndef __clang__ +#error "Not supported." +#endif + +gint64 +InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) +{ + return __sync_val_compare_and_swap (dest, comp, exch); +} + +#elif defined (TARGET_ANDROID) + +/* Some Android systems can't find the 64-bit CAS intrinsic at runtime, + * so we have to roll our own... + */ + +gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) __attribute__ ((naked)); + +gint64 +InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) +{ + __asm__ ( + "push {r4, r5, r6, r7}\n" + "ldrd r4, [sp, #16]\n" + "dmb sy\n" + "1:\n" + "ldrexd r6, [r0]\n" + "cmp r7, r5\n" + "cmpeq r6, r4\n" + "bne 2f\n" + "strexd r1, r2, [r0]\n" + "cmp r1, #0\n" + "bne 1b\n" + "2:\n" + "dmb sy\n" + "mov r0, r6\n" + "mov r1, r7\n" + "pop {r4, r5, r6, r7}\n" + "bx lr\n" + ); +} + +#else + +#error "Need a 64-bit CAS fallback!" -#ifdef ENABLE_EXTENSION_MODULE -#include "../../../mono-extensions/mono/utils/atomic.c" #endif #else @@ -536,6 +582,9 @@ InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) return(old); } +#endif #endif +#if !defined (WAPI_NO_ATOMIC_ASM) && !defined (BROKEN_64BIT_ATOMICS_INTRINSIC) && !defined (NEED_64BIT_CMPXCHG_FALLBACK) +MONO_EMPTY_SOURCE_FILE (atomic); #endif