--- DirectFB-1.5.3_orig/lib/direct/atomic.h 2011-07-31 14:51:06.000000000 -0400 +++ DirectFB-1.5.3/lib/direct/atomic.h 2012-05-09 01:24:02.692169840 -0400 @@ -185,20 +185,13 @@ #if defined(ARCH_ARM) && !defined(ARCH_IWMMXT) -static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int new) +static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int _new) { - unsigned long oldval, res; - do { - __asm__ __volatile__("@ atomic_cmpxchg\n" - "ldrex %1, [%2]\n" - "mov %0, #0\n" - "teq %1, %3\n" - "strexeq %0, %4, [%2]\n" - : "=&r" (res), "=&r" (oldval) - : "r" (ptr), "Ir" (old), "r" (new) - : "cc"); - } while (res); + unsigned long oldval = old; + + __atomic_compare_exchange_n(ptr, &oldval, _new, + false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return oldval; } @@ -220,24 +213,14 @@ static inline int _D__atomic_cmpxchg(vol static inline int _D__atomic_add_return(int i, volatile int *v) { - unsigned long tmp; - int result; - __asm__ __volatile__("@ atomic_add_return\n" -"1: ldrex %0, [%2]\n" -" add %0, %0, %3\n" -" strex %1, %0, [%2]\n" -" teq %1, #0\n" -" bne 1b" - : "=&r" (result), "=&r" (tmp) - : "r" (v), "Ir" (i) - : "cc"); + int result = __atomic_add_fetch(v, i, __ATOMIC_SEQ_CST); return result; } #define D_SYNC_ADD_AND_FETCH( ptr, value ) \ - (_D__atomic_add_return( (int) (value), (void*) (ptr) )) + (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) )) #endif @@ -308,7 +291,7 @@ static inline int _D__atomic_add_return( } #define D_SYNC_ADD_AND_FETCH( ptr, value ) \ - (_D__atomic_add_return( (int) (value), (void*) (ptr) )) + (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) )) #endif