--- /dev/null
+--- 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
+