+unsigned __sync_bool_compare_and_swap_4(volatile void *ptr,
+ unsigned oldValue, unsigned newValue)
+{
+ register volatile unsigned* mem = reinterpret_cast<volatile unsigned*>(ptr);
+ unsigned before;
+ __asm__ __volatile__("lock; cmpxchg{l} {%1,%2|%1,%2}"
+ : "=a"(before)
+ : "q"(newValue), "m"(*mem), "0"(oldValue)
+ : "memory");
+ return before == oldValue;
+}
+